summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.codelite/.tern-port2
-rw-r--r--.codelite/.tern-project2
-rw-r--r--.codelite/PSP.session24
-rw-r--r--.codelite/PSP.tagsbin83156992 -> 83349504 bytes
-rw-r--r--.codelite/compilation.dbbin59392 -> 59392 bytes
-rw-r--r--.codelite/compile_commands.json8
-rw-r--r--.codelite/refactoring.dbbin1891328 -> 1905664 bytes
-rw-r--r--Project/ElectricCalculation.cpp16
-rw-r--r--Project/ElectricCalculation.h20
-rw-r--r--Project/IndMotor.cpp40
-rw-r--r--Project/IndMotor.h4
-rw-r--r--Project/PowerFlow.cpp254
-rw-r--r--Project/PowerFlow.h15
-rw-r--r--Project/Project.mk7
-rw-r--r--Project/Release/ElectricCalculation.cpp.obin29956 -> 29958 bytes
-rw-r--r--Project/Release/GeneratorStabForm.cpp.obin103823 -> 103823 bytes
-rw-r--r--Project/Release/IndMotor.cpp.obin36269 -> 36793 bytes
-rw-r--r--Project/Release/IndMotorForm.cpp.obin87201 -> 87201 bytes
-rw-r--r--Project/Release/PSP-UFU.exebin4032229 -> 4048697 bytes
-rw-r--r--Project/Release/PowerFlow.cpp.obin17236 -> 42418 bytes
-rw-r--r--Project/Release/PowerFlow.cpp.o.d634
-rw-r--r--Project/Release/SyncGenerator.cpp.obin40790 -> 42032 bytes
-rw-r--r--Project/Release/SyncMachineForm.cpp.obin123326 -> 123358 bytes
-rw-r--r--Project/Release/SyncMotor.cpp.obin36930 -> 38183 bytes
-rw-r--r--Project/Release/Workspace.cpp.obin156501 -> 202691 bytes
-rw-r--r--Project/SyncGenerator.cpp71
-rw-r--r--Project/SyncGenerator.h9
-rw-r--r--Project/SyncMachineForm.h4
-rw-r--r--Project/SyncMotor.cpp72
-rw-r--r--Project/SyncMotor.h9
-rw-r--r--Project/Workspace.cpp1396
31 files changed, 1859 insertions, 728 deletions
diff --git a/.codelite/.tern-port b/.codelite/.tern-port
index 8c08a17..a1fa29e 100644
--- a/.codelite/.tern-port
+++ b/.codelite/.tern-port
@@ -1 +1 @@
-59347 \ No newline at end of file
+58832 \ No newline at end of file
diff --git a/.codelite/.tern-project b/.codelite/.tern-project
index 09b6465..d5969c6 100644
--- a/.codelite/.tern-project
+++ b/.codelite/.tern-project
@@ -8,6 +8,8 @@
"node_resolve": {
},
"node": {
+ },
+ "complete_strings": {
}
}
} \ No newline at end of file
diff --git a/.codelite/PSP.session b/.codelite/PSP.session
index 03e7be2..0b66c84 100644
--- a/.codelite/PSP.session
+++ b/.codelite/PSP.session
@@ -1,12 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<Session Name="C:\Users\Thales\Documents\GitHub\PSP\PSP.workspace">
- <int Value="8" Name="m_selectedTab"/>
+ <int Value="6" Name="m_selectedTab"/>
<wxString Value="C:\Users\Thales\Documents\GitHub\PSP\PSP.workspace" Name="m_workspaceName"/>
<TabInfoArray Name="TabInfoArray">
<TabInfo>
<wxString Value="C:\Users\Thales\Documents\GitHub\PSP\Project\Workspace.cpp" Name="FileName"/>
- <int Value="895" Name="FirstVisibleLine"/>
- <int Value="918" Name="CurrentLine"/>
+ <int Value="986" Name="FirstVisibleLine"/>
+ <int Value="1020" Name="CurrentLine"/>
<wxArrayString Name="Bookmarks"/>
<IntVector Name="CollapsedFolds"/>
</TabInfo>
@@ -26,8 +26,8 @@
</TabInfo>
<TabInfo>
<wxString Value="C:\Users\Thales\Documents\GitHub\PSP\Project\Element.cpp" Name="FileName"/>
- <int Value="230" Name="FirstVisibleLine"/>
- <int Value="286" Name="CurrentLine"/>
+ <int Value="322" Name="FirstVisibleLine"/>
+ <int Value="341" Name="CurrentLine"/>
<wxArrayString Name="Bookmarks"/>
<IntVector Name="CollapsedFolds"/>
</TabInfo>
@@ -40,29 +40,29 @@
</TabInfo>
<TabInfo>
<wxString Value="C:\Users\Thales\Documents\GitHub\PSP\Project\ElectricCalculation.h" Name="FileName"/>
- <int Value="3" Name="FirstVisibleLine"/>
- <int Value="23" Name="CurrentLine"/>
+ <int Value="10" Name="FirstVisibleLine"/>
+ <int Value="18" Name="CurrentLine"/>
<wxArrayString Name="Bookmarks"/>
<IntVector Name="CollapsedFolds"/>
</TabInfo>
<TabInfo>
<wxString Value="C:\Users\Thales\Documents\GitHub\PSP\Project\ElectricCalculation.cpp" Name="FileName"/>
- <int Value="0" Name="FirstVisibleLine"/>
- <int Value="7" Name="CurrentLine"/>
+ <int Value="76" Name="FirstVisibleLine"/>
+ <int Value="101" Name="CurrentLine"/>
<wxArrayString Name="Bookmarks"/>
<IntVector Name="CollapsedFolds"/>
</TabInfo>
<TabInfo>
<wxString Value="C:\Users\Thales\Documents\GitHub\PSP\Project\PowerFlow.h" Name="FileName"/>
<int Value="0" Name="FirstVisibleLine"/>
- <int Value="6" Name="CurrentLine"/>
+ <int Value="21" Name="CurrentLine"/>
<wxArrayString Name="Bookmarks"/>
<IntVector Name="CollapsedFolds"/>
</TabInfo>
<TabInfo>
<wxString Value="C:\Users\Thales\Documents\GitHub\PSP\Project\PowerFlow.cpp" Name="FileName"/>
- <int Value="3" Name="FirstVisibleLine"/>
- <int Value="27" Name="CurrentLine"/>
+ <int Value="191" Name="FirstVisibleLine"/>
+ <int Value="205" Name="CurrentLine"/>
<wxArrayString Name="Bookmarks"/>
<IntVector Name="CollapsedFolds"/>
</TabInfo>
diff --git a/.codelite/PSP.tags b/.codelite/PSP.tags
index c620672..9909efe 100644
--- a/.codelite/PSP.tags
+++ b/.codelite/PSP.tags
Binary files differ
diff --git a/.codelite/compilation.db b/.codelite/compilation.db
index bfd859d..5283ccd 100644
--- a/.codelite/compilation.db
+++ b/.codelite/compilation.db
Binary files differ
diff --git a/.codelite/compile_commands.json b/.codelite/compile_commands.json
index c846c88..84734aa 100644
--- a/.codelite/compile_commands.json
+++ b/.codelite/compile_commands.json
@@ -1,9 +1,9 @@
[{
"directory": "C:\\Users\\Thales\\Documents\\GitHub\\PSP\\Project",
- "command": "C:/TDM-GCC-64/bin/g++.exe -O2 -Wall -mthreads -DHAVE_W32API_H -D__WXMSW__ -DNDEBUG -D_UNICODE -IC:/wxWidgets-3.1.0/lib/gcc_dll/mswu -IC:/wxWidgets-3.1.0/include -DWXUSINGDLL -Wno-ctor-dtor-privacy -pipe -fmessage-length=0 -fno-keep-inline-dllexport -std=c++11 -DNDEBUG -DUNICODE -I. -I. -MG -MP -MT./Release/PowerFlow.cpp.o -MF./Release/PowerFlow.cpp.o.d -MM PowerFlow.cpp",
- "file": "C:\\Users\\Thales\\Documents\\GitHub\\PSP\\Project\\PowerFlow.cpp"
+ "command": "C:/TDM-GCC-64/bin/g++.exe -O2 -Wall -mthreads -DHAVE_W32API_H -D__WXMSW__ -DNDEBUG -D_UNICODE -IC:/wxWidgets-3.1.0/lib/gcc_dll/mswu -IC:/wxWidgets-3.1.0/include -DWXUSINGDLL -Wno-ctor-dtor-privacy -pipe -fmessage-length=0 -fno-keep-inline-dllexport -std=c++11 -DNDEBUG -DUNICODE -I. -I. -MG -MP -MT./Release/ElectricCalculation.cpp.o -MF./Release/ElectricCalculation.cpp.o.d -MM ElectricCalculation.cpp",
+ "file": "C:\\Users\\Thales\\Documents\\GitHub\\PSP\\Project\\ElectricCalculation.cpp"
}, {
"directory": "C:\\Users\\Thales\\Documents\\GitHub\\PSP\\Project",
- "command": "C:/TDM-GCC-64/bin/g++.exe -c C:/Users/Thales/Documents/GitHub/PSP/Project/PowerFlow.cpp -O2 -Wall -mthreads -DHAVE_W32API_H -D__WXMSW__ -DNDEBUG -D_UNICODE -IC:/wxWidgets-3.1.0/lib/gcc_dll/mswu -IC:/wxWidgets-3.1.0/include -DWXUSINGDLL -Wno-ctor-dtor-privacy -pipe -fmessage-length=0 -fno-keep-inline-dllexport -std=c++11 -DNDEBUG -DUNICODE -o ./Release/PowerFlow.cpp.o -I. -I.",
- "file": "C:\\Users\\Thales\\Documents\\GitHub\\PSP\\Project\\PowerFlow.cpp"
+ "command": "C:/TDM-GCC-64/bin/g++.exe -c C:/Users/Thales/Documents/GitHub/PSP/Project/ElectricCalculation.cpp -O2 -Wall -mthreads -DHAVE_W32API_H -D__WXMSW__ -DNDEBUG -D_UNICODE -IC:/wxWidgets-3.1.0/lib/gcc_dll/mswu -IC:/wxWidgets-3.1.0/include -DWXUSINGDLL -Wno-ctor-dtor-privacy -pipe -fmessage-length=0 -fno-keep-inline-dllexport -std=c++11 -DNDEBUG -DUNICODE -o ./Release/ElectricCalculation.cpp.o -I. -I.",
+ "file": "C:\\Users\\Thales\\Documents\\GitHub\\PSP\\Project\\ElectricCalculation.cpp"
}] \ No newline at end of file
diff --git a/.codelite/refactoring.db b/.codelite/refactoring.db
index 61776db..4697c17 100644
--- a/.codelite/refactoring.db
+++ b/.codelite/refactoring.db
Binary files differ
diff --git a/Project/ElectricCalculation.cpp b/Project/ElectricCalculation.cpp
index 389af4a..5698905 100644
--- a/Project/ElectricCalculation.cpp
+++ b/Project/ElectricCalculation.cpp
@@ -1,14 +1,4 @@
#include "ElectricCalculation.h"
-#include "Element.h"
-#include "Bus.h"
-#include "Capacitor.h"
-#include "IndMotor.h"
-#include "Inductor.h"
-#include "Line.h"
-#include "Load.h"
-#include "SyncGenerator.h"
-#include "SyncMotor.h"
-#include "Transformer.h"
ElectricCalculation::ElectricCalculation() {}
ElectricCalculation::~ElectricCalculation() {}
@@ -89,7 +79,7 @@ bool ElectricCalculation::GetYBus(std::vector<std::vector<std::complex<double> >
// Load
for(auto itlo = m_loadList.begin(); itlo != m_loadList.end(); itlo++) {
Load* load = *itlo;
- if(bus == load->GetParentList()[0]) {
+ if(bus == load->GetParentList()[0] && load->IsOnline()) {
LoadElectricalData data = load->GetPUElectricalData(systemPowerBase);
if(data.loadType == CONST_IMPEDANCE)
yBus[busNumber][busNumber] += std::complex<double>(data.activePower, -data.reactivePower);
@@ -99,7 +89,7 @@ bool ElectricCalculation::GetYBus(std::vector<std::vector<std::complex<double> >
// Capacitor
for(auto itca = m_capacitorList.begin(); itca != m_capacitorList.end(); itca++) {
Capacitor* capacitor = *itca;
- if(bus == capacitor->GetParentList()[0]) {
+ if(bus == capacitor->GetParentList()[0] && capacitor->IsOnline()) {
CapacitorElectricalData data = capacitor->GetPUElectricalData(systemPowerBase);
yBus[busNumber][busNumber] += std::complex<double>(0.0, data.reactivePower);
}
@@ -108,7 +98,7 @@ bool ElectricCalculation::GetYBus(std::vector<std::vector<std::complex<double> >
// Inductor
for(auto itin = m_inductorList.begin(); itin != m_inductorList.end(); itin++) {
Inductor* inductor = *itin;
- if(bus == inductor->GetParentList()[0]) {
+ if(bus == inductor->GetParentList()[0] && inductor->IsOnline()) {
InductorElectricalData data = inductor->GetPUElectricalData(systemPowerBase);
yBus[busNumber][busNumber] += std::complex<double>(0.0, -data.reactivePower);
}
diff --git a/Project/ElectricCalculation.h b/Project/ElectricCalculation.h
index 5339199..1bb6361 100644
--- a/Project/ElectricCalculation.h
+++ b/Project/ElectricCalculation.h
@@ -4,16 +4,16 @@
#include <vector>
#include <complex>
-class Element;
-class Bus;
-class Capacitor;
-class IndMotor;
-class Inductor;
-class Line;
-class Load;
-class SyncGenerator;
-class SyncMotor;
-class Transformer;
+#include "Element.h"
+#include "Bus.h"
+#include "Capacitor.h"
+#include "IndMotor.h"
+#include "Inductor.h"
+#include "Line.h"
+#include "Load.h"
+#include "SyncGenerator.h"
+#include "SyncMotor.h"
+#include "Transformer.h"
class ElectricCalculation
{
diff --git a/Project/IndMotor.cpp b/Project/IndMotor.cpp
index 1c3b252..7a56466 100644
--- a/Project/IndMotor.cpp
+++ b/Project/IndMotor.cpp
@@ -35,3 +35,43 @@ bool IndMotor::ShowForm(wxWindow* parent, Element* element)
indMotorForm->Destroy();
return false;
}
+
+IndMotorElectricalData IndMotor::GetPUElectricalData(double systemPowerBase)
+{
+ IndMotorElectricalData data = m_electricalData;
+
+ switch(data.activePowerUnit) {
+ case UNIT_W: {
+ data.activePower = data.activePower / systemPowerBase;
+ data.activePowerUnit = UNIT_PU;
+ } break;
+ case UNIT_kW: {
+ data.activePower = (data.activePower * 1e3) / systemPowerBase;
+ data.activePowerUnit = UNIT_PU;
+ } break;
+ case UNIT_MW: {
+ data.activePower = (data.activePower * 1e6) / systemPowerBase;
+ data.activePowerUnit = UNIT_PU;
+ } break;
+ default:
+ break;
+ }
+ switch(data.reactivePowerUnit) {
+ case UNIT_VAr: {
+ data.reactivePower = data.reactivePower / systemPowerBase;
+ data.reactivePowerUnit = UNIT_PU;
+ } break;
+ case UNIT_kVAr: {
+ data.reactivePower = (data.reactivePower * 1e3) / systemPowerBase;
+ data.reactivePowerUnit = UNIT_PU;
+ } break;
+ case UNIT_MVAr: {
+ data.reactivePower = (data.reactivePower * 1e6) / systemPowerBase;
+ data.reactivePowerUnit = UNIT_PU;
+ } break;
+ default:
+ break;
+ }
+
+ return data;
+}
diff --git a/Project/IndMotor.h b/Project/IndMotor.h
index 7624e71..491c714 100644
--- a/Project/IndMotor.h
+++ b/Project/IndMotor.h
@@ -5,7 +5,8 @@
class IndMotorForm;
-struct IndMotorElectricalData {
+struct IndMotorElectricalData
+{
wxString name;
double activePower = 100.0;
ElectricalUnit activePowerUnit = UNIT_MW;
@@ -24,6 +25,7 @@ class IndMotor : public Machines
virtual bool GetContextMenu(wxMenu& menu);
virtual bool ShowForm(wxWindow* parent, Element* element);
virtual IndMotorElectricalData GetElectricalData() { return m_electricalData; }
+ virtual IndMotorElectricalData GetPUElectricalData(double systemPowerBase);
virtual void SetElectricalData(IndMotorElectricalData electricalData) { m_electricalData = electricalData; }
protected:
IndMotorElectricalData m_electricalData;
diff --git a/Project/PowerFlow.cpp b/Project/PowerFlow.cpp
index 22aa027..69bfd66 100644
--- a/Project/PowerFlow.cpp
+++ b/Project/PowerFlow.cpp
@@ -1,27 +1,245 @@
#include "PowerFlow.h"
-PowerFlow::PowerFlow(std::vector<Element*> elementList) : ElectricCalculation()
+PowerFlow::PowerFlow(std::vector<Element*> elementList) : ElectricCalculation() { GetElementsFromList(elementList); }
+PowerFlow::~PowerFlow() {}
+bool PowerFlow::RunGaussSeidel(double systemPowerBase,
+ int maxIteration,
+ double error,
+ double initAngle,
+ double accFactor)
{
- GetElementsFromList(elementList);
-}
+ // Calculate the Ybus.
+ if(!GetYBus(m_yBus, systemPowerBase)) {
+ m_errorMsg = _("No buses found on the system.");
+ return false;
+ }
-PowerFlow::~PowerFlow()
-{
-}
+ // Number of buses on the system.
+ int numberOfBuses = (int)m_busList.size();
+
+ std::vector<BusType> busType; // Bus type
+ std::vector<std::complex<double> > voltage; // Voltage of buses
+ std::vector<std::complex<double> > power; // Injected power
+
+ int busNumber = 0;
+ for(auto itb = m_busList.begin(); itb != m_busList.end(); itb++) {
+ Bus* bus = *itb;
+ BusElectricalData data = bus->GetEletricalData();
+
+ // Fill the bus type
+ if(data.slackBus) busType.push_back(BUS_SLACK);
+ // If the bus have controlled voltage, check if at least one synchronous machine is connected, then set the
+ // bus type.
+ else if(data.isVoltageControlled)
+ {
+ bool hasSyncMachine = false;
+ // Synchronous generator
+ for(auto itsg = m_syncGeneratorList.begin(); itsg != m_syncGeneratorList.end(); itsg++) {
+ SyncGenerator* syncGenerator = *itsg;
+ if(bus == syncGenerator->GetParentList()[0] && syncGenerator->IsOnline())
+ hasSyncMachine = true;
+ }
+ // Synchronous motor
+ for(auto itsm = m_syncMotorList.begin(); itsm != m_syncMotorList.end(); itsm++) {
+ SyncMotor* syncMotor = *itsm;
+ if(bus == syncMotor->GetParentList()[0] && syncMotor->IsOnline()) hasSyncMachine = true;
+ }
+ if(hasSyncMachine)
+ busType.push_back(BUS_PV);
+ else
+ busType.push_back(BUS_PQ);
+ }
+ else
+ busType.push_back(BUS_PQ);
+
+ // Fill the voltages array
+ if(data.isVoltageControlled && busType[busNumber] != BUS_PQ) {
+ voltage.push_back(std::complex<double>(data.controlledVoltage, 0.0));
+ }
+ else
+ {
+ voltage.push_back(std::complex<double>(1.0, 0.0));
+ }
+
+ // Fill the power array
+ power.push_back(std::complex<double>(0.0, 0.0)); // Initial value
+
+ // Synchronous generator
+ for(auto itsg = m_syncGeneratorList.begin(); itsg != m_syncGeneratorList.end(); itsg++) {
+ SyncGenerator* syncGenerator = *itsg;
+ if(syncGenerator->IsOnline()) {
+ if(bus == syncGenerator->GetParentList()[0]) {
+ SyncGeneratorElectricalData childData =
+ syncGenerator->GetPUElectricalData(systemPowerBase);
+ power[busNumber] +=
+ std::complex<double>(childData.activePower, childData.reactivePower);
+ }
+ }
+ }
+ // Synchronous motor
+ for(auto itsm = m_syncMotorList.begin(); itsm != m_syncMotorList.end(); itsm++) {
+ SyncMotor* syncMotor = *itsm;
+ if(syncMotor->IsOnline()) {
+ if(bus == syncMotor->GetParentList()[0]) {
+ SyncMotorElectricalData childData = syncMotor->GetPUElectricalData(systemPowerBase);
+ power[busNumber] +=
+ std::complex<double>(-childData.activePower, childData.reactivePower);
+ }
+ }
+ }
+ // Load
+ for(auto itl = m_loadList.begin(); itl != m_loadList.end(); itl++) {
+ Load* load = *itl;
+ if(load->IsOnline()) {
+ if(bus == load->GetParentList()[0]) {
+ LoadElectricalData childData = load->GetPUElectricalData(systemPowerBase);
+ if(childData.loadType == CONST_POWER)
+ power[busNumber] +=
+ std::complex<double>(-childData.activePower, -childData.reactivePower);
+ }
+ }
+ }
+
+ // Induction motor
+ for(auto itim = m_indMotorList.begin(); itim != m_indMotorList.end(); itim++) {
+ IndMotor* indMotor = *itim;
+ if(indMotor->IsOnline()) {
+ if(bus == indMotor->GetParentList()[0]) {
+ IndMotorElectricalData childData = indMotor->GetPUElectricalData(systemPowerBase);
+ power[busNumber] +=
+ std::complex<double>(-childData.activePower, -childData.reactivePower);
+ }
+ }
+ }
+
+ busNumber++;
+ }
+
+ // Check if have slack bus and if have generation on the slack bus
+ bool haveSlackBus = false;
+ bool slackBusHaveGeneration = false;
+ for(int i = 0; i < (int)busType.size(); i++) {
+ if(busType[i] == BUS_SLACK) {
+ auto itb = m_busList.begin();
+ std::advance(itb, i);
+ Bus* bus = *itb;
+
+ for(auto itsg = m_syncGeneratorList.begin(); itsg != m_syncGeneratorList.end(); itsg++) {
+ SyncGenerator* syncGenerator = *itsg;
+ if(syncGenerator->IsOnline() && bus == syncGenerator->GetParentList()[0])
+ slackBusHaveGeneration = true;
+ }
+ haveSlackBus = true;
+ }
+ if(!haveSlackBus) {
+ m_errorMsg = _("There is no slack bus on the system.");
+ return false;
+ }
+ if(!slackBusHaveGeneration) {
+ m_errorMsg = _("The slack bus don't have generation.");
+ return false;
+ }
+ }
+
+ // Gauss-Seidel method
+ std::vector<std::complex<double> > oldVoltage; // Old voltage array.
+ oldVoltage.resize(voltage.size());
+
+ int iteration = 0; // Current itaration number.
+
+ while(true) {
+ // Reach the max number of iterations.
+ if(iteration >= maxIteration) {
+ m_errorMsg = _("The maximum number of iterations was reached.");
+ return false;
+ }
+
+ // Update the old voltage array to current iteration values.
+ for(int i = 0; i < numberOfBuses; i++) oldVoltage[i] = voltage[i];
+
+ double iterationError = 0.0;
+
+ for(int i = 0; i < numberOfBuses; i++) {
+ if(busType[i] == BUS_PQ) {
+ std::complex<double> yeSum(0.0, 0.0);
+ for(int k = 0; k < numberOfBuses; k++) {
+ if(i != k) {
+ // Sum { Y[i,k] * E[k] } | k = 1->n; k diff i
+ yeSum += m_yBus[i][k] * voltage[k];
+ }
+ }
+
+ // E[i] = (1/Y[i,i])*((P[i]-jQ[i])/E*[i] - Sum { Y[i,k] * E[k] (k diff i) })
+ std::complex<double> newVolt =
+ (1.0 / m_yBus[i][i]) * (std::conj(power[i]) / std::conj(voltage[i]) - yeSum);
+
+ // Apply the acceleration factor.
+ newVolt = std::complex<double>(
+ accFactor * (newVolt.real() - voltage[i].real()) + voltage[i].real(),
+ accFactor * (newVolt.imag() - voltage[i].imag()) + voltage[i].imag());
+
+ voltage[i] = newVolt;
+ }
+ if(busType[i] == BUS_PV) {
+ std::complex<double> yeSum(0.0, 0.0);
+ for(int k = 0; k < numberOfBuses; k++) {
+ if(i != k) {
+ // Sum { Y[i,k] * E[k] } | k = 1->n; k diff i
+ yeSum += m_yBus[i][k] * voltage[k];
+ }
+ }
+ std::complex<double> yeSumT = yeSum + (m_yBus[i][i] * voltage[i]);
+
+ // Q[i] = - Im( E*[i] * Sum { Y[i,k] * E[k] } )
+ std::complex<double> qCalc = std::conj(voltage[i]) * yeSumT;
+ power[i] = std::complex<double>(power[i].real(), -qCalc.imag());
+
+ // E[i] = (1/Y[i,i])*((P[i]-jQ[i])/E*[i] - Sum { Y[i,k] * E[k] (k diff i) })
+ std::complex<double> newVolt =
+ (1.0 / m_yBus[i][i]) * (std::conj(power[i]) / std::conj(voltage[i]) - yeSum);
+
+ // Apply the acceleration factor.
+ newVolt = std::complex<double>(
+ accFactor * (newVolt.real() - voltage[i].real()) + voltage[i].real(),
+ accFactor * (newVolt.imag() - voltage[i].imag()) + voltage[i].imag());
+
+ // Keep the same voltage magnitude.
+ voltage[i] = std::complex<double>(std::abs(voltage[i]) * std::cos(std::arg(newVolt)),
+ std::abs(voltage[i]) * std::sin(std::arg(newVolt)));
+ }
+
+ double busError = std::max(std::abs(voltage[i].real() - oldVoltage[i].real()),
+ std::abs(voltage[i].imag() - oldVoltage[i].imag()));
+
+ if(busError > iterationError) iterationError = busError;
+ }
+
+ if(iterationError < error) break;
+
+ iteration++;
+ }
+
+ // Adjust the power array.
+ // TODO: Only the slack bus??
+ for(int i = 0; i < numberOfBuses; i++) {
+ std::complex<double> sBus = std::complex<double>(0.0, 0.0);
+ for(int j = 0; j < numberOfBuses; j++) sBus += voltage[i] * std::conj(voltage[j]) * std::conj(m_yBus[i][j]);
+ power[i] = sBus;
+ }
-bool PowerFlow::RunGaussSeidel()
-{
- GetYBus(m_yBus, 100e6);
-
wxString str = "";
- for(int i=0; i<(int)m_yBus.size(); i++) {
- for(int j=0; j<(int)m_yBus[i].size(); j++) {
- str += wxString::Format("%.2f + j%.2f\t", m_yBus[i][j].real(), m_yBus[i][j].imag());
- }
- str += "\n";
- }
-
+ for(int i = 0; i < numberOfBuses; i++) {
+ str += wxString::Format("%.5f/_%.2f\n", std::abs(voltage[i]), wxRadToDeg(std::arg(voltage[i])));
+ }
wxLogMessage(str);
-
+
+ str = "";
+ for(int i = 0; i < numberOfBuses; i++) {
+ str += wxString::Format("%.5f + j%.5f\n", power[i].real(), power[i].imag());
+ }
+ wxLogMessage(str);
+
+ wxLogMessage(wxString::Format("Num iteracoes = %d", iteration));
+
return true;
}
diff --git a/Project/PowerFlow.h b/Project/PowerFlow.h
index 76b17e4..b30b82f 100644
--- a/Project/PowerFlow.h
+++ b/Project/PowerFlow.h
@@ -3,18 +3,29 @@
#include "ElectricCalculation.h"
-#include <wx/string.h>//temp
+#include <wx/string.h>
+#include <wx/intl.h>//_()
#include <wx/log.h>//temp
+enum BusType
+{
+ BUS_SLACK = 0,
+ BUS_PV,
+ BUS_PQ
+};
+
class PowerFlow : public ElectricCalculation
{
public:
PowerFlow(std::vector<Element*> elementList);
~PowerFlow();
- virtual bool RunGaussSeidel();
+ virtual bool RunGaussSeidel(double systemPowerBase = 100e6, int maxIteration = 5000, double error = 1e-6, double initAngle = 0.0, double accFactor = 1.0);
+
+ virtual wxString GetErrorMessage() { return m_errorMsg; }
protected:
std::vector<std::vector<std::complex<double> > > m_yBus;
+ wxString m_errorMsg = "";
};
#endif // POWERFLOW_H
diff --git a/Project/Project.mk b/Project/Project.mk
index e99744b..91fd3d2 100644
--- a/Project/Project.mk
+++ b/Project/Project.mk
@@ -13,8 +13,8 @@ CurrentFileName :=
CurrentFilePath :=
CurrentFileFullPath :=
User :=Thales
-Date :=01/11/2016
-CodeLitePath :="C:/Program Files/CodeLite"
+Date :=02/11/2016
+CodeLitePath :="C:/Program Files (x86)/CodeLite"
LinkerName :=C:/TDM-GCC-64/bin/g++.exe
SharedObjectLinkerName :=C:/TDM-GCC-64/bin/g++.exe -shared -fPIC
ObjectSuffix :=.o
@@ -61,7 +61,8 @@ AS := C:/TDM-GCC-64/bin/as.exe
##
## User defined environment variables
##
-CodeLiteDir:=C:\Program Files\CodeLite
+CodeLiteDir:=C:\Program Files (x86)\CodeLite
+UNIT_TEST_PP_SRC_DIR:=C:\UnitTest++-1.3
WXWIN:=C:\wxWidgets-3.1.0
WXCFG:=gcc_dll\mswu
Objects0=$(IntermediateDirectory)/main.cpp$(ObjectSuffix) $(IntermediateDirectory)/win_resources.rc$(ObjectSuffix) $(IntermediateDirectory)/ArtMetro.cpp$(ObjectSuffix) $(IntermediateDirectory)/MainFrame.cpp$(ObjectSuffix) $(IntermediateDirectory)/Workspace.cpp$(ObjectSuffix) $(IntermediateDirectory)/MainFrameBitmaps.cpp$(ObjectSuffix) $(IntermediateDirectory)/WorkspaceBitmaps.cpp$(ObjectSuffix) $(IntermediateDirectory)/BusFormBitmaps.cpp$(ObjectSuffix) $(IntermediateDirectory)/ElementFormBitmaps.cpp$(ObjectSuffix) $(IntermediateDirectory)/MainFrameBase.cpp$(ObjectSuffix) \
diff --git a/Project/Release/ElectricCalculation.cpp.o b/Project/Release/ElectricCalculation.cpp.o
index cf38604..7d07747 100644
--- a/Project/Release/ElectricCalculation.cpp.o
+++ b/Project/Release/ElectricCalculation.cpp.o
Binary files differ
diff --git a/Project/Release/GeneratorStabForm.cpp.o b/Project/Release/GeneratorStabForm.cpp.o
index b38d859..9df90ab 100644
--- a/Project/Release/GeneratorStabForm.cpp.o
+++ b/Project/Release/GeneratorStabForm.cpp.o
Binary files differ
diff --git a/Project/Release/IndMotor.cpp.o b/Project/Release/IndMotor.cpp.o
index f4bdf37..912425b 100644
--- a/Project/Release/IndMotor.cpp.o
+++ b/Project/Release/IndMotor.cpp.o
Binary files differ
diff --git a/Project/Release/IndMotorForm.cpp.o b/Project/Release/IndMotorForm.cpp.o
index 36b0724..5e81863 100644
--- a/Project/Release/IndMotorForm.cpp.o
+++ b/Project/Release/IndMotorForm.cpp.o
Binary files differ
diff --git a/Project/Release/PSP-UFU.exe b/Project/Release/PSP-UFU.exe
index 384d556..d985df0 100644
--- a/Project/Release/PSP-UFU.exe
+++ b/Project/Release/PSP-UFU.exe
Binary files differ
diff --git a/Project/Release/PowerFlow.cpp.o b/Project/Release/PowerFlow.cpp.o
index a18c964..a90fde4 100644
--- a/Project/Release/PowerFlow.cpp.o
+++ b/Project/Release/PowerFlow.cpp.o
Binary files differ
diff --git a/Project/Release/PowerFlow.cpp.o.d b/Project/Release/PowerFlow.cpp.o.d
index 4a41efb..739dfb7 100644
--- a/Project/Release/PowerFlow.cpp.o.d
+++ b/Project/Release/PowerFlow.cpp.o.d
@@ -1,5 +1,5 @@
Release/PowerFlow.cpp.o: PowerFlow.cpp PowerFlow.h ElectricCalculation.h \
- C:/wxWidgets-3.1.0/include/wx/string.h \
+ Element.h C:/wxWidgets-3.1.0/include/wx/msgdlg.h \
C:/wxWidgets-3.1.0/include/wx/defs.h \
C:/wxWidgets-3.1.0/include/wx/platform.h \
C:/wxWidgets-3.1.0/include/wx/compiler.h \
@@ -16,6 +16,14 @@ Release/PowerFlow.cpp.o: PowerFlow.cpp PowerFlow.h ElectricCalculation.h \
C:/wxWidgets-3.1.0/include/wx/windowid.h \
C:/wxWidgets-3.1.0/include/wx/msw/winundef.h \
C:/wxWidgets-3.1.0/include/wx/features.h \
+ C:/wxWidgets-3.1.0/include/wx/dialog.h \
+ C:/wxWidgets-3.1.0/include/wx/toplevel.h \
+ C:/wxWidgets-3.1.0/include/wx/nonownedwnd.h \
+ C:/wxWidgets-3.1.0/include/wx/window.h \
+ C:/wxWidgets-3.1.0/include/wx/event.h \
+ C:/wxWidgets-3.1.0/include/wx/object.h \
+ C:/wxWidgets-3.1.0/include/wx/memory.h \
+ C:/wxWidgets-3.1.0/include/wx/string.h \
C:/wxWidgets-3.1.0/include/wx/wxcrtbase.h \
C:/wxWidgets-3.1.0/include/wx/strvararg.h \
C:/wxWidgets-3.1.0/include/wx/strconv.h \
@@ -27,19 +35,207 @@ Release/PowerFlow.cpp.o: PowerFlow.cpp PowerFlow.h ElectricCalculation.h \
C:/wxWidgets-3.1.0/include/wx/afterstd.h \
C:/wxWidgets-3.1.0/include/wx/stringops.h \
C:/wxWidgets-3.1.0/include/wx/iosfwrap.h \
- C:/wxWidgets-3.1.0/include/wx/log.h \
- C:/wxWidgets-3.1.0/include/wx/arrstr.h \
- C:/wxWidgets-3.1.0/include/wx/dynarray.h \
+ C:/wxWidgets-3.1.0/include/wx/msgout.h \
+ C:/wxWidgets-3.1.0/include/wx/xti.h C:/wxWidgets-3.1.0/include/wx/rtti.h \
+ C:/wxWidgets-3.1.0/include/wx/flags.h \
+ C:/wxWidgets-3.1.0/include/wx/xti2.h \
+ C:/wxWidgets-3.1.0/include/wx/clntdata.h \
C:/wxWidgets-3.1.0/include/wx/hashmap.h \
C:/wxWidgets-3.1.0/include/wx/wxcrt.h \
+ C:/wxWidgets-3.1.0/include/wx/gdicmn.h \
+ C:/wxWidgets-3.1.0/include/wx/list.h \
+ C:/wxWidgets-3.1.0/include/wx/vector.h \
+ C:/wxWidgets-3.1.0/include/wx/scopeguard.h \
+ C:/wxWidgets-3.1.0/include/wx/except.h \
+ C:/wxWidgets-3.1.0/include/wx/meta/movable.h \
+ C:/wxWidgets-3.1.0/include/wx/meta/pod.h \
+ C:/wxWidgets-3.1.0/include/wx/meta/if.h \
+ C:/wxWidgets-3.1.0/include/wx/math.h \
+ C:/wxWidgets-3.1.0/include/wx/cursor.h \
+ C:/wxWidgets-3.1.0/include/wx/gdiobj.h \
+ C:/wxWidgets-3.1.0/include/wx/msw/gdiimage.h \
+ C:/wxWidgets-3.1.0/include/wx/msw/cursor.h \
+ C:/wxWidgets-3.1.0/include/wx/utils.h \
+ C:/wxWidgets-3.1.0/include/wx/filefn.h \
+ C:/wxWidgets-3.1.0/include/wx/arrstr.h \
+ C:/wxWidgets-3.1.0/include/wx/versioninfo.h \
+ C:/wxWidgets-3.1.0/include/wx/meta/implicitconversion.h \
+ C:/wxWidgets-3.1.0/include/wx/mousestate.h \
+ C:/wxWidgets-3.1.0/include/wx/kbdstate.h \
+ C:/wxWidgets-3.1.0/include/wx/longlong.h \
+ C:/wxWidgets-3.1.0/include/wx/platinfo.h \
+ C:/wxWidgets-3.1.0/include/wx/dynarray.h \
C:/wxWidgets-3.1.0/include/wx/thread.h \
- C:/wxWidgets-3.1.0/include/wx/generic/logg.h
+ C:/wxWidgets-3.1.0/include/wx/tracker.h \
+ C:/wxWidgets-3.1.0/include/wx/typeinfo.h \
+ C:/wxWidgets-3.1.0/include/wx/any.h \
+ C:/wxWidgets-3.1.0/include/wx/datetime.h \
+ C:/wxWidgets-3.1.0/include/wx/anystr.h \
+ C:/wxWidgets-3.1.0/include/wx/variant.h \
+ C:/wxWidgets-3.1.0/include/wx/meta/convertible.h \
+ C:/wxWidgets-3.1.0/include/wx/meta/removeref.h \
+ C:/wxWidgets-3.1.0/include/wx/font.h \
+ C:/wxWidgets-3.1.0/include/wx/msw/font.h \
+ C:/wxWidgets-3.1.0/include/wx/colour.h \
+ C:/wxWidgets-3.1.0/include/wx/msw/colour.h \
+ C:/wxWidgets-3.1.0/include/wx/region.h \
+ C:/wxWidgets-3.1.0/include/wx/msw/region.h \
+ C:/wxWidgets-3.1.0/include/wx/intl.h \
+ C:/wxWidgets-3.1.0/include/wx/translation.h \
+ C:/wxWidgets-3.1.0/include/wx/language.h \
+ C:/wxWidgets-3.1.0/include/wx/scopedptr.h \
+ C:/wxWidgets-3.1.0/include/wx/checkeddelete.h \
+ C:/wxWidgets-3.1.0/include/wx/validate.h \
+ C:/wxWidgets-3.1.0/include/wx/palette.h \
+ C:/wxWidgets-3.1.0/include/wx/msw/palette.h \
+ C:/wxWidgets-3.1.0/include/wx/accel.h \
+ C:/wxWidgets-3.1.0/include/wx/msw/accel.h \
+ C:/wxWidgets-3.1.0/include/wx/msw/window.h \
+ C:/wxWidgets-3.1.0/include/wx/settings.h \
+ C:/wxWidgets-3.1.0/include/wx/msw/nonownedwnd.h \
+ C:/wxWidgets-3.1.0/include/wx/iconbndl.h \
+ C:/wxWidgets-3.1.0/include/wx/icon.h \
+ C:/wxWidgets-3.1.0/include/wx/iconloc.h \
+ C:/wxWidgets-3.1.0/include/wx/msw/icon.h \
+ C:/wxWidgets-3.1.0/include/wx/weakref.h \
+ C:/wxWidgets-3.1.0/include/wx/meta/int2type.h \
+ C:/wxWidgets-3.1.0/include/wx/msw/toplevel.h \
+ C:/wxWidgets-3.1.0/include/wx/containr.h \
+ C:/wxWidgets-3.1.0/include/wx/sharedptr.h \
+ C:/wxWidgets-3.1.0/include/wx/atomic.h \
+ C:/wxWidgets-3.1.0/include/wx/msw/wrapwin.h \
+ C:/wxWidgets-3.1.0/include/wx/msw/dialog.h \
+ C:/wxWidgets-3.1.0/include/wx/panel.h \
+ C:/wxWidgets-3.1.0/include/wx/msw/panel.h \
+ C:/wxWidgets-3.1.0/include/wx/stockitem.h \
+ C:/wxWidgets-3.1.0/include/wx/generic/msgdlgg.h \
+ C:/wxWidgets-3.1.0/include/wx/msw/msgdlg.h \
+ C:/wxWidgets-3.1.0/include/wx/geometry.h \
+ C:/wxWidgets-3.1.0/include/wx/menu.h \
+ C:/wxWidgets-3.1.0/include/wx/menuitem.h \
+ C:/wxWidgets-3.1.0/include/wx/msw/menuitem.h \
+ C:/wxWidgets-3.1.0/include/wx/bitmap.h \
+ C:/wxWidgets-3.1.0/include/wx/image.h \
+ C:/wxWidgets-3.1.0/include/wx/stream.h \
+ C:/wxWidgets-3.1.0/include/wx/imagbmp.h \
+ C:/wxWidgets-3.1.0/include/wx/imagpng.h \
+ C:/wxWidgets-3.1.0/include/wx/imaggif.h \
+ C:/wxWidgets-3.1.0/include/wx/imagpcx.h \
+ C:/wxWidgets-3.1.0/include/wx/imagjpeg.h \
+ C:/wxWidgets-3.1.0/include/wx/imagtga.h \
+ C:/wxWidgets-3.1.0/include/wx/imagtiff.h \
+ C:/wxWidgets-3.1.0/include/wx/imagpnm.h \
+ C:/wxWidgets-3.1.0/include/wx/imagxpm.h \
+ C:/wxWidgets-3.1.0/include/wx/imagiff.h \
+ C:/wxWidgets-3.1.0/include/wx/msw/bitmap.h \
+ C:/wxWidgets-3.1.0/include/wx/ownerdrw.h \
+ C:/wxWidgets-3.1.0/include/wx/msw/ownerdrw.h \
+ C:/wxWidgets-3.1.0/include/wx/msw/menu.h \
+ C:/wxWidgets-3.1.0/include/wx/log.h \
+ C:/wxWidgets-3.1.0/include/wx/generic/logg.h Bus.h BusForm.h \
+ ElementForm.h C:/wxWidgets-3.1.0/include/wx/xrc/xmlres.h \
+ C:/wxWidgets-3.1.0/include/wx/filesys.h \
+ C:/wxWidgets-3.1.0/include/wx/filename.h \
+ C:/wxWidgets-3.1.0/include/wx/file.h \
+ C:/wxWidgets-3.1.0/include/wx/convauto.h \
+ C:/wxWidgets-3.1.0/include/wx/artprov.h \
+ C:/wxWidgets-3.1.0/include/wx/xrc/xmlreshandler.h \
+ C:/wxWidgets-3.1.0/include/wx/imaglist.h \
+ C:/wxWidgets-3.1.0/include/wx/msw/imaglist.h \
+ C:/wxWidgets-3.1.0/include/wx/xrc/xh_bmp.h \
+ C:/wxWidgets-3.1.0/include/wx/sizer.h \
+ C:/wxWidgets-3.1.0/include/wx/notebook.h \
+ C:/wxWidgets-3.1.0/include/wx/bookctrl.h \
+ C:/wxWidgets-3.1.0/include/wx/control.h \
+ C:/wxWidgets-3.1.0/include/wx/msw/control.h \
+ C:/wxWidgets-3.1.0/include/wx/withimages.h \
+ C:/wxWidgets-3.1.0/include/wx/msw/notebook.h \
+ C:/wxWidgets-3.1.0/include/wx/stattext.h \
+ C:/wxWidgets-3.1.0/include/wx/msw/stattext.h \
+ C:/wxWidgets-3.1.0/include/wx/textctrl.h \
+ C:/wxWidgets-3.1.0/include/wx/textentry.h \
+ C:/wxWidgets-3.1.0/include/wx/msw/textentry.h \
+ C:/wxWidgets-3.1.0/include/wx/ioswrap.h \
+ C:/wxWidgets-3.1.0/include/wx/msw/textctrl.h \
+ C:/wxWidgets-3.1.0/include/wx/choice.h \
+ C:/wxWidgets-3.1.0/include/wx/ctrlsub.h \
+ C:/wxWidgets-3.1.0/include/wx/msw/ctrlsub.h \
+ C:/wxWidgets-3.1.0/include/wx/msw/choice.h \
+ C:/wxWidgets-3.1.0/include/wx/checkbox.h \
+ C:/wxWidgets-3.1.0/include/wx/msw/checkbox.h \
+ C:/wxWidgets-3.1.0/include/wx/msw/ownerdrawnbutton.h \
+ C:/wxWidgets-3.1.0/include/wx/button.h \
+ C:/wxWidgets-3.1.0/include/wx/anybutton.h \
+ C:/wxWidgets-3.1.0/include/wx/msw/anybutton.h \
+ C:/wxWidgets-3.1.0/include/wx/msw/button.h \
+ C:/wxWidgets-3.1.0/include/wx/statbox.h \
+ C:/wxWidgets-3.1.0/include/wx/msw/statbox.h \
+ C:/wxWidgets-3.1.0/include/wx/statline.h \
+ C:/wxWidgets-3.1.0/include/wx/msw/statline.h \
+ C:/wxWidgets-3.1.0/include/wx/propgrid/manager.h \
+ C:/wxWidgets-3.1.0/include/wx/propgrid/propgrid.h \
+ C:/wxWidgets-3.1.0/include/wx/dcclient.h \
+ C:/wxWidgets-3.1.0/include/wx/dc.h C:/wxWidgets-3.1.0/include/wx/brush.h \
+ C:/wxWidgets-3.1.0/include/wx/msw/brush.h \
+ C:/wxWidgets-3.1.0/include/wx/pen.h \
+ C:/wxWidgets-3.1.0/include/wx/msw/pen.h \
+ C:/wxWidgets-3.1.0/include/wx/affinematrix2d.h \
+ C:/wxWidgets-3.1.0/include/wx/affinematrix2dbase.h \
+ C:/wxWidgets-3.1.0/include/wx/scrolwin.h \
+ C:/wxWidgets-3.1.0/include/wx/generic/scrolwin.h \
+ C:/wxWidgets-3.1.0/include/wx/recguard.h \
+ C:/wxWidgets-3.1.0/include/wx/tooltip.h \
+ C:/wxWidgets-3.1.0/include/wx/msw/tooltip.h \
+ C:/wxWidgets-3.1.0/include/wx/time.h \
+ C:/wxWidgets-3.1.0/include/wx/propgrid/property.h \
+ C:/wxWidgets-3.1.0/include/wx/propgrid/propgriddefs.h \
+ C:/wxWidgets-3.1.0/include/wx/hashset.h \
+ C:/wxWidgets-3.1.0/include/wx/tokenzr.h \
+ C:/wxWidgets-3.1.0/include/wx/propgrid/propgridiface.h \
+ C:/wxWidgets-3.1.0/include/wx/propgrid/propgridpagestate.h \
+ C:/wxWidgets-3.1.0/include/wx/propgrid/props.h \
+ C:/wxWidgets-3.1.0/include/wx/propgrid/editors.h \
+ C:/wxWidgets-3.1.0/include/wx/listbox.h \
+ C:/wxWidgets-3.1.0/include/wx/msw/listbox.h \
+ C:/wxWidgets-3.1.0/include/wx/valtext.h \
+ C:/wxWidgets-3.1.0/include/wx/toolbar.h \
+ C:/wxWidgets-3.1.0/include/wx/tbarbase.h \
+ C:/wxWidgets-3.1.0/include/wx/msw/toolbar.h \
+ C:/wxWidgets-3.1.0/include/wx/headerctrl.h \
+ C:/wxWidgets-3.1.0/include/wx/headercol.h \
+ C:/wxWidgets-3.1.0/include/wx/msw/headerctrl.h \
+ C:/wxWidgets-3.1.0/include/wx/propgrid/advprops.h \
+ C:/wxWidgets-3.1.0/include/wx/spinbutt.h \
+ C:/wxWidgets-3.1.0/include/wx/range.h \
+ C:/wxWidgets-3.1.0/include/wx/msw/spinbutt.h \
+ C:/wxWidgets-3.1.0/include/wx/listctrl.h \
+ C:/wxWidgets-3.1.0/include/wx/listbase.h \
+ C:/wxWidgets-3.1.0/include/wx/systhemectrl.h \
+ C:/wxWidgets-3.1.0/include/wx/msw/listctrl.h \
+ C:/wxWidgets-3.1.0/include/wx/persist.h \
+ C:/wxWidgets-3.1.0/include/wx/confbase.h \
+ C:/wxWidgets-3.1.0/include/wx/base64.h \
+ C:/wxWidgets-3.1.0/include/wx/persist/toplevel.h \
+ C:/wxWidgets-3.1.0/include/wx/persist/window.h \
+ C:/wxWidgets-3.1.0/include/wx/display.h \
+ C:/wxWidgets-3.1.0/include/wx/vidmode.h \
+ C:/wxWidgets-3.1.0/include/wx/persist/bookctrl.h \
+ C:/wxWidgets-3.1.0/include/wx/persist/treebook.h \
+ C:/wxWidgets-3.1.0/include/wx/treebook.h \
+ C:/wxWidgets-3.1.0/include/wx/treectrl.h \
+ C:/wxWidgets-3.1.0/include/wx/treebase.h \
+ C:/wxWidgets-3.1.0/include/wx/itemid.h \
+ C:/wxWidgets-3.1.0/include/wx/msw/treectrl.h Capacitor.h Shunt.h \
+ IndMotor.h Machines.h Inductor.h Line.h LineForm.h Branch.h Load.h \
+ LoadForm.h SyncGenerator.h SyncMotor.h Transformer.h
PowerFlow.h:
ElectricCalculation.h:
-C:/wxWidgets-3.1.0/include/wx/string.h:
+Element.h:
+
+C:/wxWidgets-3.1.0/include/wx/msgdlg.h:
C:/wxWidgets-3.1.0/include/wx/defs.h:
@@ -73,6 +269,22 @@ C:/wxWidgets-3.1.0/include/wx/msw/winundef.h:
C:/wxWidgets-3.1.0/include/wx/features.h:
+C:/wxWidgets-3.1.0/include/wx/dialog.h:
+
+C:/wxWidgets-3.1.0/include/wx/toplevel.h:
+
+C:/wxWidgets-3.1.0/include/wx/nonownedwnd.h:
+
+C:/wxWidgets-3.1.0/include/wx/window.h:
+
+C:/wxWidgets-3.1.0/include/wx/event.h:
+
+C:/wxWidgets-3.1.0/include/wx/object.h:
+
+C:/wxWidgets-3.1.0/include/wx/memory.h:
+
+C:/wxWidgets-3.1.0/include/wx/string.h:
+
C:/wxWidgets-3.1.0/include/wx/wxcrtbase.h:
C:/wxWidgets-3.1.0/include/wx/strvararg.h:
@@ -95,16 +307,420 @@ C:/wxWidgets-3.1.0/include/wx/stringops.h:
C:/wxWidgets-3.1.0/include/wx/iosfwrap.h:
-C:/wxWidgets-3.1.0/include/wx/log.h:
+C:/wxWidgets-3.1.0/include/wx/msgout.h:
-C:/wxWidgets-3.1.0/include/wx/arrstr.h:
+C:/wxWidgets-3.1.0/include/wx/xti.h:
-C:/wxWidgets-3.1.0/include/wx/dynarray.h:
+C:/wxWidgets-3.1.0/include/wx/rtti.h:
+
+C:/wxWidgets-3.1.0/include/wx/flags.h:
+
+C:/wxWidgets-3.1.0/include/wx/xti2.h:
+
+C:/wxWidgets-3.1.0/include/wx/clntdata.h:
C:/wxWidgets-3.1.0/include/wx/hashmap.h:
C:/wxWidgets-3.1.0/include/wx/wxcrt.h:
+C:/wxWidgets-3.1.0/include/wx/gdicmn.h:
+
+C:/wxWidgets-3.1.0/include/wx/list.h:
+
+C:/wxWidgets-3.1.0/include/wx/vector.h:
+
+C:/wxWidgets-3.1.0/include/wx/scopeguard.h:
+
+C:/wxWidgets-3.1.0/include/wx/except.h:
+
+C:/wxWidgets-3.1.0/include/wx/meta/movable.h:
+
+C:/wxWidgets-3.1.0/include/wx/meta/pod.h:
+
+C:/wxWidgets-3.1.0/include/wx/meta/if.h:
+
+C:/wxWidgets-3.1.0/include/wx/math.h:
+
+C:/wxWidgets-3.1.0/include/wx/cursor.h:
+
+C:/wxWidgets-3.1.0/include/wx/gdiobj.h:
+
+C:/wxWidgets-3.1.0/include/wx/msw/gdiimage.h:
+
+C:/wxWidgets-3.1.0/include/wx/msw/cursor.h:
+
+C:/wxWidgets-3.1.0/include/wx/utils.h:
+
+C:/wxWidgets-3.1.0/include/wx/filefn.h:
+
+C:/wxWidgets-3.1.0/include/wx/arrstr.h:
+
+C:/wxWidgets-3.1.0/include/wx/versioninfo.h:
+
+C:/wxWidgets-3.1.0/include/wx/meta/implicitconversion.h:
+
+C:/wxWidgets-3.1.0/include/wx/mousestate.h:
+
+C:/wxWidgets-3.1.0/include/wx/kbdstate.h:
+
+C:/wxWidgets-3.1.0/include/wx/longlong.h:
+
+C:/wxWidgets-3.1.0/include/wx/platinfo.h:
+
+C:/wxWidgets-3.1.0/include/wx/dynarray.h:
+
C:/wxWidgets-3.1.0/include/wx/thread.h:
+C:/wxWidgets-3.1.0/include/wx/tracker.h:
+
+C:/wxWidgets-3.1.0/include/wx/typeinfo.h:
+
+C:/wxWidgets-3.1.0/include/wx/any.h:
+
+C:/wxWidgets-3.1.0/include/wx/datetime.h:
+
+C:/wxWidgets-3.1.0/include/wx/anystr.h:
+
+C:/wxWidgets-3.1.0/include/wx/variant.h:
+
+C:/wxWidgets-3.1.0/include/wx/meta/convertible.h:
+
+C:/wxWidgets-3.1.0/include/wx/meta/removeref.h:
+
+C:/wxWidgets-3.1.0/include/wx/font.h:
+
+C:/wxWidgets-3.1.0/include/wx/msw/font.h:
+
+C:/wxWidgets-3.1.0/include/wx/colour.h:
+
+C:/wxWidgets-3.1.0/include/wx/msw/colour.h:
+
+C:/wxWidgets-3.1.0/include/wx/region.h:
+
+C:/wxWidgets-3.1.0/include/wx/msw/region.h:
+
+C:/wxWidgets-3.1.0/include/wx/intl.h:
+
+C:/wxWidgets-3.1.0/include/wx/translation.h:
+
+C:/wxWidgets-3.1.0/include/wx/language.h:
+
+C:/wxWidgets-3.1.0/include/wx/scopedptr.h:
+
+C:/wxWidgets-3.1.0/include/wx/checkeddelete.h:
+
+C:/wxWidgets-3.1.0/include/wx/validate.h:
+
+C:/wxWidgets-3.1.0/include/wx/palette.h:
+
+C:/wxWidgets-3.1.0/include/wx/msw/palette.h:
+
+C:/wxWidgets-3.1.0/include/wx/accel.h:
+
+C:/wxWidgets-3.1.0/include/wx/msw/accel.h:
+
+C:/wxWidgets-3.1.0/include/wx/msw/window.h:
+
+C:/wxWidgets-3.1.0/include/wx/settings.h:
+
+C:/wxWidgets-3.1.0/include/wx/msw/nonownedwnd.h:
+
+C:/wxWidgets-3.1.0/include/wx/iconbndl.h:
+
+C:/wxWidgets-3.1.0/include/wx/icon.h:
+
+C:/wxWidgets-3.1.0/include/wx/iconloc.h:
+
+C:/wxWidgets-3.1.0/include/wx/msw/icon.h:
+
+C:/wxWidgets-3.1.0/include/wx/weakref.h:
+
+C:/wxWidgets-3.1.0/include/wx/meta/int2type.h:
+
+C:/wxWidgets-3.1.0/include/wx/msw/toplevel.h:
+
+C:/wxWidgets-3.1.0/include/wx/containr.h:
+
+C:/wxWidgets-3.1.0/include/wx/sharedptr.h:
+
+C:/wxWidgets-3.1.0/include/wx/atomic.h:
+
+C:/wxWidgets-3.1.0/include/wx/msw/wrapwin.h:
+
+C:/wxWidgets-3.1.0/include/wx/msw/dialog.h:
+
+C:/wxWidgets-3.1.0/include/wx/panel.h:
+
+C:/wxWidgets-3.1.0/include/wx/msw/panel.h:
+
+C:/wxWidgets-3.1.0/include/wx/stockitem.h:
+
+C:/wxWidgets-3.1.0/include/wx/generic/msgdlgg.h:
+
+C:/wxWidgets-3.1.0/include/wx/msw/msgdlg.h:
+
+C:/wxWidgets-3.1.0/include/wx/geometry.h:
+
+C:/wxWidgets-3.1.0/include/wx/menu.h:
+
+C:/wxWidgets-3.1.0/include/wx/menuitem.h:
+
+C:/wxWidgets-3.1.0/include/wx/msw/menuitem.h:
+
+C:/wxWidgets-3.1.0/include/wx/bitmap.h:
+
+C:/wxWidgets-3.1.0/include/wx/image.h:
+
+C:/wxWidgets-3.1.0/include/wx/stream.h:
+
+C:/wxWidgets-3.1.0/include/wx/imagbmp.h:
+
+C:/wxWidgets-3.1.0/include/wx/imagpng.h:
+
+C:/wxWidgets-3.1.0/include/wx/imaggif.h:
+
+C:/wxWidgets-3.1.0/include/wx/imagpcx.h:
+
+C:/wxWidgets-3.1.0/include/wx/imagjpeg.h:
+
+C:/wxWidgets-3.1.0/include/wx/imagtga.h:
+
+C:/wxWidgets-3.1.0/include/wx/imagtiff.h:
+
+C:/wxWidgets-3.1.0/include/wx/imagpnm.h:
+
+C:/wxWidgets-3.1.0/include/wx/imagxpm.h:
+
+C:/wxWidgets-3.1.0/include/wx/imagiff.h:
+
+C:/wxWidgets-3.1.0/include/wx/msw/bitmap.h:
+
+C:/wxWidgets-3.1.0/include/wx/ownerdrw.h:
+
+C:/wxWidgets-3.1.0/include/wx/msw/ownerdrw.h:
+
+C:/wxWidgets-3.1.0/include/wx/msw/menu.h:
+
+C:/wxWidgets-3.1.0/include/wx/log.h:
+
C:/wxWidgets-3.1.0/include/wx/generic/logg.h:
+
+Bus.h:
+
+BusForm.h:
+
+ElementForm.h:
+
+C:/wxWidgets-3.1.0/include/wx/xrc/xmlres.h:
+
+C:/wxWidgets-3.1.0/include/wx/filesys.h:
+
+C:/wxWidgets-3.1.0/include/wx/filename.h:
+
+C:/wxWidgets-3.1.0/include/wx/file.h:
+
+C:/wxWidgets-3.1.0/include/wx/convauto.h:
+
+C:/wxWidgets-3.1.0/include/wx/artprov.h:
+
+C:/wxWidgets-3.1.0/include/wx/xrc/xmlreshandler.h:
+
+C:/wxWidgets-3.1.0/include/wx/imaglist.h:
+
+C:/wxWidgets-3.1.0/include/wx/msw/imaglist.h:
+
+C:/wxWidgets-3.1.0/include/wx/xrc/xh_bmp.h:
+
+C:/wxWidgets-3.1.0/include/wx/sizer.h:
+
+C:/wxWidgets-3.1.0/include/wx/notebook.h:
+
+C:/wxWidgets-3.1.0/include/wx/bookctrl.h:
+
+C:/wxWidgets-3.1.0/include/wx/control.h:
+
+C:/wxWidgets-3.1.0/include/wx/msw/control.h:
+
+C:/wxWidgets-3.1.0/include/wx/withimages.h:
+
+C:/wxWidgets-3.1.0/include/wx/msw/notebook.h:
+
+C:/wxWidgets-3.1.0/include/wx/stattext.h:
+
+C:/wxWidgets-3.1.0/include/wx/msw/stattext.h:
+
+C:/wxWidgets-3.1.0/include/wx/textctrl.h:
+
+C:/wxWidgets-3.1.0/include/wx/textentry.h:
+
+C:/wxWidgets-3.1.0/include/wx/msw/textentry.h:
+
+C:/wxWidgets-3.1.0/include/wx/ioswrap.h:
+
+C:/wxWidgets-3.1.0/include/wx/msw/textctrl.h:
+
+C:/wxWidgets-3.1.0/include/wx/choice.h:
+
+C:/wxWidgets-3.1.0/include/wx/ctrlsub.h:
+
+C:/wxWidgets-3.1.0/include/wx/msw/ctrlsub.h:
+
+C:/wxWidgets-3.1.0/include/wx/msw/choice.h:
+
+C:/wxWidgets-3.1.0/include/wx/checkbox.h:
+
+C:/wxWidgets-3.1.0/include/wx/msw/checkbox.h:
+
+C:/wxWidgets-3.1.0/include/wx/msw/ownerdrawnbutton.h:
+
+C:/wxWidgets-3.1.0/include/wx/button.h:
+
+C:/wxWidgets-3.1.0/include/wx/anybutton.h:
+
+C:/wxWidgets-3.1.0/include/wx/msw/anybutton.h:
+
+C:/wxWidgets-3.1.0/include/wx/msw/button.h:
+
+C:/wxWidgets-3.1.0/include/wx/statbox.h:
+
+C:/wxWidgets-3.1.0/include/wx/msw/statbox.h:
+
+C:/wxWidgets-3.1.0/include/wx/statline.h:
+
+C:/wxWidgets-3.1.0/include/wx/msw/statline.h:
+
+C:/wxWidgets-3.1.0/include/wx/propgrid/manager.h:
+
+C:/wxWidgets-3.1.0/include/wx/propgrid/propgrid.h:
+
+C:/wxWidgets-3.1.0/include/wx/dcclient.h:
+
+C:/wxWidgets-3.1.0/include/wx/dc.h:
+
+C:/wxWidgets-3.1.0/include/wx/brush.h:
+
+C:/wxWidgets-3.1.0/include/wx/msw/brush.h:
+
+C:/wxWidgets-3.1.0/include/wx/pen.h:
+
+C:/wxWidgets-3.1.0/include/wx/msw/pen.h:
+
+C:/wxWidgets-3.1.0/include/wx/affinematrix2d.h:
+
+C:/wxWidgets-3.1.0/include/wx/affinematrix2dbase.h:
+
+C:/wxWidgets-3.1.0/include/wx/scrolwin.h:
+
+C:/wxWidgets-3.1.0/include/wx/generic/scrolwin.h:
+
+C:/wxWidgets-3.1.0/include/wx/recguard.h:
+
+C:/wxWidgets-3.1.0/include/wx/tooltip.h:
+
+C:/wxWidgets-3.1.0/include/wx/msw/tooltip.h:
+
+C:/wxWidgets-3.1.0/include/wx/time.h:
+
+C:/wxWidgets-3.1.0/include/wx/propgrid/property.h:
+
+C:/wxWidgets-3.1.0/include/wx/propgrid/propgriddefs.h:
+
+C:/wxWidgets-3.1.0/include/wx/hashset.h:
+
+C:/wxWidgets-3.1.0/include/wx/tokenzr.h:
+
+C:/wxWidgets-3.1.0/include/wx/propgrid/propgridiface.h:
+
+C:/wxWidgets-3.1.0/include/wx/propgrid/propgridpagestate.h:
+
+C:/wxWidgets-3.1.0/include/wx/propgrid/props.h:
+
+C:/wxWidgets-3.1.0/include/wx/propgrid/editors.h:
+
+C:/wxWidgets-3.1.0/include/wx/listbox.h:
+
+C:/wxWidgets-3.1.0/include/wx/msw/listbox.h:
+
+C:/wxWidgets-3.1.0/include/wx/valtext.h:
+
+C:/wxWidgets-3.1.0/include/wx/toolbar.h:
+
+C:/wxWidgets-3.1.0/include/wx/tbarbase.h:
+
+C:/wxWidgets-3.1.0/include/wx/msw/toolbar.h:
+
+C:/wxWidgets-3.1.0/include/wx/headerctrl.h:
+
+C:/wxWidgets-3.1.0/include/wx/headercol.h:
+
+C:/wxWidgets-3.1.0/include/wx/msw/headerctrl.h:
+
+C:/wxWidgets-3.1.0/include/wx/propgrid/advprops.h:
+
+C:/wxWidgets-3.1.0/include/wx/spinbutt.h:
+
+C:/wxWidgets-3.1.0/include/wx/range.h:
+
+C:/wxWidgets-3.1.0/include/wx/msw/spinbutt.h:
+
+C:/wxWidgets-3.1.0/include/wx/listctrl.h:
+
+C:/wxWidgets-3.1.0/include/wx/listbase.h:
+
+C:/wxWidgets-3.1.0/include/wx/systhemectrl.h:
+
+C:/wxWidgets-3.1.0/include/wx/msw/listctrl.h:
+
+C:/wxWidgets-3.1.0/include/wx/persist.h:
+
+C:/wxWidgets-3.1.0/include/wx/confbase.h:
+
+C:/wxWidgets-3.1.0/include/wx/base64.h:
+
+C:/wxWidgets-3.1.0/include/wx/persist/toplevel.h:
+
+C:/wxWidgets-3.1.0/include/wx/persist/window.h:
+
+C:/wxWidgets-3.1.0/include/wx/display.h:
+
+C:/wxWidgets-3.1.0/include/wx/vidmode.h:
+
+C:/wxWidgets-3.1.0/include/wx/persist/bookctrl.h:
+
+C:/wxWidgets-3.1.0/include/wx/persist/treebook.h:
+
+C:/wxWidgets-3.1.0/include/wx/treebook.h:
+
+C:/wxWidgets-3.1.0/include/wx/treectrl.h:
+
+C:/wxWidgets-3.1.0/include/wx/treebase.h:
+
+C:/wxWidgets-3.1.0/include/wx/itemid.h:
+
+C:/wxWidgets-3.1.0/include/wx/msw/treectrl.h:
+
+Capacitor.h:
+
+Shunt.h:
+
+IndMotor.h:
+
+Machines.h:
+
+Inductor.h:
+
+Line.h:
+
+LineForm.h:
+
+Branch.h:
+
+Load.h:
+
+LoadForm.h:
+
+SyncGenerator.h:
+
+SyncMotor.h:
+
+Transformer.h:
diff --git a/Project/Release/SyncGenerator.cpp.o b/Project/Release/SyncGenerator.cpp.o
index 8d3af19..38e96bb 100644
--- a/Project/Release/SyncGenerator.cpp.o
+++ b/Project/Release/SyncGenerator.cpp.o
Binary files differ
diff --git a/Project/Release/SyncMachineForm.cpp.o b/Project/Release/SyncMachineForm.cpp.o
index 928bce0..b5971fd 100644
--- a/Project/Release/SyncMachineForm.cpp.o
+++ b/Project/Release/SyncMachineForm.cpp.o
Binary files differ
diff --git a/Project/Release/SyncMotor.cpp.o b/Project/Release/SyncMotor.cpp.o
index 47c24b1..fa5f101 100644
--- a/Project/Release/SyncMotor.cpp.o
+++ b/Project/Release/SyncMotor.cpp.o
Binary files differ
diff --git a/Project/Release/Workspace.cpp.o b/Project/Release/Workspace.cpp.o
index 36df97a..3bc5af2 100644
--- a/Project/Release/Workspace.cpp.o
+++ b/Project/Release/Workspace.cpp.o
Binary files differ
diff --git a/Project/SyncGenerator.cpp b/Project/SyncGenerator.cpp
index e30e918..b655364 100644
--- a/Project/SyncGenerator.cpp
+++ b/Project/SyncGenerator.cpp
@@ -56,3 +56,74 @@ bool SyncGenerator::ShowForm(wxWindow* parent, Element* element)
generatorForm->Destroy();
return false;
}
+
+SyncGeneratorElectricalData SyncGenerator::GetPUElectricalData(double systemPowerBase)
+{
+ SyncGeneratorElectricalData data = m_electricalData;
+ switch(data.activePowerUnit) {
+ case UNIT_W: {
+ data.activePower = data.activePower / systemPowerBase;
+ data.activePowerUnit = UNIT_PU;
+ } break;
+ case UNIT_kW: {
+ data.activePower = (data.activePower * 1e3) / systemPowerBase;
+ data.activePowerUnit = UNIT_PU;
+ } break;
+ case UNIT_MW: {
+ data.activePower = (data.activePower * 1e6) / systemPowerBase;
+ data.activePowerUnit = UNIT_PU;
+ } break;
+ default:
+ break;
+ }
+ switch(data.reactivePowerUnit) {
+ case UNIT_VAr: {
+ data.reactivePower = data.reactivePower / systemPowerBase;
+ data.reactivePowerUnit = UNIT_PU;
+ } break;
+ case UNIT_kVAr: {
+ data.reactivePower = (data.reactivePower * 1e3) / systemPowerBase;
+ data.reactivePowerUnit = UNIT_PU;
+ } break;
+ case UNIT_MVAr: {
+ data.reactivePower = (data.reactivePower * 1e6) / systemPowerBase;
+ data.reactivePowerUnit = UNIT_PU;
+ } break;
+ default:
+ break;
+ }
+ switch(data.maxReactiveUnit) {
+ case UNIT_VAr: {
+ data.maxReactive = data.maxReactive / systemPowerBase;
+ data.maxReactiveUnit = UNIT_PU;
+ } break;
+ case UNIT_kVAr: {
+ data.maxReactive = (data.maxReactive * 1e3) / systemPowerBase;
+ data.maxReactiveUnit = UNIT_PU;
+ } break;
+ case UNIT_MVAr: {
+ data.maxReactive = (data.maxReactive * 1e6) / systemPowerBase;
+ data.maxReactiveUnit = UNIT_PU;
+ } break;
+ default:
+ break;
+ }
+ switch(data.minReactiveUnit) {
+ case UNIT_VAr: {
+ data.minReactive = data.minReactive / systemPowerBase;
+ data.minReactiveUnit = UNIT_PU;
+ } break;
+ case UNIT_kVAr: {
+ data.minReactive = (data.minReactive * 1e3) / systemPowerBase;
+ data.minReactiveUnit = UNIT_PU;
+ } break;
+ case UNIT_MVAr: {
+ data.minReactive = (data.minReactive * 1e6) / systemPowerBase;
+ data.minReactiveUnit = UNIT_PU;
+ } break;
+ default:
+ break;
+ }
+
+ return data;
+}
diff --git a/Project/SyncGenerator.h b/Project/SyncGenerator.h
index cf1fda9..98c0ce1 100644
--- a/Project/SyncGenerator.h
+++ b/Project/SyncGenerator.h
@@ -12,15 +12,15 @@ struct SyncGeneratorElectricalData
double nominalPower = 100.0;
ElectricalUnit nominalPowerUnit = UNIT_MVA;
double activePower = 100.0;
- ElectricalUnit activePowerUnit = UNIT_MVA;
+ ElectricalUnit activePowerUnit = UNIT_MW;
double reactivePower = 0.0;
- ElectricalUnit reactivePowerUnit = UNIT_MVA;
+ ElectricalUnit reactivePowerUnit = UNIT_MVAr;
bool haveMaxReactive = false;
double maxReactive = 9999.0;
- ElectricalUnit maxReactiveUnit = UNIT_MVA;
+ ElectricalUnit maxReactiveUnit = UNIT_MVAr;
bool haveMinReactive = false;
double minReactive = -9999.0;
- ElectricalUnit minReactiveUnit = UNIT_MVA;
+ ElectricalUnit minReactiveUnit = UNIT_MVAr;
bool useMachineBase = false;
// Fault
@@ -69,6 +69,7 @@ class SyncGenerator : public Machines
virtual bool GetContextMenu(wxMenu& menu);
virtual bool ShowForm(wxWindow* parent, Element* element);
virtual SyncGeneratorElectricalData GetElectricalData() { return m_electricalData; }
+ virtual SyncGeneratorElectricalData GetPUElectricalData(double systemPowerBase);
virtual void SetElectricalData(SyncGeneratorElectricalData electricalData) { m_electricalData = electricalData; }
protected:
std::vector<wxPoint2DDouble> m_sinePts;
diff --git a/Project/SyncMachineForm.h b/Project/SyncMachineForm.h
index 04d8e82..05ddcc3 100644
--- a/Project/SyncMachineForm.h
+++ b/Project/SyncMachineForm.h
@@ -24,8 +24,8 @@ class SyncMachineForm : public SyncMachineFormBase
virtual bool ValidateData();
virtual void ReplaceStaticTextLabelChar(wxStaticText* staticText, wchar_t newChar);
- SyncGenerator* m_syncGenerator;
- SyncMotor* m_syncMotor;
+ SyncGenerator* m_syncGenerator = NULL;
+ SyncMotor* m_syncMotor = NULL;
wxWindow* m_parent;
};
#endif // SYNCMACHINEFORM_H
diff --git a/Project/SyncMotor.cpp b/Project/SyncMotor.cpp
index fba2ee5..2f9c3ce 100644
--- a/Project/SyncMotor.cpp
+++ b/Project/SyncMotor.cpp
@@ -25,3 +25,75 @@ bool SyncMotor::ShowForm(wxWindow* parent, Element* element)
syncMotorForm->Destroy();
return false;
}
+
+SyncMotorElectricalData SyncMotor::GetPUElectricalData(double systemPowerBase)
+{
+ SyncMotorElectricalData data = m_electricalData;
+
+ switch(data.activePowerUnit) {
+ case UNIT_W: {
+ data.activePower = data.activePower / systemPowerBase;
+ data.activePowerUnit = UNIT_PU;
+ } break;
+ case UNIT_kW: {
+ data.activePower = (data.activePower * 1e3) / systemPowerBase;
+ data.activePowerUnit = UNIT_PU;
+ } break;
+ case UNIT_MW: {
+ data.activePower = (data.activePower * 1e6) / systemPowerBase;
+ data.activePowerUnit = UNIT_PU;
+ } break;
+ default:
+ break;
+ }
+ switch(data.reactivePowerUnit) {
+ case UNIT_VAr: {
+ data.reactivePower = data.reactivePower / systemPowerBase;
+ data.reactivePowerUnit = UNIT_PU;
+ } break;
+ case UNIT_kVAr: {
+ data.reactivePower = (data.reactivePower * 1e3) / systemPowerBase;
+ data.reactivePowerUnit = UNIT_PU;
+ } break;
+ case UNIT_MVAr: {
+ data.reactivePower = (data.reactivePower * 1e6) / systemPowerBase;
+ data.reactivePowerUnit = UNIT_PU;
+ } break;
+ default:
+ break;
+ }
+ switch(data.maxReactiveUnit) {
+ case UNIT_VAr: {
+ data.maxReactive = data.maxReactive / systemPowerBase;
+ data.maxReactiveUnit = UNIT_PU;
+ } break;
+ case UNIT_kVAr: {
+ data.maxReactive = (data.maxReactive * 1e3) / systemPowerBase;
+ data.maxReactiveUnit = UNIT_PU;
+ } break;
+ case UNIT_MVAr: {
+ data.maxReactive = (data.maxReactive * 1e6) / systemPowerBase;
+ data.maxReactiveUnit = UNIT_PU;
+ } break;
+ default:
+ break;
+ }
+ switch(data.minReactiveUnit) {
+ case UNIT_VAr: {
+ data.minReactive = data.minReactive / systemPowerBase;
+ data.minReactiveUnit = UNIT_PU;
+ } break;
+ case UNIT_kVAr: {
+ data.minReactive = (data.minReactive * 1e3) / systemPowerBase;
+ data.minReactiveUnit = UNIT_PU;
+ } break;
+ case UNIT_MVAr: {
+ data.minReactive = (data.minReactive * 1e6) / systemPowerBase;
+ data.minReactiveUnit = UNIT_PU;
+ } break;
+ default:
+ break;
+ }
+
+ return data;
+}
diff --git a/Project/SyncMotor.h b/Project/SyncMotor.h
index e199808..1f65386 100644
--- a/Project/SyncMotor.h
+++ b/Project/SyncMotor.h
@@ -11,15 +11,15 @@ struct SyncMotorElectricalData {
double nominalPower = 100.0;
ElectricalUnit nominalPowerUnit = UNIT_MVA;
double activePower = 100.0;
- ElectricalUnit activePowerUnit = UNIT_MVA;
+ ElectricalUnit activePowerUnit = UNIT_MW;
double reactivePower = 0.0;
- ElectricalUnit reactivePowerUnit = UNIT_MVA;
+ ElectricalUnit reactivePowerUnit = UNIT_MVAr;
bool haveMaxReactive = false;
double maxReactive = 9999.0;
- ElectricalUnit maxReactiveUnit = UNIT_MVA;
+ ElectricalUnit maxReactiveUnit = UNIT_MVAr;
bool haveMinReactive = false;
double minReactive = -9999.0;
- ElectricalUnit minReactiveUnit = UNIT_MVA;
+ ElectricalUnit minReactiveUnit = UNIT_MVAr;
bool useMachineBase = false;
// Fault
@@ -66,6 +66,7 @@ class SyncMotor : public Machines
virtual void DrawSymbol() const;
virtual bool GetContextMenu(wxMenu& menu);
virtual SyncMotorElectricalData GetElectricalData() { return m_electricalData; }
+ virtual SyncMotorElectricalData GetPUElectricalData(double systemPowerBase);
virtual void SetElectricalData(SyncMotorElectricalData electricalData) { m_electricalData = electricalData; }
virtual bool ShowForm(wxWindow* parent, Element* element);
diff --git a/Project/Workspace.cpp b/Project/Workspace.cpp
index df34e28..9286add 100644
--- a/Project/Workspace.cpp
+++ b/Project/Workspace.cpp
@@ -62,8 +62,8 @@ Workspace::Workspace(wxWindow* parent, wxString name, wxStatusBar* statusBar) :
m_selectionRect = wxRect2DDouble(0, 0, 0, 0);
for(int i = 0; i < NUM_ELEMENTS; ++i) {
- m_elementNumber[i] = 1;
- }
+ m_elementNumber[i] = 1;
+ }
const int widths[4] = {-3, -1, 100, 100};
m_statusBar->SetStatusWidths(4, widths);
@@ -72,8 +72,8 @@ Workspace::Workspace(wxWindow* parent, wxString name, wxStatusBar* statusBar) :
Workspace::~Workspace()
{
for(auto it = m_elementList.begin(); it != m_elementList.end(); ++it) {
- if(*it) delete *it;
- }
+ if(*it) delete *it;
+ }
m_elementList.clear();
if(m_camera) delete m_camera;
}
@@ -92,9 +92,9 @@ void Workspace::OnPaint(wxPaintEvent& event)
// Elements
for(auto it = m_elementList.begin(); it != m_elementList.end(); ++it) {
- Element* element = *it;
- element->Draw(m_camera->GetTranslation(), m_camera->GetScale());
- }
+ Element* element = *it;
+ element->Draw(m_camera->GetTranslation(), m_camera->GetScale());
+ }
// Selection rectangle
glLineWidth(1.0);
@@ -147,78 +147,84 @@ void Workspace::OnLeftClickDown(wxMouseEvent& event)
{
bool foundElement = false;
if(m_mode == MODE_INSERT || m_mode == MODE_DRAG_INSERT) {
- // Get the last element inserted on the list.
- Element* newElement = *(m_elementList.end() - 1);
- for(auto it = m_elementList.begin(); it != m_elementList.end(); ++it) {
- Element* element = *it;
- // Clicked in any element.
- if(element->Contains(m_camera->ScreenToWorld(event.GetPosition()))) {
- // Click at a bus.
- if(typeid(*element) == typeid(Bus)) {
- // Select the bus.
- element->SetSelected();
- foundElement = true; // Element found.
- // Add the new element's parent. If the element being inserted returns true, back to
- // edit mode.
- if(newElement->AddParent(element, m_camera->ScreenToWorld(event.GetPosition()))) {
- ValidateElementsVoltages();
- m_mode = MODE_EDIT;
- }
- }
- }
- }
- // The line element can have an indefined number of points.
- if(!foundElement) {
- if(typeid(*newElement) == typeid(Line)) {
- newElement->AddPoint(m_camera->ScreenToWorld(event.GetPosition()));
- }
- }
- foundElement = true;
- } else {
- bool clickPickbox = false;
- for(auto it = m_elementList.begin(); it != m_elementList.end(); ++it) {
- Element* element = *it;
- element->ResetPickboxes(); // Reset pickbox state.
-
- // Set movement initial position (not necessarily will be moved).
- element->StartMove(m_camera->ScreenToWorld(event.GetPosition()));
-
- // Click in selected element node.
- if(element->NodeContains(m_camera->ScreenToWorld(event.GetPosition())) != 0 && element->IsSelected()) {
- m_mode = MODE_MOVE_NODE;
- foundElement = true;
- }
-
- // Click in an element.
- else if(element->Contains(m_camera->ScreenToWorld(event.GetPosition()))) {
- if(!foundElement) {
- // Select and show pickbox.
- element->SetSelected();
- element->ShowPickbox();
- foundElement = true;
- }
- // If pickbox contains the click, move the pickbox
- if(element->PickboxContains(m_camera->ScreenToWorld(event.GetPosition()))) {
- m_mode = MODE_MOVE_PICKBOX;
- clickPickbox = true;
- }
- // If didn't found a pickbox, move the element
- if(!clickPickbox) {
- m_mode = MODE_MOVE_ELEMENT;
- }
- }
-
- // Click in a switch.
- else if(element->SwitchesContains(m_camera->ScreenToWorld(event.GetPosition()))) {
- element->SetOnline(element->IsOnline() ? false : true);
- }
- }
- }
+ // Get the last element inserted on the list.
+ Element* newElement = *(m_elementList.end() - 1);
+ for(auto it = m_elementList.begin(); it != m_elementList.end(); ++it) {
+ Element* element = *it;
+ // Clicked in any element.
+ if(element->Contains(m_camera->ScreenToWorld(event.GetPosition()))) {
+ // Click at a bus.
+ if(typeid(*element) == typeid(Bus)) {
+ // Select the bus.
+ element->SetSelected();
+ foundElement = true; // Element found.
+ // Add the new element's parent. If the element being inserted returns true, back to
+ // edit mode.
+ if(newElement->AddParent(element, m_camera->ScreenToWorld(event.GetPosition()))) {
+ ValidateElementsVoltages();
+ m_mode = MODE_EDIT;
+ }
+ }
+ }
+ }
+ // The line element can have an indefined number of points.
+ if(!foundElement) {
+ if(typeid(*newElement) == typeid(Line)) {
+ newElement->AddPoint(m_camera->ScreenToWorld(event.GetPosition()));
+ }
+ }
+ foundElement = true;
+ }
+ else
+ {
+ bool clickPickbox = false;
+ for(auto it = m_elementList.begin(); it != m_elementList.end(); ++it) {
+ Element* element = *it;
+ element->ResetPickboxes(); // Reset pickbox state.
+
+ // Set movement initial position (not necessarily will be moved).
+ element->StartMove(m_camera->ScreenToWorld(event.GetPosition()));
+
+ // Click in selected element node.
+ if(element->NodeContains(m_camera->ScreenToWorld(event.GetPosition())) != 0 &&
+ element->IsSelected())
+ {
+ m_mode = MODE_MOVE_NODE;
+ foundElement = true;
+ }
+
+ // Click in an element.
+ else if(element->Contains(m_camera->ScreenToWorld(event.GetPosition())))
+ {
+ if(!foundElement) {
+ // Select and show pickbox.
+ element->SetSelected();
+ element->ShowPickbox();
+ foundElement = true;
+ }
+ // If pickbox contains the click, move the pickbox
+ if(element->PickboxContains(m_camera->ScreenToWorld(event.GetPosition()))) {
+ m_mode = MODE_MOVE_PICKBOX;
+ clickPickbox = true;
+ }
+ // If didn't found a pickbox, move the element
+ if(!clickPickbox) {
+ m_mode = MODE_MOVE_ELEMENT;
+ }
+ }
+
+ // Click in a switch.
+ else if(element->SwitchesContains(m_camera->ScreenToWorld(event.GetPosition())))
+ {
+ element->SetOnline(element->IsOnline() ? false : true);
+ }
+ }
+ }
if(!foundElement) {
- m_mode = MODE_SELECTION_RECT;
- m_startSelRect = m_camera->ScreenToWorld(event.GetPosition());
- }
+ m_mode = MODE_SELECTION_RECT;
+ m_startSelRect = m_camera->ScreenToWorld(event.GetPosition());
+ }
Redraw();
UpdateStatusBar();
@@ -228,86 +234,89 @@ void Workspace::OnLeftClickDown(wxMouseEvent& event)
void Workspace::OnLeftDoubleClick(wxMouseEvent& event)
{
for(auto it = m_elementList.begin(); it != m_elementList.end(); ++it) {
- Element* element = *it;
-
- // Click in an element.
- if(element->Contains(m_camera->ScreenToWorld(event.GetPosition()))) {
- bool elementIsBus = false;
- Bus oldBus;
- if(typeid(*element) == typeid(Bus)) {
- elementIsBus = true;
- oldBus = *(Bus*)element;
- }
- element->ShowForm(this, element);
-
- // If the edited element is a bus and was changed the nominal voltage, this voltage must be
- // propagated through the lines
- if(elementIsBus) {
- // The voltage was changed
- if(oldBus.GetEletricalData().nominalVoltage != ((Bus*)element)->GetEletricalData().nominalVoltage ||
- oldBus.GetEletricalData().nominalVoltageUnit !=
- ((Bus*)element)->GetEletricalData().nominalVoltageUnit) {
- // Check if the lines has this bus as parent
- for(auto it = m_elementList.begin(); it != m_elementList.end(); it++) {
- Element* child = *it;
-
- bool elementIsParent = false;
- if(typeid(*child) == typeid(Line)) {
- for(int i = 0; i < (int)child->GetParentList().size(); i++) {
- Element* parent = child->GetParentList()[i];
- if(parent == element) {
- // TODO: Ask the user if he wants to change all
- // voltages
- ValidateBusesVoltages(element);
- elementIsParent = true;
- }
- }
- }
- if(elementIsParent) break;
- }
- }
- ValidateElementsVoltages();
- }
- }
-
- // Click in a switch.
- else if(element->SwitchesContains(m_camera->ScreenToWorld(event.GetPosition()))) {
- element->SetOnline(element->IsOnline() ? false : true);
- }
- }
+ Element* element = *it;
+
+ // Click in an element.
+ if(element->Contains(m_camera->ScreenToWorld(event.GetPosition()))) {
+ bool elementIsBus = false;
+ Bus oldBus;
+ if(typeid(*element) == typeid(Bus)) {
+ elementIsBus = true;
+ oldBus = *(Bus*)element;
+ }
+ element->ShowForm(this, element);
+
+ // If the edited element is a bus and was changed the nominal voltage, this voltage must be
+ // propagated through the lines
+ if(elementIsBus) {
+ // The voltage was changed
+ if(oldBus.GetEletricalData().nominalVoltage !=
+ ((Bus*)element)->GetEletricalData().nominalVoltage ||
+ oldBus.GetEletricalData().nominalVoltageUnit !=
+ ((Bus*)element)->GetEletricalData().nominalVoltageUnit)
+ {
+ // Check if the lines has this bus as parent
+ for(auto it = m_elementList.begin(); it != m_elementList.end(); it++) {
+ Element* child = *it;
+
+ bool elementIsParent = false;
+ if(typeid(*child) == typeid(Line)) {
+ for(int i = 0; i < (int)child->GetParentList().size(); i++) {
+ Element* parent = child->GetParentList()[i];
+ if(parent == element) {
+ // TODO: Ask the user if he wants to change all
+ // voltages
+ ValidateBusesVoltages(element);
+ elementIsParent = true;
+ }
+ }
+ }
+ if(elementIsParent) break;
+ }
+ }
+ ValidateElementsVoltages();
+ }
+ }
+
+ // Click in a switch.
+ else if(element->SwitchesContains(m_camera->ScreenToWorld(event.GetPosition())))
+ {
+ element->SetOnline(element->IsOnline() ? false : true);
+ }
+ }
}
void Workspace::OnRightClickDown(wxMouseEvent& event)
{
bool redraw = false;
if(m_mode == MODE_EDIT) {
- for(auto it = m_elementList.begin(); it != m_elementList.end(); ++it) {
- Element* element = *it;
- if(element->IsSelected()) {
- // Show context menu.
- if(element->Contains(m_camera->ScreenToWorld(event.GetPosition()))) {
- element->ShowPickbox(false);
- wxMenu menu;
- if(element->GetContextMenu(menu)) {
- menu.SetClientData(element);
- menu.Connect(wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(Workspace::OnPopupClick), NULL,
- this);
- PopupMenu(&menu);
- redraw = true;
- }
- element->ResetPickboxes();
-
- if(redraw) {
- Redraw();
- redraw = false;
- }
- // If the last element was removed using the menu, we must leave the "search for" to
- // prevent error.
- break;
- }
- }
- }
- }
+ for(auto it = m_elementList.begin(); it != m_elementList.end(); ++it) {
+ Element* element = *it;
+ if(element->IsSelected()) {
+ // Show context menu.
+ if(element->Contains(m_camera->ScreenToWorld(event.GetPosition()))) {
+ element->ShowPickbox(false);
+ wxMenu menu;
+ if(element->GetContextMenu(menu)) {
+ menu.SetClientData(element);
+ menu.Connect(wxEVT_COMMAND_MENU_SELECTED,
+ wxCommandEventHandler(Workspace::OnPopupClick), NULL, this);
+ PopupMenu(&menu);
+ redraw = true;
+ }
+ element->ResetPickboxes();
+
+ if(redraw) {
+ Redraw();
+ redraw = false;
+ }
+ // If the last element was removed using the menu, we must leave the "search for" to
+ // prevent error.
+ break;
+ }
+ }
+ }
+ }
}
void Workspace::OnLeftClickUp(wxMouseEvent& event)
@@ -320,81 +329,89 @@ void Workspace::OnLeftClickUp(wxMouseEvent& event)
auto itnp = m_elementList.begin();
for(auto it = m_elementList.begin(); it != m_elementList.end(); ++it) {
- Element* element = *it;
-
- // The user was moving a pickbox.
- if(m_mode == MODE_MOVE_PICKBOX) {
- // Catch only the element that have the pickbox shown.
- if(element->IsPickboxShown()) {
- // If the element is a bus, check if a node is outside.
- if(typeid(*element) == typeid(Bus)) {
- // Get all the bus children.
- for(int i = 0; i < (int)m_elementList.size(); i++) {
- Element* child = m_elementList[i];
- for(int j = 0; j < (int)child->GetParentList().size(); j++) {
- Element* parent = child->GetParentList()[j];
- // The child have a parent that is the element.
- if(parent == element) {
- child->UpdateNodes();
- }
- }
- }
- }
- }
- }
-
- if(m_mode == MODE_SELECTION_RECT) {
- if(element->Intersects(m_selectionRect)) {
- element->SetSelected();
- } else {
- element->SetSelected(false);
- }
- } else if(m_mode == MODE_MOVE_NODE) {
- if(element->IsSelected()) {
- for(int i = 0; i < (int)m_elementList.size(); i++) {
- Element* parent = m_elementList[i];
- if(typeid(*parent) == typeid(Bus)) {
- if(element->SetNodeParent(parent)) {
- findNewParent = true;
- itnp = it;
- element->ResetNodes();
- break;
- }
- }
- }
- // element->ResetNodes();
- }
- } else {
- // Deselect
- if(!event.ControlDown()) {
- if(!element->Contains(m_camera->ScreenToWorld(event.GetPosition()))) {
- element->SetSelected(false);
- }
- }
-
- if(element->PickboxContains(m_camera->ScreenToWorld(event.GetPosition()))) {
- foundPickbox = true;
- } else {
- element->ShowPickbox(false);
- element->ResetPickboxes();
- }
- }
- }
+ Element* element = *it;
+
+ // The user was moving a pickbox.
+ if(m_mode == MODE_MOVE_PICKBOX) {
+ // Catch only the element that have the pickbox shown.
+ if(element->IsPickboxShown()) {
+ // If the element is a bus, check if a node is outside.
+ if(typeid(*element) == typeid(Bus)) {
+ // Get all the bus children.
+ for(int i = 0; i < (int)m_elementList.size(); i++) {
+ Element* child = m_elementList[i];
+ for(int j = 0; j < (int)child->GetParentList().size(); j++) {
+ Element* parent = child->GetParentList()[j];
+ // The child have a parent that is the element.
+ if(parent == element) {
+ child->UpdateNodes();
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if(m_mode == MODE_SELECTION_RECT) {
+ if(element->Intersects(m_selectionRect)) {
+ element->SetSelected();
+ }
+ else
+ {
+ element->SetSelected(false);
+ }
+ }
+ else if(m_mode == MODE_MOVE_NODE)
+ {
+ if(element->IsSelected()) {
+ for(int i = 0; i < (int)m_elementList.size(); i++) {
+ Element* parent = m_elementList[i];
+ if(typeid(*parent) == typeid(Bus)) {
+ if(element->SetNodeParent(parent)) {
+ findNewParent = true;
+ itnp = it;
+ element->ResetNodes();
+ break;
+ }
+ }
+ }
+ // element->ResetNodes();
+ }
+ }
+ else
+ {
+ // Deselect
+ if(!event.ControlDown()) {
+ if(!element->Contains(m_camera->ScreenToWorld(event.GetPosition()))) {
+ element->SetSelected(false);
+ }
+ }
+
+ if(element->PickboxContains(m_camera->ScreenToWorld(event.GetPosition()))) {
+ foundPickbox = true;
+ }
+ else
+ {
+ element->ShowPickbox(false);
+ element->ResetPickboxes();
+ }
+ }
+ }
if(findNewParent) {
- std::rotate(itnp, itnp + 1, m_elementList.end());
- updateVoltages = true;
- }
+ std::rotate(itnp, itnp + 1, m_elementList.end());
+ updateVoltages = true;
+ }
if(!foundPickbox) {
- SetCursor(wxCURSOR_ARROW);
- }
+ SetCursor(wxCURSOR_ARROW);
+ }
if(m_mode != MODE_INSERT) {
- m_mode = MODE_EDIT;
- }
+ m_mode = MODE_EDIT;
+ }
if(updateVoltages) {
- ValidateElementsVoltages();
- }
+ ValidateElementsVoltages();
+ }
m_selectionRect = wxRect2DDouble(0, 0, 0, 0);
Redraw();
UpdateStatusBar();
@@ -403,109 +420,133 @@ void Workspace::OnLeftClickUp(wxMouseEvent& event)
void Workspace::OnMouseMotion(wxMouseEvent& event)
{
bool redraw = false;
- switch(m_mode) {
- case MODE_INSERT: {
- Element* newElement = *(m_elementList.end() - 1); // Get the last element in the list.
- newElement->SetPosition(m_camera->ScreenToWorld(event.GetPosition()));
- redraw = true;
- } break;
-
- case MODE_DRAG:
- case MODE_DRAG_INSERT: {
- m_camera->SetTranslation(event.GetPosition());
- redraw = true;
- } break;
-
- case MODE_EDIT: {
- bool foundPickbox = false;
- for(auto it = m_elementList.begin(); it != m_elementList.end(); ++it) {
- Element* element = *it;
- if(element->IsSelected()) {
- // Show element pickbox (when it has) if the mouse is over the selected object.
- if(element->Contains(m_camera->ScreenToWorld(event.GetPosition()))) {
- element->ShowPickbox();
- redraw = true;
-
- // If the mouse is over a pickbox set correct mouse cursor.
- if(element->PickboxContains(m_camera->ScreenToWorld(event.GetPosition()))) {
- foundPickbox = true;
- SetCursor(element->GetBestPickboxCursor());
- } else if(!foundPickbox) {
- SetCursor(wxCURSOR_ARROW);
- element->ResetPickboxes();
- }
- } else if(!foundPickbox) {
- if(element->IsPickboxShown()) redraw = true;
-
- element->ShowPickbox(false);
- element->ResetPickboxes();
- SetCursor(wxCURSOR_ARROW);
- }
- }
- }
- } break;
-
- case MODE_MOVE_NODE: {
- for(auto it = m_elementList.begin(); it != m_elementList.end(); ++it) {
- Element* element = *it;
- if(element->IsSelected()) {
- element->MoveNode(NULL, m_camera->ScreenToWorld(event.GetPosition()));
- redraw = true;
- }
- }
- } break;
-
- case MODE_MOVE_PICKBOX: {
- for(auto it = m_elementList.begin(); it != m_elementList.end(); ++it) {
- Element* element = *it;
- if(element->IsSelected()) {
- element->MovePickbox(m_camera->ScreenToWorld(event.GetPosition()));
- redraw = true;
- }
- }
- } break;
-
- case MODE_MOVE_ELEMENT: {
- for(auto it = m_elementList.begin(); it != m_elementList.end(); ++it) {
- Element* element = *it;
- // Parent's element moving...
- for(int i = 0; i < (int)element->GetParentList().size(); i++) {
- Element* parent = element->GetParentList()[i];
- if(parent) {
- if(parent->IsSelected()) {
- element->MoveNode(parent, m_camera->ScreenToWorld(event.GetPosition()));
- }
- }
- }
- if(element->IsSelected()) {
- element->Move(m_camera->ScreenToWorld(event.GetPosition()));
- redraw = true;
- }
- }
- } break;
-
- case MODE_SELECTION_RECT: {
- wxPoint2DDouble currentPos = m_camera->ScreenToWorld(event.GetPosition());
- double x, y, w, h;
- if(currentPos.m_x < m_startSelRect.m_x) {
- x = currentPos.m_x;
- w = m_startSelRect.m_x - currentPos.m_x;
- } else {
- x = m_startSelRect.m_x;
- w = currentPos.m_x - m_startSelRect.m_x;
- }
- if(currentPos.m_y < m_startSelRect.m_y) {
- y = currentPos.m_y;
- h = m_startSelRect.m_y - currentPos.m_y;
- } else {
- y = m_startSelRect.m_y;
- h = currentPos.m_y - m_startSelRect.m_y;
- }
-
- m_selectionRect = wxRect2DDouble(x, y, w, h);
- redraw = true;
- } break;
- }
+ switch(m_mode)
+ {
+ case MODE_INSERT:
+ {
+ Element* newElement = *(m_elementList.end() - 1); // Get the last element in the list.
+ newElement->SetPosition(m_camera->ScreenToWorld(event.GetPosition()));
+ redraw = true;
+ }
+ break;
+
+ case MODE_DRAG:
+ case MODE_DRAG_INSERT:
+ {
+ m_camera->SetTranslation(event.GetPosition());
+ redraw = true;
+ }
+ break;
+
+ case MODE_EDIT:
+ {
+ bool foundPickbox = false;
+ for(auto it = m_elementList.begin(); it != m_elementList.end(); ++it) {
+ Element* element = *it;
+ if(element->IsSelected()) {
+ // Show element pickbox (when it has) if the mouse is over the selected object.
+ if(element->Contains(m_camera->ScreenToWorld(event.GetPosition()))) {
+ element->ShowPickbox();
+ redraw = true;
+
+ // If the mouse is over a pickbox set correct mouse cursor.
+ if(element->PickboxContains(m_camera->ScreenToWorld(event.GetPosition()))) {
+ foundPickbox = true;
+ SetCursor(element->GetBestPickboxCursor());
+ }
+ else if(!foundPickbox)
+ {
+ SetCursor(wxCURSOR_ARROW);
+ element->ResetPickboxes();
+ }
+ }
+ else if(!foundPickbox)
+ {
+ if(element->IsPickboxShown()) redraw = true;
+
+ element->ShowPickbox(false);
+ element->ResetPickboxes();
+ SetCursor(wxCURSOR_ARROW);
+ }
+ }
+ }
+ }
+ break;
+
+ case MODE_MOVE_NODE:
+ {
+ for(auto it = m_elementList.begin(); it != m_elementList.end(); ++it) {
+ Element* element = *it;
+ if(element->IsSelected()) {
+ element->MoveNode(NULL, m_camera->ScreenToWorld(event.GetPosition()));
+ redraw = true;
+ }
+ }
+ }
+ break;
+
+ case MODE_MOVE_PICKBOX:
+ {
+ for(auto it = m_elementList.begin(); it != m_elementList.end(); ++it) {
+ Element* element = *it;
+ if(element->IsSelected()) {
+ element->MovePickbox(m_camera->ScreenToWorld(event.GetPosition()));
+ redraw = true;
+ }
+ }
+ }
+ break;
+
+ case MODE_MOVE_ELEMENT:
+ {
+ for(auto it = m_elementList.begin(); it != m_elementList.end(); ++it) {
+ Element* element = *it;
+ // Parent's element moving...
+ for(int i = 0; i < (int)element->GetParentList().size(); i++) {
+ Element* parent = element->GetParentList()[i];
+ if(parent) {
+ if(parent->IsSelected()) {
+ element->MoveNode(parent,
+ m_camera->ScreenToWorld(event.GetPosition()));
+ }
+ }
+ }
+ if(element->IsSelected()) {
+ element->Move(m_camera->ScreenToWorld(event.GetPosition()));
+ redraw = true;
+ }
+ }
+ }
+ break;
+
+ case MODE_SELECTION_RECT:
+ {
+ wxPoint2DDouble currentPos = m_camera->ScreenToWorld(event.GetPosition());
+ double x, y, w, h;
+ if(currentPos.m_x < m_startSelRect.m_x) {
+ x = currentPos.m_x;
+ w = m_startSelRect.m_x - currentPos.m_x;
+ }
+ else
+ {
+ x = m_startSelRect.m_x;
+ w = currentPos.m_x - m_startSelRect.m_x;
+ }
+ if(currentPos.m_y < m_startSelRect.m_y) {
+ y = currentPos.m_y;
+ h = m_startSelRect.m_y - currentPos.m_y;
+ }
+ else
+ {
+ y = m_startSelRect.m_y;
+ h = currentPos.m_y - m_startSelRect.m_y;
+ }
+
+ m_selectionRect = wxRect2DDouble(x, y, w, h);
+ redraw = true;
+ }
+ break;
+ }
if(redraw) Redraw();
m_camera->UpdateMousePosition(event.GetPosition());
@@ -517,29 +558,33 @@ void Workspace::OnMiddleDown(wxMouseEvent& event)
{
// Set to drag mode.
if(m_mode != MODE_INSERT && m_mode != MODE_DRAG_INSERT) {
- m_mode = MODE_DRAG;
- } else {
- m_mode = MODE_DRAG_INSERT;
- }
+ m_mode = MODE_DRAG;
+ }
+ else
+ {
+ m_mode = MODE_DRAG_INSERT;
+ }
m_camera->StartTranslation(m_camera->ScreenToWorld(event.GetPosition()));
UpdateStatusBar();
}
void Workspace::OnMiddleUp(wxMouseEvent& event)
{
if(m_mode != MODE_INSERT && m_mode != MODE_DRAG_INSERT) {
- // Set to edit mode back.
- m_mode = MODE_EDIT;
- } else if(m_mode == MODE_DRAG_INSERT) {
- m_mode = MODE_INSERT;
- }
+ // Set to edit mode back.
+ m_mode = MODE_EDIT;
+ }
+ else if(m_mode == MODE_DRAG_INSERT)
+ {
+ m_mode = MODE_INSERT;
+ }
UpdateStatusBar();
}
void Workspace::OnScroll(wxMouseEvent& event)
{
if(event.GetWheelRotation() > 0)
- m_camera->SetScale(event.GetPosition(), +0.05);
+ m_camera->SetScale(event.GetPosition(), +0.05);
else
- m_camera->SetScale(event.GetPosition(), -0.05);
+ m_camera->SetScale(event.GetPosition(), -0.05);
UpdateStatusBar();
Redraw();
@@ -549,128 +594,160 @@ void Workspace::OnKeyDown(wxKeyEvent& event)
{
char key = event.GetUnicodeKey();
if(key != WXK_NONE) {
- switch(key) {
- case WXK_ESCAPE: // Cancel operations.
- {
- if(m_mode == MODE_INSERT) {
- m_elementList.pop_back(); // Removes the last element being inserted.
- m_mode = MODE_EDIT;
- Redraw();
- }
- } break;
- case WXK_DELETE: // Delete selected elements
- {
- DeleteSelectedElements();
- } break;
- case 'F': {
- if(event.GetModifiers() == wxMOD_SHIFT) {
- Fit();
- }
- } break;
- case 'R': // Rotate the selected elements.
- {
- RotateSelectedElements(event.GetModifiers() != wxMOD_SHIFT);
- } break;
- case 'B': // Insert a bus.
- {
- if(m_mode != MODE_INSERT) {
- Bus* newBus = new Bus(m_camera->ScreenToWorld(event.GetPosition()),
- wxString::Format(_("Bus %d"), GetElementNumber(ID_BUS)));
- IncrementElementNumber(ID_BUS);
- m_elementList.push_back(newBus);
- m_mode = MODE_INSERT;
- m_statusBar->SetStatusText(_("Insert Bus: Click to insert, ESC to cancel."));
- Redraw();
- }
- } break;
- case 'L': {
- if(m_mode != MODE_INSERT) {
- if(event.GetModifiers() == wxMOD_SHIFT) { // Insert a load.
- Load* newLoad = new Load(wxString::Format(_("Load %d"), GetElementNumber(ID_LOAD)));
- IncrementElementNumber(ID_LOAD);
- m_elementList.push_back(newLoad);
- m_mode = MODE_INSERT;
- m_statusBar->SetStatusText(_("Insert Load: Click on a buses, ESC to cancel."));
- } else { // Insert a power line.
- Line* newLine = new Line(wxString::Format(_("Line %d"), GetElementNumber(ID_LINE)));
- IncrementElementNumber(ID_LINE);
- m_elementList.push_back(newLine);
- m_mode = MODE_INSERT;
- m_statusBar->SetStatusText(_("Insert Line: Click on two buses, ESC to cancel."));
- }
- Redraw();
- }
- } break;
- case 'T': // Insert a transformer.
- {
- if(m_mode != MODE_INSERT) {
- Transformer* newTransformer =
- new Transformer(wxString::Format(_("Transformer %d"), GetElementNumber(ID_TRANSFORMER)));
- IncrementElementNumber(ID_TRANSFORMER);
- m_elementList.push_back(newTransformer);
- m_mode = MODE_INSERT;
- m_statusBar->SetStatusText(_("Insert Transformer: Click on two buses, ESC to cancel."));
- Redraw();
- }
- } break;
- case 'G': // Insert a generator.
- {
- if(m_mode != MODE_INSERT) {
- SyncGenerator* newGenerator =
- new SyncGenerator(wxString::Format(_("Generator %d"), GetElementNumber(ID_SYNCGENERATOR)));
- IncrementElementNumber(ID_SYNCGENERATOR);
- m_elementList.push_back(newGenerator);
- m_mode = MODE_INSERT;
- m_statusBar->SetStatusText(_("Insert Generator: Click on a buses, ESC to cancel."));
- Redraw();
- }
- } break;
- case 'I': {
- if(m_mode != MODE_INSERT) {
- if(event.GetModifiers() == wxMOD_SHIFT) { // Insert an inductor.
- Inductor* newInductor = new Inductor(wxString::Format(_("Inductor %d"), GetElementNumber(ID_INDUCTOR)));
- IncrementElementNumber(ID_INDUCTOR);
- m_elementList.push_back(newInductor);
- m_mode = MODE_INSERT;
- m_statusBar->SetStatusText(_("Insert Inductor: Click on a buses, ESC to cancel."));
- } else // Insert an induction motor.
- {
- IndMotor* newIndMotor = new IndMotor(wxString::Format(_("Induction motor %d"), GetElementNumber(ID_INDMOTOR)));
- IncrementElementNumber(ID_INDMOTOR);
- m_elementList.push_back(newIndMotor);
- m_mode = MODE_INSERT;
- m_statusBar->SetStatusText(_("Insert Induction Motor: Click on a buses, ESC to cancel."));
- }
- Redraw();
- }
- } break;
- case 'K': // Insert a synchronous condenser.
- {
- if(m_mode != MODE_INSERT) {
- SyncMotor* newSyncCondenser = new SyncMotor(wxString::Format(_("Synchronous condenser %d"), GetElementNumber(ID_SYNCMOTOR)));
- IncrementElementNumber(ID_SYNCMOTOR);
- m_elementList.push_back(newSyncCondenser);
- m_mode = MODE_INSERT;
- m_statusBar->SetStatusText(_("Insert Synchronous Condenser: Click on a buses, ESC to cancel."));
- Redraw();
- }
- } break;
- case 'C': {
- if(m_mode != MODE_INSERT) {
- if(event.GetModifiers() == wxMOD_SHIFT) { // Insert a capacitor.
- Capacitor* newCapacitor = new Capacitor(wxString::Format(_("Capacitor %d"), GetElementNumber(ID_CAPACITOR)));
- IncrementElementNumber(ID_CAPACITOR);
- m_elementList.push_back(newCapacitor);
- m_mode = MODE_INSERT;
- m_statusBar->SetStatusText(_("Insert Capacitor: Click on a buses, ESC to cancel."));
- Redraw();
- }
- }
- } break;
- default:
- break;
- }
- }
+ switch(key)
+ {
+ case WXK_ESCAPE: // Cancel operations.
+ {
+ if(m_mode == MODE_INSERT) {
+ m_elementList.pop_back(); // Removes the last element being inserted.
+ m_mode = MODE_EDIT;
+ Redraw();
+ }
+ }
+ break;
+ case WXK_DELETE: // Delete selected elements
+ {
+ DeleteSelectedElements();
+ }
+ break;
+ case 'F':
+ {
+ if(event.GetModifiers() == wxMOD_SHIFT) {
+ Fit();
+ }
+ }
+ break;
+ case 'R': // Rotate the selected elements.
+ {
+ RotateSelectedElements(event.GetModifiers() != wxMOD_SHIFT);
+ }
+ break;
+ case 'B': // Insert a bus.
+ {
+ if(m_mode != MODE_INSERT) {
+ Bus* newBus = new Bus(m_camera->ScreenToWorld(event.GetPosition()),
+ wxString::Format(_("Bus %d"), GetElementNumber(ID_BUS)));
+ IncrementElementNumber(ID_BUS);
+ m_elementList.push_back(newBus);
+ m_mode = MODE_INSERT;
+ m_statusBar->SetStatusText(_("Insert Bus: Click to insert, ESC to cancel."));
+ Redraw();
+ }
+ }
+ break;
+ case 'L':
+ {
+ if(m_mode != MODE_INSERT) {
+ if(event.GetModifiers() == wxMOD_SHIFT) { // Insert a load.
+ Load* newLoad =
+ new Load(wxString::Format(_("Load %d"), GetElementNumber(ID_LOAD)));
+ IncrementElementNumber(ID_LOAD);
+ m_elementList.push_back(newLoad);
+ m_mode = MODE_INSERT;
+ m_statusBar->SetStatusText(
+ _("Insert Load: Click on a buses, ESC to cancel."));
+ }
+ else
+ { // Insert a power line.
+ Line* newLine =
+ new Line(wxString::Format(_("Line %d"), GetElementNumber(ID_LINE)));
+ IncrementElementNumber(ID_LINE);
+ m_elementList.push_back(newLine);
+ m_mode = MODE_INSERT;
+ m_statusBar->SetStatusText(
+ _("Insert Line: Click on two buses, ESC to cancel."));
+ }
+ Redraw();
+ }
+ }
+ break;
+ case 'T': // Insert a transformer.
+ {
+ if(m_mode != MODE_INSERT) {
+ Transformer* newTransformer = new Transformer(
+ wxString::Format(_("Transformer %d"), GetElementNumber(ID_TRANSFORMER)));
+ IncrementElementNumber(ID_TRANSFORMER);
+ m_elementList.push_back(newTransformer);
+ m_mode = MODE_INSERT;
+ m_statusBar->SetStatusText(
+ _("Insert Transformer: Click on two buses, ESC to cancel."));
+ Redraw();
+ }
+ }
+ break;
+ case 'G': // Insert a generator.
+ {
+ if(m_mode != MODE_INSERT) {
+ SyncGenerator* newGenerator = new SyncGenerator(
+ wxString::Format(_("Generator %d"), GetElementNumber(ID_SYNCGENERATOR)));
+ IncrementElementNumber(ID_SYNCGENERATOR);
+ m_elementList.push_back(newGenerator);
+ m_mode = MODE_INSERT;
+ m_statusBar->SetStatusText(_("Insert Generator: Click on a buses, ESC to cancel."));
+ Redraw();
+ }
+ }
+ break;
+ case 'I':
+ {
+ if(m_mode != MODE_INSERT) {
+ if(event.GetModifiers() == wxMOD_SHIFT) { // Insert an inductor.
+ Inductor* newInductor = new Inductor(
+ wxString::Format(_("Inductor %d"), GetElementNumber(ID_INDUCTOR)));
+ IncrementElementNumber(ID_INDUCTOR);
+ m_elementList.push_back(newInductor);
+ m_mode = MODE_INSERT;
+ m_statusBar->SetStatusText(
+ _("Insert Inductor: Click on a buses, ESC to cancel."));
+ }
+ else // Insert an induction motor.
+ {
+ IndMotor* newIndMotor = new IndMotor(wxString::Format(
+ _("Induction motor %d"), GetElementNumber(ID_INDMOTOR)));
+ IncrementElementNumber(ID_INDMOTOR);
+ m_elementList.push_back(newIndMotor);
+ m_mode = MODE_INSERT;
+ m_statusBar->SetStatusText(
+ _("Insert Induction Motor: Click on a buses, ESC to cancel."));
+ }
+ Redraw();
+ }
+ }
+ break;
+ case 'K': // Insert a synchronous condenser.
+ {
+ if(m_mode != MODE_INSERT) {
+ SyncMotor* newSyncCondenser = new SyncMotor(wxString::Format(
+ _("Synchronous condenser %d"), GetElementNumber(ID_SYNCMOTOR)));
+ IncrementElementNumber(ID_SYNCMOTOR);
+ m_elementList.push_back(newSyncCondenser);
+ m_mode = MODE_INSERT;
+ m_statusBar->SetStatusText(
+ _("Insert Synchronous Condenser: Click on a buses, ESC to cancel."));
+ Redraw();
+ }
+ }
+ break;
+ case 'C':
+ {
+ if(m_mode != MODE_INSERT) {
+ if(event.GetModifiers() == wxMOD_SHIFT) { // Insert a capacitor.
+ Capacitor* newCapacitor = new Capacitor(
+ wxString::Format(_("Capacitor %d"), GetElementNumber(ID_CAPACITOR)));
+ IncrementElementNumber(ID_CAPACITOR);
+ m_elementList.push_back(newCapacitor);
+ m_mode = MODE_INSERT;
+ m_statusBar->SetStatusText(
+ _("Insert Capacitor: Click on a buses, ESC to cancel."));
+ Redraw();
+ }
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ }
UpdateStatusBar();
event.Skip();
@@ -678,25 +755,32 @@ void Workspace::OnKeyDown(wxKeyEvent& event)
void Workspace::UpdateStatusBar()
{
- switch(m_mode) {
- case MODE_DRAG: {
- m_statusBar->SetStatusText(_("MODE: DRAG"), 1);
- } break;
-
- case MODE_INSERT:
- case MODE_DRAG_INSERT: {
- m_statusBar->SetStatusText(_("MODE: INSERT"), 1);
- } break;
-
- case MODE_MOVE_ELEMENT:
- case MODE_MOVE_PICKBOX:
- case MODE_MOVE_NODE:
- case MODE_SELECTION_RECT:
- case MODE_EDIT: {
- m_statusBar->SetStatusText(wxT(""));
- m_statusBar->SetStatusText(_("MODE: EDIT"), 1);
- } break;
- }
+ switch(m_mode)
+ {
+ case MODE_DRAG:
+ {
+ m_statusBar->SetStatusText(_("MODE: DRAG"), 1);
+ }
+ break;
+
+ case MODE_INSERT:
+ case MODE_DRAG_INSERT:
+ {
+ m_statusBar->SetStatusText(_("MODE: INSERT"), 1);
+ }
+ break;
+
+ case MODE_MOVE_ELEMENT:
+ case MODE_MOVE_PICKBOX:
+ case MODE_MOVE_NODE:
+ case MODE_SELECTION_RECT:
+ case MODE_EDIT:
+ {
+ m_statusBar->SetStatusText(wxT(""));
+ m_statusBar->SetStatusText(_("MODE: EDIT"), 1);
+ }
+ break;
+ }
m_statusBar->SetStatusText(wxString::Format(_("ZOOM: %d%%"), (int)(m_camera->GetScale() * 100.0)), 2);
m_statusBar->SetStatusText(
@@ -708,157 +792,174 @@ void Workspace::OnPopupClick(wxCommandEvent& event)
{
wxMenu* menu = (wxMenu*)event.GetEventObject();
Element* element = (Element*)menu->GetClientData();
- switch(event.GetId()) {
- case ID_EDIT_BUS: {
- wxMessageBox("Edit bus!");
- } break;
- case ID_EDIT_LINE: {
- wxMessageBox("Edit line!");
- } break;
- case ID_EDIT_TRANSFORMER: {
- wxMessageBox("Edit transformer!");
- } break;
- case ID_LINE_ADD_NODE: {
- Line* line = (Line*)element;
- line->AddNode(m_camera->GetMousePosition());
- Redraw();
- } break;
- case ID_LINE_REMOVE_NODE: {
- Line* line = (Line*)element;
- line->RemoveNode(m_camera->GetMousePosition());
- Redraw();
- } break;
- case ID_ROTATE_CLOCK: {
- element->Rotate();
- for(auto it = m_elementList.begin(); it != m_elementList.end(); ++it) {
- Element* iElement = *it;
- // Parent's element rotating...
- for(int i = 0; i < (int)iElement->GetParentList().size(); i++) {
- Element* parent = iElement->GetParentList()[i];
- if(parent == element) {
- iElement->RotateNode(parent);
- }
- }
- }
- Redraw();
- } break;
- case ID_ROTATE_COUNTERCLOCK: {
- element->Rotate(false);
- for(auto it = m_elementList.begin(); it != m_elementList.end(); ++it) {
- Element* iElement = *it;
- // Parent's element rotating...
- for(int i = 0; i < (int)iElement->GetParentList().size(); i++) {
- Element* parent = iElement->GetParentList()[i];
- if(parent == element) {
- iElement->RotateNode(parent, false);
- }
- }
- }
- Redraw();
- } break;
- case ID_DELETE: {
- for(auto it = m_elementList.begin(); it != m_elementList.end(); ++it) {
- Element* iElement = *it;
-
- if(element == iElement) {
- for(auto itp = m_elementList.begin(); itp != m_elementList.end(); ++itp) {
- Element* child = *itp;
- // Parent's element being deleted...
- for(int i = 0; i < (int)child->GetParentList().size(); i++) {
- Element* parent = child->GetParentList()[i];
- if(parent == element) {
- child->RemoveParent(parent);
- }
- }
- }
- m_elementList.erase(it--);
- }
- }
- } break;
- }
+ switch(event.GetId())
+ {
+ case ID_EDIT_BUS:
+ {
+ wxMessageBox("Edit bus!");
+ }
+ break;
+ case ID_EDIT_LINE:
+ {
+ wxMessageBox("Edit line!");
+ }
+ break;
+ case ID_EDIT_TRANSFORMER:
+ {
+ wxMessageBox("Edit transformer!");
+ }
+ break;
+ case ID_LINE_ADD_NODE:
+ {
+ Line* line = (Line*)element;
+ line->AddNode(m_camera->GetMousePosition());
+ Redraw();
+ }
+ break;
+ case ID_LINE_REMOVE_NODE:
+ {
+ Line* line = (Line*)element;
+ line->RemoveNode(m_camera->GetMousePosition());
+ Redraw();
+ }
+ break;
+ case ID_ROTATE_CLOCK:
+ {
+ element->Rotate();
+ for(auto it = m_elementList.begin(); it != m_elementList.end(); ++it) {
+ Element* iElement = *it;
+ // Parent's element rotating...
+ for(int i = 0; i < (int)iElement->GetParentList().size(); i++) {
+ Element* parent = iElement->GetParentList()[i];
+ if(parent == element) {
+ iElement->RotateNode(parent);
+ }
+ }
+ }
+ Redraw();
+ }
+ break;
+ case ID_ROTATE_COUNTERCLOCK:
+ {
+ element->Rotate(false);
+ for(auto it = m_elementList.begin(); it != m_elementList.end(); ++it) {
+ Element* iElement = *it;
+ // Parent's element rotating...
+ for(int i = 0; i < (int)iElement->GetParentList().size(); i++) {
+ Element* parent = iElement->GetParentList()[i];
+ if(parent == element) {
+ iElement->RotateNode(parent, false);
+ }
+ }
+ }
+ Redraw();
+ }
+ break;
+ case ID_DELETE:
+ {
+ for(auto it = m_elementList.begin(); it != m_elementList.end(); ++it) {
+ Element* iElement = *it;
+
+ if(element == iElement) {
+ for(auto itp = m_elementList.begin(); itp != m_elementList.end(); ++itp) {
+ Element* child = *itp;
+ // Parent's element being deleted...
+ for(int i = 0; i < (int)child->GetParentList().size(); i++) {
+ Element* parent = child->GetParentList()[i];
+ if(parent == element) {
+ child->RemoveParent(parent);
+ }
+ }
+ }
+ m_elementList.erase(it--);
+ }
+ }
+ }
+ break;
+ }
}
void Workspace::RotateSelectedElements(bool clockwise)
{
for(auto it = m_elementList.begin(); it != m_elementList.end(); ++it) {
- Element* element = *it;
- // Parent's element rotating...
- for(int i = 0; i < (int)element->GetParentList().size(); i++) {
- Element* parent = element->GetParentList()[i];
- if(parent) { // Check if parent is not null
- if(parent->IsSelected()) {
- element->RotateNode(parent, clockwise);
- // Update the positions used on motion action, the element will not be necessarily
- // moved.
- element->StartMove(m_camera->GetMousePosition());
- }
- }
- }
- if(element->IsSelected()) {
- element->Rotate(clockwise);
- element->StartMove(m_camera->GetMousePosition());
- }
- }
+ Element* element = *it;
+ // Parent's element rotating...
+ for(int i = 0; i < (int)element->GetParentList().size(); i++) {
+ Element* parent = element->GetParentList()[i];
+ if(parent) { // Check if parent is not null
+ if(parent->IsSelected()) {
+ element->RotateNode(parent, clockwise);
+ // Update the positions used on motion action, the element will not be necessarily
+ // moved.
+ element->StartMove(m_camera->GetMousePosition());
+ }
+ }
+ }
+ if(element->IsSelected()) {
+ element->Rotate(clockwise);
+ element->StartMove(m_camera->GetMousePosition());
+ }
+ }
Redraw();
}
void Workspace::DeleteSelectedElements()
{
for(auto it = m_elementList.begin(); it != m_elementList.end(); ++it) {
- Element* element = *it;
-
- if(element->IsSelected()) {
- for(auto itp = m_elementList.begin(); itp != m_elementList.end(); ++itp) {
- Element* child = *itp;
- // Parent's element being deleted...
- for(int i = 0; i < (int)child->GetParentList().size(); i++) {
- Element* parent = child->GetParentList()[i];
- if(parent == element) {
- child->RemoveParent(parent);
- }
- }
- }
- m_elementList.erase(it--);
- }
- }
+ Element* element = *it;
+
+ if(element->IsSelected()) {
+ for(auto itp = m_elementList.begin(); itp != m_elementList.end(); ++itp) {
+ Element* child = *itp;
+ // Parent's element being deleted...
+ for(int i = 0; i < (int)child->GetParentList().size(); i++) {
+ Element* parent = child->GetParentList()[i];
+ if(parent == element) {
+ child->RemoveParent(parent);
+ }
+ }
+ }
+ m_elementList.erase(it--);
+ }
+ }
Redraw();
}
void Workspace::Fit()
{
if(m_elementList.size() > 0) {
- wxPoint2DDouble leftUpCorner(0, 0);
- wxPoint2DDouble rightDownCorner(0, 0);
- m_elementList[0]->CalculateBoundaries(leftUpCorner, rightDownCorner);
-
- for(auto it = m_elementList.begin() + 1; it != m_elementList.end(); it++) {
- Element* element = *it;
- wxPoint2DDouble leftUp;
- wxPoint2DDouble rightDown;
- element->CalculateBoundaries(leftUp, rightDown);
- if(leftUp.m_x < leftUpCorner.m_x) leftUpCorner.m_x = leftUp.m_x;
- if(leftUp.m_y < leftUpCorner.m_y) leftUpCorner.m_y = leftUp.m_y;
- if(rightDown.m_x > rightDownCorner.m_x) rightDownCorner.m_x = rightDown.m_x;
- if(rightDown.m_y > rightDownCorner.m_y) rightDownCorner.m_y = rightDown.m_y;
- }
-
- int width = 0.0;
- int height = 0.0;
- GetSize(&width, &height);
-
- double scaleX = double(width) / (rightDownCorner.m_x - leftUpCorner.m_x);
- double scaleY = double(height) / (rightDownCorner.m_y - leftUpCorner.m_y);
-
- double scale = scaleX < scaleY ? scaleX : scaleY;
- if(scale > m_camera->GetZoomMax()) scale = m_camera->GetZoomMax();
- if(scale < m_camera->GetZoomMin()) scale = m_camera->GetZoomMin();
-
- m_camera->SetScale(scale);
-
- m_camera->StartTranslation(leftUpCorner);
- m_camera->SetTranslation(wxPoint2DDouble(0, 0));
- Redraw();
- }
+ wxPoint2DDouble leftUpCorner(0, 0);
+ wxPoint2DDouble rightDownCorner(0, 0);
+ m_elementList[0]->CalculateBoundaries(leftUpCorner, rightDownCorner);
+
+ for(auto it = m_elementList.begin() + 1; it != m_elementList.end(); it++) {
+ Element* element = *it;
+ wxPoint2DDouble leftUp;
+ wxPoint2DDouble rightDown;
+ element->CalculateBoundaries(leftUp, rightDown);
+ if(leftUp.m_x < leftUpCorner.m_x) leftUpCorner.m_x = leftUp.m_x;
+ if(leftUp.m_y < leftUpCorner.m_y) leftUpCorner.m_y = leftUp.m_y;
+ if(rightDown.m_x > rightDownCorner.m_x) rightDownCorner.m_x = rightDown.m_x;
+ if(rightDown.m_y > rightDownCorner.m_y) rightDownCorner.m_y = rightDown.m_y;
+ }
+
+ int width = 0.0;
+ int height = 0.0;
+ GetSize(&width, &height);
+
+ double scaleX = double(width) / (rightDownCorner.m_x - leftUpCorner.m_x);
+ double scaleY = double(height) / (rightDownCorner.m_y - leftUpCorner.m_y);
+
+ double scale = scaleX < scaleY ? scaleX : scaleY;
+ if(scale > m_camera->GetZoomMax()) scale = m_camera->GetZoomMax();
+ if(scale < m_camera->GetZoomMin()) scale = m_camera->GetZoomMin();
+
+ m_camera->SetScale(scale);
+
+ m_camera->StartTranslation(leftUpCorner);
+ m_camera->SetTranslation(wxPoint2DDouble(0, 0));
+ Redraw();
+ }
}
void Workspace::ValidateBusesVoltages(Element* initialBus)
@@ -867,28 +968,29 @@ void Workspace::ValidateBusesVoltages(Element* initialBus)
ElectricalUnit nominalVoltageUnit = ((Bus*)initialBus)->GetEletricalData().nominalVoltageUnit;
for(auto it = m_elementList.begin(); it != m_elementList.end(); it++) {
- Element* child = *it;
-
- if(typeid(*child) == typeid(Line)) {
- if(child->GetParentList()[0] && child->GetParentList()[1]) {
- BusElectricalData data1 = ((Bus*)child->GetParentList()[0])->GetEletricalData();
- BusElectricalData data2 = ((Bus*)child->GetParentList()[1])->GetEletricalData();
-
- if(data1.nominalVoltage != data2.nominalVoltage ||
- data1.nominalVoltageUnit != data2.nominalVoltageUnit) {
- data1.nominalVoltage = nominalVoltage;
- data2.nominalVoltage = nominalVoltage;
- data1.nominalVoltageUnit = nominalVoltageUnit;
- data2.nominalVoltageUnit = nominalVoltageUnit;
-
- ((Bus*)child->GetParentList()[0])->SetElectricalData(data1);
- ((Bus*)child->GetParentList()[1])->SetElectricalData(data2);
-
- it = m_elementList.begin(); // Restart search.
- }
- }
- }
- }
+ Element* child = *it;
+
+ if(typeid(*child) == typeid(Line)) {
+ if(child->GetParentList()[0] && child->GetParentList()[1]) {
+ BusElectricalData data1 = ((Bus*)child->GetParentList()[0])->GetEletricalData();
+ BusElectricalData data2 = ((Bus*)child->GetParentList()[1])->GetEletricalData();
+
+ if(data1.nominalVoltage != data2.nominalVoltage ||
+ data1.nominalVoltageUnit != data2.nominalVoltageUnit)
+ {
+ data1.nominalVoltage = nominalVoltage;
+ data2.nominalVoltage = nominalVoltage;
+ data1.nominalVoltageUnit = nominalVoltageUnit;
+ data2.nominalVoltageUnit = nominalVoltageUnit;
+
+ ((Bus*)child->GetParentList()[0])->SetElectricalData(data1);
+ ((Bus*)child->GetParentList()[1])->SetElectricalData(data2);
+
+ it = m_elementList.begin(); // Restart search.
+ }
+ }
+ }
+ }
// ValidateElementsVoltages();
}
@@ -896,25 +998,29 @@ void Workspace::ValidateBusesVoltages(Element* initialBus)
void Workspace::ValidateElementsVoltages()
{
for(auto it = m_elementList.begin(); it != m_elementList.end(); it++) {
- Element* child = *it;
-
- std::vector<double> nominalVoltage;
- std::vector<ElectricalUnit> nominalVoltageUnit;
- for(int i = 0; i < (int)child->GetParentList().size(); i++) {
- Bus* parent = (Bus*)child->GetParentList()[i];
- if(parent) {
- nominalVoltage.push_back(parent->GetEletricalData().nominalVoltage);
- nominalVoltageUnit.push_back(parent->GetEletricalData().nominalVoltageUnit);
- }
- }
- child->SetNominalVoltage(nominalVoltage, nominalVoltageUnit);
- }
+ Element* child = *it;
+
+ std::vector<double> nominalVoltage;
+ std::vector<ElectricalUnit> nominalVoltageUnit;
+ for(int i = 0; i < (int)child->GetParentList().size(); i++) {
+ Bus* parent = (Bus*)child->GetParentList()[i];
+ if(parent) {
+ nominalVoltage.push_back(parent->GetEletricalData().nominalVoltage);
+ nominalVoltageUnit.push_back(parent->GetEletricalData().nominalVoltageUnit);
+ }
+ }
+ child->SetNominalVoltage(nominalVoltage, nominalVoltageUnit);
+ }
}
bool Workspace::RunPowerFlow()
{
PowerFlow pf(m_elementList);
bool result = pf.RunGaussSeidel();
-
+ if(!result) {
+ wxMessageDialog msgDialog(this, pf.GetErrorMessage(), _("Error"), wxOK | wxCENTRE | wxICON_ERROR);
+ msgDialog.ShowModal();
+ }
+
return result;
}