summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThales Lima Oliveira <thaleslima.ufu@gmail.com>2017-09-09 19:11:41 -0300
committerThales Lima Oliveira <thaleslima.ufu@gmail.com>2017-09-09 19:11:41 -0300
commit91b9c3f9909955443e74dedb248fc48fa984709b (patch)
treec1bf65c2bd297d44e258067155292d9798f4c8c9
parent9e1f6849c929506a17fa12185c5c0185d5287177 (diff)
downloadPSP.git-91b9c3f9909955443e74dedb248fc48fa984709b.tar.gz
PSP.git-91b9c3f9909955443e74dedb248fc48fa984709b.tar.xz
PSP.git-91b9c3f9909955443e74dedb248fc48fa984709b.zip
Data report fully implemented
-rw-r--r--Project/DataReport.cpp110
-rw-r--r--Project/DataReport.h33
-rw-r--r--Project/Fault.cpp45
-rw-r--r--Project/Fault.h2
-rw-r--r--Project/Project.mk2
-rw-r--r--Project/SyncGenerator.cpp40
-rw-r--r--Project/SyncMotor.cpp40
-rw-r--r--Project/Text.cpp256
-rw-r--r--Project/Workspace.cpp20
-rw-r--r--Project/Workspace.h1
-rw-r--r--Project/wxGLString.cpp57
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;