summaryrefslogtreecommitdiffstats
path: root/Project/Multiplier.cpp
blob: 464538ee68655f3469055b7ae49d4968d4ba5191 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
/*
 *  Copyright (C) 2017  Thales Lima Oliveira <thales@ufu.br>
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */

#include "ConnectionLine.h"
#include "Multiplier.h"
#include <wx/pen.h>

Multiplier::Multiplier(int id) : MathOperation(id) {}
Multiplier::~Multiplier() {}
void Multiplier::DrawSymbol() const
{
    // Plot x.
    glLineWidth(2.0);
    std::vector<wxPoint2DDouble> xSymbol;
    xSymbol.push_back(m_position + wxPoint2DDouble(-5, -5));
    xSymbol.push_back(m_position + wxPoint2DDouble(5, 5));
    xSymbol.push_back(m_position + wxPoint2DDouble(-5, 5));
    xSymbol.push_back(m_position + wxPoint2DDouble(5, -5));
    glColor4d(0.0, 0.3, 1.0, 1.0);
    DrawLine(xSymbol, GL_LINES);
}

void Multiplier::DrawDCSymbol(wxGraphicsContext* gc) const
{
    // Plot x.
    gc->SetPen(wxPen(wxColour(0, 77, 255, 255), 2));
    gc->SetBrush(*wxTRANSPARENT_BRUSH);
    wxPoint2DDouble xSymbol[4];
    xSymbol[0] = m_position + wxPoint2DDouble(-5, -5);
    xSymbol[1] = m_position + wxPoint2DDouble(5, 5);
    xSymbol[2] = m_position + wxPoint2DDouble(-5, 5);
    xSymbol[3] = m_position + wxPoint2DDouble(5, -5);
    gc->DrawLines(2, &xSymbol[0]);
    gc->DrawLines(2, &xSymbol[2]);
}

bool Multiplier::Solve(double* input, double timeStep)
{
    std::vector<double> inputVector;
    for(auto itN = m_nodeList.begin(), itNEnd = m_nodeList.end(); itN != itNEnd; ++itN) {
        Node* node = *itN;
        if(node->GetNodeType() != Node::NodeType::NODE_OUT) {
            if(!node->IsConnected()) {
                inputVector.push_back(1.0);
            } else {
                for(auto itC = m_childList.begin(), itCEnd = m_childList.end(); itC != itCEnd; ++itC) {
                    ConnectionLine* cLine = static_cast<ConnectionLine*>(*itC);
                    auto nodeList = cLine->GetNodeList();
                    for(auto itCN = nodeList.begin(), itCNEnd = nodeList.end(); itCN != itCNEnd; ++itCN) {
                        Node* childNode = *itCN;
                        if(childNode == node) {
                            inputVector.push_back(cLine->GetValue());
                            break;
                        }
                    }
                }
            }
        }
    }

    m_output = 1.0;
    for(unsigned int i = 0; i < inputVector.size(); ++i) { m_output *= inputVector[i]; }

    return true;
}

Element* Multiplier::GetCopy()
{
    Multiplier* copy = new Multiplier(m_elementID);
    *copy = *this;
    return copy;
}

rapidxml::xml_node<>* Multiplier::SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode)
{
    auto elementNode = XMLParser::AppendNode(doc, elementListNode, "Multiplier");
    XMLParser::SetNodeAttribute(doc, elementNode, "ID", m_elementID);

    SaveCADProperties(doc, elementNode);
    SaveControlNodes(doc, elementNode);
    
    return elementNode;
}

bool Multiplier::OpenElement(rapidxml::xml_node<>* elementNode)
{
    if(!OpenCADProperties(elementNode)) return false;
    if(!OpenControlNodes(elementNode)) return false;

    StartMove(m_position);
    UpdatePoints();
    return true;
}