diff options
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 Binary files differindex c620672..9909efe 100644 --- a/.codelite/PSP.tags +++ b/.codelite/PSP.tags diff --git a/.codelite/compilation.db b/.codelite/compilation.db Binary files differindex bfd859d..5283ccd 100644 --- a/.codelite/compilation.db +++ b/.codelite/compilation.db 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 Binary files differindex 61776db..4697c17 100644 --- a/.codelite/refactoring.db +++ b/.codelite/refactoring.db 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 Binary files differindex cf38604..7d07747 100644 --- a/Project/Release/ElectricCalculation.cpp.o +++ b/Project/Release/ElectricCalculation.cpp.o diff --git a/Project/Release/GeneratorStabForm.cpp.o b/Project/Release/GeneratorStabForm.cpp.o Binary files differindex b38d859..9df90ab 100644 --- a/Project/Release/GeneratorStabForm.cpp.o +++ b/Project/Release/GeneratorStabForm.cpp.o diff --git a/Project/Release/IndMotor.cpp.o b/Project/Release/IndMotor.cpp.o Binary files differindex f4bdf37..912425b 100644 --- a/Project/Release/IndMotor.cpp.o +++ b/Project/Release/IndMotor.cpp.o diff --git a/Project/Release/IndMotorForm.cpp.o b/Project/Release/IndMotorForm.cpp.o Binary files differindex 36b0724..5e81863 100644 --- a/Project/Release/IndMotorForm.cpp.o +++ b/Project/Release/IndMotorForm.cpp.o diff --git a/Project/Release/PSP-UFU.exe b/Project/Release/PSP-UFU.exe Binary files differindex 384d556..d985df0 100644 --- a/Project/Release/PSP-UFU.exe +++ b/Project/Release/PSP-UFU.exe diff --git a/Project/Release/PowerFlow.cpp.o b/Project/Release/PowerFlow.cpp.o Binary files differindex a18c964..a90fde4 100644 --- a/Project/Release/PowerFlow.cpp.o +++ b/Project/Release/PowerFlow.cpp.o 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 Binary files differindex 8d3af19..38e96bb 100644 --- a/Project/Release/SyncGenerator.cpp.o +++ b/Project/Release/SyncGenerator.cpp.o diff --git a/Project/Release/SyncMachineForm.cpp.o b/Project/Release/SyncMachineForm.cpp.o Binary files differindex 928bce0..b5971fd 100644 --- a/Project/Release/SyncMachineForm.cpp.o +++ b/Project/Release/SyncMachineForm.cpp.o diff --git a/Project/Release/SyncMotor.cpp.o b/Project/Release/SyncMotor.cpp.o Binary files differindex 47c24b1..fa5f101 100644 --- a/Project/Release/SyncMotor.cpp.o +++ b/Project/Release/SyncMotor.cpp.o diff --git a/Project/Release/Workspace.cpp.o b/Project/Release/Workspace.cpp.o Binary files differindex 36df97a..3bc5af2 100644 --- a/Project/Release/Workspace.cpp.o +++ b/Project/Release/Workspace.cpp.o 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; } |