diff options
author | Thales Lima Oliveira <thaleslima.ufu@gmail.com> | 2018-01-05 20:04:28 -0200 |
---|---|---|
committer | Thales Lima Oliveira <thaleslima.ufu@gmail.com> | 2018-01-05 20:04:28 -0200 |
commit | 95f61a7cad71c45c9e27af5c6f4bc5d64d5ecc45 (patch) | |
tree | d11fb974997f49942977a5ce3318074ea503f9bc | |
parent | 76df1de5e2307229da9870306e4a1031170aaadf (diff) | |
download | PSP.git-95f61a7cad71c45c9e27af5c6f4bc5d64d5ecc45.tar.gz PSP.git-95f61a7cad71c45c9e27af5c6f4bc5d64d5ecc45.tar.xz PSP.git-95f61a7cad71c45c9e27af5c6f4bc5d64d5ecc45.zip |
Some power element file hand. organized
-rw-r--r-- | Project/Bus.cpp | 84 | ||||
-rw-r--r-- | Project/Bus.h | 3 | ||||
-rw-r--r-- | Project/Capacitor.cpp | 42 | ||||
-rw-r--r-- | Project/Capacitor.h | 4 | ||||
-rw-r--r-- | Project/FileHanding.cpp | 359 | ||||
-rw-r--r-- | Project/IndMotor.cpp | 45 | ||||
-rw-r--r-- | Project/IndMotor.h | 4 | ||||
-rw-r--r-- | Project/PowerElement.cpp | 108 | ||||
-rw-r--r-- | Project/PowerElement.h | 6 | ||||
-rw-r--r-- | Project/Project.mk | 2 |
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 |