diff options
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 |