diff options
author | Thales Lima Oliveira <thaleslima.ufu@gmail.com> | 2017-10-09 22:17:10 -0300 |
---|---|---|
committer | Thales Lima Oliveira <thaleslima.ufu@gmail.com> | 2017-10-09 22:17:10 -0300 |
commit | eea796f53f5d9dc1444a620713b3326f04b73339 (patch) | |
tree | 2cc6cd35c3dfa718c26b7f5de9dcee913fb93028 | |
parent | aa2378020ee0bbfd041681cfdbe62a8d028687f3 (diff) | |
download | PSP.git-eea796f53f5d9dc1444a620713b3326f04b73339.tar.gz PSP.git-eea796f53f5d9dc1444a620713b3326f04b73339.tar.xz PSP.git-eea796f53f5d9dc1444a620713b3326f04b73339.zip |
Divider control element implemented
Abstract class math operations implemented
Divider need to be redesigned
Expor/import divider functions implemented but supressed
-rw-r--r-- | Project/ControlEditor.cpp | 11 | ||||
-rw-r--r-- | Project/ControlEditor.h | 15 | ||||
-rw-r--r-- | Project/ControlElementContainer.cpp | 4 | ||||
-rw-r--r-- | Project/ControlElementContainer.h | 3 | ||||
-rw-r--r-- | Project/ControlElementSolver.cpp | 3 | ||||
-rw-r--r-- | Project/ControlElementSolver.h | 3 | ||||
-rw-r--r-- | Project/Divider.cpp | 74 | ||||
-rw-r--r-- | Project/Divider.h | 43 | ||||
-rw-r--r-- | Project/Electromechanical.cpp | 1 | ||||
-rw-r--r-- | Project/FileHanding.cpp | 62 | ||||
-rw-r--r-- | Project/GeneratorStabForm.cpp | 2 | ||||
-rw-r--r-- | Project/IOControl.cpp | 8 | ||||
-rw-r--r-- | Project/IOControl.h | 1 | ||||
-rw-r--r-- | Project/IOControlForm.cpp | 8 | ||||
-rw-r--r-- | Project/MathOperation.cpp | 95 | ||||
-rw-r--r-- | Project/MathOperation.h | 48 | ||||
-rw-r--r-- | Project/Multiplier.cpp | 72 | ||||
-rw-r--r-- | Project/Multiplier.h | 14 | ||||
-rw-r--r-- | Project/Project.mk | 30 | ||||
-rw-r--r-- | Project/Project.project | 4 | ||||
-rw-r--r-- | Project/Project.txt | 4 |
21 files changed, 410 insertions, 95 deletions
diff --git a/Project/ControlEditor.cpp b/Project/ControlEditor.cpp index 3244bad..b9159e5 100644 --- a/Project/ControlEditor.cpp +++ b/Project/ControlEditor.cpp @@ -32,6 +32,8 @@ #include "Exponential.h" #include "Constant.h" #include "Gain.h" +#include "MathOperation.h" +#include "Divider.h" #include "ControlElementSolver.h" #include "ControlElementContainer.h" @@ -199,6 +201,10 @@ void ControlEditor::BuildControlElementPanel() wxImage(exePath + "\\..\\data\\images\\control\\rateLimiter.png"), ID_RATELIM); wrapSizer->Add(rateLimButton, 0, wxALL, 5); rateLimButton->Bind(wxEVT_LEFT_DOWN, &ControlEditor::LeftClickDown, this); + + ControlElementButton* divButton = new ControlElementButton(m_panelControlElements, _("Divider"), wxImage(exePath + "\\..\\data\\images\\control\\mult.png"), ID_MATH_DIV); + wrapSizer->Add(divButton, 0, wxALL, 5); + divButton->Bind(wxEVT_LEFT_DOWN, &ControlEditor::LeftClickDown, this); } void ControlEditor::LeftClickDown(wxMouseEvent& event) @@ -280,6 +286,11 @@ void ControlEditor::AddElement(ControlElementButtonID id) RateLimiter* rateLim = new RateLimiter(GetNextID()); m_elementList.push_back(rateLim); } break; + case ID_MATH_DIV: { + m_mode = MODE_INSERT; + Divider* divider = new Divider(GetNextID()); + m_elementList.push_back(divider); + } } } diff --git a/Project/ControlEditor.h b/Project/ControlEditor.h index 315efec..5383e85 100644 --- a/Project/ControlEditor.h +++ b/Project/ControlEditor.h @@ -44,6 +44,8 @@ class RateLimiter; class Exponential; class Constant; class Gain; +class MathOperation; +class Divider; class ControlElementSolver; class ControlElementContainer; @@ -51,7 +53,18 @@ class ControlElementContainer; class ChartView; class ElementDataObject; -enum ControlElementButtonID { ID_IO = 0, ID_TF, ID_SUM, ID_CONST, ID_LIMITER, ID_GAIN, ID_MULT, ID_EXP, ID_RATELIM }; +enum ControlElementButtonID { + ID_IO = 0, + ID_TF, + ID_SUM, + ID_CONST, + ID_LIMITER, + ID_GAIN, + ID_MULT, + ID_EXP, + ID_RATELIM, + ID_MATH_DIV +}; /** * @class ControlElementButton diff --git a/Project/ControlElementContainer.cpp b/Project/ControlElementContainer.cpp index 3c420e7..042f7f2 100644 --- a/Project/ControlElementContainer.cpp +++ b/Project/ControlElementContainer.cpp @@ -46,6 +46,8 @@ void ControlElementContainer::FillContainer(ControlEditor* editor) m_sumList.push_back(sum); } else if(TransferFunction* tf = dynamic_cast<TransferFunction*>(*it)) { m_tfList.push_back(tf); + } else if(Divider* divider = dynamic_cast<Divider*>(*it)) { + m_dividerList.push_back(divider); } } } @@ -90,6 +92,8 @@ void ControlElementContainer::FillContainer(std::vector<ControlElement*> control m_sumList.push_back(sum); } else if(TransferFunction* tf = dynamic_cast<TransferFunction*>(*it)) { m_tfList.push_back(tf); + } else if(Divider* divider = dynamic_cast<Divider*>(*it)) { + m_dividerList.push_back(divider); } } } diff --git a/Project/ControlElementContainer.h b/Project/ControlElementContainer.h index b9b9118..8c4a3bf 100644 --- a/Project/ControlElementContainer.h +++ b/Project/ControlElementContainer.h @@ -33,6 +33,7 @@ class ControlElement; #include "RateLimiter.h" #include "Sum.h" #include "TransferFunction.h" +#include "Divider.h" /** * @class ControlElementContainer @@ -66,6 +67,7 @@ class ControlElementContainer std::vector<RateLimiter*> GetRateLimiterList() const { return m_rateLimiterList; } std::vector<Sum*> GetSumList() const { return m_sumList; } std::vector<TransferFunction*> GetTFList() const { return m_tfList; } + std::vector<Divider*> GetDividerList() const { return m_dividerList; } protected: std::vector<ControlElement*> m_ctrlElementsList; std::vector<Constant*> m_constantList; @@ -79,6 +81,7 @@ class ControlElementContainer std::vector<RateLimiter*> m_rateLimiterList; std::vector<Sum*> m_sumList; std::vector<TransferFunction*> m_tfList; + std::vector<Divider*> m_dividerList; }; #endif // CONTROLELEMENTCONTAINER_H diff --git a/Project/ControlElementSolver.cpp b/Project/ControlElementSolver.cpp index 9043358..4ca4ef4 100644 --- a/Project/ControlElementSolver.cpp +++ b/Project/ControlElementSolver.cpp @@ -230,6 +230,9 @@ void ControlElementSolver::SolveNextStep() case IOControl::IN_DELTA_VELOCITY: { child->SetValue(m_deltaVelocity); } break; + case IOControl::IN_DELTA_ACTIVE_POWER: { + child->SetValue(m_deltaPe); + } break; default: { inputType = false; } break; diff --git a/Project/ControlElementSolver.h b/Project/ControlElementSolver.h index fd27ad6..9bc54f7 100644 --- a/Project/ControlElementSolver.h +++ b/Project/ControlElementSolver.h @@ -66,9 +66,11 @@ class ControlElementSolver void SetInitialMecPower(double value) { m_initMecPower = value; } void SetInitialVelocity(double value) { m_initVelocity = value; } void SetDeltaVelocity(double value) { m_deltaVelocity = value; } + void SetDeltaActivePower(double value) { m_deltaPe = value; } double GetFieldVoltage() { return m_fieldVoltage; } double GetMechanicalPower() { return m_mecPower; } double GetVelocity() { return m_velocity; } + double GetActivePower() { return m_activePower; } protected: void Initialize(wxWindow* parent, double timeStep, double integrationError); void FillAllConnectedChildren(ConnectionLine* parent); @@ -92,6 +94,7 @@ class ControlElementSolver double m_initMecPower = 0.0; double m_initVelocity = 0.0; double m_deltaVelocity = 0.0; + double m_deltaPe = 0.0; // Outputs double m_fieldVoltage = 0.0; double m_mecPower = 0.0; diff --git a/Project/Divider.cpp b/Project/Divider.cpp new file mode 100644 index 0000000..29e438e --- /dev/null +++ b/Project/Divider.cpp @@ -0,0 +1,74 @@ +/* + * 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 "Divider.h" +#include "ConnectionLine.h" + +Divider::Divider(int id) : MathOperation(id) {} +Divider::~Divider() {} +void Divider::DrawSymbol() const +{ + // Plot divider. + glLineWidth(2.0); + std::vector<wxPoint2DDouble> mSymbol; + mSymbol.push_back(m_position + wxPoint2DDouble(-5, 0)); + mSymbol.push_back(m_position + wxPoint2DDouble(5, 0)); + glColor4d(0.0, 0.3, 1.0, 1.0); + DrawLine(mSymbol, GL_LINES); +} + +bool Divider::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::NODE_OUT) { + if(!node->IsConnected()) { + inputVector.push_back(0.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; + } + } + } + } + } + } + if(inputVector.size() != 2) return false; + + // If the denominator is zero, set the output a big number (1e15). + if(std::abs(inputVector[1]) < 1e-15) { + m_output = 1e15; + } else { + m_output = inputVector[0] / inputVector[1]; + } + + return true; +} + +Element* Divider::GetCopy() +{ + Divider* copy = new Divider(m_elementID); + *copy = *this; + return copy; +} diff --git a/Project/Divider.h b/Project/Divider.h new file mode 100644 index 0000000..59b7309 --- /dev/null +++ b/Project/Divider.h @@ -0,0 +1,43 @@ +/* + * 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/>. + */ + +#ifndef DIVIDER_H +#define DIVIDER_H + +#include "MathOperation.h" + +class ConnectionLine; + +/** + * @class Divider + * @author Thales Lima Oliveira <thales@ufu.br> + * @date 09/10/2017 + * @brief Control element that divides two inputs. + * @file Divider.h + */ +class Divider : public MathOperation +{ + public: + Divider(int id); + ~Divider(); + + virtual void DrawSymbol() const; + virtual bool Solve(double input, double timeStep); + virtual Element* GetCopy(); +}; + +#endif // DIVIDER_H diff --git a/Project/Electromechanical.cpp b/Project/Electromechanical.cpp index dfd95d9..3210842 100644 --- a/Project/Electromechanical.cpp +++ b/Project/Electromechanical.cpp @@ -900,6 +900,7 @@ bool Electromechanical::SolveSynchronousMachines() auto data = syncGenerator->GetElectricalData(); if(data.useAVR && data.avrSolver) { data.avrSolver->SetTerminalVoltage(std::abs(data.terminalVoltage)); + data.avrSolver->SetDeltaActivePower(data.electricalPower.real() - data.avrSolver->GetActivePower()); data.avrSolver->SetActivePower(data.electricalPower.real()); data.avrSolver->SetReactivePower(data.electricalPower.imag()); data.avrSolver->SetDeltaVelocity(data.speed - data.avrSolver->GetVelocity()); diff --git a/Project/FileHanding.cpp b/Project/FileHanding.cpp index e1a8e4b..78abaa0 100644 --- a/Project/FileHanding.cpp +++ b/Project/FileHanding.cpp @@ -1994,6 +1994,32 @@ void FileHanding::SaveControlElements(rapidxml::xml_document<>& doc, auto nodeList = AppendNode(doc, multiplierNode, "NodeList"); SaveControlNodes(doc, nodeList, multiplier->GetNodeList()); } //} + + //{ Divider + /*auto dividersNode = AppendNode(doc, elementsNode, "DividerList"); + auto dividersList = ctrlContainer->GetDividerList(); + for(auto it = dividersList.begin(), itEnd = dividersList.end(); it != itEnd; ++it) { + Divider* divider = *it; + auto dividerNode = AppendNode(doc, dividersNode, "Divider"); + SetNodeAttribute(doc, dividerNode, "ID", divider->GetID()); + auto cadProp = AppendNode(doc, dividerNode, "CADProperties"); + auto position = AppendNode(doc, cadProp, "Position"); + auto posX = AppendNode(doc, position, "X"); + SetNodeValue(doc, posX, divider->GetPosition().m_x); + auto posY = AppendNode(doc, position, "Y"); + SetNodeValue(doc, posY, divider->GetPosition().m_y); + auto size = AppendNode(doc, cadProp, "Size"); + auto width = AppendNode(doc, size, "Width"); + SetNodeValue(doc, width, divider->GetWidth()); + auto height = AppendNode(doc, size, "Height"); + SetNodeValue(doc, height, divider->GetHeight()); + auto angle = AppendNode(doc, cadProp, "Angle"); + SetNodeValue(doc, angle, divider->GetAngle()); + + // Nodes + auto nodeList = AppendNode(doc, dividerNode, "NodeList"); + SaveControlNodes(doc, nodeList, divider->GetNodeList()); + }*/ //} //{ Rate limiter auto rateLimitersNode = AppendNode(doc, elementsNode, "RateLimiterList"); @@ -2381,6 +2407,42 @@ bool FileHanding::OpenControlElements(rapidxml::xml_document<>& doc, multiplierNode = multiplierNode->next_sibling("Multiplier"); } //} + + //{ Divider + /*auto dividerListNode = elementsNode->first_node("DividerList"); + if(!dividerListNode) return false; + auto dividerNode = dividerListNode->first_node("Divider"); + while(dividerNode) { + int id = GetAttributeValueInt(dividerNode, "ID"); + Divider* divider = new Divider(id); + + auto cadPropNode = dividerNode->first_node("CADProperties"); + if(!cadPropNode) return false; + + auto position = cadPropNode->first_node("Position"); + double posX = GetNodeValueDouble(position, "X"); + double posY = GetNodeValueDouble(position, "Y"); + auto size = cadPropNode->first_node("Size"); + double width = GetNodeValueDouble(size, "Width"); + double height = GetNodeValueDouble(size, "Height"); + double angle = GetNodeValueDouble(cadPropNode, "Angle"); + + std::vector<Node*> nodeVector; + if(!OpenControlNodeList(dividerNode, nodeVector)) return false; + + divider->SetWidth(width); + divider->SetHeight(height); + divider->SetAngle(angle); + divider->SetPosition(wxPoint2DDouble(posX, posY)); + + divider->StartMove(divider->GetPosition()); + divider->SetNodeList(nodeVector); + divider->UpdatePoints(); + elementList.push_back(divider); + + dividerNode = dividerNode->next_sibling("Divider"); + }*/ + //} //{ Rate limiter auto rateLimiterListNode = elementsNode->first_node("RateLimiterList"); diff --git a/Project/GeneratorStabForm.cpp b/Project/GeneratorStabForm.cpp index 7a70039..9a468b7 100644 --- a/Project/GeneratorStabForm.cpp +++ b/Project/GeneratorStabForm.cpp @@ -70,7 +70,7 @@ void GeneratorStabForm::OnEditAVRButtonClick(wxCommandEvent& event) ControlEditor* cEditor = new ControlEditor( m_parent, IOControl::IN_TERMINAL_VOLTAGE | IOControl::IN_ACTIVE_POWER | IOControl::IN_REACTIVE_POWER | IOControl::IN_INITIAL_TERMINAL_VOLTAGE | IOControl::IN_VELOCITY | IOControl::IN_INITIAL_VELOCITY | - IOControl::IN_DELTA_VELOCITY | IOControl::OUT_FIELD_VOLTAGE); + IOControl::IN_DELTA_VELOCITY | IOControl::IN_DELTA_ACTIVE_POWER | IOControl::OUT_FIELD_VOLTAGE); cEditor->SetElementsList(data.avr->GetControlElementsList()); cEditor->SetConnectionsList(data.avr->GetConnectionLineList()); cEditor->SetControlContainer(data.avr); diff --git a/Project/IOControl.cpp b/Project/IOControl.cpp index aef7944..44cbf8e 100644 --- a/Project/IOControl.cpp +++ b/Project/IOControl.cpp @@ -166,11 +166,11 @@ wxString IOControl::GenerateText() } break; case IN_ACTIVE_POWER: { m_ioNodeType = Node::NODE_OUT; - return _("Pe"); + return _("P"); } break; case IN_REACTIVE_POWER: { m_ioNodeType = Node::NODE_OUT; - return _("Qe"); + return _("Q"); } break; case OUT_FIELD_VOLTAGE: { m_ioNodeType = Node::NODE_IN; @@ -196,6 +196,10 @@ wxString IOControl::GenerateText() m_ioNodeType = Node::NODE_OUT; return capDelta + omega; } break; + case IN_DELTA_ACTIVE_POWER: { + m_ioNodeType = Node::NODE_OUT; + return capDelta + _("P"); + } break; } return ""; } diff --git a/Project/IOControl.h b/Project/IOControl.h index cff96a0..084367d 100644 --- a/Project/IOControl.h +++ b/Project/IOControl.h @@ -46,6 +46,7 @@ class IOControl : public ControlElement IN_INITIAL_MEC_POWER = 1 << 7, IN_INITIAL_VELOCITY = 1 << 8, IN_DELTA_VELOCITY = 1 << 9, + IN_DELTA_ACTIVE_POWER = 1 << 10, }; IOControl(int ioFlags, int id); diff --git a/Project/IOControlForm.cpp b/Project/IOControlForm.cpp index 73ac331..4a25468 100644 --- a/Project/IOControlForm.cpp +++ b/Project/IOControlForm.cpp @@ -77,13 +77,19 @@ IOControlForm::IOControlForm(wxWindow* parent, IOControl* ioControl) : IOControl m_inputFlags.push_back(IOControl::IN_INITIAL_VELOCITY); if(m_ioControl->GetValue() == IOControl::IN_INITIAL_VELOCITY) inChoiceNumber = (int)m_inputFlags.size() - 1; } - + if(ioFlags & IOControl::IN_DELTA_VELOCITY) { m_choiceInput->Append(_("Velocity variation")); m_inputFlags.push_back(IOControl::IN_DELTA_VELOCITY); if(m_ioControl->GetValue() == IOControl::IN_DELTA_VELOCITY) inChoiceNumber = (int)m_inputFlags.size() - 1; } + if(ioFlags & IOControl::IN_DELTA_ACTIVE_POWER) { + m_choiceInput->Append(_("Active power variation")); + m_inputFlags.push_back(IOControl::IN_DELTA_ACTIVE_POWER); + if(m_ioControl->GetValue() == IOControl::IN_DELTA_ACTIVE_POWER) inChoiceNumber = (int)m_inputFlags.size() - 1; + } + if(inChoiceNumber != -1) { m_choiceInput->SetSelection(inChoiceNumber); m_checkBoxInput->SetValue(true); diff --git a/Project/MathOperation.cpp b/Project/MathOperation.cpp new file mode 100644 index 0000000..5f544ce --- /dev/null +++ b/Project/MathOperation.cpp @@ -0,0 +1,95 @@ +/* + * 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 "MathOperation.h" +#include "ConnectionLine.h" + +MathOperation::MathOperation(int id) : ControlElement(id) +{ + m_width = m_height = 36.0; + Node* nodeIn1 = new Node(m_position + wxPoint2DDouble(-18, -9), Node::NODE_IN, m_borderSize); + nodeIn1->StartMove(m_position); + Node* nodeIn2 = new Node(m_position + wxPoint2DDouble(-18, 9), Node::NODE_IN, m_borderSize); + nodeIn2->StartMove(m_position); + Node* nodeOut = new Node(m_position + wxPoint2DDouble(18, 0), Node::NODE_OUT, m_borderSize); + nodeOut->SetAngle(180.0); + nodeOut->StartMove(m_position); + m_nodeList.push_back(nodeIn1); + m_nodeList.push_back(nodeIn2); + m_nodeList.push_back(nodeOut); +} + +MathOperation::~MathOperation() {} +void MathOperation::Draw(wxPoint2DDouble translation, double scale) const +{ + glLineWidth(1.0); + if(m_selected) { + glColor4dv(m_selectionColour.GetRGBA()); + double borderSize = (m_borderSize * 2.0 + 1.0) / scale; + DrawRectangle(m_position, m_width + borderSize, m_height + borderSize); + } + glColor4d(1.0, 1.0, 1.0, 1.0); + DrawRectangle(m_position, m_width, m_height); + glColor4d(0.0, 0.0, 0.0, 1.0); + DrawRectangle(m_position, m_width, m_height, GL_LINE_LOOP); + + // Draw personalized element symbol. + DrawSymbol(); + + glColor4d(0.0, 0.0, 0.0, 1.0); + DrawNodes(); +} + +void MathOperation::Rotate(bool clockwise) +{ + if(clockwise) + m_angle += 90.0; + else + m_angle -= 90.0; + if(m_angle >= 360.0) + m_angle = 0.0; + else if(m_angle < 0) + m_angle = 270.0; + + UpdatePoints(); + + for(auto it = m_nodeList.begin(), itEnd = m_nodeList.end(); it != itEnd; ++it) { + Node* node = *it; + node->Rotate(clockwise); + } +} + +void MathOperation::UpdatePoints() +{ + if(m_angle == 0.0) { + m_nodeList[0]->SetPosition(m_position + wxPoint2DDouble(-18, -9)); + m_nodeList[1]->SetPosition(m_position + wxPoint2DDouble(-18, 9)); + m_nodeList[2]->SetPosition(m_position + wxPoint2DDouble(18, 0)); + } else if(m_angle == 90.0) { + m_nodeList[0]->SetPosition(m_position + wxPoint2DDouble(9, -18)); + m_nodeList[1]->SetPosition(m_position + wxPoint2DDouble(-9, -18)); + m_nodeList[2]->SetPosition(m_position + wxPoint2DDouble(0, 18)); + } else if(m_angle == 180.0) { + m_nodeList[0]->SetPosition(m_position + wxPoint2DDouble(18, 9)); + m_nodeList[1]->SetPosition(m_position + wxPoint2DDouble(18, -9)); + m_nodeList[2]->SetPosition(m_position + wxPoint2DDouble(-18, 0)); + } else if(m_angle == 270.0) { + m_nodeList[0]->SetPosition(m_position + wxPoint2DDouble(-9, 18)); + m_nodeList[1]->SetPosition(m_position + wxPoint2DDouble(9, 18)); + m_nodeList[2]->SetPosition(m_position + wxPoint2DDouble(0, -18)); + } +} diff --git a/Project/MathOperation.h b/Project/MathOperation.h new file mode 100644 index 0000000..96e538b --- /dev/null +++ b/Project/MathOperation.h @@ -0,0 +1,48 @@ +/* + * 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/>. + */ + +#ifndef MATHOPERATION_H +#define MATHOPERATION_H + +#include "ControlElement.h" + +class ConnectionLine; + +/** + * @class MathOperation + * @author Thales Lima Oliveira <thales@ufu.br> + * @date 09/10/2017 + * @brief Abstract class that define the general behavior of math operation control block. + * @file MathOperation.h + */ +class MathOperation : public ControlElement +{ + public: + MathOperation(int id); + ~MathOperation(); + + virtual void Draw(wxPoint2DDouble translation, double scale) const; + virtual void DrawSymbol() const {} + virtual bool Contains(wxPoint2DDouble position) const { return m_rect.Contains(position); } + virtual bool Intersects(wxRect2DDouble rect) const { return m_rect.Intersects(rect); } + virtual bool ShowForm(wxWindow* parent, Element* element) { return false; } + virtual void Rotate(bool clockwise = true); + + virtual void UpdatePoints(); +}; + +#endif // MATHOPERATION_H diff --git a/Project/Multiplier.cpp b/Project/Multiplier.cpp index 2b5d702..14dd182 100644 --- a/Project/Multiplier.cpp +++ b/Project/Multiplier.cpp @@ -18,35 +18,10 @@ #include "Multiplier.h" #include "ConnectionLine.h" -Multiplier::Multiplier(int id) : ControlElement(id) -{ - m_width = m_height = 36.0; - Node* nodeIn1 = new Node(m_position + wxPoint2DDouble(-18, -9), Node::NODE_IN, m_borderSize); - nodeIn1->StartMove(m_position); - Node* nodeIn2 = new Node(m_position + wxPoint2DDouble(-18, 9), Node::NODE_IN, m_borderSize); - nodeIn2->StartMove(m_position); - Node* nodeOut = new Node(m_position + wxPoint2DDouble(18, 0), Node::NODE_OUT, m_borderSize); - nodeOut->SetAngle(180.0); - nodeOut->StartMove(m_position); - m_nodeList.push_back(nodeIn1); - m_nodeList.push_back(nodeIn2); - m_nodeList.push_back(nodeOut); -} - +Multiplier::Multiplier(int id) : MathOperation(id) {} Multiplier::~Multiplier() {} -void Multiplier::Draw(wxPoint2DDouble translation, double scale) const +void Multiplier::DrawSymbol() const { - glLineWidth(1.0); - if(m_selected) { - glColor4dv(m_selectionColour.GetRGBA()); - double borderSize = (m_borderSize * 2.0 + 1.0) / scale; - DrawRectangle(m_position, m_width + borderSize, m_height + borderSize); - } - glColor4d(1.0, 1.0, 1.0, 1.0); - DrawRectangle(m_position, m_width, m_height); - glColor4d(0.0, 0.0, 0.0, 1.0); - DrawRectangle(m_position, m_width, m_height, GL_LINE_LOOP); - // Plot x. glLineWidth(2.0); std::vector<wxPoint2DDouble> xSymbol; @@ -56,49 +31,6 @@ void Multiplier::Draw(wxPoint2DDouble translation, double scale) const xSymbol.push_back(m_position + wxPoint2DDouble(5, -5)); glColor4d(0.0, 0.3, 1.0, 1.0); DrawLine(xSymbol, GL_LINES); - - glColor4d(0.0, 0.0, 0.0, 1.0); - DrawNodes(); -} - -void Multiplier::Rotate(bool clockwise) -{ - if(clockwise) - m_angle += 90.0; - else - m_angle -= 90.0; - if(m_angle >= 360.0) - m_angle = 0.0; - else if(m_angle < 0) - m_angle = 270.0; - - UpdatePoints(); - - for(auto it = m_nodeList.begin(), itEnd = m_nodeList.end(); it != itEnd; ++it) { - Node* node = *it; - node->Rotate(clockwise); - } -} - -void Multiplier::UpdatePoints() -{ - if(m_angle == 0.0) { - m_nodeList[0]->SetPosition(m_position + wxPoint2DDouble(-18, -9)); - m_nodeList[1]->SetPosition(m_position + wxPoint2DDouble(-18, 9)); - m_nodeList[2]->SetPosition(m_position + wxPoint2DDouble(18, 0)); - } else if(m_angle == 90.0) { - m_nodeList[0]->SetPosition(m_position + wxPoint2DDouble(9, -18)); - m_nodeList[1]->SetPosition(m_position + wxPoint2DDouble(-9, -18)); - m_nodeList[2]->SetPosition(m_position + wxPoint2DDouble(0, 18)); - } else if(m_angle == 180.0) { - m_nodeList[0]->SetPosition(m_position + wxPoint2DDouble(18, 9)); - m_nodeList[1]->SetPosition(m_position + wxPoint2DDouble(18, -9)); - m_nodeList[2]->SetPosition(m_position + wxPoint2DDouble(-18, 0)); - } else if(m_angle == 270.0) { - m_nodeList[0]->SetPosition(m_position + wxPoint2DDouble(-9, 18)); - m_nodeList[1]->SetPosition(m_position + wxPoint2DDouble(9, 18)); - m_nodeList[2]->SetPosition(m_position + wxPoint2DDouble(0, -18)); - } } bool Multiplier::Solve(double input, double timeStep) diff --git a/Project/Multiplier.h b/Project/Multiplier.h index f675b34..2bc0be9 100644 --- a/Project/Multiplier.h +++ b/Project/Multiplier.h @@ -18,7 +18,7 @@ #ifndef MULTIPLIER_H #define MULTIPLIER_H -#include "ControlElement.h" +#include "MathOperation.h" class ConnectionLine; @@ -29,22 +29,14 @@ class ConnectionLine; * @brief Multiplies two inputs. * @file Multiplier.h */ -class Multiplier : public ControlElement +class Multiplier : public MathOperation { public: Multiplier(int id); ~Multiplier(); - virtual void Draw(wxPoint2DDouble translation, double scale) const; - virtual bool Contains(wxPoint2DDouble position) const { return m_rect.Contains(position); } - virtual bool Intersects(wxRect2DDouble rect) const { return m_rect.Intersects(rect); } - virtual bool ShowForm(wxWindow* parent, Element* element) { return false; } - virtual void Rotate(bool clockwise = true); - - virtual void UpdatePoints(); - + virtual void DrawSymbol() const; virtual bool Solve(double input, double timeStep); - virtual Element* GetCopy(); }; diff --git a/Project/Project.mk b/Project/Project.mk index d64dd8c..2e24786 100644 --- a/Project/Project.mk +++ b/Project/Project.mk @@ -13,7 +13,7 @@ CurrentFileName := CurrentFilePath := CurrentFileFullPath := User :=NDSE-69 -Date :=07/10/2017 +Date :=09/10/2017 CodeLitePath :="C:/Program Files/CodeLite" LinkerName :=C:/TDM-GCC-64/bin/g++.exe SharedObjectLinkerName :=C:/TDM-GCC-64/bin/g++.exe -shared -fPIC @@ -68,13 +68,13 @@ Objects0=$(IntermediateDirectory)/main.cpp$(ObjectSuffix) $(IntermediateDirector $(IntermediateDirectory)/ChartViewBitmaps.cpp$(ObjectSuffix) $(IntermediateDirectory)/PropertiesFormBitmaps.cpp$(ObjectSuffix) $(IntermediateDirectory)/DataReportBitmaps.cpp$(ObjectSuffix) $(IntermediateDirectory)/MainFrameBase.cpp$(ObjectSuffix) $(IntermediateDirectory)/WorkspaceBase.cpp$(ObjectSuffix) $(IntermediateDirectory)/ElementForm.cpp$(ObjectSuffix) $(IntermediateDirectory)/ControlEditorBase.cpp$(ObjectSuffix) $(IntermediateDirectory)/ChartViewBase.cpp$(ObjectSuffix) $(IntermediateDirectory)/PropertiesForm.cpp$(ObjectSuffix) $(IntermediateDirectory)/DataReportBase.cpp$(ObjectSuffix) \ $(IntermediateDirectory)/ElectricCalculation.cpp$(ObjectSuffix) $(IntermediateDirectory)/PowerFlow.cpp$(ObjectSuffix) $(IntermediateDirectory)/Fault.cpp$(ObjectSuffix) $(IntermediateDirectory)/Electromechanical.cpp$(ObjectSuffix) $(IntermediateDirectory)/Element.cpp$(ObjectSuffix) $(IntermediateDirectory)/ElementDataObject.cpp$(ObjectSuffix) $(IntermediateDirectory)/ElementPlotData.cpp$(ObjectSuffix) $(IntermediateDirectory)/wxMathPlot_mathplot.cpp$(ObjectSuffix) $(IntermediateDirectory)/Camera.cpp$(ObjectSuffix) $(IntermediateDirectory)/MainFrame.cpp$(ObjectSuffix) \ $(IntermediateDirectory)/Workspace.cpp$(ObjectSuffix) $(IntermediateDirectory)/ChartView.cpp$(ObjectSuffix) $(IntermediateDirectory)/ControlEditor.cpp$(ObjectSuffix) $(IntermediateDirectory)/DataReport.cpp$(ObjectSuffix) $(IntermediateDirectory)/FileHanding.cpp$(ObjectSuffix) $(IntermediateDirectory)/ConnectionLine.cpp$(ObjectSuffix) $(IntermediateDirectory)/Constant.cpp$(ObjectSuffix) $(IntermediateDirectory)/ControlElement.cpp$(ObjectSuffix) $(IntermediateDirectory)/ControlElementContainer.cpp$(ObjectSuffix) $(IntermediateDirectory)/ControlElementSolver.cpp$(ObjectSuffix) \ - $(IntermediateDirectory)/Exponential.cpp$(ObjectSuffix) $(IntermediateDirectory)/Gain.cpp$(ObjectSuffix) $(IntermediateDirectory)/IOControl.cpp$(ObjectSuffix) $(IntermediateDirectory)/Limiter.cpp$(ObjectSuffix) $(IntermediateDirectory)/Multiplier.cpp$(ObjectSuffix) $(IntermediateDirectory)/RateLimiter.cpp$(ObjectSuffix) $(IntermediateDirectory)/Sum.cpp$(ObjectSuffix) $(IntermediateDirectory)/TransferFunction.cpp$(ObjectSuffix) $(IntermediateDirectory)/GraphicalElement.cpp$(ObjectSuffix) $(IntermediateDirectory)/Text.cpp$(ObjectSuffix) \ - $(IntermediateDirectory)/Branch.cpp$(ObjectSuffix) $(IntermediateDirectory)/Bus.cpp$(ObjectSuffix) $(IntermediateDirectory)/Capacitor.cpp$(ObjectSuffix) $(IntermediateDirectory)/IndMotor.cpp$(ObjectSuffix) $(IntermediateDirectory)/Inductor.cpp$(ObjectSuffix) $(IntermediateDirectory)/Line.cpp$(ObjectSuffix) $(IntermediateDirectory)/Load.cpp$(ObjectSuffix) $(IntermediateDirectory)/Machines.cpp$(ObjectSuffix) $(IntermediateDirectory)/PowerElement.cpp$(ObjectSuffix) $(IntermediateDirectory)/Shunt.cpp$(ObjectSuffix) \ - $(IntermediateDirectory)/SyncGenerator.cpp$(ObjectSuffix) $(IntermediateDirectory)/SyncMotor.cpp$(ObjectSuffix) $(IntermediateDirectory)/Transformer.cpp$(ObjectSuffix) $(IntermediateDirectory)/GeneralPropertiesForm.cpp$(ObjectSuffix) + $(IntermediateDirectory)/Exponential.cpp$(ObjectSuffix) $(IntermediateDirectory)/Gain.cpp$(ObjectSuffix) $(IntermediateDirectory)/IOControl.cpp$(ObjectSuffix) $(IntermediateDirectory)/Limiter.cpp$(ObjectSuffix) $(IntermediateDirectory)/Multiplier.cpp$(ObjectSuffix) $(IntermediateDirectory)/RateLimiter.cpp$(ObjectSuffix) $(IntermediateDirectory)/Sum.cpp$(ObjectSuffix) $(IntermediateDirectory)/TransferFunction.cpp$(ObjectSuffix) $(IntermediateDirectory)/Divider.cpp$(ObjectSuffix) $(IntermediateDirectory)/MathOperation.cpp$(ObjectSuffix) \ + $(IntermediateDirectory)/GraphicalElement.cpp$(ObjectSuffix) $(IntermediateDirectory)/Text.cpp$(ObjectSuffix) $(IntermediateDirectory)/Branch.cpp$(ObjectSuffix) $(IntermediateDirectory)/Bus.cpp$(ObjectSuffix) $(IntermediateDirectory)/Capacitor.cpp$(ObjectSuffix) $(IntermediateDirectory)/IndMotor.cpp$(ObjectSuffix) $(IntermediateDirectory)/Inductor.cpp$(ObjectSuffix) $(IntermediateDirectory)/Line.cpp$(ObjectSuffix) $(IntermediateDirectory)/Load.cpp$(ObjectSuffix) $(IntermediateDirectory)/Machines.cpp$(ObjectSuffix) \ + $(IntermediateDirectory)/PowerElement.cpp$(ObjectSuffix) $(IntermediateDirectory)/Shunt.cpp$(ObjectSuffix) $(IntermediateDirectory)/SyncGenerator.cpp$(ObjectSuffix) $(IntermediateDirectory)/SyncMotor.cpp$(ObjectSuffix) -Objects1=$(IntermediateDirectory)/SimulationsSettingsForm.cpp$(ObjectSuffix) $(IntermediateDirectory)/AboutForm.cpp$(ObjectSuffix) $(IntermediateDirectory)/ConstantForm.cpp$(ObjectSuffix) $(IntermediateDirectory)/ControlSystemTest.cpp$(ObjectSuffix) $(IntermediateDirectory)/ExponentialForm.cpp$(ObjectSuffix) $(IntermediateDirectory)/GainForm.cpp$(ObjectSuffix) \ - $(IntermediateDirectory)/IOControlForm.cpp$(ObjectSuffix) $(IntermediateDirectory)/LimiterForm.cpp$(ObjectSuffix) $(IntermediateDirectory)/RateLimiterForm.cpp$(ObjectSuffix) $(IntermediateDirectory)/SumForm.cpp$(ObjectSuffix) $(IntermediateDirectory)/TransferFunctionForm.cpp$(ObjectSuffix) $(IntermediateDirectory)/TextForm.cpp$(ObjectSuffix) $(IntermediateDirectory)/BusForm.cpp$(ObjectSuffix) $(IntermediateDirectory)/GeneratorStabForm.cpp$(ObjectSuffix) $(IntermediateDirectory)/IndMotorForm.cpp$(ObjectSuffix) $(IntermediateDirectory)/LineForm.cpp$(ObjectSuffix) \ - $(IntermediateDirectory)/LoadForm.cpp$(ObjectSuffix) $(IntermediateDirectory)/ReactiveShuntElementForm.cpp$(ObjectSuffix) $(IntermediateDirectory)/SwitchingForm.cpp$(ObjectSuffix) $(IntermediateDirectory)/SyncMachineForm.cpp$(ObjectSuffix) $(IntermediateDirectory)/TransformerForm.cpp$(ObjectSuffix) +Objects1=$(IntermediateDirectory)/Transformer.cpp$(ObjectSuffix) $(IntermediateDirectory)/GeneralPropertiesForm.cpp$(ObjectSuffix) $(IntermediateDirectory)/SimulationsSettingsForm.cpp$(ObjectSuffix) $(IntermediateDirectory)/AboutForm.cpp$(ObjectSuffix) $(IntermediateDirectory)/ConstantForm.cpp$(ObjectSuffix) $(IntermediateDirectory)/ControlSystemTest.cpp$(ObjectSuffix) \ + $(IntermediateDirectory)/ExponentialForm.cpp$(ObjectSuffix) $(IntermediateDirectory)/GainForm.cpp$(ObjectSuffix) $(IntermediateDirectory)/IOControlForm.cpp$(ObjectSuffix) $(IntermediateDirectory)/LimiterForm.cpp$(ObjectSuffix) $(IntermediateDirectory)/RateLimiterForm.cpp$(ObjectSuffix) $(IntermediateDirectory)/SumForm.cpp$(ObjectSuffix) $(IntermediateDirectory)/TransferFunctionForm.cpp$(ObjectSuffix) $(IntermediateDirectory)/TextForm.cpp$(ObjectSuffix) $(IntermediateDirectory)/BusForm.cpp$(ObjectSuffix) $(IntermediateDirectory)/GeneratorStabForm.cpp$(ObjectSuffix) \ + $(IntermediateDirectory)/IndMotorForm.cpp$(ObjectSuffix) $(IntermediateDirectory)/LineForm.cpp$(ObjectSuffix) $(IntermediateDirectory)/LoadForm.cpp$(ObjectSuffix) $(IntermediateDirectory)/ReactiveShuntElementForm.cpp$(ObjectSuffix) $(IntermediateDirectory)/SwitchingForm.cpp$(ObjectSuffix) $(IntermediateDirectory)/SyncMachineForm.cpp$(ObjectSuffix) $(IntermediateDirectory)/TransformerForm.cpp$(ObjectSuffix) @@ -484,6 +484,22 @@ $(IntermediateDirectory)/TransferFunction.cpp$(DependSuffix): TransferFunction.c $(IntermediateDirectory)/TransferFunction.cpp$(PreprocessSuffix): TransferFunction.cpp $(CXX) $(CXXFLAGS) $(IncludePCH) $(IncludePath) $(PreprocessOnlySwitch) $(OutputSwitch) $(IntermediateDirectory)/TransferFunction.cpp$(PreprocessSuffix) TransferFunction.cpp +$(IntermediateDirectory)/Divider.cpp$(ObjectSuffix): Divider.cpp $(IntermediateDirectory)/Divider.cpp$(DependSuffix) + $(CXX) $(IncludePCH) $(SourceSwitch) "C:/Users/NDSE-69/Documents/GitHub/PSP/Project/Divider.cpp" $(CXXFLAGS) $(ObjectSwitch)$(IntermediateDirectory)/Divider.cpp$(ObjectSuffix) $(IncludePath) +$(IntermediateDirectory)/Divider.cpp$(DependSuffix): Divider.cpp + @$(CXX) $(CXXFLAGS) $(IncludePCH) $(IncludePath) -MG -MP -MT$(IntermediateDirectory)/Divider.cpp$(ObjectSuffix) -MF$(IntermediateDirectory)/Divider.cpp$(DependSuffix) -MM Divider.cpp + +$(IntermediateDirectory)/Divider.cpp$(PreprocessSuffix): Divider.cpp + $(CXX) $(CXXFLAGS) $(IncludePCH) $(IncludePath) $(PreprocessOnlySwitch) $(OutputSwitch) $(IntermediateDirectory)/Divider.cpp$(PreprocessSuffix) Divider.cpp + +$(IntermediateDirectory)/MathOperation.cpp$(ObjectSuffix): MathOperation.cpp $(IntermediateDirectory)/MathOperation.cpp$(DependSuffix) + $(CXX) $(IncludePCH) $(SourceSwitch) "C:/Users/NDSE-69/Documents/GitHub/PSP/Project/MathOperation.cpp" $(CXXFLAGS) $(ObjectSwitch)$(IntermediateDirectory)/MathOperation.cpp$(ObjectSuffix) $(IncludePath) +$(IntermediateDirectory)/MathOperation.cpp$(DependSuffix): MathOperation.cpp + @$(CXX) $(CXXFLAGS) $(IncludePCH) $(IncludePath) -MG -MP -MT$(IntermediateDirectory)/MathOperation.cpp$(ObjectSuffix) -MF$(IntermediateDirectory)/MathOperation.cpp$(DependSuffix) -MM MathOperation.cpp + +$(IntermediateDirectory)/MathOperation.cpp$(PreprocessSuffix): MathOperation.cpp + $(CXX) $(CXXFLAGS) $(IncludePCH) $(IncludePath) $(PreprocessOnlySwitch) $(OutputSwitch) $(IntermediateDirectory)/MathOperation.cpp$(PreprocessSuffix) MathOperation.cpp + $(IntermediateDirectory)/GraphicalElement.cpp$(ObjectSuffix): GraphicalElement.cpp $(IntermediateDirectory)/GraphicalElement.cpp$(DependSuffix) $(CXX) $(IncludePCH) $(SourceSwitch) "C:/Users/NDSE-69/Documents/GitHub/PSP/Project/GraphicalElement.cpp" $(CXXFLAGS) $(ObjectSwitch)$(IntermediateDirectory)/GraphicalElement.cpp$(ObjectSuffix) $(IncludePath) $(IntermediateDirectory)/GraphicalElement.cpp$(DependSuffix): GraphicalElement.cpp diff --git a/Project/Project.project b/Project/Project.project index 98b1a43..091dde7 100644 --- a/Project/Project.project +++ b/Project/Project.project @@ -34,6 +34,8 @@ <File Name="RateLimiter.cpp"/> <File Name="Sum.cpp"/> <File Name="TransferFunction.cpp"/> + <File Name="Divider.cpp"/> + <File Name="MathOperation.cpp"/> </VirtualDirectory> <VirtualDirectory Name="graphical"> <File Name="GraphicalElement.cpp"/> @@ -149,6 +151,8 @@ <File Name="RateLimiter.h"/> <File Name="Sum.h"/> <File Name="TransferFunction.h"/> + <File Name="Divider.h"/> + <File Name="MathOperation.h"/> </VirtualDirectory> <VirtualDirectory Name="power"> <File Name="Branch.h"/> diff --git a/Project/Project.txt b/Project/Project.txt index 571d423..cd6bd62 100644 --- a/Project/Project.txt +++ b/Project/Project.txt @@ -1,2 +1,2 @@ -./Release/main.cpp.o ./Release/win_resources.rc.o ./Release/PropertiesData.cpp.o ./Release/ArtMetro.cpp.o ./Release/wxGLString.cpp.o ./Release/MainFrameBitmaps.cpp.o ./Release/WorkspaceBitmaps.cpp.o ./Release/BusFormBitmaps.cpp.o ./Release/ElementFormBitmaps.cpp.o ./Release/ControlEditorBitmaps.cpp.o ./Release/ChartViewBitmaps.cpp.o ./Release/PropertiesFormBitmaps.cpp.o ./Release/DataReportBitmaps.cpp.o ./Release/MainFrameBase.cpp.o ./Release/WorkspaceBase.cpp.o ./Release/ElementForm.cpp.o ./Release/ControlEditorBase.cpp.o ./Release/ChartViewBase.cpp.o ./Release/PropertiesForm.cpp.o ./Release/DataReportBase.cpp.o ./Release/ElectricCalculation.cpp.o ./Release/PowerFlow.cpp.o ./Release/Fault.cpp.o ./Release/Electromechanical.cpp.o ./Release/Element.cpp.o ./Release/ElementDataObject.cpp.o ./Release/ElementPlotData.cpp.o ./Release/wxMathPlot_mathplot.cpp.o ./Release/Camera.cpp.o ./Release/MainFrame.cpp.o ./Release/Workspace.cpp.o ./Release/ChartView.cpp.o ./Release/ControlEditor.cpp.o ./Release/DataReport.cpp.o ./Release/FileHanding.cpp.o ./Release/ConnectionLine.cpp.o ./Release/Constant.cpp.o ./Release/ControlElement.cpp.o ./Release/ControlElementContainer.cpp.o ./Release/ControlElementSolver.cpp.o ./Release/Exponential.cpp.o ./Release/Gain.cpp.o ./Release/IOControl.cpp.o ./Release/Limiter.cpp.o ./Release/Multiplier.cpp.o ./Release/RateLimiter.cpp.o ./Release/Sum.cpp.o ./Release/TransferFunction.cpp.o ./Release/GraphicalElement.cpp.o ./Release/Text.cpp.o ./Release/Branch.cpp.o ./Release/Bus.cpp.o ./Release/Capacitor.cpp.o ./Release/IndMotor.cpp.o ./Release/Inductor.cpp.o ./Release/Line.cpp.o ./Release/Load.cpp.o ./Release/Machines.cpp.o ./Release/PowerElement.cpp.o ./Release/Shunt.cpp.o ./Release/SyncGenerator.cpp.o ./Release/SyncMotor.cpp.o ./Release/Transformer.cpp.o ./Release/GeneralPropertiesForm.cpp.o -./Release/SimulationsSettingsForm.cpp.o ./Release/AboutForm.cpp.o ./Release/ConstantForm.cpp.o ./Release/ControlSystemTest.cpp.o ./Release/ExponentialForm.cpp.o ./Release/GainForm.cpp.o ./Release/IOControlForm.cpp.o ./Release/LimiterForm.cpp.o ./Release/RateLimiterForm.cpp.o ./Release/SumForm.cpp.o ./Release/TransferFunctionForm.cpp.o ./Release/TextForm.cpp.o ./Release/BusForm.cpp.o ./Release/GeneratorStabForm.cpp.o ./Release/IndMotorForm.cpp.o ./Release/LineForm.cpp.o ./Release/LoadForm.cpp.o ./Release/ReactiveShuntElementForm.cpp.o ./Release/SwitchingForm.cpp.o ./Release/SyncMachineForm.cpp.o ./Release/TransformerForm.cpp.o +./Release/main.cpp.o ./Release/win_resources.rc.o ./Release/PropertiesData.cpp.o ./Release/ArtMetro.cpp.o ./Release/wxGLString.cpp.o ./Release/MainFrameBitmaps.cpp.o ./Release/WorkspaceBitmaps.cpp.o ./Release/BusFormBitmaps.cpp.o ./Release/ElementFormBitmaps.cpp.o ./Release/ControlEditorBitmaps.cpp.o ./Release/ChartViewBitmaps.cpp.o ./Release/PropertiesFormBitmaps.cpp.o ./Release/DataReportBitmaps.cpp.o ./Release/MainFrameBase.cpp.o ./Release/WorkspaceBase.cpp.o ./Release/ElementForm.cpp.o ./Release/ControlEditorBase.cpp.o ./Release/ChartViewBase.cpp.o ./Release/PropertiesForm.cpp.o ./Release/DataReportBase.cpp.o ./Release/ElectricCalculation.cpp.o ./Release/PowerFlow.cpp.o ./Release/Fault.cpp.o ./Release/Electromechanical.cpp.o ./Release/Element.cpp.o ./Release/ElementDataObject.cpp.o ./Release/ElementPlotData.cpp.o ./Release/wxMathPlot_mathplot.cpp.o ./Release/Camera.cpp.o ./Release/MainFrame.cpp.o ./Release/Workspace.cpp.o ./Release/ChartView.cpp.o ./Release/ControlEditor.cpp.o ./Release/DataReport.cpp.o ./Release/FileHanding.cpp.o ./Release/ConnectionLine.cpp.o ./Release/Constant.cpp.o ./Release/ControlElement.cpp.o ./Release/ControlElementContainer.cpp.o ./Release/ControlElementSolver.cpp.o ./Release/Exponential.cpp.o ./Release/Gain.cpp.o ./Release/IOControl.cpp.o ./Release/Limiter.cpp.o ./Release/Multiplier.cpp.o ./Release/RateLimiter.cpp.o ./Release/Sum.cpp.o ./Release/TransferFunction.cpp.o ./Release/Divider.cpp.o ./Release/MathOperation.cpp.o ./Release/GraphicalElement.cpp.o ./Release/Text.cpp.o ./Release/Branch.cpp.o ./Release/Bus.cpp.o ./Release/Capacitor.cpp.o ./Release/IndMotor.cpp.o ./Release/Inductor.cpp.o ./Release/Line.cpp.o ./Release/Load.cpp.o ./Release/Machines.cpp.o ./Release/PowerElement.cpp.o ./Release/Shunt.cpp.o ./Release/SyncGenerator.cpp.o ./Release/SyncMotor.cpp.o +./Release/Transformer.cpp.o ./Release/GeneralPropertiesForm.cpp.o ./Release/SimulationsSettingsForm.cpp.o ./Release/AboutForm.cpp.o ./Release/ConstantForm.cpp.o ./Release/ControlSystemTest.cpp.o ./Release/ExponentialForm.cpp.o ./Release/GainForm.cpp.o ./Release/IOControlForm.cpp.o ./Release/LimiterForm.cpp.o ./Release/RateLimiterForm.cpp.o ./Release/SumForm.cpp.o ./Release/TransferFunctionForm.cpp.o ./Release/TextForm.cpp.o ./Release/BusForm.cpp.o ./Release/GeneratorStabForm.cpp.o ./Release/IndMotorForm.cpp.o ./Release/LineForm.cpp.o ./Release/LoadForm.cpp.o ./Release/ReactiveShuntElementForm.cpp.o ./Release/SwitchingForm.cpp.o ./Release/SyncMachineForm.cpp.o ./Release/TransformerForm.cpp.o |