diff options
author | Thales Lima Oliveira <thaleslima.ufu@gmail.com> | 2017-09-09 19:11:41 -0300 |
---|---|---|
committer | Thales Lima Oliveira <thaleslima.ufu@gmail.com> | 2017-09-09 19:11:41 -0300 |
commit | 91b9c3f9909955443e74dedb248fc48fa984709b (patch) | |
tree | c1bf65c2bd297d44e258067155292d9798f4c8c9 /Project | |
parent | 9e1f6849c929506a17fa12185c5c0185d5287177 (diff) | |
download | PSP.git-91b9c3f9909955443e74dedb248fc48fa984709b.tar.gz PSP.git-91b9c3f9909955443e74dedb248fc48fa984709b.tar.xz PSP.git-91b9c3f9909955443e74dedb248fc48fa984709b.zip |
Data report fully implemented
Diffstat (limited to 'Project')
-rw-r--r-- | Project/DataReport.cpp | 110 | ||||
-rw-r--r-- | Project/DataReport.h | 33 | ||||
-rw-r--r-- | Project/Fault.cpp | 45 | ||||
-rw-r--r-- | Project/Fault.h | 2 | ||||
-rw-r--r-- | Project/Project.mk | 2 | ||||
-rw-r--r-- | Project/SyncGenerator.cpp | 40 | ||||
-rw-r--r-- | Project/SyncMotor.cpp | 40 | ||||
-rw-r--r-- | Project/Text.cpp | 256 | ||||
-rw-r--r-- | Project/Workspace.cpp | 20 | ||||
-rw-r--r-- | Project/Workspace.h | 1 | ||||
-rw-r--r-- | Project/wxGLString.cpp | 57 |
11 files changed, 341 insertions, 265 deletions
diff --git a/Project/DataReport.cpp b/Project/DataReport.cpp index bcde093..01a1e1d 100644 --- a/Project/DataReport.cpp +++ b/Project/DataReport.cpp @@ -5,17 +5,30 @@ DataReport::DataReport(wxWindow* parent, Workspace* workspace) : DataReportBase(parent) { m_workspace = workspace; + + m_headerColour = wxColour(150, 150, 150); + m_offlineColour = wxColour(100, 100, 100); + m_oddRowColour = wxColour(220, 220, 220); + m_evenRowColour = wxColour(255, 255, 255); + CreateGrids(); SetHeaders(); FillValues(); + SetRowsColours(m_gridPowerFlow); + SetRowsColours(m_gridPFBuses); + SetRowsColours(m_gridPFBranches); + SetRowsColours(m_gridFault, 2); + SetRowsColours(m_gridFaultBuses, 2); + SetRowsColours(m_gridFaultBranches, 2); + SetRowsColours(m_gridFaultGenerators, 2); + Layout(); } DataReport::~DataReport() {} void DataReport::CreateGrids() { - wxColour headerColour(200, 200, 200); wxFont headerFont = m_gridPowerFlow->GetLabelFont(); headerFont.SetWeight(wxFONTWEIGHT_BOLD); @@ -33,7 +46,7 @@ void DataReport::CreateGrids() m_gridPowerFlow->HideColLabels(); m_gridPowerFlow->HideRowLabels(); for(int i = 0; i < 7; ++i) { - m_gridPowerFlow->SetCellBackgroundColour(0, i, headerColour); + m_gridPowerFlow->SetCellBackgroundColour(0, i, m_headerColour); m_gridPowerFlow->SetCellFont(0, i, headerFont); } m_gridPowerFlow->SetDefaultCellAlignment(wxALIGN_CENTRE, wxALIGN_CENTRE); @@ -48,7 +61,7 @@ void DataReport::CreateGrids() m_gridPFBuses->HideColLabels(); m_gridPFBuses->HideRowLabels(); for(int i = 0; i < 6; ++i) { - m_gridPFBuses->SetCellBackgroundColour(0, i, headerColour); + m_gridPFBuses->SetCellBackgroundColour(0, i, m_headerColour); m_gridPFBuses->SetCellFont(0, i, headerFont); } m_gridPFBuses->SetDefaultCellAlignment(wxALIGN_CENTRE, wxALIGN_CENTRE); @@ -63,7 +76,7 @@ void DataReport::CreateGrids() m_gridPFBranches->HideColLabels(); m_gridPFBranches->HideRowLabels(); for(int i = 0; i < 10; ++i) { - m_gridPFBranches->SetCellBackgroundColour(0, i, headerColour); + m_gridPFBranches->SetCellBackgroundColour(0, i, m_headerColour); m_gridPFBranches->SetCellFont(0, i, headerFont); } m_gridPFBranches->SetDefaultCellAlignment(wxALIGN_CENTRE, wxALIGN_CENTRE); @@ -79,7 +92,7 @@ void DataReport::CreateGrids() m_gridFault->HideRowLabels(); for(int i = 0; i < 2; ++i) { for(int j = 0; j < 7; ++j) { - m_gridFault->SetCellBackgroundColour(i, j, headerColour); + m_gridFault->SetCellBackgroundColour(i, j, m_headerColour); m_gridFault->SetCellFont(i, j, headerFont); } } @@ -103,7 +116,7 @@ void DataReport::CreateGrids() m_gridFaultBuses->HideRowLabels(); for(int i = 0; i < 2; ++i) { for(int j = 0; j < 7; ++j) { - m_gridFaultBuses->SetCellBackgroundColour(i, j, headerColour); + m_gridFaultBuses->SetCellBackgroundColour(i, j, m_headerColour); m_gridFaultBuses->SetCellFont(i, j, headerFont); } } @@ -124,7 +137,7 @@ void DataReport::CreateGrids() m_gridFaultBranches->HideRowLabels(); for(int i = 0; i < 2; ++i) { for(int j = 0; j < 11; ++j) { - m_gridFaultBranches->SetCellBackgroundColour(i, j, headerColour); + m_gridFaultBranches->SetCellBackgroundColour(i, j, m_headerColour); m_gridFaultBranches->SetCellFont(i, j, headerFont); } } @@ -149,7 +162,7 @@ void DataReport::CreateGrids() m_gridFaultGenerators->HideRowLabels(); for(int i = 0; i < 2; ++i) { for(int j = 0; j < 7; ++j) { - m_gridFaultGenerators->SetCellBackgroundColour(i, j, headerColour); + m_gridFaultGenerators->SetCellBackgroundColour(i, j, m_headerColour); m_gridFaultGenerators->SetCellFont(i, j, headerFont); } } @@ -299,8 +312,6 @@ void DataReport::SetHeaders() void DataReport::FillValues(GridSelection gridToFill) { - wxColour offlineColour(100, 100, 100); - m_changingValues = true; ElectricCalculation eCalc; eCalc.GetElementsFromList(m_workspace->GetElementList()); @@ -321,6 +332,7 @@ void DataReport::FillValues(GridSelection gridToFill) auto lineList = eCalc.GetLineList(); auto transformerList = eCalc.GetTransformerList(); auto busList = eCalc.GetBusList(); + auto generatorList = eCalc.GetSyncGeneratorList(); // Power Flow if(gridToFill == GRID_ALL || gridToFill == GRID_PF) { @@ -354,7 +366,7 @@ void DataReport::FillValues(GridSelection gridToFill) wxColour textColour = m_gridPowerFlow->GetDefaultCellTextColour(); if(!line->IsOnline()) { isOnline = _("No"); - textColour = offlineColour; + textColour = m_offlineColour; } for(int i = 0; i < 2; ++i) { for(int j = 0; j < 7; ++j) { @@ -403,7 +415,7 @@ void DataReport::FillValues(GridSelection gridToFill) wxColour textColour = m_gridPowerFlow->GetDefaultCellTextColour(); if(!transformer->IsOnline()) { isOnline = _("No"); - textColour = offlineColour; + textColour = m_offlineColour; } for(int i = 0; i < 2; ++i) { for(int j = 0; j < 7; ++j) { @@ -511,7 +523,7 @@ void DataReport::FillValues(GridSelection gridToFill) wxColour textColour = m_gridPFBranches->GetDefaultCellTextColour(); if(!line->IsOnline()) { isOnline = _("No"); - textColour = offlineColour; + textColour = m_offlineColour; } for(int j = 0; j < 10; ++j) { m_gridPFBranches->SetCellTextColour(rowNumber, j, textColour); @@ -562,7 +574,7 @@ void DataReport::FillValues(GridSelection gridToFill) wxColour textColour = m_gridPFBranches->GetDefaultCellTextColour(); if(!transformer->IsOnline()) { isOnline = _("No"); - textColour = offlineColour; + textColour = m_offlineColour; } for(int j = 0; j < 10; ++j) { m_gridPFBranches->SetCellTextColour(rowNumber, j, textColour); @@ -596,7 +608,7 @@ void DataReport::FillValues(GridSelection gridToFill) auto data = bus->GetElectricalData(); if(data.hasFault) { double vb = bus->GetValueFromUnit(data.nominalVoltage, data.nominalVoltageUnit); - double ib = basePower / vb; + double ib = basePower / (std::sqrt(3.0) * vb); m_gridFault->SetCellValue(rowNumber, 0, data.name); @@ -697,7 +709,7 @@ void DataReport::FillValues(GridSelection gridToFill) auto data = line->GetPUElectricalData(basePower); double vb = line->GetValueFromUnit(data.nominalVoltage, data.nominalVoltageUnit); - double ib = basePower / vb; + double ib = basePower / (std::sqrt(3.0) * vb); wxString busName1 = "-"; if(line->GetParentList()[0]) @@ -710,7 +722,7 @@ void DataReport::FillValues(GridSelection gridToFill) wxColour textColour = m_gridFaultBranches->GetDefaultCellTextColour(); if(!line->IsOnline()) { isOnline = _("No"); - textColour = offlineColour; + textColour = m_offlineColour; } for(int i = 0; i < 2; ++i) { for(int j = 0; j < 11; ++j) { @@ -799,9 +811,9 @@ void DataReport::FillValues(GridSelection gridToFill) auto data = transformer->GetPUElectricalData(basePower); double vb = transformer->GetValueFromUnit(data.primaryNominalVoltage, data.primaryNominalVoltageUnit); - double ibp = basePower / vb; + double ibp = basePower / (std::sqrt(3.0) * vb); vb = transformer->GetValueFromUnit(data.secondaryNominalVoltage, data.secondaryNominalVoltageUnit); - double ibs = basePower / vb; + double ibs = basePower / (std::sqrt(3.0) * vb); wxString busName1 = "-"; if(transformer->GetParentList()[0]) @@ -814,7 +826,7 @@ void DataReport::FillValues(GridSelection gridToFill) wxColour textColour = m_gridFaultBranches->GetDefaultCellTextColour(); if(!transformer->IsOnline()) { isOnline = _("No"); - textColour = offlineColour; + textColour = m_offlineColour; } for(int i = 0; i < 2; ++i) { for(int j = 0; j < 11; ++j) { @@ -900,9 +912,67 @@ void DataReport::FillValues(GridSelection gridToFill) m_gridFaultBranches->AutoSize(); } + + // Fault generators + if(gridToFill == GRID_ALL || gridToFill == GRID_FAULTGENERATORS) { + rowNumber = 2; + for(auto it = generatorList.begin(), itEnd = generatorList.end(); it != itEnd; ++it) { + SyncGenerator* generator = *it; + auto data = generator->GetPUElectricalData(basePower); + double vb = generator->GetValueFromUnit(data.nominalVoltage, data.nominalVoltageUnit); + double ib = basePower / (std::sqrt(3.0) * vb); + + m_gridFaultGenerators->SetCellValue(rowNumber, 0, data.name); + + double kCurrent = 1.0; + if(m_gridFaultGenerators->GetCellValue(1, 1) == m_currentChoices[1]) + kCurrent = ib; + else if(m_gridFaultGenerators->GetCellValue(1, 1) == m_currentChoices[2]) + kCurrent = ib / 1e3; + m_gridFaultGenerators->SetCellValue(rowNumber, 1, + generator->StringFromDouble(std::abs(data.faultCurrent[0]) * kCurrent)); + m_gridFaultGenerators->SetCellValue( + rowNumber, 2, generator->StringFromDouble(wxRadToDeg(std::arg(data.faultCurrent[0])))); + + kCurrent = 1.0; + if(m_gridFaultGenerators->GetCellValue(1, 3) == m_currentChoices[1]) + kCurrent = ib; + else if(m_gridFaultGenerators->GetCellValue(1, 3) == m_currentChoices[2]) + kCurrent = ib / 1e3; + m_gridFaultGenerators->SetCellValue(rowNumber, 3, + generator->StringFromDouble(std::abs(data.faultCurrent[1]) * kCurrent)); + m_gridFaultGenerators->SetCellValue( + rowNumber, 4, generator->StringFromDouble(wxRadToDeg(std::arg(data.faultCurrent[1])))); + + kCurrent = 1.0; + if(m_gridFaultGenerators->GetCellValue(1, 5) == m_currentChoices[1]) + kCurrent = ib; + else if(m_gridFaultGenerators->GetCellValue(1, 5) == m_currentChoices[2]) + kCurrent = ib / 1e3; + m_gridFaultGenerators->SetCellValue(rowNumber, 5, + generator->StringFromDouble(std::abs(data.faultCurrent[2]) * kCurrent)); + m_gridFaultGenerators->SetCellValue( + rowNumber, 6, generator->StringFromDouble(wxRadToDeg(std::arg(data.faultCurrent[2])))); + + rowNumber++; + } + m_gridFaultGenerators->AutoSize(); + } m_changingValues = false; } +void DataReport::SetRowsColours(wxGrid* grid, int rowStart) +{ + for(int i = rowStart; i < grid->GetNumberRows(); ++i) { + wxGridCellAttr* attr = grid->GetOrCreateCellAttr(i, 0); + if((i - rowStart) % 2 == 0) + attr->SetBackgroundColour(m_evenRowColour); + else + attr->SetBackgroundColour(m_oddRowColour); + grid->SetRowAttr(i, attr); + } +} + void DataReport::OnPFBusGridChanged(wxGridEvent& event) { if(!m_changingValues) FillValues(GRID_PFBUSES); diff --git a/Project/DataReport.h b/Project/DataReport.h index 61a7ccf..f262cb9 100644 --- a/Project/DataReport.h +++ b/Project/DataReport.h @@ -8,24 +8,25 @@ class ElectricCalculation; class DataReport : public DataReportBase { -public: - enum GridSelection { - GRID_ALL = 0, - GRID_PF, - GRID_PFBUSES, - GRID_PFBRANCHES, - GRID_FAULT, - GRID_FAULTBUSES, - GRID_FAULTBRANCHES, - GRID_FAULTGENERATORS, - }; - + public: + enum GridSelection { + GRID_ALL = 0, + GRID_PF, + GRID_PFBUSES, + GRID_PFBRANCHES, + GRID_FAULT, + GRID_FAULTBUSES, + GRID_FAULTBRANCHES, + GRID_FAULTGENERATORS, + }; + DataReport(wxWindow* parent, Workspace* workspace); virtual ~DataReport(); virtual void SetHeaders(); virtual void CreateGrids(); virtual void FillValues(GridSelection gridToFill = GRID_ALL); + virtual void SetRowsColours(wxGrid* grid, int rowStart = 1); protected: virtual void OnFaulrGridChanged(wxGridEvent& event); @@ -37,7 +38,7 @@ public: virtual void OnPFBusGridChanged(wxGridEvent& event); Workspace* m_workspace = NULL; bool m_changingValues = false; - + // Headers choices wxArrayString m_voltageChoices; wxArrayString m_activePowerChoices; @@ -46,5 +47,11 @@ public: wxArrayString m_indReactanceChoices; wxArrayString m_capSusceptanceChoices; wxArrayString m_currentChoices; + + // Colors + wxColour m_headerColour; + wxColour m_offlineColour; + wxColour m_oddRowColour; + wxColour m_evenRowColour; }; #endif // DATAREPORT_H diff --git a/Project/Fault.cpp b/Project/Fault.cpp index d39e649..40b03d7 100644 --- a/Project/Fault.cpp +++ b/Project/Fault.cpp @@ -8,6 +8,7 @@ Fault::Fault(std::vector<Element*> elementList) { GetElementsFromList(elementLis Fault::~Fault() {} bool Fault::RunFaultCalculation(double systemPowerBase) { + m_systemPowerBase = systemPowerBase; int numberOfBuses = static_cast<int>(m_busList.size()); if(numberOfBuses == 0) { m_errorMsg = _("There is no buses in the system."); @@ -199,13 +200,14 @@ void Fault::UpdateElementsFault(double systemPowerBase) int n1 = static_cast<Bus*>(line->GetParentList()[0])->GetElectricalData().number; int n2 = static_cast<Bus*>(line->GetParentList()[1])->GetElectricalData().number; auto data = line->GetElectricalData(); + auto puData = line->GetPUElectricalData(m_systemPowerBase); std::complex<double> vPos[2] = {m_posFaultVoltagePos[n1], m_posFaultVoltagePos[n2]}; std::complex<double> vNeg[2] = {m_posFaultVoltageNeg[n1], m_posFaultVoltageNeg[n2]}; std::complex<double> vZero[2] = {m_posFaultVoltageZero[n1], m_posFaultVoltageZero[n2]}; - std::complex<double> zPos(data.resistance, data.indReactance); - std::complex<double> bPos(0.0, data.capSusceptance / 2.0); - std::complex<double> zZero(data.zeroResistance, data.zeroIndReactance); - std::complex<double> bZero(0.0, data.zeroCapSusceptance / 2.0); + std::complex<double> zPos(puData.resistance, puData.indReactance); + std::complex<double> bPos(0.0, puData.capSusceptance / 2.0); + std::complex<double> zZero(puData.zeroResistance, puData.zeroIndReactance); + std::complex<double> bZero(0.0, puData.zeroCapSusceptance / 2.0); std::complex<double> lineCurrentPos[2]; std::complex<double> lineCurrentNeg[2]; @@ -235,12 +237,13 @@ void Fault::UpdateElementsFault(double systemPowerBase) int n1 = static_cast<Bus*>(transformer->GetParentList()[0])->GetElectricalData().number; int n2 = static_cast<Bus*>(transformer->GetParentList()[1])->GetElectricalData().number; auto data = transformer->GetElectricalData(); + auto puData = transformer->GetPUElectricalData(m_systemPowerBase); std::complex<double> vPos[2] = {m_posFaultVoltagePos[n1], m_posFaultVoltagePos[n2]}; std::complex<double> vNeg[2] = {m_posFaultVoltageNeg[n1], m_posFaultVoltageNeg[n2]}; std::complex<double> vZero[2] = {m_posFaultVoltageZero[n1], m_posFaultVoltageZero[n2]}; - std::complex<double> zPos(data.resistance, data.indReactance); - std::complex<double> zZero(data.zeroResistance, data.zeroIndReactance); + std::complex<double> zPos(puData.resistance, puData.indReactance); + std::complex<double> zZero(puData.zeroResistance, puData.zeroIndReactance); std::complex<double> transformerCurrentPos[2]; std::complex<double> transformerCurrentNeg[2]; @@ -312,26 +315,31 @@ void Fault::UpdateElementsFault(double systemPowerBase) int n = bus->GetElectricalData().number; std::complex<double> v = bus->GetElectricalData().voltage; // Pre-fault voltage. auto data = syncGenerator->GetElectricalData(); + auto puData = syncGenerator->GetPUElectricalData(m_systemPowerBase); std::complex<double> vPos = m_posFaultVoltagePos[n]; std::complex<double> vNeg = m_posFaultVoltageNeg[n]; std::complex<double> vZero = m_posFaultVoltageZero[n]; - std::complex<double> zPos(data.positiveResistance, data.positiveReactance); - std::complex<double> zNeg(data.negativeResistance, data.negativeReactance); - std::complex<double> zZero(data.zeroResistance + 3.0 * data.groundResistance, - data.negativeReactance + 3.0 * data.groundReactance); + std::complex<double> zPos(puData.positiveResistance, puData.positiveReactance); + std::complex<double> zNeg(puData.negativeResistance, puData.negativeReactance); + std::complex<double> zZero(puData.zeroResistance + 3.0 * puData.groundResistance, + puData.zeroReactance + 3.0 * puData.groundReactance); - std::complex<double> syncGeneratorCurrentPos = (v - vPos) / zPos; + // Internal voltage + std::complex<double> i = std::complex<double>(puData.activePower, -puData.reactivePower) / std::conj(v); + std::complex<double> e = v + zPos * i; + + std::complex<double> syncGeneratorCurrentPos = (e - vPos) / zPos; std::complex<double> syncGeneratorCurrentNeg = (-vNeg) / zNeg; std::complex<double> syncGeneratorCurrentZero(0.0, 0.0); if(data.groundNeutral) syncGeneratorCurrentZero = (-vZero) / zZero; - data.faultCurrent[0] = syncGeneratorCurrentPos + syncGeneratorCurrentNeg + syncGeneratorCurrentZero; + data.faultCurrent[0] = syncGeneratorCurrentZero + syncGeneratorCurrentPos + syncGeneratorCurrentNeg; data.faultCurrent[1] = - syncGeneratorCurrentPos + a2 * syncGeneratorCurrentNeg + a * syncGeneratorCurrentZero; + syncGeneratorCurrentZero + a2 * syncGeneratorCurrentPos + a * syncGeneratorCurrentNeg; data.faultCurrent[2] = - syncGeneratorCurrentPos + a * syncGeneratorCurrentNeg + a2 * syncGeneratorCurrentZero; + syncGeneratorCurrentZero + a * syncGeneratorCurrentPos + a2 * syncGeneratorCurrentNeg; syncGenerator->SetElectricalData(data); } @@ -344,15 +352,16 @@ void Fault::UpdateElementsFault(double systemPowerBase) int n = bus->GetElectricalData().number; std::complex<double> v = bus->GetElectricalData().voltage; // Pre-fault voltage. auto data = syncMotor->GetElectricalData(); + auto puData = syncMotor->GetPUElectricalData(m_systemPowerBase); std::complex<double> vPos = m_posFaultVoltagePos[n]; std::complex<double> vNeg = m_posFaultVoltageNeg[n]; std::complex<double> vZero = m_posFaultVoltageZero[n]; - std::complex<double> zPos(data.positiveResistance, data.positiveReactance); - std::complex<double> zNeg(data.negativeResistance, data.negativeReactance); - std::complex<double> zZero(data.zeroResistance + 3.0 * data.groundResistance, - data.negativeReactance + 3.0 * data.groundReactance); + std::complex<double> zPos(puData.positiveResistance, puData.positiveReactance); + std::complex<double> zNeg(puData.negativeResistance, puData.negativeReactance); + std::complex<double> zZero(puData.zeroResistance + 3.0 * puData.groundResistance, + puData.zeroReactance + 3.0 * puData.groundReactance); std::complex<double> syncGeneratorCurrentPos = (v - vPos) / zPos; std::complex<double> syncGeneratorCurrentNeg = (-vNeg) / zNeg; diff --git a/Project/Fault.h b/Project/Fault.h index c72c3f4..ea68997 100644 --- a/Project/Fault.h +++ b/Project/Fault.h @@ -55,6 +55,8 @@ public: protected: wxString m_errorMsg = ""; + + double m_systemPowerBase; std::vector<std::vector<std::complex<double> > > m_zBusPos; std::vector<std::vector<std::complex<double> > > m_zBusNeg; diff --git a/Project/Project.mk b/Project/Project.mk index b38528a..0a04284 100644 --- a/Project/Project.mk +++ b/Project/Project.mk @@ -13,7 +13,7 @@ CurrentFileName := CurrentFilePath := CurrentFileFullPath := User :=NDSE-69 -Date :=08/09/2017 +Date :=09/09/2017 CodeLitePath :="C:/Program Files/CodeLite" LinkerName :=C:/TDM-GCC-64/bin/g++.exe SharedObjectLinkerName :=C:/TDM-GCC-64/bin/g++.exe -shared -fPIC diff --git a/Project/SyncGenerator.cpp b/Project/SyncGenerator.cpp index 5718090..709e456 100644 --- a/Project/SyncGenerator.cpp +++ b/Project/SyncGenerator.cpp @@ -107,35 +107,21 @@ SyncGeneratorElectricalData SyncGenerator::GetPUElectricalData(double systemPowe double machineBaseImpedance = (baseVoltage * baseVoltage) / machineBasePower; // Fault data + if(data.useMachineBase) { + data.positiveResistance = (data.positiveResistance * machineBaseImpedance) / systemBaseImpedance; + data.positiveReactance = (data.positiveReactance * machineBaseImpedance) / systemBaseImpedance; + data.negativeResistance = (data.negativeResistance * machineBaseImpedance) / systemBaseImpedance; + data.negativeReactance = (data.negativeReactance * machineBaseImpedance) / systemBaseImpedance; + data.zeroResistance = (data.zeroResistance * machineBaseImpedance) / systemBaseImpedance; + data.zeroReactance = (data.zeroReactance * machineBaseImpedance) / systemBaseImpedance; + data.groundResistance = (data.groundResistance * machineBaseImpedance) / systemBaseImpedance; + data.groundReactance = (data.groundReactance * machineBaseImpedance) / systemBaseImpedance; + } - // Pos. seq. resistance - double r1 = data.positiveResistance; - if(data.useMachineBase) data.positiveResistance = (r1 * machineBaseImpedance) / systemBaseImpedance; - - // Pos. seq. reactance - double x1 = data.positiveReactance; - if(data.useMachineBase) data.positiveReactance = (x1 * machineBaseImpedance) / systemBaseImpedance; - - // Neg. seq. resistance - double r2 = data.negativeResistance; - if(data.useMachineBase) data.negativeResistance = (r2 * machineBaseImpedance) / systemBaseImpedance; - - // Neg. seq. reactance - double x2 = data.negativeReactance; - if(data.useMachineBase) data.negativeReactance = (x2 * machineBaseImpedance) / systemBaseImpedance; - - // Zero seq. resistance - double r0 = data.zeroResistance; - if(data.useMachineBase) data.zeroResistance = (r0 * machineBaseImpedance) / systemBaseImpedance; - - // Zero seq. reactance - double x0 = data.zeroReactance; - if(data.useMachineBase) data.zeroReactance = (x0 * machineBaseImpedance) / systemBaseImpedance; - if(!m_online) { - data.faultCurrent[0] = std::complex<double>(0,0); - data.faultCurrent[1] = std::complex<double>(0,0); - data.faultCurrent[2] = std::complex<double>(0,0); + data.faultCurrent[0] = std::complex<double>(0, 0); + data.faultCurrent[1] = std::complex<double>(0, 0); + data.faultCurrent[2] = std::complex<double>(0, 0); } return data; diff --git a/Project/SyncMotor.cpp b/Project/SyncMotor.cpp index c4a61d8..fb24bac 100644 --- a/Project/SyncMotor.cpp +++ b/Project/SyncMotor.cpp @@ -77,35 +77,21 @@ SyncMotorElectricalData SyncMotor::GetPUElectricalData(double systemPowerBase) double machineBaseImpedance = (baseVoltage * baseVoltage) / machineBasePower; // Fault data + if(data.useMachineBase) { + data.positiveResistance = (data.positiveResistance * machineBaseImpedance) / systemBaseImpedance; + data.positiveReactance = (data.positiveReactance * machineBaseImpedance) / systemBaseImpedance; + data.negativeResistance = (data.negativeResistance * machineBaseImpedance) / systemBaseImpedance; + data.negativeReactance = (data.negativeReactance * machineBaseImpedance) / systemBaseImpedance; + data.zeroResistance = (data.zeroResistance * machineBaseImpedance) / systemBaseImpedance; + data.zeroReactance = (data.zeroReactance * machineBaseImpedance) / systemBaseImpedance; + data.groundResistance = (data.groundResistance * machineBaseImpedance) / systemBaseImpedance; + data.groundReactance = (data.groundReactance * machineBaseImpedance) / systemBaseImpedance; + } - // Pos. seq. resistance - double r1 = data.positiveResistance; - if(data.useMachineBase) data.positiveResistance = (r1 * machineBaseImpedance) / systemBaseImpedance; - - // Pos. seq. reactance - double x1 = data.positiveReactance; - if(data.useMachineBase) data.positiveReactance = (x1 * machineBaseImpedance) / systemBaseImpedance; - - // Neg. seq. resistance - double r2 = data.negativeResistance; - if(data.useMachineBase) data.negativeResistance = (r2 * machineBaseImpedance) / systemBaseImpedance; - - // Neg. seq. reactance - double x2 = data.negativeReactance; - if(data.useMachineBase) data.negativeReactance = (x2 * machineBaseImpedance) / systemBaseImpedance; - - // Zero seq. resistance - double r0 = data.zeroResistance; - if(data.useMachineBase) data.zeroResistance = (r0 * machineBaseImpedance) / systemBaseImpedance; - - // Zero seq. reactance - double x0 = data.zeroReactance; - if(data.useMachineBase) data.zeroReactance = (x0 * machineBaseImpedance) / systemBaseImpedance; - if(!m_online) { - data.faultCurrent[0] = std::complex<double>(0,0); - data.faultCurrent[1] = std::complex<double>(0,0); - data.faultCurrent[2] = std::complex<double>(0,0); + data.faultCurrent[0] = std::complex<double>(0, 0); + data.faultCurrent[1] = std::complex<double>(0, 0); + data.faultCurrent[2] = std::complex<double>(0, 0); } return data; diff --git a/Project/Text.cpp b/Project/Text.cpp index 51cdce9..aa36aef 100644 --- a/Project/Text.cpp +++ b/Project/Text.cpp @@ -15,13 +15,8 @@ #include "Inductor.h" #include "Capacitor.h" -Text::Text() - : GraphicalElement() -{ - SetText(m_text); -} -Text::Text(wxPoint2DDouble position) - : GraphicalElement() +Text::Text() : GraphicalElement() { SetText(m_text); } +Text::Text(wxPoint2DDouble position) : GraphicalElement() { m_position = position; SetText(m_text); @@ -53,23 +48,23 @@ void Text::Draw(wxPoint2DDouble translation, double scale) if(m_selected) { glColor4d(0.0, 0.5, 1.0, 0.5); - DrawRectangle( - m_position + wxPoint2DDouble(m_borderSize / 2.0, m_borderSize / 2.0), m_rect.m_width, m_rect.m_height); + DrawRectangle(m_position + wxPoint2DDouble(m_borderSize / 2.0, m_borderSize / 2.0), m_rect.m_width, + m_rect.m_height); } // Draw text (layer 2) glEnable(GL_TEXTURE_2D); glColor4d(0.0, 0.0, 0.0, 1.0); - if(!m_isMultlineText) { // Only one line + if(!m_isMultlineText) { // Only one line m_glString->bind(); m_glString->render(m_position.m_x, m_position.m_y); - } else { // Multiples lines + } else { // Multiples lines m_glStringArray->bind(); // The text will be printed centralized. double lineHeight = m_height / (double)m_numberOfLines; for(int i = 0; i < m_numberOfLines; i++) { - m_glStringArray->get(i).render( - m_position.m_x, m_position.m_y - m_height / 2.0 + lineHeight / 2.0 + lineHeight * double(i)); + m_glStringArray->get(i) + .render(m_position.m_x, m_position.m_y - m_height / 2.0 + lineHeight / 2.0 + lineHeight * double(i)); } } glDisable(GL_TEXTURE_2D); @@ -90,17 +85,26 @@ void Text::SetText(wxString text) wxFont font(m_fontSize, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL); wxScreenDC dc; + GLuint* idString = NULL; + GLuint* idStringArray = NULL; + if(m_glString) { delete m_glString; m_glString = NULL; + + idString = new GLuint; + glGenTextures(1, idString); } if(m_glStringArray) { delete m_glStringArray; m_glStringArray = NULL; + + idStringArray = new GLuint; + glGenTextures(1, idStringArray); } m_numberOfLines = m_text.Freq('\n') + 1; - if(m_numberOfLines == 1) { // Only one line + if(m_numberOfLines == 1) { // Only one line m_isMultlineText = false; m_glString = new wxGLString(m_text); m_glString->setFont(font); @@ -130,6 +134,9 @@ void Text::SetText(wxString text) m_glStringArray->consolidate(&dc); } + if(idString) glDeleteTextures(1, idString); + if(idStringArray) glDeleteTextures(1, idStringArray); + // Update text rectangle. SetPosition(m_position); glDisable(GL_TEXTURE_2D); @@ -203,8 +210,8 @@ void Text::UpdateText(double systemPowerBase) } } break; case DATA_SC_CURRENT: { - double faultCurrent[3] = { std::abs(data.faultCurrent[0]), std::abs(data.faultCurrent[1]), - std::abs(data.faultCurrent[2]) }; + double faultCurrent[3] = {std::abs(data.faultCurrent[0]), std::abs(data.faultCurrent[1]), + std::abs(data.faultCurrent[2])}; switch(m_unit) { case UNIT_PU: { wxString str = @@ -215,20 +222,24 @@ void Text::UpdateText(double systemPowerBase) } break; case UNIT_A: { wxString str = "Ia = " + - wxString::FromDouble(faultCurrent[0] * baseCurrent, m_decimalPlaces) + " A"; + wxString::FromDouble(faultCurrent[0] * baseCurrent, m_decimalPlaces) + + " A"; str += "\nIb = " + - wxString::FromDouble(faultCurrent[1] * baseCurrent, m_decimalPlaces) + " A"; + wxString::FromDouble(faultCurrent[1] * baseCurrent, m_decimalPlaces) + " A"; str += "\nIc = " + - wxString::FromDouble(faultCurrent[2] * baseCurrent, m_decimalPlaces) + " A"; + wxString::FromDouble(faultCurrent[2] * baseCurrent, m_decimalPlaces) + " A"; SetText(str); } break; case UNIT_kA: { - wxString str = "Ia = " + + wxString str = + "Ia = " + wxString::FromDouble(faultCurrent[0] * baseCurrent / 1e3, m_decimalPlaces) + " kA"; str += "\nIb = " + - wxString::FromDouble(faultCurrent[1] * baseCurrent / 1e3, m_decimalPlaces) + " kA"; + wxString::FromDouble(faultCurrent[1] * baseCurrent / 1e3, m_decimalPlaces) + + " kA"; str += "\nIc = " + - wxString::FromDouble(faultCurrent[2] * baseCurrent / 1e3, m_decimalPlaces) + " kA"; + wxString::FromDouble(faultCurrent[2] * baseCurrent / 1e3, m_decimalPlaces) + + " kA"; SetText(str); } break; default: @@ -236,8 +247,8 @@ void Text::UpdateText(double systemPowerBase) } } break; case DATA_SC_VOLTAGE: { - double faultVoltage[3] = { std::abs(data.faultVoltage[0]), std::abs(data.faultVoltage[1]), - std::abs(data.faultVoltage[2]) }; + double faultVoltage[3] = {std::abs(data.faultVoltage[0]), std::abs(data.faultVoltage[1]), + std::abs(data.faultVoltage[2])}; switch(m_unit) { case UNIT_PU: { wxString str = @@ -248,20 +259,24 @@ void Text::UpdateText(double systemPowerBase) } break; case UNIT_V: { wxString str = "Va = " + - wxString::FromDouble(faultVoltage[0] * baseVoltage, m_decimalPlaces) + " V"; + wxString::FromDouble(faultVoltage[0] * baseVoltage, m_decimalPlaces) + + " V"; str += "\nVb = " + - wxString::FromDouble(faultVoltage[1] * baseVoltage, m_decimalPlaces) + " V"; + wxString::FromDouble(faultVoltage[1] * baseVoltage, m_decimalPlaces) + " V"; str += "\nVc = " + - wxString::FromDouble(faultVoltage[2] * baseVoltage, m_decimalPlaces) + " V"; + wxString::FromDouble(faultVoltage[2] * baseVoltage, m_decimalPlaces) + " V"; SetText(str); } break; case UNIT_kV: { - wxString str = "Va = " + + wxString str = + "Va = " + wxString::FromDouble(faultVoltage[0] * baseVoltage / 1e3, m_decimalPlaces) + " kV"; str += "\nVb = " + - wxString::FromDouble(faultVoltage[1] * baseVoltage / 1e3, m_decimalPlaces) + " kV"; + wxString::FromDouble(faultVoltage[1] * baseVoltage / 1e3, m_decimalPlaces) + + " kV"; str += "\nVc = " + - wxString::FromDouble(faultVoltage[2] * baseVoltage / 1e3, m_decimalPlaces) + " kV"; + wxString::FromDouble(faultVoltage[2] * baseVoltage / 1e3, m_decimalPlaces) + + " kV"; SetText(str); } break; default: @@ -278,11 +293,11 @@ void Text::UpdateText(double systemPowerBase) } break; case UNIT_kVA: { SetText(wxString::FromDouble(data.scPower * systemPowerBase / 1e3, m_decimalPlaces) + - " kVA"); + " kVA"); } break; case UNIT_MVA: { SetText(wxString::FromDouble(data.scPower * systemPowerBase / 1e6, m_decimalPlaces) + - " MVA"); + " MVA"); } break; default: break; @@ -297,8 +312,7 @@ void Text::UpdateText(double systemPowerBase) SyncGenerator* syncGenerator = static_cast<SyncGenerator*>(m_element); if(syncGenerator) { SyncGeneratorElectricalData data = syncGenerator->GetPUElectricalData(systemPowerBase); - double baseVoltage = data.nominalVoltage; - if(data.nominalVoltageUnit == UNIT_kV) baseVoltage *= 1e3; + double baseVoltage = syncGenerator->GetValueFromUnit(data.nominalVoltage, data.nominalVoltageUnit); double baseCurrent = systemPowerBase / (std::sqrt(3.0) * baseVoltage); switch(m_dataType) { case DATA_NAME: { @@ -315,12 +329,12 @@ void Text::UpdateText(double systemPowerBase) SetText(wxString::FromDouble(activePower * systemPowerBase, m_decimalPlaces) + " W"); } break; case UNIT_kW: { - SetText( - wxString::FromDouble(activePower * systemPowerBase / 1e3, m_decimalPlaces) + " kW"); + SetText(wxString::FromDouble(activePower * systemPowerBase / 1e3, m_decimalPlaces) + + " kW"); } break; case UNIT_MW: { - SetText( - wxString::FromDouble(activePower * systemPowerBase / 1e6, m_decimalPlaces) + " MW"); + SetText(wxString::FromDouble(activePower * systemPowerBase / 1e6, m_decimalPlaces) + + " MW"); } break; default: break; @@ -334,25 +348,24 @@ void Text::UpdateText(double systemPowerBase) SetText(wxString::FromDouble(reactivePower, m_decimalPlaces) + " p.u."); } break; case UNIT_VAr: { - SetText( - wxString::FromDouble(reactivePower * systemPowerBase, m_decimalPlaces) + " VAr"); + SetText(wxString::FromDouble(reactivePower * systemPowerBase, m_decimalPlaces) + + " VAr"); } break; case UNIT_kVAr: { SetText(wxString::FromDouble(reactivePower * systemPowerBase / 1e3, m_decimalPlaces) + - " kVAr"); + " kVAr"); } break; case UNIT_MVAr: { SetText(wxString::FromDouble(reactivePower * systemPowerBase / 1e6, m_decimalPlaces) + - " MVAr"); + " MVAr"); } break; default: break; } } break; case DATA_SC_CURRENT: { - double faultCurrent[3] = { std::abs(data.faultCurrent[0]), std::abs(data.faultCurrent[1]), - std::abs(data.faultCurrent[2]) }; - if(!syncGenerator->IsOnline()) faultCurrent[0] = faultCurrent[1] = faultCurrent[2] = 0.0; + double faultCurrent[3] = {std::abs(data.faultCurrent[0]), std::abs(data.faultCurrent[1]), + std::abs(data.faultCurrent[2])}; switch(m_unit) { case UNIT_PU: { wxString str = @@ -363,20 +376,24 @@ void Text::UpdateText(double systemPowerBase) } break; case UNIT_A: { wxString str = "Ia = " + - wxString::FromDouble(faultCurrent[0] * baseCurrent, m_decimalPlaces) + " A"; + wxString::FromDouble(faultCurrent[0] * baseCurrent, m_decimalPlaces) + + " A"; str += "\nIb = " + - wxString::FromDouble(faultCurrent[1] * baseCurrent, m_decimalPlaces) + " A"; + wxString::FromDouble(faultCurrent[1] * baseCurrent, m_decimalPlaces) + " A"; str += "\nIc = " + - wxString::FromDouble(faultCurrent[2] * baseCurrent, m_decimalPlaces) + " A"; + wxString::FromDouble(faultCurrent[2] * baseCurrent, m_decimalPlaces) + " A"; SetText(str); } break; case UNIT_kA: { - wxString str = "Ia = " + + wxString str = + "Ia = " + wxString::FromDouble(faultCurrent[0] * baseCurrent / 1e3, m_decimalPlaces) + " kA"; str += "\nIb = " + - wxString::FromDouble(faultCurrent[1] * baseCurrent / 1e3, m_decimalPlaces) + " kA"; + wxString::FromDouble(faultCurrent[1] * baseCurrent / 1e3, m_decimalPlaces) + + " kA"; str += "\nIc = " + - wxString::FromDouble(faultCurrent[2] * baseCurrent / 1e3, m_decimalPlaces) + " kA"; + wxString::FromDouble(faultCurrent[2] * baseCurrent / 1e3, m_decimalPlaces) + + " kA"; SetText(str); } break; default: @@ -410,12 +427,12 @@ void Text::UpdateText(double systemPowerBase) SetText(wxString::FromDouble(activePF * systemPowerBase, m_decimalPlaces) + " W"); } break; case UNIT_kW: { - SetText( - wxString::FromDouble(activePF * systemPowerBase / 1e3, m_decimalPlaces) + " kW"); + SetText(wxString::FromDouble(activePF * systemPowerBase / 1e3, m_decimalPlaces) + + " kW"); } break; case UNIT_MW: { - SetText( - wxString::FromDouble(activePF * systemPowerBase / 1e6, m_decimalPlaces) + " MW"); + SetText(wxString::FromDouble(activePF * systemPowerBase / 1e6, m_decimalPlaces) + + " MW"); } break; default: break; @@ -433,11 +450,11 @@ void Text::UpdateText(double systemPowerBase) } break; case UNIT_kVAr: { SetText(wxString::FromDouble(reactivePF * systemPowerBase / 1e3, m_decimalPlaces) + - " kVAr"); + " kVAr"); } break; case UNIT_MVAr: { SetText(wxString::FromDouble(reactivePF * systemPowerBase / 1e6, m_decimalPlaces) + - " MVAr"); + " MVAr"); } break; default: break; @@ -481,8 +498,9 @@ void Text::UpdateText(double systemPowerBase) } } break; case DATA_SC_CURRENT: { - double faultCurrent[3] = { std::abs(data.faultCurrent[m_direction][0]), - std::abs(data.faultCurrent[m_direction][1]), std::abs(data.faultCurrent[m_direction][2]) }; + double faultCurrent[3] = {std::abs(data.faultCurrent[m_direction][0]), + std::abs(data.faultCurrent[m_direction][1]), + std::abs(data.faultCurrent[m_direction][2])}; if(!line->IsOnline()) faultCurrent[0] = faultCurrent[1] = faultCurrent[2] = 0.0; switch(m_unit) { case UNIT_PU: { @@ -494,20 +512,24 @@ void Text::UpdateText(double systemPowerBase) } break; case UNIT_A: { wxString str = "Ia = " + - wxString::FromDouble(faultCurrent[0] * baseCurrent, m_decimalPlaces) + " A"; + wxString::FromDouble(faultCurrent[0] * baseCurrent, m_decimalPlaces) + + " A"; str += "\nIb = " + - wxString::FromDouble(faultCurrent[1] * baseCurrent, m_decimalPlaces) + " A"; + wxString::FromDouble(faultCurrent[1] * baseCurrent, m_decimalPlaces) + " A"; str += "\nIc = " + - wxString::FromDouble(faultCurrent[2] * baseCurrent, m_decimalPlaces) + " A"; + wxString::FromDouble(faultCurrent[2] * baseCurrent, m_decimalPlaces) + " A"; SetText(str); } break; case UNIT_kA: { - wxString str = "Ia = " + + wxString str = + "Ia = " + wxString::FromDouble(faultCurrent[0] * baseCurrent / 1e3, m_decimalPlaces) + " kA"; str += "\nIb = " + - wxString::FromDouble(faultCurrent[1] * baseCurrent / 1e3, m_decimalPlaces) + " kA"; + wxString::FromDouble(faultCurrent[1] * baseCurrent / 1e3, m_decimalPlaces) + + " kA"; str += "\nIc = " + - wxString::FromDouble(faultCurrent[2] * baseCurrent / 1e3, m_decimalPlaces) + " kA"; + wxString::FromDouble(faultCurrent[2] * baseCurrent / 1e3, m_decimalPlaces) + + " kA"; SetText(str); } break; default: @@ -523,13 +545,13 @@ void Text::UpdateText(double systemPowerBase) Transformer* transformer = static_cast<Transformer*>(m_element); if(transformer) { TransformerElectricalData data = transformer->GetElectricalData(); - double baseVoltage[2] = { data.primaryNominalVoltage, data.secondaryNominalVoltage }; + double baseVoltage[2] = {data.primaryNominalVoltage, data.secondaryNominalVoltage}; if(data.primaryNominalVoltageUnit == UNIT_kV) baseVoltage[0] *= 1e3; if(data.secondaryNominalVoltageUnit == UNIT_kV) baseVoltage[1] *= 1e3; - double baseCurrent[2] = { systemPowerBase / (std::sqrt(3.0) * baseVoltage[0]), - systemPowerBase / (std::sqrt(3.0) * baseVoltage[1]) }; + double baseCurrent[2] = {systemPowerBase / (std::sqrt(3.0) * baseVoltage[0]), + systemPowerBase / (std::sqrt(3.0) * baseVoltage[1])}; switch(m_dataType) { case DATA_NAME: { SetText(data.name); @@ -545,12 +567,12 @@ void Text::UpdateText(double systemPowerBase) SetText(wxString::FromDouble(activePF * systemPowerBase, m_decimalPlaces) + " W"); } break; case UNIT_kW: { - SetText( - wxString::FromDouble(activePF * systemPowerBase / 1e3, m_decimalPlaces) + " kW"); + SetText(wxString::FromDouble(activePF * systemPowerBase / 1e3, m_decimalPlaces) + + " kW"); } break; case UNIT_MW: { - SetText( - wxString::FromDouble(activePF * systemPowerBase / 1e6, m_decimalPlaces) + " MW"); + SetText(wxString::FromDouble(activePF * systemPowerBase / 1e6, m_decimalPlaces) + + " MW"); } break; default: break; @@ -568,11 +590,11 @@ void Text::UpdateText(double systemPowerBase) } break; case UNIT_kVAr: { SetText(wxString::FromDouble(reactivePF * systemPowerBase / 1e3, m_decimalPlaces) + - " kVAr"); + " kVAr"); } break; case UNIT_MVAr: { SetText(wxString::FromDouble(reactivePF * systemPowerBase / 1e6, m_decimalPlaces) + - " MVAr"); + " MVAr"); } break; default: break; @@ -606,8 +628,8 @@ void Text::UpdateText(double systemPowerBase) SetText(wxString::FromDouble(current, m_decimalPlaces) + " p.u."); } break; case UNIT_A: { - SetText( - wxString::FromDouble(current * baseCurrent[m_direction], m_decimalPlaces) + " A"); + SetText(wxString::FromDouble(current * baseCurrent[m_direction], m_decimalPlaces) + + " A"); } break; case UNIT_kA: { SetText( @@ -619,8 +641,9 @@ void Text::UpdateText(double systemPowerBase) } } break; case DATA_SC_CURRENT: { - double faultCurrent[3] = { std::abs(data.faultCurrent[m_direction][0]), - std::abs(data.faultCurrent[m_direction][1]), std::abs(data.faultCurrent[m_direction][2]) }; + double faultCurrent[3] = {std::abs(data.faultCurrent[m_direction][0]), + std::abs(data.faultCurrent[m_direction][1]), + std::abs(data.faultCurrent[m_direction][2])}; if(!transformer->IsOnline()) faultCurrent[0] = faultCurrent[1] = faultCurrent[2] = 0.0; switch(m_unit) { case UNIT_PU: { @@ -631,30 +654,31 @@ void Text::UpdateText(double systemPowerBase) SetText(str); } break; case UNIT_A: { - wxString str = "Ia = " + + wxString str = + "Ia = " + wxString::FromDouble(faultCurrent[0] * baseCurrent[m_direction], m_decimalPlaces) + " A"; - str += "\nIb = " + - wxString::FromDouble(faultCurrent[1] * baseCurrent[m_direction], m_decimalPlaces) + - " A"; - str += "\nIc = " + - wxString::FromDouble(faultCurrent[2] * baseCurrent[m_direction], m_decimalPlaces) + - " A"; + str += "\nIb = " + wxString::FromDouble(faultCurrent[1] * baseCurrent[m_direction], + m_decimalPlaces) + + " A"; + str += "\nIc = " + wxString::FromDouble(faultCurrent[2] * baseCurrent[m_direction], + m_decimalPlaces) + + " A"; SetText(str); } break; case UNIT_kA: { wxString str = "Ia = " + - wxString::FromDouble( - faultCurrent[0] * baseCurrent[m_direction] / 1e3, m_decimalPlaces) + - " kA"; + wxString::FromDouble(faultCurrent[0] * baseCurrent[m_direction] / 1e3, + m_decimalPlaces) + + " kA"; str += "\nIb = " + - wxString::FromDouble( - faultCurrent[1] * baseCurrent[m_direction] / 1e3, m_decimalPlaces) + - " kA"; + wxString::FromDouble(faultCurrent[1] * baseCurrent[m_direction] / 1e3, + m_decimalPlaces) + + " kA"; str += "\nIc = " + - wxString::FromDouble( - faultCurrent[2] * baseCurrent[m_direction] / 1e3, m_decimalPlaces) + - " kA"; + wxString::FromDouble(faultCurrent[2] * baseCurrent[m_direction] / 1e3, + m_decimalPlaces) + + " kA"; SetText(str); } break; default: @@ -690,11 +714,11 @@ void Text::UpdateText(double systemPowerBase) } case UNIT_kW: { SetText(wxString::FromDouble(sPower.real() * systemPowerBase / 1e3, m_decimalPlaces) + - " kW"); + " kW"); } case UNIT_MW: { SetText(wxString::FromDouble(sPower.real() * systemPowerBase / 1e6, m_decimalPlaces) + - " MW"); + " MW"); } default: break; @@ -706,16 +730,16 @@ void Text::UpdateText(double systemPowerBase) SetText(wxString::FromDouble(sPower.imag(), m_decimalPlaces) + " p.u."); } case UNIT_VAr: { - SetText( - wxString::FromDouble(sPower.imag() * systemPowerBase, m_decimalPlaces) + " VAr"); + SetText(wxString::FromDouble(sPower.imag() * systemPowerBase, m_decimalPlaces) + + " VAr"); } case UNIT_kVAr: { SetText(wxString::FromDouble(sPower.imag() * systemPowerBase / 1e3, m_decimalPlaces) + - " kVAr"); + " kVAr"); } case UNIT_MVAr: { SetText(wxString::FromDouble(sPower.imag() * systemPowerBase / 1e6, m_decimalPlaces) + - " MVAr"); + " MVAr"); } default: break; @@ -746,11 +770,11 @@ void Text::UpdateText(double systemPowerBase) } case UNIT_kW: { SetText(wxString::FromDouble(sPower.real() * systemPowerBase / 1e3, m_decimalPlaces) + - " kW"); + " kW"); } case UNIT_MW: { SetText(wxString::FromDouble(sPower.real() * systemPowerBase / 1e6, m_decimalPlaces) + - " MW"); + " MW"); } default: break; @@ -762,16 +786,16 @@ void Text::UpdateText(double systemPowerBase) SetText(wxString::FromDouble(sPower.imag(), m_decimalPlaces) + " p.u."); } case UNIT_VAr: { - SetText( - wxString::FromDouble(sPower.imag() * systemPowerBase, m_decimalPlaces) + " VAr"); + SetText(wxString::FromDouble(sPower.imag() * systemPowerBase, m_decimalPlaces) + + " VAr"); } case UNIT_kVAr: { SetText(wxString::FromDouble(sPower.imag() * systemPowerBase / 1e3, m_decimalPlaces) + - " kVAr"); + " kVAr"); } case UNIT_MVAr: { SetText(wxString::FromDouble(sPower.imag() * systemPowerBase / 1e6, m_decimalPlaces) + - " MVAr"); + " MVAr"); } default: break; @@ -802,11 +826,11 @@ void Text::UpdateText(double systemPowerBase) } case UNIT_kW: { SetText(wxString::FromDouble(sPower.real() * systemPowerBase / 1e3, m_decimalPlaces) + - " kW"); + " kW"); } case UNIT_MW: { SetText(wxString::FromDouble(sPower.real() * systemPowerBase / 1e6, m_decimalPlaces) + - " MW"); + " MW"); } default: break; @@ -818,16 +842,16 @@ void Text::UpdateText(double systemPowerBase) SetText(wxString::FromDouble(sPower.imag(), m_decimalPlaces) + " p.u."); } case UNIT_VAr: { - SetText( - wxString::FromDouble(sPower.imag() * systemPowerBase, m_decimalPlaces) + " VAr"); + SetText(wxString::FromDouble(sPower.imag() * systemPowerBase, m_decimalPlaces) + + " VAr"); } case UNIT_kVAr: { SetText(wxString::FromDouble(sPower.imag() * systemPowerBase / 1e3, m_decimalPlaces) + - " kVAr"); + " kVAr"); } case UNIT_MVAr: { SetText(wxString::FromDouble(sPower.imag() * systemPowerBase / 1e6, m_decimalPlaces) + - " MVAr"); + " MVAr"); } default: break; @@ -864,11 +888,11 @@ void Text::UpdateText(double systemPowerBase) } case UNIT_kVAr: { SetText(wxString::FromDouble(reativePower * systemPowerBase / 1e3, m_decimalPlaces) + - " kVAr"); + " kVAr"); } case UNIT_MVAr: { SetText(wxString::FromDouble(reativePower * systemPowerBase / 1e6, m_decimalPlaces) + - " MVAr"); + " MVAr"); } default: break; @@ -905,11 +929,11 @@ void Text::UpdateText(double systemPowerBase) } case UNIT_kVAr: { SetText(wxString::FromDouble(reativePower * systemPowerBase / 1e3, m_decimalPlaces) + - " kVAr"); + " kVAr"); } case UNIT_MVAr: { SetText(wxString::FromDouble(reativePower * systemPowerBase / 1e6, m_decimalPlaces) + - " MVAr"); + " MVAr"); } default: break; diff --git a/Project/Workspace.cpp b/Project/Workspace.cpp index 12a4ace..ddbf470 100644 --- a/Project/Workspace.cpp +++ b/Project/Workspace.cpp @@ -180,6 +180,7 @@ void Workspace::OnLeftClickDown(wxMouseEvent& event) // Click in selected element node. if(element->NodeContains(m_camera->ScreenToWorld(clickPoint)) != 0 && element->IsSelected()) { m_mode = MODE_MOVE_NODE; + m_disconnectedElement = true; foundElement = true; } @@ -377,6 +378,7 @@ void Workspace::OnLeftClickUp(wxMouseEvent& event) // The child have a parent that is the element. if(parent == element) { child->UpdateNodes(); + m_disconnectedElement = true; } } } @@ -454,6 +456,12 @@ void Workspace::OnLeftClickUp(wxMouseEvent& event) if(updateVoltages) { ValidateElementsVoltages(); } + + if(m_continuousCalc && m_disconnectedElement) { + m_disconnectedElement = false; + RunStaticStudies(); + } + m_selectionRect = wxRect2DDouble(0, 0, 0, 0); Redraw(); UpdateStatusBar(); @@ -717,9 +725,7 @@ void Workspace::OnKeyDown(wxKeyEvent& event) } // Tests - Ctrl + Shift + L if(event.ControlDown() && event.ShiftDown()) { - ControlEditor* ce = - new ControlEditor(this, IOControl::IN_TERMINAL_VOLTAGE | IOControl::OUT_FIELD_VOLTAGE); - ce->Show(); + UpdateTextElements(); } } break; case 'T': // Insert a transformer. @@ -1043,6 +1049,8 @@ void Workspace::Fit() } if(!GetElementsCorners(leftUpCorner, rightDownCorner, elementList)) return; + wxPoint2DDouble middleCoords = (leftUpCorner + rightDownCorner) / 2.0; + int width = 0.0; int height = 0.0; GetSize(&width, &height); @@ -1056,8 +1064,8 @@ void Workspace::Fit() m_camera->SetScale(scale); - m_camera->StartTranslation(leftUpCorner); - m_camera->SetTranslation(wxPoint2DDouble(0, 0)); + m_camera->StartTranslation(middleCoords); + m_camera->SetTranslation(wxPoint2DDouble(width / 2, height / 2)); Redraw(); } @@ -1130,7 +1138,7 @@ void Workspace::UpdateTextElements() { for(auto it = m_textList.begin(), itEnd = m_textList.end(); it != itEnd; ++it) { Text* text = *it; - text->UpdateText(100e6); + text->UpdateText(m_properties->GetSimulationPropertiesData().basePower); } } diff --git a/Project/Workspace.h b/Project/Workspace.h index 7eb82ba..5a36106 100644 --- a/Project/Workspace.h +++ b/Project/Workspace.h @@ -168,6 +168,7 @@ protected: std::vector<double> m_stabilityTimeVector; bool m_continuousCalc = false; + bool m_disconnectedElement = false; bool m_justOpened = false; }; diff --git a/Project/wxGLString.cpp b/Project/wxGLString.cpp index 07c8c48..d9b8324 100644 --- a/Project/wxGLString.cpp +++ b/Project/wxGLString.cpp @@ -10,9 +10,8 @@ GLuint* loadImage(wxImage* img) { - - GLuint* ID = new GLuint[1]; - glGenTextures(1, &ID[0]); + GLuint* ID = new GLuint; + glGenTextures(1, ID); glBindTexture(GL_TEXTURE_2D, *ID); @@ -42,8 +41,8 @@ GLuint* loadImage(wxImage* img) // alpha imageData[(x + y * w) * bytesPerPixel + 3] = 255 - bitmapData[(x + (rev_val - y) * w) * 3]; - } // next - } // next + } // next + } // next glTexImage2D(GL_TEXTURE_2D, 0, bytesPerPixel, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, imageData); @@ -66,17 +65,17 @@ class TextTexture friend class wxGLStringArray; friend class wxGLStringNumber; -private: + private: GLuint* ID = NULL; -protected: + protected: GLuint* getID(); TextTexture(); TextTexture(wxBitmap& bmp); void load(wxImage* img); -public: + public: ~TextTexture(); }; @@ -133,9 +132,7 @@ void TextGLDrawable::scale(float k) } void TextGLDrawable::setImage(TextTexture* image) { TextGLDrawable::image = image; } - void TextGLDrawable::rotate(int angle) { TextGLDrawable::angle = angle; } - void TextGLDrawable::render() const { assert(image); @@ -169,20 +166,17 @@ void TextGLDrawable::render() const #endif TextTexture::TextTexture() {} - TextTexture::TextTexture(wxBitmap& bmp) { wxImage img = bmp.ConvertToImage(); load(&img); } void TextTexture::load(wxImage* img) { ID = loadImage(img); } - GLuint* TextTexture::getID() { return ID; } - TextTexture::~TextTexture() { glDeleteTextures(1, ID); - if(ID) delete ID; // Memory leak? + if(ID) delete ID; // Memory leak? } #if 0 @@ -190,22 +184,14 @@ TextTexture::~TextTexture() #pragma mark wxGLString implementation #endif -wxGLString::wxGLString() - : wxString(wxT("")) - , TextGLDrawable() -{ - img = NULL; -} -wxGLString::wxGLString(wxString message) - : wxString(message) - , TextGLDrawable() -{ - img = NULL; -} +wxGLString::wxGLString() : wxString(wxT("")), TextGLDrawable() { img = NULL; } +wxGLString::wxGLString(wxString message) : wxString(message), TextGLDrawable() { img = NULL; } void wxGLString::operator=(wxString& string) { (*((wxString*)this)) = string; } void wxGLString::bind() const { - if(img->getID()[0]) glBindTexture(GL_TEXTURE_2D, img->getID()[0]); + if(img->getID()) { + glBindTexture(GL_TEXTURE_2D, *img->getID()); + } } void wxGLString::calculateSize(wxDC* dc, const bool ignore_font /* when from array */) { @@ -255,9 +241,7 @@ void wxGLString::consolidate(wxDC* dc) } void wxGLString::consolidateFromArray(wxDC* dc, double x, double y) { dc->DrawText(*this, x, y); } - void wxGLString::setFont(wxFont font) { wxGLString::font = font; } - void wxGLString::render(const double x, const double y) { TextGLDrawable::move(x, y); @@ -273,13 +257,11 @@ wxGLString::~wxGLString() #pragma mark wxGLNumberRenderer implementation #endif -wxGLNumberRenderer::wxGLNumberRenderer() - : wxGLString(wxT("0 1 2 3 4 5 6 7 8 9 . - ")) +wxGLNumberRenderer::wxGLNumberRenderer() : wxGLString(wxT("0 1 2 3 4 5 6 7 8 9 . - ")) { number_location = new int[13]; } wxGLNumberRenderer::~wxGLNumberRenderer() { delete[] number_location; } - void wxGLNumberRenderer::consolidate(wxDC* dc) { wxGLString::consolidate(dc); @@ -381,7 +363,7 @@ void wxGLNumberRenderer::renderNumber(wxString s, double x, double y) TextGLDrawable::render(); x += char_width; - } // next + } // next // TextGLDrawable::w = full_string_w; } @@ -406,11 +388,12 @@ wxGLStringArray::~wxGLStringArray() wxGLString& wxGLStringArray::get(const int id) { return strings[id]; } void wxGLStringArray::bind() { - if(img->getID()[0]) glBindTexture(GL_TEXTURE_2D, img->getID()[0]); + if(img->getID()) { + glBindTexture(GL_TEXTURE_2D, *img->getID()); + } } void wxGLStringArray::addString(wxString string) { strings.push_back(wxGLString(string)); } void wxGLStringArray::setFont(wxFont font) { wxGLStringArray::font = font; } - void wxGLStringArray::consolidate(wxDC* dc) { int x = 0, y = 0; @@ -428,7 +411,7 @@ void wxGLStringArray::consolidate(wxDC* dc) strings[n].calculateSize(dc, true); y += strings[n].h; if(strings[n].w > longest_string) longest_string = strings[n].w; - } // next + } // next const int average_string_height = y / amount; @@ -468,7 +451,7 @@ void wxGLStringArray::consolidate(wxDC* dc) strings[n].tex_coord_y2 = 1.0 - (float)(y + strings[n].h) / (float)power_of_2_h; y += strings[n].h; - if(y > power_of_2_h - average_string_height) // check if we need to switch to next column + if(y > power_of_2_h - average_string_height) // check if we need to switch to next column { y = 0; x += longest_string; |