summaryrefslogtreecommitdiffstats
path: root/Project/FileHanding.cpp
diff options
context:
space:
mode:
authorThales Lima Oliveira <thaleslima.ufu@gmail.com>2018-01-08 20:09:35 -0200
committerGitHub <noreply@github.com>2018-01-08 20:09:35 -0200
commit29af4e28898f44df444fef5534134c6b6000418d (patch)
tree13fd8f4449f2cfeed8a6185e96a6889f9529285d /Project/FileHanding.cpp
parent0c0280cfcf540f943fd2dbfdf7ac0304ea96a465 (diff)
parentc11a42ee83fcf535557d4f2cc259efae2da1b7ff (diff)
downloadPSP.git-29af4e28898f44df444fef5534134c6b6000418d.tar.gz
PSP.git-29af4e28898f44df444fef5534134c6b6000418d.tar.xz
PSP.git-29af4e28898f44df444fef5534134c6b6000418d.zip
Merge pull request #44 from Thales1330/org/file-handling-and-ctrl-init
Org file handling and ctrl init
Diffstat (limited to 'Project/FileHanding.cpp')
-rw-r--r--Project/FileHanding.cpp2658
1 files changed, 281 insertions, 2377 deletions
diff --git a/Project/FileHanding.cpp b/Project/FileHanding.cpp
index 7ef66c7..7262c57 100644
--- a/Project/FileHanding.cpp
+++ b/Project/FileHanding.cpp
@@ -41,849 +41,204 @@ void FileHanding::SaveProject(wxFileName path)
rapidxml::xml_node<>* rootNode = doc.allocate_node(rapidxml::node_element, "Project");
doc.append_node(rootNode);
- rapidxml::xml_node<>* projectNameNode = AppendNode(doc, rootNode, "Name");
- SetNodeValue(doc, projectNameNode, path.GetName());
+ rapidxml::xml_node<>* projectNameNode = XMLParser::AppendNode(doc, rootNode, "Name");
+ XMLParser::SetNodeValue(doc, projectNameNode, path.GetName());
//{ Simulation properties
PropertiesData* properties = m_workspace->GetProperties();
- auto propertiesNode = AppendNode(doc, rootNode, "Properties");
+ auto propertiesNode = XMLParser::AppendNode(doc, rootNode, "Properties");
SimulationData simulationData = properties->GetSimulationPropertiesData();
- auto simulationPropNode = AppendNode(doc, propertiesNode, "SimulationProperties");
-
- auto generalPropNode = AppendNode(doc, simulationPropNode, "General");
- auto basePower = AppendNode(doc, generalPropNode, "BasePower");
- SetNodeValue(doc, basePower, simulationData.basePower);
- SetNodeAttribute(doc, basePower, "UnitID", simulationData.basePowerUnit);
- auto contCalc = AppendNode(doc, generalPropNode, "ContinuousCalculation");
- auto contCalcFault = AppendNode(doc, contCalc, "Fault");
- SetNodeValue(doc, contCalcFault, simulationData.faultAfterPowerFlow);
- auto contCalcSCPower = AppendNode(doc, contCalc, "SCPower");
- SetNodeValue(doc, contCalcSCPower, simulationData.scPowerAfterPowerFlow);
-
- auto powerFlowPropNode = AppendNode(doc, simulationPropNode, "PowerFlow");
- auto solutionMethod = AppendNode(doc, powerFlowPropNode, "SolutionMethod");
- SetNodeValue(doc, solutionMethod, simulationData.powerFlowMethod);
- auto accFactor = AppendNode(doc, powerFlowPropNode, "AccFactor");
- SetNodeValue(doc, accFactor, simulationData.accFator);
- auto pfTolerance = AppendNode(doc, powerFlowPropNode, "Tolerance");
- SetNodeValue(doc, pfTolerance, simulationData.powerFlowTolerance);
- auto pfMaxIter = AppendNode(doc, powerFlowPropNode, "MaxIterations");
- SetNodeValue(doc, pfMaxIter, simulationData.powerFlowMaxIterations);
-
- auto stabilityPropNode = AppendNode(doc, simulationPropNode, "Stability");
- auto timeStep = AppendNode(doc, stabilityPropNode, "TimeStep");
- SetNodeValue(doc, timeStep, simulationData.timeStep);
- auto simTime = AppendNode(doc, stabilityPropNode, "SimulationTime");
- SetNodeValue(doc, simTime, simulationData.stabilitySimulationTime);
- auto freq = AppendNode(doc, stabilityPropNode, "Frequency");
- SetNodeValue(doc, freq, simulationData.stabilityFrequency);
- auto stabTolerance = AppendNode(doc, stabilityPropNode, "Tolerance");
- SetNodeValue(doc, stabTolerance, simulationData.stabilityTolerance);
- auto stabTMaxIter = AppendNode(doc, stabilityPropNode, "MaxIterations");
- SetNodeValue(doc, stabTMaxIter, simulationData.stabilityMaxIterations);
- auto controlRatio = AppendNode(doc, stabilityPropNode, "ControlStepRatio");
- SetNodeValue(doc, controlRatio, simulationData.controlTimeStepRatio);
- auto plotStep = AppendNode(doc, stabilityPropNode, "PlotStep");
- SetNodeValue(doc, plotStep, simulationData.plotTime);
- auto useCOI = AppendNode(doc, stabilityPropNode, "UseCOI");
- SetNodeValue(doc, useCOI, simulationData.useCOI);
-
- auto zipPropNode = AppendNode(doc, simulationPropNode, "ZIPLoad");
- auto useCompLoads = AppendNode(doc, zipPropNode, "UseCompositeLoad");
- SetNodeValue(doc, useCompLoads, simulationData.useCompLoads);
- auto activePowerComp = AppendNode(doc, zipPropNode, "ActivePowerComposition");
- auto pz = AppendNode(doc, activePowerComp, "ConstantImpedance");
- SetNodeValue(doc, pz, simulationData.constImpedanceActive);
- auto pi = AppendNode(doc, activePowerComp, "ConstantCurrent");
- SetNodeValue(doc, pi, simulationData.constCurrentActive);
- auto pp = AppendNode(doc, activePowerComp, "ConstantPower");
- SetNodeValue(doc, pp, simulationData.constPowerActive);
- auto reactivePowerComp = AppendNode(doc, zipPropNode, "ReactivePowerComposition");
- auto qz = AppendNode(doc, reactivePowerComp, "ConstantImpedance");
- SetNodeValue(doc, qz, simulationData.constImpedanceReactive);
- auto qi = AppendNode(doc, reactivePowerComp, "ConstantCurrent");
- SetNodeValue(doc, qi, simulationData.constCurrentReactive);
- auto qp = AppendNode(doc, reactivePowerComp, "ConstantPower");
- SetNodeValue(doc, qp, simulationData.constPowerReactive);
- auto undervoltageLim = AppendNode(doc, zipPropNode, "UndervoltageLimit");
- auto uvi = AppendNode(doc, undervoltageLim, "ConstantCurrent");
- SetNodeValue(doc, uvi, simulationData.underVoltageConstCurrent);
- auto uvp = AppendNode(doc, undervoltageLim, "ConstantPower");
- SetNodeValue(doc, uvp, simulationData.underVoltageConstPower);
+ auto simulationPropNode = XMLParser::XMLParser::AppendNode(doc, propertiesNode, "SimulationProperties");
+
+ auto generalPropNode = XMLParser::AppendNode(doc, simulationPropNode, "General");
+ auto basePower = XMLParser::AppendNode(doc, generalPropNode, "BasePower");
+ XMLParser::SetNodeValue(doc, basePower, simulationData.basePower);
+ XMLParser::SetNodeAttribute(doc, basePower, "UnitID", simulationData.basePowerUnit);
+ auto contCalc = XMLParser::AppendNode(doc, generalPropNode, "ContinuousCalculation");
+ auto contCalcFault = XMLParser::AppendNode(doc, contCalc, "Fault");
+ XMLParser::SetNodeValue(doc, contCalcFault, simulationData.faultAfterPowerFlow);
+ auto contCalcSCPower = XMLParser::AppendNode(doc, contCalc, "SCPower");
+ XMLParser::SetNodeValue(doc, contCalcSCPower, simulationData.scPowerAfterPowerFlow);
+
+ auto powerFlowPropNode = XMLParser::AppendNode(doc, simulationPropNode, "PowerFlow");
+ auto solutionMethod = XMLParser::AppendNode(doc, powerFlowPropNode, "SolutionMethod");
+ XMLParser::SetNodeValue(doc, solutionMethod, simulationData.powerFlowMethod);
+ auto accFactor = XMLParser::AppendNode(doc, powerFlowPropNode, "AccFactor");
+ XMLParser::SetNodeValue(doc, accFactor, simulationData.accFator);
+ auto pfTolerance = XMLParser::AppendNode(doc, powerFlowPropNode, "Tolerance");
+ XMLParser::SetNodeValue(doc, pfTolerance, simulationData.powerFlowTolerance);
+ auto pfMaxIter = XMLParser::AppendNode(doc, powerFlowPropNode, "MaxIterations");
+ XMLParser::SetNodeValue(doc, pfMaxIter, simulationData.powerFlowMaxIterations);
+
+ auto stabilityPropNode = XMLParser::AppendNode(doc, simulationPropNode, "Stability");
+ auto timeStep = XMLParser::AppendNode(doc, stabilityPropNode, "TimeStep");
+ XMLParser::SetNodeValue(doc, timeStep, simulationData.timeStep);
+ auto simTime = XMLParser::AppendNode(doc, stabilityPropNode, "SimulationTime");
+ XMLParser::SetNodeValue(doc, simTime, simulationData.stabilitySimulationTime);
+ auto freq = XMLParser::AppendNode(doc, stabilityPropNode, "Frequency");
+ XMLParser::SetNodeValue(doc, freq, simulationData.stabilityFrequency);
+ auto stabTolerance = XMLParser::AppendNode(doc, stabilityPropNode, "Tolerance");
+ XMLParser::SetNodeValue(doc, stabTolerance, simulationData.stabilityTolerance);
+ auto stabTMaxIter = XMLParser::AppendNode(doc, stabilityPropNode, "MaxIterations");
+ XMLParser::SetNodeValue(doc, stabTMaxIter, simulationData.stabilityMaxIterations);
+ auto controlRatio = XMLParser::AppendNode(doc, stabilityPropNode, "ControlStepRatio");
+ XMLParser::SetNodeValue(doc, controlRatio, simulationData.controlTimeStepRatio);
+ auto plotStep = XMLParser::AppendNode(doc, stabilityPropNode, "PlotStep");
+ XMLParser::SetNodeValue(doc, plotStep, simulationData.plotTime);
+ auto useCOI = XMLParser::AppendNode(doc, stabilityPropNode, "UseCOI");
+ XMLParser::SetNodeValue(doc, useCOI, simulationData.useCOI);
+
+ auto zipPropNode = XMLParser::AppendNode(doc, simulationPropNode, "ZIPLoad");
+ auto useCompLoads = XMLParser::AppendNode(doc, zipPropNode, "UseCompositeLoad");
+ XMLParser::SetNodeValue(doc, useCompLoads, simulationData.useCompLoads);
+ auto activePowerComp = XMLParser::AppendNode(doc, zipPropNode, "ActivePowerComposition");
+ auto pz = XMLParser::AppendNode(doc, activePowerComp, "ConstantImpedance");
+ XMLParser::SetNodeValue(doc, pz, simulationData.constImpedanceActive);
+ auto pi = XMLParser::AppendNode(doc, activePowerComp, "ConstantCurrent");
+ XMLParser::SetNodeValue(doc, pi, simulationData.constCurrentActive);
+ auto pp = XMLParser::AppendNode(doc, activePowerComp, "ConstantPower");
+ XMLParser::SetNodeValue(doc, pp, simulationData.constPowerActive);
+ auto reactivePowerComp = XMLParser::AppendNode(doc, zipPropNode, "ReactivePowerComposition");
+ auto qz = XMLParser::AppendNode(doc, reactivePowerComp, "ConstantImpedance");
+ XMLParser::SetNodeValue(doc, qz, simulationData.constImpedanceReactive);
+ auto qi = XMLParser::AppendNode(doc, reactivePowerComp, "ConstantCurrent");
+ XMLParser::SetNodeValue(doc, qi, simulationData.constCurrentReactive);
+ auto qp = XMLParser::AppendNode(doc, reactivePowerComp, "ConstantPower");
+ XMLParser::SetNodeValue(doc, qp, simulationData.constPowerReactive);
+ auto undervoltageLim = XMLParser::AppendNode(doc, zipPropNode, "UndervoltageLimit");
+ auto uvi = XMLParser::AppendNode(doc, undervoltageLim, "ConstantCurrent");
+ XMLParser::SetNodeValue(doc, uvi, simulationData.underVoltageConstCurrent);
+ auto uvp = XMLParser::AppendNode(doc, undervoltageLim, "ConstantPower");
+ XMLParser::SetNodeValue(doc, uvp, simulationData.underVoltageConstPower);
//}
- auto elementsNode = AppendNode(doc, rootNode, "Elements");
+ auto elementsNode = XMLParser::AppendNode(doc, rootNode, "Elements");
// Save all the data
ElectricCalculation allElements;
allElements.GetElementsFromList(m_workspace->GetElementList());
+ int elementID = 0;
//{ Buses
- auto busesNode = AppendNode(doc, elementsNode, "BusList");
+ auto busesNode = XMLParser::AppendNode(doc, elementsNode, "BusList");
auto busList = allElements.GetBusList();
- for(int i = 0; i < (int)busList.size(); i++) {
- Bus* bus = busList[i];
- auto busNode = AppendNode(doc, busesNode, "Bus");
- SetNodeAttribute(doc, busNode, "ID", i);
- auto cadProp = AppendNode(doc, busNode, "CADProperties");
- auto position = AppendNode(doc, cadProp, "Position");
- auto posX = AppendNode(doc, position, "X");
- SetNodeValue(doc, posX, bus->GetPosition().m_x);
- auto posY = AppendNode(doc, position, "Y");
- SetNodeValue(doc, posY, bus->GetPosition().m_y);
- auto size = AppendNode(doc, cadProp, "Size");
- auto width = AppendNode(doc, size, "Width");
- SetNodeValue(doc, width, bus->GetWidth());
- auto height = AppendNode(doc, size, "Height");
- SetNodeValue(doc, height, bus->GetHeight());
- auto angle = AppendNode(doc, cadProp, "Angle");
- SetNodeValue(doc, angle, bus->GetAngle());
-
- BusElectricalData data = bus->GetElectricalData();
- auto electricalProp = AppendNode(doc, busNode, "ElectricalProperties");
- auto name = AppendNode(doc, electricalProp, "Name");
- SetNodeValue(doc, name, data.name);
- auto nominalVoltage = AppendNode(doc, electricalProp, "NominalVoltage");
- SetNodeValue(doc, nominalVoltage, data.nominalVoltage);
- SetNodeAttribute(doc, nominalVoltage, "UnitID", data.nominalVoltageUnit);
- auto isVoltageControlled = AppendNode(doc, electricalProp, "IsVoltageControlled");
- SetNodeValue(doc, isVoltageControlled, data.isVoltageControlled);
- auto controlledVoltage = AppendNode(doc, electricalProp, "ControlledVoltage");
- SetNodeValue(doc, controlledVoltage, data.controlledVoltage);
- SetNodeAttribute(doc, controlledVoltage, "Choice", data.controlledVoltageUnitChoice);
- auto slackBus = AppendNode(doc, electricalProp, "SlackBus");
- SetNodeValue(doc, slackBus, data.slackBus);
-
- auto fault = AppendNode(doc, electricalProp, "Fault");
- auto hasFault = AppendNode(doc, fault, "HasFault");
- SetNodeValue(doc, hasFault, data.hasFault);
- auto faultType = AppendNode(doc, fault, "Type");
- SetNodeValue(doc, faultType, data.faultType);
- auto faultLocation = AppendNode(doc, fault, "Location");
- SetNodeValue(doc, faultLocation, data.faultLocation);
- auto faultResistance = AppendNode(doc, fault, "Resistance");
- SetNodeValue(doc, faultResistance, data.faultResistance);
- auto faultReactance = AppendNode(doc, fault, "Reactance");
- SetNodeValue(doc, faultReactance, data.faultReactance);
-
- auto stability = AppendNode(doc, electricalProp, "Stability");
- auto plotBus = AppendNode(doc, stability, "Plot");
- SetNodeValue(doc, plotBus, data.plotBus);
- auto stabHasFault = AppendNode(doc, stability, "HasFault");
- SetNodeValue(doc, stabHasFault, data.stabHasFault);
- auto stabFaultTime = AppendNode(doc, stability, "FaultTime");
- SetNodeValue(doc, stabFaultTime, data.stabFaultTime);
- auto stabFaultLength = AppendNode(doc, stability, "FaultLength");
- SetNodeValue(doc, stabFaultLength, data.stabFaultLength);
- auto stabFaultResistance = AppendNode(doc, stability, "FaultResistance");
- SetNodeValue(doc, stabFaultResistance, data.stabFaultResistance);
- auto stabFaultReactance = AppendNode(doc, stability, "FaultReactance");
- SetNodeValue(doc, stabFaultReactance, data.stabFaultReactance);
-
- data.number = i;
- bus->SetElectricalData(data);
- } //}
+ for(auto it = busList.begin(), itEnd = busList.end(); it != itEnd; ++it) {
+ (*it)->SetID(elementID);
+ (*it)->SaveElement(doc, busesNode);
+ elementID++;
+ }
+ //}
//{ Capacitor
- auto capacitorsNode = AppendNode(doc, elementsNode, "CapacitorList");
+ auto capacitorsNode = XMLParser::AppendNode(doc, elementsNode, "CapacitorList");
auto capacitorList = allElements.GetCapacitorList();
- for(int i = 0; i < (int)capacitorList.size(); i++) {
- Capacitor* capacitor = capacitorList[i];
- auto capacitorNode = AppendNode(doc, capacitorsNode, "Capacitor");
- SetNodeAttribute(doc, capacitorNode, "ID", i);
- auto cadProp = AppendNode(doc, capacitorNode, "CADProperties");
- auto position = AppendNode(doc, cadProp, "Position");
- auto posX = AppendNode(doc, position, "X");
- SetNodeValue(doc, posX, capacitor->GetPosition().m_x);
- auto posY = AppendNode(doc, position, "Y");
- SetNodeValue(doc, posY, capacitor->GetPosition().m_y);
- auto size = AppendNode(doc, cadProp, "Size");
- auto width = AppendNode(doc, size, "Width");
- SetNodeValue(doc, width, capacitor->GetWidth());
- auto height = AppendNode(doc, size, "Height");
- SetNodeValue(doc, height, capacitor->GetHeight());
- auto angle = AppendNode(doc, cadProp, "Angle");
- SetNodeValue(doc, angle, capacitor->GetAngle());
- auto nodePos = AppendNode(doc, cadProp, "NodePosition");
- auto nodePosX = AppendNode(doc, nodePos, "X");
- SetNodeValue(doc, nodePosX, capacitor->GetPointList()[0].m_x);
- auto nodePosY = AppendNode(doc, nodePos, "Y");
- SetNodeValue(doc, nodePosY, capacitor->GetPointList()[0].m_y);
- auto parentID = AppendNode(doc, cadProp, "ParentID");
- Bus* parent = static_cast<Bus*>(capacitor->GetParentList()[0]);
- if(parent) SetNodeValue(doc, parentID, parent->GetElectricalData().number);
-
- CapacitorElectricalData data = capacitor->GetElectricalData();
- auto electricalProp = AppendNode(doc, capacitorNode, "ElectricalProperties");
- auto isOnline = AppendNode(doc, electricalProp, "IsOnline");
- SetNodeValue(doc, isOnline, capacitor->IsOnline());
- auto name = AppendNode(doc, electricalProp, "Name");
- SetNodeValue(doc, name, data.name);
- auto reactivePower = AppendNode(doc, electricalProp, "ReactivePower");
- SetNodeValue(doc, reactivePower, data.reactivePower);
- SetNodeAttribute(doc, reactivePower, "UnitID", data.reactivePowerUnit);
-
- auto switchingList = AppendNode(doc, electricalProp, "SwitchingList");
- SwitchingData swData = capacitor->GetSwitchingData();
- for(int j = 0; j < (int)swData.swType.size(); j++) {
- auto switching = AppendNode(doc, switchingList, "Switching");
- SetNodeAttribute(doc, switching, "ID", j);
- auto swType = AppendNode(doc, switching, "Type");
- SetNodeValue(doc, swType, swData.swType[j]);
- auto swTime = AppendNode(doc, switching, "Time");
- SetNodeValue(doc, swTime, swData.swTime[j]);
- }
- } //}
+ elementID = 0;
+ for(auto it = capacitorList.begin(), itEnd = capacitorList.end(); it != itEnd; ++it) {
+ (*it)->SetID(elementID);
+ (*it)->SaveElement(doc, capacitorsNode);
+ elementID++;
+ }
+ //}
//{ IndMotor
- auto indMotorsNode = AppendNode(doc, elementsNode, "IndMotorList");
+ auto indMotorsNode = XMLParser::AppendNode(doc, elementsNode, "IndMotorList");
auto indMotorList = allElements.GetIndMotorList();
- for(int i = 0; i < (int)indMotorList.size(); i++) {
- IndMotor* indMotor = indMotorList[i];
- auto indMotorNode = AppendNode(doc, indMotorsNode, "IndMotor");
- SetNodeAttribute(doc, indMotorNode, "ID", i);
- auto cadProp = AppendNode(doc, indMotorNode, "CADProperties");
- auto position = AppendNode(doc, cadProp, "Position");
- auto posX = AppendNode(doc, position, "X");
- SetNodeValue(doc, posX, indMotor->GetPosition().m_x);
- auto posY = AppendNode(doc, position, "Y");
- SetNodeValue(doc, posY, indMotor->GetPosition().m_y);
- auto size = AppendNode(doc, cadProp, "Size");
- auto width = AppendNode(doc, size, "Width");
- SetNodeValue(doc, width, indMotor->GetWidth());
- auto height = AppendNode(doc, size, "Height");
- SetNodeValue(doc, height, indMotor->GetHeight());
- auto angle = AppendNode(doc, cadProp, "Angle");
- SetNodeValue(doc, angle, indMotor->GetAngle());
- auto nodePos = AppendNode(doc, cadProp, "NodePosition");
- auto nodePosX = AppendNode(doc, nodePos, "X");
- SetNodeValue(doc, nodePosX, indMotor->GetPointList()[0].m_x);
- auto nodePosY = AppendNode(doc, nodePos, "Y");
- SetNodeValue(doc, nodePosY, indMotor->GetPointList()[0].m_y);
- auto parentID = AppendNode(doc, cadProp, "ParentID");
- Bus* parent = static_cast<Bus*>(indMotor->GetParentList()[0]);
- if(parent) SetNodeValue(doc, parentID, parent->GetElectricalData().number);
-
- IndMotorElectricalData data = indMotor->GetElectricalData();
- auto electricalProp = AppendNode(doc, indMotorNode, "ElectricalProperties");
- auto isOnline = AppendNode(doc, electricalProp, "IsOnline");
- SetNodeValue(doc, isOnline, indMotor->IsOnline());
- auto name = AppendNode(doc, electricalProp, "Name");
- SetNodeValue(doc, name, data.name);
- auto activePower = AppendNode(doc, electricalProp, "ActivePower");
- SetNodeValue(doc, activePower, data.activePower);
- SetNodeAttribute(doc, activePower, "UnitID", data.activePowerUnit);
- auto reactivePower = AppendNode(doc, electricalProp, "ReactivePower");
- SetNodeValue(doc, reactivePower, data.reactivePower);
- SetNodeAttribute(doc, reactivePower, "UnitID", data.reactivePowerUnit);
- } //}
+ elementID = 0;
+ for(auto it = indMotorList.begin(), itEnd = indMotorList.end(); it != itEnd; ++it) {
+ (*it)->SetID(elementID);
+ (*it)->SaveElement(doc, indMotorsNode);
+ elementID++;
+ }
+ //}
//{ Inductor
- auto inductorsNode = AppendNode(doc, elementsNode, "InductorList");
+ 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 = AppendNode(doc, inductorsNode, "Inductor");
- SetNodeAttribute(doc, inductorNode, "ID", i);
- auto cadProp = AppendNode(doc, inductorNode, "CADProperties");
- auto position = AppendNode(doc, cadProp, "Position");
- auto posX = AppendNode(doc, position, "X");
- SetNodeValue(doc, posX, inductor->GetPosition().m_x);
- auto posY = AppendNode(doc, position, "Y");
- SetNodeValue(doc, posY, inductor->GetPosition().m_y);
- auto size = AppendNode(doc, cadProp, "Size");
- auto width = AppendNode(doc, size, "Width");
- SetNodeValue(doc, width, inductor->GetWidth());
- auto height = AppendNode(doc, size, "Height");
- SetNodeValue(doc, height, inductor->GetHeight());
- auto angle = AppendNode(doc, cadProp, "Angle");
- SetNodeValue(doc, angle, inductor->GetAngle());
- auto nodePos = AppendNode(doc, cadProp, "NodePosition");
- auto nodePosX = AppendNode(doc, nodePos, "X");
- SetNodeValue(doc, nodePosX, inductor->GetPointList()[0].m_x);
- auto nodePosY = AppendNode(doc, nodePos, "Y");
- SetNodeValue(doc, nodePosY, inductor->GetPointList()[0].m_y);
- auto parentID = AppendNode(doc, cadProp, "ParentID");
- Bus* parent = static_cast<Bus*>(inductor->GetParentList()[0]);
- if(parent) SetNodeValue(doc, parentID, parent->GetElectricalData().number);
-
- InductorElectricalData data = inductor->GetElectricalData();
- auto electricalProp = AppendNode(doc, inductorNode, "ElectricalProperties");
- auto isOnline = AppendNode(doc, electricalProp, "IsOnline");
- SetNodeValue(doc, isOnline, inductor->IsOnline());
- auto name = AppendNode(doc, electricalProp, "Name");
- SetNodeValue(doc, name, data.name);
- auto reactivePower = AppendNode(doc, electricalProp, "ReactivePower");
- SetNodeValue(doc, reactivePower, data.reactivePower);
- SetNodeAttribute(doc, reactivePower, "UnitID", data.reactivePowerUnit);
-
- auto switchingList = AppendNode(doc, electricalProp, "SwitchingList");
- SwitchingData swData = inductor->GetSwitchingData();
- for(int j = 0; j < (int)swData.swType.size(); j++) {
- auto switching = AppendNode(doc, switchingList, "Switching");
- SetNodeAttribute(doc, switching, "ID", j);
- auto swType = AppendNode(doc, switching, "Type");
- SetNodeValue(doc, swType, swData.swType[j]);
- auto swTime = AppendNode(doc, switching, "Time");
- 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 = AppendNode(doc, elementsNode, "LineList");
+ 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 = AppendNode(doc, linesNode, "Line");
- SetNodeAttribute(doc, lineNode, "ID", i);
- auto cadProp = AppendNode(doc, lineNode, "CADProperties");
- auto nodeList = 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 = AppendNode(doc, nodeList, "Node");
- SetNodeAttribute(doc, nodePos, "ID", nodeID);
- auto nodePosX = AppendNode(doc, nodePos, "X");
- SetNodeValue(doc, nodePosX, ptList[j].m_x);
- auto nodePosY = AppendNode(doc, nodePos, "Y");
- SetNodeValue(doc, nodePosY, ptList[j].m_y);
- nodeID++;
- }
- }
-
- auto parentIDList = 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 = AppendNode(doc, parentIDList, "ParentID");
- SetNodeAttribute(doc, parentID, "ID", j);
- SetNodeValue(doc, parentID, parent->GetElectricalData().number);
- }
- }
-
- LineElectricalData data = line->GetElectricalData();
- auto electricalProp = AppendNode(doc, lineNode, "ElectricalProperties");
- auto isOnline = AppendNode(doc, electricalProp, "IsOnline");
- SetNodeValue(doc, isOnline, line->IsOnline());
- auto name = AppendNode(doc, electricalProp, "Name");
- SetNodeValue(doc, name, data.name);
- auto nominalVoltage = AppendNode(doc, electricalProp, "NominalVoltage");
- SetNodeValue(doc, nominalVoltage, data.nominalVoltage);
- SetNodeAttribute(doc, nominalVoltage, "UnitID", data.nominalVoltageUnit);
- auto nominalPower = AppendNode(doc, electricalProp, "NominalPower");
- SetNodeValue(doc, nominalPower, data.nominalPower);
- SetNodeAttribute(doc, nominalPower, "UnitID", data.nominalPowerUnit);
- auto resistance = AppendNode(doc, electricalProp, "Resistance");
- SetNodeValue(doc, resistance, data.resistance);
- SetNodeAttribute(doc, resistance, "UnitID", data.resistanceUnit);
- auto indReactance = AppendNode(doc, electricalProp, "IndReactance");
- SetNodeValue(doc, indReactance, data.indReactance);
- SetNodeAttribute(doc, indReactance, "UnitID", data.indReactanceUnit);
- auto capSusceptance = AppendNode(doc, electricalProp, "CapSusceptance");
- SetNodeValue(doc, capSusceptance, data.capSusceptance);
- SetNodeAttribute(doc, capSusceptance, "UnitID", data.capSusceptanceUnit);
- auto lineSize = AppendNode(doc, electricalProp, "LineSize");
- SetNodeValue(doc, lineSize, data.lineSize);
- auto useLinePower = AppendNode(doc, electricalProp, "UseLinePower");
- SetNodeValue(doc, useLinePower, data.useLinePower);
-
- auto fault = AppendNode(doc, electricalProp, "Fault");
- auto zeroResistance = AppendNode(doc, fault, "ZeroResistance");
- SetNodeValue(doc, zeroResistance, data.zeroResistance);
- auto zeroIndReactance = AppendNode(doc, fault, "ZeroIndReactance");
- SetNodeValue(doc, zeroIndReactance, data.zeroIndReactance);
- auto zeroCapSusceptance = AppendNode(doc, fault, "ZeroCapSusceptance");
- SetNodeValue(doc, zeroCapSusceptance, data.zeroCapSusceptance);
-
- auto switchingList = AppendNode(doc, electricalProp, "SwitchingList");
- SwitchingData swData = line->GetSwitchingData();
- for(int j = 0; j < (int)swData.swType.size(); j++) {
- auto switching = AppendNode(doc, switchingList, "Switching");
- SetNodeAttribute(doc, switching, "ID", j);
- auto swType = AppendNode(doc, switching, "Type");
- SetNodeValue(doc, swType, swData.swType[j]);
- auto swTime = AppendNode(doc, switching, "Time");
- 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 = AppendNode(doc, elementsNode, "LoadList");
+ 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 = AppendNode(doc, loadsNode, "Load");
- SetNodeAttribute(doc, loadNode, "ID", i);
- auto cadProp = AppendNode(doc, loadNode, "CADProperties");
- auto position = AppendNode(doc, cadProp, "Position");
- auto posX = AppendNode(doc, position, "X");
- SetNodeValue(doc, posX, load->GetPosition().m_x);
- auto posY = AppendNode(doc, position, "Y");
- SetNodeValue(doc, posY, load->GetPosition().m_y);
- auto size = AppendNode(doc, cadProp, "Size");
- auto width = AppendNode(doc, size, "Width");
- SetNodeValue(doc, width, load->GetWidth());
- auto height = AppendNode(doc, size, "Height");
- SetNodeValue(doc, height, load->GetHeight());
- auto angle = AppendNode(doc, cadProp, "Angle");
- SetNodeValue(doc, angle, load->GetAngle());
- auto nodePos = AppendNode(doc, cadProp, "NodePosition");
- auto nodePosX = AppendNode(doc, nodePos, "X");
- SetNodeValue(doc, nodePosX, load->GetPointList()[0].m_x);
- auto nodePosY = AppendNode(doc, nodePos, "Y");
- SetNodeValue(doc, nodePosY, load->GetPointList()[0].m_y);
- auto parentID = AppendNode(doc, cadProp, "ParentID");
- Bus* parent = static_cast<Bus*>(load->GetParentList()[0]);
- if(parent) SetNodeValue(doc, parentID, parent->GetElectricalData().number);
-
- LoadElectricalData data = load->GetElectricalData();
- auto electricalProp = AppendNode(doc, loadNode, "ElectricalProperties");
- auto isOnline = AppendNode(doc, electricalProp, "IsOnline");
- SetNodeValue(doc, isOnline, load->IsOnline());
- auto name = AppendNode(doc, electricalProp, "Name");
- SetNodeValue(doc, name, data.name);
- auto activePower = AppendNode(doc, electricalProp, "ActivePower");
- SetNodeValue(doc, activePower, data.activePower);
- SetNodeAttribute(doc, activePower, "UnitID", data.activePowerUnit);
- auto reactivePower = AppendNode(doc, electricalProp, "ReactivePower");
- SetNodeValue(doc, reactivePower, data.reactivePower);
- SetNodeAttribute(doc, reactivePower, "UnitID", data.reactivePowerUnit);
- auto loadType = AppendNode(doc, electricalProp, "LoadType");
- SetNodeValue(doc, loadType, data.loadType);
-
- auto stability = AppendNode(doc, electricalProp, "Stability");
- auto plotLoad = AppendNode(doc, stability, "PlotLoad");
- SetNodeValue(doc, plotLoad, data.plotLoad);
- auto useCompLoad = AppendNode(doc, stability, "UseCompositeLoad");
- SetNodeValue(doc, useCompLoad, data.useCompLoad);
- auto activePowerCompl = AppendNode(doc, stability, "ActivePowerComposition");
- auto pzl = AppendNode(doc, activePowerCompl, "ConstantImpedance");
- SetNodeValue(doc, pzl, data.constImpedanceActive);
- auto pil = AppendNode(doc, activePowerCompl, "ConstantCurrent");
- SetNodeValue(doc, pil, data.constCurrentActive);
- auto ppl = AppendNode(doc, activePowerCompl, "ConstantPower");
- SetNodeValue(doc, ppl, data.constPowerActive);
- auto reactivePowerCompl = AppendNode(doc, stability, "ReactivePowerComposition");
- auto qzl = AppendNode(doc, reactivePowerCompl, "ConstantImpedance");
- SetNodeValue(doc, qzl, data.constImpedanceReactive);
- auto qil = AppendNode(doc, reactivePowerCompl, "ConstantCurrent");
- SetNodeValue(doc, qil, data.constCurrentReactive);
- auto qpl = AppendNode(doc, reactivePowerCompl, "ConstantPower");
- SetNodeValue(doc, qpl, data.constPowerReactive);
-
- auto switchingList = AppendNode(doc, electricalProp, "SwitchingList");
- SwitchingData swData = load->GetSwitchingData();
- for(int j = 0; j < (int)swData.swType.size(); j++) {
- auto switching = AppendNode(doc, switchingList, "Switching");
- SetNodeAttribute(doc, switching, "ID", j);
- auto swType = AppendNode(doc, switching, "Type");
- SetNodeValue(doc, swType, swData.swType[j]);
- auto swTime = AppendNode(doc, switching, "Time");
- 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 = AppendNode(doc, elementsNode, "SyncGeneratorList");
+ 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 = AppendNode(doc, syncGeneratorsNode, "SyncGenerator");
- SetNodeAttribute(doc, syncGeneratorNode, "ID", i);
- auto cadProp = AppendNode(doc, syncGeneratorNode, "CADProperties");
- auto position = AppendNode(doc, cadProp, "Position");
- auto posX = AppendNode(doc, position, "X");
- SetNodeValue(doc, posX, syncGenerator->GetPosition().m_x);
- auto posY = AppendNode(doc, position, "Y");
- SetNodeValue(doc, posY, syncGenerator->GetPosition().m_y);
- auto size = AppendNode(doc, cadProp, "Size");
- auto width = AppendNode(doc, size, "Width");
- SetNodeValue(doc, width, syncGenerator->GetWidth());
- auto height = AppendNode(doc, size, "Height");
- SetNodeValue(doc, height, syncGenerator->GetHeight());
- auto angle = AppendNode(doc, cadProp, "Angle");
- SetNodeValue(doc, angle, syncGenerator->GetAngle());
- auto nodePos = AppendNode(doc, cadProp, "NodePosition");
- auto nodePosX = AppendNode(doc, nodePos, "X");
- SetNodeValue(doc, nodePosX, syncGenerator->GetPointList()[0].m_x);
- auto nodePosY = AppendNode(doc, nodePos, "Y");
- SetNodeValue(doc, nodePosY, syncGenerator->GetPointList()[0].m_y);
- auto parentID = AppendNode(doc, cadProp, "ParentID");
- Bus* parent = static_cast<Bus*>(syncGenerator->GetParentList()[0]);
- if(parent) SetNodeValue(doc, parentID, parent->GetElectricalData().number);
-
- SyncGeneratorElectricalData data = syncGenerator->GetElectricalData();
- auto electricalProp = AppendNode(doc, syncGeneratorNode, "ElectricalProperties");
- auto isOnline = AppendNode(doc, electricalProp, "IsOnline");
- SetNodeValue(doc, isOnline, syncGenerator->IsOnline());
- auto name = AppendNode(doc, electricalProp, "Name");
- SetNodeValue(doc, name, data.name);
- auto nominalPower = AppendNode(doc, electricalProp, "NominalPower");
- SetNodeValue(doc, nominalPower, data.nominalPower);
- SetNodeAttribute(doc, nominalPower, "UnitID", data.nominalPowerUnit);
- auto nominalVoltage = AppendNode(doc, electricalProp, "NominalVoltage");
- SetNodeValue(doc, nominalVoltage, data.nominalVoltage);
- SetNodeAttribute(doc, nominalVoltage, "UnitID", data.nominalVoltageUnit);
- auto activePower = AppendNode(doc, electricalProp, "ActivePower");
- SetNodeValue(doc, activePower, data.activePower);
- SetNodeAttribute(doc, activePower, "UnitID", data.activePowerUnit);
- auto reactivePower = AppendNode(doc, electricalProp, "ReactivePower");
- SetNodeValue(doc, reactivePower, data.reactivePower);
- SetNodeAttribute(doc, reactivePower, "UnitID", data.reactivePowerUnit);
- auto haveMaxReactive = AppendNode(doc, electricalProp, "HaveMaxReactive");
- SetNodeValue(doc, haveMaxReactive, data.haveMaxReactive);
- auto maxReactive = AppendNode(doc, electricalProp, "MaxReactive");
- SetNodeValue(doc, maxReactive, data.maxReactive);
- SetNodeAttribute(doc, maxReactive, "UnitID", data.maxReactiveUnit);
- auto haveMinReactive = AppendNode(doc, electricalProp, "HaveMinReactive");
- SetNodeValue(doc, haveMinReactive, data.haveMinReactive);
- auto minReactive = AppendNode(doc, electricalProp, "MinReactive");
- SetNodeValue(doc, minReactive, data.minReactive);
- SetNodeAttribute(doc, minReactive, "UnitID", data.minReactiveUnit);
- auto useMachineBase = AppendNode(doc, electricalProp, "UseMachineBase");
- SetNodeValue(doc, useMachineBase, data.useMachineBase);
-
- auto fault = AppendNode(doc, electricalProp, "Fault");
- auto positiveResistance = AppendNode(doc, fault, "PositiveResistance");
- SetNodeValue(doc, positiveResistance, data.positiveResistance);
- auto positiveReactance = AppendNode(doc, fault, "PositiveReactance");
- SetNodeValue(doc, positiveReactance, data.positiveReactance);
- auto negativeResistance = AppendNode(doc, fault, "NegativeResistance");
- SetNodeValue(doc, negativeResistance, data.negativeResistance);
- auto negativeReactance = AppendNode(doc, fault, "NegativeReactance");
- SetNodeValue(doc, negativeReactance, data.negativeReactance);
- auto zeroResistance = AppendNode(doc, fault, "ZeroResistance");
- SetNodeValue(doc, zeroResistance, data.zeroResistance);
- auto zeroReactance = AppendNode(doc, fault, "ZeroReactance");
- SetNodeValue(doc, zeroReactance, data.zeroReactance);
- auto groundResistance = AppendNode(doc, fault, "GroundResistance");
- SetNodeValue(doc, groundResistance, data.groundResistance);
- auto groundReactance = AppendNode(doc, fault, "GroundReactance");
- SetNodeValue(doc, groundReactance, data.groundReactance);
- auto groundNeutral = AppendNode(doc, fault, "GroundNeutral");
- SetNodeValue(doc, groundNeutral, data.groundNeutral);
-
- auto stability = AppendNode(doc, electricalProp, "Stability");
- auto plotSyncMachine = AppendNode(doc, stability, "PlotSyncMachine");
- SetNodeValue(doc, plotSyncMachine, data.plotSyncMachine);
- auto inertia = AppendNode(doc, stability, "Inertia");
- SetNodeValue(doc, inertia, data.inertia);
- auto damping = AppendNode(doc, stability, "Damping");
- SetNodeValue(doc, damping, data.damping);
- auto useAVR = AppendNode(doc, stability, "UseAVR");
- SetNodeValue(doc, useAVR, data.useAVR);
- auto useSpeedGovernor = AppendNode(doc, stability, "UseSpeedGovernor");
- SetNodeValue(doc, useSpeedGovernor, data.useSpeedGovernor);
- auto armResistance = AppendNode(doc, stability, "ArmResistance");
- SetNodeValue(doc, armResistance, data.armResistance);
- auto potierReactance = AppendNode(doc, stability, "PotierReactance");
- SetNodeValue(doc, potierReactance, data.potierReactance);
- auto satFactor = AppendNode(doc, stability, "SatFactor");
- SetNodeValue(doc, satFactor, data.satFactor);
- auto syncXd = AppendNode(doc, stability, "SyncXd");
- SetNodeValue(doc, syncXd, data.syncXd);
- auto syncXq = AppendNode(doc, stability, "SyncXq");
- SetNodeValue(doc, syncXq, data.syncXq);
- auto transXd = AppendNode(doc, stability, "TransXd");
- SetNodeValue(doc, transXd, data.transXd);
- auto transXq = AppendNode(doc, stability, "TransXq");
- SetNodeValue(doc, transXq, data.transXq);
- auto transTd0 = AppendNode(doc, stability, "TransTd0");
- SetNodeValue(doc, transTd0, data.transTd0);
- auto transTq0 = AppendNode(doc, stability, "TransTq0");
- SetNodeValue(doc, transTq0, data.transTq0);
- auto subXd = AppendNode(doc, stability, "SubXd");
- SetNodeValue(doc, subXd, data.subXd);
- auto subXq = AppendNode(doc, stability, "SubXq");
- SetNodeValue(doc, subXq, data.subXq);
- auto subTd0 = AppendNode(doc, stability, "SubTd0");
- SetNodeValue(doc, subTd0, data.subTd0);
- auto subTq0 = AppendNode(doc, stability, "SubTq0");
- SetNodeValue(doc, subTq0, data.subTq0);
-
- auto avr = AppendNode(doc, stability, "AVR");
+ 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);
- auto speedGov = AppendNode(doc, stability, "SpeedGovernor");
+ auto speedGov = XMLParser::AppendNode(doc, stability, "SpeedGovernor");
if(data.speedGov) SaveControlElements(doc, speedGov, data.speedGov);
- auto switchingList = AppendNode(doc, electricalProp, "SwitchingList");
- SwitchingData swData = syncGenerator->GetSwitchingData();
- for(int j = 0; j < (int)swData.swType.size(); j++) {
- auto switching = AppendNode(doc, switchingList, "Switching");
- SetNodeAttribute(doc, switching, "ID", j);
- auto swType = AppendNode(doc, switching, "Type");
- SetNodeValue(doc, swType, swData.swType[j]);
- auto swTime = AppendNode(doc, switching, "Time");
- SetNodeValue(doc, swTime, swData.swTime[j]);
- }
- } //}
+ elementID++;
+ }
+ //}
//{ SyncMotor
- auto syncMotorsNode = AppendNode(doc, elementsNode, "SyncMotorList");
+ 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 = AppendNode(doc, syncMotorsNode, "SyncMotor");
- SetNodeAttribute(doc, syncMotorNode, "ID", i);
- auto cadProp = AppendNode(doc, syncMotorNode, "CADProperties");
- auto position = AppendNode(doc, cadProp, "Position");
- auto posX = AppendNode(doc, position, "X");
- SetNodeValue(doc, posX, syncMotor->GetPosition().m_x);
- auto posY = AppendNode(doc, position, "Y");
- SetNodeValue(doc, posY, syncMotor->GetPosition().m_y);
- auto size = AppendNode(doc, cadProp, "Size");
- auto width = AppendNode(doc, size, "Width");
- SetNodeValue(doc, width, syncMotor->GetWidth());
- auto height = AppendNode(doc, size, "Height");
- SetNodeValue(doc, height, syncMotor->GetHeight());
- auto angle = AppendNode(doc, cadProp, "Angle");
- SetNodeValue(doc, angle, syncMotor->GetAngle());
- auto nodePos = AppendNode(doc, cadProp, "NodePosition");
- auto nodePosX = AppendNode(doc, nodePos, "X");
- SetNodeValue(doc, nodePosX, syncMotor->GetPointList()[0].m_x);
- auto nodePosY = AppendNode(doc, nodePos, "Y");
- SetNodeValue(doc, nodePosY, syncMotor->GetPointList()[0].m_y);
- auto parentID = AppendNode(doc, cadProp, "ParentID");
- Bus* parent = static_cast<Bus*>(syncMotor->GetParentList()[0]);
- if(parent) SetNodeValue(doc, parentID, parent->GetElectricalData().number);
-
- SyncMotorElectricalData data = syncMotor->GetElectricalData();
- auto electricalProp = AppendNode(doc, syncMotorNode, "ElectricalProperties");
- auto isOnline = AppendNode(doc, electricalProp, "IsOnline");
- SetNodeValue(doc, isOnline, syncMotor->IsOnline());
- auto name = AppendNode(doc, electricalProp, "Name");
- SetNodeValue(doc, name, data.name);
- auto nominalPower = AppendNode(doc, electricalProp, "NominalPower");
- SetNodeValue(doc, nominalPower, data.nominalPower);
- SetNodeAttribute(doc, nominalPower, "UnitID", data.nominalPowerUnit);
- // auto nominalVoltage = AppendNode(doc, electricalProp, "NominalVoltage");
- // SetNodeValue(doc, nominalVoltage, data.nominalVoltage);
- // SetNodeAttribute(doc, nominalVoltage, "UnitID", data.nominalVoltageUnit);
- auto activePower = AppendNode(doc, electricalProp, "ActivePower");
- SetNodeValue(doc, activePower, data.activePower);
- SetNodeAttribute(doc, activePower, "UnitID", data.activePowerUnit);
- auto reactivePower = AppendNode(doc, electricalProp, "ReactivePower");
- SetNodeValue(doc, reactivePower, data.reactivePower);
- SetNodeAttribute(doc, reactivePower, "UnitID", data.reactivePowerUnit);
- auto haveMaxReactive = AppendNode(doc, electricalProp, "HaveMaxReactive");
- SetNodeValue(doc, haveMaxReactive, data.haveMaxReactive);
- auto maxReactive = AppendNode(doc, electricalProp, "MaxReactive");
- SetNodeValue(doc, maxReactive, data.maxReactive);
- SetNodeAttribute(doc, maxReactive, "UnitID", data.maxReactiveUnit);
- auto haveMinReactive = AppendNode(doc, electricalProp, "HaveMinReactive");
- SetNodeValue(doc, haveMinReactive, data.haveMinReactive);
- auto minReactive = AppendNode(doc, electricalProp, "MinReactive");
- SetNodeValue(doc, minReactive, data.minReactive);
- SetNodeAttribute(doc, minReactive, "UnitID", data.minReactiveUnit);
- auto useMachineBase = AppendNode(doc, electricalProp, "UseMachineBase");
- SetNodeValue(doc, useMachineBase, data.useMachineBase);
-
- auto fault = AppendNode(doc, electricalProp, "Fault");
- auto positiveResistance = AppendNode(doc, fault, "PositiveResistance");
- SetNodeValue(doc, positiveResistance, data.positiveResistance);
- auto positiveReactance = AppendNode(doc, fault, "PositiveReactance");
- SetNodeValue(doc, positiveReactance, data.positiveReactance);
- auto negativeResistance = AppendNode(doc, fault, "NegativeResistance");
- SetNodeValue(doc, negativeResistance, data.negativeResistance);
- auto negativeReactance = AppendNode(doc, fault, "NegativeReactance");
- SetNodeValue(doc, negativeReactance, data.negativeReactance);
- auto zeroResistance = AppendNode(doc, fault, "ZeroResistance");
- SetNodeValue(doc, zeroResistance, data.zeroResistance);
- auto zeroReactance = AppendNode(doc, fault, "ZeroReactance");
- SetNodeValue(doc, zeroReactance, data.zeroReactance);
- auto groundResistance = AppendNode(doc, fault, "GroundResistance");
- SetNodeValue(doc, groundResistance, data.groundResistance);
- auto groundReactance = AppendNode(doc, fault, "GroundReactance");
- SetNodeValue(doc, groundReactance, data.groundReactance);
- auto groundNeutral = AppendNode(doc, fault, "GroundNeutral");
- SetNodeValue(doc, groundNeutral, data.groundNeutral);
-
- // To future use...
- /*auto stability = AppendNode(doc, electricalProp, "Stability");
- auto plotSyncMachine = AppendNode(doc, stability, "PlotSyncMotor");
- SetNodeValue(doc, plotSyncMachine, data.plotSyncMachine);
- auto inertia = AppendNode(doc, stability, "Inertia");
- SetNodeValue(doc, inertia, data.inertia);
- auto damping = AppendNode(doc, stability, "Damping");
- SetNodeValue(doc, damping, data.damping);
- auto useAVR = AppendNode(doc, stability, "UseAVR");
- SetNodeValue(doc, useAVR, data.useAVR);
- auto armResistance = AppendNode(doc, stability, "ArmResistance");
- SetNodeValue(doc, armResistance, data.armResistance);
- auto potierReactance = AppendNode(doc, stability, "PotierReactance");
- SetNodeValue(doc, potierReactance, data.potierReactance);
- auto satFactor = AppendNode(doc, stability, "SatFactor");
- SetNodeValue(doc, satFactor, data.satFactor);
- auto syncXd = AppendNode(doc, stability, "SyncXd");
- SetNodeValue(doc, syncXd, data.syncXd);
- auto syncXq = AppendNode(doc, stability, "SyncXq");
- SetNodeValue(doc, syncXq, data.syncXq);
- auto transXd = AppendNode(doc, stability, "TransXd");
- SetNodeValue(doc, transXd, data.transXd);
- auto transXq = AppendNode(doc, stability, "TransXq");
- SetNodeValue(doc, transXq, data.transXq);
- auto transTd0 = AppendNode(doc, stability, "TransTd0");
- SetNodeValue(doc, transTd0, data.transTd0);
- auto transTq0 = AppendNode(doc, stability, "TransTq0");
- SetNodeValue(doc, transTq0, data.transTq0);
- auto subXd = AppendNode(doc, stability, "SubXd");
- SetNodeValue(doc, subXd, data.subXd);
- auto subXq = AppendNode(doc, stability, "SubXq");
- SetNodeValue(doc, subXq, data.subXq);
- auto subTd0 = AppendNode(doc, stability, "SubTd0");
- SetNodeValue(doc, subTd0, data.subTd0);
- auto subTq0 = AppendNode(doc, stability, "SubTq0");
- SetNodeValue(doc, subTq0, data.subTq0);
-
- auto switchingList = AppendNode(doc, electricalProp, "SwitchingList");
- SwitchingData swData = syncGenerator->GetSwitchingData();
- for(int j = 0; j < (int)swData.swType.size(); j++) {
- auto switching = AppendNode(doc, switchingList, "Switching");
- SetNodeAttribute(doc, switching, "ID", j);
- auto swType = AppendNode(doc, switching, "Type");
- SetNodeValue(doc, swType, swData.swType[j]);
- auto swTime = AppendNode(doc, switching, "Time");
- 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 = AppendNode(doc, elementsNode, "TransformerList");
+ 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 = AppendNode(doc, transformersNode, "Transfomer");
- SetNodeAttribute(doc, transformerNode, "ID", i);
- auto cadProp = AppendNode(doc, transformerNode, "CADProperties");
- auto position = AppendNode(doc, cadProp, "Position");
- auto posX = AppendNode(doc, position, "X");
- SetNodeValue(doc, posX, transfomer->GetPosition().m_x);
- auto posY = AppendNode(doc, position, "Y");
- SetNodeValue(doc, posY, transfomer->GetPosition().m_y);
- auto size = AppendNode(doc, cadProp, "Size");
- auto width = AppendNode(doc, size, "Width");
- SetNodeValue(doc, width, transfomer->GetWidth());
- auto height = AppendNode(doc, size, "Height");
- SetNodeValue(doc, height, transfomer->GetHeight());
- auto angle = AppendNode(doc, cadProp, "Angle");
- SetNodeValue(doc, angle, transfomer->GetAngle());
- auto nodeList = AppendNode(doc, cadProp, "NodeList");
- auto nodePos1 = AppendNode(doc, nodeList, "Node");
- SetNodeAttribute(doc, nodePos1, "ID", 0);
- auto nodePosX1 = AppendNode(doc, nodePos1, "X");
- SetNodeValue(doc, nodePosX1, transfomer->GetPointList()[0].m_x);
- auto nodePosY1 = AppendNode(doc, nodePos1, "Y");
- SetNodeValue(doc, nodePosY1, transfomer->GetPointList()[0].m_y);
- auto nodePos2 = AppendNode(doc, nodeList, "Node");
- SetNodeAttribute(doc, nodePos2, "ID", 1);
- auto nodePosX2 = AppendNode(doc, nodePos2, "X");
- SetNodeValue(doc, nodePosX2, transfomer->GetPointList()[transfomer->GetPointList().size() - 1].m_x);
- auto nodePosY2 = AppendNode(doc, nodePos2, "Y");
- SetNodeValue(doc, nodePosY2, transfomer->GetPointList()[transfomer->GetPointList().size() - 1].m_y);
-
- auto parentIDList = 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 = AppendNode(doc, parentIDList, "ParentID");
- SetNodeAttribute(doc, parentID, "ID", j);
- SetNodeValue(doc, parentID, parent->GetElectricalData().number);
- }
- }
-
- TransformerElectricalData data = transfomer->GetElectricalData();
- auto electricalProp = AppendNode(doc, transformerNode, "ElectricalProperties");
- auto isOnline = AppendNode(doc, electricalProp, "IsOnline");
- SetNodeValue(doc, isOnline, transfomer->IsOnline());
- auto name = AppendNode(doc, electricalProp, "Name");
- SetNodeValue(doc, name, data.name);
- auto primaryNominalVoltage = AppendNode(doc, electricalProp, "PrimaryNominalVoltage");
- SetNodeValue(doc, primaryNominalVoltage, data.primaryNominalVoltage);
- SetNodeAttribute(doc, primaryNominalVoltage, "UnitID", data.primaryNominalVoltageUnit);
- auto secondaryNominalVoltage = AppendNode(doc, electricalProp, "SecondaryNominalVoltage");
- SetNodeValue(doc, secondaryNominalVoltage, data.secondaryNominalVoltage);
- SetNodeAttribute(doc, secondaryNominalVoltage, "UnitID", data.secondaryNominalVoltageUnit);
- auto nominalPower = AppendNode(doc, electricalProp, "NominalPower");
- SetNodeValue(doc, nominalPower, data.nominalPower);
- SetNodeAttribute(doc, nominalPower, "UnitID", data.nominalPowerUnit);
- auto resistance = AppendNode(doc, electricalProp, "Resistance");
- SetNodeValue(doc, resistance, data.resistance);
- SetNodeAttribute(doc, resistance, "UnitID", data.resistanceUnit);
- auto indReactance = AppendNode(doc, electricalProp, "IndReactance");
- SetNodeValue(doc, indReactance, data.indReactance);
- SetNodeAttribute(doc, indReactance, "UnitID", data.indReactanceUnit);
- auto connection = AppendNode(doc, electricalProp, "Connection");
- SetNodeValue(doc, connection, data.connection);
- auto turnsRatio = AppendNode(doc, electricalProp, "TurnsRatio");
- SetNodeValue(doc, turnsRatio, data.turnsRatio);
- auto phaseShift = AppendNode(doc, electricalProp, "PhaseShift");
- SetNodeValue(doc, phaseShift, data.phaseShift);
- auto useTransformerPower = AppendNode(doc, electricalProp, "UseTransfomerPower");
- SetNodeValue(doc, useTransformerPower, data.useTransformerPower);
-
- auto fault = AppendNode(doc, electricalProp, "Fault");
- auto zeroResistance = AppendNode(doc, fault, "ZeroResistance");
- SetNodeValue(doc, zeroResistance, data.zeroResistance);
- auto zeroIndReactance = AppendNode(doc, fault, "ZeroIndReactance");
- SetNodeValue(doc, zeroIndReactance, data.zeroIndReactance);
- auto primaryGrndResistance = AppendNode(doc, fault, "PrimaryGrndResistance");
- SetNodeValue(doc, primaryGrndResistance, data.primaryGrndResistance);
- auto primaryGrndReactance = AppendNode(doc, fault, "PrimaryGrndReactance");
- SetNodeValue(doc, primaryGrndReactance, data.primaryGrndReactance);
- auto secondaryGrndResistance = AppendNode(doc, fault, "SecondaryGrndResistance");
- SetNodeValue(doc, secondaryGrndResistance, data.secondaryGrndResistance);
- auto secondaryGrndReactance = AppendNode(doc, fault, "SecondaryGrndReactance");
- SetNodeValue(doc, secondaryGrndReactance, data.secondaryGrndReactance);
-
- auto switchingList = AppendNode(doc, electricalProp, "SwitchingList");
- SwitchingData swData = transfomer->GetSwitchingData();
- for(int j = 0; j < (int)swData.swType.size(); j++) {
- auto switching = AppendNode(doc, switchingList, "Switching");
- SetNodeAttribute(doc, switching, "ID", j);
- auto swType = AppendNode(doc, switching, "Type");
- SetNodeValue(doc, swType, swData.swType[j]);
- auto swTime = AppendNode(doc, switching, "Time");
- 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 = AppendNode(doc, elementsNode, "TextList");
+ 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 = AppendNode(doc, textsNode, "Text");
- SetNodeAttribute(doc, textNode, "ID", i);
- auto cadProp = AppendNode(doc, textNode, "CADProperties");
- auto position = AppendNode(doc, cadProp, "Position");
- auto posX = AppendNode(doc, position, "X");
- SetNodeValue(doc, posX, text->GetPosition().m_x);
- auto posY = AppendNode(doc, position, "Y");
- SetNodeValue(doc, posY, text->GetPosition().m_y);
- auto size = AppendNode(doc, cadProp, "Size");
- auto width = AppendNode(doc, size, "Width");
- SetNodeValue(doc, width, text->GetWidth());
- auto height = AppendNode(doc, size, "Height");
- SetNodeValue(doc, height, text->GetHeight());
- auto angle = AppendNode(doc, cadProp, "Angle");
- SetNodeValue(doc, angle, text->GetAngle());
- auto textProperties = AppendNode(doc, textNode, "TextProperties");
- auto elementType = AppendNode(doc, textProperties, "ElementType");
- SetNodeValue(doc, elementType, text->GetElementType());
- auto elementNumber = AppendNode(doc, textProperties, "ElementNumber");
- SetNodeValue(doc, elementNumber, text->GetElementNumber());
- auto dataType = AppendNode(doc, textProperties, "DataType");
- SetNodeValue(doc, dataType, text->GetDataType());
- auto dataUnit = AppendNode(doc, textProperties, "DataUnit");
- SetNodeValue(doc, dataUnit, text->GetUnit());
- auto direction = AppendNode(doc, textProperties, "Direction");
- SetNodeValue(doc, direction, text->GetDirection());
- auto decimalPlaces = AppendNode(doc, textProperties, "DecimalPlaces");
- 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++;
}
//}
@@ -908,54 +263,56 @@ bool FileHanding::OpenProject(wxFileName path)
PropertiesData* propData = m_workspace->GetProperties();
SimulationData simData = propData->GetSimulationPropertiesData();
- // { Properties data
+ //{ Properties data
auto propertiesNode = projectNode->first_node("Properties");
if(propertiesNode) {
auto simPropertiesNode = propertiesNode->first_node("SimulationProperties");
if(simPropertiesNode) {
// General
auto general = simPropertiesNode->first_node("General");
- simData.basePower = GetNodeValueDouble(general, "BasePower");
- simData.basePowerUnit = static_cast<ElectricalUnit>(GetAttributeValueInt(general, "BasePower", "UnitID"));
+ simData.basePower = XMLParser::GetNodeValueDouble(general, "BasePower");
+ simData.basePowerUnit =
+ static_cast<ElectricalUnit>(XMLParser::GetAttributeValueInt(general, "BasePower", "UnitID"));
auto contCalc = general->first_node("ContinuousCalculation");
- simData.faultAfterPowerFlow = GetNodeValueInt(contCalc, "Fault");
- simData.scPowerAfterPowerFlow = GetNodeValueInt(contCalc, "SCPower");
+ simData.faultAfterPowerFlow = XMLParser::GetNodeValueInt(contCalc, "Fault");
+ simData.scPowerAfterPowerFlow = XMLParser::GetNodeValueInt(contCalc, "SCPower");
// Power flow
auto powerFlow = simPropertiesNode->first_node("PowerFlow");
- simData.powerFlowMethod = static_cast<PowerFlowMethod>(GetNodeValueInt(powerFlow, "SolutionMethod"));
- simData.accFator = GetNodeValueDouble(powerFlow, "AccFactor");
- simData.powerFlowTolerance = GetNodeValueDouble(powerFlow, "Tolerance");
- simData.powerFlowMaxIterations = GetNodeValueInt(powerFlow, "MaxIterations");
+ simData.powerFlowMethod =
+ static_cast<PowerFlowMethod>(XMLParser::GetNodeValueInt(powerFlow, "SolutionMethod"));
+ simData.accFator = XMLParser::GetNodeValueDouble(powerFlow, "AccFactor");
+ simData.powerFlowTolerance = XMLParser::GetNodeValueDouble(powerFlow, "Tolerance");
+ simData.powerFlowMaxIterations = XMLParser::GetNodeValueInt(powerFlow, "MaxIterations");
// Stability
auto stability = simPropertiesNode->first_node("Stability");
- simData.timeStep = GetNodeValueDouble(stability, "TimeStep");
- simData.stabilitySimulationTime = GetNodeValueDouble(stability, "SimulationTime");
- simData.stabilityFrequency = GetNodeValueDouble(stability, "Frequency");
- simData.stabilityTolerance = GetNodeValueDouble(stability, "Tolerance");
- simData.stabilityMaxIterations = GetNodeValueDouble(stability, "MaxIterations");
- simData.controlTimeStepRatio = GetNodeValueInt(stability, "ControlStepRatio");
- simData.plotTime = GetNodeValueDouble(stability, "PlotStep");
- simData.useCOI = GetNodeValueInt(stability, "UseCOI");
+ simData.timeStep = XMLParser::GetNodeValueDouble(stability, "TimeStep");
+ simData.stabilitySimulationTime = XMLParser::GetNodeValueDouble(stability, "SimulationTime");
+ simData.stabilityFrequency = XMLParser::GetNodeValueDouble(stability, "Frequency");
+ simData.stabilityTolerance = XMLParser::GetNodeValueDouble(stability, "Tolerance");
+ simData.stabilityMaxIterations = XMLParser::GetNodeValueDouble(stability, "MaxIterations");
+ simData.controlTimeStepRatio = XMLParser::GetNodeValueInt(stability, "ControlStepRatio");
+ simData.plotTime = XMLParser::GetNodeValueDouble(stability, "PlotStep");
+ simData.useCOI = XMLParser::GetNodeValueInt(stability, "UseCOI");
// ZIP load
auto compLoads = simPropertiesNode->first_node("ZIPLoad");
- simData.useCompLoads = GetNodeValueInt(compLoads, "UseCompositeLoad");
+ simData.useCompLoads = XMLParser::GetNodeValueInt(compLoads, "UseCompositeLoad");
auto activePowerComp = compLoads->first_node("ActivePowerComposition");
- simData.constImpedanceActive = GetNodeValueDouble(activePowerComp, "ConstantImpedance");
- simData.constCurrentActive = GetNodeValueDouble(activePowerComp, "ConstantCurrent");
- simData.constPowerActive = GetNodeValueDouble(activePowerComp, "ConstantPower");
+ simData.constImpedanceActive = XMLParser::GetNodeValueDouble(activePowerComp, "ConstantImpedance");
+ simData.constCurrentActive = XMLParser::GetNodeValueDouble(activePowerComp, "ConstantCurrent");
+ simData.constPowerActive = XMLParser::GetNodeValueDouble(activePowerComp, "ConstantPower");
auto reactivePowerComp = compLoads->first_node("ReactivePowerComposition");
- simData.constImpedanceReactive = GetNodeValueDouble(reactivePowerComp, "ConstantImpedance");
- simData.constCurrentReactive = GetNodeValueDouble(reactivePowerComp, "ConstantCurrent");
- simData.constPowerReactive = GetNodeValueDouble(reactivePowerComp, "ConstantPower");
+ simData.constImpedanceReactive = XMLParser::GetNodeValueDouble(reactivePowerComp, "ConstantImpedance");
+ simData.constCurrentReactive = XMLParser::GetNodeValueDouble(reactivePowerComp, "ConstantCurrent");
+ simData.constPowerReactive = XMLParser::GetNodeValueDouble(reactivePowerComp, "ConstantPower");
auto uvLimit = compLoads->first_node("UndervoltageLimit");
- simData.underVoltageConstCurrent = GetNodeValueDouble(uvLimit, "ConstantCurrent");
- simData.underVoltageConstPower = GetNodeValueDouble(uvLimit, "ConstantPower");
+ simData.underVoltageConstCurrent = XMLParser::GetNodeValueDouble(uvLimit, "ConstantCurrent");
+ simData.underVoltageConstPower = XMLParser::GetNodeValueDouble(uvLimit, "ConstantPower");
}
}
- // }
+ //}
propData->SetSimulationPropertiesData(simData);
@@ -975,65 +332,21 @@ bool FileHanding::OpenProject(wxFileName path)
std::vector<Transformer*> transformerList;
std::vector<Text*> textList;
+ // List of parents
+ std::vector<Element*> parentList;
+
//{ Bus
auto busListNode = elementsNode->first_node("BusList");
if(!busListNode) return false;
auto busNode = busListNode->first_node("Bus");
while(busNode) {
- auto cadPropNode = busNode->first_node("CADProperties");
- if(!cadPropNode) return false;
-
- auto position = cadPropNode->first_node("Position");
- double posX = GetNodeValueDouble(position, "X");
- double posY = GetNodeValueDouble(position, "Y");
- Bus* bus = new Bus(wxPoint2DDouble(posX, posY));
-
- auto size = cadPropNode->first_node("Size");
- double width = GetNodeValueDouble(size, "Width");
- double height = GetNodeValueDouble(size, "Height");
- double angle = GetNodeValueDouble(cadPropNode, "Angle");
- bus->SetWidth(width);
- bus->SetHeight(height);
- bus->SetPosition(bus->GetPosition()); // Update bus rectangle.
- int numRot = angle / bus->GetRotationAngle();
- bool clockwise = true;
- if(numRot < 0) {
- numRot = std::abs(numRot);
- clockwise = false;
- }
- for(int i = 0; i < numRot; i++) bus->Rotate(clockwise);
-
- BusElectricalData data = bus->GetElectricalData();
- auto electricalProp = busNode->first_node("ElectricalProperties");
- if(!electricalProp) return false;
-
- data.name = electricalProp->first_node("Name")->value();
- data.nominalVoltage = GetNodeValueDouble(electricalProp, "NominalVoltage");
- data.nominalVoltageUnit = (ElectricalUnit)GetAttributeValueInt(electricalProp, "NominalVoltage", "UnitID");
- data.isVoltageControlled = GetNodeValueInt(electricalProp, "IsVoltageControlled");
- data.controlledVoltage = GetNodeValueDouble(electricalProp, "ControlledVoltage");
- data.controlledVoltageUnitChoice = GetAttributeValueInt(electricalProp, "ControlledVoltage", "Choice");
- data.slackBus = GetNodeValueInt(electricalProp, "SlackBus");
- auto fault = electricalProp->first_node("Fault");
- data.hasFault = GetNodeValueInt(fault, "HasFault");
- data.faultType = (FaultData)GetNodeValueInt(fault, "Type");
- data.faultLocation = (FaultData)GetNodeValueInt(fault, "Location");
- data.faultResistance = GetNodeValueDouble(fault, "Resistance");
- data.faultReactance = GetNodeValueDouble(fault, "Reactance");
- auto stability = electricalProp->first_node("Stability");
- data.plotBus = GetNodeValueInt(stability, "Plot");
- data.stabHasFault = GetNodeValueInt(stability, "HasFault");
- data.stabFaultTime = GetNodeValueDouble(stability, "FaultTime");
- data.stabFaultLength = GetNodeValueDouble(stability, "FaultLength");
- data.stabFaultResistance = GetNodeValueDouble(stability, "FaultResistance");
- data.stabFaultReactance = GetNodeValueDouble(stability, "FaultReactance");
-
- bus->SetElectricalData(data);
-
- if(data.stabHasFault) bus->SetDynamicEvent(true);
+ 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");
} //}
@@ -1044,71 +357,10 @@ bool FileHanding::OpenProject(wxFileName path)
while(capacitorNode) {
Capacitor* capacitor = new Capacitor();
- auto cadPropNode = capacitorNode->first_node("CADProperties");
- if(!cadPropNode) return false;
-
- auto position = cadPropNode->first_node("Position");
- double posX = GetNodeValueDouble(position, "X");
- double posY = GetNodeValueDouble(position, "Y");
- auto size = cadPropNode->first_node("Size");
- double width = GetNodeValueDouble(size, "Width");
- double height = GetNodeValueDouble(size, "Height");
- double angle = GetNodeValueDouble(cadPropNode, "Angle");
- auto nodePosition = cadPropNode->first_node("NodePosition");
- double nodePosX = GetNodeValueDouble(nodePosition, "X");
- double nodePosY = GetNodeValueDouble(nodePosition, "Y");
- int parentID = 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));
- capacitor->AddParent(parent, wxPoint2DDouble(nodePosX, nodePosY));
- capacitor->StartMove(capacitor->GetPosition());
- capacitor->Move(wxPoint2DDouble(posX, posY));
- capacitor->RemoveParent(parent);
- delete parent;
- } else {
- Bus* parent = busList[parentID];
- capacitor->AddParent(parent, wxPoint2DDouble(nodePosX, nodePosY));
- capacitor->StartMove(capacitor->GetPosition());
- capacitor->Move(wxPoint2DDouble(posX, posY));
- }
- capacitor->SetWidth(width);
- capacitor->SetHeight(height);
-
- int numRot = angle / capacitor->GetRotationAngle();
- bool clockwise = true;
- if(numRot < 0) {
- numRot = std::abs(numRot);
- clockwise = false;
- }
- for(int i = 0; i < numRot; i++) capacitor->Rotate(clockwise);
-
- auto electricalProp = capacitorNode->first_node("ElectricalProperties");
- if(!electricalProp) return false;
-
- capacitor->SetOnline(GetNodeValueInt(electricalProp, "IsOnline"));
- CapacitorElectricalData data = capacitor->GetElectricalData();
- data.name = electricalProp->first_node("Name")->value();
- data.reactivePower = GetNodeValueDouble(electricalProp, "ReactivePower");
- data.reactivePowerUnit = (ElectricalUnit)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)GetNodeValueInt(swNode, "Type"));
- swData.swTime.push_back(GetNodeValueDouble(swNode, "Time"));
- swNode = swNode->next_sibling("Switching");
- }
- capacitor->SetSwitchingData(swData);
-
- capacitor->SetElectricalData(data);
-
- if(swData.swTime.size() != 0) capacitor->SetDynamicEvent(true);
-
+ if(!capacitor->OpenElement(capacitorNode, parentList)) return false;
elementList.push_back(capacitor);
capacitorList.push_back(capacitor);
+
capacitorNode = capacitorNode->next_sibling("Capacitor");
} //}
@@ -1119,59 +371,10 @@ bool FileHanding::OpenProject(wxFileName path)
while(indMotorNode) {
IndMotor* indMotor = new IndMotor();
- auto cadPropNode = indMotorNode->first_node("CADProperties");
- if(!cadPropNode) return false;
-
- auto position = cadPropNode->first_node("Position");
- double posX = GetNodeValueDouble(position, "X");
- double posY = GetNodeValueDouble(position, "Y");
- auto size = cadPropNode->first_node("Size");
- double width = GetNodeValueDouble(size, "Width");
- double height = GetNodeValueDouble(size, "Height");
- double angle = GetNodeValueDouble(cadPropNode, "Angle");
- auto nodePosition = cadPropNode->first_node("NodePosition");
- double nodePosX = GetNodeValueDouble(nodePosition, "X");
- double nodePosY = GetNodeValueDouble(nodePosition, "Y");
- int parentID = 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));
- indMotor->AddParent(parent, wxPoint2DDouble(nodePosX, nodePosY));
- indMotor->StartMove(indMotor->GetPosition());
- indMotor->Move(wxPoint2DDouble(posX, posY));
- indMotor->RemoveParent(parent);
- delete parent;
- } else {
- Bus* parent = busList[parentID];
- indMotor->AddParent(parent, wxPoint2DDouble(nodePosX, nodePosY));
- indMotor->StartMove(indMotor->GetPosition());
- indMotor->Move(wxPoint2DDouble(posX, posY));
- }
- indMotor->SetWidth(width);
- indMotor->SetHeight(height);
-
- int numRot = angle / indMotor->GetRotationAngle();
- bool clockwise = true;
- if(numRot < 0) {
- numRot = std::abs(numRot);
- clockwise = false;
- }
- for(int i = 0; i < numRot; i++) indMotor->Rotate(clockwise);
-
- auto electricalProp = indMotorNode->first_node("ElectricalProperties");
- if(!electricalProp) return false;
-
- indMotor->SetOnline(GetNodeValueInt(electricalProp, "IsOnline"));
- IndMotorElectricalData data = indMotor->GetElectricalData();
- data.name = electricalProp->first_node("Name")->value();
- data.activePower = GetNodeValueDouble(electricalProp, "ActivePower");
- data.activePowerUnit = (ElectricalUnit)GetAttributeValueInt(electricalProp, "ActivePower", "UnitID");
- data.reactivePower = GetNodeValueDouble(electricalProp, "ReactivePower");
- data.reactivePowerUnit = (ElectricalUnit)GetAttributeValueInt(electricalProp, "ReactivePower", "UnitID");
-
- indMotor->SetElectricalData(data);
+ if(!indMotor->OpenElement(indMotorNode, parentList)) return false;
elementList.push_back(indMotor);
indMotorList.push_back(indMotor);
+
indMotorNode = indMotorNode->next_sibling("IndMotor");
} //}
@@ -1182,71 +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 = GetNodeValueDouble(position, "X");
- double posY = GetNodeValueDouble(position, "Y");
- auto size = cadPropNode->first_node("Size");
- double width = GetNodeValueDouble(size, "Width");
- double height = GetNodeValueDouble(size, "Height");
- double angle = GetNodeValueDouble(cadPropNode, "Angle");
- auto nodePosition = cadPropNode->first_node("NodePosition");
- double nodePosX = GetNodeValueDouble(nodePosition, "X");
- double nodePosY = GetNodeValueDouble(nodePosition, "Y");
- int parentID = 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(GetNodeValueInt(electricalProp, "IsOnline"));
- InductorElectricalData data = inductor->GetElectricalData();
- data.name = electricalProp->first_node("Name")->value();
- data.reactivePower = GetNodeValueDouble(electricalProp, "ReactivePower");
- data.reactivePowerUnit = (ElectricalUnit)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)GetNodeValueInt(swNode, "Type"));
- swData.swTime.push_back(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");
} //}
@@ -1257,107 +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 = GetNodeValueDouble(nodePos, "X");
- double nodePosY = 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]);
- line->AddParent(parent1, ptsList[0]);
- } else {
- parent1 = busList[parentID[0]];
- line->AddParent(parent1, ptsList[0]);
- }
- if(parentID[1] == -1) {
- parent2 = new Bus(ptsList[ptsList.size() - 1]);
- line->AddParent(parent2, ptsList[ptsList.size() - 1]);
- } else {
- parent2 = busList[parentID[1]];
- line->AddParent(parent2, ptsList[ptsList.size() - 1]);
- }
-
- // Add the others nodes (if have)
- std::vector<wxPoint2DDouble> midPts;
- for(int i = 1; i < (int)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);
-
- if(parentID[0] == -1) {
- line->RemoveParent(parent1);
- delete parent1;
- }
- if(parentID[1] == -1) {
- line->RemoveParent(parent2);
- delete parent2;
- }
-
- auto electricalProp = lineNode->first_node("ElectricalProperties");
- if(!electricalProp) return false;
-
- line->SetOnline(GetNodeValueInt(electricalProp, "IsOnline"));
- LineElectricalData data = line->GetElectricalData();
- data.name = electricalProp->first_node("Name")->value();
- data.nominalVoltage = GetNodeValueDouble(electricalProp, "NominalVoltage");
- data.nominalVoltageUnit = (ElectricalUnit)GetAttributeValueInt(electricalProp, "NominalVoltage", "UnitID");
- data.nominalPower = GetNodeValueDouble(electricalProp, "NominalPower");
- data.nominalPowerUnit = (ElectricalUnit)GetAttributeValueInt(electricalProp, "NominalPower", "UnitID");
- data.resistance = GetNodeValueDouble(electricalProp, "Resistance");
- data.resistanceUnit = (ElectricalUnit)GetAttributeValueInt(electricalProp, "Resistance", "UnitID");
- data.indReactance = GetNodeValueDouble(electricalProp, "IndReactance");
- data.indReactanceUnit = (ElectricalUnit)GetAttributeValueInt(electricalProp, "IndReactance", "UnitID");
- data.capSusceptance = GetNodeValueDouble(electricalProp, "CapSusceptance");
- data.capSusceptanceUnit = (ElectricalUnit)GetAttributeValueInt(electricalProp, "CapSusceptance", "UnitID");
- data.lineSize = GetNodeValueDouble(electricalProp, "LineSize");
- data.useLinePower = GetNodeValueInt(electricalProp, "UseLinePower");
-
- auto fault = electricalProp->first_node("Fault");
- data.zeroResistance = GetNodeValueDouble(fault, "ZeroResistance");
- data.zeroIndReactance = GetNodeValueDouble(fault, "ZeroIndReactance");
- data.zeroCapSusceptance = 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)GetNodeValueInt(swNode, "Type"));
- swData.swTime.push_back(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");
} //}
@@ -1368,88 +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 = GetNodeValueDouble(position, "X");
- double posY = GetNodeValueDouble(position, "Y");
- auto size = cadPropNode->first_node("Size");
- double width = GetNodeValueDouble(size, "Width");
- double height = GetNodeValueDouble(size, "Height");
- double angle = GetNodeValueDouble(cadPropNode, "Angle");
- auto nodePosition = cadPropNode->first_node("NodePosition");
- double nodePosX = GetNodeValueDouble(nodePosition, "X");
- double nodePosY = GetNodeValueDouble(nodePosition, "Y");
- int parentID = 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(GetNodeValueInt(electricalProp, "IsOnline"));
- LoadElectricalData data = load->GetElectricalData();
- data.name = electricalProp->first_node("Name")->value();
- data.activePower = GetNodeValueDouble(electricalProp, "ActivePower");
- data.activePowerUnit = (ElectricalUnit)GetAttributeValueInt(electricalProp, "ActivePower", "UnitID");
- data.reactivePower = GetNodeValueDouble(electricalProp, "ReactivePower");
- data.reactivePowerUnit = (ElectricalUnit)GetAttributeValueInt(electricalProp, "ReactivePower", "UnitID");
- data.loadType = (LoadType)GetNodeValueInt(electricalProp, "LoadType");
- // Stability
- auto stability = electricalProp->first_node("Stability");
- if(stability) {
- data.plotLoad = GetNodeValueInt(stability, "PlotLoad");
- data.useCompLoad = GetNodeValueInt(stability, "UseCompositeLoad");
- auto activePowerComp = stability->first_node("ActivePowerComposition");
- data.constImpedanceActive = GetNodeValueDouble(activePowerComp, "ConstantImpedance");
- data.constCurrentActive = GetNodeValueDouble(activePowerComp, "ConstantCurrent");
- data.constPowerActive = GetNodeValueDouble(activePowerComp, "ConstantPower");
- auto reactivePowerComp = stability->first_node("ReactivePowerComposition");
- data.constImpedanceReactive = GetNodeValueDouble(reactivePowerComp, "ConstantImpedance");
- data.constCurrentReactive = GetNodeValueDouble(reactivePowerComp, "ConstantCurrent");
- data.constPowerReactive = 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)GetNodeValueInt(swNode, "Type"));
- swData.swTime.push_back(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");
} //}
@@ -1457,102 +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 = GetNodeValueDouble(position, "X");
- double posY = GetNodeValueDouble(position, "Y");
- auto size = cadPropNode->first_node("Size");
- double width = GetNodeValueDouble(size, "Width");
- double height = GetNodeValueDouble(size, "Height");
- double angle = GetNodeValueDouble(cadPropNode, "Angle");
- auto nodePosition = cadPropNode->first_node("NodePosition");
- double nodePosX = GetNodeValueDouble(nodePosition, "X");
- double nodePosY = GetNodeValueDouble(nodePosition, "Y");
- int parentID = 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(GetNodeValueInt(electricalProp, "IsOnline"));
- SyncGeneratorElectricalData data = syncGenerator->GetElectricalData();
- data.name = electricalProp->first_node("Name")->value();
- data.nominalPower = GetNodeValueDouble(electricalProp, "NominalPower");
- data.nominalPowerUnit = (ElectricalUnit)GetAttributeValueInt(electricalProp, "NominalPower", "UnitID");
- data.nominalVoltage = GetNodeValueDouble(electricalProp, "NominalVoltage");
- data.nominalVoltageUnit = (ElectricalUnit)GetAttributeValueInt(electricalProp, "NominalVoltage", "UnitID");
- data.activePower = GetNodeValueDouble(electricalProp, "ActivePower");
- data.activePowerUnit = (ElectricalUnit)GetAttributeValueInt(electricalProp, "ActivePower", "UnitID");
- data.reactivePower = GetNodeValueDouble(electricalProp, "ReactivePower");
- data.reactivePowerUnit = (ElectricalUnit)GetAttributeValueInt(electricalProp, "ReactivePower", "UnitID");
- data.haveMaxReactive = GetNodeValueInt(electricalProp, "HaveMaxReactive");
- data.maxReactive = GetNodeValueDouble(electricalProp, "MaxReactive");
- data.maxReactiveUnit = (ElectricalUnit)GetAttributeValueInt(electricalProp, "MaxReactive", "UnitID");
- data.haveMinReactive = GetNodeValueInt(electricalProp, "HaveMinReactive");
- data.minReactive = GetNodeValueDouble(electricalProp, "MinReactive");
- data.minReactiveUnit = (ElectricalUnit)GetAttributeValueInt(electricalProp, "MinReactive", "UnitID");
- data.useMachineBase = GetNodeValueInt(electricalProp, "UseMachineBase");
-
- auto fault = electricalProp->first_node("Fault");
- if(!fault) return false;
- data.positiveResistance = GetNodeValueDouble(fault, "PositiveResistance");
- data.positiveReactance = GetNodeValueDouble(fault, "PositiveReactance");
- data.negativeResistance = GetNodeValueDouble(fault, "NegativeResistance");
- data.negativeReactance = GetNodeValueDouble(fault, "NegativeReactance");
- data.zeroResistance = GetNodeValueDouble(fault, "ZeroResistance");
- data.zeroReactance = GetNodeValueDouble(fault, "ZeroReactance");
- data.groundResistance = GetNodeValueDouble(fault, "GroundResistance");
- data.groundReactance = GetNodeValueDouble(fault, "GroundReactance");
- data.groundNeutral = GetNodeValueInt(fault, "GroundNeutral");
-
auto stability = electricalProp->first_node("Stability");
- if(!stability) return false;
- data.plotSyncMachine = GetNodeValueInt(stability, "PlotSyncMachine");
- data.inertia = GetNodeValueDouble(stability, "Inertia");
- data.damping = GetNodeValueDouble(stability, "Damping");
- data.useAVR = GetNodeValueInt(stability, "UseAVR");
- data.useSpeedGovernor = GetNodeValueInt(stability, "UseSpeedGovernor");
- data.armResistance = GetNodeValueDouble(stability, "ArmResistance");
- data.potierReactance = GetNodeValueDouble(stability, "PotierReactance");
- data.satFactor = GetNodeValueDouble(stability, "SatFactor");
- data.syncXd = GetNodeValueDouble(stability, "SyncXd");
- data.syncXq = GetNodeValueDouble(stability, "SyncXq");
- data.transXd = GetNodeValueDouble(stability, "TransXd");
- data.transXq = GetNodeValueDouble(stability, "TransXq");
- data.transTd0 = GetNodeValueDouble(stability, "TransTd0");
- data.transTq0 = GetNodeValueDouble(stability, "TransTq0");
- data.subXd = GetNodeValueDouble(stability, "SubXd");
- data.subXq = GetNodeValueDouble(stability, "SubXq");
- data.subTd0 = GetNodeValueDouble(stability, "SubTd0");
- data.subTq0 = GetNodeValueDouble(stability, "SubTq0");
auto avr = stability->first_node("AVR");
if(!avr) return false;
@@ -1562,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)GetNodeValueInt(swNode, "Type"));
- swData.swTime.push_back(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");
@@ -1589,93 +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 = GetNodeValueDouble(position, "X");
- double posY = GetNodeValueDouble(position, "Y");
- auto size = cadPropNode->first_node("Size");
- double width = GetNodeValueDouble(size, "Width");
- double height = GetNodeValueDouble(size, "Height");
- double angle = GetNodeValueDouble(cadPropNode, "Angle");
- auto nodePosition = cadPropNode->first_node("NodePosition");
- double nodePosX = GetNodeValueDouble(nodePosition, "X");
- double nodePosY = GetNodeValueDouble(nodePosition, "Y");
- int parentID = 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(GetNodeValueInt(electricalProp, "IsOnline"));
- SyncMotorElectricalData data = syncMotor->GetElectricalData();
- data.name = electricalProp->first_node("Name")->value();
- data.nominalPower = GetNodeValueDouble(electricalProp, "NominalPower");
- data.nominalPowerUnit = (ElectricalUnit)GetAttributeValueInt(electricalProp, "NominalPower", "UnitID");
- // data.nominalVoltage = GetNodeValueDouble(electricalProp, "NominalVoltage");
- // data.nominalVoltageUnit = (ElectricalUnit)GetAttributeValueInt(electricalProp, "NominalVoltage", "UnitID");
- data.activePower = GetNodeValueDouble(electricalProp, "ActivePower");
- data.activePowerUnit = (ElectricalUnit)GetAttributeValueInt(electricalProp, "ActivePower", "UnitID");
- data.reactivePower = GetNodeValueDouble(electricalProp, "ReactivePower");
- data.reactivePowerUnit = (ElectricalUnit)GetAttributeValueInt(electricalProp, "ReactivePower", "UnitID");
- data.haveMaxReactive = GetNodeValueInt(electricalProp, "HaveMaxReactive");
- data.maxReactive = GetNodeValueDouble(electricalProp, "MaxReactive");
- data.maxReactiveUnit = (ElectricalUnit)GetAttributeValueInt(electricalProp, "MaxReactive", "UnitID");
- data.haveMinReactive = GetNodeValueInt(electricalProp, "HaveMinReactive");
- data.minReactive = GetNodeValueDouble(electricalProp, "MinReactive");
- data.minReactiveUnit = (ElectricalUnit)GetAttributeValueInt(electricalProp, "MinReactive", "UnitID");
- data.useMachineBase = GetNodeValueInt(electricalProp, "UseMachineBase");
-
- auto fault = electricalProp->first_node("Fault");
- if(!fault) return false;
- data.positiveResistance = GetNodeValueDouble(fault, "PositiveResistance");
- data.positiveReactance = GetNodeValueDouble(fault, "PositiveReactance");
- data.negativeResistance = GetNodeValueDouble(fault, "NegativeResistance");
- data.negativeReactance = GetNodeValueDouble(fault, "NegativeReactance");
- data.zeroResistance = GetNodeValueDouble(fault, "ZeroResistance");
- data.zeroReactance = GetNodeValueDouble(fault, "ZeroReactance");
- data.groundResistance = GetNodeValueDouble(fault, "GroundResistance");
- data.groundReactance = GetNodeValueDouble(fault, "GroundReactance");
- data.groundNeutral = 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)GetNodeValueInt(swNode, "Type"));
- swData.swTime.push_back(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");
} //}
@@ -1686,129 +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 = GetNodeValueDouble(position, "X");
- double posY = GetNodeValueDouble(position, "Y");
- auto size = cadPropNode->first_node("Size");
- double width = GetNodeValueDouble(size, "Width");
- double height = GetNodeValueDouble(size, "Height");
- double angle = GetNodeValueDouble(cadPropNode, "Angle");
-
- // 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 = GetNodeValueDouble(nodePos, "X");
- double nodePosY = 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(GetNodeValueInt(electricalProp, "IsOnline"));
- TransformerElectricalData data = transformer->GetElectricalData();
- data.name = electricalProp->first_node("Name")->value();
- data.primaryNominalVoltage = GetNodeValueDouble(electricalProp, "PrimaryNominalVoltage");
- data.primaryNominalVoltageUnit =
- (ElectricalUnit)GetAttributeValueInt(electricalProp, "PrimaryNominalVoltage", "UnitID");
- data.secondaryNominalVoltage = GetNodeValueDouble(electricalProp, "SecondaryNominalVoltage");
- data.secondaryNominalVoltageUnit =
- (ElectricalUnit)GetAttributeValueInt(electricalProp, "SecondaryNominalVoltage", "UnitID");
- data.nominalPower = GetNodeValueDouble(electricalProp, "NominalPower");
- data.nominalPowerUnit = (ElectricalUnit)GetAttributeValueInt(electricalProp, "NominalPower", "UnitID");
- data.resistance = GetNodeValueDouble(electricalProp, "Resistance");
- data.resistanceUnit = (ElectricalUnit)GetAttributeValueInt(electricalProp, "Resistance", "UnitID");
- data.indReactance = GetNodeValueDouble(electricalProp, "IndReactance");
- data.indReactanceUnit = (ElectricalUnit)GetAttributeValueInt(electricalProp, "IndReactance", "UnitID");
- data.connection = (TransformerConnection)GetNodeValueInt(electricalProp, "Connection");
- data.turnsRatio = GetNodeValueDouble(electricalProp, "TurnsRatio");
- data.phaseShift = GetNodeValueDouble(electricalProp, "PhaseShift");
- data.useTransformerPower = GetNodeValueInt(electricalProp, "UseTransfomerPower");
-
- auto fault = electricalProp->first_node("Fault");
- data.zeroResistance = GetNodeValueDouble(fault, "ZeroResistance");
- data.zeroIndReactance = GetNodeValueDouble(fault, "ZeroIndReactance");
- data.primaryGrndResistance = GetNodeValueDouble(fault, "PrimaryGrndResistance");
- data.primaryGrndReactance = GetNodeValueDouble(fault, "PrimaryGrndReactance");
- data.secondaryGrndResistance = GetNodeValueDouble(fault, "SecondaryGrndResistance");
- data.secondaryGrndReactance = 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)GetNodeValueInt(swNode, "Type"));
- swData.swTime.push_back(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");
} //}
@@ -1819,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;
+ Text* text = new Text();
- auto position = cadPropNode->first_node("Position");
- double posX = GetNodeValueDouble(position, "X");
- double posY = GetNodeValueDouble(position, "Y");
- auto size = cadPropNode->first_node("Size");
- double width = GetNodeValueDouble(size, "Width");
- double height = GetNodeValueDouble(size, "Height");
- double angle = GetNodeValueDouble(cadPropNode, "Angle");
+ if(!text->OpenElement(textNode)) return true;
- Text* text = new Text(wxPoint2DDouble(posX, posY));
-
- text->SetWidth(width);
- text->SetHeight(height);
-
- auto textProperties = textNode->first_node("TextProperties");
- if(!textProperties) return false;
-
- text->SetElementType((ElementType)GetNodeValueDouble(textProperties, "ElementType"));
- text->SetDataType((DataType)GetNodeValueDouble(textProperties, "DataType"));
- text->SetUnit((ElectricalUnit)GetNodeValueDouble(textProperties, "DataUnit"));
- text->SetDirection(GetNodeValueDouble(textProperties, "Direction"));
- text->SetDecimalPlaces(GetNodeValueDouble(textProperties, "DecimalPlaces"));
-
- text->SetElementNumber(GetNodeValueInt(textProperties, "ElementNumber"));
switch(text->GetElementType()) {
case TYPE_NONE:
break;
@@ -1886,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");
} //}
@@ -1922,10 +558,10 @@ void FileHanding::SaveControl(wxFileName path)
rapidxml::xml_node<>* rootNode = doc.allocate_node(rapidxml::node_element, "Control");
doc.append_node(rootNode);
- rapidxml::xml_node<>* projectNameNode = AppendNode(doc, rootNode, "Name");
- SetNodeValue(doc, projectNameNode, path.GetName());
+ rapidxml::xml_node<>* projectNameNode = XMLParser::AppendNode(doc, rootNode, "Name");
+ XMLParser::SetNodeValue(doc, projectNameNode, path.GetName());
- auto elementsNode = AppendNode(doc, rootNode, "ControlElements");
+ auto elementsNode = XMLParser::AppendNode(doc, rootNode, "ControlElements");
SaveControlElements(doc, elementsNode);
std::ofstream writeXML(path.GetFullPath());
writeXML << doc;
@@ -1951,7 +587,7 @@ bool FileHanding::OpenControl(wxFileName path,
auto elementsNode = projectNode->first_node("ControlElements");
if(!elementsNode) return false;
- // auto elementsNode = AppendNode(doc, rootNode, "ControlElements");
+ // auto elementsNode = XMLParser::AppendNode(doc, rootNode, "ControlElements");
ControlElementContainer* ctrlElementContainer = new ControlElementContainer();
if(!OpenControlElements(doc, elementsNode, ctrlElementContainer)) return false;
ctrlElementList = ctrlElementContainer->GetControlElementsList();
@@ -1969,393 +605,107 @@ void FileHanding::SaveControlElements(rapidxml::xml_document<>& doc,
}
//{ Constant
- auto constsNode = AppendNode(doc, elementsNode, "ConstantList");
+ auto constsNode = XMLParser::AppendNode(doc, elementsNode, "ConstantList");
auto constList = ctrlContainer->GetConstantList();
for(auto it = constList.begin(), itEnd = constList.end(); it != itEnd; ++it) {
- Constant* constant = *it;
- auto constNode = AppendNode(doc, constsNode, "Constant");
- SetNodeAttribute(doc, constNode, "ID", constant->GetID());
- auto cadProp = AppendNode(doc, constNode, "CADProperties");
- auto position = AppendNode(doc, cadProp, "Position");
- auto posX = AppendNode(doc, position, "X");
- SetNodeValue(doc, posX, constant->GetPosition().m_x);
- auto posY = AppendNode(doc, position, "Y");
- SetNodeValue(doc, posY, constant->GetPosition().m_y);
- auto size = AppendNode(doc, cadProp, "Size");
- auto width = AppendNode(doc, size, "Width");
- SetNodeValue(doc, width, constant->GetWidth());
- auto height = AppendNode(doc, size, "Height");
- SetNodeValue(doc, height, constant->GetHeight());
- auto angle = AppendNode(doc, cadProp, "Angle");
- SetNodeValue(doc, angle, constant->GetAngle());
-
- // Nodes
- auto nodeList = AppendNode(doc, constNode, "NodeList");
- SaveControlNodes(doc, nodeList, constant->GetNodeList());
-
- // Control properties
- auto value = AppendNode(doc, constNode, "Value");
- SetNodeValue(doc, value, constant->GetValue());
+ (*it)->SaveElement(doc, constsNode);
} //}
//{ Exponential
- auto expsNode = AppendNode(doc, elementsNode, "ExponentialList");
+ auto expsNode = XMLParser::AppendNode(doc, elementsNode, "ExponentialList");
auto expList = ctrlContainer->GetExponentialList();
- for(auto it = expList.begin(), itEnd = expList.end(); it != itEnd; ++it) {
- Exponential* exponential = *it;
- auto expNode = AppendNode(doc, expsNode, "Exponential");
- SetNodeAttribute(doc, expNode, "ID", exponential->GetID());
- auto cadProp = AppendNode(doc, expNode, "CADProperties");
- auto position = AppendNode(doc, cadProp, "Position");
- auto posX = AppendNode(doc, position, "X");
- SetNodeValue(doc, posX, exponential->GetPosition().m_x);
- auto posY = AppendNode(doc, position, "Y");
- SetNodeValue(doc, posY, exponential->GetPosition().m_y);
- auto size = AppendNode(doc, cadProp, "Size");
- auto width = AppendNode(doc, size, "Width");
- SetNodeValue(doc, width, exponential->GetWidth());
- auto height = AppendNode(doc, size, "Height");
- SetNodeValue(doc, height, exponential->GetHeight());
- auto angle = AppendNode(doc, cadProp, "Angle");
- SetNodeValue(doc, angle, exponential->GetAngle());
-
- // Nodes
- auto nodeList = AppendNode(doc, expNode, "NodeList");
- SaveControlNodes(doc, nodeList, exponential->GetNodeList());
-
- // Control properties
- double a, b;
- exponential->GetValues(a, b);
- auto value = AppendNode(doc, expNode, "Value");
- auto aValue = AppendNode(doc, value, "A");
- SetNodeValue(doc, aValue, a);
- auto bValue = AppendNode(doc, value, "B");
- SetNodeValue(doc, bValue, b);
- } //}
+ for(auto it = expList.begin(), itEnd = expList.end(); it != itEnd; ++it) { (*it)->SaveElement(doc, expsNode); } //}
//{ Gain
- auto gainsNode = AppendNode(doc, elementsNode, "GainList");
+ auto gainsNode = XMLParser::AppendNode(doc, elementsNode, "GainList");
auto gainList = ctrlContainer->GetGainList();
for(auto it = gainList.begin(), itEnd = gainList.end(); it != itEnd; ++it) {
- Gain* gain = *it;
- auto gainNode = AppendNode(doc, gainsNode, "Gain");
- SetNodeAttribute(doc, gainNode, "ID", gain->GetID());
- auto cadProp = AppendNode(doc, gainNode, "CADProperties");
- auto position = AppendNode(doc, cadProp, "Position");
- auto posX = AppendNode(doc, position, "X");
- SetNodeValue(doc, posX, gain->GetPosition().m_x);
- auto posY = AppendNode(doc, position, "Y");
- SetNodeValue(doc, posY, gain->GetPosition().m_y);
- auto size = AppendNode(doc, cadProp, "Size");
- auto width = AppendNode(doc, size, "Width");
- SetNodeValue(doc, width, gain->GetWidth());
- auto height = AppendNode(doc, size, "Height");
- SetNodeValue(doc, height, gain->GetHeight());
- auto angle = AppendNode(doc, cadProp, "Angle");
- SetNodeValue(doc, angle, gain->GetAngle());
-
- // Nodes
- auto nodeList = AppendNode(doc, gainNode, "NodeList");
- SaveControlNodes(doc, nodeList, gain->GetNodeList());
-
- // Control properties
- auto value = AppendNode(doc, gainNode, "Value");
- SetNodeValue(doc, value, gain->GetValue());
+ (*it)->SaveElement(doc, gainsNode);
} //}
//{ IO
- auto iosNode = AppendNode(doc, elementsNode, "IOList");
+ auto iosNode = XMLParser::AppendNode(doc, elementsNode, "IOList");
auto ioList = ctrlContainer->GetIOControlList();
- for(auto it = ioList.begin(), itEnd = ioList.end(); it != itEnd; ++it) {
- IOControl* io = *it;
- auto ioNode = AppendNode(doc, iosNode, "IO");
- SetNodeAttribute(doc, ioNode, "ID", io->GetID());
- auto cadProp = AppendNode(doc, ioNode, "CADProperties");
- auto position = AppendNode(doc, cadProp, "Position");
- auto posX = AppendNode(doc, position, "X");
- SetNodeValue(doc, posX, io->GetPosition().m_x);
- auto posY = AppendNode(doc, position, "Y");
- SetNodeValue(doc, posY, io->GetPosition().m_y);
- auto size = AppendNode(doc, cadProp, "Size");
- auto width = AppendNode(doc, size, "Width");
- SetNodeValue(doc, width, io->GetWidth());
- auto height = AppendNode(doc, size, "Height");
- SetNodeValue(doc, height, io->GetHeight());
- auto angle = AppendNode(doc, cadProp, "Angle");
- SetNodeValue(doc, angle, io->GetAngle());
-
- // Nodes
- auto nodeList = AppendNode(doc, ioNode, "NodeList");
- SaveControlNodes(doc, nodeList, io->GetNodeList());
-
- // Control properties
- auto value = AppendNode(doc, ioNode, "Value");
- SetNodeValue(doc, value, io->GetValue());
- auto ioFlags = AppendNode(doc, ioNode, "IOFlags");
- SetNodeValue(doc, ioFlags, io->GetIOFlags());
- } //}
+ for(auto it = ioList.begin(), itEnd = ioList.end(); it != itEnd; ++it) { (*it)->SaveElement(doc, iosNode); } //}
//{ Limiter
- auto limitersNode = AppendNode(doc, elementsNode, "LimiterList");
+ auto limitersNode = XMLParser::AppendNode(doc, elementsNode, "LimiterList");
auto limiterList = ctrlContainer->GetLimiterList();
for(auto it = limiterList.begin(), itEnd = limiterList.end(); it != itEnd; ++it) {
- Limiter* limiter = *it;
- auto limiterNode = AppendNode(doc, limitersNode, "Limiter");
- SetNodeAttribute(doc, limiterNode, "ID", limiter->GetID());
- auto cadProp = AppendNode(doc, limiterNode, "CADProperties");
- auto position = AppendNode(doc, cadProp, "Position");
- auto posX = AppendNode(doc, position, "X");
- SetNodeValue(doc, posX, limiter->GetPosition().m_x);
- auto posY = AppendNode(doc, position, "Y");
- SetNodeValue(doc, posY, limiter->GetPosition().m_y);
- auto size = AppendNode(doc, cadProp, "Size");
- auto width = AppendNode(doc, size, "Width");
- SetNodeValue(doc, width, limiter->GetWidth());
- auto height = AppendNode(doc, size, "Height");
- SetNodeValue(doc, height, limiter->GetHeight());
- auto angle = AppendNode(doc, cadProp, "Angle");
- SetNodeValue(doc, angle, limiter->GetAngle());
-
- // Nodes
- auto nodeList = AppendNode(doc, limiterNode, "NodeList");
- SaveControlNodes(doc, nodeList, limiter->GetNodeList());
-
- // Control properties
- auto upLimit = AppendNode(doc, limiterNode, "UpperLimit");
- SetNodeValue(doc, upLimit, limiter->GetUpLimit());
- auto lowLimit = AppendNode(doc, limiterNode, "LowerLimit");
- SetNodeValue(doc, lowLimit, limiter->GetLowLimit());
+ (*it)->SaveElement(doc, limitersNode);
} //}
//{ Multiplier
- auto multipliersNode = AppendNode(doc, elementsNode, "MultiplierList");
+ auto multipliersNode = XMLParser::AppendNode(doc, elementsNode, "MultiplierList");
auto multiplierList = ctrlContainer->GetMultiplierList();
for(auto it = multiplierList.begin(), itEnd = multiplierList.end(); it != itEnd; ++it) {
- Multiplier* multiplier = *it;
- auto multiplierNode = AppendNode(doc, multipliersNode, "Multiplier");
- SetNodeAttribute(doc, multiplierNode, "ID", multiplier->GetID());
- auto cadProp = AppendNode(doc, multiplierNode, "CADProperties");
- auto position = AppendNode(doc, cadProp, "Position");
- auto posX = AppendNode(doc, position, "X");
- SetNodeValue(doc, posX, multiplier->GetPosition().m_x);
- auto posY = AppendNode(doc, position, "Y");
- SetNodeValue(doc, posY, multiplier->GetPosition().m_y);
- auto size = AppendNode(doc, cadProp, "Size");
- auto width = AppendNode(doc, size, "Width");
- SetNodeValue(doc, width, multiplier->GetWidth());
- auto height = AppendNode(doc, size, "Height");
- SetNodeValue(doc, height, multiplier->GetHeight());
- auto angle = AppendNode(doc, cadProp, "Angle");
- SetNodeValue(doc, angle, multiplier->GetAngle());
-
- // Nodes
- auto nodeList = AppendNode(doc, multiplierNode, "NodeList");
- SaveControlNodes(doc, nodeList, multiplier->GetNodeList());
+ (*it)->SaveElement(doc, multipliersNode);
} //}
//{ Divider
- auto dividersNode = AppendNode(doc, elementsNode, "DividerList");
+ auto dividersNode = XMLParser::AppendNode(doc, elementsNode, "DividerList");
auto dividersList = ctrlContainer->GetDividerList();
for(auto it = dividersList.begin(), itEnd = dividersList.end(); it != itEnd; ++it) {
- Divider* divider = *it;
- auto dividerNode = AppendNode(doc, dividersNode, "Divider");
- SetNodeAttribute(doc, dividerNode, "ID", divider->GetID());
- auto cadProp = AppendNode(doc, dividerNode, "CADProperties");
- auto position = AppendNode(doc, cadProp, "Position");
- auto posX = AppendNode(doc, position, "X");
- SetNodeValue(doc, posX, divider->GetPosition().m_x);
- auto posY = AppendNode(doc, position, "Y");
- SetNodeValue(doc, posY, divider->GetPosition().m_y);
- auto size = AppendNode(doc, cadProp, "Size");
- auto width = AppendNode(doc, size, "Width");
- SetNodeValue(doc, width, divider->GetWidth());
- auto height = AppendNode(doc, size, "Height");
- SetNodeValue(doc, height, divider->GetHeight());
- auto angle = AppendNode(doc, cadProp, "Angle");
- SetNodeValue(doc, angle, divider->GetAngle());
-
- // Nodes
- auto nodeList = AppendNode(doc, dividerNode, "NodeList");
- SaveControlNodes(doc, nodeList, divider->GetNodeList());
+ (*it)->SaveElement(doc, dividersNode);
} //}
//{ Rate limiter
- auto rateLimitersNode = AppendNode(doc, elementsNode, "RateLimiterList");
+ auto rateLimitersNode = XMLParser::AppendNode(doc, elementsNode, "RateLimiterList");
auto rateLimiterList = ctrlContainer->GetRateLimiterList();
for(auto it = rateLimiterList.begin(), itEnd = rateLimiterList.end(); it != itEnd; ++it) {
- RateLimiter* rateLimiter = *it;
- auto rateLimiterNode = AppendNode(doc, rateLimitersNode, "RateLimiter");
- SetNodeAttribute(doc, rateLimiterNode, "ID", rateLimiter->GetID());
- auto cadProp = AppendNode(doc, rateLimiterNode, "CADProperties");
- auto position = AppendNode(doc, cadProp, "Position");
- auto posX = AppendNode(doc, position, "X");
- SetNodeValue(doc, posX, rateLimiter->GetPosition().m_x);
- auto posY = AppendNode(doc, position, "Y");
- SetNodeValue(doc, posY, rateLimiter->GetPosition().m_y);
- auto size = AppendNode(doc, cadProp, "Size");
- auto width = AppendNode(doc, size, "Width");
- SetNodeValue(doc, width, rateLimiter->GetWidth());
- auto height = AppendNode(doc, size, "Height");
- SetNodeValue(doc, height, rateLimiter->GetHeight());
- auto angle = AppendNode(doc, cadProp, "Angle");
- SetNodeValue(doc, angle, rateLimiter->GetAngle());
-
- // Nodes
- auto nodeList = AppendNode(doc, rateLimiterNode, "NodeList");
- SaveControlNodes(doc, nodeList, rateLimiter->GetNodeList());
-
- // Control properties
- auto upLimit = AppendNode(doc, rateLimiterNode, "UpperLimit");
- SetNodeValue(doc, upLimit, rateLimiter->GetUpLimit());
- auto lowLimit = AppendNode(doc, rateLimiterNode, "LowerLimit");
- SetNodeValue(doc, lowLimit, rateLimiter->GetLowLimit());
+ (*it)->SaveElement(doc, rateLimitersNode);
} //}
//{ Sum
- auto sumsNode = AppendNode(doc, elementsNode, "SumList");
+ auto sumsNode = XMLParser::AppendNode(doc, elementsNode, "SumList");
auto sumList = ctrlContainer->GetSumList();
- for(auto it = sumList.begin(), itEnd = sumList.end(); it != itEnd; ++it) {
- Sum* sum = *it;
- auto sumNode = AppendNode(doc, sumsNode, "Sum");
- SetNodeAttribute(doc, sumNode, "ID", sum->GetID());
- auto cadProp = AppendNode(doc, sumNode, "CADProperties");
- auto position = AppendNode(doc, cadProp, "Position");
- auto posX = AppendNode(doc, position, "X");
- SetNodeValue(doc, posX, sum->GetPosition().m_x);
- auto posY = AppendNode(doc, position, "Y");
- SetNodeValue(doc, posY, sum->GetPosition().m_y);
- auto size = AppendNode(doc, cadProp, "Size");
- auto width = AppendNode(doc, size, "Width");
- SetNodeValue(doc, width, sum->GetWidth());
- auto height = AppendNode(doc, size, "Height");
- SetNodeValue(doc, height, sum->GetHeight());
- auto angle = AppendNode(doc, cadProp, "Angle");
- SetNodeValue(doc, angle, sum->GetAngle());
-
- // Nodes
- auto nodeList = AppendNode(doc, sumNode, "NodeList");
- SaveControlNodes(doc, nodeList, sum->GetNodeList());
-
- // Control properties
- auto signsNode = AppendNode(doc, sumNode, "Signs");
- auto signs = sum->GetSignalList();
- for(int i = 0; i < (int)signs.size(); ++i) {
- auto value = AppendNode(doc, signsNode, "Value");
- SetNodeValue(doc, value, static_cast<int>(signs[i]));
- }
+ for(auto it = sumList.begin(), itEnd = sumList.end(); it != itEnd; ++it) { (*it)->SaveElement(doc, sumsNode); } //}
- } //}
-
//{ Math expression
- auto mathExprsNode = AppendNode(doc, elementsNode, "MathExprList");
+ auto mathExprsNode = XMLParser::AppendNode(doc, elementsNode, "MathExprList");
auto mathExprList = ctrlContainer->GetMathExprList();
for(auto it = mathExprList.begin(), itEnd = mathExprList.end(); it != itEnd; ++it) {
- MathExpression* mathExpr = *it;
- auto mathExprNode = AppendNode(doc, mathExprsNode, "MathExpr");
- SetNodeAttribute(doc, mathExprNode, "ID", mathExpr->GetID());
- auto cadProp = AppendNode(doc, mathExprNode, "CADProperties");
- auto position = AppendNode(doc, cadProp, "Position");
- auto posX = AppendNode(doc, position, "X");
- SetNodeValue(doc, posX, mathExpr->GetPosition().m_x);
- auto posY = AppendNode(doc, position, "Y");
- SetNodeValue(doc, posY, mathExpr->GetPosition().m_y);
- auto size = AppendNode(doc, cadProp, "Size");
- auto width = AppendNode(doc, size, "Width");
- SetNodeValue(doc, width, mathExpr->GetWidth());
- auto height = AppendNode(doc, size, "Height");
- SetNodeValue(doc, height, mathExpr->GetHeight());
- auto angle = AppendNode(doc, cadProp, "Angle");
- SetNodeValue(doc, angle, mathExpr->GetAngle());
-
- // Nodes
- auto nodeList = AppendNode(doc, mathExprNode, "NodeList");
- SaveControlNodes(doc, nodeList, mathExpr->GetNodeList());
-
- // Control properties
- auto variablesNode = AppendNode(doc, mathExprNode, "VariableList");
- auto variables = mathExpr->GetVariables();
- for(unsigned int i = 0; i < variables.size(); ++i) {
- auto variable = AppendNode(doc, variablesNode, "Variable");
- SetNodeValue(doc, variable, variables[i]);
- }
- auto mathExprValue = AppendNode(doc, mathExprNode, "MathExprValue");
- SetNodeValue(doc, mathExprValue, mathExpr->GetMathExpression());
-
+ (*it)->SaveElement(doc, mathExprsNode);
} //}
//{ Transfer function
- auto tfsNode = AppendNode(doc, elementsNode, "TransferFunctionList");
+ auto tfsNode = XMLParser::AppendNode(doc, elementsNode, "TransferFunctionList");
auto tfList = ctrlContainer->GetTFList();
- for(auto it = tfList.begin(), itEnd = tfList.end(); it != itEnd; ++it) {
- TransferFunction* tf = *it;
- auto tfNode = AppendNode(doc, tfsNode, "TransferFunction");
- SetNodeAttribute(doc, tfNode, "ID", tf->GetID());
- auto cadProp = AppendNode(doc, tfNode, "CADProperties");
- auto position = AppendNode(doc, cadProp, "Position");
- auto posX = AppendNode(doc, position, "X");
- SetNodeValue(doc, posX, tf->GetPosition().m_x);
- auto posY = AppendNode(doc, position, "Y");
- SetNodeValue(doc, posY, tf->GetPosition().m_y);
- auto size = AppendNode(doc, cadProp, "Size");
- auto width = AppendNode(doc, size, "Width");
- SetNodeValue(doc, width, tf->GetWidth());
- auto height = AppendNode(doc, size, "Height");
- SetNodeValue(doc, height, tf->GetHeight());
- auto angle = AppendNode(doc, cadProp, "Angle");
- SetNodeValue(doc, angle, tf->GetAngle());
-
- // Nodes
- auto nodeList = AppendNode(doc, tfNode, "NodeList");
- SaveControlNodes(doc, nodeList, tf->GetNodeList());
-
- // Control properties
- auto numeratorNode = AppendNode(doc, tfNode, "Numerator");
- auto numerator = tf->GetNumerator();
- for(int i = 0; i < (int)numerator.size(); ++i) {
- auto value = AppendNode(doc, numeratorNode, "Value");
- SetNodeValue(doc, value, numerator[i]);
- }
- auto denominatorNode = AppendNode(doc, tfNode, "Denominator");
- auto denominator = tf->GetDenominator();
- for(int i = 0; i < (int)denominator.size(); ++i) {
- auto value = AppendNode(doc, denominatorNode, "Value");
- SetNodeValue(doc, value, denominator[i]);
- }
- } //}
+ for(auto it = tfList.begin(), itEnd = tfList.end(); it != itEnd; ++it) { (*it)->SaveElement(doc, tfsNode); } //}
//{ Connection line
- auto cLinesNode = AppendNode(doc, elementsNode, "ConnectionList");
+ auto cLinesNode = XMLParser::AppendNode(doc, elementsNode, "ConnectionList");
auto connLineList = ctrlContainer->GetConnectionLineList();
for(auto it = connLineList.begin(), itEnd = connLineList.end(); it != itEnd; ++it) {
ConnectionLine* cLine = *it;
- auto cLineNode = AppendNode(doc, cLinesNode, "Connection");
- SetNodeAttribute(doc, cLineNode, "ID", cLine->GetID());
+ auto cLineNode = XMLParser::AppendNode(doc, cLinesNode, "Connection");
+ XMLParser::SetNodeAttribute(doc, cLineNode, "ID", cLine->GetID());
// CAD properties
- auto cadProp = AppendNode(doc, cLineNode, "CADProperties");
- auto offset = AppendNode(doc, cadProp, "Offset");
- SetNodeValue(doc, offset, cLine->GetOffset());
+ auto cadProp = XMLParser::AppendNode(doc, cLineNode, "CADProperties");
+ auto offset = XMLParser::AppendNode(doc, cadProp, "Offset");
+ XMLParser::SetNodeValue(doc, offset, cLine->GetOffset());
// Parent list
- auto parentsNode = AppendNode(doc, cLineNode, "ParentList");
+ auto parentsNode = XMLParser::AppendNode(doc, cLineNode, "ParentList");
auto parentList = cLine->GetParentList();
int nodeIndex = 0;
for(auto itP = parentList.begin(), itPEnd = parentList.end(); itP != itPEnd; ++itP) {
Element* parent = *itP;
- auto parentNode = AppendNode(doc, parentsNode, "Parent");
- auto elementID = AppendNode(doc, parentNode, "ElementID");
- SetNodeValue(doc, elementID, parent->GetID());
- auto nodeID = AppendNode(doc, parentNode, "NodeID");
- SetNodeValue(doc, nodeID, cLine->GetNodeList()[nodeIndex]->GetID());
+ auto parentNode = XMLParser::AppendNode(doc, parentsNode, "Parent");
+ auto elementID = XMLParser::AppendNode(doc, parentNode, "ElementID");
+ XMLParser::SetNodeValue(doc, elementID, parent->GetID());
+ auto nodeID = XMLParser::AppendNode(doc, parentNode, "NodeID");
+ XMLParser::SetNodeValue(doc, nodeID, cLine->GetNodeList()[nodeIndex]->GetID());
nodeIndex++;
}
- auto parentLine = AppendNode(doc, cLineNode, "ParentLine");
+ auto parentLine = XMLParser::AppendNode(doc, cLineNode, "ParentLine");
if(cLine->GetParentLine()) {
ConnectionLine* parent = cLine->GetParentLine();
- SetNodeAttribute(doc, parentLine, "ID", parent->GetID());
+ XMLParser::SetNodeAttribute(doc, parentLine, "ID", parent->GetID());
} else {
- SetNodeAttribute(doc, parentLine, "ID", -1);
+ XMLParser::SetNodeAttribute(doc, parentLine, "ID", -1);
}
} //}
}
@@ -2372,35 +722,10 @@ bool FileHanding::OpenControlElements(rapidxml::xml_document<>& doc,
if(constListNode) {
auto constNode = constListNode->first_node("Constant");
while(constNode) {
- int id = GetAttributeValueInt(constNode, "ID");
+ int id = XMLParser::GetAttributeValueInt(constNode, "ID");
Constant* constant = new Constant(id);
- auto cadPropNode = constNode->first_node("CADProperties");
- if(!cadPropNode) return false;
-
- auto position = cadPropNode->first_node("Position");
- double posX = GetNodeValueDouble(position, "X");
- double posY = GetNodeValueDouble(position, "Y");
- auto size = cadPropNode->first_node("Size");
- double width = GetNodeValueDouble(size, "Width");
- double height = GetNodeValueDouble(size, "Height");
- double angle = GetNodeValueDouble(cadPropNode, "Angle");
-
- double value = GetNodeValueDouble(constNode, "Value");
-
- constant->SetWidth(width);
- constant->SetHeight(height);
- constant->SetAngle(angle);
- constant->SetPosition(wxPoint2DDouble(posX, posY));
- constant->StartMove(constant->GetPosition());
-
- constant->SetValue(value);
-
- std::vector<Node*> nodeVector;
- if(!OpenControlNodeList(constNode, nodeVector)) return false;
-
- constant->SetNodeList(nodeVector);
- constant->UpdatePoints();
+ if(!constant->OpenElement(constNode)) return false;
elementList.push_back(constant);
constNode = constNode->next_sibling("Constant");
@@ -2413,37 +738,10 @@ bool FileHanding::OpenControlElements(rapidxml::xml_document<>& doc,
if(expListNode) {
auto expNode = expListNode->first_node("Exponential");
while(expNode) {
- int id = GetAttributeValueInt(expNode, "ID");
+ int id = XMLParser::GetAttributeValueInt(expNode, "ID");
Exponential* exponential = new Exponential(id);
- auto cadPropNode = expNode->first_node("CADProperties");
- if(!cadPropNode) return false;
-
- auto position = cadPropNode->first_node("Position");
- double posX = GetNodeValueDouble(position, "X");
- double posY = GetNodeValueDouble(position, "Y");
- auto size = cadPropNode->first_node("Size");
- double width = GetNodeValueDouble(size, "Width");
- double height = GetNodeValueDouble(size, "Height");
- double angle = GetNodeValueDouble(cadPropNode, "Angle");
-
- auto value = expNode->first_node("Value");
- double a = GetNodeValueDouble(value, "A");
- double b = GetNodeValueDouble(value, "B");
-
- exponential->SetWidth(width);
- exponential->SetHeight(height);
- exponential->SetAngle(angle);
- exponential->SetPosition(wxPoint2DDouble(posX, posY));
- exponential->StartMove(exponential->GetPosition());
-
- exponential->SetValues(a, b);
-
- std::vector<Node*> nodeVector;
- if(!OpenControlNodeList(expNode, nodeVector)) return false;
-
- exponential->SetNodeList(nodeVector);
- exponential->UpdatePoints();
+ if(!exponential->OpenElement(expNode)) return false;
elementList.push_back(exponential);
expNode = expNode->next_sibling("Exponential");
@@ -2456,34 +754,10 @@ bool FileHanding::OpenControlElements(rapidxml::xml_document<>& doc,
if(gainListNode) {
auto gainNode = gainListNode->first_node("Gain");
while(gainNode) {
- int id = GetAttributeValueInt(gainNode, "ID");
+ int id = XMLParser::GetAttributeValueInt(gainNode, "ID");
Gain* gain = new Gain(id);
- auto cadPropNode = gainNode->first_node("CADProperties");
- if(!cadPropNode) return false;
-
- auto position = cadPropNode->first_node("Position");
- double posX = GetNodeValueDouble(position, "X");
- double posY = GetNodeValueDouble(position, "Y");
- auto size = cadPropNode->first_node("Size");
- double width = GetNodeValueDouble(size, "Width");
- double height = GetNodeValueDouble(size, "Height");
- double angle = GetNodeValueDouble(cadPropNode, "Angle");
-
- double value = GetNodeValueDouble(gainNode, "Value");
-
- gain->SetWidth(width);
- gain->SetHeight(height);
- gain->SetAngle(angle);
- gain->SetPosition(wxPoint2DDouble(posX, posY));
- gain->SetValue(value);
- gain->StartMove(gain->GetPosition());
-
- std::vector<Node*> nodeVector;
- if(!OpenControlNodeList(gainNode, nodeVector)) return false;
-
- gain->SetNodeList(nodeVector);
- gain->UpdatePoints();
+ if(!gain->OpenElement(gainNode)) return false;
elementList.push_back(gain);
gainNode = gainNode->next_sibling("Gain");
@@ -2496,35 +770,12 @@ bool FileHanding::OpenControlElements(rapidxml::xml_document<>& doc,
if(ioListNode) {
auto ioNode = ioListNode->first_node("IO");
while(ioNode) {
- int id = GetAttributeValueInt(ioNode, "ID");
-
- auto cadPropNode = ioNode->first_node("CADProperties");
- if(!cadPropNode) return false;
-
- auto position = cadPropNode->first_node("Position");
- double posX = GetNodeValueDouble(position, "X");
- double posY = GetNodeValueDouble(position, "Y");
- auto size = cadPropNode->first_node("Size");
- double width = GetNodeValueDouble(size, "Width");
- double height = GetNodeValueDouble(size, "Height");
- double angle = GetNodeValueDouble(cadPropNode, "Angle");
-
- std::vector<Node*> nodeVector;
- if(!OpenControlNodeList(ioNode, nodeVector)) return false;
-
- IOControl::IOFlags value = static_cast<IOControl::IOFlags>(GetNodeValueInt(ioNode, "Value"));
- int ioFlags = GetNodeValueInt(ioNode, "IOFlags");
+ int id = XMLParser::GetAttributeValueInt(ioNode, "ID");
+ int ioFlags = XMLParser::GetNodeValueInt(ioNode, "IOFlags");
IOControl* io = new IOControl(ioFlags, id);
- io->SetWidth(width);
- io->SetHeight(height);
- io->SetAngle(angle);
- io->SetPosition(wxPoint2DDouble(posX, posY));
- io->SetValue(value);
- io->StartMove(io->GetPosition());
- io->SetNodeList(nodeVector);
- io->UpdatePoints();
+ if(!io->OpenElement(ioNode)) return false;
elementList.push_back(io);
ioNode = ioNode->next_sibling("IO");
@@ -2537,36 +788,10 @@ bool FileHanding::OpenControlElements(rapidxml::xml_document<>& doc,
if(limiterListNode) {
auto limiterNode = limiterListNode->first_node("Limiter");
while(limiterNode) {
- int id = GetAttributeValueInt(limiterNode, "ID");
+ int id = XMLParser::GetAttributeValueInt(limiterNode, "ID");
Limiter* limiter = new Limiter(id);
- auto cadPropNode = limiterNode->first_node("CADProperties");
- if(!cadPropNode) return false;
-
- auto position = cadPropNode->first_node("Position");
- double posX = GetNodeValueDouble(position, "X");
- double posY = GetNodeValueDouble(position, "Y");
- auto size = cadPropNode->first_node("Size");
- double width = GetNodeValueDouble(size, "Width");
- double height = GetNodeValueDouble(size, "Height");
- double angle = GetNodeValueDouble(cadPropNode, "Angle");
-
- double upLimit = GetNodeValueDouble(limiterNode, "UpperLimit");
- double lowLimit = GetNodeValueDouble(limiterNode, "LowerLimit");
-
- std::vector<Node*> nodeVector;
- if(!OpenControlNodeList(limiterNode, nodeVector)) return false;
-
- limiter->SetWidth(width);
- limiter->SetHeight(height);
- limiter->SetAngle(angle);
- limiter->SetPosition(wxPoint2DDouble(posX, posY));
- limiter->SetUpLimit(upLimit);
- limiter->SetLowLimit(lowLimit);
-
- limiter->StartMove(limiter->GetPosition());
- limiter->SetNodeList(nodeVector);
- limiter->UpdatePoints();
+ if(!limiter->OpenElement(limiterNode)) return false;
elementList.push_back(limiter);
limiterNode = limiterNode->next_sibling("Limiter");
@@ -2579,31 +804,10 @@ bool FileHanding::OpenControlElements(rapidxml::xml_document<>& doc,
if(multiplierListNode) {
auto multiplierNode = multiplierListNode->first_node("Multiplier");
while(multiplierNode) {
- int id = GetAttributeValueInt(multiplierNode, "ID");
+ int id = XMLParser::GetAttributeValueInt(multiplierNode, "ID");
Multiplier* multiplier = new Multiplier(id);
- auto cadPropNode = multiplierNode->first_node("CADProperties");
- if(!cadPropNode) return false;
-
- auto position = cadPropNode->first_node("Position");
- double posX = GetNodeValueDouble(position, "X");
- double posY = GetNodeValueDouble(position, "Y");
- auto size = cadPropNode->first_node("Size");
- double width = GetNodeValueDouble(size, "Width");
- double height = GetNodeValueDouble(size, "Height");
- double angle = GetNodeValueDouble(cadPropNode, "Angle");
-
- std::vector<Node*> nodeVector;
- if(!OpenControlNodeList(multiplierNode, nodeVector)) return false;
-
- multiplier->SetWidth(width);
- multiplier->SetHeight(height);
- multiplier->SetAngle(angle);
- multiplier->SetPosition(wxPoint2DDouble(posX, posY));
-
- multiplier->StartMove(multiplier->GetPosition());
- multiplier->SetNodeList(nodeVector);
- multiplier->UpdatePoints();
+ if(!multiplier->OpenElement(multiplierNode)) return false;
elementList.push_back(multiplier);
multiplierNode = multiplierNode->next_sibling("Multiplier");
@@ -2616,31 +820,10 @@ bool FileHanding::OpenControlElements(rapidxml::xml_document<>& doc,
if(dividerListNode) {
auto dividerNode = dividerListNode->first_node("Divider");
while(dividerNode) {
- int id = GetAttributeValueInt(dividerNode, "ID");
+ int id = XMLParser::GetAttributeValueInt(dividerNode, "ID");
Divider* divider = new Divider(id);
- auto cadPropNode = dividerNode->first_node("CADProperties");
- if(!cadPropNode) return false;
-
- auto position = cadPropNode->first_node("Position");
- double posX = GetNodeValueDouble(position, "X");
- double posY = GetNodeValueDouble(position, "Y");
- auto size = cadPropNode->first_node("Size");
- double width = GetNodeValueDouble(size, "Width");
- double height = GetNodeValueDouble(size, "Height");
- double angle = GetNodeValueDouble(cadPropNode, "Angle");
-
- std::vector<Node*> nodeVector;
- if(!OpenControlNodeList(dividerNode, nodeVector)) return false;
-
- divider->SetWidth(width);
- divider->SetHeight(height);
- divider->SetAngle(angle);
- divider->SetPosition(wxPoint2DDouble(posX, posY));
-
- divider->StartMove(divider->GetPosition());
- divider->SetNodeList(nodeVector);
- divider->UpdatePoints();
+ if(!divider->OpenElement(dividerNode)) return false;
elementList.push_back(divider);
dividerNode = dividerNode->next_sibling("Divider");
@@ -2653,36 +836,10 @@ bool FileHanding::OpenControlElements(rapidxml::xml_document<>& doc,
if(rateLimiterListNode) {
auto rateLimiterNode = rateLimiterListNode->first_node("RateLimiter");
while(rateLimiterNode) {
- int id = GetAttributeValueInt(rateLimiterNode, "ID");
+ int id = XMLParser::GetAttributeValueInt(rateLimiterNode, "ID");
RateLimiter* limiter = new RateLimiter(id);
- auto cadPropNode = rateLimiterNode->first_node("CADProperties");
- if(!cadPropNode) return false;
-
- auto position = cadPropNode->first_node("Position");
- double posX = GetNodeValueDouble(position, "X");
- double posY = GetNodeValueDouble(position, "Y");
- auto size = cadPropNode->first_node("Size");
- double width = GetNodeValueDouble(size, "Width");
- double height = GetNodeValueDouble(size, "Height");
- double angle = GetNodeValueDouble(cadPropNode, "Angle");
-
- double upLimit = GetNodeValueDouble(rateLimiterNode, "UpperLimit");
- double lowLimit = GetNodeValueDouble(rateLimiterNode, "LowerLimit");
-
- std::vector<Node*> nodeVector;
- if(!OpenControlNodeList(rateLimiterNode, nodeVector)) return false;
-
- limiter->SetWidth(width);
- limiter->SetHeight(height);
- limiter->SetAngle(angle);
- limiter->SetPosition(wxPoint2DDouble(posX, posY));
- limiter->SetUpLimit(upLimit);
- limiter->SetLowLimit(lowLimit);
-
- limiter->StartMove(limiter->GetPosition());
- limiter->SetNodeList(nodeVector);
- limiter->UpdatePoints();
+ if(!limiter->OpenElement(rateLimiterNode)) return false;
elementList.push_back(limiter);
rateLimiterNode = rateLimiterNode->next_sibling("RateLimiter");
@@ -2695,91 +852,26 @@ bool FileHanding::OpenControlElements(rapidxml::xml_document<>& doc,
if(sumListNode) {
auto sumNode = sumListNode->first_node("Sum");
while(sumNode) {
- int id = GetAttributeValueInt(sumNode, "ID");
+ int id = XMLParser::GetAttributeValueInt(sumNode, "ID");
Sum* sum = new Sum(id);
- auto cadPropNode = sumNode->first_node("CADProperties");
- if(!cadPropNode) return false;
-
- auto position = cadPropNode->first_node("Position");
- double posX = GetNodeValueDouble(position, "X");
- double posY = GetNodeValueDouble(position, "Y");
- auto size = cadPropNode->first_node("Size");
- double width = GetNodeValueDouble(size, "Width");
- double height = GetNodeValueDouble(size, "Height");
- double angle = GetNodeValueDouble(cadPropNode, "Angle");
-
- std::vector<Sum::Signal> signs;
- auto signsNode = sumNode->first_node("Signs");
- auto sign = signsNode->first_node("Value");
- while(sign) {
- long value;
- wxString(sign->value()).ToCLong(&value);
- signs.push_back(static_cast<Sum::Signal>(value));
- sign = sign->next_sibling("Value");
- }
- sum->SetSignalList(signs);
-
- std::vector<Node*> nodeVector;
- if(!OpenControlNodeList(sumNode, nodeVector)) return false;
-
- sum->SetWidth(width);
- sum->SetHeight(height);
- sum->SetAngle(angle);
- sum->SetPosition(wxPoint2DDouble(posX, posY));
-
- sum->StartMove(sum->GetPosition());
- sum->SetNodeList(nodeVector);
- sum->UpdatePoints();
+ if(!sum->OpenElement(sumNode)) return false;
elementList.push_back(sum);
sumNode = sumNode->next_sibling("Sum");
}
}
//}
-
+
//{ Math expression
auto mathListNode = elementsNode->first_node("MathExprList");
if(mathListNode) {
auto mathExprNode = mathListNode->first_node("MathExpr");
while(mathExprNode) {
- int id = GetAttributeValueInt(mathExprNode, "ID");
+ int id = XMLParser::GetAttributeValueInt(mathExprNode, "ID");
MathExpression* mathExpr = new MathExpression(id);
- auto cadPropNode = mathExprNode->first_node("CADProperties");
- if(!cadPropNode) return false;
-
- auto position = cadPropNode->first_node("Position");
- double posX = GetNodeValueDouble(position, "X");
- double posY = GetNodeValueDouble(position, "Y");
- auto size = cadPropNode->first_node("Size");
- double width = GetNodeValueDouble(size, "Width");
- double height = GetNodeValueDouble(size, "Height");
- double angle = GetNodeValueDouble(cadPropNode, "Angle");
-
- std::vector<wxString> variables;
- auto variablesNode = mathExprNode->first_node("VariableList");
- auto variable = variablesNode->first_node("Variable");
- while(variable) {
- variables.push_back(variable->value());
- variable = variable->next_sibling("Variable");
- }
- mathExpr->SetVariables(variables);
-
- auto mathExprValueNode = mathExprNode->first_node("MathExprValue");
- mathExpr->SetMathExpression(mathExprValueNode->value());
-
- std::vector<Node*> nodeVector;
- if(!OpenControlNodeList(mathExprNode, nodeVector)) return false;
-
- mathExpr->SetWidth(width);
- mathExpr->SetHeight(height);
- mathExpr->SetAngle(angle);
- mathExpr->SetPosition(wxPoint2DDouble(posX, posY));
-
- mathExpr->StartMove(mathExpr->GetPosition());
- mathExpr->SetNodeList(nodeVector);
- mathExpr->UpdatePoints();
+ if(!mathExpr->OpenElement(mathExprNode)) return false;
elementList.push_back(mathExpr);
mathExprNode = mathExprNode->next_sibling("MathExpr");
@@ -2792,54 +884,10 @@ bool FileHanding::OpenControlElements(rapidxml::xml_document<>& doc,
if(tfListNode) {
auto tfNode = tfListNode->first_node("TransferFunction");
while(tfNode) {
- int id = GetAttributeValueInt(tfNode, "ID");
+ int id = XMLParser::GetAttributeValueInt(tfNode, "ID");
TransferFunction* tf = new TransferFunction(id);
- auto cadPropNode = tfNode->first_node("CADProperties");
- if(!cadPropNode) return false;
-
- auto position = cadPropNode->first_node("Position");
- double posX = GetNodeValueDouble(position, "X");
- double posY = GetNodeValueDouble(position, "Y");
- auto size = cadPropNode->first_node("Size");
- double width = GetNodeValueDouble(size, "Width");
- double height = GetNodeValueDouble(size, "Height");
- double angle = GetNodeValueDouble(cadPropNode, "Angle");
-
- std::vector<double> numerator, denominator;
- auto numeratorNode = tfNode->first_node("Numerator");
- auto nValue = numeratorNode->first_node("Value");
- while(nValue) {
- double value = 0.0;
- wxString(nValue->value()).ToCDouble(&value);
- numerator.push_back(value);
- nValue = nValue->next_sibling("Value");
- }
- auto denominatorNode = tfNode->first_node("Denominator");
- auto dValue = denominatorNode->first_node("Value");
- while(dValue) {
- double value = 0.0;
- wxString(dValue->value()).ToCDouble(&value);
- denominator.push_back(value);
- dValue = dValue->next_sibling("Value");
- }
-
- std::vector<Node*> nodeVector;
- if(!OpenControlNodeList(tfNode, nodeVector)) return false;
-
- tf->SetWidth(width);
- tf->SetHeight(height);
- tf->SetAngle(angle);
- tf->SetPosition(wxPoint2DDouble(posX, posY));
-
- tf->SetNumerator(numerator);
- tf->SetDenominator(denominator);
-
- tf->StartMove(tf->GetPosition());
- tf->SetNodeList(nodeVector);
-
- tf->UpdateTFText();
-
+ if(!tf->OpenElement(tfNode)) return false;
elementList.push_back(tf);
tfNode = tfNode->next_sibling("TransferFunction");
@@ -2853,11 +901,11 @@ bool FileHanding::OpenControlElements(rapidxml::xml_document<>& doc,
auto connNode = connectionListNode->first_node("Connection");
while(connNode) {
ConnectionLine* cLine = NULL;
- int id = GetAttributeValueInt(connNode, "ID");
+ int id = XMLParser::GetAttributeValueInt(connNode, "ID");
auto cadPropNode = connNode->first_node("CADProperties");
if(!cadPropNode) return false;
- double offset = GetNodeValueDouble(cadPropNode, "Offset");
+ double offset = XMLParser::GetNodeValueDouble(cadPropNode, "Offset");
auto parentList = connNode->first_node("ParentList");
if(!parentList) return false;
@@ -2865,10 +913,10 @@ bool FileHanding::OpenControlElements(rapidxml::xml_document<>& doc,
auto parentNode = parentList->first_node("Parent");
bool firstNode = true;
while(parentNode) {
- int elementID = GetNodeValueInt(parentNode, "ElementID");
- int nodeID = GetNodeValueInt(parentNode, "NodeID");
+ int elementID = XMLParser::GetNodeValueInt(parentNode, "ElementID");
+ int nodeID = XMLParser::GetNodeValueInt(parentNode, "NodeID");
- ControlElement* element = GetControlElementFromID(elementList, elementID);
+ ControlElement* element = ControlElement::GetControlElementFromID(elementList, elementID);
Node* node = element->GetNodeList()[nodeID];
if(firstNode) cLine = new ConnectionLine(node, id);
@@ -2882,7 +930,7 @@ bool FileHanding::OpenControlElements(rapidxml::xml_document<>& doc,
auto parentLine = connNode->first_node("ParentLine");
if(!parentLine) return false;
- int parentLineID = GetAttributeValueInt(parentLine, "ID");
+ int parentLineID = XMLParser::GetAttributeValueInt(parentLine, "ID");
if(parentLineID != -1) {
for(auto it = connectionList.begin(), itEnd = connectionList.end(); it != itEnd; ++it) {
ConnectionLine* parent = *it;
@@ -2898,152 +946,8 @@ bool FileHanding::OpenControlElements(rapidxml::xml_document<>& doc,
connectionList.push_back(cLine);
connNode = connNode->next_sibling("Connection");
}
- } //}
-
- ctrlContainer->FillContainer(elementList, connectionList);
- return true;
-}
-
-void FileHanding::SaveControlNodes(rapidxml::xml_document<>& doc,
- rapidxml::xml_node<>* nodesN,
- std::vector<Node*> nodeList)
-{
- int id = 0;
- for(auto it = nodeList.begin(), itEnd = nodeList.end(); it != itEnd; ++it) {
- Node* node = *it;
- node->SetID(id);
- auto nodeN = AppendNode(doc, nodesN, "Node");
- SetNodeAttribute(doc, nodeN, "ID", id);
- auto nodePosition = AppendNode(doc, nodeN, "Position");
- auto posNodeX = AppendNode(doc, nodePosition, "X");
- SetNodeValue(doc, posNodeX, node->GetPosition().m_x);
- auto posNodeY = AppendNode(doc, nodePosition, "Y");
- SetNodeValue(doc, posNodeY, node->GetPosition().m_y);
- auto angle = AppendNode(doc, nodeN, "Angle");
- SetNodeValue(doc, angle, node->GetAngle());
- auto nodeType = AppendNode(doc, nodeN, "Type");
- SetNodeValue(doc, nodeType, node->GetNodeType());
- id++;
- }
-}
-
-ControlElement* FileHanding::GetControlElementFromID(std::vector<ControlElement*> elementList, int id)
-{
- for(auto it = elementList.begin(), itEnd = elementList.end(); it != itEnd; ++it) {
- ControlElement* element = *it;
- if(element->GetID() == id) return element;
- }
- return NULL;
-}
+ } //}
-bool FileHanding::OpenControlNodeList(rapidxml::xml_node<>* elementNode, std::vector<Node*>& nodeVector)
-{
- auto nodeList = elementNode->first_node("NodeList");
- if(!nodeList) return false;
- auto nodeN = nodeList->first_node("Node");
- while(nodeN) {
- auto nodePosition = nodeN->first_node("Position");
- double nodePosX = GetNodeValueDouble(nodePosition, "X");
- double nodePosY = GetNodeValueDouble(nodePosition, "Y");
- double nodeAngle = GetNodeValueDouble(nodeN, "Angle");
- Node::NodeType nodeType = (Node::NodeType)GetNodeValueInt(nodeN, "Type");
- Node* node = new Node(wxPoint2DDouble(nodePosX, nodePosY), nodeType, 2.0);
- node->SetAngle(nodeAngle);
- nodeVector.push_back(node);
- nodeN = nodeN->next_sibling("Node");
- }
+ ctrlContainer->FillContainer(elementList, connectionList);
return true;
}
-
-rapidxml::xml_node<>* FileHanding::AppendNode(rapidxml::xml_document<>& doc,
- rapidxml::xml_node<>* parentNode,
- const char* name,
- rapidxml::node_type nodeType)
-{
- rapidxml::xml_node<>* node = doc.allocate_node(nodeType, name);
- parentNode->append_node(node);
- return node;
-}
-
-void FileHanding::SetNodeValue(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* node, wxString value)
-{
- node->value(doc.allocate_string(value.mb_str()));
-}
-
-void FileHanding::SetNodeValue(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* node, int value)
-{
- node->value(doc.allocate_string(wxString::Format("%d", value).mb_str()));
-}
-
-void FileHanding::SetNodeValue(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* node, double value)
-{
- node->value(doc.allocate_string(wxString::FromCDouble(value, 13).mb_str()));
-}
-
-void FileHanding::SetNodeAttribute(rapidxml::xml_document<>& doc,
- rapidxml::xml_node<>* node,
- const char* atrName,
- wxString value)
-{
- node->append_attribute(doc.allocate_attribute(atrName, doc.allocate_string(value.mb_str())));
-}
-
-void FileHanding::SetNodeAttribute(rapidxml::xml_document<>& doc,
- rapidxml::xml_node<>* node,
- const char* atrName,
- int value)
-{
- node->append_attribute(
- doc.allocate_attribute(atrName, doc.allocate_string(wxString::Format("%d", value).mb_str())));
-}
-
-void FileHanding::SetNodeAttribute(rapidxml::xml_document<>& doc,
- rapidxml::xml_node<>* node,
- const char* atrName,
- double value)
-{
- node->append_attribute(
- doc.allocate_attribute(atrName, doc.allocate_string(wxString::FromCDouble(value, 13).mb_str())));
-}
-
-double FileHanding::GetNodeValueDouble(rapidxml::xml_node<>* parent, const char* nodeName)
-{
- double dValue = 0.0;
- if(parent) {
- auto node = parent->first_node(nodeName);
- if(node) wxString(node->value()).ToCDouble(&dValue);
- }
- return dValue;
-}
-
-int FileHanding::GetNodeValueInt(rapidxml::xml_node<>* parent, const char* nodeName)
-{
- long iValue = -1;
- if(parent) {
- auto node = parent->first_node(nodeName);
- if(node) wxString(node->value()).ToCLong(&iValue);
- }
- return (int)iValue;
-}
-
-int FileHanding::GetAttributeValueInt(rapidxml::xml_node<>* parent, const char* nodeName, const char* atrName)
-{
- long iValue = -1;
- if(parent) {
- auto node = parent->first_node(nodeName);
- if(node) {
- auto atr = node->first_attribute(atrName);
- if(atr) wxString(atr->value()).ToCLong(&iValue);
- }
- }
- return (int)iValue;
-}
-
-int FileHanding::GetAttributeValueInt(rapidxml::xml_node<>* node, const char* atrName)
-{
- long intValue;
- auto atr = node->first_attribute(atrName);
- if(!atr) return false;
- wxString(atr->value()).ToCLong(&intValue);
- return (int)intValue;
-}