summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Project/Bus.cpp4
-rw-r--r--Project/Bus.h2
-rw-r--r--Project/Capacitor.cpp5
-rw-r--r--Project/Capacitor.h2
-rw-r--r--Project/Constant.cpp4
-rw-r--r--Project/Constant.h2
-rw-r--r--Project/ControlElement.cpp7
-rw-r--r--Project/ControlElement.h2
-rw-r--r--Project/ControlElementSolver.cpp39
-rw-r--r--Project/Divider.cpp4
-rw-r--r--Project/Divider.h6
-rw-r--r--Project/Element.h2
-rw-r--r--Project/Exponential.cpp4
-rw-r--r--Project/Exponential.h2
-rw-r--r--Project/FileHanding.cpp1245
-rw-r--r--Project/Gain.cpp4
-rw-r--r--Project/Gain.h2
-rw-r--r--Project/IOControl.cpp4
-rw-r--r--Project/IOControl.h2
-rw-r--r--Project/IndMotor.cpp4
-rw-r--r--Project/IndMotor.h2
-rw-r--r--Project/Inductor.cpp43
-rw-r--r--Project/Inductor.h4
-rw-r--r--Project/Limiter.cpp4
-rw-r--r--Project/Limiter.h2
-rw-r--r--Project/Line.cpp220
-rw-r--r--Project/Line.h3
-rw-r--r--Project/Load.cpp93
-rw-r--r--Project/Load.h3
-rw-r--r--Project/MathExpression.cpp7
-rw-r--r--Project/MathExpression.h2
-rw-r--r--Project/Multiplier.cpp4
-rw-r--r--Project/Multiplier.h2
-rw-r--r--Project/Project.mk2
-rw-r--r--Project/RateLimiter.cpp4
-rw-r--r--Project/RateLimiter.h2
-rw-r--r--Project/Sum.cpp4
-rw-r--r--Project/Sum.h2
-rw-r--r--Project/SyncGenerator.cpp181
-rw-r--r--Project/SyncGenerator.h3
-rw-r--r--Project/SyncMotor.cpp106
-rw-r--r--Project/SyncMotor.h3
-rw-r--r--Project/Text.cpp96
-rw-r--r--Project/Text.h4
-rw-r--r--Project/TransferFunction.cpp5
-rw-r--r--Project/TransferFunction.h2
-rw-r--r--Project/Transformer.cpp236
-rw-r--r--Project/Transformer.h3
-rw-r--r--Project/XMLParser.h35
49 files changed, 1087 insertions, 1336 deletions
diff --git a/Project/Bus.cpp b/Project/Bus.cpp
index be0f935..eecc06a 100644
--- a/Project/Bus.cpp
+++ b/Project/Bus.cpp
@@ -259,7 +259,7 @@ bool Bus::GetPlotData(ElementPlotData& plotData)
return true;
}
-void Bus::SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode)
+rapidxml::xml_node<>* Bus::SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode)
{
m_electricalData.number = m_elementID;
@@ -307,6 +307,8 @@ void Bus::SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* eleme
XMLParser::SetNodeValue(doc, stabFaultResistance, m_electricalData.stabFaultResistance);
auto stabFaultReactance = XMLParser::AppendNode(doc, stability, "FaultReactance");
XMLParser::SetNodeValue(doc, stabFaultReactance, m_electricalData.stabFaultReactance);
+
+ return elementNode;
}
bool Bus::OpenElement(rapidxml::xml_node<>* elementNode)
diff --git a/Project/Bus.h b/Project/Bus.h
index 9264585..503299e 100644
--- a/Project/Bus.h
+++ b/Project/Bus.h
@@ -89,7 +89,7 @@ class Bus : public PowerElement
virtual bool ShowForm(wxWindow* parent, Element* element);
virtual bool GetPlotData(ElementPlotData& plotData);
- virtual void SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode);
+ virtual rapidxml::xml_node<>* SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode);
virtual bool OpenElement(rapidxml::xml_node<>* elementNode);
protected:
diff --git a/Project/Capacitor.cpp b/Project/Capacitor.cpp
index 0378506..76dc3fd 100644
--- a/Project/Capacitor.cpp
+++ b/Project/Capacitor.cpp
@@ -218,7 +218,7 @@ wxString Capacitor::GetTipText() const
return tipText;
}
-void Capacitor::SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode)
+rapidxml::xml_node<>* Capacitor::SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode)
{
auto elementNode = XMLParser::AppendNode(doc, elementListNode, "Capacitor");
XMLParser::SetNodeAttribute(doc, elementNode, "ID", m_elementID);
@@ -235,6 +235,8 @@ void Capacitor::SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>*
XMLParser::SetNodeAttribute(doc, reactivePower, "UnitID", m_electricalData.reactivePowerUnit);
SaveSwitchingData(doc, electricalProp);
+
+ return elementNode;
}
bool Capacitor::OpenElement(rapidxml::xml_node<>* elementNode, std::vector<Element*> parentList)
@@ -251,7 +253,6 @@ bool Capacitor::OpenElement(rapidxml::xml_node<>* elementNode, std::vector<Eleme
static_cast<ElectricalUnit>(XMLParser::GetAttributeValueInt(electricalProp, "ReactivePower", "UnitID"));
if(!OpenSwitchingData(electricalProp)) return false;
-
if(m_swData.swTime.size() != 0) SetDynamicEvent(true);
m_inserted = true;
diff --git a/Project/Capacitor.h b/Project/Capacitor.h
index 7f09e09..8cf1c64 100644
--- a/Project/Capacitor.h
+++ b/Project/Capacitor.h
@@ -55,7 +55,7 @@ class Capacitor : public Shunt
virtual CapacitorElectricalData GetPUElectricalData(double systemPowerBase);
virtual void SetElectricalData(CapacitorElectricalData electricalData) { m_electricalData = electricalData; }
- virtual void SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode);
+ virtual rapidxml::xml_node<>* SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode);
virtual bool OpenElement(rapidxml::xml_node<>* elementNode, std::vector<Element*> parentList);
protected:
diff --git a/Project/Constant.cpp b/Project/Constant.cpp
index ce50719..c81a0cf 100644
--- a/Project/Constant.cpp
+++ b/Project/Constant.cpp
@@ -129,7 +129,7 @@ bool Constant::UpdateText()
return true;
}
-void Constant::SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode)
+rapidxml::xml_node<>* Constant::SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode)
{
auto elementNode = XMLParser::AppendNode(doc, elementListNode, "Constant");
XMLParser::SetNodeAttribute(doc, elementNode, "ID", m_elementID);
@@ -140,6 +140,8 @@ void Constant::SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>*
// Element properties
auto value = XMLParser::AppendNode(doc, elementNode, "Value");
XMLParser::SetNodeValue(doc, value, m_value);
+
+ return elementNode;
}
bool Constant::OpenElement(rapidxml::xml_node<>* elementNode)
diff --git a/Project/Constant.h b/Project/Constant.h
index d61e1f0..dd4dbfa 100644
--- a/Project/Constant.h
+++ b/Project/Constant.h
@@ -48,7 +48,7 @@ class Constant : public ControlElement
virtual double GetValue() const { return m_value; }
virtual void UpdatePoints();
- virtual void SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode);
+ virtual rapidxml::xml_node<>* SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode);
virtual bool OpenElement(rapidxml::xml_node<>* elementNode);
virtual Element* GetCopy();
diff --git a/Project/ControlElement.cpp b/Project/ControlElement.cpp
index f67cef1..5e8a80d 100644
--- a/Project/ControlElement.cpp
+++ b/Project/ControlElement.cpp
@@ -194,3 +194,10 @@ bool ControlElement::OpenControlNodes(rapidxml::xml_node<>* elementNode)
}
return true;
}
+
+bool ControlElement::Initialize()
+{
+ m_solved = false;
+ m_output = 0.0;
+ return true;
+}
diff --git a/Project/ControlElement.h b/Project/ControlElement.h
index 6d1593f..51f8df3 100644
--- a/Project/ControlElement.h
+++ b/Project/ControlElement.h
@@ -104,7 +104,7 @@ class ControlElement : public Element
virtual bool IsSolved() const { return m_solved; }
virtual void SetSolved(bool solved = true) { m_solved = solved; }
virtual bool Solve(double* input, double timeStep);
- virtual bool Initialize() { return true; }
+ virtual bool Initialize();
virtual double GetOutput() const { return m_output; }
virtual void SetOutput(double output) { m_output = output; }
diff --git a/Project/ControlElementSolver.cpp b/Project/ControlElementSolver.cpp
index 84de9d7..7849313 100644
--- a/Project/ControlElementSolver.cpp
+++ b/Project/ControlElementSolver.cpp
@@ -50,7 +50,7 @@ void ControlElementSolver::Initialize(wxWindow* parent, double timeStep, double
{
// Init the input array size
if(m_inputToSolve) delete[] m_inputToSolve;
- m_inputToSolve = new double[3];
+ m_inputToSolve = new double[3];
// Check if the sistem have one input and one output
bool fail = false;
auto ioList = m_ctrlContainer->GetIOControlList();
@@ -107,25 +107,15 @@ bool ControlElementSolver::InitializeValues(bool startAllZero)
// Reset Elements values
auto elementList = m_ctrlContainer->GetControlElementsList();
for(auto it = elementList.begin(), itEnd = elementList.end(); it != itEnd; ++it) {
- ControlElement* element = *it;
- element->SetSolved(false);
- element->SetOutput(0.0);
- }
- auto tfList = m_ctrlContainer->GetTFList();
- for(auto it = tfList.begin(), itEnd = tfList.end(); it != itEnd; ++it) {
- TransferFunction* tf = *it;
- tf->CalculateSpaceState(100, m_integrationError);
+ if(!(*it)->Initialize()) return false;
}
auto connectionLineList = m_ctrlContainer->GetConnectionLineList();
for(auto it = connectionLineList.begin(), itEnd = connectionLineList.end(); it != itEnd; ++it) {
- ConnectionLine* cLine = *it;
- cLine->SetSolved(false);
- cLine->SetValue(0.0);
+ if(!(*it)->Initialize()) return false;
}
- auto mathExprList = m_ctrlContainer->GetMathExprList();
- for(auto it = mathExprList.begin(), itEnd = mathExprList.end(); it != itEnd; ++it) {
- MathExpression* mathExpr = *it;
- if(!mathExpr->Initialize()) return false;
+ auto tfList = m_ctrlContainer->GetTFList();
+ for(auto it = tfList.begin(), itEnd = tfList.end(); it != itEnd; ++it) {
+ (*it)->CalculateSpaceState(100, m_integrationError);
}
if(!startAllZero) {
@@ -195,6 +185,23 @@ void ControlElementSolver::SolveNextStep()
}
}
+ // Solve math expression without inputs (but connected)
+ auto mathExprList = m_ctrlContainer->GetMathExprList();
+ for(auto it = mathExprList.begin(), itEnd = mathExprList.end(); it != itEnd; ++it) {
+ MathExpression* mathExpr = *it;
+ if(mathExpr->GetVariables().size() == 0) { // No variables, no inputs.
+ m_inputToSolve[0] = 0.0;
+ m_inputToSolve[1] = m_currentTime;
+ m_inputToSolve[2] = m_switchStatus;
+ mathExpr->Solve(m_inputToSolve, m_timeStep);
+ mathExpr->SetSolved();
+ ConnectionLine* child = static_cast<ConnectionLine*>(mathExpr->GetChildList()[0]);
+ child->SetValue(mathExpr->GetOutput());
+ child->SetSolved();
+ FillAllConnectedChildren(child);
+ }
+ }
+
// Set value to the connected lines in inputs
auto ioList = m_ctrlContainer->GetIOControlList();
for(auto it = ioList.begin(), itEnd = ioList.end(); it != itEnd; ++it) {
diff --git a/Project/Divider.cpp b/Project/Divider.cpp
index a19d9c5..e723de3 100644
--- a/Project/Divider.cpp
+++ b/Project/Divider.cpp
@@ -76,13 +76,15 @@ Element* Divider::GetCopy()
return copy;
}
-void Divider::SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode)
+rapidxml::xml_node<>* Divider::SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode)
{
auto elementNode = XMLParser::AppendNode(doc, elementListNode, "Divider");
XMLParser::SetNodeAttribute(doc, elementNode, "ID", m_elementID);
SaveCADProperties(doc, elementNode);
SaveControlNodes(doc, elementNode);
+
+ return elementNode;
}
bool Divider::OpenElement(rapidxml::xml_node<>* elementNode)
diff --git a/Project/Divider.h b/Project/Divider.h
index 52154f4..5b74f9c 100644
--- a/Project/Divider.h
+++ b/Project/Divider.h
@@ -37,10 +37,10 @@ class Divider : public MathOperation
virtual void DrawSymbol() const;
virtual bool Solve(double* input, double timeStep);
-
- virtual void SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode);
+
+ virtual rapidxml::xml_node<>* SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode);
virtual bool OpenElement(rapidxml::xml_node<>* elementNode);
-
+
virtual Element* GetCopy();
};
diff --git a/Project/Element.h b/Project/Element.h
index d48c3a6..b31a81a 100644
--- a/Project/Element.h
+++ b/Project/Element.h
@@ -567,7 +567,7 @@ class Element
*/
virtual double PointToLineDistance(wxPoint2DDouble point, int* segmentNumber = NULL) const;
- virtual void SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode) {}
+ virtual rapidxml::xml_node<>* SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode) { return NULL; }
virtual bool OpenElement(rapidxml::xml_node<>* elementNode) { return true; }
void SaveCADProperties(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementNode);
bool OpenCADProperties(rapidxml::xml_node<>* elementNode);
diff --git a/Project/Exponential.cpp b/Project/Exponential.cpp
index 4a04bbe..136a2fa 100644
--- a/Project/Exponential.cpp
+++ b/Project/Exponential.cpp
@@ -146,7 +146,7 @@ Element* Exponential::GetCopy()
return copy;
}
-void Exponential::SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode)
+rapidxml::xml_node<>* Exponential::SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode)
{
auto elementNode = XMLParser::AppendNode(doc, elementListNode, "Exponential");
XMLParser::SetNodeAttribute(doc, elementNode, "ID", m_elementID);
@@ -159,6 +159,8 @@ void Exponential::SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<
XMLParser::SetNodeValue(doc, aValue, m_aValue);
auto bValue = XMLParser::AppendNode(doc, value, "B");
XMLParser::SetNodeValue(doc, bValue, m_bValue);
+
+ return elementNode;
}
bool Exponential::OpenElement(rapidxml::xml_node<>* elementNode)
diff --git a/Project/Exponential.h b/Project/Exponential.h
index 8151b40..7d7f44e 100644
--- a/Project/Exponential.h
+++ b/Project/Exponential.h
@@ -56,7 +56,7 @@ class Exponential : public ControlElement
*/
virtual bool Solve(double* input, double timeStep);
- virtual void SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode);
+ virtual rapidxml::xml_node<>* SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode);
virtual bool OpenElement(rapidxml::xml_node<>* elementNode);
virtual Element* GetCopy();
diff --git a/Project/FileHanding.cpp b/Project/FileHanding.cpp
index 1393be7..7262c57 100644
--- a/Project/FileHanding.cpp
+++ b/Project/FileHanding.cpp
@@ -156,326 +156,48 @@ void FileHanding::SaveProject(wxFileName path)
//{ Inductor
auto inductorsNode = XMLParser::AppendNode(doc, elementsNode, "InductorList");
auto inductorList = allElements.GetInductorList();
- for(int i = 0; i < (int)inductorList.size(); i++) {
- Inductor* inductor = inductorList[i];
- auto inductorNode = XMLParser::AppendNode(doc, inductorsNode, "Inductor");
- XMLParser::SetNodeAttribute(doc, inductorNode, "ID", i);
- auto cadProp = XMLParser::AppendNode(doc, inductorNode, "CADProperties");
- auto position = XMLParser::AppendNode(doc, cadProp, "Position");
- auto posX = XMLParser::AppendNode(doc, position, "X");
- XMLParser::SetNodeValue(doc, posX, inductor->GetPosition().m_x);
- auto posY = XMLParser::AppendNode(doc, position, "Y");
- XMLParser::SetNodeValue(doc, posY, inductor->GetPosition().m_y);
- auto size = XMLParser::AppendNode(doc, cadProp, "Size");
- auto width = XMLParser::AppendNode(doc, size, "Width");
- XMLParser::SetNodeValue(doc, width, inductor->GetWidth());
- auto height = XMLParser::AppendNode(doc, size, "Height");
- XMLParser::SetNodeValue(doc, height, inductor->GetHeight());
- auto angle = XMLParser::AppendNode(doc, cadProp, "Angle");
- XMLParser::SetNodeValue(doc, angle, inductor->GetAngle());
- auto nodePos = XMLParser::AppendNode(doc, cadProp, "NodePosition");
- auto nodePosX = XMLParser::AppendNode(doc, nodePos, "X");
- XMLParser::SetNodeValue(doc, nodePosX, inductor->GetPointList()[0].m_x);
- auto nodePosY = XMLParser::AppendNode(doc, nodePos, "Y");
- XMLParser::SetNodeValue(doc, nodePosY, inductor->GetPointList()[0].m_y);
- auto parentID = XMLParser::AppendNode(doc, cadProp, "ParentID");
- Bus* parent = static_cast<Bus*>(inductor->GetParentList()[0]);
- if(parent) XMLParser::SetNodeValue(doc, parentID, parent->GetElectricalData().number);
-
- InductorElectricalData data = inductor->GetElectricalData();
- auto electricalProp = XMLParser::AppendNode(doc, inductorNode, "ElectricalProperties");
- auto isOnline = XMLParser::AppendNode(doc, electricalProp, "IsOnline");
- XMLParser::SetNodeValue(doc, isOnline, inductor->IsOnline());
- auto name = XMLParser::AppendNode(doc, electricalProp, "Name");
- XMLParser::SetNodeValue(doc, name, data.name);
- auto reactivePower = XMLParser::AppendNode(doc, electricalProp, "ReactivePower");
- XMLParser::SetNodeValue(doc, reactivePower, data.reactivePower);
- XMLParser::SetNodeAttribute(doc, reactivePower, "UnitID", data.reactivePowerUnit);
-
- auto switchingList = XMLParser::AppendNode(doc, electricalProp, "SwitchingList");
- SwitchingData swData = inductor->GetSwitchingData();
- for(int j = 0; j < (int)swData.swType.size(); j++) {
- auto switching = XMLParser::AppendNode(doc, switchingList, "Switching");
- XMLParser::SetNodeAttribute(doc, switching, "ID", j);
- auto swType = XMLParser::AppendNode(doc, switching, "Type");
- XMLParser::SetNodeValue(doc, swType, swData.swType[j]);
- auto swTime = XMLParser::AppendNode(doc, switching, "Time");
- XMLParser::SetNodeValue(doc, swTime, swData.swTime[j]);
- }
- } //}
+ elementID = 0;
+ for(auto it = inductorList.begin(), itEnd = inductorList.end(); it != itEnd; ++it) {
+ (*it)->SetID(elementID);
+ (*it)->SaveElement(doc, inductorsNode);
+ elementID++;
+ }
+ //}
//{ Line
auto linesNode = XMLParser::AppendNode(doc, elementsNode, "LineList");
auto lineList = allElements.GetLineList();
- for(int i = 0; i < (int)lineList.size(); i++) {
- Line* line = lineList[i];
- auto lineNode = XMLParser::AppendNode(doc, linesNode, "Line");
- XMLParser::SetNodeAttribute(doc, lineNode, "ID", i);
- auto cadProp = XMLParser::AppendNode(doc, lineNode, "CADProperties");
- auto nodeList = XMLParser::AppendNode(doc, cadProp, "NodeList");
- auto ptList = line->GetPointList();
- int nodeID = 0;
- for(int j = 0; j < (int)ptList.size(); j++) {
- if((j != 1) && (j != (int)ptList.size() - 2)) {
- auto nodePos = XMLParser::AppendNode(doc, nodeList, "Node");
- XMLParser::SetNodeAttribute(doc, nodePos, "ID", nodeID);
- auto nodePosX = XMLParser::AppendNode(doc, nodePos, "X");
- XMLParser::SetNodeValue(doc, nodePosX, ptList[j].m_x);
- auto nodePosY = XMLParser::AppendNode(doc, nodePos, "Y");
- XMLParser::SetNodeValue(doc, nodePosY, ptList[j].m_y);
- nodeID++;
- }
- }
-
- auto parentIDList = XMLParser::AppendNode(doc, cadProp, "ParentIDList");
- for(int j = 0; j < (int)line->GetParentList().size(); j++) {
- Bus* parent = static_cast<Bus*>(line->GetParentList()[j]);
- if(parent) {
- auto parentID = XMLParser::AppendNode(doc, parentIDList, "ParentID");
- XMLParser::SetNodeAttribute(doc, parentID, "ID", j);
- XMLParser::SetNodeValue(doc, parentID, parent->GetElectricalData().number);
- }
- }
-
- LineElectricalData data = line->GetElectricalData();
- auto electricalProp = XMLParser::AppendNode(doc, lineNode, "ElectricalProperties");
- auto isOnline = XMLParser::AppendNode(doc, electricalProp, "IsOnline");
- XMLParser::SetNodeValue(doc, isOnline, line->IsOnline());
- auto name = XMLParser::AppendNode(doc, electricalProp, "Name");
- XMLParser::SetNodeValue(doc, name, data.name);
- auto nominalVoltage = XMLParser::AppendNode(doc, electricalProp, "NominalVoltage");
- XMLParser::SetNodeValue(doc, nominalVoltage, data.nominalVoltage);
- XMLParser::SetNodeAttribute(doc, nominalVoltage, "UnitID", data.nominalVoltageUnit);
- auto nominalPower = XMLParser::AppendNode(doc, electricalProp, "NominalPower");
- XMLParser::SetNodeValue(doc, nominalPower, data.nominalPower);
- XMLParser::SetNodeAttribute(doc, nominalPower, "UnitID", data.nominalPowerUnit);
- auto resistance = XMLParser::AppendNode(doc, electricalProp, "Resistance");
- XMLParser::SetNodeValue(doc, resistance, data.resistance);
- XMLParser::SetNodeAttribute(doc, resistance, "UnitID", data.resistanceUnit);
- auto indReactance = XMLParser::AppendNode(doc, electricalProp, "IndReactance");
- XMLParser::SetNodeValue(doc, indReactance, data.indReactance);
- XMLParser::SetNodeAttribute(doc, indReactance, "UnitID", data.indReactanceUnit);
- auto capSusceptance = XMLParser::AppendNode(doc, electricalProp, "CapSusceptance");
- XMLParser::SetNodeValue(doc, capSusceptance, data.capSusceptance);
- XMLParser::SetNodeAttribute(doc, capSusceptance, "UnitID", data.capSusceptanceUnit);
- auto lineSize = XMLParser::AppendNode(doc, electricalProp, "LineSize");
- XMLParser::SetNodeValue(doc, lineSize, data.lineSize);
- auto useLinePower = XMLParser::AppendNode(doc, electricalProp, "UseLinePower");
- XMLParser::SetNodeValue(doc, useLinePower, data.useLinePower);
-
- auto fault = XMLParser::AppendNode(doc, electricalProp, "Fault");
- auto zeroResistance = XMLParser::AppendNode(doc, fault, "ZeroResistance");
- XMLParser::SetNodeValue(doc, zeroResistance, data.zeroResistance);
- auto zeroIndReactance = XMLParser::AppendNode(doc, fault, "ZeroIndReactance");
- XMLParser::SetNodeValue(doc, zeroIndReactance, data.zeroIndReactance);
- auto zeroCapSusceptance = XMLParser::AppendNode(doc, fault, "ZeroCapSusceptance");
- XMLParser::SetNodeValue(doc, zeroCapSusceptance, data.zeroCapSusceptance);
-
- auto switchingList = XMLParser::AppendNode(doc, electricalProp, "SwitchingList");
- SwitchingData swData = line->GetSwitchingData();
- for(int j = 0; j < (int)swData.swType.size(); j++) {
- auto switching = XMLParser::AppendNode(doc, switchingList, "Switching");
- XMLParser::SetNodeAttribute(doc, switching, "ID", j);
- auto swType = XMLParser::AppendNode(doc, switching, "Type");
- XMLParser::SetNodeValue(doc, swType, swData.swType[j]);
- auto swTime = XMLParser::AppendNode(doc, switching, "Time");
- XMLParser::SetNodeValue(doc, swTime, swData.swTime[j]);
- }
- } //}
+ elementID = 0;
+ for(auto it = lineList.begin(), itEnd = lineList.end(); it != itEnd; ++it) {
+ (*it)->SetID(elementID);
+ (*it)->SaveElement(doc, linesNode);
+ elementID++;
+ }
+ //}
//{ Load
auto loadsNode = XMLParser::AppendNode(doc, elementsNode, "LoadList");
auto loadList = allElements.GetLoadList();
- for(int i = 0; i < (int)loadList.size(); i++) {
- Load* load = loadList[i];
- auto loadNode = XMLParser::AppendNode(doc, loadsNode, "Load");
- XMLParser::SetNodeAttribute(doc, loadNode, "ID", i);
- auto cadProp = XMLParser::AppendNode(doc, loadNode, "CADProperties");
- auto position = XMLParser::AppendNode(doc, cadProp, "Position");
- auto posX = XMLParser::AppendNode(doc, position, "X");
- XMLParser::SetNodeValue(doc, posX, load->GetPosition().m_x);
- auto posY = XMLParser::AppendNode(doc, position, "Y");
- XMLParser::SetNodeValue(doc, posY, load->GetPosition().m_y);
- auto size = XMLParser::AppendNode(doc, cadProp, "Size");
- auto width = XMLParser::AppendNode(doc, size, "Width");
- XMLParser::SetNodeValue(doc, width, load->GetWidth());
- auto height = XMLParser::AppendNode(doc, size, "Height");
- XMLParser::SetNodeValue(doc, height, load->GetHeight());
- auto angle = XMLParser::AppendNode(doc, cadProp, "Angle");
- XMLParser::SetNodeValue(doc, angle, load->GetAngle());
- auto nodePos = XMLParser::AppendNode(doc, cadProp, "NodePosition");
- auto nodePosX = XMLParser::AppendNode(doc, nodePos, "X");
- XMLParser::SetNodeValue(doc, nodePosX, load->GetPointList()[0].m_x);
- auto nodePosY = XMLParser::AppendNode(doc, nodePos, "Y");
- XMLParser::SetNodeValue(doc, nodePosY, load->GetPointList()[0].m_y);
- auto parentID = XMLParser::AppendNode(doc, cadProp, "ParentID");
- Bus* parent = static_cast<Bus*>(load->GetParentList()[0]);
- if(parent) XMLParser::SetNodeValue(doc, parentID, parent->GetElectricalData().number);
-
- LoadElectricalData data = load->GetElectricalData();
- auto electricalProp = XMLParser::AppendNode(doc, loadNode, "ElectricalProperties");
- auto isOnline = XMLParser::AppendNode(doc, electricalProp, "IsOnline");
- XMLParser::SetNodeValue(doc, isOnline, load->IsOnline());
- auto name = XMLParser::AppendNode(doc, electricalProp, "Name");
- XMLParser::SetNodeValue(doc, name, data.name);
- auto activePower = XMLParser::AppendNode(doc, electricalProp, "ActivePower");
- XMLParser::SetNodeValue(doc, activePower, data.activePower);
- XMLParser::SetNodeAttribute(doc, activePower, "UnitID", data.activePowerUnit);
- auto reactivePower = XMLParser::AppendNode(doc, electricalProp, "ReactivePower");
- XMLParser::SetNodeValue(doc, reactivePower, data.reactivePower);
- XMLParser::SetNodeAttribute(doc, reactivePower, "UnitID", data.reactivePowerUnit);
- auto loadType = XMLParser::AppendNode(doc, electricalProp, "LoadType");
- XMLParser::SetNodeValue(doc, loadType, data.loadType);
-
- auto stability = XMLParser::AppendNode(doc, electricalProp, "Stability");
- auto plotLoad = XMLParser::AppendNode(doc, stability, "PlotLoad");
- XMLParser::SetNodeValue(doc, plotLoad, data.plotLoad);
- auto useCompLoad = XMLParser::AppendNode(doc, stability, "UseCompositeLoad");
- XMLParser::SetNodeValue(doc, useCompLoad, data.useCompLoad);
- auto activePowerCompl = XMLParser::AppendNode(doc, stability, "ActivePowerComposition");
- auto pzl = XMLParser::AppendNode(doc, activePowerCompl, "ConstantImpedance");
- XMLParser::SetNodeValue(doc, pzl, data.constImpedanceActive);
- auto pil = XMLParser::AppendNode(doc, activePowerCompl, "ConstantCurrent");
- XMLParser::SetNodeValue(doc, pil, data.constCurrentActive);
- auto ppl = XMLParser::AppendNode(doc, activePowerCompl, "ConstantPower");
- XMLParser::SetNodeValue(doc, ppl, data.constPowerActive);
- auto reactivePowerCompl = XMLParser::AppendNode(doc, stability, "ReactivePowerComposition");
- auto qzl = XMLParser::AppendNode(doc, reactivePowerCompl, "ConstantImpedance");
- XMLParser::SetNodeValue(doc, qzl, data.constImpedanceReactive);
- auto qil = XMLParser::AppendNode(doc, reactivePowerCompl, "ConstantCurrent");
- XMLParser::SetNodeValue(doc, qil, data.constCurrentReactive);
- auto qpl = XMLParser::AppendNode(doc, reactivePowerCompl, "ConstantPower");
- XMLParser::SetNodeValue(doc, qpl, data.constPowerReactive);
-
- auto switchingList = XMLParser::AppendNode(doc, electricalProp, "SwitchingList");
- SwitchingData swData = load->GetSwitchingData();
- for(int j = 0; j < (int)swData.swType.size(); j++) {
- auto switching = XMLParser::AppendNode(doc, switchingList, "Switching");
- XMLParser::SetNodeAttribute(doc, switching, "ID", j);
- auto swType = XMLParser::AppendNode(doc, switching, "Type");
- XMLParser::SetNodeValue(doc, swType, swData.swType[j]);
- auto swTime = XMLParser::AppendNode(doc, switching, "Time");
- XMLParser::SetNodeValue(doc, swTime, swData.swTime[j]);
- }
- } //}
+ elementID = 0;
+ for(auto it = loadList.begin(), itEnd = loadList.end(); it != itEnd; ++it) {
+ (*it)->SetID(elementID);
+ (*it)->SaveElement(doc, loadsNode);
+ elementID++;
+ }
+ //}
//{ SyncGenerator
auto syncGeneratorsNode = XMLParser::AppendNode(doc, elementsNode, "SyncGeneratorList");
auto syncGeneratorList = allElements.GetSyncGeneratorList();
- for(int i = 0; i < (int)syncGeneratorList.size(); i++) {
- SyncGenerator* syncGenerator = syncGeneratorList[i];
- auto syncGeneratorNode = XMLParser::AppendNode(doc, syncGeneratorsNode, "SyncGenerator");
- XMLParser::SetNodeAttribute(doc, syncGeneratorNode, "ID", i);
- auto cadProp = XMLParser::AppendNode(doc, syncGeneratorNode, "CADProperties");
- auto position = XMLParser::AppendNode(doc, cadProp, "Position");
- auto posX = XMLParser::AppendNode(doc, position, "X");
- XMLParser::SetNodeValue(doc, posX, syncGenerator->GetPosition().m_x);
- auto posY = XMLParser::AppendNode(doc, position, "Y");
- XMLParser::SetNodeValue(doc, posY, syncGenerator->GetPosition().m_y);
- auto size = XMLParser::AppendNode(doc, cadProp, "Size");
- auto width = XMLParser::AppendNode(doc, size, "Width");
- XMLParser::SetNodeValue(doc, width, syncGenerator->GetWidth());
- auto height = XMLParser::AppendNode(doc, size, "Height");
- XMLParser::SetNodeValue(doc, height, syncGenerator->GetHeight());
- auto angle = XMLParser::AppendNode(doc, cadProp, "Angle");
- XMLParser::SetNodeValue(doc, angle, syncGenerator->GetAngle());
- auto nodePos = XMLParser::AppendNode(doc, cadProp, "NodePosition");
- auto nodePosX = XMLParser::AppendNode(doc, nodePos, "X");
- XMLParser::SetNodeValue(doc, nodePosX, syncGenerator->GetPointList()[0].m_x);
- auto nodePosY = XMLParser::AppendNode(doc, nodePos, "Y");
- XMLParser::SetNodeValue(doc, nodePosY, syncGenerator->GetPointList()[0].m_y);
- auto parentID = XMLParser::AppendNode(doc, cadProp, "ParentID");
- Bus* parent = static_cast<Bus*>(syncGenerator->GetParentList()[0]);
- if(parent) XMLParser::SetNodeValue(doc, parentID, parent->GetElectricalData().number);
-
- SyncGeneratorElectricalData data = syncGenerator->GetElectricalData();
- auto electricalProp = XMLParser::AppendNode(doc, syncGeneratorNode, "ElectricalProperties");
- auto isOnline = XMLParser::AppendNode(doc, electricalProp, "IsOnline");
- XMLParser::SetNodeValue(doc, isOnline, syncGenerator->IsOnline());
- auto name = XMLParser::AppendNode(doc, electricalProp, "Name");
- XMLParser::SetNodeValue(doc, name, data.name);
- auto nominalPower = XMLParser::AppendNode(doc, electricalProp, "NominalPower");
- XMLParser::SetNodeValue(doc, nominalPower, data.nominalPower);
- XMLParser::SetNodeAttribute(doc, nominalPower, "UnitID", data.nominalPowerUnit);
- auto nominalVoltage = XMLParser::AppendNode(doc, electricalProp, "NominalVoltage");
- XMLParser::SetNodeValue(doc, nominalVoltage, data.nominalVoltage);
- XMLParser::SetNodeAttribute(doc, nominalVoltage, "UnitID", data.nominalVoltageUnit);
- auto activePower = XMLParser::AppendNode(doc, electricalProp, "ActivePower");
- XMLParser::SetNodeValue(doc, activePower, data.activePower);
- XMLParser::SetNodeAttribute(doc, activePower, "UnitID", data.activePowerUnit);
- auto reactivePower = XMLParser::AppendNode(doc, electricalProp, "ReactivePower");
- XMLParser::SetNodeValue(doc, reactivePower, data.reactivePower);
- XMLParser::SetNodeAttribute(doc, reactivePower, "UnitID", data.reactivePowerUnit);
- auto haveMaxReactive = XMLParser::AppendNode(doc, electricalProp, "HaveMaxReactive");
- XMLParser::SetNodeValue(doc, haveMaxReactive, data.haveMaxReactive);
- auto maxReactive = XMLParser::AppendNode(doc, electricalProp, "MaxReactive");
- XMLParser::SetNodeValue(doc, maxReactive, data.maxReactive);
- XMLParser::SetNodeAttribute(doc, maxReactive, "UnitID", data.maxReactiveUnit);
- auto haveMinReactive = XMLParser::AppendNode(doc, electricalProp, "HaveMinReactive");
- XMLParser::SetNodeValue(doc, haveMinReactive, data.haveMinReactive);
- auto minReactive = XMLParser::AppendNode(doc, electricalProp, "MinReactive");
- XMLParser::SetNodeValue(doc, minReactive, data.minReactive);
- XMLParser::SetNodeAttribute(doc, minReactive, "UnitID", data.minReactiveUnit);
- auto useMachineBase = XMLParser::AppendNode(doc, electricalProp, "UseMachineBase");
- XMLParser::SetNodeValue(doc, useMachineBase, data.useMachineBase);
-
- auto fault = XMLParser::AppendNode(doc, electricalProp, "Fault");
- auto positiveResistance = XMLParser::AppendNode(doc, fault, "PositiveResistance");
- XMLParser::SetNodeValue(doc, positiveResistance, data.positiveResistance);
- auto positiveReactance = XMLParser::AppendNode(doc, fault, "PositiveReactance");
- XMLParser::SetNodeValue(doc, positiveReactance, data.positiveReactance);
- auto negativeResistance = XMLParser::AppendNode(doc, fault, "NegativeResistance");
- XMLParser::SetNodeValue(doc, negativeResistance, data.negativeResistance);
- auto negativeReactance = XMLParser::AppendNode(doc, fault, "NegativeReactance");
- XMLParser::SetNodeValue(doc, negativeReactance, data.negativeReactance);
- auto zeroResistance = XMLParser::AppendNode(doc, fault, "ZeroResistance");
- XMLParser::SetNodeValue(doc, zeroResistance, data.zeroResistance);
- auto zeroReactance = XMLParser::AppendNode(doc, fault, "ZeroReactance");
- XMLParser::SetNodeValue(doc, zeroReactance, data.zeroReactance);
- auto groundResistance = XMLParser::AppendNode(doc, fault, "GroundResistance");
- XMLParser::SetNodeValue(doc, groundResistance, data.groundResistance);
- auto groundReactance = XMLParser::AppendNode(doc, fault, "GroundReactance");
- XMLParser::SetNodeValue(doc, groundReactance, data.groundReactance);
- auto groundNeutral = XMLParser::AppendNode(doc, fault, "GroundNeutral");
- XMLParser::SetNodeValue(doc, groundNeutral, data.groundNeutral);
-
- auto stability = XMLParser::AppendNode(doc, electricalProp, "Stability");
- auto plotSyncMachine = XMLParser::AppendNode(doc, stability, "PlotSyncMachine");
- XMLParser::SetNodeValue(doc, plotSyncMachine, data.plotSyncMachine);
- auto inertia = XMLParser::AppendNode(doc, stability, "Inertia");
- XMLParser::SetNodeValue(doc, inertia, data.inertia);
- auto damping = XMLParser::AppendNode(doc, stability, "Damping");
- XMLParser::SetNodeValue(doc, damping, data.damping);
- auto useAVR = XMLParser::AppendNode(doc, stability, "UseAVR");
- XMLParser::SetNodeValue(doc, useAVR, data.useAVR);
- auto useSpeedGovernor = XMLParser::AppendNode(doc, stability, "UseSpeedGovernor");
- XMLParser::SetNodeValue(doc, useSpeedGovernor, data.useSpeedGovernor);
- auto armResistance = XMLParser::AppendNode(doc, stability, "ArmResistance");
- XMLParser::SetNodeValue(doc, armResistance, data.armResistance);
- auto potierReactance = XMLParser::AppendNode(doc, stability, "PotierReactance");
- XMLParser::SetNodeValue(doc, potierReactance, data.potierReactance);
- auto satFactor = XMLParser::AppendNode(doc, stability, "SatFactor");
- XMLParser::SetNodeValue(doc, satFactor, data.satFactor);
- auto syncXd = XMLParser::AppendNode(doc, stability, "SyncXd");
- XMLParser::SetNodeValue(doc, syncXd, data.syncXd);
- auto syncXq = XMLParser::AppendNode(doc, stability, "SyncXq");
- XMLParser::SetNodeValue(doc, syncXq, data.syncXq);
- auto transXd = XMLParser::AppendNode(doc, stability, "TransXd");
- XMLParser::SetNodeValue(doc, transXd, data.transXd);
- auto transXq = XMLParser::AppendNode(doc, stability, "TransXq");
- XMLParser::SetNodeValue(doc, transXq, data.transXq);
- auto transTd0 = XMLParser::AppendNode(doc, stability, "TransTd0");
- XMLParser::SetNodeValue(doc, transTd0, data.transTd0);
- auto transTq0 = XMLParser::AppendNode(doc, stability, "TransTq0");
- XMLParser::SetNodeValue(doc, transTq0, data.transTq0);
- auto subXd = XMLParser::AppendNode(doc, stability, "SubXd");
- XMLParser::SetNodeValue(doc, subXd, data.subXd);
- auto subXq = XMLParser::AppendNode(doc, stability, "SubXq");
- XMLParser::SetNodeValue(doc, subXq, data.subXq);
- auto subTd0 = XMLParser::AppendNode(doc, stability, "SubTd0");
- XMLParser::SetNodeValue(doc, subTd0, data.subTd0);
- auto subTq0 = XMLParser::AppendNode(doc, stability, "SubTq0");
- XMLParser::SetNodeValue(doc, subTq0, data.subTq0);
+ elementID = 0;
+ for(auto it = syncGeneratorList.begin(), itEnd = syncGeneratorList.end(); it != itEnd; ++it) {
+ (*it)->SetID(elementID);
+ auto elementNode = (*it)->SaveElement(doc, syncGeneratorsNode);
+
+ // Save controls
+ auto data = (*it)->GetElectricalData();
+ auto electricalProp = elementNode->first_node("ElectricalProperties");
+ auto stability = electricalProp->first_node("Stability");
auto avr = XMLParser::AppendNode(doc, stability, "AVR");
if(data.avr) SaveControlElements(doc, avr, data.avr);
@@ -483,280 +205,40 @@ void FileHanding::SaveProject(wxFileName path)
auto speedGov = XMLParser::AppendNode(doc, stability, "SpeedGovernor");
if(data.speedGov) SaveControlElements(doc, speedGov, data.speedGov);
- auto switchingList = XMLParser::AppendNode(doc, electricalProp, "SwitchingList");
- SwitchingData swData = syncGenerator->GetSwitchingData();
- for(int j = 0; j < (int)swData.swType.size(); j++) {
- auto switching = XMLParser::AppendNode(doc, switchingList, "Switching");
- XMLParser::SetNodeAttribute(doc, switching, "ID", j);
- auto swType = XMLParser::AppendNode(doc, switching, "Type");
- XMLParser::SetNodeValue(doc, swType, swData.swType[j]);
- auto swTime = XMLParser::AppendNode(doc, switching, "Time");
- XMLParser::SetNodeValue(doc, swTime, swData.swTime[j]);
- }
- } //}
+ elementID++;
+ }
+ //}
//{ SyncMotor
auto syncMotorsNode = XMLParser::AppendNode(doc, elementsNode, "SyncMotorList");
auto syncMotorList = allElements.GetSyncMotorList();
- for(int i = 0; i < (int)syncMotorList.size(); i++) {
- SyncMotor* syncMotor = syncMotorList[i];
- auto syncMotorNode = XMLParser::AppendNode(doc, syncMotorsNode, "SyncMotor");
- XMLParser::SetNodeAttribute(doc, syncMotorNode, "ID", i);
- auto cadProp = XMLParser::AppendNode(doc, syncMotorNode, "CADProperties");
- auto position = XMLParser::AppendNode(doc, cadProp, "Position");
- auto posX = XMLParser::AppendNode(doc, position, "X");
- XMLParser::SetNodeValue(doc, posX, syncMotor->GetPosition().m_x);
- auto posY = XMLParser::AppendNode(doc, position, "Y");
- XMLParser::SetNodeValue(doc, posY, syncMotor->GetPosition().m_y);
- auto size = XMLParser::AppendNode(doc, cadProp, "Size");
- auto width = XMLParser::AppendNode(doc, size, "Width");
- XMLParser::SetNodeValue(doc, width, syncMotor->GetWidth());
- auto height = XMLParser::AppendNode(doc, size, "Height");
- XMLParser::SetNodeValue(doc, height, syncMotor->GetHeight());
- auto angle = XMLParser::AppendNode(doc, cadProp, "Angle");
- XMLParser::SetNodeValue(doc, angle, syncMotor->GetAngle());
- auto nodePos = XMLParser::AppendNode(doc, cadProp, "NodePosition");
- auto nodePosX = XMLParser::AppendNode(doc, nodePos, "X");
- XMLParser::SetNodeValue(doc, nodePosX, syncMotor->GetPointList()[0].m_x);
- auto nodePosY = XMLParser::AppendNode(doc, nodePos, "Y");
- XMLParser::SetNodeValue(doc, nodePosY, syncMotor->GetPointList()[0].m_y);
- auto parentID = XMLParser::AppendNode(doc, cadProp, "ParentID");
- Bus* parent = static_cast<Bus*>(syncMotor->GetParentList()[0]);
- if(parent) XMLParser::SetNodeValue(doc, parentID, parent->GetElectricalData().number);
-
- SyncMotorElectricalData data = syncMotor->GetElectricalData();
- auto electricalProp = XMLParser::AppendNode(doc, syncMotorNode, "ElectricalProperties");
- auto isOnline = XMLParser::AppendNode(doc, electricalProp, "IsOnline");
- XMLParser::SetNodeValue(doc, isOnline, syncMotor->IsOnline());
- auto name = XMLParser::AppendNode(doc, electricalProp, "Name");
- XMLParser::SetNodeValue(doc, name, data.name);
- auto nominalPower = XMLParser::AppendNode(doc, electricalProp, "NominalPower");
- XMLParser::SetNodeValue(doc, nominalPower, data.nominalPower);
- XMLParser::SetNodeAttribute(doc, nominalPower, "UnitID", data.nominalPowerUnit);
- // auto nominalVoltage = XMLParser::AppendNode(doc, electricalProp, "NominalVoltage");
- // XMLParser::SetNodeValue(doc, nominalVoltage, data.nominalVoltage);
- // XMLParser::SetNodeAttribute(doc, nominalVoltage, "UnitID", data.nominalVoltageUnit);
- auto activePower = XMLParser::AppendNode(doc, electricalProp, "ActivePower");
- XMLParser::SetNodeValue(doc, activePower, data.activePower);
- XMLParser::SetNodeAttribute(doc, activePower, "UnitID", data.activePowerUnit);
- auto reactivePower = XMLParser::AppendNode(doc, electricalProp, "ReactivePower");
- XMLParser::SetNodeValue(doc, reactivePower, data.reactivePower);
- XMLParser::SetNodeAttribute(doc, reactivePower, "UnitID", data.reactivePowerUnit);
- auto haveMaxReactive = XMLParser::AppendNode(doc, electricalProp, "HaveMaxReactive");
- XMLParser::SetNodeValue(doc, haveMaxReactive, data.haveMaxReactive);
- auto maxReactive = XMLParser::AppendNode(doc, electricalProp, "MaxReactive");
- XMLParser::SetNodeValue(doc, maxReactive, data.maxReactive);
- XMLParser::SetNodeAttribute(doc, maxReactive, "UnitID", data.maxReactiveUnit);
- auto haveMinReactive = XMLParser::AppendNode(doc, electricalProp, "HaveMinReactive");
- XMLParser::SetNodeValue(doc, haveMinReactive, data.haveMinReactive);
- auto minReactive = XMLParser::AppendNode(doc, electricalProp, "MinReactive");
- XMLParser::SetNodeValue(doc, minReactive, data.minReactive);
- XMLParser::SetNodeAttribute(doc, minReactive, "UnitID", data.minReactiveUnit);
- auto useMachineBase = XMLParser::AppendNode(doc, electricalProp, "UseMachineBase");
- XMLParser::SetNodeValue(doc, useMachineBase, data.useMachineBase);
-
- auto fault = XMLParser::AppendNode(doc, electricalProp, "Fault");
- auto positiveResistance = XMLParser::AppendNode(doc, fault, "PositiveResistance");
- XMLParser::SetNodeValue(doc, positiveResistance, data.positiveResistance);
- auto positiveReactance = XMLParser::AppendNode(doc, fault, "PositiveReactance");
- XMLParser::SetNodeValue(doc, positiveReactance, data.positiveReactance);
- auto negativeResistance = XMLParser::AppendNode(doc, fault, "NegativeResistance");
- XMLParser::SetNodeValue(doc, negativeResistance, data.negativeResistance);
- auto negativeReactance = XMLParser::AppendNode(doc, fault, "NegativeReactance");
- XMLParser::SetNodeValue(doc, negativeReactance, data.negativeReactance);
- auto zeroResistance = XMLParser::AppendNode(doc, fault, "ZeroResistance");
- XMLParser::SetNodeValue(doc, zeroResistance, data.zeroResistance);
- auto zeroReactance = XMLParser::AppendNode(doc, fault, "ZeroReactance");
- XMLParser::SetNodeValue(doc, zeroReactance, data.zeroReactance);
- auto groundResistance = XMLParser::AppendNode(doc, fault, "GroundResistance");
- XMLParser::SetNodeValue(doc, groundResistance, data.groundResistance);
- auto groundReactance = XMLParser::AppendNode(doc, fault, "GroundReactance");
- XMLParser::SetNodeValue(doc, groundReactance, data.groundReactance);
- auto groundNeutral = XMLParser::AppendNode(doc, fault, "GroundNeutral");
- XMLParser::SetNodeValue(doc, groundNeutral, data.groundNeutral);
-
- // To future use...
- /*auto stability = XMLParser::AppendNode(doc, electricalProp, "Stability");
- auto plotSyncMachine = XMLParser::AppendNode(doc, stability, "PlotSyncMotor");
- XMLParser::SetNodeValue(doc, plotSyncMachine, data.plotSyncMachine);
- auto inertia = XMLParser::AppendNode(doc, stability, "Inertia");
- XMLParser::SetNodeValue(doc, inertia, data.inertia);
- auto damping = XMLParser::AppendNode(doc, stability, "Damping");
- XMLParser::SetNodeValue(doc, damping, data.damping);
- auto useAVR = XMLParser::AppendNode(doc, stability, "UseAVR");
- XMLParser::SetNodeValue(doc, useAVR, data.useAVR);
- auto armResistance = XMLParser::AppendNode(doc, stability, "ArmResistance");
- XMLParser::SetNodeValue(doc, armResistance, data.armResistance);
- auto potierReactance = XMLParser::AppendNode(doc, stability, "PotierReactance");
- XMLParser::SetNodeValue(doc, potierReactance, data.potierReactance);
- auto satFactor = XMLParser::AppendNode(doc, stability, "SatFactor");
- XMLParser::SetNodeValue(doc, satFactor, data.satFactor);
- auto syncXd = XMLParser::AppendNode(doc, stability, "SyncXd");
- XMLParser::SetNodeValue(doc, syncXd, data.syncXd);
- auto syncXq = XMLParser::AppendNode(doc, stability, "SyncXq");
- XMLParser::SetNodeValue(doc, syncXq, data.syncXq);
- auto transXd = XMLParser::AppendNode(doc, stability, "TransXd");
- XMLParser::SetNodeValue(doc, transXd, data.transXd);
- auto transXq = XMLParser::AppendNode(doc, stability, "TransXq");
- XMLParser::SetNodeValue(doc, transXq, data.transXq);
- auto transTd0 = XMLParser::AppendNode(doc, stability, "TransTd0");
- XMLParser::SetNodeValue(doc, transTd0, data.transTd0);
- auto transTq0 = XMLParser::AppendNode(doc, stability, "TransTq0");
- XMLParser::SetNodeValue(doc, transTq0, data.transTq0);
- auto subXd = XMLParser::AppendNode(doc, stability, "SubXd");
- XMLParser::SetNodeValue(doc, subXd, data.subXd);
- auto subXq = XMLParser::AppendNode(doc, stability, "SubXq");
- XMLParser::SetNodeValue(doc, subXq, data.subXq);
- auto subTd0 = XMLParser::AppendNode(doc, stability, "SubTd0");
- XMLParser::SetNodeValue(doc, subTd0, data.subTd0);
- auto subTq0 = XMLParser::AppendNode(doc, stability, "SubTq0");
- XMLParser::SetNodeValue(doc, subTq0, data.subTq0);
-
- auto switchingList = XMLParser::AppendNode(doc, electricalProp, "SwitchingList");
- SwitchingData swData = syncGenerator->GetSwitchingData();
- for(int j = 0; j < (int)swData.swType.size(); j++) {
- auto switching = XMLParser::AppendNode(doc, switchingList, "Switching");
- XMLParser::SetNodeAttribute(doc, switching, "ID", j);
- auto swType = XMLParser::AppendNode(doc, switching, "Type");
- XMLParser::SetNodeValue(doc, swType, swData.swType[j]);
- auto swTime = XMLParser::AppendNode(doc, switching, "Time");
- XMLParser::SetNodeValue(doc, swTime, swData.swTime[j]);
- }*/
- } //}
+ elementID = 0;
+ for(auto it = syncMotorList.begin(), itEnd = syncMotorList.end(); it != itEnd; ++it) {
+ (*it)->SetID(elementID);
+ (*it)->SaveElement(doc, syncMotorsNode);
+ elementID++;
+ }
+ //}
//{ Transfomer
auto transformersNode = XMLParser::AppendNode(doc, elementsNode, "TransformerList");
auto transformerList = allElements.GetTransformerList();
- for(int i = 0; i < (int)transformerList.size(); i++) {
- Transformer* transfomer = transformerList[i];
- auto transformerNode = XMLParser::AppendNode(doc, transformersNode, "Transfomer");
- XMLParser::SetNodeAttribute(doc, transformerNode, "ID", i);
- auto cadProp = XMLParser::AppendNode(doc, transformerNode, "CADProperties");
- auto position = XMLParser::AppendNode(doc, cadProp, "Position");
- auto posX = XMLParser::AppendNode(doc, position, "X");
- XMLParser::SetNodeValue(doc, posX, transfomer->GetPosition().m_x);
- auto posY = XMLParser::AppendNode(doc, position, "Y");
- XMLParser::SetNodeValue(doc, posY, transfomer->GetPosition().m_y);
- auto size = XMLParser::AppendNode(doc, cadProp, "Size");
- auto width = XMLParser::AppendNode(doc, size, "Width");
- XMLParser::SetNodeValue(doc, width, transfomer->GetWidth());
- auto height = XMLParser::AppendNode(doc, size, "Height");
- XMLParser::SetNodeValue(doc, height, transfomer->GetHeight());
- auto angle = XMLParser::AppendNode(doc, cadProp, "Angle");
- XMLParser::SetNodeValue(doc, angle, transfomer->GetAngle());
- auto nodeList = XMLParser::AppendNode(doc, cadProp, "NodeList");
- auto nodePos1 = XMLParser::AppendNode(doc, nodeList, "Node");
- XMLParser::SetNodeAttribute(doc, nodePos1, "ID", 0);
- auto nodePosX1 = XMLParser::AppendNode(doc, nodePos1, "X");
- XMLParser::SetNodeValue(doc, nodePosX1, transfomer->GetPointList()[0].m_x);
- auto nodePosY1 = XMLParser::AppendNode(doc, nodePos1, "Y");
- XMLParser::SetNodeValue(doc, nodePosY1, transfomer->GetPointList()[0].m_y);
- auto nodePos2 = XMLParser::AppendNode(doc, nodeList, "Node");
- XMLParser::SetNodeAttribute(doc, nodePos2, "ID", 1);
- auto nodePosX2 = XMLParser::AppendNode(doc, nodePos2, "X");
- XMLParser::SetNodeValue(doc, nodePosX2, transfomer->GetPointList()[transfomer->GetPointList().size() - 1].m_x);
- auto nodePosY2 = XMLParser::AppendNode(doc, nodePos2, "Y");
- XMLParser::SetNodeValue(doc, nodePosY2, transfomer->GetPointList()[transfomer->GetPointList().size() - 1].m_y);
-
- auto parentIDList = XMLParser::AppendNode(doc, cadProp, "ParentIDList");
- for(int j = 0; j < (int)transfomer->GetParentList().size(); j++) {
- Bus* parent = static_cast<Bus*>(transfomer->GetParentList()[j]);
- if(parent) {
- auto parentID = XMLParser::AppendNode(doc, parentIDList, "ParentID");
- XMLParser::SetNodeAttribute(doc, parentID, "ID", j);
- XMLParser::SetNodeValue(doc, parentID, parent->GetElectricalData().number);
- }
- }
-
- TransformerElectricalData data = transfomer->GetElectricalData();
- auto electricalProp = XMLParser::AppendNode(doc, transformerNode, "ElectricalProperties");
- auto isOnline = XMLParser::AppendNode(doc, electricalProp, "IsOnline");
- XMLParser::SetNodeValue(doc, isOnline, transfomer->IsOnline());
- auto name = XMLParser::AppendNode(doc, electricalProp, "Name");
- XMLParser::SetNodeValue(doc, name, data.name);
- auto primaryNominalVoltage = XMLParser::AppendNode(doc, electricalProp, "PrimaryNominalVoltage");
- XMLParser::SetNodeValue(doc, primaryNominalVoltage, data.primaryNominalVoltage);
- XMLParser::SetNodeAttribute(doc, primaryNominalVoltage, "UnitID", data.primaryNominalVoltageUnit);
- auto secondaryNominalVoltage = XMLParser::AppendNode(doc, electricalProp, "SecondaryNominalVoltage");
- XMLParser::SetNodeValue(doc, secondaryNominalVoltage, data.secondaryNominalVoltage);
- XMLParser::SetNodeAttribute(doc, secondaryNominalVoltage, "UnitID", data.secondaryNominalVoltageUnit);
- auto nominalPower = XMLParser::AppendNode(doc, electricalProp, "NominalPower");
- XMLParser::SetNodeValue(doc, nominalPower, data.nominalPower);
- XMLParser::SetNodeAttribute(doc, nominalPower, "UnitID", data.nominalPowerUnit);
- auto resistance = XMLParser::AppendNode(doc, electricalProp, "Resistance");
- XMLParser::SetNodeValue(doc, resistance, data.resistance);
- XMLParser::SetNodeAttribute(doc, resistance, "UnitID", data.resistanceUnit);
- auto indReactance = XMLParser::AppendNode(doc, electricalProp, "IndReactance");
- XMLParser::SetNodeValue(doc, indReactance, data.indReactance);
- XMLParser::SetNodeAttribute(doc, indReactance, "UnitID", data.indReactanceUnit);
- auto connection = XMLParser::AppendNode(doc, electricalProp, "Connection");
- XMLParser::SetNodeValue(doc, connection, data.connection);
- auto turnsRatio = XMLParser::AppendNode(doc, electricalProp, "TurnsRatio");
- XMLParser::SetNodeValue(doc, turnsRatio, data.turnsRatio);
- auto phaseShift = XMLParser::AppendNode(doc, electricalProp, "PhaseShift");
- XMLParser::SetNodeValue(doc, phaseShift, data.phaseShift);
- auto useTransformerPower = XMLParser::AppendNode(doc, electricalProp, "UseTransfomerPower");
- XMLParser::SetNodeValue(doc, useTransformerPower, data.useTransformerPower);
-
- auto fault = XMLParser::AppendNode(doc, electricalProp, "Fault");
- auto zeroResistance = XMLParser::AppendNode(doc, fault, "ZeroResistance");
- XMLParser::SetNodeValue(doc, zeroResistance, data.zeroResistance);
- auto zeroIndReactance = XMLParser::AppendNode(doc, fault, "ZeroIndReactance");
- XMLParser::SetNodeValue(doc, zeroIndReactance, data.zeroIndReactance);
- auto primaryGrndResistance = XMLParser::AppendNode(doc, fault, "PrimaryGrndResistance");
- XMLParser::SetNodeValue(doc, primaryGrndResistance, data.primaryGrndResistance);
- auto primaryGrndReactance = XMLParser::AppendNode(doc, fault, "PrimaryGrndReactance");
- XMLParser::SetNodeValue(doc, primaryGrndReactance, data.primaryGrndReactance);
- auto secondaryGrndResistance = XMLParser::AppendNode(doc, fault, "SecondaryGrndResistance");
- XMLParser::SetNodeValue(doc, secondaryGrndResistance, data.secondaryGrndResistance);
- auto secondaryGrndReactance = XMLParser::AppendNode(doc, fault, "SecondaryGrndReactance");
- XMLParser::SetNodeValue(doc, secondaryGrndReactance, data.secondaryGrndReactance);
-
- auto switchingList = XMLParser::AppendNode(doc, electricalProp, "SwitchingList");
- SwitchingData swData = transfomer->GetSwitchingData();
- for(int j = 0; j < (int)swData.swType.size(); j++) {
- auto switching = XMLParser::AppendNode(doc, switchingList, "Switching");
- XMLParser::SetNodeAttribute(doc, switching, "ID", j);
- auto swType = XMLParser::AppendNode(doc, switching, "Type");
- XMLParser::SetNodeValue(doc, swType, swData.swType[j]);
- auto swTime = XMLParser::AppendNode(doc, switching, "Time");
- XMLParser::SetNodeValue(doc, swTime, swData.swTime[j]);
- }
- } //}
+ elementID = 0;
+ for(auto it = transformerList.begin(), itEnd = transformerList.end(); it != itEnd; ++it) {
+ (*it)->SetID(elementID);
+ (*it)->SaveElement(doc, transformersNode);
+ elementID++;
+ }
+ //}
//{ Text
auto textsNode = XMLParser::AppendNode(doc, elementsNode, "TextList");
auto textList = m_workspace->GetTextList();
- for(int i = 0; i < (int)textList.size(); i++) {
- Text* text = textList[i];
- auto textNode = XMLParser::AppendNode(doc, textsNode, "Text");
- XMLParser::SetNodeAttribute(doc, textNode, "ID", i);
- auto cadProp = XMLParser::AppendNode(doc, textNode, "CADProperties");
- auto position = XMLParser::AppendNode(doc, cadProp, "Position");
- auto posX = XMLParser::AppendNode(doc, position, "X");
- XMLParser::SetNodeValue(doc, posX, text->GetPosition().m_x);
- auto posY = XMLParser::AppendNode(doc, position, "Y");
- XMLParser::SetNodeValue(doc, posY, text->GetPosition().m_y);
- auto size = XMLParser::AppendNode(doc, cadProp, "Size");
- auto width = XMLParser::AppendNode(doc, size, "Width");
- XMLParser::SetNodeValue(doc, width, text->GetWidth());
- auto height = XMLParser::AppendNode(doc, size, "Height");
- XMLParser::SetNodeValue(doc, height, text->GetHeight());
- auto angle = XMLParser::AppendNode(doc, cadProp, "Angle");
- XMLParser::SetNodeValue(doc, angle, text->GetAngle());
- auto textProperties = XMLParser::AppendNode(doc, textNode, "TextProperties");
- auto elementType = XMLParser::AppendNode(doc, textProperties, "ElementType");
- XMLParser::SetNodeValue(doc, elementType, text->GetElementType());
- auto elementNumber = XMLParser::AppendNode(doc, textProperties, "ElementNumber");
- XMLParser::SetNodeValue(doc, elementNumber, text->GetElementNumber());
- auto dataType = XMLParser::AppendNode(doc, textProperties, "DataType");
- XMLParser::SetNodeValue(doc, dataType, text->GetDataType());
- auto dataUnit = XMLParser::AppendNode(doc, textProperties, "DataUnit");
- XMLParser::SetNodeValue(doc, dataUnit, text->GetUnit());
- auto direction = XMLParser::AppendNode(doc, textProperties, "Direction");
- XMLParser::SetNodeValue(doc, direction, text->GetDirection());
- auto decimalPlaces = XMLParser::AppendNode(doc, textProperties, "DecimalPlaces");
- XMLParser::SetNodeValue(doc, decimalPlaces, text->GetDecimalPlaces());
+ elementID = 0;
+ for(auto it = textList.begin(), itEnd = textList.end(); it != itEnd; ++it) {
+ (*it)->SetID(elementID);
+ (*it)->SaveElement(doc, textsNode);
+ elementID++;
}
//}
@@ -849,7 +331,7 @@ bool FileHanding::OpenProject(wxFileName path)
std::vector<SyncMotor*> syncMotorList;
std::vector<Transformer*> transformerList;
std::vector<Text*> textList;
-
+
// List of parents
std::vector<Element*> parentList;
@@ -859,12 +341,12 @@ bool FileHanding::OpenProject(wxFileName path)
auto busNode = busListNode->first_node("Bus");
while(busNode) {
Bus* bus = new Bus();
-
+
if(!bus->OpenElement(busNode)) return false;
elementList.push_back(bus);
busList.push_back(bus);
parentList.push_back(bus);
-
+
busNode = busNode->next_sibling("Bus");
} //}
@@ -874,7 +356,7 @@ bool FileHanding::OpenProject(wxFileName path)
auto capacitorNode = capacitorListNode->first_node("Capacitor");
while(capacitorNode) {
Capacitor* capacitor = new Capacitor();
-
+
if(!capacitor->OpenElement(capacitorNode, parentList)) return false;
elementList.push_back(capacitor);
capacitorList.push_back(capacitor);
@@ -888,11 +370,11 @@ bool FileHanding::OpenProject(wxFileName path)
auto indMotorNode = indMotorListNode->first_node("IndMotor");
while(indMotorNode) {
IndMotor* indMotor = new IndMotor();
-
+
if(!indMotor->OpenElement(indMotorNode, parentList)) return false;
elementList.push_back(indMotor);
indMotorList.push_back(indMotor);
-
+
indMotorNode = indMotorNode->next_sibling("IndMotor");
} //}
@@ -903,72 +385,10 @@ bool FileHanding::OpenProject(wxFileName path)
while(inductorNode) {
Inductor* inductor = new Inductor();
- auto cadPropNode = inductorNode->first_node("CADProperties");
- if(!cadPropNode) return false;
-
- auto position = cadPropNode->first_node("Position");
- double posX = XMLParser::GetNodeValueDouble(position, "X");
- double posY = XMLParser::GetNodeValueDouble(position, "Y");
- auto size = cadPropNode->first_node("Size");
- double width = XMLParser::GetNodeValueDouble(size, "Width");
- double height = XMLParser::GetNodeValueDouble(size, "Height");
- double angle = XMLParser::GetNodeValueDouble(cadPropNode, "Angle");
- auto nodePosition = cadPropNode->first_node("NodePosition");
- double nodePosX = XMLParser::GetNodeValueDouble(nodePosition, "X");
- double nodePosY = XMLParser::GetNodeValueDouble(nodePosition, "Y");
- int parentID = XMLParser::GetNodeValueInt(cadPropNode, "ParentID");
- if(parentID == -1) {
- // If the element has no parent, create a temporary one, remove and delete.
- Bus* parent = new Bus(wxPoint2DDouble(nodePosX, nodePosY));
- inductor->AddParent(parent, wxPoint2DDouble(nodePosX, nodePosY));
- inductor->StartMove(inductor->GetPosition());
- inductor->Move(wxPoint2DDouble(posX, posY));
- inductor->RemoveParent(parent);
- delete parent;
- } else {
- Bus* parent = busList[parentID];
- inductor->AddParent(parent, wxPoint2DDouble(nodePosX, nodePosY));
- inductor->StartMove(inductor->GetPosition());
- inductor->Move(wxPoint2DDouble(posX, posY));
- }
- inductor->SetWidth(width);
- inductor->SetHeight(height);
-
- int numRot = angle / inductor->GetRotationAngle();
- bool clockwise = true;
- if(numRot < 0) {
- numRot = std::abs(numRot);
- clockwise = false;
- }
- for(int i = 0; i < numRot; i++) inductor->Rotate(clockwise);
-
- auto electricalProp = inductorNode->first_node("ElectricalProperties");
- if(!electricalProp) return false;
-
- inductor->SetOnline(XMLParser::GetNodeValueInt(electricalProp, "IsOnline"));
- InductorElectricalData data = inductor->GetElectricalData();
- data.name = electricalProp->first_node("Name")->value();
- data.reactivePower = XMLParser::GetNodeValueDouble(electricalProp, "ReactivePower");
- data.reactivePowerUnit =
- (ElectricalUnit)XMLParser::GetAttributeValueInt(electricalProp, "ReactivePower", "UnitID");
-
- SwitchingData swData;
- auto switchingList = electricalProp->first_node("SwitchingList");
- if(!switchingList) return false;
- auto swNode = switchingList->first_node("Switching");
- while(swNode) {
- swData.swType.push_back((SwitchingType)XMLParser::GetNodeValueInt(swNode, "Type"));
- swData.swTime.push_back(XMLParser::GetNodeValueDouble(swNode, "Time"));
- swNode = swNode->next_sibling("Switching");
- }
- inductor->SetSwitchingData(swData);
-
- inductor->SetElectricalData(data);
-
- if(swData.swTime.size() != 0) inductor->SetDynamicEvent(true);
-
+ if(!inductor->OpenElement(inductorNode, parentList)) return false;
elementList.push_back(inductor);
inductorList.push_back(inductor);
+
inductorNode = inductorNode->next_sibling("Inductor");
} //}
@@ -979,109 +399,10 @@ bool FileHanding::OpenProject(wxFileName path)
while(lineNode) {
Line* line = new Line();
- auto cadPropNode = lineNode->first_node("CADProperties");
- if(!cadPropNode) return false;
-
- // Get nodes points
- std::vector<wxPoint2DDouble> ptsList;
- auto nodePosList = cadPropNode->first_node("NodeList");
- if(!nodePosList) return false;
- auto nodePos = nodePosList->first_node("Node");
- while(nodePos) {
- double nodePosX = XMLParser::GetNodeValueDouble(nodePos, "X");
- double nodePosY = XMLParser::GetNodeValueDouble(nodePos, "Y");
- ptsList.push_back(wxPoint2DDouble(nodePosX, nodePosY));
- nodePos = nodePos->next_sibling("Node");
- }
-
- // Get parents IDs
- auto parentIDList = cadPropNode->first_node("ParentIDList");
- if(!parentIDList) return false;
- auto parentNode = parentIDList->first_node("ParentID");
- long parentID[2] = {-1, -1};
- while(parentNode) {
- long index = 0;
- wxString(parentNode->first_attribute("ID")->value()).ToLong(&index);
- wxString(parentNode->value()).ToCLong(&parentID[index]);
- parentNode = parentNode->next_sibling("ParentID");
- }
-
- std::vector<wxPoint2DDouble> nodePtsList; // List of node points
- nodePtsList.push_back(ptsList[0]); // First point on the list
- nodePtsList.push_back(ptsList[ptsList.size() - 1]); // Last point on the list
-
- // List of dummy buses to set not connected nodes properly
- std::vector<Bus*> dummyBusList;
- for(unsigned int i = 0; i < nodePtsList.size(); ++i) {
- if(parentID[i] == -1) // No parent connected
- {
- Bus* dummyBus = new Bus(nodePtsList[i]);
- dummyBusList.push_back(dummyBus);
- line->AddParent(dummyBus, nodePtsList[i]);
- } else { // Parent connected (necessarily a bus, get from bus list)
- line->AddParent(busList[parentID[i]], nodePtsList[i]);
- }
- }
-
- // Add the others nodes (if exists)
- std::vector<wxPoint2DDouble> midPts;
- for(unsigned int i = 1; i < ptsList.size() - 1; i++) midPts.push_back(ptsList[i]);
- std::vector<wxPoint2DDouble> edgesPts = line->GetPointList();
- edgesPts.insert(edgesPts.begin() + 2, midPts.begin(), midPts.end());
- line->SetPointList(edgesPts);
-
- // Remove dummy buses
- for(auto it = dummyBusList.begin(), itEnd = dummyBusList.end(); it != itEnd; ++it) {
- line->RemoveParent(*it);
- delete *it;
- }
- dummyBusList.clear();
-
- auto electricalProp = lineNode->first_node("ElectricalProperties");
- if(!electricalProp) return false;
-
- line->SetOnline(XMLParser::GetNodeValueInt(electricalProp, "IsOnline"));
- LineElectricalData data = line->GetElectricalData();
- data.name = electricalProp->first_node("Name")->value();
- data.nominalVoltage = XMLParser::GetNodeValueDouble(electricalProp, "NominalVoltage");
- data.nominalVoltageUnit =
- (ElectricalUnit)XMLParser::GetAttributeValueInt(electricalProp, "NominalVoltage", "UnitID");
- data.nominalPower = XMLParser::GetNodeValueDouble(electricalProp, "NominalPower");
- data.nominalPowerUnit =
- (ElectricalUnit)XMLParser::GetAttributeValueInt(electricalProp, "NominalPower", "UnitID");
- data.resistance = XMLParser::GetNodeValueDouble(electricalProp, "Resistance");
- data.resistanceUnit = (ElectricalUnit)XMLParser::GetAttributeValueInt(electricalProp, "Resistance", "UnitID");
- data.indReactance = XMLParser::GetNodeValueDouble(electricalProp, "IndReactance");
- data.indReactanceUnit =
- (ElectricalUnit)XMLParser::GetAttributeValueInt(electricalProp, "IndReactance", "UnitID");
- data.capSusceptance = XMLParser::GetNodeValueDouble(electricalProp, "CapSusceptance");
- data.capSusceptanceUnit =
- (ElectricalUnit)XMLParser::GetAttributeValueInt(electricalProp, "CapSusceptance", "UnitID");
- data.lineSize = XMLParser::GetNodeValueDouble(electricalProp, "LineSize");
- data.useLinePower = XMLParser::GetNodeValueInt(electricalProp, "UseLinePower");
-
- auto fault = electricalProp->first_node("Fault");
- data.zeroResistance = XMLParser::GetNodeValueDouble(fault, "ZeroResistance");
- data.zeroIndReactance = XMLParser::GetNodeValueDouble(fault, "ZeroIndReactance");
- data.zeroCapSusceptance = XMLParser::GetNodeValueDouble(fault, "ZeroCapSusceptance");
-
- SwitchingData swData;
- auto switchingList = electricalProp->first_node("SwitchingList");
- if(!switchingList) return false;
- auto swNode = switchingList->first_node("Switching");
- while(swNode) {
- swData.swType.push_back((SwitchingType)XMLParser::GetNodeValueInt(swNode, "Type"));
- swData.swTime.push_back(XMLParser::GetNodeValueDouble(swNode, "Time"));
- swNode = swNode->next_sibling("Switching");
- }
- line->SetSwitchingData(swData);
-
- line->SetElectricalData(data);
-
- if(swData.swTime.size() != 0) line->SetDynamicEvent(true);
-
+ if(!line->OpenElement(lineNode, parentList)) return false;
elementList.push_back(line);
lineList.push_back(line);
+
lineNode = lineNode->next_sibling("Line");
} //}
@@ -1092,89 +413,10 @@ bool FileHanding::OpenProject(wxFileName path)
while(loadNode) {
Load* load = new Load();
- auto cadPropNode = loadNode->first_node("CADProperties");
- if(!cadPropNode) return false;
-
- auto position = cadPropNode->first_node("Position");
- double posX = XMLParser::GetNodeValueDouble(position, "X");
- double posY = XMLParser::GetNodeValueDouble(position, "Y");
- auto size = cadPropNode->first_node("Size");
- double width = XMLParser::GetNodeValueDouble(size, "Width");
- double height = XMLParser::GetNodeValueDouble(size, "Height");
- double angle = XMLParser::GetNodeValueDouble(cadPropNode, "Angle");
- auto nodePosition = cadPropNode->first_node("NodePosition");
- double nodePosX = XMLParser::GetNodeValueDouble(nodePosition, "X");
- double nodePosY = XMLParser::GetNodeValueDouble(nodePosition, "Y");
- int parentID = XMLParser::GetNodeValueInt(cadPropNode, "ParentID");
- if(parentID == -1) {
- // If the element has no parent, create a temporary one, remove and delete.
- Bus* parent = new Bus(wxPoint2DDouble(nodePosX, nodePosY));
- load->AddParent(parent, wxPoint2DDouble(nodePosX, nodePosY));
- load->StartMove(load->GetPosition());
- load->Move(wxPoint2DDouble(posX, posY));
- load->RemoveParent(parent);
- delete parent;
- } else {
- Bus* parent = busList[parentID];
- load->AddParent(parent, wxPoint2DDouble(nodePosX, nodePosY));
- load->StartMove(load->GetPosition());
- load->Move(wxPoint2DDouble(posX, posY));
- }
- load->SetWidth(width);
- load->SetHeight(height);
-
- int numRot = angle / load->GetRotationAngle();
- bool clockwise = true;
- if(numRot < 0) {
- numRot = std::abs(numRot);
- clockwise = false;
- }
- for(int i = 0; i < numRot; i++) load->Rotate(clockwise);
-
- auto electricalProp = loadNode->first_node("ElectricalProperties");
- if(!electricalProp) return false;
-
- load->SetOnline(XMLParser::GetNodeValueInt(electricalProp, "IsOnline"));
- LoadElectricalData data = load->GetElectricalData();
- data.name = electricalProp->first_node("Name")->value();
- data.activePower = XMLParser::GetNodeValueDouble(electricalProp, "ActivePower");
- data.activePowerUnit = (ElectricalUnit)XMLParser::GetAttributeValueInt(electricalProp, "ActivePower", "UnitID");
- data.reactivePower = XMLParser::GetNodeValueDouble(electricalProp, "ReactivePower");
- data.reactivePowerUnit =
- (ElectricalUnit)XMLParser::GetAttributeValueInt(electricalProp, "ReactivePower", "UnitID");
- data.loadType = (LoadType)XMLParser::GetNodeValueInt(electricalProp, "LoadType");
- // Stability
- auto stability = electricalProp->first_node("Stability");
- if(stability) {
- data.plotLoad = XMLParser::GetNodeValueInt(stability, "PlotLoad");
- data.useCompLoad = XMLParser::GetNodeValueInt(stability, "UseCompositeLoad");
- auto activePowerComp = stability->first_node("ActivePowerComposition");
- data.constImpedanceActive = XMLParser::GetNodeValueDouble(activePowerComp, "ConstantImpedance");
- data.constCurrentActive = XMLParser::GetNodeValueDouble(activePowerComp, "ConstantCurrent");
- data.constPowerActive = XMLParser::GetNodeValueDouble(activePowerComp, "ConstantPower");
- auto reactivePowerComp = stability->first_node("ReactivePowerComposition");
- data.constImpedanceReactive = XMLParser::GetNodeValueDouble(reactivePowerComp, "ConstantImpedance");
- data.constCurrentReactive = XMLParser::GetNodeValueDouble(reactivePowerComp, "ConstantCurrent");
- data.constPowerReactive = XMLParser::GetNodeValueDouble(reactivePowerComp, "ConstantPower");
- }
-
- SwitchingData swData;
- auto switchingList = electricalProp->first_node("SwitchingList");
- if(!switchingList) return false;
- auto swNode = switchingList->first_node("Switching");
- while(swNode) {
- swData.swType.push_back((SwitchingType)XMLParser::GetNodeValueInt(swNode, "Type"));
- swData.swTime.push_back(XMLParser::GetNodeValueDouble(swNode, "Time"));
- swNode = swNode->next_sibling("Switching");
- }
- load->SetSwitchingData(swData);
-
- load->SetElectricalData(data);
-
- if(swData.swTime.size() != 0) load->SetDynamicEvent(true);
-
+ if(!load->OpenElement(loadNode, parentList)) return false;
elementList.push_back(load);
loadList.push_back(load);
+
loadNode = loadNode->next_sibling("Load");
} //}
@@ -1182,105 +424,16 @@ bool FileHanding::OpenProject(wxFileName path)
auto syncGeneratorListNode = elementsNode->first_node("SyncGeneratorList");
if(!syncGeneratorListNode) return false;
auto syncGeneratorNode = syncGeneratorListNode->first_node("SyncGenerator");
+
while(syncGeneratorNode) {
SyncGenerator* syncGenerator = new SyncGenerator();
- auto cadPropNode = syncGeneratorNode->first_node("CADProperties");
- if(!cadPropNode) return false;
-
- auto position = cadPropNode->first_node("Position");
- double posX = XMLParser::GetNodeValueDouble(position, "X");
- double posY = XMLParser::GetNodeValueDouble(position, "Y");
- auto size = cadPropNode->first_node("Size");
- double width = XMLParser::GetNodeValueDouble(size, "Width");
- double height = XMLParser::GetNodeValueDouble(size, "Height");
- double angle = XMLParser::GetNodeValueDouble(cadPropNode, "Angle");
- auto nodePosition = cadPropNode->first_node("NodePosition");
- double nodePosX = XMLParser::GetNodeValueDouble(nodePosition, "X");
- double nodePosY = XMLParser::GetNodeValueDouble(nodePosition, "Y");
- int parentID = XMLParser::GetNodeValueInt(cadPropNode, "ParentID");
- if(parentID == -1) {
- // If the element has no parent, create a temporary one, remove and delete.
- Bus* parent = new Bus(wxPoint2DDouble(nodePosX, nodePosY));
- syncGenerator->AddParent(parent, wxPoint2DDouble(nodePosX, nodePosY));
- syncGenerator->StartMove(syncGenerator->GetPosition());
- syncGenerator->Move(wxPoint2DDouble(posX, posY));
- syncGenerator->RemoveParent(parent);
- delete parent;
- } else {
- Bus* parent = busList[parentID];
- syncGenerator->AddParent(parent, wxPoint2DDouble(nodePosX, nodePosY));
- syncGenerator->StartMove(syncGenerator->GetPosition());
- syncGenerator->Move(wxPoint2DDouble(posX, posY));
- }
- syncGenerator->SetWidth(width);
- syncGenerator->SetHeight(height);
-
- int numRot = angle / syncGenerator->GetRotationAngle();
- bool clockwise = true;
- if(numRot < 0) {
- numRot = std::abs(numRot);
- clockwise = false;
- }
- for(int i = 0; i < numRot; i++) syncGenerator->Rotate(clockwise);
+ if(!syncGenerator->OpenElement(syncGeneratorNode, parentList)) return false;
+ // Open controls.
+ auto data = syncGenerator->GetElectricalData();
auto electricalProp = syncGeneratorNode->first_node("ElectricalProperties");
- if(!electricalProp) return false;
-
- syncGenerator->SetOnline(XMLParser::GetNodeValueInt(electricalProp, "IsOnline"));
- SyncGeneratorElectricalData data = syncGenerator->GetElectricalData();
- data.name = electricalProp->first_node("Name")->value();
- data.nominalPower = XMLParser::GetNodeValueDouble(electricalProp, "NominalPower");
- data.nominalPowerUnit =
- (ElectricalUnit)XMLParser::GetAttributeValueInt(electricalProp, "NominalPower", "UnitID");
- data.nominalVoltage = XMLParser::GetNodeValueDouble(electricalProp, "NominalVoltage");
- data.nominalVoltageUnit =
- (ElectricalUnit)XMLParser::GetAttributeValueInt(electricalProp, "NominalVoltage", "UnitID");
- data.activePower = XMLParser::GetNodeValueDouble(electricalProp, "ActivePower");
- data.activePowerUnit = (ElectricalUnit)XMLParser::GetAttributeValueInt(electricalProp, "ActivePower", "UnitID");
- data.reactivePower = XMLParser::GetNodeValueDouble(electricalProp, "ReactivePower");
- data.reactivePowerUnit =
- (ElectricalUnit)XMLParser::GetAttributeValueInt(electricalProp, "ReactivePower", "UnitID");
- data.haveMaxReactive = XMLParser::GetNodeValueInt(electricalProp, "HaveMaxReactive");
- data.maxReactive = XMLParser::GetNodeValueDouble(electricalProp, "MaxReactive");
- data.maxReactiveUnit = (ElectricalUnit)XMLParser::GetAttributeValueInt(electricalProp, "MaxReactive", "UnitID");
- data.haveMinReactive = XMLParser::GetNodeValueInt(electricalProp, "HaveMinReactive");
- data.minReactive = XMLParser::GetNodeValueDouble(electricalProp, "MinReactive");
- data.minReactiveUnit = (ElectricalUnit)XMLParser::GetAttributeValueInt(electricalProp, "MinReactive", "UnitID");
- data.useMachineBase = XMLParser::GetNodeValueInt(electricalProp, "UseMachineBase");
-
- auto fault = electricalProp->first_node("Fault");
- if(!fault) return false;
- data.positiveResistance = XMLParser::GetNodeValueDouble(fault, "PositiveResistance");
- data.positiveReactance = XMLParser::GetNodeValueDouble(fault, "PositiveReactance");
- data.negativeResistance = XMLParser::GetNodeValueDouble(fault, "NegativeResistance");
- data.negativeReactance = XMLParser::GetNodeValueDouble(fault, "NegativeReactance");
- data.zeroResistance = XMLParser::GetNodeValueDouble(fault, "ZeroResistance");
- data.zeroReactance = XMLParser::GetNodeValueDouble(fault, "ZeroReactance");
- data.groundResistance = XMLParser::GetNodeValueDouble(fault, "GroundResistance");
- data.groundReactance = XMLParser::GetNodeValueDouble(fault, "GroundReactance");
- data.groundNeutral = XMLParser::GetNodeValueInt(fault, "GroundNeutral");
-
auto stability = electricalProp->first_node("Stability");
- if(!stability) return false;
- data.plotSyncMachine = XMLParser::GetNodeValueInt(stability, "PlotSyncMachine");
- data.inertia = XMLParser::GetNodeValueDouble(stability, "Inertia");
- data.damping = XMLParser::GetNodeValueDouble(stability, "Damping");
- data.useAVR = XMLParser::GetNodeValueInt(stability, "UseAVR");
- data.useSpeedGovernor = XMLParser::GetNodeValueInt(stability, "UseSpeedGovernor");
- data.armResistance = XMLParser::GetNodeValueDouble(stability, "ArmResistance");
- data.potierReactance = XMLParser::GetNodeValueDouble(stability, "PotierReactance");
- data.satFactor = XMLParser::GetNodeValueDouble(stability, "SatFactor");
- data.syncXd = XMLParser::GetNodeValueDouble(stability, "SyncXd");
- data.syncXq = XMLParser::GetNodeValueDouble(stability, "SyncXq");
- data.transXd = XMLParser::GetNodeValueDouble(stability, "TransXd");
- data.transXq = XMLParser::GetNodeValueDouble(stability, "TransXq");
- data.transTd0 = XMLParser::GetNodeValueDouble(stability, "TransTd0");
- data.transTq0 = XMLParser::GetNodeValueDouble(stability, "TransTq0");
- data.subXd = XMLParser::GetNodeValueDouble(stability, "SubXd");
- data.subXq = XMLParser::GetNodeValueDouble(stability, "SubXq");
- data.subTd0 = XMLParser::GetNodeValueDouble(stability, "SubTd0");
- data.subTq0 = XMLParser::GetNodeValueDouble(stability, "SubTq0");
auto avr = stability->first_node("AVR");
if(!avr) return false;
@@ -1290,21 +443,8 @@ bool FileHanding::OpenProject(wxFileName path)
if(!speedGov) return false;
if(!OpenControlElements(doc, speedGov, data.speedGov)) return false;
- SwitchingData swData;
- auto switchingList = electricalProp->first_node("SwitchingList");
- if(!switchingList) return false;
- auto swNode = switchingList->first_node("Switching");
- while(swNode) {
- swData.swType.push_back((SwitchingType)XMLParser::GetNodeValueInt(swNode, "Type"));
- swData.swTime.push_back(XMLParser::GetNodeValueDouble(swNode, "Time"));
- swNode = swNode->next_sibling("Switching");
- }
- syncGenerator->SetSwitchingData(swData);
-
syncGenerator->SetElectricalData(data);
- if(swData.swTime.size() != 0) syncGenerator->SetDynamicEvent(true);
-
elementList.push_back(syncGenerator);
syncGeneratorList.push_back(syncGenerator);
syncGeneratorNode = syncGeneratorNode->next_sibling("SyncGenerator");
@@ -1317,96 +457,10 @@ bool FileHanding::OpenProject(wxFileName path)
while(syncMotorNode) {
SyncMotor* syncMotor = new SyncMotor();
- auto cadPropNode = syncMotorNode->first_node("CADProperties");
- if(!cadPropNode) return false;
-
- auto position = cadPropNode->first_node("Position");
- double posX = XMLParser::GetNodeValueDouble(position, "X");
- double posY = XMLParser::GetNodeValueDouble(position, "Y");
- auto size = cadPropNode->first_node("Size");
- double width = XMLParser::GetNodeValueDouble(size, "Width");
- double height = XMLParser::GetNodeValueDouble(size, "Height");
- double angle = XMLParser::GetNodeValueDouble(cadPropNode, "Angle");
- auto nodePosition = cadPropNode->first_node("NodePosition");
- double nodePosX = XMLParser::GetNodeValueDouble(nodePosition, "X");
- double nodePosY = XMLParser::GetNodeValueDouble(nodePosition, "Y");
- int parentID = XMLParser::GetNodeValueInt(cadPropNode, "ParentID");
- if(parentID == -1) {
- // If the element has no parent, create a temporary one, remove and delete.
- Bus* parent = new Bus(wxPoint2DDouble(nodePosX, nodePosY));
- syncMotor->AddParent(parent, wxPoint2DDouble(nodePosX, nodePosY));
- syncMotor->StartMove(syncMotor->GetPosition());
- syncMotor->Move(wxPoint2DDouble(posX, posY));
- syncMotor->RemoveParent(parent);
- delete parent;
- } else {
- Bus* parent = busList[parentID];
- syncMotor->AddParent(parent, wxPoint2DDouble(nodePosX, nodePosY));
- syncMotor->StartMove(syncMotor->GetPosition());
- syncMotor->Move(wxPoint2DDouble(posX, posY));
- }
- syncMotor->SetWidth(width);
- syncMotor->SetHeight(height);
-
- int numRot = angle / syncMotor->GetRotationAngle();
- bool clockwise = true;
- if(numRot < 0) {
- numRot = std::abs(numRot);
- clockwise = false;
- }
- for(int i = 0; i < numRot; i++) syncMotor->Rotate(clockwise);
-
- auto electricalProp = syncMotorNode->first_node("ElectricalProperties");
- if(!electricalProp) return false;
-
- syncMotor->SetOnline(XMLParser::GetNodeValueInt(electricalProp, "IsOnline"));
- SyncMotorElectricalData data = syncMotor->GetElectricalData();
- data.name = electricalProp->first_node("Name")->value();
- data.nominalPower = XMLParser::GetNodeValueDouble(electricalProp, "NominalPower");
- data.nominalPowerUnit =
- (ElectricalUnit)XMLParser::GetAttributeValueInt(electricalProp, "NominalPower", "UnitID");
- // data.nominalVoltage = XMLParser::GetNodeValueDouble(electricalProp, "NominalVoltage");
- // data.nominalVoltageUnit = (ElectricalUnit)XMLParser::GetAttributeValueInt(electricalProp, "NominalVoltage",
- // "UnitID");
- data.activePower = XMLParser::GetNodeValueDouble(electricalProp, "ActivePower");
- data.activePowerUnit = (ElectricalUnit)XMLParser::GetAttributeValueInt(electricalProp, "ActivePower", "UnitID");
- data.reactivePower = XMLParser::GetNodeValueDouble(electricalProp, "ReactivePower");
- data.reactivePowerUnit =
- (ElectricalUnit)XMLParser::GetAttributeValueInt(electricalProp, "ReactivePower", "UnitID");
- data.haveMaxReactive = XMLParser::GetNodeValueInt(electricalProp, "HaveMaxReactive");
- data.maxReactive = XMLParser::GetNodeValueDouble(electricalProp, "MaxReactive");
- data.maxReactiveUnit = (ElectricalUnit)XMLParser::GetAttributeValueInt(electricalProp, "MaxReactive", "UnitID");
- data.haveMinReactive = XMLParser::GetNodeValueInt(electricalProp, "HaveMinReactive");
- data.minReactive = XMLParser::GetNodeValueDouble(electricalProp, "MinReactive");
- data.minReactiveUnit = (ElectricalUnit)XMLParser::GetAttributeValueInt(electricalProp, "MinReactive", "UnitID");
- data.useMachineBase = XMLParser::GetNodeValueInt(electricalProp, "UseMachineBase");
-
- auto fault = electricalProp->first_node("Fault");
- if(!fault) return false;
- data.positiveResistance = XMLParser::GetNodeValueDouble(fault, "PositiveResistance");
- data.positiveReactance = XMLParser::GetNodeValueDouble(fault, "PositiveReactance");
- data.negativeResistance = XMLParser::GetNodeValueDouble(fault, "NegativeResistance");
- data.negativeReactance = XMLParser::GetNodeValueDouble(fault, "NegativeReactance");
- data.zeroResistance = XMLParser::GetNodeValueDouble(fault, "ZeroResistance");
- data.zeroReactance = XMLParser::GetNodeValueDouble(fault, "ZeroReactance");
- data.groundResistance = XMLParser::GetNodeValueDouble(fault, "GroundResistance");
- data.groundReactance = XMLParser::GetNodeValueDouble(fault, "GroundReactance");
- data.groundNeutral = XMLParser::GetNodeValueInt(fault, "GroundNeutral");
-
- /*SwitchingData swData;
- auto switchingList = electricalProp->first_node("SwitchingList");
- if(!switchingList) return false;
- auto swNode = switchingList->first_node("Switching");
- while(swNode) {
- swData.swType.push_back((SwitchingType)XMLParser::GetNodeValueInt(swNode, "Type"));
- swData.swTime.push_back(XMLParser::GetNodeValueDouble(swNode, "Time"));
- swNode = swNode->next_sibling("Switching");
- }
- syncMotor->SetSwitchingData(swData);*/
-
- syncMotor->SetElectricalData(data);
+ if(!syncMotor->OpenElement(syncMotorNode, parentList)) return false;
elementList.push_back(syncMotor);
syncMotorList.push_back(syncMotor);
+
syncMotorNode = syncMotorNode->next_sibling("SyncMotor");
} //}
@@ -1417,131 +471,10 @@ bool FileHanding::OpenProject(wxFileName path)
while(transfomerNode) {
Transformer* transformer = new Transformer();
- auto cadPropNode = transfomerNode->first_node("CADProperties");
- if(!cadPropNode) return false;
-
- auto position = cadPropNode->first_node("Position");
- double posX = XMLParser::GetNodeValueDouble(position, "X");
- double posY = XMLParser::GetNodeValueDouble(position, "Y");
- auto size = cadPropNode->first_node("Size");
- double width = XMLParser::GetNodeValueDouble(size, "Width");
- double height = XMLParser::GetNodeValueDouble(size, "Height");
- double angle = XMLParser::GetNodeValueDouble(cadPropNode, "Angle");
-
- // Get nodes points
- std::vector<wxPoint2DDouble> ptsList;
- auto nodePosList = cadPropNode->first_node("NodeList");
- if(!nodePosList) return false;
- auto nodePos = nodePosList->first_node("Node");
- while(nodePos) {
- double nodePosX = XMLParser::GetNodeValueDouble(nodePos, "X");
- double nodePosY = XMLParser::GetNodeValueDouble(nodePos, "Y");
- ptsList.push_back(wxPoint2DDouble(nodePosX, nodePosY));
- nodePos = nodePos->next_sibling("Node");
- }
-
- // Get parents IDs
- auto parentIDList = cadPropNode->first_node("ParentIDList");
- if(!parentIDList) return false;
- auto parentNode = parentIDList->first_node("ParentID");
- long parentID[2] = {-1, -1};
- while(parentNode) {
- long index = 0;
- wxString(parentNode->first_attribute("ID")->value()).ToLong(&index);
- wxString(parentNode->value()).ToCLong(&parentID[index]);
- parentNode = parentNode->next_sibling("ParentID");
- }
-
- // Set parents (if have)
- Bus *parent1, *parent2;
- if(parentID[0] == -1) {
- parent1 = new Bus(ptsList[0]);
- transformer->AddParent(parent1, ptsList[0]);
- } else {
- parent1 = busList[parentID[0]];
- transformer->AddParent(parent1, ptsList[0]);
- }
- if(parentID[1] == -1) {
- parent2 = new Bus(ptsList[ptsList.size() - 1]);
- transformer->AddParent(parent2, ptsList[ptsList.size() - 1]);
- } else {
- parent2 = busList[parentID[1]];
- transformer->AddParent(parent2, ptsList[ptsList.size() - 1]);
- }
-
- transformer->StartMove(transformer->GetPosition());
- transformer->Move(wxPoint2DDouble(posX, posY));
-
- if(parentID[0] == -1) {
- transformer->RemoveParent(parent1);
- delete parent1;
- }
- if(parentID[1] == -1) {
- transformer->RemoveParent(parent2);
- delete parent2;
- }
-
- transformer->SetWidth(width);
- transformer->SetHeight(height);
-
- int numRot = angle / transformer->GetRotationAngle();
- bool clockwise = true;
- if(numRot < 0) {
- numRot = std::abs(numRot);
- clockwise = false;
- }
- for(int i = 0; i < numRot; i++) transformer->Rotate(clockwise);
-
- auto electricalProp = transfomerNode->first_node("ElectricalProperties");
- if(!electricalProp) return false;
-
- transformer->SetOnline(XMLParser::GetNodeValueInt(electricalProp, "IsOnline"));
- TransformerElectricalData data = transformer->GetElectricalData();
- data.name = electricalProp->first_node("Name")->value();
- data.primaryNominalVoltage = XMLParser::GetNodeValueDouble(electricalProp, "PrimaryNominalVoltage");
- data.primaryNominalVoltageUnit =
- (ElectricalUnit)XMLParser::GetAttributeValueInt(electricalProp, "PrimaryNominalVoltage", "UnitID");
- data.secondaryNominalVoltage = XMLParser::GetNodeValueDouble(electricalProp, "SecondaryNominalVoltage");
- data.secondaryNominalVoltageUnit =
- (ElectricalUnit)XMLParser::GetAttributeValueInt(electricalProp, "SecondaryNominalVoltage", "UnitID");
- data.nominalPower = XMLParser::GetNodeValueDouble(electricalProp, "NominalPower");
- data.nominalPowerUnit =
- (ElectricalUnit)XMLParser::GetAttributeValueInt(electricalProp, "NominalPower", "UnitID");
- data.resistance = XMLParser::GetNodeValueDouble(electricalProp, "Resistance");
- data.resistanceUnit = (ElectricalUnit)XMLParser::GetAttributeValueInt(electricalProp, "Resistance", "UnitID");
- data.indReactance = XMLParser::GetNodeValueDouble(electricalProp, "IndReactance");
- data.indReactanceUnit =
- (ElectricalUnit)XMLParser::GetAttributeValueInt(electricalProp, "IndReactance", "UnitID");
- data.connection = (TransformerConnection)XMLParser::GetNodeValueInt(electricalProp, "Connection");
- data.turnsRatio = XMLParser::GetNodeValueDouble(electricalProp, "TurnsRatio");
- data.phaseShift = XMLParser::GetNodeValueDouble(electricalProp, "PhaseShift");
- data.useTransformerPower = XMLParser::GetNodeValueInt(electricalProp, "UseTransfomerPower");
-
- auto fault = electricalProp->first_node("Fault");
- data.zeroResistance = XMLParser::GetNodeValueDouble(fault, "ZeroResistance");
- data.zeroIndReactance = XMLParser::GetNodeValueDouble(fault, "ZeroIndReactance");
- data.primaryGrndResistance = XMLParser::GetNodeValueDouble(fault, "PrimaryGrndResistance");
- data.primaryGrndReactance = XMLParser::GetNodeValueDouble(fault, "PrimaryGrndReactance");
- data.secondaryGrndResistance = XMLParser::GetNodeValueDouble(fault, "SecondaryGrndResistance");
- data.secondaryGrndReactance = XMLParser::GetNodeValueDouble(fault, "SecondaryGrndReactance");
-
- SwitchingData swData;
- auto switchingList = electricalProp->first_node("SwitchingList");
- if(!switchingList) return false;
- auto swNode = switchingList->first_node("Switching");
- while(swNode) {
- swData.swType.push_back((SwitchingType)XMLParser::GetNodeValueInt(swNode, "Type"));
- swData.swTime.push_back(XMLParser::GetNodeValueDouble(swNode, "Time"));
- swNode = swNode->next_sibling("Switching");
- }
- transformer->SetSwitchingData(swData);
-
- transformer->SetElectricaData(data);
-
- if(swData.swTime.size() != 0) transformer->SetDynamicEvent(true);
-
+ if(!transformer->OpenElement(transfomerNode, parentList)) return false;
elementList.push_back(transformer);
transformerList.push_back(transformer);
+
transfomerNode = transfomerNode->next_sibling("Transfomer");
} //}
@@ -1552,32 +485,10 @@ bool FileHanding::OpenProject(wxFileName path)
if(!textListNode) return false;
auto textNode = textListNode->first_node("Text");
while(textNode) {
- auto cadPropNode = textNode->first_node("CADProperties");
- if(!cadPropNode) return false;
-
- auto position = cadPropNode->first_node("Position");
- double posX = XMLParser::GetNodeValueDouble(position, "X");
- double posY = XMLParser::GetNodeValueDouble(position, "Y");
- auto size = cadPropNode->first_node("Size");
- double width = XMLParser::GetNodeValueDouble(size, "Width");
- double height = XMLParser::GetNodeValueDouble(size, "Height");
- double angle = XMLParser::GetNodeValueDouble(cadPropNode, "Angle");
-
- Text* text = new Text(wxPoint2DDouble(posX, posY));
+ Text* text = new Text();
- text->SetWidth(width);
- text->SetHeight(height);
+ if(!text->OpenElement(textNode)) return true;
- auto textProperties = textNode->first_node("TextProperties");
- if(!textProperties) return false;
-
- text->SetElementType((ElementType)XMLParser::GetNodeValueDouble(textProperties, "ElementType"));
- text->SetDataType((DataType)XMLParser::GetNodeValueDouble(textProperties, "DataType"));
- text->SetUnit((ElectricalUnit)XMLParser::GetNodeValueDouble(textProperties, "DataUnit"));
- text->SetDirection(XMLParser::GetNodeValueDouble(textProperties, "Direction"));
- text->SetDecimalPlaces(XMLParser::GetNodeValueDouble(textProperties, "DecimalPlaces"));
-
- text->SetElementNumber(XMLParser::GetNodeValueInt(textProperties, "ElementNumber"));
switch(text->GetElementType()) {
case TYPE_NONE:
break;
@@ -1619,14 +530,6 @@ bool FileHanding::OpenProject(wxFileName path)
} break;
}
- int numRot = angle / text->GetRotationAngle();
- bool clockwise = true;
- if(numRot < 0) {
- numRot = std::abs(numRot);
- clockwise = false;
- }
- for(int i = 0; i < numRot; i++) text->Rotate(clockwise);
-
textList.push_back(text);
textNode = textNode->next_sibling("Text");
} //}
diff --git a/Project/Gain.cpp b/Project/Gain.cpp
index fd82fba..2977f1f 100644
--- a/Project/Gain.cpp
+++ b/Project/Gain.cpp
@@ -200,7 +200,7 @@ bool Gain::UpdateText()
return true;
}
-void Gain::SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode)
+rapidxml::xml_node<>* Gain::SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode)
{
auto elementNode = XMLParser::AppendNode(doc, elementListNode, "Gain");
XMLParser::SetNodeAttribute(doc, elementNode, "ID", m_elementID);
@@ -211,6 +211,8 @@ void Gain::SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elem
// Element properties
auto value = XMLParser::AppendNode(doc, elementNode, "Value");
XMLParser::SetNodeValue(doc, value, m_value);
+
+ return elementNode;
}
bool Gain::OpenElement(rapidxml::xml_node<>* elementNode)
diff --git a/Project/Gain.h b/Project/Gain.h
index c5ed6bd..3c2e66b 100644
--- a/Project/Gain.h
+++ b/Project/Gain.h
@@ -58,7 +58,7 @@ class Gain : public ControlElement
*/
virtual bool Solve(double* input, double timeStep);
- virtual void SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode);
+ virtual rapidxml::xml_node<>* SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode);
virtual bool OpenElement(rapidxml::xml_node<>* elementNode);
virtual Element* GetCopy();
diff --git a/Project/IOControl.cpp b/Project/IOControl.cpp
index f40232a..114e8bf 100644
--- a/Project/IOControl.cpp
+++ b/Project/IOControl.cpp
@@ -271,7 +271,7 @@ bool IOControl::UpdateText()
return true;
}
-void IOControl::SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode)
+rapidxml::xml_node<>* IOControl::SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode)
{
auto elementNode = XMLParser::AppendNode(doc, elementListNode, "IO");
XMLParser::SetNodeAttribute(doc, elementNode, "ID", m_elementID);
@@ -284,6 +284,8 @@ void IOControl::SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>*
XMLParser::SetNodeValue(doc, value, m_value);
auto ioFlags = XMLParser::AppendNode(doc, elementNode, "IOFlags");
XMLParser::SetNodeValue(doc, ioFlags, m_ioFlags);
+
+ return elementNode;
}
bool IOControl::OpenElement(rapidxml::xml_node<>* elementNode)
diff --git a/Project/IOControl.h b/Project/IOControl.h
index c580c52..0af3429 100644
--- a/Project/IOControl.h
+++ b/Project/IOControl.h
@@ -66,7 +66,7 @@ class IOControl : public ControlElement
virtual int GetIOFlags() const { return m_ioFlags; }
virtual Node::NodeType GetType() { return m_ioNodeType; }
- virtual void SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode);
+ virtual rapidxml::xml_node<>* SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode);
virtual bool OpenElement(rapidxml::xml_node<>* elementNode);
virtual Element* GetCopy();
diff --git a/Project/IndMotor.cpp b/Project/IndMotor.cpp
index 73c9c4f..e8008dd 100644
--- a/Project/IndMotor.cpp
+++ b/Project/IndMotor.cpp
@@ -143,7 +143,7 @@ wxString IndMotor::GetTipText() const
return tipText;
}
-void IndMotor::SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode)
+rapidxml::xml_node<>* IndMotor::SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode)
{
auto elementNode = XMLParser::AppendNode(doc, elementListNode, "IndMotor");
XMLParser::SetNodeAttribute(doc, elementNode, "ID", m_elementID);
@@ -162,6 +162,8 @@ void IndMotor::SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>*
auto reactivePower = XMLParser::AppendNode(doc, electricalProp, "ReactivePower");
XMLParser::SetNodeValue(doc, reactivePower, m_electricalData.reactivePower);
XMLParser::SetNodeAttribute(doc, reactivePower, "UnitID", m_electricalData.reactivePowerUnit);
+
+ return elementNode;
}
bool IndMotor::OpenElement(rapidxml::xml_node<>* elementNode, std::vector<Element*> parentList)
diff --git a/Project/IndMotor.h b/Project/IndMotor.h
index bd2c572..c210279 100644
--- a/Project/IndMotor.h
+++ b/Project/IndMotor.h
@@ -53,7 +53,7 @@ class IndMotor : public Machines
virtual IndMotorElectricalData GetPUElectricalData(double systemPowerBase);
virtual void SetElectricalData(IndMotorElectricalData electricalData) { m_electricalData = electricalData; }
- virtual void SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode);
+ virtual rapidxml::xml_node<>* SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode);
virtual bool OpenElement(rapidxml::xml_node<>* elementNode, std::vector<Element*> parentList);
protected:
diff --git a/Project/Inductor.cpp b/Project/Inductor.cpp
index c3fe3cd..9bfd599 100644
--- a/Project/Inductor.cpp
+++ b/Project/Inductor.cpp
@@ -15,8 +15,8 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
-#include "ReactiveShuntElementForm.h"
#include "Inductor.h"
+#include "ReactiveShuntElementForm.h"
Inductor::Inductor() : Shunt() {}
Inductor::Inductor(wxString name) : Shunt() { m_electricalData.name = name; }
@@ -211,3 +211,44 @@ wxString Inductor::GetTipText() const
return tipText;
}
+
+rapidxml::xml_node<>* Inductor::SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode)
+{
+ auto elementNode = XMLParser::AppendNode(doc, elementListNode, "Inductor");
+ XMLParser::SetNodeAttribute(doc, elementNode, "ID", m_elementID);
+
+ SaveCADProperties(doc, elementNode);
+
+ auto electricalProp = XMLParser::AppendNode(doc, elementNode, "ElectricalProperties");
+ auto isOnline = XMLParser::AppendNode(doc, electricalProp, "IsOnline");
+ XMLParser::SetNodeValue(doc, isOnline, m_online);
+ auto name = XMLParser::AppendNode(doc, electricalProp, "Name");
+ XMLParser::SetNodeValue(doc, name, m_electricalData.name);
+ auto reactivePower = XMLParser::AppendNode(doc, electricalProp, "ReactivePower");
+ XMLParser::SetNodeValue(doc, reactivePower, m_electricalData.reactivePower);
+ XMLParser::SetNodeAttribute(doc, reactivePower, "UnitID", m_electricalData.reactivePowerUnit);
+
+ SaveSwitchingData(doc, electricalProp);
+
+ return elementNode;
+}
+
+bool Inductor::OpenElement(rapidxml::xml_node<>* elementNode, std::vector<Element*> parentList)
+{
+ if(!OpenCADProperties(elementNode, parentList)) return false;
+
+ auto electricalProp = elementNode->first_node("ElectricalProperties");
+ if(!electricalProp) return false;
+
+ SetOnline(XMLParser::GetNodeValueInt(electricalProp, "IsOnline"));
+ m_electricalData.name = electricalProp->first_node("Name")->value();
+ m_electricalData.reactivePower = XMLParser::GetNodeValueDouble(electricalProp, "ReactivePower");
+ m_electricalData.reactivePowerUnit =
+ static_cast<ElectricalUnit>(XMLParser::GetAttributeValueInt(electricalProp, "ReactivePower", "UnitID"));
+
+ if(!OpenSwitchingData(electricalProp)) return false;
+ if(m_swData.swTime.size() != 0) SetDynamicEvent(true);
+
+ m_inserted = true;
+ return true;
+}
diff --git a/Project/Inductor.h b/Project/Inductor.h
index ffd65da..0362dcf 100644
--- a/Project/Inductor.h
+++ b/Project/Inductor.h
@@ -54,6 +54,10 @@ class Inductor : public Shunt
virtual InductorElectricalData GetElectricalData() { return m_electricalData; }
virtual InductorElectricalData GetPUElectricalData(double systemPowerBase);
virtual void SetElectricalData(InductorElectricalData electricalData) { m_electricalData = electricalData; }
+
+ virtual rapidxml::xml_node<>* SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode);
+ virtual bool OpenElement(rapidxml::xml_node<>* elementNode, std::vector<Element*> parentList);
+
protected:
InductorElectricalData m_electricalData;
};
diff --git a/Project/Limiter.cpp b/Project/Limiter.cpp
index 7769cb2..74fbf3d 100644
--- a/Project/Limiter.cpp
+++ b/Project/Limiter.cpp
@@ -127,7 +127,7 @@ Element* Limiter::GetCopy()
return copy;
}
-void Limiter::SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode)
+rapidxml::xml_node<>* Limiter::SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode)
{
auto elementNode = XMLParser::AppendNode(doc, elementListNode, "Limiter");
XMLParser::SetNodeAttribute(doc, elementNode, "ID", m_elementID);
@@ -140,6 +140,8 @@ void Limiter::SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* e
XMLParser::SetNodeValue(doc, upLimit, m_upLimit);
auto lowLimit = XMLParser::AppendNode(doc, elementNode, "LowerLimit");
XMLParser::SetNodeValue(doc, lowLimit, m_lowLimit);
+
+ return elementNode;
}
bool Limiter::OpenElement(rapidxml::xml_node<>* elementNode)
diff --git a/Project/Limiter.h b/Project/Limiter.h
index e51c14e..5dab4c1 100644
--- a/Project/Limiter.h
+++ b/Project/Limiter.h
@@ -49,7 +49,7 @@ class Limiter : public ControlElement
void SetUpLimit(double upLimit) { m_upLimit = upLimit; }
void SetLowLimit(double lowLimit) { m_lowLimit = lowLimit; }
- virtual void SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode);
+ virtual rapidxml::xml_node<>* SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode);
virtual bool OpenElement(rapidxml::xml_node<>* elementNode);
virtual Element* GetCopy();
diff --git a/Project/Line.cpp b/Project/Line.cpp
index eac48c2..d143355 100644
--- a/Project/Line.cpp
+++ b/Project/Line.cpp
@@ -20,27 +20,21 @@
Line::Line() : Branch()
{
for(int i = 0; i < 2; i++) {
- for(int j = 0; j < 3; j++) {
- m_electricalData.faultCurrent[i][j] = std::complex<double>(0.0, 0.0);
- }
+ for(int j = 0; j < 3; j++) { m_electricalData.faultCurrent[i][j] = std::complex<double>(0.0, 0.0); }
}
}
Line::Line(wxString name) : Branch()
{
for(int i = 0; i < 2; i++) {
- for(int j = 0; j < 3; j++) {
- m_electricalData.faultCurrent[i][j] = std::complex<double>(0.0, 0.0);
- }
+ for(int j = 0; j < 3; j++) { m_electricalData.faultCurrent[i][j] = std::complex<double>(0.0, 0.0); }
}
m_electricalData.name = name;
}
Line::~Line() {}
bool Line::Contains(wxPoint2DDouble position) const
{
- if(PointToLineDistance(position) < 5.0) {
- return true;
- }
+ if(PointToLineDistance(position) < 5.0) { return true; }
return false;
}
@@ -59,9 +53,7 @@ void Line::Draw(wxPoint2DDouble translation, double scale) const
std::vector<wxPoint2DDouble> pointList = m_pointList;
if(!m_inserted && pointList.size() > 0) {
wxPoint2DDouble secondPoint = m_position;
- if(pointList.size() > 2) {
- secondPoint = pointList[2];
- }
+ if(pointList.size() > 2) { secondPoint = pointList[2]; }
pointList[1] = GetSwitchPoint(m_parentList[0], pointList[0], secondPoint);
pointList.push_back(m_position);
}
@@ -75,9 +67,7 @@ void Line::Draw(wxPoint2DDouble translation, double scale) const
// Draw nodes selection.
if(pointList.size() > 0) {
DrawCircle(pointList[0], 5.0 + m_borderSize / scale, 10, GL_POLYGON);
- if(m_inserted) {
- DrawCircle(pointList[pointList.size() - 1], 5.0 + m_borderSize / scale, 10, GL_POLYGON);
- }
+ if(m_inserted) { DrawCircle(pointList[pointList.size() - 1], 5.0 + m_borderSize / scale, 10, GL_POLYGON); }
}
}
@@ -95,9 +85,7 @@ void Line::Draw(wxPoint2DDouble translation, double scale) const
if(pointList.size() > 0) {
glColor4dv(elementColour.GetRGBA());
DrawCircle(pointList[0], 5.0, 10, GL_POLYGON);
- if(m_inserted) {
- DrawCircle(pointList[pointList.size() - 1], 5.0, 10, GL_POLYGON);
- }
+ if(m_inserted) { DrawCircle(pointList[pointList.size() - 1], 5.0, 10, GL_POLYGON); }
}
// Draw pickboxes (Layer 3).
@@ -163,8 +151,9 @@ bool Line::AddParent(Element* parent, wxPoint2DDouble position)
Bus* parentBus = static_cast<Bus*>(parent);
if(m_electricalData.nominalVoltage != parentBus->GetElectricalData().nominalVoltage ||
m_electricalData.nominalVoltageUnit != parentBus->GetElectricalData().nominalVoltageUnit) {
- wxMessageDialog msgDialog(NULL, _("Unable to connect two buses with different nominal voltages.\n"
- "Use a transformer or edit the bus properties."),
+ wxMessageDialog msgDialog(NULL,
+ _("Unable to connect two buses with different nominal voltages.\n"
+ "Use a transformer or edit the bus properties."),
_("Error"), wxOK | wxCENTRE | wxICON_ERROR);
msgDialog.ShowModal();
return false;
@@ -179,9 +168,7 @@ bool Line::AddParent(Element* parent, wxPoint2DDouble position)
// Set first switch point.
wxPoint2DDouble secondPoint = parentPt;
- if(m_pointList.size() > 2) {
- secondPoint = m_pointList[2];
- }
+ if(m_pointList.size() > 2) { secondPoint = m_pointList[2]; }
m_pointList[1] = GetSwitchPoint(m_parentList[0], m_pointList[0], secondPoint);
// Set the second switch point.
@@ -233,9 +220,7 @@ bool Line::PickboxContains(wxPoint2DDouble position)
void Line::AddPoint(wxPoint2DDouble point)
{
- if(m_parentList.size() != 0) {
- m_pointList.push_back(point);
- }
+ if(m_parentList.size() != 0) { m_pointList.push_back(point); }
}
void Line::StartMove(wxPoint2DDouble position)
@@ -294,15 +279,18 @@ bool Line::GetContextMenu(wxMenu& menu)
menu.Append(ID_EDIT_ELEMENT, _("Edit line"));
if(m_activePickboxID == ID_PB_NONE) {
wxMenuItem* addNodeItem = new wxMenuItem(&menu, ID_LINE_ADD_NODE, _("Insert node"));
- addNodeItem->SetBitmap(wxImage(exePath + wxFileName::DirName("\\..\\data\\images\\menu\\addNode16.png", wxPATH_WIN).GetPath()));
+ addNodeItem->SetBitmap(
+ wxImage(exePath + wxFileName::DirName("\\..\\data\\images\\menu\\addNode16.png", wxPATH_WIN).GetPath()));
menu.Append(addNodeItem);
} else {
wxMenuItem* addNodeItem = new wxMenuItem(&menu, ID_LINE_REMOVE_NODE, _("Remove node"));
- addNodeItem->SetBitmap(wxImage(exePath + wxFileName::DirName("\\..\\data\\images\\menu\\removeNode16.png", wxPATH_WIN).GetPath()));
+ addNodeItem->SetBitmap(
+ wxImage(exePath + wxFileName::DirName("\\..\\data\\images\\menu\\removeNode16.png", wxPATH_WIN).GetPath()));
menu.Append(addNodeItem);
}
wxMenuItem* deleteItem = new wxMenuItem(&menu, ID_DELETE, _("Delete"));
- deleteItem->SetBitmap(wxImage(exePath + wxFileName::DirName("\\..\\data\\images\\menu\\delete16.png", wxPATH_WIN).GetPath()));
+ deleteItem->SetBitmap(
+ wxImage(exePath + wxFileName::DirName("\\..\\data\\images\\menu\\delete16.png", wxPATH_WIN).GetPath()));
menu.Append(deleteItem);
return true;
}
@@ -392,8 +380,9 @@ bool Line::SetNodeParent(Element* parent)
m_electricalData.nominalVoltageUnit = parentBus->GetElectricalData().nominalVoltageUnit;
} else if(m_electricalData.nominalVoltage != parentBus->GetElectricalData().nominalVoltage ||
m_electricalData.nominalVoltageUnit != parentBus->GetElectricalData().nominalVoltageUnit) {
- wxMessageDialog msgDialog(NULL, _("Unable to connect two buses with different nominal voltages.\n"
- "Use a transformer or edit the bus properties."),
+ wxMessageDialog msgDialog(NULL,
+ _("Unable to connect two buses with different nominal voltages.\n"
+ "Use a transformer or edit the bus properties."),
_("Error"), wxOK | wxCENTRE | wxICON_ERROR);
msgDialog.ShowModal();
m_activeNodeID = 0;
@@ -460,14 +449,10 @@ void Line::UpdatePowerFlowArrowsPosition()
m_powerFlowArrow.clear();
} break;
case PF_BUS1_TO_BUS2: {
- for(int i = 1; i < (int)m_pointList.size() - 1; i++) {
- edges.push_back(m_pointList[i]);
- }
+ for(int i = 1; i < (int)m_pointList.size() - 1; i++) { edges.push_back(m_pointList[i]); }
} break;
case PF_BUS2_TO_BUS1: {
- for(int i = (int)m_pointList.size() - 2; i > 0; i--) {
- edges.push_back(m_pointList[i]);
- }
+ for(int i = (int)m_pointList.size() - 2; i > 0; i--) { edges.push_back(m_pointList[i]); }
} break;
default:
break;
@@ -591,3 +576,164 @@ LineElectricalData Line::GetPUElectricalData(double systemBasePower)
return data;
}
+
+rapidxml::xml_node<>* Line::SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode)
+{
+ auto elementNode = XMLParser::AppendNode(doc, elementListNode, "Line");
+ XMLParser::SetNodeAttribute(doc, elementNode, "ID", m_elementID);
+ auto cadProp = XMLParser::AppendNode(doc, elementNode, "CADProperties");
+ auto nodeList = XMLParser::AppendNode(doc, cadProp, "NodeList");
+ int nodeID = 0;
+ // Parse all the points.
+ for(unsigned int i = 0; i < m_pointList.size(); i++) {
+ // Don't save switch points, the method UpdateSwitchesPosition() calculate these points properly after open the
+ // element
+ if((i != 1) && (i != m_pointList.size() - 2)) {
+ auto nodePos = XMLParser::AppendNode(doc, nodeList, "Node");
+ XMLParser::SetNodeAttribute(doc, nodePos, "ID", nodeID);
+ auto nodePosX = XMLParser::AppendNode(doc, nodePos, "X");
+ XMLParser::SetNodeValue(doc, nodePosX, m_pointList[i].m_x);
+ auto nodePosY = XMLParser::AppendNode(doc, nodePos, "Y");
+ XMLParser::SetNodeValue(doc, nodePosY, m_pointList[i].m_y);
+ nodeID++;
+ }
+ }
+
+ auto parentIDList = XMLParser::AppendNode(doc, cadProp, "ParentIDList");
+ for(unsigned int i = 0; i < m_parentList.size(); i++) {
+ if(m_parentList[i]) {
+ auto parentID = XMLParser::AppendNode(doc, parentIDList, "ParentID");
+ XMLParser::SetNodeAttribute(doc, parentID, "ID", static_cast<int>(i));
+ XMLParser::SetNodeValue(doc, parentID, m_parentList[i]->GetID());
+ }
+ }
+
+ auto electricalProp = XMLParser::AppendNode(doc, elementNode, "ElectricalProperties");
+ auto isOnline = XMLParser::AppendNode(doc, electricalProp, "IsOnline");
+ XMLParser::SetNodeValue(doc, isOnline, m_online);
+ auto name = XMLParser::AppendNode(doc, electricalProp, "Name");
+ XMLParser::SetNodeValue(doc, name, m_electricalData.name);
+ auto nominalVoltage = XMLParser::AppendNode(doc, electricalProp, "NominalVoltage");
+ XMLParser::SetNodeValue(doc, nominalVoltage, m_electricalData.nominalVoltage);
+ XMLParser::SetNodeAttribute(doc, nominalVoltage, "UnitID", m_electricalData.nominalVoltageUnit);
+ auto nominalPower = XMLParser::AppendNode(doc, electricalProp, "NominalPower");
+ XMLParser::SetNodeValue(doc, nominalPower, m_electricalData.nominalPower);
+ XMLParser::SetNodeAttribute(doc, nominalPower, "UnitID", m_electricalData.nominalPowerUnit);
+ auto resistance = XMLParser::AppendNode(doc, electricalProp, "Resistance");
+ XMLParser::SetNodeValue(doc, resistance, m_electricalData.resistance);
+ XMLParser::SetNodeAttribute(doc, resistance, "UnitID", m_electricalData.resistanceUnit);
+ auto indReactance = XMLParser::AppendNode(doc, electricalProp, "IndReactance");
+ XMLParser::SetNodeValue(doc, indReactance, m_electricalData.indReactance);
+ XMLParser::SetNodeAttribute(doc, indReactance, "UnitID", m_electricalData.indReactanceUnit);
+ auto capSusceptance = XMLParser::AppendNode(doc, electricalProp, "CapSusceptance");
+ XMLParser::SetNodeValue(doc, capSusceptance, m_electricalData.capSusceptance);
+ XMLParser::SetNodeAttribute(doc, capSusceptance, "UnitID", m_electricalData.capSusceptanceUnit);
+ auto lineSize = XMLParser::AppendNode(doc, electricalProp, "LineSize");
+ XMLParser::SetNodeValue(doc, lineSize, m_electricalData.lineSize);
+ auto useLinePower = XMLParser::AppendNode(doc, electricalProp, "UseLinePower");
+ XMLParser::SetNodeValue(doc, useLinePower, m_electricalData.useLinePower);
+
+ auto fault = XMLParser::AppendNode(doc, electricalProp, "Fault");
+ auto zeroResistance = XMLParser::AppendNode(doc, fault, "ZeroResistance");
+ XMLParser::SetNodeValue(doc, zeroResistance, m_electricalData.zeroResistance);
+ auto zeroIndReactance = XMLParser::AppendNode(doc, fault, "ZeroIndReactance");
+ XMLParser::SetNodeValue(doc, zeroIndReactance, m_electricalData.zeroIndReactance);
+ auto zeroCapSusceptance = XMLParser::AppendNode(doc, fault, "ZeroCapSusceptance");
+ XMLParser::SetNodeValue(doc, zeroCapSusceptance, m_electricalData.zeroCapSusceptance);
+
+ SaveSwitchingData(doc, electricalProp);
+
+ return elementNode;
+}
+
+bool Line::OpenElement(rapidxml::xml_node<>* elementNode, std::vector<Element*> parentList)
+{
+ auto cadPropNode = elementNode->first_node("CADProperties");
+ if(!cadPropNode) return false;
+
+ // Get nodes points
+ std::vector<wxPoint2DDouble> ptsList;
+ auto nodePosList = cadPropNode->first_node("NodeList");
+ if(!nodePosList) return false;
+ auto nodePos = nodePosList->first_node("Node");
+ while(nodePos) {
+ double nodePosX = XMLParser::GetNodeValueDouble(nodePos, "X");
+ double nodePosY = XMLParser::GetNodeValueDouble(nodePos, "Y");
+ ptsList.push_back(wxPoint2DDouble(nodePosX, nodePosY));
+ nodePos = nodePos->next_sibling("Node");
+ }
+
+ // Get parents IDs
+ auto parentIDList = cadPropNode->first_node("ParentIDList");
+ if(!parentIDList) return false;
+ auto parentNode = parentIDList->first_node("ParentID");
+ long parentID[2] = {-1, -1};
+ while(parentNode) {
+ long index = 0;
+ wxString(parentNode->first_attribute("ID")->value()).ToCLong(&index);
+ wxString(parentNode->value()).ToCLong(&parentID[index]);
+ parentNode = parentNode->next_sibling("ParentID");
+ }
+
+ std::vector<wxPoint2DDouble> nodePtsList; // List of node points
+ nodePtsList.push_back(ptsList[0]); // First point on the list
+ nodePtsList.push_back(ptsList[ptsList.size() - 1]); // Last point on the list
+
+ // List of dummy buses to set not connected nodes properly
+ std::vector<Bus*> dummyBusList;
+ for(unsigned int i = 0; i < nodePtsList.size(); ++i) {
+ if(parentID[i] == -1) // No parent connected
+ {
+ Bus* dummyBus = new Bus(nodePtsList[i]);
+ dummyBusList.push_back(dummyBus);
+ AddParent(dummyBus, nodePtsList[i]);
+ } else { // Parent connected (necessarily a bus, get from bus list)
+ AddParent(parentList[parentID[i]], nodePtsList[i]);
+ }
+ }
+
+ // Add the others nodes (if exists)
+ std::vector<wxPoint2DDouble> midPts;
+ for(unsigned int i = 1; i < ptsList.size() - 1; i++) midPts.push_back(ptsList[i]);
+ m_pointList.insert(m_pointList.begin() + 2, midPts.begin(), midPts.end());
+ SetPointList(m_pointList);
+
+ // Remove dummy buses
+ for(auto it = dummyBusList.begin(), itEnd = dummyBusList.end(); it != itEnd; ++it) {
+ RemoveParent(*it);
+ delete *it;
+ }
+ dummyBusList.clear();
+
+ auto electricalProp = elementNode->first_node("ElectricalProperties");
+ if(!electricalProp) return false;
+
+ SetOnline(XMLParser::GetNodeValueInt(electricalProp, "IsOnline"));
+ m_electricalData.name = electricalProp->first_node("Name")->value();
+ m_electricalData.nominalVoltage = XMLParser::GetNodeValueDouble(electricalProp, "NominalVoltage");
+ m_electricalData.nominalVoltageUnit =
+ static_cast<ElectricalUnit>(XMLParser::GetAttributeValueInt(electricalProp, "NominalVoltage", "UnitID"));
+ m_electricalData.nominalPower = XMLParser::GetNodeValueDouble(electricalProp, "NominalPower");
+ m_electricalData.nominalPowerUnit =
+ static_cast<ElectricalUnit>(XMLParser::GetAttributeValueInt(electricalProp, "NominalPower", "UnitID"));
+ m_electricalData.resistance = XMLParser::GetNodeValueDouble(electricalProp, "Resistance");
+ m_electricalData.resistanceUnit =
+ static_cast<ElectricalUnit>(XMLParser::GetAttributeValueInt(electricalProp, "Resistance", "UnitID"));
+ m_electricalData.indReactance = XMLParser::GetNodeValueDouble(electricalProp, "IndReactance");
+ m_electricalData.indReactanceUnit =
+ static_cast<ElectricalUnit>(XMLParser::GetAttributeValueInt(electricalProp, "IndReactance", "UnitID"));
+ m_electricalData.capSusceptance = XMLParser::GetNodeValueDouble(electricalProp, "CapSusceptance");
+ m_electricalData.capSusceptanceUnit =
+ static_cast<ElectricalUnit>(XMLParser::GetAttributeValueInt(electricalProp, "CapSusceptance", "UnitID"));
+ m_electricalData.lineSize = XMLParser::GetNodeValueDouble(electricalProp, "LineSize");
+ m_electricalData.useLinePower = XMLParser::GetNodeValueInt(electricalProp, "UseLinePower");
+
+ auto fault = electricalProp->first_node("Fault");
+ m_electricalData.zeroResistance = XMLParser::GetNodeValueDouble(fault, "ZeroResistance");
+ m_electricalData.zeroIndReactance = XMLParser::GetNodeValueDouble(fault, "ZeroIndReactance");
+ m_electricalData.zeroCapSusceptance = XMLParser::GetNodeValueDouble(fault, "ZeroCapSusceptance");
+
+ if(!OpenSwitchingData(electricalProp)) return false;
+ if(m_swData.swTime.size() != 0) SetDynamicEvent(true);
+ return true;
+}
diff --git a/Project/Line.h b/Project/Line.h
index aa6baf2..75df0f2 100644
--- a/Project/Line.h
+++ b/Project/Line.h
@@ -88,6 +88,9 @@ class Line : public Branch
virtual void SetElectricalData(LineElectricalData electricalData) { m_electricalData = electricalData; }
virtual void SetNominalVoltage(std::vector<double> nominalVoltage, std::vector<ElectricalUnit> nominalVoltageUnit);
virtual void SetPointList(std::vector<wxPoint2DDouble> pointList);
+
+ virtual rapidxml::xml_node<>* SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode);
+ virtual bool OpenElement(rapidxml::xml_node<>* elementNode, std::vector<Element*> parentList);
protected:
void UpdatePowerFlowArrowsPosition();
diff --git a/Project/Load.cpp b/Project/Load.cpp
index 7d47e5a..64c5514 100644
--- a/Project/Load.cpp
+++ b/Project/Load.cpp
@@ -105,9 +105,7 @@ void Load::Draw(wxPoint2DDouble translation, double scale) const
DrawPowerFlowPts();
std::vector<wxPoint2DDouble> triangPts;
- for(int i = 0; i < 3; i++) {
- triangPts.push_back(m_triangPts[i] + m_position);
- }
+ for(int i = 0; i < 3; i++) { triangPts.push_back(m_triangPts[i] + m_position); }
glPushMatrix();
glTranslated(m_position.m_x, m_position.m_y, 0.0);
glRotated(m_angle, 0.0, 0.0, 1.0);
@@ -272,3 +270,92 @@ bool Load::GetPlotData(ElementPlotData& plotData)
return true;
}
+
+rapidxml::xml_node<>* Load::SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode)
+{
+ auto elementNode = XMLParser::AppendNode(doc, elementListNode, "Load");
+ XMLParser::SetNodeAttribute(doc, elementNode, "ID", m_elementID);
+
+ SaveCADProperties(doc, elementNode);
+
+ auto electricalProp = XMLParser::AppendNode(doc, elementNode, "ElectricalProperties");
+ auto isOnline = XMLParser::AppendNode(doc, electricalProp, "IsOnline");
+ XMLParser::SetNodeValue(doc, isOnline, m_online);
+ auto name = XMLParser::AppendNode(doc, electricalProp, "Name");
+ XMLParser::SetNodeValue(doc, name, m_electricalData.name);
+ auto activePower = XMLParser::AppendNode(doc, electricalProp, "ActivePower");
+ XMLParser::SetNodeValue(doc, activePower, m_electricalData.activePower);
+ XMLParser::SetNodeAttribute(doc, activePower, "UnitID", m_electricalData.activePowerUnit);
+ auto reactivePower = XMLParser::AppendNode(doc, electricalProp, "ReactivePower");
+ XMLParser::SetNodeValue(doc, reactivePower, m_electricalData.reactivePower);
+ XMLParser::SetNodeAttribute(doc, reactivePower, "UnitID", m_electricalData.reactivePowerUnit);
+ auto loadType = XMLParser::AppendNode(doc, electricalProp, "LoadType");
+ XMLParser::SetNodeValue(doc, loadType, m_electricalData.loadType);
+
+ auto stability = XMLParser::AppendNode(doc, electricalProp, "Stability");
+ auto plotLoad = XMLParser::AppendNode(doc, stability, "PlotLoad");
+ XMLParser::SetNodeValue(doc, plotLoad, m_electricalData.plotLoad);
+ auto useCompLoad = XMLParser::AppendNode(doc, stability, "UseCompositeLoad");
+ XMLParser::SetNodeValue(doc, useCompLoad, m_electricalData.useCompLoad);
+ auto activePowerCompl = XMLParser::AppendNode(doc, stability, "ActivePowerComposition");
+ auto pzl = XMLParser::AppendNode(doc, activePowerCompl, "ConstantImpedance");
+ XMLParser::SetNodeValue(doc, pzl, m_electricalData.constImpedanceActive);
+ auto pil = XMLParser::AppendNode(doc, activePowerCompl, "ConstantCurrent");
+ XMLParser::SetNodeValue(doc, pil, m_electricalData.constCurrentActive);
+ auto ppl = XMLParser::AppendNode(doc, activePowerCompl, "ConstantPower");
+ XMLParser::SetNodeValue(doc, ppl, m_electricalData.constPowerActive);
+ auto reactivePowerCompl = XMLParser::AppendNode(doc, stability, "ReactivePowerComposition");
+ auto qzl = XMLParser::AppendNode(doc, reactivePowerCompl, "ConstantImpedance");
+ XMLParser::SetNodeValue(doc, qzl, m_electricalData.constImpedanceReactive);
+ auto qil = XMLParser::AppendNode(doc, reactivePowerCompl, "ConstantCurrent");
+ XMLParser::SetNodeValue(doc, qil, m_electricalData.constCurrentReactive);
+ auto qpl = XMLParser::AppendNode(doc, reactivePowerCompl, "ConstantPower");
+ XMLParser::SetNodeValue(doc, qpl, m_electricalData.constPowerReactive);
+
+ SaveSwitchingData(doc, electricalProp);
+
+ return elementNode;
+}
+
+bool Load::OpenElement(rapidxml::xml_node<>* elementNode, std::vector<Element*> parentList)
+{
+ if(!OpenCADProperties(elementNode, parentList)) return false;
+ // The load have to insert the points that define his triangle
+ m_triangPts.push_back(wxPoint2DDouble(-m_width / 2.0, -m_height / 2.0));
+ m_triangPts.push_back(wxPoint2DDouble(m_width / 2.0, -m_height / 2.0));
+ m_triangPts.push_back(wxPoint2DDouble(0.0, m_height / 2.0));
+
+ auto electricalProp = elementNode->first_node("ElectricalProperties");
+ if(!electricalProp) return false;
+
+ SetOnline(XMLParser::GetNodeValueInt(electricalProp, "IsOnline"));
+ m_electricalData.name = electricalProp->first_node("Name")->value();
+ m_electricalData.activePower = XMLParser::GetNodeValueDouble(electricalProp, "ActivePower");
+ m_electricalData.activePowerUnit =
+ static_cast<ElectricalUnit>(XMLParser::GetAttributeValueInt(electricalProp, "ActivePower", "UnitID"));
+ m_electricalData.reactivePower = XMLParser::GetNodeValueDouble(electricalProp, "ReactivePower");
+ m_electricalData.reactivePowerUnit =
+ static_cast<ElectricalUnit>(XMLParser::GetAttributeValueInt(electricalProp, "ReactivePower", "UnitID"));
+ m_electricalData.loadType = static_cast<LoadType>(XMLParser::GetNodeValueInt(electricalProp, "LoadType"));
+ // Stability
+ auto stability = electricalProp->first_node("Stability");
+ if(stability) {
+ m_electricalData.plotLoad = XMLParser::GetNodeValueInt(stability, "PlotLoad");
+ m_electricalData.useCompLoad = XMLParser::GetNodeValueInt(stability, "UseCompositeLoad");
+ auto activePowerComp = stability->first_node("ActivePowerComposition");
+ m_electricalData.constImpedanceActive = XMLParser::GetNodeValueDouble(activePowerComp, "ConstantImpedance");
+ m_electricalData.constCurrentActive = XMLParser::GetNodeValueDouble(activePowerComp, "ConstantCurrent");
+ m_electricalData.constPowerActive = XMLParser::GetNodeValueDouble(activePowerComp, "ConstantPower");
+ auto reactivePowerComp = stability->first_node("ReactivePowerComposition");
+ m_electricalData.constImpedanceReactive = XMLParser::GetNodeValueDouble(reactivePowerComp, "ConstantImpedance");
+ m_electricalData.constCurrentReactive = XMLParser::GetNodeValueDouble(reactivePowerComp, "ConstantCurrent");
+ m_electricalData.constPowerReactive = XMLParser::GetNodeValueDouble(reactivePowerComp, "ConstantPower");
+ }
+
+ if(!OpenSwitchingData(electricalProp)) return false;
+ if(m_swData.swTime.size() != 0) SetDynamicEvent(true);
+
+ m_inserted = true;
+
+ return true;
+}
diff --git a/Project/Load.h b/Project/Load.h
index 9d82fa3..342f377 100644
--- a/Project/Load.h
+++ b/Project/Load.h
@@ -89,6 +89,9 @@ class Load : public Shunt
void SetElectricalData(LoadElectricalData electricalData) { m_electricalData = electricalData; }
virtual bool GetPlotData(ElementPlotData& plotData);
+ virtual rapidxml::xml_node<>* SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode);
+ virtual bool OpenElement(rapidxml::xml_node<>* elementNode, std::vector<Element*> parentList);
+
protected:
std::vector<wxPoint2DDouble> m_triangPts;
LoadElectricalData m_electricalData;
diff --git a/Project/MathExpression.cpp b/Project/MathExpression.cpp
index ee55732..f22b828 100644
--- a/Project/MathExpression.cpp
+++ b/Project/MathExpression.cpp
@@ -328,10 +328,13 @@ bool MathExpression::Initialize()
// Optimize only once to gain performance.
m_fparser.Optimize();
+
+ m_solved = false;
+ m_output = 0.0;
return true;
}
-void MathExpression::SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode)
+rapidxml::xml_node<>* MathExpression::SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode)
{
auto elementNode = XMLParser::AppendNode(doc, elementListNode, "MathExpr");
XMLParser::SetNodeAttribute(doc, elementNode, "ID", m_elementID);
@@ -347,6 +350,8 @@ void MathExpression::SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_no
}
auto mathExprValue = XMLParser::AppendNode(doc, elementNode, "MathExprValue");
XMLParser::SetNodeValue(doc, mathExprValue, m_mathExpression);
+
+ return elementNode;
}
bool MathExpression::OpenElement(rapidxml::xml_node<>* elementNode)
diff --git a/Project/MathExpression.h b/Project/MathExpression.h
index b3e30f7..f10965c 100644
--- a/Project/MathExpression.h
+++ b/Project/MathExpression.h
@@ -58,7 +58,7 @@ class MathExpression : public ControlElement
void RemoveInNode();
virtual bool UpdateText();
- virtual void SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode);
+ virtual rapidxml::xml_node<>* SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode);
virtual bool OpenElement(rapidxml::xml_node<>* elementNode);
virtual Element* GetCopy();
diff --git a/Project/Multiplier.cpp b/Project/Multiplier.cpp
index a32d494..7a9bcd8 100644
--- a/Project/Multiplier.cpp
+++ b/Project/Multiplier.cpp
@@ -70,13 +70,15 @@ Element* Multiplier::GetCopy()
return copy;
}
-void Multiplier::SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode)
+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)
diff --git a/Project/Multiplier.h b/Project/Multiplier.h
index d9df358..e0413aa 100644
--- a/Project/Multiplier.h
+++ b/Project/Multiplier.h
@@ -38,7 +38,7 @@ class Multiplier : public MathOperation
virtual void DrawSymbol() const;
virtual bool Solve(double* input, double timeStep);
- virtual void SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode);
+ virtual rapidxml::xml_node<>* SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode);
virtual bool OpenElement(rapidxml::xml_node<>* elementNode);
virtual Element* GetCopy();
diff --git a/Project/Project.mk b/Project/Project.mk
index 28afdbd..42dab76 100644
--- a/Project/Project.mk
+++ b/Project/Project.mk
@@ -13,7 +13,7 @@ CurrentFileName :=
CurrentFilePath :=
CurrentFileFullPath :=
User :=NDSE-69
-Date :=05/01/2018
+Date :=08/01/2018
CodeLitePath :="C:/Program Files/CodeLite"
LinkerName :=C:/TDM-GCC-64/bin/g++.exe
SharedObjectLinkerName :=C:/TDM-GCC-64/bin/g++.exe -shared -fPIC
diff --git a/Project/RateLimiter.cpp b/Project/RateLimiter.cpp
index 94e44f5..dedd910 100644
--- a/Project/RateLimiter.cpp
+++ b/Project/RateLimiter.cpp
@@ -141,7 +141,7 @@ Element* RateLimiter::GetCopy()
return copy;
}
-void RateLimiter::SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode)
+rapidxml::xml_node<>* RateLimiter::SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode)
{
auto elementNode = XMLParser::AppendNode(doc, elementListNode, "RateLimiter");
XMLParser::SetNodeAttribute(doc, elementNode, "ID", m_elementID);
@@ -154,6 +154,8 @@ void RateLimiter::SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<
XMLParser::SetNodeValue(doc, upLimit, m_upLimit);
auto lowLimit = XMLParser::AppendNode(doc, elementNode, "LowerLimit");
XMLParser::SetNodeValue(doc, lowLimit, m_lowLimit);
+
+ return elementNode;
}
bool RateLimiter::OpenElement(rapidxml::xml_node<>* elementNode)
diff --git a/Project/RateLimiter.h b/Project/RateLimiter.h
index c832aac..3247857 100644
--- a/Project/RateLimiter.h
+++ b/Project/RateLimiter.h
@@ -65,7 +65,7 @@ class RateLimiter : public ControlElement
*/
virtual bool Solve(double* input, double timeStep);
- virtual void SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode);
+ virtual rapidxml::xml_node<>* SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode);
virtual bool OpenElement(rapidxml::xml_node<>* elementNode);
virtual Element* GetCopy();
diff --git a/Project/Sum.cpp b/Project/Sum.cpp
index 789380a..9908497 100644
--- a/Project/Sum.cpp
+++ b/Project/Sum.cpp
@@ -246,7 +246,7 @@ Element* Sum::GetCopy()
return copy;
}
-void Sum::SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode)
+rapidxml::xml_node<>* Sum::SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode)
{
auto elementNode = XMLParser::AppendNode(doc, elementListNode, "Sum");
XMLParser::SetNodeAttribute(doc, elementNode, "ID", m_elementID);
@@ -260,6 +260,8 @@ void Sum::SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* eleme
auto value = XMLParser::AppendNode(doc, signsNode, "Value");
XMLParser::SetNodeValue(doc, value, static_cast<int>(m_signalList[i]));
}
+
+ return elementNode;
}
bool Sum::OpenElement(rapidxml::xml_node<>* elementNode)
diff --git a/Project/Sum.h b/Project/Sum.h
index b510bdc..d26e108 100644
--- a/Project/Sum.h
+++ b/Project/Sum.h
@@ -51,7 +51,7 @@ class Sum : public ControlElement
void AddInNode();
void RemoveInNode();
- virtual void SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode);
+ virtual rapidxml::xml_node<>* SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode);
virtual bool OpenElement(rapidxml::xml_node<>* elementNode);
virtual Element* GetCopy();
diff --git a/Project/SyncGenerator.cpp b/Project/SyncGenerator.cpp
index 74806b6..17463e2 100644
--- a/Project/SyncGenerator.cpp
+++ b/Project/SyncGenerator.cpp
@@ -15,9 +15,9 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
-#include "SyncMachineForm.h"
-#include "SyncGenerator.h"
#include "ControlElementContainer.h"
+#include "SyncGenerator.h"
+#include "SyncMachineForm.h"
SyncGenerator::SyncGenerator() : Machines() { Init(); }
SyncGenerator::SyncGenerator(wxString name) : Machines()
@@ -48,9 +48,7 @@ void SyncGenerator::DrawSymbol() const
{
// Draw sine.
std::vector<wxPoint2DDouble> sinePts;
- for(int i = 0; i < (int)m_sinePts.size(); i++) {
- sinePts.push_back(m_sinePts[i] + m_position);
- }
+ for(int i = 0; i < (int)m_sinePts.size(); i++) { sinePts.push_back(m_sinePts[i] + m_position); }
DrawLine(sinePts);
}
bool SyncGenerator::GetContextMenu(wxMenu& menu)
@@ -77,9 +75,7 @@ SyncGeneratorElectricalData SyncGenerator::GetPUElectricalData(double systemPowe
{
SyncGeneratorElectricalData data = m_electricalData;
double machineBasePower = 1.0;
- if(data.useMachineBase) {
- machineBasePower = GetValueFromUnit(data.nominalPower, data.nominalPowerUnit);
- }
+ if(data.useMachineBase) { machineBasePower = GetValueFromUnit(data.nominalPower, data.nominalPowerUnit); }
// Active power
double activePower = GetValueFromUnit(data.activePower, data.activePowerUnit);
@@ -248,3 +244,172 @@ bool SyncGenerator::GetPlotData(ElementPlotData& plotData)
plotData.AddData(m_electricalData.deltaVector, _("Delta"));
return true;
}
+
+rapidxml::xml_node<>* SyncGenerator::SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode)
+{
+ auto elementNode = XMLParser::AppendNode(doc, elementListNode, "SyncGenerator");
+ XMLParser::SetNodeAttribute(doc, elementNode, "ID", m_elementID);
+
+ SaveCADProperties(doc, elementNode);
+ auto electricalProp = XMLParser::AppendNode(doc, elementNode, "ElectricalProperties");
+ auto isOnline = XMLParser::AppendNode(doc, electricalProp, "IsOnline");
+ XMLParser::SetNodeValue(doc, isOnline, m_online);
+ auto name = XMLParser::AppendNode(doc, electricalProp, "Name");
+ XMLParser::SetNodeValue(doc, name, m_electricalData.name);
+ auto nominalPower = XMLParser::AppendNode(doc, electricalProp, "NominalPower");
+ XMLParser::SetNodeValue(doc, nominalPower, m_electricalData.nominalPower);
+ XMLParser::SetNodeAttribute(doc, nominalPower, "UnitID", m_electricalData.nominalPowerUnit);
+ auto nominalVoltage = XMLParser::AppendNode(doc, electricalProp, "NominalVoltage");
+ XMLParser::SetNodeValue(doc, nominalVoltage, m_electricalData.nominalVoltage);
+ XMLParser::SetNodeAttribute(doc, nominalVoltage, "UnitID", m_electricalData.nominalVoltageUnit);
+ auto activePower = XMLParser::AppendNode(doc, electricalProp, "ActivePower");
+ XMLParser::SetNodeValue(doc, activePower, m_electricalData.activePower);
+ XMLParser::SetNodeAttribute(doc, activePower, "UnitID", m_electricalData.activePowerUnit);
+ auto reactivePower = XMLParser::AppendNode(doc, electricalProp, "ReactivePower");
+ XMLParser::SetNodeValue(doc, reactivePower, m_electricalData.reactivePower);
+ XMLParser::SetNodeAttribute(doc, reactivePower, "UnitID", m_electricalData.reactivePowerUnit);
+ auto haveMaxReactive = XMLParser::AppendNode(doc, electricalProp, "HaveMaxReactive");
+ XMLParser::SetNodeValue(doc, haveMaxReactive, m_electricalData.haveMaxReactive);
+ auto maxReactive = XMLParser::AppendNode(doc, electricalProp, "MaxReactive");
+ XMLParser::SetNodeValue(doc, maxReactive, m_electricalData.maxReactive);
+ XMLParser::SetNodeAttribute(doc, maxReactive, "UnitID", m_electricalData.maxReactiveUnit);
+ auto haveMinReactive = XMLParser::AppendNode(doc, electricalProp, "HaveMinReactive");
+ XMLParser::SetNodeValue(doc, haveMinReactive, m_electricalData.haveMinReactive);
+ auto minReactive = XMLParser::AppendNode(doc, electricalProp, "MinReactive");
+ XMLParser::SetNodeValue(doc, minReactive, m_electricalData.minReactive);
+ XMLParser::SetNodeAttribute(doc, minReactive, "UnitID", m_electricalData.minReactiveUnit);
+ auto useMachineBase = XMLParser::AppendNode(doc, electricalProp, "UseMachineBase");
+ XMLParser::SetNodeValue(doc, useMachineBase, m_electricalData.useMachineBase);
+
+ auto fault = XMLParser::AppendNode(doc, electricalProp, "Fault");
+ auto positiveResistance = XMLParser::AppendNode(doc, fault, "PositiveResistance");
+ XMLParser::SetNodeValue(doc, positiveResistance, m_electricalData.positiveResistance);
+ auto positiveReactance = XMLParser::AppendNode(doc, fault, "PositiveReactance");
+ XMLParser::SetNodeValue(doc, positiveReactance, m_electricalData.positiveReactance);
+ auto negativeResistance = XMLParser::AppendNode(doc, fault, "NegativeResistance");
+ XMLParser::SetNodeValue(doc, negativeResistance, m_electricalData.negativeResistance);
+ auto negativeReactance = XMLParser::AppendNode(doc, fault, "NegativeReactance");
+ XMLParser::SetNodeValue(doc, negativeReactance, m_electricalData.negativeReactance);
+ auto zeroResistance = XMLParser::AppendNode(doc, fault, "ZeroResistance");
+ XMLParser::SetNodeValue(doc, zeroResistance, m_electricalData.zeroResistance);
+ auto zeroReactance = XMLParser::AppendNode(doc, fault, "ZeroReactance");
+ XMLParser::SetNodeValue(doc, zeroReactance, m_electricalData.zeroReactance);
+ auto groundResistance = XMLParser::AppendNode(doc, fault, "GroundResistance");
+ XMLParser::SetNodeValue(doc, groundResistance, m_electricalData.groundResistance);
+ auto groundReactance = XMLParser::AppendNode(doc, fault, "GroundReactance");
+ XMLParser::SetNodeValue(doc, groundReactance, m_electricalData.groundReactance);
+ auto groundNeutral = XMLParser::AppendNode(doc, fault, "GroundNeutral");
+ XMLParser::SetNodeValue(doc, groundNeutral, m_electricalData.groundNeutral);
+
+ auto stability = XMLParser::AppendNode(doc, electricalProp, "Stability");
+ auto plotSyncMachine = XMLParser::AppendNode(doc, stability, "PlotSyncMachine");
+ XMLParser::SetNodeValue(doc, plotSyncMachine, m_electricalData.plotSyncMachine);
+ auto inertia = XMLParser::AppendNode(doc, stability, "Inertia");
+ XMLParser::SetNodeValue(doc, inertia, m_electricalData.inertia);
+ auto damping = XMLParser::AppendNode(doc, stability, "Damping");
+ XMLParser::SetNodeValue(doc, damping, m_electricalData.damping);
+ auto useAVR = XMLParser::AppendNode(doc, stability, "UseAVR");
+ XMLParser::SetNodeValue(doc, useAVR, m_electricalData.useAVR);
+ auto useSpeedGovernor = XMLParser::AppendNode(doc, stability, "UseSpeedGovernor");
+ XMLParser::SetNodeValue(doc, useSpeedGovernor, m_electricalData.useSpeedGovernor);
+ auto armResistance = XMLParser::AppendNode(doc, stability, "ArmResistance");
+ XMLParser::SetNodeValue(doc, armResistance, m_electricalData.armResistance);
+ auto potierReactance = XMLParser::AppendNode(doc, stability, "PotierReactance");
+ XMLParser::SetNodeValue(doc, potierReactance, m_electricalData.potierReactance);
+ auto satFactor = XMLParser::AppendNode(doc, stability, "SatFactor");
+ XMLParser::SetNodeValue(doc, satFactor, m_electricalData.satFactor);
+ auto syncXd = XMLParser::AppendNode(doc, stability, "SyncXd");
+ XMLParser::SetNodeValue(doc, syncXd, m_electricalData.syncXd);
+ auto syncXq = XMLParser::AppendNode(doc, stability, "SyncXq");
+ XMLParser::SetNodeValue(doc, syncXq, m_electricalData.syncXq);
+ auto transXd = XMLParser::AppendNode(doc, stability, "TransXd");
+ XMLParser::SetNodeValue(doc, transXd, m_electricalData.transXd);
+ auto transXq = XMLParser::AppendNode(doc, stability, "TransXq");
+ XMLParser::SetNodeValue(doc, transXq, m_electricalData.transXq);
+ auto transTd0 = XMLParser::AppendNode(doc, stability, "TransTd0");
+ XMLParser::SetNodeValue(doc, transTd0, m_electricalData.transTd0);
+ auto transTq0 = XMLParser::AppendNode(doc, stability, "TransTq0");
+ XMLParser::SetNodeValue(doc, transTq0, m_electricalData.transTq0);
+ auto subXd = XMLParser::AppendNode(doc, stability, "SubXd");
+ XMLParser::SetNodeValue(doc, subXd, m_electricalData.subXd);
+ auto subXq = XMLParser::AppendNode(doc, stability, "SubXq");
+ XMLParser::SetNodeValue(doc, subXq, m_electricalData.subXq);
+ auto subTd0 = XMLParser::AppendNode(doc, stability, "SubTd0");
+ XMLParser::SetNodeValue(doc, subTd0, m_electricalData.subTd0);
+ auto subTq0 = XMLParser::AppendNode(doc, stability, "SubTq0");
+ XMLParser::SetNodeValue(doc, subTq0, m_electricalData.subTq0);
+
+ SaveSwitchingData(doc, electricalProp);
+ return elementNode;
+}
+
+bool SyncGenerator::OpenElement(rapidxml::xml_node<>* elementNode, std::vector<Element*> parentList)
+{
+ if(!OpenCADProperties(elementNode, parentList)) return false;
+
+ auto electricalProp = elementNode->first_node("ElectricalProperties");
+ if(!electricalProp) return false;
+
+ SetOnline(XMLParser::GetNodeValueInt(electricalProp, "IsOnline"));
+ m_electricalData.name = electricalProp->first_node("Name")->value();
+ m_electricalData.nominalPower = XMLParser::GetNodeValueDouble(electricalProp, "NominalPower");
+ m_electricalData.nominalPowerUnit =
+ static_cast<ElectricalUnit>(XMLParser::GetAttributeValueInt(electricalProp, "NominalPower", "UnitID"));
+ m_electricalData.nominalVoltage = XMLParser::GetNodeValueDouble(electricalProp, "NominalVoltage");
+ m_electricalData.nominalVoltageUnit =
+ static_cast<ElectricalUnit>(XMLParser::GetAttributeValueInt(electricalProp, "NominalVoltage", "UnitID"));
+ m_electricalData.activePower = XMLParser::GetNodeValueDouble(electricalProp, "ActivePower");
+ m_electricalData.activePowerUnit =
+ static_cast<ElectricalUnit>(XMLParser::GetAttributeValueInt(electricalProp, "ActivePower", "UnitID"));
+ m_electricalData.reactivePower = XMLParser::GetNodeValueDouble(electricalProp, "ReactivePower");
+ m_electricalData.reactivePowerUnit =
+ static_cast<ElectricalUnit>(XMLParser::GetAttributeValueInt(electricalProp, "ReactivePower", "UnitID"));
+ m_electricalData.haveMaxReactive = XMLParser::GetNodeValueInt(electricalProp, "HaveMaxReactive");
+ m_electricalData.maxReactive = XMLParser::GetNodeValueDouble(electricalProp, "MaxReactive");
+ m_electricalData.maxReactiveUnit =
+ static_cast<ElectricalUnit>(XMLParser::GetAttributeValueInt(electricalProp, "MaxReactive", "UnitID"));
+ m_electricalData.haveMinReactive = XMLParser::GetNodeValueInt(electricalProp, "HaveMinReactive");
+ m_electricalData.minReactive = XMLParser::GetNodeValueDouble(electricalProp, "MinReactive");
+ m_electricalData.minReactiveUnit =
+ static_cast<ElectricalUnit>(XMLParser::GetAttributeValueInt(electricalProp, "MinReactive", "UnitID"));
+ m_electricalData.useMachineBase = XMLParser::GetNodeValueInt(electricalProp, "UseMachineBase");
+
+ auto fault = electricalProp->first_node("Fault");
+ if(!fault) return false;
+ m_electricalData.positiveResistance = XMLParser::GetNodeValueDouble(fault, "PositiveResistance");
+ m_electricalData.positiveReactance = XMLParser::GetNodeValueDouble(fault, "PositiveReactance");
+ m_electricalData.negativeResistance = XMLParser::GetNodeValueDouble(fault, "NegativeResistance");
+ m_electricalData.negativeReactance = XMLParser::GetNodeValueDouble(fault, "NegativeReactance");
+ m_electricalData.zeroResistance = XMLParser::GetNodeValueDouble(fault, "ZeroResistance");
+ m_electricalData.zeroReactance = XMLParser::GetNodeValueDouble(fault, "ZeroReactance");
+ m_electricalData.groundResistance = XMLParser::GetNodeValueDouble(fault, "GroundResistance");
+ m_electricalData.groundReactance = XMLParser::GetNodeValueDouble(fault, "GroundReactance");
+ m_electricalData.groundNeutral = XMLParser::GetNodeValueInt(fault, "GroundNeutral");
+
+ auto stability = electricalProp->first_node("Stability");
+ if(!stability) return false;
+ m_electricalData.plotSyncMachine = XMLParser::GetNodeValueInt(stability, "PlotSyncMachine");
+ m_electricalData.inertia = XMLParser::GetNodeValueDouble(stability, "Inertia");
+ m_electricalData.damping = XMLParser::GetNodeValueDouble(stability, "Damping");
+ m_electricalData.useAVR = XMLParser::GetNodeValueInt(stability, "UseAVR");
+ m_electricalData.useSpeedGovernor = XMLParser::GetNodeValueInt(stability, "UseSpeedGovernor");
+ m_electricalData.armResistance = XMLParser::GetNodeValueDouble(stability, "ArmResistance");
+ m_electricalData.potierReactance = XMLParser::GetNodeValueDouble(stability, "PotierReactance");
+ m_electricalData.satFactor = XMLParser::GetNodeValueDouble(stability, "SatFactor");
+ m_electricalData.syncXd = XMLParser::GetNodeValueDouble(stability, "SyncXd");
+ m_electricalData.syncXq = XMLParser::GetNodeValueDouble(stability, "SyncXq");
+ m_electricalData.transXd = XMLParser::GetNodeValueDouble(stability, "TransXd");
+ m_electricalData.transXq = XMLParser::GetNodeValueDouble(stability, "TransXq");
+ m_electricalData.transTd0 = XMLParser::GetNodeValueDouble(stability, "TransTd0");
+ m_electricalData.transTq0 = XMLParser::GetNodeValueDouble(stability, "TransTq0");
+ m_electricalData.subXd = XMLParser::GetNodeValueDouble(stability, "SubXd");
+ m_electricalData.subXq = XMLParser::GetNodeValueDouble(stability, "SubXq");
+ m_electricalData.subTd0 = XMLParser::GetNodeValueDouble(stability, "SubTd0");
+ m_electricalData.subTq0 = XMLParser::GetNodeValueDouble(stability, "SubTq0");
+
+ if(!OpenSwitchingData(electricalProp)) return false;
+ if(m_swData.swTime.size() != 0) SetDynamicEvent(true);
+
+ m_inserted = true;
+ return true;
+}
diff --git a/Project/SyncGenerator.h b/Project/SyncGenerator.h
index cb1b146..4866f8b 100644
--- a/Project/SyncGenerator.h
+++ b/Project/SyncGenerator.h
@@ -156,6 +156,9 @@ class SyncGenerator : public Machines
virtual void SetNominalVoltage(std::vector<double> nominalVoltage, std::vector<ElectricalUnit> nominalVoltageUnit);
virtual bool GetPlotData(ElementPlotData& plotData);
+ virtual rapidxml::xml_node<>* SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode);
+ virtual bool OpenElement(rapidxml::xml_node<>* elementNode, std::vector<Element*> parentList);
+
protected:
std::vector<wxPoint2DDouble> m_sinePts;
diff --git a/Project/SyncMotor.cpp b/Project/SyncMotor.cpp
index 1a5b20d..8283a25 100644
--- a/Project/SyncMotor.cpp
+++ b/Project/SyncMotor.cpp
@@ -47,9 +47,7 @@ SyncMotorElectricalData SyncMotor::GetPUElectricalData(double systemPowerBase)
{
SyncMotorElectricalData data = m_electricalData;
double machineBasePower = 1.0;
- if(data.useMachineBase) {
- machineBasePower = GetValueFromUnit(data.nominalPower, data.nominalPowerUnit);
- }
+ if(data.useMachineBase) { machineBasePower = GetValueFromUnit(data.nominalPower, data.nominalPowerUnit); }
// Active power
double activePower = GetValueFromUnit(data.activePower, data.activePowerUnit);
@@ -174,3 +172,105 @@ wxString SyncMotor::GetTipText() const
return tipText;
}
+
+rapidxml::xml_node<>* SyncMotor::SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode)
+{
+ auto elementNode = XMLParser::AppendNode(doc, elementListNode, "SyncMotor");
+ XMLParser::SetNodeAttribute(doc, elementNode, "ID", m_elementID);
+
+ SaveCADProperties(doc, elementNode);
+
+ auto electricalProp = XMLParser::AppendNode(doc, elementNode, "ElectricalProperties");
+ auto isOnline = XMLParser::AppendNode(doc, electricalProp, "IsOnline");
+ XMLParser::SetNodeValue(doc, isOnline, m_online);
+ auto name = XMLParser::AppendNode(doc, electricalProp, "Name");
+ XMLParser::SetNodeValue(doc, name, m_electricalData.name);
+ auto nominalPower = XMLParser::AppendNode(doc, electricalProp, "NominalPower");
+ XMLParser::SetNodeValue(doc, nominalPower, m_electricalData.nominalPower);
+ XMLParser::SetNodeAttribute(doc, nominalPower, "UnitID", m_electricalData.nominalPowerUnit);
+ auto activePower = XMLParser::AppendNode(doc, electricalProp, "ActivePower");
+ XMLParser::SetNodeValue(doc, activePower, m_electricalData.activePower);
+ XMLParser::SetNodeAttribute(doc, activePower, "UnitID", m_electricalData.activePowerUnit);
+ auto reactivePower = XMLParser::AppendNode(doc, electricalProp, "ReactivePower");
+ XMLParser::SetNodeValue(doc, reactivePower, m_electricalData.reactivePower);
+ XMLParser::SetNodeAttribute(doc, reactivePower, "UnitID", m_electricalData.reactivePowerUnit);
+ auto haveMaxReactive = XMLParser::AppendNode(doc, electricalProp, "HaveMaxReactive");
+ XMLParser::SetNodeValue(doc, haveMaxReactive, m_electricalData.haveMaxReactive);
+ auto maxReactive = XMLParser::AppendNode(doc, electricalProp, "MaxReactive");
+ XMLParser::SetNodeValue(doc, maxReactive, m_electricalData.maxReactive);
+ XMLParser::SetNodeAttribute(doc, maxReactive, "UnitID", m_electricalData.maxReactiveUnit);
+ auto haveMinReactive = XMLParser::AppendNode(doc, electricalProp, "HaveMinReactive");
+ XMLParser::SetNodeValue(doc, haveMinReactive, m_electricalData.haveMinReactive);
+ auto minReactive = XMLParser::AppendNode(doc, electricalProp, "MinReactive");
+ XMLParser::SetNodeValue(doc, minReactive, m_electricalData.minReactive);
+ XMLParser::SetNodeAttribute(doc, minReactive, "UnitID", m_electricalData.minReactiveUnit);
+ auto useMachineBase = XMLParser::AppendNode(doc, electricalProp, "UseMachineBase");
+ XMLParser::SetNodeValue(doc, useMachineBase, m_electricalData.useMachineBase);
+
+ auto fault = XMLParser::AppendNode(doc, electricalProp, "Fault");
+ auto positiveResistance = XMLParser::AppendNode(doc, fault, "PositiveResistance");
+ XMLParser::SetNodeValue(doc, positiveResistance, m_electricalData.positiveResistance);
+ auto positiveReactance = XMLParser::AppendNode(doc, fault, "PositiveReactance");
+ XMLParser::SetNodeValue(doc, positiveReactance, m_electricalData.positiveReactance);
+ auto negativeResistance = XMLParser::AppendNode(doc, fault, "NegativeResistance");
+ XMLParser::SetNodeValue(doc, negativeResistance, m_electricalData.negativeResistance);
+ auto negativeReactance = XMLParser::AppendNode(doc, fault, "NegativeReactance");
+ XMLParser::SetNodeValue(doc, negativeReactance, m_electricalData.negativeReactance);
+ auto zeroResistance = XMLParser::AppendNode(doc, fault, "ZeroResistance");
+ XMLParser::SetNodeValue(doc, zeroResistance, m_electricalData.zeroResistance);
+ auto zeroReactance = XMLParser::AppendNode(doc, fault, "ZeroReactance");
+ XMLParser::SetNodeValue(doc, zeroReactance, m_electricalData.zeroReactance);
+ auto groundResistance = XMLParser::AppendNode(doc, fault, "GroundResistance");
+ XMLParser::SetNodeValue(doc, groundResistance, m_electricalData.groundResistance);
+ auto groundReactance = XMLParser::AppendNode(doc, fault, "GroundReactance");
+ XMLParser::SetNodeValue(doc, groundReactance, m_electricalData.groundReactance);
+ auto groundNeutral = XMLParser::AppendNode(doc, fault, "GroundNeutral");
+ XMLParser::SetNodeValue(doc, groundNeutral, m_electricalData.groundNeutral);
+
+ return elementNode;
+}
+
+bool SyncMotor::OpenElement(rapidxml::xml_node<>* elementNode, std::vector<Element*> parentList)
+{
+ if(!OpenCADProperties(elementNode, parentList)) return false;
+
+ auto electricalProp = elementNode->first_node("ElectricalProperties");
+ if(!electricalProp) return false;
+
+ SetOnline(XMLParser::GetNodeValueInt(electricalProp, "IsOnline"));
+ m_electricalData.name = electricalProp->first_node("Name")->value();
+ m_electricalData.nominalPower = XMLParser::GetNodeValueDouble(electricalProp, "NominalPower");
+ m_electricalData.nominalPowerUnit =
+ static_cast<ElectricalUnit>(XMLParser::GetAttributeValueInt(electricalProp, "NominalPower", "UnitID"));
+ m_electricalData.activePower = XMLParser::GetNodeValueDouble(electricalProp, "ActivePower");
+ m_electricalData.activePowerUnit =
+ static_cast<ElectricalUnit>(XMLParser::GetAttributeValueInt(electricalProp, "ActivePower", "UnitID"));
+ m_electricalData.reactivePower = XMLParser::GetNodeValueDouble(electricalProp, "ReactivePower");
+ m_electricalData.reactivePowerUnit =
+ static_cast<ElectricalUnit>(XMLParser::GetAttributeValueInt(electricalProp, "ReactivePower", "UnitID"));
+ m_electricalData.haveMaxReactive = XMLParser::GetNodeValueInt(electricalProp, "HaveMaxReactive");
+ m_electricalData.maxReactive = XMLParser::GetNodeValueDouble(electricalProp, "MaxReactive");
+ m_electricalData.maxReactiveUnit =
+ static_cast<ElectricalUnit>(XMLParser::GetAttributeValueInt(electricalProp, "MaxReactive", "UnitID"));
+ m_electricalData.haveMinReactive = XMLParser::GetNodeValueInt(electricalProp, "HaveMinReactive");
+ m_electricalData.minReactive = XMLParser::GetNodeValueDouble(electricalProp, "MinReactive");
+ m_electricalData.minReactiveUnit =
+ static_cast<ElectricalUnit>(XMLParser::GetAttributeValueInt(electricalProp, "MinReactive", "UnitID"));
+ m_electricalData.useMachineBase = XMLParser::GetNodeValueInt(electricalProp, "UseMachineBase");
+
+ auto fault = electricalProp->first_node("Fault");
+ if(!fault) return false;
+ m_electricalData.positiveResistance = XMLParser::GetNodeValueDouble(fault, "PositiveResistance");
+ m_electricalData.positiveReactance = XMLParser::GetNodeValueDouble(fault, "PositiveReactance");
+ m_electricalData.negativeResistance = XMLParser::GetNodeValueDouble(fault, "NegativeResistance");
+ m_electricalData.negativeReactance = XMLParser::GetNodeValueDouble(fault, "NegativeReactance");
+ m_electricalData.zeroResistance = XMLParser::GetNodeValueDouble(fault, "ZeroResistance");
+ m_electricalData.zeroReactance = XMLParser::GetNodeValueDouble(fault, "ZeroReactance");
+ m_electricalData.groundResistance = XMLParser::GetNodeValueDouble(fault, "GroundResistance");
+ m_electricalData.groundReactance = XMLParser::GetNodeValueDouble(fault, "GroundReactance");
+ m_electricalData.groundNeutral = XMLParser::GetNodeValueInt(fault, "GroundNeutral");
+
+ m_inserted = true;
+
+ return true;
+}
diff --git a/Project/SyncMotor.h b/Project/SyncMotor.h
index 4950922..772ef7b 100644
--- a/Project/SyncMotor.h
+++ b/Project/SyncMotor.h
@@ -148,6 +148,9 @@ class SyncMotor : public Machines
virtual void SetElectricalData(SyncMotorElectricalData electricalData) { m_electricalData = electricalData; }
virtual bool ShowForm(wxWindow* parent, Element* element);
+ virtual rapidxml::xml_node<>* SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode);
+ virtual bool OpenElement(rapidxml::xml_node<>* elementNode, std::vector<Element*> parentList);
+
protected:
SyncMotorElectricalData m_electricalData;
};
diff --git a/Project/Text.cpp b/Project/Text.cpp
index fd1d986..0697ac5 100644
--- a/Project/Text.cpp
+++ b/Project/Text.cpp
@@ -15,22 +15,22 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
-#include "TextForm.h"
#include "Text.h"
+#include "TextForm.h"
#ifdef USING_WX_3_0_X
#include "DegreesAndRadians.h"
#endif
-#include "ElectricCalculation.h"
#include "Bus.h"
+#include "Capacitor.h"
+#include "ElectricCalculation.h"
+#include "IndMotor.h"
+#include "Inductor.h"
#include "Line.h"
-#include "Transformer.h"
+#include "Load.h"
#include "SyncGenerator.h"
-#include "IndMotor.h"
#include "SyncMotor.h"
-#include "Load.h"
-#include "Inductor.h"
-#include "Capacitor.h"
+#include "Transformer.h"
Text::Text() : GraphicalElement() { SetText(m_text); }
Text::Text(wxPoint2DDouble position) : GraphicalElement()
@@ -90,9 +90,7 @@ void Text::SetText(wxString text)
m_text = text;
// Clear OpenGL text list
- for(auto it = m_openGLTextList.begin(), itEnd = m_openGLTextList.end(); it != itEnd; ++it) {
- delete *it;
- }
+ for(auto it = m_openGLTextList.begin(), itEnd = m_openGLTextList.end(); it != itEnd; ++it) { delete *it; }
m_openGLTextList.clear();
m_numberOfLines = m_text.Freq('\n') + 1;
@@ -190,9 +188,9 @@ void Text::UpdateText(double systemPowerBase)
SetText(str);
} break;
case UNIT_A: {
- wxString str = "Ia = " +
- wxString::FromDouble(faultCurrent[0] * baseCurrent, m_decimalPlaces) +
- " A";
+ wxString str =
+ "Ia = " + wxString::FromDouble(faultCurrent[0] * baseCurrent, m_decimalPlaces) +
+ " A";
str += "\nIb = " +
wxString::FromDouble(faultCurrent[1] * baseCurrent, m_decimalPlaces) + " A";
str += "\nIc = " +
@@ -227,9 +225,9 @@ void Text::UpdateText(double systemPowerBase)
SetText(str);
} break;
case UNIT_V: {
- wxString str = "Va = " +
- wxString::FromDouble(faultVoltage[0] * baseVoltage, m_decimalPlaces) +
- " V";
+ wxString str =
+ "Va = " + wxString::FromDouble(faultVoltage[0] * baseVoltage, m_decimalPlaces) +
+ " V";
str += "\nVb = " +
wxString::FromDouble(faultVoltage[1] * baseVoltage, m_decimalPlaces) + " V";
str += "\nVc = " +
@@ -344,9 +342,9 @@ void Text::UpdateText(double systemPowerBase)
SetText(str);
} break;
case UNIT_A: {
- wxString str = "Ia = " +
- wxString::FromDouble(faultCurrent[0] * baseCurrent, m_decimalPlaces) +
- " A";
+ wxString str =
+ "Ia = " + wxString::FromDouble(faultCurrent[0] * baseCurrent, m_decimalPlaces) +
+ " A";
str += "\nIb = " +
wxString::FromDouble(faultCurrent[1] * baseCurrent, m_decimalPlaces) + " A";
str += "\nIc = " +
@@ -480,9 +478,9 @@ void Text::UpdateText(double systemPowerBase)
SetText(str);
} break;
case UNIT_A: {
- wxString str = "Ia = " +
- wxString::FromDouble(faultCurrent[0] * baseCurrent, m_decimalPlaces) +
- " A";
+ wxString str =
+ "Ia = " + wxString::FromDouble(faultCurrent[0] * baseCurrent, m_decimalPlaces) +
+ " A";
str += "\nIb = " +
wxString::FromDouble(faultCurrent[1] * baseCurrent, m_decimalPlaces) + " A";
str += "\nIc = " +
@@ -627,12 +625,14 @@ void Text::UpdateText(double systemPowerBase)
"Ia = " +
wxString::FromDouble(faultCurrent[0] * baseCurrent[m_direction], m_decimalPlaces) +
" A";
- str += "\nIb = " + wxString::FromDouble(faultCurrent[1] * baseCurrent[m_direction],
- m_decimalPlaces) +
- " A";
- str += "\nIc = " + wxString::FromDouble(faultCurrent[2] * baseCurrent[m_direction],
- m_decimalPlaces) +
- " A";
+ str +=
+ "\nIb = " +
+ wxString::FromDouble(faultCurrent[1] * baseCurrent[m_direction], m_decimalPlaces) +
+ " A";
+ str +=
+ "\nIc = " +
+ wxString::FromDouble(faultCurrent[2] * baseCurrent[m_direction], m_decimalPlaces) +
+ " A";
SetText(str);
} break;
case UNIT_kA: {
@@ -936,3 +936,43 @@ bool Text::IsGLTextOK()
}
return isOk;
}
+
+rapidxml::xml_node<>* Text::SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode)
+{
+ auto elementNode = XMLParser::AppendNode(doc, elementListNode, "Text");
+ XMLParser::SetNodeAttribute(doc, elementNode, "ID", m_elementID);
+
+ SaveCADProperties(doc, elementNode);
+
+ auto textProperties = XMLParser::AppendNode(doc, elementNode, "TextProperties");
+ auto elementType = XMLParser::AppendNode(doc, textProperties, "ElementType");
+ XMLParser::SetNodeValue(doc, elementType, m_elementType);
+ auto elementNumber = XMLParser::AppendNode(doc, textProperties, "ElementNumber");
+ XMLParser::SetNodeValue(doc, elementNumber, m_elementNumber);
+ auto dataType = XMLParser::AppendNode(doc, textProperties, "DataType");
+ XMLParser::SetNodeValue(doc, dataType, m_dataType);
+ auto dataUnit = XMLParser::AppendNode(doc, textProperties, "DataUnit");
+ XMLParser::SetNodeValue(doc, dataUnit, m_unit);
+ auto direction = XMLParser::AppendNode(doc, textProperties, "Direction");
+ XMLParser::SetNodeValue(doc, direction, m_direction);
+ auto decimalPlaces = XMLParser::AppendNode(doc, textProperties, "DecimalPlaces");
+ XMLParser::SetNodeValue(doc, decimalPlaces, m_decimalPlaces);
+
+ return elementNode;
+}
+
+bool Text::OpenElement(rapidxml::xml_node<>* elementNode)
+{
+ if(!OpenCADProperties(elementNode)) return false;
+
+ auto textProperties = elementNode->first_node("TextProperties");
+ if(!textProperties) return false;
+
+ SetElementType(static_cast<ElementType>(XMLParser::GetNodeValueDouble(textProperties, "ElementType")));
+ SetDataType(static_cast<DataType>(XMLParser::GetNodeValueDouble(textProperties, "DataType")));
+ SetUnit(static_cast<ElectricalUnit>(XMLParser::GetNodeValueDouble(textProperties, "DataUnit")));
+ SetDirection(XMLParser::GetNodeValueDouble(textProperties, "Direction"));
+ SetDecimalPlaces(XMLParser::GetNodeValueDouble(textProperties, "DecimalPlaces"));
+ SetElementNumber(XMLParser::GetNodeValueInt(textProperties, "ElementNumber"));
+ return true;
+}
diff --git a/Project/Text.h b/Project/Text.h
index f7b1a68..822d5ee 100644
--- a/Project/Text.h
+++ b/Project/Text.h
@@ -105,6 +105,10 @@ class Text : public GraphicalElement
const ElementType GetElementType() const { return m_elementType; }
const ElectricalUnit GetUnit() const { return m_unit; }
int GetDecimalPlaces() const { return m_decimalPlaces; }
+
+ virtual rapidxml::xml_node<>* SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode);
+ virtual bool OpenElement(rapidxml::xml_node<>* elementNode);
+
protected:
wxString m_text = _("Text");
int m_numberOfLines = 0;
diff --git a/Project/TransferFunction.cpp b/Project/TransferFunction.cpp
index d630ea3..8e7b68f 100644
--- a/Project/TransferFunction.cpp
+++ b/Project/TransferFunction.cpp
@@ -387,7 +387,8 @@ bool TransferFunction::UpdateText()
return true;
}
-void TransferFunction::SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode)
+rapidxml::xml_node<>* TransferFunction::SaveElement(rapidxml::xml_document<>& doc,
+ rapidxml::xml_node<>* elementListNode)
{
auto elementNode = XMLParser::AppendNode(doc, elementListNode, "TransferFunction");
XMLParser::SetNodeAttribute(doc, elementNode, "ID", m_elementID);
@@ -406,6 +407,8 @@ void TransferFunction::SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_
auto value = XMLParser::AppendNode(doc, denominatorNode, "Value");
XMLParser::SetNodeValue(doc, value, m_denominator[i]);
}
+
+ return elementNode;
}
bool TransferFunction::OpenElement(rapidxml::xml_node<>* elementNode)
diff --git a/Project/TransferFunction.h b/Project/TransferFunction.h
index abe3df3..f4ba344 100644
--- a/Project/TransferFunction.h
+++ b/Project/TransferFunction.h
@@ -75,7 +75,7 @@ class TransferFunction : public ControlElement
*/
virtual bool Solve(double* input, double timeStep);
- virtual void SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode);
+ virtual rapidxml::xml_node<>* SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode);
virtual bool OpenElement(rapidxml::xml_node<>* elementNode);
virtual Element* GetCopy();
diff --git a/Project/Transformer.cpp b/Project/Transformer.cpp
index 75816ce..3c3edd8 100644
--- a/Project/Transformer.cpp
+++ b/Project/Transformer.cpp
@@ -15,23 +15,19 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
-#include "TransformerForm.h"
#include "Transformer.h"
+#include "TransformerForm.h"
Transformer::Transformer() : Branch()
{
for(int i = 0; i < 2; i++) {
- for(int j = 0; j < 3; j++) {
- m_electricalData.faultCurrent[i][j] = std::complex<double>(0.0, 0.0);
- }
+ for(int j = 0; j < 3; j++) { m_electricalData.faultCurrent[i][j] = std::complex<double>(0.0, 0.0); }
}
}
Transformer::Transformer(wxString name) : Branch()
{
for(int i = 0; i < 2; i++) {
- for(int j = 0; j < 3; j++) {
- m_electricalData.faultCurrent[i][j] = std::complex<double>(0.0, 0.0);
- }
+ for(int j = 0; j < 3; j++) { m_electricalData.faultCurrent[i][j] = std::complex<double>(0.0, 0.0); }
}
m_electricalData.name = name;
}
@@ -80,9 +76,7 @@ bool Transformer::AddParent(Element* parent, wxPoint2DDouble position)
// Set first switch point.
wxPoint2DDouble secondPoint = parentPt;
- if(m_pointList.size() > 2) {
- secondPoint = m_pointList[2];
- }
+ if(m_pointList.size() > 2) { secondPoint = m_pointList[2]; }
m_pointList[1] = GetSwitchPoint(m_parentList[0], m_pointList[0], secondPoint);
// Set the second switch point.
@@ -158,9 +152,7 @@ void Transformer::Draw(wxPoint2DDouble translation, double scale) const
if(m_pointList.size() > 0) {
glColor4dv(elementColour.GetRGBA());
DrawCircle(m_pointList[0], 5.0, 10, GL_POLYGON);
- if(m_inserted) {
- DrawCircle(m_pointList[m_pointList.size() - 1], 5.0, 10, GL_POLYGON);
- }
+ if(m_inserted) { DrawCircle(m_pointList[m_pointList.size() - 1], 5.0, 10, GL_POLYGON); }
}
DrawSwitches();
@@ -214,13 +206,9 @@ void Transformer::Move(wxPoint2DDouble position)
SetPosition(m_movePos + position - m_moveStartPt);
// Move all the points, except the switches and buses points.
- for(int i = 2; i < (int)m_pointList.size() - 2; i++) {
- m_pointList[i] = m_movePts[i] + position - m_moveStartPt;
- }
+ for(int i = 2; i < (int)m_pointList.size() - 2; i++) { m_pointList[i] = m_movePts[i] + position - m_moveStartPt; }
- if(!m_parentList[0]) {
- m_pointList[0] = m_movePts[0] + position - m_moveStartPt;
- }
+ if(!m_parentList[0]) { m_pointList[0] = m_movePts[0] + position - m_moveStartPt; }
if(!m_parentList[1]) {
m_pointList[m_pointList.size() - 1] = m_movePts[m_pointList.size() - 1] + position - m_moveStartPt;
}
@@ -309,14 +297,10 @@ void Transformer::UpdatePowerFlowArrowsPosition()
m_powerFlowArrow.clear();
} break;
case PF_BUS1_TO_BUS2: {
- for(int i = 1; i < (int)m_pointList.size() - 1; i++) {
- edges.push_back(m_pointList[i]);
- }
+ for(int i = 1; i < (int)m_pointList.size() - 1; i++) { edges.push_back(m_pointList[i]); }
} break;
case PF_BUS2_TO_BUS1: {
- for(int i = (int)m_pointList.size() - 2; i > 0; i--) {
- edges.push_back(m_pointList[i]);
- }
+ for(int i = (int)m_pointList.size() - 2; i > 0; i--) { edges.push_back(m_pointList[i]); }
} break;
default:
break;
@@ -532,3 +516,205 @@ TransformerElectricalData Transformer::GetPUElectricalData(double systemBasePowe
return data;
}
+
+rapidxml::xml_node<>* Transformer::SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode)
+{
+ auto elementNode = XMLParser::AppendNode(doc, elementListNode, "Transfomer");
+ XMLParser::SetNodeAttribute(doc, elementNode, "ID", m_elementID);
+ auto cadProp = XMLParser::AppendNode(doc, elementNode, "CADProperties");
+ auto position = XMLParser::AppendNode(doc, cadProp, "Position");
+ auto posX = XMLParser::AppendNode(doc, position, "X");
+ XMLParser::SetNodeValue(doc, posX, m_position.m_x);
+ auto posY = XMLParser::AppendNode(doc, position, "Y");
+ XMLParser::SetNodeValue(doc, posY, m_position.m_y);
+ auto size = XMLParser::AppendNode(doc, cadProp, "Size");
+ auto width = XMLParser::AppendNode(doc, size, "Width");
+ XMLParser::SetNodeValue(doc, width, m_width);
+ auto height = XMLParser::AppendNode(doc, size, "Height");
+ XMLParser::SetNodeValue(doc, height, m_height);
+ auto angle = XMLParser::AppendNode(doc, cadProp, "Angle");
+ XMLParser::SetNodeValue(doc, angle, m_angle);
+ auto nodeList = XMLParser::AppendNode(doc, cadProp, "NodeList");
+ auto nodePos1 = XMLParser::AppendNode(doc, nodeList, "Node");
+ XMLParser::SetNodeAttribute(doc, nodePos1, "ID", 0);
+ auto nodePosX1 = XMLParser::AppendNode(doc, nodePos1, "X");
+ XMLParser::SetNodeValue(doc, nodePosX1, m_pointList[0].m_x);
+ auto nodePosY1 = XMLParser::AppendNode(doc, nodePos1, "Y");
+ XMLParser::SetNodeValue(doc, nodePosY1, m_pointList[0].m_y);
+ auto nodePos2 = XMLParser::AppendNode(doc, nodeList, "Node");
+ XMLParser::SetNodeAttribute(doc, nodePos2, "ID", 1);
+ auto nodePosX2 = XMLParser::AppendNode(doc, nodePos2, "X");
+ XMLParser::SetNodeValue(doc, nodePosX2, m_pointList[m_pointList.size() - 1].m_x);
+ auto nodePosY2 = XMLParser::AppendNode(doc, nodePos2, "Y");
+ XMLParser::SetNodeValue(doc, nodePosY2, m_pointList[m_pointList.size() - 1].m_y);
+
+ auto parentIDList = XMLParser::AppendNode(doc, cadProp, "ParentIDList");
+ for(unsigned int i = 0; i < m_parentList.size(); i++) {
+ Element* parent = m_parentList[i];
+ if(parent) {
+ auto parentID = XMLParser::AppendNode(doc, parentIDList, "ParentID");
+ XMLParser::SetNodeAttribute(doc, parentID, "ID", static_cast<int>(i));
+ XMLParser::SetNodeValue(doc, parentID, parent->GetID());
+ }
+ }
+
+ auto electricalProp = XMLParser::AppendNode(doc, elementNode, "ElectricalProperties");
+ auto isOnline = XMLParser::AppendNode(doc, electricalProp, "IsOnline");
+ XMLParser::SetNodeValue(doc, isOnline, m_online);
+ auto name = XMLParser::AppendNode(doc, electricalProp, "Name");
+ XMLParser::SetNodeValue(doc, name, m_electricalData.name);
+ auto primaryNominalVoltage = XMLParser::AppendNode(doc, electricalProp, "PrimaryNominalVoltage");
+ XMLParser::SetNodeValue(doc, primaryNominalVoltage, m_electricalData.primaryNominalVoltage);
+ XMLParser::SetNodeAttribute(doc, primaryNominalVoltage, "UnitID", m_electricalData.primaryNominalVoltageUnit);
+ auto secondaryNominalVoltage = XMLParser::AppendNode(doc, electricalProp, "SecondaryNominalVoltage");
+ XMLParser::SetNodeValue(doc, secondaryNominalVoltage, m_electricalData.secondaryNominalVoltage);
+ XMLParser::SetNodeAttribute(doc, secondaryNominalVoltage, "UnitID", m_electricalData.secondaryNominalVoltageUnit);
+ auto nominalPower = XMLParser::AppendNode(doc, electricalProp, "NominalPower");
+ XMLParser::SetNodeValue(doc, nominalPower, m_electricalData.nominalPower);
+ XMLParser::SetNodeAttribute(doc, nominalPower, "UnitID", m_electricalData.nominalPowerUnit);
+ auto resistance = XMLParser::AppendNode(doc, electricalProp, "Resistance");
+ XMLParser::SetNodeValue(doc, resistance, m_electricalData.resistance);
+ XMLParser::SetNodeAttribute(doc, resistance, "UnitID", m_electricalData.resistanceUnit);
+ auto indReactance = XMLParser::AppendNode(doc, electricalProp, "IndReactance");
+ XMLParser::SetNodeValue(doc, indReactance, m_electricalData.indReactance);
+ XMLParser::SetNodeAttribute(doc, indReactance, "UnitID", m_electricalData.indReactanceUnit);
+ auto connection = XMLParser::AppendNode(doc, electricalProp, "Connection");
+ XMLParser::SetNodeValue(doc, connection, m_electricalData.connection);
+ auto turnsRatio = XMLParser::AppendNode(doc, electricalProp, "TurnsRatio");
+ XMLParser::SetNodeValue(doc, turnsRatio, m_electricalData.turnsRatio);
+ auto phaseShift = XMLParser::AppendNode(doc, electricalProp, "PhaseShift");
+ XMLParser::SetNodeValue(doc, phaseShift, m_electricalData.phaseShift);
+ auto useTransformerPower = XMLParser::AppendNode(doc, electricalProp, "UseTransfomerPower");
+ XMLParser::SetNodeValue(doc, useTransformerPower, m_electricalData.useTransformerPower);
+
+ auto fault = XMLParser::AppendNode(doc, electricalProp, "Fault");
+ auto zeroResistance = XMLParser::AppendNode(doc, fault, "ZeroResistance");
+ XMLParser::SetNodeValue(doc, zeroResistance, m_electricalData.zeroResistance);
+ auto zeroIndReactance = XMLParser::AppendNode(doc, fault, "ZeroIndReactance");
+ XMLParser::SetNodeValue(doc, zeroIndReactance, m_electricalData.zeroIndReactance);
+ auto primaryGrndResistance = XMLParser::AppendNode(doc, fault, "PrimaryGrndResistance");
+ XMLParser::SetNodeValue(doc, primaryGrndResistance, m_electricalData.primaryGrndResistance);
+ auto primaryGrndReactance = XMLParser::AppendNode(doc, fault, "PrimaryGrndReactance");
+ XMLParser::SetNodeValue(doc, primaryGrndReactance, m_electricalData.primaryGrndReactance);
+ auto secondaryGrndResistance = XMLParser::AppendNode(doc, fault, "SecondaryGrndResistance");
+ XMLParser::SetNodeValue(doc, secondaryGrndResistance, m_electricalData.secondaryGrndResistance);
+ auto secondaryGrndReactance = XMLParser::AppendNode(doc, fault, "SecondaryGrndReactance");
+ XMLParser::SetNodeValue(doc, secondaryGrndReactance, m_electricalData.secondaryGrndReactance);
+
+ SaveSwitchingData(doc, electricalProp);
+
+ return elementNode;
+}
+
+bool Transformer::OpenElement(rapidxml::xml_node<>* elementNode, std::vector<Element*> parentList)
+{
+ auto cadPropNode = elementNode->first_node("CADProperties");
+ if(!cadPropNode) return false;
+
+ auto position = cadPropNode->first_node("Position");
+ double posX = XMLParser::GetNodeValueDouble(position, "X");
+ double posY = XMLParser::GetNodeValueDouble(position, "Y");
+ auto size = cadPropNode->first_node("Size");
+ m_width = XMLParser::GetNodeValueDouble(size, "Width");
+ m_height = XMLParser::GetNodeValueDouble(size, "Height");
+ double angle = XMLParser::GetNodeValueDouble(cadPropNode, "Angle");
+
+ // Get nodes points
+ std::vector<wxPoint2DDouble> ptsList;
+ auto nodePosList = cadPropNode->first_node("NodeList");
+ if(!nodePosList) return false;
+ auto nodePos = nodePosList->first_node("Node");
+ while(nodePos) {
+ double nodePosX = XMLParser::GetNodeValueDouble(nodePos, "X");
+ double nodePosY = XMLParser::GetNodeValueDouble(nodePos, "Y");
+ ptsList.push_back(wxPoint2DDouble(nodePosX, nodePosY));
+ nodePos = nodePos->next_sibling("Node");
+ }
+
+ // Get parents IDs
+ auto parentIDList = cadPropNode->first_node("ParentIDList");
+ if(!parentIDList) return false;
+ auto parentNode = parentIDList->first_node("ParentID");
+ long parentID[2] = {-1, -1};
+ while(parentNode) {
+ long index = 0;
+ wxString(parentNode->first_attribute("ID")->value()).ToLong(&index);
+ wxString(parentNode->value()).ToCLong(&parentID[index]);
+ parentNode = parentNode->next_sibling("ParentID");
+ }
+
+ std::vector<wxPoint2DDouble> nodePtsList; // List of node points
+ nodePtsList.push_back(ptsList[0]); // First point on the list
+ nodePtsList.push_back(ptsList[ptsList.size() - 1]); // Last point on the list
+
+ // List of dummy buses to set not connected nodes properly
+ std::vector<Bus*> dummyBusList;
+ // Set parents (if have)
+ for(unsigned int i = 0; i < 2; ++i) {
+ if(parentID[i] == -1) // No parent connected
+ {
+ Bus* dummyBus = new Bus(nodePtsList[i]);
+ dummyBusList.push_back(dummyBus);
+ AddParent(dummyBus, nodePtsList[i]);
+ } else { // Parent connected (necessarily a bus, get from bus list)
+ AddParent(parentList[parentID[i]], nodePtsList[i]);
+ }
+ }
+
+ StartMove(m_position);
+ Move(wxPoint2DDouble(posX, posY));
+
+ // Remove dummy buses
+ for(auto it = dummyBusList.begin(), itEnd = dummyBusList.end(); it != itEnd; ++it) {
+ RemoveParent(*it);
+ delete *it;
+ }
+ dummyBusList.clear();
+
+ // Set rotation properly.
+ int numRot = angle / GetRotationAngle();
+ bool clockwise = true;
+ if(numRot < 0) {
+ numRot = std::abs(numRot);
+ clockwise = false;
+ }
+ for(int i = 0; i < numRot; i++) Rotate(clockwise);
+
+ auto electricalProp = elementNode->first_node("ElectricalProperties");
+ if(!electricalProp) return false;
+
+ SetOnline(XMLParser::GetNodeValueInt(electricalProp, "IsOnline"));
+ m_electricalData.name = electricalProp->first_node("Name")->value();
+ m_electricalData.primaryNominalVoltage = XMLParser::GetNodeValueDouble(electricalProp, "PrimaryNominalVoltage");
+ m_electricalData.primaryNominalVoltageUnit =
+ static_cast<ElectricalUnit>(XMLParser::GetAttributeValueInt(electricalProp, "PrimaryNominalVoltage", "UnitID"));
+ m_electricalData.secondaryNominalVoltage = XMLParser::GetNodeValueDouble(electricalProp, "SecondaryNominalVoltage");
+ m_electricalData.secondaryNominalVoltageUnit = static_cast<ElectricalUnit>(
+ XMLParser::GetAttributeValueInt(electricalProp, "SecondaryNominalVoltage", "UnitID"));
+ m_electricalData.nominalPower = XMLParser::GetNodeValueDouble(electricalProp, "NominalPower");
+ m_electricalData.nominalPowerUnit =
+ static_cast<ElectricalUnit>(XMLParser::GetAttributeValueInt(electricalProp, "NominalPower", "UnitID"));
+ m_electricalData.resistance = XMLParser::GetNodeValueDouble(electricalProp, "Resistance");
+ m_electricalData.resistanceUnit =
+ static_cast<ElectricalUnit>(XMLParser::GetAttributeValueInt(electricalProp, "Resistance", "UnitID"));
+ m_electricalData.indReactance = XMLParser::GetNodeValueDouble(electricalProp, "IndReactance");
+ m_electricalData.indReactanceUnit =
+ static_cast<ElectricalUnit>(XMLParser::GetAttributeValueInt(electricalProp, "IndReactance", "UnitID"));
+ m_electricalData.connection = (TransformerConnection)XMLParser::GetNodeValueInt(electricalProp, "Connection");
+ m_electricalData.turnsRatio = XMLParser::GetNodeValueDouble(electricalProp, "TurnsRatio");
+ m_electricalData.phaseShift = XMLParser::GetNodeValueDouble(electricalProp, "PhaseShift");
+ m_electricalData.useTransformerPower = XMLParser::GetNodeValueInt(electricalProp, "UseTransfomerPower");
+
+ auto fault = electricalProp->first_node("Fault");
+ m_electricalData.zeroResistance = XMLParser::GetNodeValueDouble(fault, "ZeroResistance");
+ m_electricalData.zeroIndReactance = XMLParser::GetNodeValueDouble(fault, "ZeroIndReactance");
+ m_electricalData.primaryGrndResistance = XMLParser::GetNodeValueDouble(fault, "PrimaryGrndResistance");
+ m_electricalData.primaryGrndReactance = XMLParser::GetNodeValueDouble(fault, "PrimaryGrndReactance");
+ m_electricalData.secondaryGrndResistance = XMLParser::GetNodeValueDouble(fault, "SecondaryGrndResistance");
+ m_electricalData.secondaryGrndReactance = XMLParser::GetNodeValueDouble(fault, "SecondaryGrndReactance");
+
+ if(!OpenSwitchingData(electricalProp)) return false;
+ if(m_swData.swTime.size() != 0) SetDynamicEvent(true);
+
+ return true;
+}
diff --git a/Project/Transformer.h b/Project/Transformer.h
index 3b0d314..9a5d3d4 100644
--- a/Project/Transformer.h
+++ b/Project/Transformer.h
@@ -102,6 +102,9 @@ class Transformer : public Branch
virtual void SetElectricaData(TransformerElectricalData electricalData) { m_electricalData = electricalData; }
virtual void SetNominalVoltage(std::vector<double> nominalVoltage, std::vector<ElectricalUnit> nominalVoltageUnit);
+ virtual rapidxml::xml_node<>* SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode);
+ virtual bool OpenElement(rapidxml::xml_node<>* elementNode, std::vector<Element*> parentList);
+
protected:
void UpdatePowerFlowArrowsPosition();
TransformerElectricalData m_electricalData;
diff --git a/Project/XMLParser.h b/Project/XMLParser.h
index ee8f5a0..b66fe74 100644
--- a/Project/XMLParser.h
+++ b/Project/XMLParser.h
@@ -25,27 +25,42 @@
#include <wx/string.h>
+/**
+ * @class XMLParser
+ * @author Thales Lima Oliveira <thales@ufu.br>
+ * @date 08/01/2018
+ * @brief XML parser to save and open project and control files.
+ * @file XMLParser.h
+ */
class XMLParser
{
-public:
+ public:
XMLParser();
~XMLParser();
-
+
static rapidxml::xml_node<>* AppendNode(rapidxml::xml_document<>& doc,
- rapidxml::xml_node<>* parentNode,
- const char* name,
- rapidxml::node_type nodeType = rapidxml::node_element);
+ rapidxml::xml_node<>* parentNode,
+ const char* name,
+ rapidxml::node_type nodeType = rapidxml::node_element);
static void SetNodeValue(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* node, wxString value);
static void SetNodeValue(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* node, int value);
static void SetNodeValue(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* node, double value);
- static void SetNodeAttribute(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* node, const char* atrName, wxString value);
- static void SetNodeAttribute(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* node, const char* atrName, int value);
- static void SetNodeAttribute(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* node, const char* atrName, double value);
+ static void SetNodeAttribute(rapidxml::xml_document<>& doc,
+ rapidxml::xml_node<>* node,
+ const char* atrName,
+ wxString value);
+ static void SetNodeAttribute(rapidxml::xml_document<>& doc,
+ rapidxml::xml_node<>* node,
+ const char* atrName,
+ int value);
+ static void SetNodeAttribute(rapidxml::xml_document<>& doc,
+ rapidxml::xml_node<>* node,
+ const char* atrName,
+ double value);
static double GetNodeValueDouble(rapidxml::xml_node<>* parent, const char* nodeName);
static int GetNodeValueInt(rapidxml::xml_node<>* parent, const char* nodeName);
static int GetAttributeValueInt(rapidxml::xml_node<>* parent, const char* nodeName, const char* atrName);
static int GetAttributeValueInt(rapidxml::xml_node<>* node, const char* atrName);
-
};
-#endif // XMLPARSER_H
+#endif // XMLPARSER_H