summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThales Lima Oliveira <thaleslima.ufu@gmail.com>2017-10-09 22:17:10 -0300
committerThales Lima Oliveira <thaleslima.ufu@gmail.com>2017-10-09 22:17:10 -0300
commiteea796f53f5d9dc1444a620713b3326f04b73339 (patch)
tree2cc6cd35c3dfa718c26b7f5de9dcee913fb93028
parentaa2378020ee0bbfd041681cfdbe62a8d028687f3 (diff)
downloadPSP.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.cpp11
-rw-r--r--Project/ControlEditor.h15
-rw-r--r--Project/ControlElementContainer.cpp4
-rw-r--r--Project/ControlElementContainer.h3
-rw-r--r--Project/ControlElementSolver.cpp3
-rw-r--r--Project/ControlElementSolver.h3
-rw-r--r--Project/Divider.cpp74
-rw-r--r--Project/Divider.h43
-rw-r--r--Project/Electromechanical.cpp1
-rw-r--r--Project/FileHanding.cpp62
-rw-r--r--Project/GeneratorStabForm.cpp2
-rw-r--r--Project/IOControl.cpp8
-rw-r--r--Project/IOControl.h1
-rw-r--r--Project/IOControlForm.cpp8
-rw-r--r--Project/MathOperation.cpp95
-rw-r--r--Project/MathOperation.h48
-rw-r--r--Project/Multiplier.cpp72
-rw-r--r--Project/Multiplier.h14
-rw-r--r--Project/Project.mk30
-rw-r--r--Project/Project.project4
-rw-r--r--Project/Project.txt4
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