summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThales Lima Oliveira <thaleslima.ufu@gmail.com>2018-01-05 20:04:28 -0200
committerThales Lima Oliveira <thaleslima.ufu@gmail.com>2018-01-05 20:04:28 -0200
commit95f61a7cad71c45c9e27af5c6f4bc5d64d5ecc45 (patch)
treed11fb974997f49942977a5ce3318074ea503f9bc
parent76df1de5e2307229da9870306e4a1031170aaadf (diff)
downloadPSP.git-95f61a7cad71c45c9e27af5c6f4bc5d64d5ecc45.tar.gz
PSP.git-95f61a7cad71c45c9e27af5c6f4bc5d64d5ecc45.tar.xz
PSP.git-95f61a7cad71c45c9e27af5c6f4bc5d64d5ecc45.zip
Some power element file hand. organized
-rw-r--r--Project/Bus.cpp84
-rw-r--r--Project/Bus.h3
-rw-r--r--Project/Capacitor.cpp42
-rw-r--r--Project/Capacitor.h4
-rw-r--r--Project/FileHanding.cpp359
-rw-r--r--Project/IndMotor.cpp45
-rw-r--r--Project/IndMotor.h4
-rw-r--r--Project/PowerElement.cpp108
-rw-r--r--Project/PowerElement.h6
-rw-r--r--Project/Project.mk2
10 files changed, 329 insertions, 328 deletions
diff --git a/Project/Bus.cpp b/Project/Bus.cpp
index ee84ec2..be0f935 100644
--- a/Project/Bus.cpp
+++ b/Project/Bus.cpp
@@ -258,3 +258,87 @@ bool Bus::GetPlotData(ElementPlotData& plotData)
plotData.AddData(argVoltage, _("Angle"));
return true;
}
+
+void Bus::SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode)
+{
+ m_electricalData.number = m_elementID;
+
+ auto elementNode = XMLParser::AppendNode(doc, elementListNode, "Bus");
+ XMLParser::SetNodeAttribute(doc, elementNode, "ID", m_elementID);
+
+ Element::SaveCADProperties(doc, elementNode);
+
+ auto electricalProp = XMLParser::AppendNode(doc, elementNode, "ElectricalProperties");
+ auto name = XMLParser::AppendNode(doc, electricalProp, "Name");
+ XMLParser::SetNodeValue(doc, name, m_electricalData.name);
+ auto nominalVoltage = XMLParser::AppendNode(doc, electricalProp, "NominalVoltage");
+ XMLParser::SetNodeValue(doc, nominalVoltage, m_electricalData.nominalVoltage);
+ XMLParser::SetNodeAttribute(doc, nominalVoltage, "UnitID", m_electricalData.nominalVoltageUnit);
+ auto isVoltageControlled = XMLParser::AppendNode(doc, electricalProp, "IsVoltageControlled");
+ XMLParser::SetNodeValue(doc, isVoltageControlled, m_electricalData.isVoltageControlled);
+ auto controlledVoltage = XMLParser::AppendNode(doc, electricalProp, "ControlledVoltage");
+ XMLParser::SetNodeValue(doc, controlledVoltage, m_electricalData.controlledVoltage);
+ XMLParser::SetNodeAttribute(doc, controlledVoltage, "Choice", m_electricalData.controlledVoltageUnitChoice);
+ auto slackBus = XMLParser::AppendNode(doc, electricalProp, "SlackBus");
+ XMLParser::SetNodeValue(doc, slackBus, m_electricalData.slackBus);
+
+ auto fault = XMLParser::AppendNode(doc, electricalProp, "Fault");
+ auto hasFault = XMLParser::AppendNode(doc, fault, "HasFault");
+ XMLParser::SetNodeValue(doc, hasFault, m_electricalData.hasFault);
+ auto faultType = XMLParser::AppendNode(doc, fault, "Type");
+ XMLParser::SetNodeValue(doc, faultType, m_electricalData.faultType);
+ auto faultLocation = XMLParser::AppendNode(doc, fault, "Location");
+ XMLParser::SetNodeValue(doc, faultLocation, m_electricalData.faultLocation);
+ auto faultResistance = XMLParser::AppendNode(doc, fault, "Resistance");
+ XMLParser::SetNodeValue(doc, faultResistance, m_electricalData.faultResistance);
+ auto faultReactance = XMLParser::AppendNode(doc, fault, "Reactance");
+ XMLParser::SetNodeValue(doc, faultReactance, m_electricalData.faultReactance);
+
+ auto stability = XMLParser::AppendNode(doc, electricalProp, "Stability");
+ auto plotBus = XMLParser::AppendNode(doc, stability, "Plot");
+ XMLParser::SetNodeValue(doc, plotBus, m_electricalData.plotBus);
+ auto stabHasFault = XMLParser::AppendNode(doc, stability, "HasFault");
+ XMLParser::SetNodeValue(doc, stabHasFault, m_electricalData.stabHasFault);
+ auto stabFaultTime = XMLParser::AppendNode(doc, stability, "FaultTime");
+ XMLParser::SetNodeValue(doc, stabFaultTime, m_electricalData.stabFaultTime);
+ auto stabFaultLength = XMLParser::AppendNode(doc, stability, "FaultLength");
+ XMLParser::SetNodeValue(doc, stabFaultLength, m_electricalData.stabFaultLength);
+ auto stabFaultResistance = XMLParser::AppendNode(doc, stability, "FaultResistance");
+ XMLParser::SetNodeValue(doc, stabFaultResistance, m_electricalData.stabFaultResistance);
+ auto stabFaultReactance = XMLParser::AppendNode(doc, stability, "FaultReactance");
+ XMLParser::SetNodeValue(doc, stabFaultReactance, m_electricalData.stabFaultReactance);
+}
+
+bool Bus::OpenElement(rapidxml::xml_node<>* elementNode)
+{
+ if(!Element::OpenCADProperties(elementNode)) return false;
+
+ auto electricalProp = elementNode->first_node("ElectricalProperties");
+ if(!electricalProp) return false;
+
+ m_electricalData.name = electricalProp->first_node("Name")->value();
+ m_electricalData.nominalVoltage = XMLParser::GetNodeValueDouble(electricalProp, "NominalVoltage");
+ m_electricalData.nominalVoltageUnit =
+ (ElectricalUnit)XMLParser::GetAttributeValueInt(electricalProp, "NominalVoltage", "UnitID");
+ m_electricalData.isVoltageControlled = XMLParser::GetNodeValueInt(electricalProp, "IsVoltageControlled");
+ m_electricalData.controlledVoltage = XMLParser::GetNodeValueDouble(electricalProp, "ControlledVoltage");
+ m_electricalData.controlledVoltageUnitChoice =
+ XMLParser::GetAttributeValueInt(electricalProp, "ControlledVoltage", "Choice");
+ m_electricalData.slackBus = XMLParser::GetNodeValueInt(electricalProp, "SlackBus");
+ auto fault = electricalProp->first_node("Fault");
+ m_electricalData.hasFault = XMLParser::GetNodeValueInt(fault, "HasFault");
+ m_electricalData.faultType = (FaultData)XMLParser::GetNodeValueInt(fault, "Type");
+ m_electricalData.faultLocation = (FaultData)XMLParser::GetNodeValueInt(fault, "Location");
+ m_electricalData.faultResistance = XMLParser::GetNodeValueDouble(fault, "Resistance");
+ m_electricalData.faultReactance = XMLParser::GetNodeValueDouble(fault, "Reactance");
+ auto stability = electricalProp->first_node("Stability");
+ m_electricalData.plotBus = XMLParser::GetNodeValueInt(stability, "Plot");
+ m_electricalData.stabHasFault = XMLParser::GetNodeValueInt(stability, "HasFault");
+ m_electricalData.stabFaultTime = XMLParser::GetNodeValueDouble(stability, "FaultTime");
+ m_electricalData.stabFaultLength = XMLParser::GetNodeValueDouble(stability, "FaultLength");
+ m_electricalData.stabFaultResistance = XMLParser::GetNodeValueDouble(stability, "FaultResistance");
+ m_electricalData.stabFaultReactance = XMLParser::GetNodeValueDouble(stability, "FaultReactance");
+
+ if(m_electricalData.stabHasFault) SetDynamicEvent(true);
+ return true;
+}
diff --git a/Project/Bus.h b/Project/Bus.h
index f4bdb04..9264585 100644
--- a/Project/Bus.h
+++ b/Project/Bus.h
@@ -88,6 +88,9 @@ class Bus : public PowerElement
virtual void SetElectricalData(BusElectricalData electricalData) { m_electricalData = electricalData; }
virtual bool ShowForm(wxWindow* parent, Element* element);
virtual bool GetPlotData(ElementPlotData& plotData);
+
+ virtual void SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode);
+ virtual bool OpenElement(rapidxml::xml_node<>* elementNode);
protected:
BusElectricalData m_electricalData;
diff --git a/Project/Capacitor.cpp b/Project/Capacitor.cpp
index 4f7491f..0378506 100644
--- a/Project/Capacitor.cpp
+++ b/Project/Capacitor.cpp
@@ -15,8 +15,8 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
-#include "ReactiveShuntElementForm.h"
#include "Capacitor.h"
+#include "ReactiveShuntElementForm.h"
Capacitor::Capacitor() : Shunt() {}
Capacitor::Capacitor(wxString name) : Shunt() { m_electricalData.name = name; }
@@ -217,3 +217,43 @@ wxString Capacitor::GetTipText() const
return tipText;
}
+
+void Capacitor::SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode)
+{
+ auto elementNode = XMLParser::AppendNode(doc, elementListNode, "Capacitor");
+ XMLParser::SetNodeAttribute(doc, elementNode, "ID", m_elementID);
+
+ SaveCADProperties(doc, elementNode);
+
+ auto electricalProp = XMLParser::AppendNode(doc, elementNode, "ElectricalProperties");
+ auto isOnline = XMLParser::AppendNode(doc, electricalProp, "IsOnline");
+ XMLParser::SetNodeValue(doc, isOnline, m_online);
+ auto name = XMLParser::AppendNode(doc, electricalProp, "Name");
+ XMLParser::SetNodeValue(doc, name, m_electricalData.name);
+ auto reactivePower = XMLParser::AppendNode(doc, electricalProp, "ReactivePower");
+ XMLParser::SetNodeValue(doc, reactivePower, m_electricalData.reactivePower);
+ XMLParser::SetNodeAttribute(doc, reactivePower, "UnitID", m_electricalData.reactivePowerUnit);
+
+ SaveSwitchingData(doc, electricalProp);
+}
+
+bool Capacitor::OpenElement(rapidxml::xml_node<>* elementNode, std::vector<Element*> parentList)
+{
+ if(!OpenCADProperties(elementNode, parentList)) return false;
+
+ auto electricalProp = elementNode->first_node("ElectricalProperties");
+ if(!electricalProp) return false;
+
+ SetOnline(XMLParser::GetNodeValueInt(electricalProp, "IsOnline"));
+ m_electricalData.name = electricalProp->first_node("Name")->value();
+ m_electricalData.reactivePower = XMLParser::GetNodeValueDouble(electricalProp, "ReactivePower");
+ m_electricalData.reactivePowerUnit =
+ static_cast<ElectricalUnit>(XMLParser::GetAttributeValueInt(electricalProp, "ReactivePower", "UnitID"));
+
+ if(!OpenSwitchingData(electricalProp)) return false;
+
+ if(m_swData.swTime.size() != 0) SetDynamicEvent(true);
+
+ m_inserted = true;
+ return true;
+}
diff --git a/Project/Capacitor.h b/Project/Capacitor.h
index 1a6ed57..7f09e09 100644
--- a/Project/Capacitor.h
+++ b/Project/Capacitor.h
@@ -54,6 +54,10 @@ class Capacitor : public Shunt
virtual CapacitorElectricalData GetElectricalData() { return m_electricalData; }
virtual CapacitorElectricalData GetPUElectricalData(double systemPowerBase);
virtual void SetElectricalData(CapacitorElectricalData electricalData) { m_electricalData = electricalData; }
+
+ virtual void SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode);
+ virtual bool OpenElement(rapidxml::xml_node<>* elementNode, std::vector<Element*> parentList);
+
protected:
CapacitorElectricalData m_electricalData;
};
diff --git a/Project/FileHanding.cpp b/Project/FileHanding.cpp
index 512fae2..1393be7 100644
--- a/Project/FileHanding.cpp
+++ b/Project/FileHanding.cpp
@@ -119,166 +119,39 @@ void FileHanding::SaveProject(wxFileName path)
// Save all the data
ElectricCalculation allElements;
allElements.GetElementsFromList(m_workspace->GetElementList());
+ int elementID = 0;
//{ Buses
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 = XMLParser::AppendNode(doc, busesNode, "Bus");
- XMLParser::SetNodeAttribute(doc, busNode, "ID", i);
- auto cadProp = XMLParser::AppendNode(doc, busNode, "CADProperties");
- auto position = XMLParser::AppendNode(doc, cadProp, "Position");
- auto posX = XMLParser::AppendNode(doc, position, "X");
- XMLParser::SetNodeValue(doc, posX, bus->GetPosition().m_x);
- auto posY = XMLParser::AppendNode(doc, position, "Y");
- XMLParser::SetNodeValue(doc, posY, bus->GetPosition().m_y);
- auto size = XMLParser::AppendNode(doc, cadProp, "Size");
- auto width = XMLParser::AppendNode(doc, size, "Width");
- XMLParser::SetNodeValue(doc, width, bus->GetWidth());
- auto height = XMLParser::AppendNode(doc, size, "Height");
- XMLParser::SetNodeValue(doc, height, bus->GetHeight());
- auto angle = XMLParser::AppendNode(doc, cadProp, "Angle");
- XMLParser::SetNodeValue(doc, angle, bus->GetAngle());
-
- BusElectricalData data = bus->GetElectricalData();
- auto electricalProp = XMLParser::AppendNode(doc, busNode, "ElectricalProperties");
- auto name = XMLParser::AppendNode(doc, electricalProp, "Name");
- XMLParser::SetNodeValue(doc, name, data.name);
- auto nominalVoltage = XMLParser::AppendNode(doc, electricalProp, "NominalVoltage");
- XMLParser::SetNodeValue(doc, nominalVoltage, data.nominalVoltage);
- XMLParser::SetNodeAttribute(doc, nominalVoltage, "UnitID", data.nominalVoltageUnit);
- auto isVoltageControlled = XMLParser::AppendNode(doc, electricalProp, "IsVoltageControlled");
- XMLParser::SetNodeValue(doc, isVoltageControlled, data.isVoltageControlled);
- auto controlledVoltage = XMLParser::AppendNode(doc, electricalProp, "ControlledVoltage");
- XMLParser::SetNodeValue(doc, controlledVoltage, data.controlledVoltage);
- XMLParser::SetNodeAttribute(doc, controlledVoltage, "Choice", data.controlledVoltageUnitChoice);
- auto slackBus = XMLParser::AppendNode(doc, electricalProp, "SlackBus");
- XMLParser::SetNodeValue(doc, slackBus, data.slackBus);
-
- auto fault = XMLParser::AppendNode(doc, electricalProp, "Fault");
- auto hasFault = XMLParser::AppendNode(doc, fault, "HasFault");
- XMLParser::SetNodeValue(doc, hasFault, data.hasFault);
- auto faultType = XMLParser::AppendNode(doc, fault, "Type");
- XMLParser::SetNodeValue(doc, faultType, data.faultType);
- auto faultLocation = XMLParser::AppendNode(doc, fault, "Location");
- XMLParser::SetNodeValue(doc, faultLocation, data.faultLocation);
- auto faultResistance = XMLParser::AppendNode(doc, fault, "Resistance");
- XMLParser::SetNodeValue(doc, faultResistance, data.faultResistance);
- auto faultReactance = XMLParser::AppendNode(doc, fault, "Reactance");
- XMLParser::SetNodeValue(doc, faultReactance, data.faultReactance);
-
- auto stability = XMLParser::AppendNode(doc, electricalProp, "Stability");
- auto plotBus = XMLParser::AppendNode(doc, stability, "Plot");
- XMLParser::SetNodeValue(doc, plotBus, data.plotBus);
- auto stabHasFault = XMLParser::AppendNode(doc, stability, "HasFault");
- XMLParser::SetNodeValue(doc, stabHasFault, data.stabHasFault);
- auto stabFaultTime = XMLParser::AppendNode(doc, stability, "FaultTime");
- XMLParser::SetNodeValue(doc, stabFaultTime, data.stabFaultTime);
- auto stabFaultLength = XMLParser::AppendNode(doc, stability, "FaultLength");
- XMLParser::SetNodeValue(doc, stabFaultLength, data.stabFaultLength);
- auto stabFaultResistance = XMLParser::AppendNode(doc, stability, "FaultResistance");
- XMLParser::SetNodeValue(doc, stabFaultResistance, data.stabFaultResistance);
- auto stabFaultReactance = XMLParser::AppendNode(doc, stability, "FaultReactance");
- XMLParser::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 = XMLParser::AppendNode(doc, elementsNode, "CapacitorList");
auto capacitorList = allElements.GetCapacitorList();
- for(int i = 0; i < (int)capacitorList.size(); i++) {
- Capacitor* capacitor = capacitorList[i];
- auto capacitorNode = XMLParser::AppendNode(doc, capacitorsNode, "Capacitor");
- XMLParser::SetNodeAttribute(doc, capacitorNode, "ID", i);
- auto cadProp = XMLParser::AppendNode(doc, capacitorNode, "CADProperties");
- auto position = XMLParser::AppendNode(doc, cadProp, "Position");
- auto posX = XMLParser::AppendNode(doc, position, "X");
- XMLParser::SetNodeValue(doc, posX, capacitor->GetPosition().m_x);
- auto posY = XMLParser::AppendNode(doc, position, "Y");
- XMLParser::SetNodeValue(doc, posY, capacitor->GetPosition().m_y);
- auto size = XMLParser::AppendNode(doc, cadProp, "Size");
- auto width = XMLParser::AppendNode(doc, size, "Width");
- XMLParser::SetNodeValue(doc, width, capacitor->GetWidth());
- auto height = XMLParser::AppendNode(doc, size, "Height");
- XMLParser::SetNodeValue(doc, height, capacitor->GetHeight());
- auto angle = XMLParser::AppendNode(doc, cadProp, "Angle");
- XMLParser::SetNodeValue(doc, angle, capacitor->GetAngle());
- auto nodePos = XMLParser::AppendNode(doc, cadProp, "NodePosition");
- auto nodePosX = XMLParser::AppendNode(doc, nodePos, "X");
- XMLParser::SetNodeValue(doc, nodePosX, capacitor->GetPointList()[0].m_x);
- auto nodePosY = XMLParser::AppendNode(doc, nodePos, "Y");
- XMLParser::SetNodeValue(doc, nodePosY, capacitor->GetPointList()[0].m_y);
- auto parentID = XMLParser::AppendNode(doc, cadProp, "ParentID");
- Bus* parent = static_cast<Bus*>(capacitor->GetParentList()[0]);
- if(parent) XMLParser::SetNodeValue(doc, parentID, parent->GetElectricalData().number);
-
- CapacitorElectricalData data = capacitor->GetElectricalData();
- auto electricalProp = XMLParser::AppendNode(doc, capacitorNode, "ElectricalProperties");
- auto isOnline = XMLParser::AppendNode(doc, electricalProp, "IsOnline");
- XMLParser::SetNodeValue(doc, isOnline, capacitor->IsOnline());
- auto name = XMLParser::AppendNode(doc, electricalProp, "Name");
- XMLParser::SetNodeValue(doc, name, data.name);
- auto reactivePower = XMLParser::AppendNode(doc, electricalProp, "ReactivePower");
- XMLParser::SetNodeValue(doc, reactivePower, data.reactivePower);
- XMLParser::SetNodeAttribute(doc, reactivePower, "UnitID", data.reactivePowerUnit);
-
- auto switchingList = XMLParser::AppendNode(doc, electricalProp, "SwitchingList");
- SwitchingData swData = capacitor->GetSwitchingData();
- for(int j = 0; j < (int)swData.swType.size(); j++) {
- auto switching = XMLParser::AppendNode(doc, switchingList, "Switching");
- XMLParser::SetNodeAttribute(doc, switching, "ID", j);
- auto swType = XMLParser::AppendNode(doc, switching, "Type");
- XMLParser::SetNodeValue(doc, swType, swData.swType[j]);
- auto swTime = XMLParser::AppendNode(doc, switching, "Time");
- XMLParser::SetNodeValue(doc, swTime, swData.swTime[j]);
- }
- } //}
+ elementID = 0;
+ for(auto it = capacitorList.begin(), itEnd = capacitorList.end(); it != itEnd; ++it) {
+ (*it)->SetID(elementID);
+ (*it)->SaveElement(doc, capacitorsNode);
+ elementID++;
+ }
+ //}
//{ IndMotor
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 = XMLParser::AppendNode(doc, indMotorsNode, "IndMotor");
- XMLParser::SetNodeAttribute(doc, indMotorNode, "ID", i);
- auto cadProp = XMLParser::AppendNode(doc, indMotorNode, "CADProperties");
- auto position = XMLParser::AppendNode(doc, cadProp, "Position");
- auto posX = XMLParser::AppendNode(doc, position, "X");
- XMLParser::SetNodeValue(doc, posX, indMotor->GetPosition().m_x);
- auto posY = XMLParser::AppendNode(doc, position, "Y");
- XMLParser::SetNodeValue(doc, posY, indMotor->GetPosition().m_y);
- auto size = XMLParser::AppendNode(doc, cadProp, "Size");
- auto width = XMLParser::AppendNode(doc, size, "Width");
- XMLParser::SetNodeValue(doc, width, indMotor->GetWidth());
- auto height = XMLParser::AppendNode(doc, size, "Height");
- XMLParser::SetNodeValue(doc, height, indMotor->GetHeight());
- auto angle = XMLParser::AppendNode(doc, cadProp, "Angle");
- XMLParser::SetNodeValue(doc, angle, indMotor->GetAngle());
- auto nodePos = XMLParser::AppendNode(doc, cadProp, "NodePosition");
- auto nodePosX = XMLParser::AppendNode(doc, nodePos, "X");
- XMLParser::SetNodeValue(doc, nodePosX, indMotor->GetPointList()[0].m_x);
- auto nodePosY = XMLParser::AppendNode(doc, nodePos, "Y");
- XMLParser::SetNodeValue(doc, nodePosY, indMotor->GetPointList()[0].m_y);
- auto parentID = XMLParser::AppendNode(doc, cadProp, "ParentID");
- Bus* parent = static_cast<Bus*>(indMotor->GetParentList()[0]);
- if(parent) XMLParser::SetNodeValue(doc, parentID, parent->GetElectricalData().number);
-
- IndMotorElectricalData data = indMotor->GetElectricalData();
- auto electricalProp = XMLParser::AppendNode(doc, indMotorNode, "ElectricalProperties");
- auto isOnline = XMLParser::AppendNode(doc, electricalProp, "IsOnline");
- XMLParser::SetNodeValue(doc, isOnline, indMotor->IsOnline());
- auto name = XMLParser::AppendNode(doc, electricalProp, "Name");
- XMLParser::SetNodeValue(doc, name, data.name);
- auto activePower = XMLParser::AppendNode(doc, electricalProp, "ActivePower");
- XMLParser::SetNodeValue(doc, activePower, data.activePower);
- XMLParser::SetNodeAttribute(doc, activePower, "UnitID", data.activePowerUnit);
- auto reactivePower = XMLParser::AppendNode(doc, electricalProp, "ReactivePower");
- XMLParser::SetNodeValue(doc, reactivePower, data.reactivePower);
- XMLParser::SetNodeAttribute(doc, reactivePower, "UnitID", data.reactivePowerUnit);
- } //}
+ elementID = 0;
+ for(auto it = indMotorList.begin(), itEnd = indMotorList.end(); it != itEnd; ++it) {
+ (*it)->SetID(elementID);
+ (*it)->SaveElement(doc, indMotorsNode);
+ elementID++;
+ }
+ //}
//{ Inductor
auto inductorsNode = XMLParser::AppendNode(doc, elementsNode, "InductorList");
@@ -908,7 +781,7 @@ 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");
@@ -957,7 +830,7 @@ bool FileHanding::OpenProject(wxFileName path)
simData.underVoltageConstPower = XMLParser::GetNodeValueDouble(uvLimit, "ConstantPower");
}
}
- // }
+ //}
propData->SetSimulationPropertiesData(simData);
@@ -976,68 +849,22 @@ bool FileHanding::OpenProject(wxFileName path)
std::vector<SyncMotor*> syncMotorList;
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 = XMLParser::GetNodeValueDouble(position, "X");
- double posY = XMLParser::GetNodeValueDouble(position, "Y");
- Bus* bus = new Bus(wxPoint2DDouble(posX, posY));
-
- auto size = cadPropNode->first_node("Size");
- double width = XMLParser::GetNodeValueDouble(size, "Width");
- double height = XMLParser::GetNodeValueDouble(size, "Height");
- double angle = XMLParser::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 = XMLParser::GetNodeValueDouble(electricalProp, "NominalVoltage");
- data.nominalVoltageUnit =
- (ElectricalUnit)XMLParser::GetAttributeValueInt(electricalProp, "NominalVoltage", "UnitID");
- data.isVoltageControlled = XMLParser::GetNodeValueInt(electricalProp, "IsVoltageControlled");
- data.controlledVoltage = XMLParser::GetNodeValueDouble(electricalProp, "ControlledVoltage");
- data.controlledVoltageUnitChoice =
- XMLParser::GetAttributeValueInt(electricalProp, "ControlledVoltage", "Choice");
- data.slackBus = XMLParser::GetNodeValueInt(electricalProp, "SlackBus");
- auto fault = electricalProp->first_node("Fault");
- data.hasFault = XMLParser::GetNodeValueInt(fault, "HasFault");
- data.faultType = (FaultData)XMLParser::GetNodeValueInt(fault, "Type");
- data.faultLocation = (FaultData)XMLParser::GetNodeValueInt(fault, "Location");
- data.faultResistance = XMLParser::GetNodeValueDouble(fault, "Resistance");
- data.faultReactance = XMLParser::GetNodeValueDouble(fault, "Reactance");
- auto stability = electricalProp->first_node("Stability");
- data.plotBus = XMLParser::GetNodeValueInt(stability, "Plot");
- data.stabHasFault = XMLParser::GetNodeValueInt(stability, "HasFault");
- data.stabFaultTime = XMLParser::GetNodeValueDouble(stability, "FaultTime");
- data.stabFaultLength = XMLParser::GetNodeValueDouble(stability, "FaultLength");
- data.stabFaultResistance = XMLParser::GetNodeValueDouble(stability, "FaultResistance");
- data.stabFaultReactance = XMLParser::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");
} //}
@@ -1047,73 +874,11 @@ bool FileHanding::OpenProject(wxFileName path)
auto capacitorNode = capacitorListNode->first_node("Capacitor");
while(capacitorNode) {
Capacitor* capacitor = new Capacitor();
-
- auto cadPropNode = capacitorNode->first_node("CADProperties");
- if(!cadPropNode) return false;
-
- auto position = cadPropNode->first_node("Position");
- double posX = XMLParser::GetNodeValueDouble(position, "X");
- double posY = XMLParser::GetNodeValueDouble(position, "Y");
- auto size = cadPropNode->first_node("Size");
- double width = XMLParser::GetNodeValueDouble(size, "Width");
- double height = XMLParser::GetNodeValueDouble(size, "Height");
- double angle = XMLParser::GetNodeValueDouble(cadPropNode, "Angle");
- auto nodePosition = cadPropNode->first_node("NodePosition");
- double nodePosX = XMLParser::GetNodeValueDouble(nodePosition, "X");
- double nodePosY = XMLParser::GetNodeValueDouble(nodePosition, "Y");
- int parentID = XMLParser::GetNodeValueInt(cadPropNode, "ParentID");
- if(parentID == -1) {
- // If the element has no parent, create a temporary one, remove and delete.
- Bus* parent = new Bus(wxPoint2DDouble(nodePosX, nodePosY));
- 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(XMLParser::GetNodeValueInt(electricalProp, "IsOnline"));
- CapacitorElectricalData data = capacitor->GetElectricalData();
- data.name = electricalProp->first_node("Name")->value();
- data.reactivePower = XMLParser::GetNodeValueDouble(electricalProp, "ReactivePower");
- data.reactivePowerUnit =
- (ElectricalUnit)XMLParser::GetAttributeValueInt(electricalProp, "ReactivePower", "UnitID");
-
- SwitchingData swData;
- auto switchingList = electricalProp->first_node("SwitchingList");
- if(!switchingList) return false;
- auto swNode = switchingList->first_node("Switching");
- while(swNode) {
- swData.swType.push_back((SwitchingType)XMLParser::GetNodeValueInt(swNode, "Type"));
- swData.swTime.push_back(XMLParser::GetNodeValueDouble(swNode, "Time"));
- swNode = swNode->next_sibling("Switching");
- }
- 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");
} //}
@@ -1123,61 +888,11 @@ bool FileHanding::OpenProject(wxFileName path)
auto indMotorNode = indMotorListNode->first_node("IndMotor");
while(indMotorNode) {
IndMotor* indMotor = new IndMotor();
-
- auto cadPropNode = indMotorNode->first_node("CADProperties");
- if(!cadPropNode) return false;
-
- auto position = cadPropNode->first_node("Position");
- double posX = XMLParser::GetNodeValueDouble(position, "X");
- double posY = XMLParser::GetNodeValueDouble(position, "Y");
- auto size = cadPropNode->first_node("Size");
- double width = XMLParser::GetNodeValueDouble(size, "Width");
- double height = XMLParser::GetNodeValueDouble(size, "Height");
- double angle = XMLParser::GetNodeValueDouble(cadPropNode, "Angle");
- auto nodePosition = cadPropNode->first_node("NodePosition");
- double nodePosX = XMLParser::GetNodeValueDouble(nodePosition, "X");
- double nodePosY = XMLParser::GetNodeValueDouble(nodePosition, "Y");
- int parentID = XMLParser::GetNodeValueInt(cadPropNode, "ParentID");
- if(parentID == -1) {
- // If the element has no parent, create a temporary one, remove and delete.
- Bus* parent = new Bus(wxPoint2DDouble(nodePosX, nodePosY));
- 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(XMLParser::GetNodeValueInt(electricalProp, "IsOnline"));
- IndMotorElectricalData data = indMotor->GetElectricalData();
- data.name = electricalProp->first_node("Name")->value();
- data.activePower = XMLParser::GetNodeValueDouble(electricalProp, "ActivePower");
- data.activePowerUnit = (ElectricalUnit)XMLParser::GetAttributeValueInt(electricalProp, "ActivePower", "UnitID");
- data.reactivePower = XMLParser::GetNodeValueDouble(electricalProp, "ReactivePower");
- data.reactivePowerUnit =
- (ElectricalUnit)XMLParser::GetAttributeValueInt(electricalProp, "ReactivePower", "UnitID");
-
- indMotor->SetElectricalData(data);
+
+ if(!indMotor->OpenElement(indMotorNode, parentList)) return false;
elementList.push_back(indMotor);
indMotorList.push_back(indMotor);
+
indMotorNode = indMotorNode->next_sibling("IndMotor");
} //}
diff --git a/Project/IndMotor.cpp b/Project/IndMotor.cpp
index 64d40c4..73c9c4f 100644
--- a/Project/IndMotor.cpp
+++ b/Project/IndMotor.cpp
@@ -15,8 +15,8 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
-#include "IndMotorForm.h"
#include "IndMotor.h"
+#include "IndMotorForm.h"
IndMotor::IndMotor() : Machines() {}
IndMotor::IndMotor(wxString name) : Machines() { m_electricalData.name = name; }
@@ -142,3 +142,46 @@ wxString IndMotor::GetTipText() const
return tipText;
}
+
+void IndMotor::SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode)
+{
+ auto elementNode = XMLParser::AppendNode(doc, elementListNode, "IndMotor");
+ XMLParser::SetNodeAttribute(doc, elementNode, "ID", m_elementID);
+
+ SaveCADProperties(doc, elementNode);
+
+ // Element properties
+ auto electricalProp = XMLParser::AppendNode(doc, elementNode, "ElectricalProperties");
+ auto isOnline = XMLParser::AppendNode(doc, electricalProp, "IsOnline");
+ XMLParser::SetNodeValue(doc, isOnline, m_online);
+ auto name = XMLParser::AppendNode(doc, electricalProp, "Name");
+ XMLParser::SetNodeValue(doc, name, m_electricalData.name);
+ auto activePower = XMLParser::AppendNode(doc, electricalProp, "ActivePower");
+ XMLParser::SetNodeValue(doc, activePower, m_electricalData.activePower);
+ XMLParser::SetNodeAttribute(doc, activePower, "UnitID", m_electricalData.activePowerUnit);
+ auto reactivePower = XMLParser::AppendNode(doc, electricalProp, "ReactivePower");
+ XMLParser::SetNodeValue(doc, reactivePower, m_electricalData.reactivePower);
+ XMLParser::SetNodeAttribute(doc, reactivePower, "UnitID", m_electricalData.reactivePowerUnit);
+}
+
+bool IndMotor::OpenElement(rapidxml::xml_node<>* elementNode, std::vector<Element*> parentList)
+{
+ if(!OpenCADProperties(elementNode, parentList)) return false;
+
+ auto electricalProp = elementNode->first_node("ElectricalProperties");
+ if(!electricalProp) return false;
+
+ // Element properties
+ SetOnline(XMLParser::GetNodeValueInt(electricalProp, "IsOnline"));
+ m_electricalData.name = electricalProp->first_node("Name")->value();
+ m_electricalData.activePower = XMLParser::GetNodeValueDouble(electricalProp, "ActivePower");
+ m_electricalData.activePowerUnit =
+ static_cast<ElectricalUnit>(XMLParser::GetAttributeValueInt(electricalProp, "ActivePower", "UnitID"));
+ m_electricalData.reactivePower = XMLParser::GetNodeValueDouble(electricalProp, "ReactivePower");
+ m_electricalData.reactivePowerUnit =
+ static_cast<ElectricalUnit>(XMLParser::GetAttributeValueInt(electricalProp, "ReactivePower", "UnitID"));
+
+ m_inserted = true;
+
+ return true;
+}
diff --git a/Project/IndMotor.h b/Project/IndMotor.h
index 511eb61..bd2c572 100644
--- a/Project/IndMotor.h
+++ b/Project/IndMotor.h
@@ -52,6 +52,10 @@ class IndMotor : public Machines
virtual IndMotorElectricalData GetElectricalData() { return m_electricalData; }
virtual IndMotorElectricalData GetPUElectricalData(double systemPowerBase);
virtual void SetElectricalData(IndMotorElectricalData electricalData) { m_electricalData = electricalData; }
+
+ virtual void SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode);
+ virtual bool OpenElement(rapidxml::xml_node<>* elementNode, std::vector<Element*> parentList);
+
protected:
IndMotorElectricalData m_electricalData;
};
diff --git a/Project/PowerElement.cpp b/Project/PowerElement.cpp
index 4c4e072..326c1c8 100644
--- a/Project/PowerElement.cpp
+++ b/Project/PowerElement.cpp
@@ -155,9 +155,7 @@ void PowerElement::DrawPowerFlowPts() const
{
if(m_online) {
glColor4dv(m_powerFlowArrowColour.GetRGBA());
- for(int i = 0; i < (int)m_powerFlowArrow.size(); i++) {
- DrawTriangle(m_powerFlowArrow[i]);
- }
+ for(int i = 0; i < (int)m_powerFlowArrow.size(); i++) { DrawTriangle(m_powerFlowArrow[i]); }
}
}
@@ -181,3 +179,107 @@ double PowerElement::GetValueFromUnit(double value, ElectricalUnit valueUnit)
}
return value;
}
+
+bool PowerElement::OpenCADProperties(rapidxml::xml_node<>* elementNode, std::vector<Element*> parentList)
+{
+ auto cadPropNode = elementNode->first_node("CADProperties");
+ if(!cadPropNode) return false;
+
+ auto position = cadPropNode->first_node("Position");
+ double posX = XMLParser::GetNodeValueDouble(position, "X");
+ double posY = XMLParser::GetNodeValueDouble(position, "Y");
+ auto size = cadPropNode->first_node("Size");
+ m_width = XMLParser::GetNodeValueDouble(size, "Width");
+ m_height = XMLParser::GetNodeValueDouble(size, "Height");
+ double angle = XMLParser::GetNodeValueDouble(cadPropNode, "Angle");
+ SetPosition(wxPoint2DDouble(posX, posY));
+
+ auto nodePosition = cadPropNode->first_node("NodePosition");
+ double nodePosX = XMLParser::GetNodeValueDouble(nodePosition, "X");
+ double nodePosY = XMLParser::GetNodeValueDouble(nodePosition, "Y");
+
+ int parentID = XMLParser::GetNodeValueInt(cadPropNode, "ParentID");
+ // If the opened power element has no parent, set up the basics CAD properties of the element manually, otherwise
+ // just class method AddParent to calculate properly.
+ if(parentID == -1) {
+ m_parentList.push_back(NULL);
+ m_pointList.push_back(wxPoint2DDouble(nodePosX, nodePosY));
+ m_pointList.push_back(wxPoint2DDouble(nodePosX, nodePosY));
+ m_pointList.push_back(m_position + wxPoint2DDouble(0.0, -m_height / 2.0 - 10.0));
+ m_pointList.push_back(m_position + wxPoint2DDouble(0.0, -m_height / 2.0));
+
+ wxRect2DDouble genRect(0, 0, 0, 0);
+ m_switchRect.push_back(genRect); // Push a general rectangle.
+ UpdateSwitches();
+
+ m_online = false; // Not connected elements are always offline.
+ } else {
+ AddParent(parentList[parentID], wxPoint2DDouble(nodePosX, nodePosY));
+ }
+
+ // Set up the points properly.
+ StartMove(m_position);
+ Move(wxPoint2DDouble(posX, posY));
+
+ // Set the rotation properly.
+ int numRot = angle / m_rotationAngle;
+ bool clockwise = true;
+ if(numRot < 0) {
+ numRot = std::abs(numRot);
+ clockwise = false;
+ }
+ for(int i = 0; i < numRot; i++) Rotate(clockwise);
+
+ return true;
+}
+
+void PowerElement::SaveCADProperties(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementNode)
+{
+ auto cadProp = XMLParser::AppendNode(doc, elementNode, "CADProperties");
+ auto position = XMLParser::AppendNode(doc, cadProp, "Position");
+ auto posX = XMLParser::AppendNode(doc, position, "X");
+ XMLParser::SetNodeValue(doc, posX, m_position.m_x);
+ auto posY = XMLParser::AppendNode(doc, position, "Y");
+ XMLParser::SetNodeValue(doc, posY, m_position.m_y);
+ auto size = XMLParser::AppendNode(doc, cadProp, "Size");
+ auto width = XMLParser::AppendNode(doc, size, "Width");
+ XMLParser::SetNodeValue(doc, width, m_width);
+ auto height = XMLParser::AppendNode(doc, size, "Height");
+ XMLParser::SetNodeValue(doc, height, m_height);
+ auto angle = XMLParser::AppendNode(doc, cadProp, "Angle");
+ XMLParser::SetNodeValue(doc, angle, m_angle);
+ auto nodePos = XMLParser::AppendNode(doc, cadProp, "NodePosition");
+ auto nodePosX = XMLParser::AppendNode(doc, nodePos, "X");
+ XMLParser::SetNodeValue(doc, nodePosX, m_pointList[0].m_x);
+ auto nodePosY = XMLParser::AppendNode(doc, nodePos, "Y");
+ XMLParser::SetNodeValue(doc, nodePosY, m_pointList[0].m_y);
+ auto parentID = XMLParser::AppendNode(doc, cadProp, "ParentID");
+ Element* parent = m_parentList[0];
+ if(parent) XMLParser::SetNodeValue(doc, parentID, parent->GetID());
+}
+
+void PowerElement::SaveSwitchingData(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* electricalNode)
+{
+ auto switchingList = XMLParser::AppendNode(doc, electricalNode, "SwitchingList");
+ for(int i = 0; i < static_cast<int>(m_swData.swType.size()); i++) {
+ auto switching = XMLParser::AppendNode(doc, switchingList, "Switching");
+ XMLParser::SetNodeAttribute(doc, switching, "ID", i);
+ auto swType = XMLParser::AppendNode(doc, switching, "Type");
+ XMLParser::SetNodeValue(doc, swType, m_swData.swType[i]);
+ auto swTime = XMLParser::AppendNode(doc, switching, "Time");
+ XMLParser::SetNodeValue(doc, swTime, m_swData.swTime[i]);
+ }
+}
+
+bool PowerElement::OpenSwitchingData(rapidxml::xml_node<>* electricalNode)
+{
+ auto switchingList = electricalNode->first_node("SwitchingList");
+ if(!switchingList) return false;
+ auto swNode = switchingList->first_node("Switching");
+ while(swNode) {
+ m_swData.swType.push_back((SwitchingType)XMLParser::GetNodeValueInt(swNode, "Type"));
+ m_swData.swTime.push_back(XMLParser::GetNodeValueDouble(swNode, "Time"));
+ swNode = swNode->next_sibling("Switching");
+ }
+ return true;
+}
diff --git a/Project/PowerElement.h b/Project/PowerElement.h
index 93a2357..d2b13e7 100644
--- a/Project/PowerElement.h
+++ b/Project/PowerElement.h
@@ -207,6 +207,12 @@ class PowerElement : public Element
*/
virtual void SetDynamicEvent(bool dynEvent = true) { m_dynEvent = dynEvent; }
virtual double GetValueFromUnit(double value, ElectricalUnit valueUnit);
+
+ virtual void SaveCADProperties(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementNode);
+ virtual void SaveSwitchingData(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* electricalNode);
+ virtual bool OpenElement(rapidxml::xml_node<>* elementNode, std::vector<Element*> parentList) { return true; }
+ virtual bool OpenCADProperties(rapidxml::xml_node<>* elementNode, std::vector<Element*> parentList);
+ virtual bool OpenSwitchingData(rapidxml::xml_node<>* electricalNode);
protected:
SwitchingData m_swData;
diff --git a/Project/Project.mk b/Project/Project.mk
index 7d7b579..28afdbd 100644
--- a/Project/Project.mk
+++ b/Project/Project.mk
@@ -13,7 +13,7 @@ CurrentFileName :=
CurrentFilePath :=
CurrentFileFullPath :=
User :=NDSE-69
-Date :=04/01/2018
+Date :=05/01/2018
CodeLitePath :="C:/Program Files/CodeLite"
LinkerName :=C:/TDM-GCC-64/bin/g++.exe
SharedObjectLinkerName :=C:/TDM-GCC-64/bin/g++.exe -shared -fPIC