19#include <wx/settings.h>
20#include "../simulation/ElectricCalculation.h"
21#include "../editors/Workspace.h"
22#include "ExportCSVForm.h"
24DataReport::DataReport(wxWindow* parent,
Workspace* workspace) : DataReportBase(parent)
26 m_workspace = workspace;
28 if (wxSystemSettings::GetAppearance().IsDark())
30 m_headerColour = wxColour(50, 50, 50);
31 m_offlineColour = wxColour(100, 100, 100);
32 m_oddRowColour = wxColour(70, 70, 70);
33 m_evenRowColour = wxColour(40, 40, 40);
36 m_headerColour = wxColour(191, 223, 255);
37 m_offlineColour = wxColour(100, 100, 100);
38 m_oddRowColour = wxColour(220, 220, 220);
39 m_evenRowColour = wxColour(255, 255, 255);
42 m_fontSize = wxAtoi(m_choiceFontSize->GetStringSelection());
43 m_precision = wxAtoi(m_textCtrlPrecision->GetValue());
45 wxGrid* grids[] = { m_gridPowerFlow, m_gridPFBuses, m_gridPFBranches, m_gridFault, m_gridFaultBuses, m_gridFaultBranches, m_gridFaultGenerators, m_gridHarmCurrents, m_gridHarmBuses, m_gridHarmBranches };
46 for (
auto grid : grids)
47 grid->Bind(wxEVT_MOUSEWHEEL, &
DataReport::OnMouseWheel, this);
54 SetRowsColours(m_gridPowerFlow);
55 SetRowsColours(m_gridPFBuses);
56 SetRowsColours(m_gridPFBranches);
57 SetRowsColours(m_gridFault, 2);
58 SetRowsColours(m_gridFaultBuses, 2);
59 SetRowsColours(m_gridFaultBranches, 2);
60 SetRowsColours(m_gridFaultGenerators, 2);
61 SetRowsColours(m_gridHarmCurrents, 1, 2);
62 SetRowsColours(m_gridHarmBuses, 1, 2);
63 SetRowsColours(m_gridHarmBranches, 1, 4, 1);
68DataReport::~DataReport()
70 wxGrid* grids[] = { m_gridPowerFlow, m_gridPFBuses, m_gridPFBranches, m_gridFault, m_gridFaultBuses, m_gridFaultBranches, m_gridFaultGenerators, m_gridHarmCurrents, m_gridHarmBuses, m_gridHarmBranches };
71 for (
auto grid : grids)
72 grid->Unbind(wxEVT_MOUSEWHEEL, &
DataReport::OnMouseWheel, this);
75void DataReport::CreateGrids()
77 wxFont headerFont = m_gridPowerFlow->GetLabelFont();
78 headerFont.SetWeight(wxFONTWEIGHT_BOLD);
90 m_gridPowerFlow->AppendCols(7);
91 m_gridPowerFlow->AppendRows();
92 m_gridPowerFlow->HideColLabels();
93 m_gridPowerFlow->HideRowLabels();
94 for (
int i = 0; i < 7; ++i) {
95 m_gridPowerFlow->SetCellBackgroundColour(0, i, m_headerColour);
96 m_gridPowerFlow->SetCellFont(0, i, headerFont);
98 m_gridPowerFlow->SetDefaultCellAlignment(wxALIGN_CENTRE, wxALIGN_CENTRE);
100 m_gridPowerFlow->AppendRows((lineList.size() + transformerList.size()) * 2);
101 m_gridPowerFlow->AutoSize();
105 m_gridPFBuses->AppendCols(6);
106 m_gridPFBuses->AppendRows();
107 m_gridPFBuses->HideColLabels();
108 m_gridPFBuses->HideRowLabels();
109 for (
int i = 0; i < 6; ++i) {
110 m_gridPFBuses->SetCellBackgroundColour(0, i, m_headerColour);
111 m_gridPFBuses->SetCellFont(0, i, headerFont);
113 m_gridPFBuses->SetDefaultCellAlignment(wxALIGN_CENTRE, wxALIGN_CENTRE);
115 m_gridPFBuses->AppendRows(busList.size());
116 m_gridPFBuses->AutoSize();
120 m_gridPFBranches->AppendCols(10);
121 m_gridPFBranches->AppendRows(1);
122 m_gridPFBranches->HideColLabels();
123 m_gridPFBranches->HideRowLabels();
124 for (
int i = 0; i < 10; ++i) {
125 m_gridPFBranches->SetCellBackgroundColour(0, i, m_headerColour);
126 m_gridPFBranches->SetCellFont(0, i, headerFont);
128 m_gridPFBranches->SetDefaultCellAlignment(wxALIGN_CENTRE, wxALIGN_CENTRE);
130 m_gridPFBranches->AppendRows(lineList.size() + transformerList.size());
131 m_gridPFBranches->AutoSize();
135 m_gridFault->AppendCols(7);
136 m_gridFault->AppendRows(2);
137 m_gridFault->HideColLabels();
138 m_gridFault->HideRowLabels();
139 for (
int i = 0; i < 2; ++i) {
140 for (
int j = 0; j < 7; ++j) {
141 m_gridFault->SetCellBackgroundColour(i, j, m_headerColour);
142 m_gridFault->SetCellFont(i, j, headerFont);
145 m_gridFault->SetDefaultCellAlignment(wxALIGN_CENTRE, wxALIGN_CENTRE);
146 m_gridFault->SetCellSize(0, 0, 2, 1);
147 m_gridFault->SetCellSize(0, 1, 1, 2);
148 m_gridFault->SetCellSize(0, 3, 1, 2);
149 m_gridFault->SetCellSize(0, 5, 1, 2);
151 for (
auto it = busList.begin(), itEnd = busList.end(); it != itEnd; ++it) {
153 if (bus->GetElectricalData().hasFault) m_gridFault->AppendRows();
155 m_gridFault->AutoSize();
159 m_gridFaultBuses->AppendCols(7);
160 m_gridFaultBuses->AppendRows(2);
161 m_gridFaultBuses->HideColLabels();
162 m_gridFaultBuses->HideRowLabels();
163 for (
int i = 0; i < 2; ++i) {
164 for (
int j = 0; j < 7; ++j) {
165 m_gridFaultBuses->SetCellBackgroundColour(i, j, m_headerColour);
166 m_gridFaultBuses->SetCellFont(i, j, headerFont);
169 m_gridFaultBuses->SetDefaultCellAlignment(wxALIGN_CENTRE, wxALIGN_CENTRE);
170 m_gridFaultBuses->SetCellSize(0, 0, 2, 1);
171 m_gridFaultBuses->SetCellSize(0, 1, 1, 2);
172 m_gridFaultBuses->SetCellSize(0, 3, 1, 2);
173 m_gridFaultBuses->SetCellSize(0, 5, 1, 2);
175 m_gridFaultBuses->AppendRows(busList.size());
176 m_gridFaultBuses->AutoSize();
180 m_gridFaultBranches->AppendCols(11);
181 m_gridFaultBranches->AppendRows(2);
182 m_gridFaultBranches->HideColLabels();
183 m_gridFaultBranches->HideRowLabels();
184 for (
int i = 0; i < 2; ++i) {
185 for (
int j = 0; j < 11; ++j) {
186 m_gridFaultBranches->SetCellBackgroundColour(i, j, m_headerColour);
187 m_gridFaultBranches->SetCellFont(i, j, headerFont);
190 m_gridFaultBranches->SetDefaultCellAlignment(wxALIGN_CENTRE, wxALIGN_CENTRE);
191 m_gridFaultBranches->SetCellSize(0, 0, 2, 1);
192 m_gridFaultBranches->SetCellSize(0, 1, 2, 1);
193 m_gridFaultBranches->SetCellSize(0, 2, 2, 1);
194 m_gridFaultBranches->SetCellSize(0, 3, 2, 1);
195 m_gridFaultBranches->SetCellSize(0, 10, 2, 1);
196 m_gridFaultBranches->SetCellSize(0, 4, 1, 2);
197 m_gridFaultBranches->SetCellSize(0, 6, 1, 2);
198 m_gridFaultBranches->SetCellSize(0, 8, 1, 2);
200 m_gridFaultBranches->AppendRows((lineList.size() + transformerList.size()) * 2);
201 m_gridFaultBranches->AutoSize();
205 m_gridFaultGenerators->AppendCols(7);
206 m_gridFaultGenerators->AppendRows(2);
207 m_gridFaultGenerators->HideColLabels();
208 m_gridFaultGenerators->HideRowLabels();
209 for (
int i = 0; i < 2; ++i) {
210 for (
int j = 0; j < 7; ++j) {
211 m_gridFaultGenerators->SetCellBackgroundColour(i, j, m_headerColour);
212 m_gridFaultGenerators->SetCellFont(i, j, headerFont);
215 m_gridFaultGenerators->SetDefaultCellAlignment(wxALIGN_CENTRE, wxALIGN_CENTRE);
216 m_gridFaultGenerators->SetCellSize(0, 0, 2, 1);
217 m_gridFaultGenerators->SetCellSize(0, 1, 1, 2);
218 m_gridFaultGenerators->SetCellSize(0, 3, 1, 2);
219 m_gridFaultGenerators->SetCellSize(0, 5, 1, 2);
221 m_gridFaultGenerators->AppendRows(generatorList.size());
222 m_gridFaultGenerators->AutoSize();
226 m_gridHarmCurrents->AppendCols(5);
227 m_gridHarmCurrents->AppendRows();
228 m_gridHarmCurrents->HideColLabels();
229 m_gridHarmCurrents->HideRowLabels();
230 for (
int i = 0; i < 5; ++i) {
231 m_gridHarmCurrents->SetCellBackgroundColour(0, i, m_headerColour);
232 m_gridHarmCurrents->SetCellFont(0, i, headerFont);
234 m_gridHarmCurrents->SetDefaultCellAlignment(wxALIGN_CENTRE, wxALIGN_CENTRE);
236 int numRowDataHarmCurrent = 0;
237 for (
auto* hSource : harmCurrentSourceList) {
238 numRowDataHarmCurrent += hSource->GetElectricalData().harmonicOrder.size();
240 m_gridHarmCurrents->AppendRows(numRowDataHarmCurrent);
241 m_gridHarmCurrents->AutoSize();
245 m_gridHarmBuses->AppendCols(5);
246 m_gridHarmBuses->AppendRows();
247 m_gridHarmBuses->HideColLabels();
248 m_gridHarmBuses->HideRowLabels();
249 for (
int i = 0; i < 5; ++i) {
250 m_gridHarmBuses->SetCellBackgroundColour(0, i, m_headerColour);
251 m_gridHarmBuses->SetCellFont(0, i, headerFont);
253 m_gridHarmBuses->SetDefaultCellAlignment(wxALIGN_CENTRE, wxALIGN_CENTRE);
255 int numRowDataHarmBuses = 0;
256 for (
auto* bus : busList) {
257 numRowDataHarmBuses += bus->GetElectricalData().harmonicOrder.size();
259 m_gridHarmBuses->AppendRows(numRowDataHarmBuses);
260 m_gridHarmBuses->AutoSize();
264 m_gridHarmBranches->AppendCols(8);
265 m_gridHarmBranches->AppendRows();
266 m_gridHarmBranches->HideColLabels();
267 m_gridHarmBranches->HideRowLabels();
268 for (
int i = 0; i < 8; ++i) {
269 m_gridHarmBranches->SetCellBackgroundColour(0, i, m_headerColour);
270 m_gridHarmBranches->SetCellFont(0, i, headerFont);
272 m_gridHarmBranches->SetDefaultCellAlignment(wxALIGN_CENTRE, wxALIGN_CENTRE);
274 int numRowDataHarmBranches = 0;
275 for (
auto* line : lineList) {
276 numRowDataHarmBranches += line->GetElectricalData().harmonicOrder.size();
278 for (
auto* transformer : transformerList) {
279 numRowDataHarmBranches += transformer->GetElectricalData().harmonicOrder.size();
281 m_gridHarmBranches->AppendRows(numRowDataHarmBranches * 2.0);
282 m_gridHarmBranches->AutoSize();
286void DataReport::SetHeaders()
289 wxString omega =
static_cast<wxString
>(L
'\u03A9');
291 m_voltageChoices.Add(_(
"Voltage (p.u.)"));
292 m_voltageChoices.Add(_(
"Voltage (V)"));
293 m_voltageChoices.Add(_(
"Voltage (kV)"));
295 m_phaseVoltageChoices.Add(_(
"Phase Voltage (p.u.)"));
296 m_phaseVoltageChoices.Add(_(
"Phase Voltage (V)"));
297 m_phaseVoltageChoices.Add(_(
"Phase Voltage (kV)"));
299 m_activePowerChoices.Add(_(
"Active Power (p.u.)"));
300 m_activePowerChoices.Add(_(
"Active Power (W)"));
301 m_activePowerChoices.Add(_(
"Active Power (kW)"));
302 m_activePowerChoices.Add(_(
"Active Power (MW)"));
304 m_reactivePowerChoices.Add(_(
"Reactive Power (p.u.)"));
305 m_reactivePowerChoices.Add(_(
"Reactive Power (var)"));
306 m_reactivePowerChoices.Add(_(
"Reactive Power (kvar)"));
307 m_reactivePowerChoices.Add(_(
"Reactive Power (Mvar)"));
309 m_resistanceChoices.Add(_(
"R (p.u.)"));
310 m_resistanceChoices.Add(_(
"R (") + omega + wxT(
")"));
312 m_indReactanceChoices.Add(_(
"XL (p.u.)"));
313 m_indReactanceChoices.Add(_(
"XL (") + omega + wxT(
")"));
315 m_capSusceptanceChoices.Add(_(
"B (p.u.)"));
316 m_capSusceptanceChoices.Add(_(
"B (S)"));
318 m_currentChoices.Add(_(
"Current (p.u.)"));
319 m_currentChoices.Add(_(
"Current (A)"));
320 m_currentChoices.Add(_(
"Current (kA)"));
323 m_gridPowerFlow->SetCellValue(0, 0, _(
"Type"));
324 m_gridPowerFlow->SetCellValue(0, 1, _(
"Name"));
325 m_gridPowerFlow->SetCellValue(0, 2, _(
"From"));
326 m_gridPowerFlow->SetCellValue(0, 3, _(
"To"));
327 m_gridPowerFlow->SetCellEditor(0, 4,
new wxGridCellChoiceEditor(m_activePowerChoices));
328 m_gridPowerFlow->SetCellValue(0, 4, m_activePowerChoices[3]);
329 m_gridPowerFlow->SetCellEditor(0, 5,
new wxGridCellChoiceEditor(m_reactivePowerChoices));
330 m_gridPowerFlow->SetCellValue(0, 5, m_reactivePowerChoices[3]);
331 m_gridPowerFlow->SetCellValue(0, 6, _(
"Online"));
334 m_gridPFBuses->SetCellValue(0, 0, _(
"Name"));
335 m_gridPFBuses->SetCellValue(0, 1, _(
"Type"));
336 m_gridPFBuses->SetCellEditor(0, 2,
new wxGridCellChoiceEditor(m_voltageChoices));
337 m_gridPFBuses->SetCellValue(0, 2, m_voltageChoices[0]);
338 m_gridPFBuses->SetCellValue(0, 3, _(
"Angle"));
339 m_gridPFBuses->SetCellEditor(0, 4,
new wxGridCellChoiceEditor(m_activePowerChoices));
340 m_gridPFBuses->SetCellValue(0, 4, m_activePowerChoices[3]);
341 m_gridPFBuses->SetCellEditor(0, 5,
new wxGridCellChoiceEditor(m_reactivePowerChoices));
342 m_gridPFBuses->SetCellValue(0, 5, m_reactivePowerChoices[3]);
345 m_gridPFBranches->SetCellValue(0, 0, _(
"Type"));
346 m_gridPFBranches->SetCellValue(0, 1, _(
"Name"));
347 m_gridPFBranches->SetCellValue(0, 2, _(
"From"));
348 m_gridPFBranches->SetCellValue(0, 3, _(
"To"));
349 m_gridPFBranches->SetCellEditor(0, 4,
new wxGridCellChoiceEditor(m_resistanceChoices));
350 m_gridPFBranches->SetCellValue(0, 4, m_resistanceChoices[0]);
351 m_gridPFBranches->SetCellEditor(0, 5,
new wxGridCellChoiceEditor(m_indReactanceChoices));
352 m_gridPFBranches->SetCellValue(0, 5, m_indReactanceChoices[0]);
353 m_gridPFBranches->SetCellEditor(0, 6,
new wxGridCellChoiceEditor(m_capSusceptanceChoices));
354 m_gridPFBranches->SetCellValue(0, 6, m_capSusceptanceChoices[0]);
355 m_gridPFBranches->SetCellValue(0, 7, _(
"TAP"));
356 m_gridPFBranches->SetCellValue(0, 8, _(
"Phase Shift"));
357 m_gridPFBranches->SetCellValue(0, 9, _(
"Online"));
360 m_gridFault->SetCellValue(0, 0, _(
"Fault bus name"));
361 m_gridFault->SetCellValue(0, 1, _(
"Phase A"));
362 m_gridFault->SetCellValue(0, 3, _(
"Phase B"));
363 m_gridFault->SetCellValue(0, 5, _(
"Phase C"));
364 m_gridFault->SetCellEditor(1, 1,
new wxGridCellChoiceEditor(m_currentChoices));
365 m_gridFault->SetCellValue(1, 1, m_currentChoices[1]);
366 m_gridFault->SetCellValue(1, 2, _(
"Angle"));
367 m_gridFault->SetCellEditor(1, 3,
new wxGridCellChoiceEditor(m_currentChoices));
368 m_gridFault->SetCellValue(1, 3, m_currentChoices[1]);
369 m_gridFault->SetCellValue(1, 4, _(
"Angle"));
370 m_gridFault->SetCellEditor(1, 5,
new wxGridCellChoiceEditor(m_currentChoices));
371 m_gridFault->SetCellValue(1, 5, m_currentChoices[1]);
372 m_gridFault->SetCellValue(1, 6, _(
"Angle"));
375 m_gridFaultBuses->SetCellValue(0, 0, _(
"Name"));
376 m_gridFaultBuses->SetCellValue(0, 1, _(
"Phase A"));
377 m_gridFaultBuses->SetCellValue(0, 3, _(
"Phase B"));
378 m_gridFaultBuses->SetCellValue(0, 5, _(
"Phase C"));
379 m_gridFaultBuses->SetCellEditor(1, 1,
new wxGridCellChoiceEditor(m_voltageChoices));
380 m_gridFaultBuses->SetCellValue(1, 1, m_voltageChoices[0]);
381 m_gridFaultBuses->SetCellValue(1, 2, _(
"Angle"));
382 m_gridFaultBuses->SetCellEditor(1, 3,
new wxGridCellChoiceEditor(m_voltageChoices));
383 m_gridFaultBuses->SetCellValue(1, 3, m_voltageChoices[0]);
384 m_gridFaultBuses->SetCellValue(1, 4, _(
"Angle"));
385 m_gridFaultBuses->SetCellEditor(1, 5,
new wxGridCellChoiceEditor(m_voltageChoices));
386 m_gridFaultBuses->SetCellValue(1, 5, m_voltageChoices[0]);
387 m_gridFaultBuses->SetCellValue(1, 6, _(
"Angle"));
390 m_gridFaultBranches->SetCellValue(0, 0, _(
"Type"));
391 m_gridFaultBranches->SetCellValue(0, 1, _(
"Name"));
392 m_gridFaultBranches->SetCellValue(0, 2, _(
"From"));
393 m_gridFaultBranches->SetCellValue(0, 3, _(
"To"));
394 m_gridFaultBranches->SetCellValue(0, 4, _(
"Phase A"));
395 m_gridFaultBranches->SetCellValue(0, 6, _(
"Phase B"));
396 m_gridFaultBranches->SetCellValue(0, 8, _(
"Phase C"));
397 m_gridFaultBranches->SetCellValue(0, 10, _(
"Online"));
398 m_gridFaultBranches->SetCellEditor(1, 4,
new wxGridCellChoiceEditor(m_currentChoices));
399 m_gridFaultBranches->SetCellValue(1, 4, m_currentChoices[1]);
400 m_gridFaultBranches->SetCellValue(1, 5, _(
"Angle"));
401 m_gridFaultBranches->SetCellEditor(1, 6,
new wxGridCellChoiceEditor(m_currentChoices));
402 m_gridFaultBranches->SetCellValue(1, 6, m_currentChoices[1]);
403 m_gridFaultBranches->SetCellValue(1, 7, _(
"Angle"));
404 m_gridFaultBranches->SetCellEditor(1, 8,
new wxGridCellChoiceEditor(m_currentChoices));
405 m_gridFaultBranches->SetCellValue(1, 8, m_currentChoices[1]);
406 m_gridFaultBranches->SetCellValue(1, 9, _(
"Angle"));
409 m_gridFaultGenerators->SetCellValue(0, 0, _(
"Name"));
410 m_gridFaultGenerators->SetCellValue(0, 1, _(
"Phase A"));
411 m_gridFaultGenerators->SetCellValue(0, 3, _(
"Phase B"));
412 m_gridFaultGenerators->SetCellValue(0, 5, _(
"Phase C"));
413 m_gridFaultGenerators->SetCellEditor(1, 1,
new wxGridCellChoiceEditor(m_currentChoices));
414 m_gridFaultGenerators->SetCellValue(1, 1, m_currentChoices[1]);
415 m_gridFaultGenerators->SetCellValue(1, 2, _(
"Angle"));
416 m_gridFaultGenerators->SetCellEditor(1, 3,
new wxGridCellChoiceEditor(m_currentChoices));
417 m_gridFaultGenerators->SetCellValue(1, 3, m_currentChoices[1]);
418 m_gridFaultGenerators->SetCellValue(1, 4, _(
"Angle"));
419 m_gridFaultGenerators->SetCellEditor(1, 5,
new wxGridCellChoiceEditor(m_currentChoices));
420 m_gridFaultGenerators->SetCellValue(1, 5, m_currentChoices[1]);
421 m_gridFaultGenerators->SetCellValue(1, 6, _(
"Angle"));
424 m_gridHarmCurrents->SetCellValue(0, 0, _(
"Name"));
425 m_gridHarmCurrents->SetCellValue(0, 1, _(
"Bus"));
426 m_gridHarmCurrents->SetCellValue(0, 2, _(
"Harmonic"));
427 m_gridHarmCurrents->SetCellEditor(0, 3,
new wxGridCellChoiceEditor(m_currentChoices));
428 m_gridHarmCurrents->SetCellValue(0, 3, m_currentChoices[1]);
429 m_gridHarmCurrents->SetCellValue(0, 4, _(
"Angle"));
432 m_gridHarmBuses->SetCellValue(0, 0, _(
"Name"));
433 m_gridHarmBuses->SetCellValue(0, 1, _(
"THD"));
434 m_gridHarmBuses->SetCellValue(0, 2, _(
"Harmonic"));
435 m_gridHarmBuses->SetCellEditor(0, 3,
new wxGridCellChoiceEditor(m_phaseVoltageChoices));
436 m_gridHarmBuses->SetCellValue(0, 3, m_phaseVoltageChoices[0]);
437 m_gridHarmBuses->SetCellValue(0, 4, _(
"Angle"));
440 m_gridHarmBranches->SetCellValue(0, 0, _(
"Type"));
441 m_gridHarmBranches->SetCellValue(0, 1, _(
"Name"));
442 m_gridHarmBranches->SetCellValue(0, 2, _(
"From"));
443 m_gridHarmBranches->SetCellValue(0, 3, _(
"To"));
444 m_gridHarmBranches->SetCellValue(0, 4, _(
"Harmonic"));
445 m_gridHarmBranches->SetCellEditor(0, 5,
new wxGridCellChoiceEditor(m_currentChoices));
446 m_gridHarmBranches->SetCellValue(0, 5, m_currentChoices[1]);
447 m_gridHarmBranches->SetCellValue(0, 6, _(
"Angle"));
448 m_gridHarmBranches->SetCellValue(0, 7, _(
"Online"));
451void DataReport::FillValues(GridSelection gridToFill)
453 m_changingValues =
true;
457 double basePower = m_workspace->GetProperties()->GetSimulationPropertiesData().basePower;
458 switch (m_workspace->GetProperties()->GetSimulationPropertiesData().basePowerUnit) {
459 case ElectricalUnit::UNIT_kVA: {
462 case ElectricalUnit::UNIT_MVA: {
477 if (gridToFill == GRID_ALL || gridToFill == GRID_PF) {
478 double kActivePower = 1.0;
479 if (m_gridPowerFlow->GetCellValue(0, 4) == m_activePowerChoices[1])
480 kActivePower = basePower;
481 else if (m_gridPowerFlow->GetCellValue(0, 4) == m_activePowerChoices[2])
482 kActivePower = basePower / 1e3;
483 else if (m_gridPowerFlow->GetCellValue(0, 4) == m_activePowerChoices[3])
484 kActivePower = basePower / 1e6;
486 double kReactivePower = 1.0;
487 if (m_gridPowerFlow->GetCellValue(0, 5) == m_reactivePowerChoices[1])
488 kReactivePower = basePower;
489 else if (m_gridPowerFlow->GetCellValue(0, 5) == m_reactivePowerChoices[2])
490 kReactivePower = basePower / 1e3;
491 else if (m_gridPowerFlow->GetCellValue(0, 5) == m_reactivePowerChoices[3])
492 kReactivePower = basePower / 1e6;
494 for (
auto it = lineList.begin(), itEnd = lineList.end(); it != itEnd; ++it) {
497 wxString busName1 =
"-";
499 busName1 =
static_cast<Bus*
>(line->
GetParentList()[0])->GetElectricalData().name;
500 wxString busName2 =
"-";
502 busName2 =
static_cast<Bus*
>(line->
GetParentList()[1])->GetElectricalData().name;
504 wxString isOnline = _(
"Yes");
505 wxColour textColour = m_gridPowerFlow->GetDefaultCellTextColour();
508 textColour = m_offlineColour;
510 for (
int i = 0; i < 2; ++i) {
511 for (
int j = 0; j < 7; ++j) { m_gridPowerFlow->SetCellTextColour(rowNumber + i, j, textColour); }
514 auto data = line->GetPUElectricalData(basePower);
516 m_gridPowerFlow->SetCellValue(rowNumber, 0, _(
"Line"));
517 m_gridPowerFlow->SetCellValue(rowNumber, 1, data.name);
518 m_gridPowerFlow->SetCellValue(rowNumber, 2, busName1);
519 m_gridPowerFlow->SetCellValue(rowNumber, 3, busName2);
520 m_gridPowerFlow->SetCellValue(rowNumber, 4,
521 line->
StringFromDouble(std::real(data.powerFlow[0]) * kActivePower, 0, m_precision));
522 m_gridPowerFlow->SetCellValue(rowNumber, 5,
523 line->
StringFromDouble(std::imag(data.powerFlow[0]) * kReactivePower, 0, m_precision));
524 m_gridPowerFlow->SetCellValue(rowNumber, 6, isOnline);
527 m_gridPowerFlow->SetCellValue(rowNumber, 0, _(
"Line"));
528 m_gridPowerFlow->SetCellValue(rowNumber, 1, data.name);
529 m_gridPowerFlow->SetCellValue(rowNumber, 2, busName2);
530 m_gridPowerFlow->SetCellValue(rowNumber, 3, busName1);
531 m_gridPowerFlow->SetCellValue(rowNumber, 4,
532 line->
StringFromDouble(std::real(data.powerFlow[1]) * kActivePower, 0, m_precision));
533 m_gridPowerFlow->SetCellValue(rowNumber, 5,
534 line->
StringFromDouble(std::imag(data.powerFlow[1]) * kReactivePower, 0, m_precision));
535 m_gridPowerFlow->SetCellValue(rowNumber, 6, isOnline);
539 for (
auto it = transformerList.begin(), itEnd = transformerList.end(); it != itEnd; ++it) {
541 auto data = transformer->GetPUElectricalData(basePower);
543 wxString busName1 =
"-";
545 busName1 =
static_cast<Bus*
>(transformer->
GetParentList()[0])->GetElectricalData().name;
546 wxString busName2 =
"-";
548 busName2 =
static_cast<Bus*
>(transformer->
GetParentList()[1])->GetElectricalData().name;
550 wxString isOnline = _(
"Yes");
551 wxColour textColour = m_gridPowerFlow->GetDefaultCellTextColour();
554 textColour = m_offlineColour;
556 for (
int i = 0; i < 2; ++i) {
557 for (
int j = 0; j < 7; ++j) { m_gridPowerFlow->SetCellTextColour(rowNumber + i, j, textColour); }
560 m_gridPowerFlow->SetCellValue(rowNumber, 0, _(
"Transformer"));
561 m_gridPowerFlow->SetCellValue(rowNumber, 1, data.name);
562 m_gridPowerFlow->SetCellValue(rowNumber, 2, busName1);
563 m_gridPowerFlow->SetCellValue(rowNumber, 3, busName2);
564 m_gridPowerFlow->SetCellValue(rowNumber, 4,
565 transformer->
StringFromDouble(std::real(data.powerFlow[0]) * kActivePower, 0, m_precision));
566 m_gridPowerFlow->SetCellValue(rowNumber, 5,
567 transformer->
StringFromDouble(std::imag(data.powerFlow[0]) * kReactivePower, 0, m_precision));
568 m_gridPowerFlow->SetCellValue(rowNumber, 6, isOnline);
571 m_gridPowerFlow->SetCellValue(rowNumber, 0, _(
"Transformer"));
572 m_gridPowerFlow->SetCellValue(rowNumber, 1, data.name);
573 m_gridPowerFlow->SetCellValue(rowNumber, 2, busName2);
574 m_gridPowerFlow->SetCellValue(rowNumber, 3, busName1);
575 m_gridPowerFlow->SetCellValue(rowNumber, 4,
576 transformer->
StringFromDouble(std::real(data.powerFlow[1]) * kActivePower, 0, m_precision));
577 m_gridPowerFlow->SetCellValue(rowNumber, 5,
578 transformer->
StringFromDouble(std::imag(data.powerFlow[1]) * kReactivePower, 0, m_precision));
579 m_gridPowerFlow->SetCellValue(rowNumber, 6, isOnline);
582 m_gridPowerFlow->AutoSize();
583 m_gridPowerFlow->GetContainingSizer()->Layout();
587 if (gridToFill == GRID_ALL || gridToFill == GRID_PFBUSES) {
588 double kActivePower = 1.0;
589 if (m_gridPFBuses->GetCellValue(0, 4) == m_activePowerChoices[1])
590 kActivePower = basePower;
591 else if (m_gridPFBuses->GetCellValue(0, 4) == m_activePowerChoices[2])
592 kActivePower = basePower / 1e3;
593 else if (m_gridPFBuses->GetCellValue(0, 4) == m_activePowerChoices[3])
594 kActivePower = basePower / 1e6;
596 double kReactivePower = 1.0;
597 if (m_gridPFBuses->GetCellValue(0, 5) == m_reactivePowerChoices[1])
598 kReactivePower = basePower;
599 else if (m_gridPFBuses->GetCellValue(0, 5) == m_reactivePowerChoices[2])
600 kReactivePower = basePower / 1e3;
601 else if (m_gridPFBuses->GetCellValue(0, 5) == m_reactivePowerChoices[3])
602 kReactivePower = basePower / 1e6;
605 for (
auto it = busList.begin(), itEnd = busList.end(); it != itEnd; ++it) {
607 auto data = bus->GetElectricalData();
609 double vb = std::abs(data.nominalVoltage);
610 if (data.nominalVoltageUnit == ElectricalUnit::UNIT_kV) vb *= 1e3;
611 double kVoltage = 1.0;
612 if (m_gridPFBuses->GetCellValue(0, 2) == m_voltageChoices[1])
614 else if (m_gridPFBuses->GetCellValue(0, 2) == m_voltageChoices[2])
617 m_gridPFBuses->SetCellValue(rowNumber, 0, data.name);
618 wxString busTypeString =
"";
619 switch (data.busType) {
621 busTypeString = _(
"Slack");
624 busTypeString = _(
"PV");
627 busTypeString = _(
"PQ");
630 m_gridPFBuses->SetCellValue(rowNumber, 1, busTypeString);
631 m_gridPFBuses->SetCellValue(rowNumber, 2, bus->
StringFromDouble(std::abs(data.voltage) * kVoltage, 0, m_precision));
632 m_gridPFBuses->SetCellValue(rowNumber, 3, bus->
StringFromDouble(wxRadToDeg(std::arg(data.voltage)), 0, m_precision));
633 m_gridPFBuses->SetCellValue(rowNumber, 4, bus->
StringFromDouble(std::real(data.power) * kActivePower, 0, m_precision));
634 m_gridPFBuses->SetCellValue(rowNumber, 5, bus->
StringFromDouble(std::imag(data.power) * kReactivePower, 0, m_precision));
637 m_gridPFBuses->AutoSize();
638 m_gridPFBuses->GetContainingSizer()->Layout();
642 if (gridToFill == GRID_ALL || gridToFill == GRID_PFBRANCHES) {
644 for (
auto it = lineList.begin(), itEnd = lineList.end(); it != itEnd; ++it) {
646 auto data = line->GetPUElectricalData(basePower);
648 double vb = data.nominalVoltage;
649 if (data.nominalVoltageUnit == ElectricalUnit::UNIT_kV) vb *= 1e3;
650 double zb = (vb * vb) / basePower;
652 wxString busName1 =
"-";
654 busName1 =
static_cast<Bus*
>(line->
GetParentList()[0])->GetElectricalData().name;
655 wxString busName2 =
"-";
657 busName2 =
static_cast<Bus*
>(line->
GetParentList()[1])->GetElectricalData().name;
658 wxString isOnline = _(
"Yes");
659 wxColour textColour = m_gridPFBranches->GetDefaultCellTextColour();
662 textColour = m_offlineColour;
664 for (
int j = 0; j < 10; ++j) { m_gridPFBranches->SetCellTextColour(rowNumber, j, textColour); }
666 m_gridPFBranches->SetCellValue(rowNumber, 0, _(
"Line"));
667 m_gridPFBranches->SetCellValue(rowNumber, 1, data.name);
669 m_gridPFBranches->SetCellValue(rowNumber, 2, busName1);
670 m_gridPFBranches->SetCellValue(rowNumber, 3, busName2);
673 if (m_gridPFBranches->GetCellValue(0, 4) == m_resistanceChoices[1]) k = zb;
674 m_gridPFBranches->SetCellValue(rowNumber, 4, line->
StringFromDouble(data.resistance * k, 0, m_precision));
676 if (m_gridPFBranches->GetCellValue(0, 5) == m_indReactanceChoices[1]) k = zb;
677 m_gridPFBranches->SetCellValue(rowNumber, 5, line->
StringFromDouble(data.indReactance * k, 0, m_precision));
679 if (m_gridPFBranches->GetCellValue(0, 6) == m_capSusceptanceChoices[1]) k = zb;
680 m_gridPFBranches->SetCellValue(rowNumber, 6, line->
StringFromDouble(data.capSusceptance / k, 0, m_precision));
681 m_gridPFBranches->SetCellValue(rowNumber, 7,
"-");
682 m_gridPFBranches->SetCellValue(rowNumber, 8,
"-");
683 m_gridPFBranches->SetCellValue(rowNumber, 9, isOnline);
686 for (
auto it = transformerList.begin(), itEnd = transformerList.end(); it != itEnd; ++it) {
688 auto data = transformer->GetPUElectricalData(basePower);
691 if (data.baseVoltage == 0) {
692 vb = data.primaryNominalVoltage;
693 if (data.primaryNominalVoltageUnit == ElectricalUnit::UNIT_kV) vb *= 1e3;
696 vb = data.secondaryNominalVoltage;
697 if (data.secondaryNominalVoltageUnit == ElectricalUnit::UNIT_kV) vb *= 1e3;
699 double zb = (vb * vb) / basePower;
701 wxString busName1 =
"-";
703 busName1 =
static_cast<Bus*
>(transformer->
GetParentList()[0])->GetElectricalData().name;
704 wxString busName2 =
"-";
706 busName2 =
static_cast<Bus*
>(transformer->
GetParentList()[1])->GetElectricalData().name;
708 wxString isOnline = _(
"Yes");
709 wxColour textColour = m_gridPFBranches->GetDefaultCellTextColour();
712 textColour = m_offlineColour;
714 for (
int j = 0; j < 10; ++j) { m_gridPFBranches->SetCellTextColour(rowNumber, j, textColour); }
716 m_gridPFBranches->SetCellValue(rowNumber, 0, _(
"Transformer"));
717 m_gridPFBranches->SetCellValue(rowNumber, 1, data.name);
718 m_gridPFBranches->SetCellValue(rowNumber, 2, busName1);
719 m_gridPFBranches->SetCellValue(rowNumber, 3, busName2);
722 if (m_gridPFBranches->GetCellValue(0, 4) == m_resistanceChoices[1]) k = zb;
723 m_gridPFBranches->SetCellValue(rowNumber, 4, transformer->
StringFromDouble(data.resistance * k, 0, m_precision));
725 if (m_gridPFBranches->GetCellValue(0, 5) == m_indReactanceChoices[1]) k = zb;
726 m_gridPFBranches->SetCellValue(rowNumber, 5, transformer->
StringFromDouble(data.indReactance * k, 0, m_precision));
727 m_gridPFBranches->SetCellValue(rowNumber, 6,
"-");
728 m_gridPFBranches->SetCellValue(rowNumber, 7, transformer->
StringFromDouble(data.turnsRatio, 0, m_precision));
729 m_gridPFBranches->SetCellValue(rowNumber, 8, transformer->
StringFromDouble(data.phaseShift, 0, m_precision));
730 m_gridPFBranches->SetCellValue(rowNumber, 9, isOnline);
733 m_gridPFBranches->AutoSize();
734 m_gridPFBranches->GetContainingSizer()->Layout();
738 if (gridToFill == GRID_ALL || gridToFill == GRID_FAULT) {
740 for (
auto it = busList.begin(), itEnd = busList.end(); it != itEnd; ++it) {
742 auto data = bus->GetElectricalData();
744 double vb = bus->GetValueFromUnit(data.nominalVoltage, data.nominalVoltageUnit);
745 double ib = basePower / (std::sqrt(3.0) * vb);
747 m_gridFault->SetCellValue(rowNumber, 0, data.name);
749 double kCurrent = 1.0;
750 if (m_gridFault->GetCellValue(1, 1) == m_currentChoices[1]) {
753 else if (m_gridFault->GetCellValue(1, 1) == m_currentChoices[2]) {
756 m_gridFault->SetCellValue(rowNumber, 1,
757 bus->
StringFromDouble(std::abs(data.faultCurrent[0]) * kCurrent, 0, m_precision));
759 m_gridFault->SetCellValue(rowNumber, 2,
760 bus->
StringFromDouble(wxRadToDeg(std::arg(data.faultCurrent[0])), 0, m_precision));
763 if (m_gridFault->GetCellValue(1, 3) == m_currentChoices[1]) {
766 else if (m_gridFault->GetCellValue(1, 3) == m_currentChoices[2]) {
769 m_gridFault->SetCellValue(rowNumber, 3,
770 bus->
StringFromDouble(std::abs(data.faultCurrent[1]) * kCurrent, 0, m_precision));
772 m_gridFault->SetCellValue(rowNumber, 4,
773 bus->
StringFromDouble(wxRadToDeg(std::arg(data.faultCurrent[1])), 0, m_precision));
776 if (m_gridFault->GetCellValue(1, 5) == m_currentChoices[1]) {
779 else if (m_gridFault->GetCellValue(1, 5) == m_currentChoices[2]) {
782 m_gridFault->SetCellValue(rowNumber, 5,
783 bus->
StringFromDouble(std::abs(data.faultCurrent[2]) * kCurrent, 0, m_precision));
785 m_gridFault->SetCellValue(rowNumber, 6,
786 bus->
StringFromDouble(wxRadToDeg(std::arg(data.faultCurrent[2])), 0, m_precision));
791 m_gridFault->AutoSize();
792 m_gridFault->GetContainingSizer()->Layout();
796 if (gridToFill == GRID_ALL || gridToFill == GRID_FAULTBUSES) {
798 for (
auto it = busList.begin(), itEnd = busList.end(); it != itEnd; ++it) {
800 auto data = bus->GetElectricalData();
801 double vb = bus->GetValueFromUnit(data.nominalVoltage, data.nominalVoltageUnit);
803 m_gridFaultBuses->SetCellValue(rowNumber, 0, data.name);
804 double kVoltage = 1.0;
805 if (m_gridFaultBuses->GetCellValue(1, 1) == m_voltageChoices[1]) {
808 else if (m_gridFaultBuses->GetCellValue(1, 1) == m_voltageChoices[2]) {
811 m_gridFaultBuses->SetCellValue(rowNumber, 1,
812 bus->
StringFromDouble(std::abs(data.faultVoltage[0]) * kVoltage, 0, m_precision));
813 m_gridFaultBuses->SetCellValue(rowNumber, 2,
814 bus->
StringFromDouble(wxRadToDeg(std::arg(data.faultVoltage[0])), 0, m_precision));
817 if (m_gridFaultBuses->GetCellValue(1, 3) == m_voltageChoices[1]) {
820 else if (m_gridFaultBuses->GetCellValue(1, 3) == m_voltageChoices[2]) {
823 m_gridFaultBuses->SetCellValue(rowNumber, 3,
824 bus->
StringFromDouble(std::abs(data.faultVoltage[1]) * kVoltage, 0, m_precision));
825 m_gridFaultBuses->SetCellValue(rowNumber, 4,
826 bus->
StringFromDouble(wxRadToDeg(std::arg(data.faultVoltage[1])), 0, m_precision));
829 if (m_gridFaultBuses->GetCellValue(1, 5) == m_voltageChoices[1]) {
832 else if (m_gridFaultBuses->GetCellValue(1, 5) == m_voltageChoices[2]) {
835 m_gridFaultBuses->SetCellValue(rowNumber, 5,
836 bus->
StringFromDouble(std::abs(data.faultVoltage[2]) * kVoltage, 0, m_precision));
837 m_gridFaultBuses->SetCellValue(rowNumber, 6,
838 bus->
StringFromDouble(wxRadToDeg(std::arg(data.faultVoltage[2])), 0, m_precision));
842 m_gridFaultBuses->AutoSize();
843 m_gridFaultBuses->GetContainingSizer()->Layout();
847 if (gridToFill == GRID_ALL || gridToFill == GRID_FAULTBRANCHES) {
849 for (
auto it = lineList.begin(), itEnd = lineList.end(); it != itEnd; ++it) {
851 auto data = line->GetPUElectricalData(basePower);
853 double vb = line->GetValueFromUnit(data.nominalVoltage, data.nominalVoltageUnit);
854 double ib = basePower / (std::sqrt(3.0) * vb);
856 wxString busName1 =
"-";
858 busName1 =
static_cast<Bus*
>(line->
GetParentList()[0])->GetElectricalData().name;
859 wxString busName2 =
"-";
861 busName2 =
static_cast<Bus*
>(line->
GetParentList()[1])->GetElectricalData().name;
863 wxString isOnline = _(
"Yes");
864 wxColour textColour = m_gridFaultBranches->GetDefaultCellTextColour();
867 textColour = m_offlineColour;
869 for (
int i = 0; i < 2; ++i) {
870 for (
int j = 0; j < 11; ++j) { m_gridFaultBranches->SetCellTextColour(rowNumber + i, j, textColour); }
873 m_gridFaultBranches->SetCellValue(rowNumber, 0, _(
"Line"));
874 m_gridFaultBranches->SetCellValue(rowNumber, 1, data.name);
875 m_gridFaultBranches->SetCellValue(rowNumber, 2, busName1);
876 m_gridFaultBranches->SetCellValue(rowNumber, 3, busName2);
878 double kCurrent = 1.0;
879 if (m_gridFaultBranches->GetCellValue(1, 4) == m_currentChoices[1]) {
882 else if (m_gridFaultBranches->GetCellValue(1, 4) == m_currentChoices[2]) {
885 m_gridFaultBranches->SetCellValue(rowNumber, 4,
886 line->
StringFromDouble(std::abs(data.faultCurrent[0][0]) * kCurrent, 0, m_precision));
887 m_gridFaultBranches->SetCellValue(rowNumber, 5,
888 line->
StringFromDouble(wxRadToDeg(std::arg(data.faultCurrent[0][0])), 0, m_precision));
890 if (m_gridFaultBranches->GetCellValue(1, 6) == m_currentChoices[1]) {
893 else if (m_gridFaultBranches->GetCellValue(1, 6) == m_currentChoices[2]) {
896 m_gridFaultBranches->SetCellValue(rowNumber, 6,
897 line->
StringFromDouble(std::abs(data.faultCurrent[0][1]) * kCurrent, 0, m_precision));
898 m_gridFaultBranches->SetCellValue(rowNumber, 7,
899 line->
StringFromDouble(wxRadToDeg(std::arg(data.faultCurrent[0][1])), 0, m_precision));
901 if (m_gridFaultBranches->GetCellValue(1, 8) == m_currentChoices[1]) {
904 else if (m_gridFaultBranches->GetCellValue(1, 8) == m_currentChoices[2]) {
907 m_gridFaultBranches->SetCellValue(rowNumber, 8,
908 line->
StringFromDouble(std::abs(data.faultCurrent[0][2]) * kCurrent, 0, m_precision));
909 m_gridFaultBranches->SetCellValue(rowNumber, 9,
910 line->
StringFromDouble(wxRadToDeg(std::arg(data.faultCurrent[0][2])), 0, m_precision));
911 m_gridFaultBranches->SetCellValue(rowNumber, 10, isOnline);
914 m_gridFaultBranches->SetCellValue(rowNumber, 0, _(
"Line"));
915 m_gridFaultBranches->SetCellValue(rowNumber, 1, data.name);
916 m_gridFaultBranches->SetCellValue(rowNumber, 2, busName2);
917 m_gridFaultBranches->SetCellValue(rowNumber, 3, busName1);
919 if (m_gridFaultBranches->GetCellValue(1, 4) == m_currentChoices[1]) {
922 else if (m_gridFaultBranches->GetCellValue(1, 4) == m_currentChoices[2]) {
925 m_gridFaultBranches->SetCellValue(rowNumber, 4,
926 line->
StringFromDouble(std::abs(data.faultCurrent[1][0]) * kCurrent, 0, m_precision));
927 m_gridFaultBranches->SetCellValue(rowNumber, 5,
928 line->
StringFromDouble(wxRadToDeg(std::arg(data.faultCurrent[1][0])), 0, m_precision));
930 if (m_gridFaultBranches->GetCellValue(1, 6) == m_currentChoices[1]) {
933 else if (m_gridFaultBranches->GetCellValue(1, 6) == m_currentChoices[2]) {
936 m_gridFaultBranches->SetCellValue(rowNumber, 6,
937 line->
StringFromDouble(std::abs(data.faultCurrent[1][1]) * kCurrent, 0, m_precision));
938 m_gridFaultBranches->SetCellValue(rowNumber, 7,
939 line->
StringFromDouble(wxRadToDeg(std::arg(data.faultCurrent[1][1])), 0, m_precision));
941 if (m_gridFaultBranches->GetCellValue(1, 8) == m_currentChoices[1]) {
944 else if (m_gridFaultBranches->GetCellValue(1, 8) == m_currentChoices[2]) {
947 m_gridFaultBranches->SetCellValue(rowNumber, 8,
948 line->
StringFromDouble(std::abs(data.faultCurrent[1][2]) * kCurrent, 0, m_precision));
949 m_gridFaultBranches->SetCellValue(rowNumber, 9,
950 line->
StringFromDouble(wxRadToDeg(std::arg(data.faultCurrent[1][2])), 0, m_precision));
951 m_gridFaultBranches->SetCellValue(rowNumber, 10, isOnline);
955 for (
auto it = transformerList.begin(), itEnd = transformerList.end(); it != itEnd; ++it) {
957 auto data = transformer->GetPUElectricalData(basePower);
959 double vb = transformer->GetValueFromUnit(data.primaryNominalVoltage, data.primaryNominalVoltageUnit);
960 double ibp = basePower / (std::sqrt(3.0) * vb);
961 vb = transformer->GetValueFromUnit(data.secondaryNominalVoltage, data.secondaryNominalVoltageUnit);
962 double ibs = basePower / (std::sqrt(3.0) * vb);
964 wxString busName1 =
"-";
966 busName1 =
static_cast<Bus*
>(transformer->
GetParentList()[0])->GetElectricalData().name;
967 wxString busName2 =
"-";
969 busName2 =
static_cast<Bus*
>(transformer->
GetParentList()[1])->GetElectricalData().name;
971 wxString isOnline = _(
"Yes");
972 wxColour textColour = m_gridFaultBranches->GetDefaultCellTextColour();
975 textColour = m_offlineColour;
977 for (
int i = 0; i < 2; ++i) {
978 for (
int j = 0; j < 11; ++j) { m_gridFaultBranches->SetCellTextColour(rowNumber + i, j, textColour); }
981 m_gridFaultBranches->SetCellValue(rowNumber, 0, _(
"Transformer"));
982 m_gridFaultBranches->SetCellValue(rowNumber, 1, data.name);
983 m_gridFaultBranches->SetCellValue(rowNumber, 2, busName1);
984 m_gridFaultBranches->SetCellValue(rowNumber, 3, busName2);
986 double kCurrent = 1.0;
987 if (m_gridFaultBranches->GetCellValue(1, 4) == m_currentChoices[1]) {
990 else if (m_gridFaultBranches->GetCellValue(1, 4) == m_currentChoices[2]) {
991 kCurrent = ibp / 1e3;
993 m_gridFaultBranches->SetCellValue(
994 rowNumber, 4, transformer->
StringFromDouble(std::abs(data.faultCurrent[0][0]) * kCurrent, 0, m_precision));
995 m_gridFaultBranches->SetCellValue(
996 rowNumber, 5, transformer->
StringFromDouble(wxRadToDeg(std::arg(data.faultCurrent[0][0])), 0, m_precision));
998 if (m_gridFaultBranches->GetCellValue(1, 6) == m_currentChoices[1]) {
1001 else if (m_gridFaultBranches->GetCellValue(1, 6) == m_currentChoices[2]) {
1002 kCurrent = ibp / 1e3;
1004 m_gridFaultBranches->SetCellValue(
1005 rowNumber, 6, transformer->
StringFromDouble(std::abs(data.faultCurrent[0][1]) * kCurrent, 0, m_precision));
1006 m_gridFaultBranches->SetCellValue(
1007 rowNumber, 7, transformer->
StringFromDouble(wxRadToDeg(std::arg(data.faultCurrent[0][1])), 0, m_precision));
1009 if (m_gridFaultBranches->GetCellValue(1, 8) == m_currentChoices[1]) {
1012 else if (m_gridFaultBranches->GetCellValue(1, 8) == m_currentChoices[2]) {
1013 kCurrent = ibp / 1e3;
1015 m_gridFaultBranches->SetCellValue(
1016 rowNumber, 8, transformer->
StringFromDouble(std::abs(data.faultCurrent[0][2]) * kCurrent, 0, m_precision));
1017 m_gridFaultBranches->SetCellValue(
1018 rowNumber, 9, transformer->
StringFromDouble(wxRadToDeg(std::arg(data.faultCurrent[0][2])), 0, m_precision));
1019 m_gridFaultBranches->SetCellValue(rowNumber, 10, isOnline);
1022 m_gridFaultBranches->SetCellValue(rowNumber, 0, _(
"Transformer"));
1023 m_gridFaultBranches->SetCellValue(rowNumber, 1, data.name);
1024 m_gridFaultBranches->SetCellValue(rowNumber, 2, busName2);
1025 m_gridFaultBranches->SetCellValue(rowNumber, 3, busName1);
1027 if (m_gridFaultBranches->GetCellValue(1, 4) == m_currentChoices[1]) {
1030 else if (m_gridFaultBranches->GetCellValue(1, 4) == m_currentChoices[2]) {
1031 kCurrent = ibs / 1e3;
1033 m_gridFaultBranches->SetCellValue(
1034 rowNumber, 4, transformer->
StringFromDouble(std::abs(data.faultCurrent[1][0]) * kCurrent, 0, m_precision));
1035 m_gridFaultBranches->SetCellValue(
1036 rowNumber, 5, transformer->
StringFromDouble(wxRadToDeg(std::arg(data.faultCurrent[1][0])), 0, m_precision));
1038 if (m_gridFaultBranches->GetCellValue(1, 6) == m_currentChoices[1]) {
1041 else if (m_gridFaultBranches->GetCellValue(1, 6) == m_currentChoices[2]) {
1042 kCurrent = ibs / 1e3;
1044 m_gridFaultBranches->SetCellValue(
1045 rowNumber, 6, transformer->
StringFromDouble(std::abs(data.faultCurrent[1][1]) * kCurrent, 0, m_precision));
1046 m_gridFaultBranches->SetCellValue(
1047 rowNumber, 7, transformer->
StringFromDouble(wxRadToDeg(std::arg(data.faultCurrent[1][1])), 0, m_precision));
1049 if (m_gridFaultBranches->GetCellValue(1, 8) == m_currentChoices[1]) {
1052 else if (m_gridFaultBranches->GetCellValue(1, 8) == m_currentChoices[2]) {
1053 kCurrent = ibs / 1e3;
1055 m_gridFaultBranches->SetCellValue(
1056 rowNumber, 8, transformer->
StringFromDouble(std::abs(data.faultCurrent[1][2]) * kCurrent, 0, m_precision));
1057 m_gridFaultBranches->SetCellValue(
1058 rowNumber, 9, transformer->
StringFromDouble(wxRadToDeg(std::arg(data.faultCurrent[1][2])), 0, m_precision));
1059 m_gridFaultBranches->SetCellValue(rowNumber, 10, isOnline);
1063 m_gridFaultBranches->AutoSize();
1064 m_gridFaultBranches->GetContainingSizer()->Layout();
1068 if (gridToFill == GRID_ALL || gridToFill == GRID_FAULTGENERATORS) {
1070 for (
auto it = generatorList.begin(), itEnd = generatorList.end(); it != itEnd; ++it) {
1072 auto data = generator->GetPUElectricalData(basePower);
1073 double vb = generator->GetValueFromUnit(data.nominalVoltage, data.nominalVoltageUnit);
1074 double ib = basePower / (std::sqrt(3.0) * vb);
1076 m_gridFaultGenerators->SetCellValue(rowNumber, 0, data.name);
1078 double kCurrent = 1.0;
1079 if (m_gridFaultGenerators->GetCellValue(1, 1) == m_currentChoices[1])
1081 else if (m_gridFaultGenerators->GetCellValue(1, 1) == m_currentChoices[2])
1082 kCurrent = ib / 1e3;
1083 m_gridFaultGenerators->SetCellValue(rowNumber, 1,
1084 generator->
StringFromDouble(std::abs(data.faultCurrent[0]) * kCurrent, 0, m_precision));
1085 m_gridFaultGenerators->SetCellValue(
1086 rowNumber, 2, generator->
StringFromDouble(wxRadToDeg(std::arg(data.faultCurrent[0])), 0, m_precision));
1089 if (m_gridFaultGenerators->GetCellValue(1, 3) == m_currentChoices[1])
1091 else if (m_gridFaultGenerators->GetCellValue(1, 3) == m_currentChoices[2])
1092 kCurrent = ib / 1e3;
1093 m_gridFaultGenerators->SetCellValue(rowNumber, 3,
1094 generator->
StringFromDouble(std::abs(data.faultCurrent[1]) * kCurrent, 0, m_precision));
1095 m_gridFaultGenerators->SetCellValue(
1096 rowNumber, 4, generator->
StringFromDouble(wxRadToDeg(std::arg(data.faultCurrent[1])), 0, m_precision));
1099 if (m_gridFaultGenerators->GetCellValue(1, 5) == m_currentChoices[1])
1101 else if (m_gridFaultGenerators->GetCellValue(1, 5) == m_currentChoices[2])
1102 kCurrent = ib / 1e3;
1103 m_gridFaultGenerators->SetCellValue(rowNumber, 5,
1104 generator->
StringFromDouble(std::abs(data.faultCurrent[2]) * kCurrent, 0, m_precision));
1105 m_gridFaultGenerators->SetCellValue(
1106 rowNumber, 6, generator->
StringFromDouble(wxRadToDeg(std::arg(data.faultCurrent[2])), 0, m_precision));
1110 m_gridFaultGenerators->AutoSize();
1111 m_gridFaultGenerators->GetContainingSizer()->Layout();
1115 if (gridToFill == GRID_ALL || gridToFill == GRID_HARMCURRENT) {
1117 for (
auto* hCurrent : harmCurrentList) {
1118 if (hCurrent->GetParentList()[0]) {
1119 auto busData =
static_cast<Bus*
>(hCurrent->GetParentList()[0])->GetElectricalData();
1120 double vb = hCurrent->GetValueFromUnit(busData.nominalVoltage, busData.nominalVoltageUnit);
1121 double ib = basePower / (std::sqrt(3.0) * vb);
1123 auto data = hCurrent->GetPUElectricalData(basePower, vb);
1124 m_gridHarmCurrents->SetCellSize(rowNumber, 0, data.harmonicOrder.size(), 1);
1125 m_gridHarmCurrents->SetCellValue(rowNumber, 0, data.name);
1126 m_gridHarmCurrents->SetCellSize(rowNumber, 1, data.harmonicOrder.size(), 1);
1127 m_gridHarmCurrents->SetCellValue(rowNumber, 1, busData.name);
1129 for (
auto& order : data.harmonicOrder) {
1130 m_gridHarmCurrents->SetCellValue(rowNumber, 2, wxString::Format(wxT(
"%d%s"), order, wxString(L
'\u00BA')));
1131 double kCurrent = 1.0;
1132 if (m_gridHarmCurrents->GetCellValue(0, 3) == m_currentChoices[1]) {
1135 else if (m_gridHarmCurrents->GetCellValue(0, 3) == m_currentChoices[2]) {
1136 kCurrent = ib / 1e3;
1138 m_gridHarmCurrents->SetCellValue(rowNumber, 3, hCurrent->StringFromDouble(data.injHarmCurrent[i] * kCurrent, 0, m_precision));
1139 m_gridHarmCurrents->SetCellValue(rowNumber, 4, hCurrent->StringFromDouble(data.injHarmAngle[i], 0, m_precision) + wxString(L
'\u00B0'));
1145 auto data = hCurrent->GetElectricalData();
1146 m_gridHarmCurrents->SetCellSize(rowNumber, 0, data.harmonicOrder.size(), 1);
1147 m_gridHarmCurrents->SetCellValue(rowNumber, 0, data.name);
1148 m_gridHarmCurrents->SetCellSize(rowNumber, 1, data.harmonicOrder.size(), 1);
1149 m_gridHarmCurrents->SetCellValue(rowNumber, 1,
"-");
1151 for (
auto& order : data.harmonicOrder) {
1152 m_gridHarmCurrents->SetCellValue(rowNumber, 2, wxString::Format(wxT(
"%d%s"), order, wxString(L
'\u00BA')));
1153 m_gridHarmCurrents->SetCellValue(rowNumber, 3,
"?");
1154 m_gridHarmCurrents->SetCellValue(rowNumber, 4, hCurrent->StringFromDouble(data.injHarmAngle[i], 0, m_precision) + wxString(L
'\u00B0'));
1161 m_gridHarmCurrents->AutoSize();
1162 m_gridHarmCurrents->GetContainingSizer()->Layout();
1166 if (gridToFill == GRID_ALL || gridToFill == GRID_HARMBUSES) {
1168 for (
auto* bus : busList) {
1169 auto data = bus->GetElectricalData();
1170 double vb = bus->GetValueFromUnit(data.nominalVoltage, data.nominalVoltageUnit);
1172 const int harmonicCount =
static_cast<int>(data.harmonicOrder.size());
1173 if (harmonicCount == 0)
1176 m_gridHarmBuses->SetCellSize(rowNumber, 0, harmonicCount, 1);
1177 m_gridHarmBuses->SetCellValue(rowNumber, 0, data.name);
1178 m_gridHarmBuses->SetCellSize(rowNumber, 1, harmonicCount, 1);
1179 m_gridHarmBuses->SetCellValue(rowNumber, 1, bus->
StringFromDouble(data.thd, 0, m_precision) + wxT(
"%"));
1181 for (
auto& order : data.harmonicOrder) {
1182 m_gridHarmBuses->SetCellValue(rowNumber, 2, wxString::Format(wxT(
"%d%s"), order, wxString(L
'\u00BA')));
1183 wxString voltageStr =
"";
1184 if (m_gridHarmBuses->GetCellValue(0, 3) == m_phaseVoltageChoices[0]) {
1185 voltageStr.Printf(wxString::Format(
"%%.%de", m_precision), std::abs(data.harmonicVoltage[i]));
1187 else if (m_gridHarmBuses->GetCellValue(0, 3) == m_phaseVoltageChoices[1]) {
1188 voltageStr = bus->
StringFromDouble(std::abs(data.harmonicVoltage[i]) * vb / sqrt(3.0), 0, m_precision);
1190 else if (m_gridHarmBuses->GetCellValue(0, 3) == m_phaseVoltageChoices[2]) {
1191 voltageStr = bus->
StringFromDouble(std::abs(data.harmonicVoltage[i]) * vb / (sqrt(3.0) * 1e3), 0, m_precision);
1193 m_gridHarmBuses->SetCellValue(rowNumber, 3, voltageStr);
1194 m_gridHarmBuses->SetCellValue(rowNumber, 4, bus->
StringFromDouble(wxRadToDeg(std::arg(data.harmonicVoltage[i])), 0, m_precision) + wxString(L
'\u00B0'));
1200 m_gridHarmBuses->AutoSize();
1201 m_gridHarmBuses->GetContainingSizer()->Layout();
1205 if (gridToFill == GRID_ALL || gridToFill == GRID_HARMBRANCHES) {
1207 for (
auto* line : lineList) {
1208 auto data = line->GetPUElectricalData(basePower);
1210 double vb = line->GetValueFromUnit(data.nominalVoltage, data.nominalVoltageUnit);
1211 double ib = basePower / (std::sqrt(3.0) * vb);
1213 wxString busName1 =
"-";
1215 busName1 =
static_cast<Bus*
>(line->
GetParentList()[0])->GetElectricalData().name;
1216 wxString busName2 =
"-";
1218 busName2 =
static_cast<Bus*
>(line->
GetParentList()[1])->GetElectricalData().name;
1220 wxString isOnline = _(
"Yes");
1221 wxColour textColour = m_gridHarmBranches->GetDefaultCellTextColour();
1224 textColour = m_offlineColour;
1227 const int harmonicCount =
static_cast<int>(data.harmonicOrder.size());
1228 if (harmonicCount == 0)
1231 for (
int side = 0; side < 2; ++side) {
1232 for (
unsigned int i = 0; i < harmonicCount; ++i) {
1233 for (
int j = 0; j < 8; ++j) { m_gridHarmBranches->SetCellTextColour(rowNumber + i, j, textColour); }
1236 m_gridHarmBranches->SetCellSize(rowNumber, 0, harmonicCount, 1);
1237 m_gridHarmBranches->SetCellValue(rowNumber, 0, _(
"Line"));
1238 m_gridHarmBranches->SetCellSize(rowNumber, 1, harmonicCount, 1);
1239 m_gridHarmBranches->SetCellValue(rowNumber, 1, data.name);
1240 m_gridHarmBranches->SetCellSize(rowNumber, 2, harmonicCount, 1);
1241 m_gridHarmBranches->SetCellValue(rowNumber, 2, side == 0 ? busName1 : busName2);
1242 m_gridHarmBranches->SetCellSize(rowNumber, 3, harmonicCount, 1);
1243 m_gridHarmBranches->SetCellValue(rowNumber, 3, side == 0 ? busName2 : busName1);
1244 m_gridHarmBranches->SetCellSize(rowNumber, 7, harmonicCount, 1);
1245 m_gridHarmBranches->SetCellValue(rowNumber, 7, isOnline);
1248 for (
auto& order : data.harmonicOrder) {
1249 m_gridHarmBranches->SetCellValue(rowNumber, 4, wxString::Format(wxT(
"%d%s"), order, wxString(L
'\u00BA')));
1250 wxString currentStr =
"";
1251 wxString angleStr =
"";
1253 if (m_gridHarmBranches->GetCellValue(0, 5) == m_currentChoices[0]) {
1254 currentStr.Printf(wxString::Format(
"%%.%de", m_precision), std::abs(data.harmonicCurrent[side][i]));
1256 else if (m_gridHarmBranches->GetCellValue(0, 5) == m_currentChoices[1]) {
1257 currentStr = line->
StringFromDouble(std::abs(data.harmonicCurrent[side][i]) * ib, 0, m_precision);
1259 else if (m_gridHarmBranches->GetCellValue(0, 5) == m_currentChoices[2]) {
1260 currentStr = line->
StringFromDouble(std::abs(data.harmonicCurrent[side][i]) * ib / 1e3, 0, m_precision);
1262 angleStr = line->
StringFromDouble(wxRadToDeg(std::arg(data.harmonicCurrent[side][i])), 0, m_precision) + wxString(L
'\u00B0');
1269 m_gridHarmBranches->SetCellValue(rowNumber, 5, currentStr);
1270 m_gridHarmBranches->SetCellValue(rowNumber, 6, angleStr);
1278 for (
auto* transformer : transformerList) {
1279 auto data = transformer->GetPUElectricalData(basePower);
1281 double vb = transformer->GetValueFromUnit(data.primaryNominalVoltage, data.primaryNominalVoltageUnit);
1282 double ibp = basePower / (std::sqrt(3.0) * vb);
1283 vb = transformer->GetValueFromUnit(data.secondaryNominalVoltage, data.secondaryNominalVoltageUnit);
1284 double ibs = basePower / (std::sqrt(3.0) * vb);
1286 wxString busName1 =
"-";
1288 busName1 =
static_cast<Bus*
>(transformer->
GetParentList()[0])->GetElectricalData().name;
1289 wxString busName2 =
"-";
1291 busName2 =
static_cast<Bus*
>(transformer->
GetParentList()[1])->GetElectricalData().name;
1293 wxString isOnline = _(
"Yes");
1294 wxColour textColour = m_gridHarmBranches->GetDefaultCellTextColour();
1297 textColour = m_offlineColour;
1300 const int harmonicCount =
static_cast<int>(data.harmonicOrder.size());
1301 if (harmonicCount == 0)
1304 for (
int side = 0; side < 2; ++side) {
1305 for (
unsigned int i = 0; i < harmonicCount; ++i) {
1306 for (
int j = 0; j < 8; ++j) { m_gridHarmBranches->SetCellTextColour(rowNumber + i, j, textColour); }
1308 double ib = side == 0 ? ibp : ibs;
1310 m_gridHarmBranches->SetCellSize(rowNumber, 0, harmonicCount, 1);
1311 m_gridHarmBranches->SetCellValue(rowNumber, 0, _(
"Transformer"));
1312 m_gridHarmBranches->SetCellSize(rowNumber, 1, harmonicCount, 1);
1313 m_gridHarmBranches->SetCellValue(rowNumber, 1, data.name);
1314 m_gridHarmBranches->SetCellSize(rowNumber, 2, harmonicCount, 1);
1315 m_gridHarmBranches->SetCellValue(rowNumber, 2, side == 0 ? busName1 : busName2);
1316 m_gridHarmBranches->SetCellSize(rowNumber, 3, harmonicCount, 1);
1317 m_gridHarmBranches->SetCellValue(rowNumber, 3, side == 0 ? busName2 : busName1);
1318 m_gridHarmBranches->SetCellSize(rowNumber, 7, harmonicCount, 1);
1319 m_gridHarmBranches->SetCellValue(rowNumber, 7, isOnline);
1322 for (
auto& order : data.harmonicOrder) {
1323 m_gridHarmBranches->SetCellValue(rowNumber, 4, wxString::Format(wxT(
"%d%s"), order, wxString(L
'\u00BA')));
1324 wxString currentStr =
"";
1325 wxString angleStr =
"";
1327 if (m_gridHarmBranches->GetCellValue(0, 5) == m_currentChoices[0]) {
1328 currentStr.Printf(wxString::Format(
"%%.%de", m_precision), std::abs(data.harmonicCurrent[side][i]));
1330 else if (m_gridHarmBranches->GetCellValue(0, 5) == m_currentChoices[1]) {
1331 currentStr = transformer->
StringFromDouble(std::abs(data.harmonicCurrent[side][i]) * ib, 0, m_precision);
1333 else if (m_gridHarmBranches->GetCellValue(0, 5) == m_currentChoices[2]) {
1334 currentStr = transformer->
StringFromDouble(std::abs(data.harmonicCurrent[side][i]) * ib / 1e3, 0, m_precision);
1336 angleStr = transformer->
StringFromDouble(wxRadToDeg(std::arg(data.harmonicCurrent[side][i])), 0, m_precision) + wxString(L
'\u00B0');
1343 m_gridHarmBranches->SetCellValue(rowNumber, 5, currentStr);
1344 m_gridHarmBranches->SetCellValue(rowNumber, 6, angleStr);
1352 m_gridHarmBranches->AutoSize();
1353 m_gridHarmBranches->GetContainingSizer()->Layout();
1356 m_changingValues =
false;
1374void DataReport::SetRowsColours(wxGrid* grid,
int rowStart,
int colStart,
int colEndTrim)
1376 for (
int i = rowStart; i < grid->GetNumberRows(); ++i)
1379 ((i - rowStart) % 2 == 0) ?
1383 for (
int j = colStart; j < (grid->GetNumberCols() - colEndTrim); ++j)
1385 wxGridCellAttr* attr =
new wxGridCellAttr;
1387 attr->SetBackgroundColour(colour);
1389 grid->SetAttr(i, j, attr);
1394void DataReport::OnPFBusGridChanged(wxGridEvent& event)
1396 if (!m_changingValues) FillValues(GRID_PFBUSES);
1398void DataReport::OnFaulrGridChanged(wxGridEvent& event)
1400 if (!m_changingValues) FillValues(GRID_FAULT);
1402void DataReport::OnFaultBranchesGridChanged(wxGridEvent& event)
1404 if (!m_changingValues) FillValues(GRID_FAULTBRANCHES);
1406void DataReport::OnFaultBusesGridChanged(wxGridEvent& event)
1408 if (!m_changingValues) FillValues(GRID_FAULTBUSES);
1410void DataReport::OnFaultGeneratorsGridChanged(wxGridEvent& event)
1412 if (!m_changingValues) FillValues(GRID_FAULTGENERATORS);
1414void DataReport::OnPFBranchesGridChanged(wxGridEvent& event)
1416 if (!m_changingValues) FillValues(GRID_PFBRANCHES);
1418void DataReport::OnPowerFlowGridChanged(wxGridEvent& event)
1420 if (!m_changingValues) FillValues(GRID_PF);
1423void DataReport::GridKeyHandler(wxGrid* grid, wxKeyEvent& event)
1425 if (event.GetKeyCode() ==
'C' && event.GetModifiers() == wxMOD_CONTROL) {
1427 wxString copyData =
"";
1430 for (
int i = 0; i < grid->GetNumberRows(); i++) {
1431 lineNotEmpty =
false;
1432 for (
int j = 0; j < grid->GetNumberCols(); j++) {
1433 if (grid->IsInSelection(i, j)) {
1434 if (lineNotEmpty ==
false) {
1435 if (copyData.IsEmpty() ==
false) {
1436 copyData.Append(wxT(
"\r\n"));
1438 lineNotEmpty =
true;
1441 copyData.Append(wxT(
"\t"));
1443 copyData = copyData + grid->GetCellValue(i, j);
1448 if (wxTheClipboard->Open())
1450 wxTheClipboard->SetData(
new wxTextDataObject(copyData));
1451 wxTheClipboard->Close();
1454 else if (event.GetKeyCode() ==
'A' && event.GetModifiers() == wxMOD_CONTROL) {
1459void DataReport::UpdateFontSize()
1461 wxFont font = m_gridPowerFlow->GetFont();
1462 font.SetPointSize(m_fontSize);
1464 wxFont headerFont = font;
1465 headerFont.SetWeight(wxFONTWEIGHT_BOLD);
1467 wxGrid* grids[] = { m_gridPowerFlow, m_gridPFBuses, m_gridPFBranches, m_gridFault, m_gridFaultBuses, m_gridFaultBranches, m_gridFaultGenerators, m_gridHarmCurrents, m_gridHarmBuses, m_gridHarmBranches };
1469 for (
auto* grid : grids) {
1470 grid->SetLabelFont(headerFont);
1471 grid->SetDefaultCellFont(font);
1473 for (
int col = 0; col < grid->GetNumberCols(); ++col) {
1474 grid->SetCellFont(0, col, headerFont);
1475 if (grid == m_gridFault ||
1476 grid == m_gridFaultBuses ||
1477 grid == m_gridFaultBranches ||
1478 grid == m_gridFaultGenerators)
1480 grid->SetCellFont(1, col, headerFont);
1483 grid->SetFont(font);
1485 grid->GetContainingSizer()->Layout();
1486 grid->ForceRefresh();
1490void DataReport::UpdateCurrentGrid()
1492 int mainSlection = m_notebookDataReport->GetSelection();
1493 if (mainSlection != wxNOT_FOUND) {
1494 switch (mainSlection) {
1497 int selection = m_notebookPowerFlow->GetSelection();
1498 if (selection == 0) {
1499 m_currentGrid = m_gridPowerFlow;
1501 else if (selection == 1) {
1502 m_currentGrid = m_gridPFBuses;
1504 else if (selection == 2) {
1505 m_currentGrid = m_gridPFBranches;
1511 int selection = m_notebookFault->GetSelection();
1512 if (selection == 0) {
1513 m_currentGrid = m_gridFault;
1515 else if (selection == 1) {
1516 m_currentGrid = m_gridFaultBuses;
1518 else if (selection == 2) {
1519 m_currentGrid = m_gridFaultBranches;
1521 else if (selection == 3) {
1522 m_currentGrid = m_gridFaultGenerators;
1528 int selection = m_notebookHarmCurrents->GetSelection();
1529 if (selection == 0) {
1530 m_currentGrid = m_gridHarmCurrents;
1532 else if (selection == 1) {
1533 m_currentGrid = m_gridHarmBuses;
1535 else if (selection == 2) {
1536 m_currentGrid = m_gridHarmBranches;
1544void DataReport::OnHarmCurrentGridChanged(wxGridEvent& event)
1546 if (!m_changingValues) FillValues(GRID_HARMCURRENT);
1548void DataReport::OnHarmBusesGridChanged(wxGridEvent& event)
1550 if (!m_changingValues) FillValues(GRID_HARMBUSES);
1552void DataReport::OnHarmBranchesGridChanged(wxGridEvent& event)
1554 if (!m_changingValues) FillValues(GRID_HARMBRANCHES);
1556void DataReport::ClipboardButtonClick(wxCommandEvent& event)
1560 wxGrid* grid = m_currentGrid;
1562 if (grid ==
nullptr) {
1563 wxMessageDialog msgDialog(
this, _(
"Unable to copy to clipboard."), _(
"Error"), wxOK | wxCENTRE | wxICON_ERROR);
1564 msgDialog.ShowModal();
1570 if (grid == m_gridFault ||
1571 grid == m_gridFaultBuses ||
1572 grid == m_gridFaultBranches ||
1573 grid == m_gridFaultGenerators)
1578 html <<
"<table style='border-collapse:collapse; "
1579 "font-family:Segoe UI, Arial, sans-serif; "
1580 "font-size:10pt;'>";
1582 int rows = grid->GetNumberRows();
1583 int cols = grid->GetNumberCols();
1585 for (
int row = 0; row < rows; row++)
1589 for (
int col = 0; col < cols; )
1594 grid->GetCellSize(row, col, &rowspan, &colspan);
1597 if (rowspan == 0 || colspan == 0)
1603 wxString value = grid->GetCellValue(row, col);
1611 for (
int c = 1; c < colspan; c++)
1612 plainText <<
"\t" << value;
1615 wxString escaped = value;
1616 escaped.Replace(
"&",
"&");
1617 escaped.Replace(
"<",
"<");
1618 escaped.Replace(
">",
">");
1620 bool isHeader = (row < headerRows);
1624 html <<
"<th style='"
1625 "border:1px solid #c9d1e6;"
1626 "background-color:#BFDFFF;"
1629 "text-align:center;'";
1632 html <<
" rowspan='" << rowspan <<
"'";
1634 html <<
" colspan='" << colspan <<
"'";
1636 html <<
">" << escaped <<
"</th>";
1640 html <<
"<td style='"
1641 "border:1px solid #c9d1e6;"
1643 "text-align:center;'";
1646 html <<
" rowspan='" << rowspan <<
"'";
1648 html <<
" colspan='" << colspan <<
"'";
1650 html <<
">" << escaped <<
"</td>";
1656 plainText <<
"\r\n";
1663 if (wxTheClipboard->Open())
1665 wxDataObjectComposite* data =
new wxDataObjectComposite();
1667 data->Add(
new wxHTMLDataObject(html));
1668 data->Add(
new wxTextDataObject(plainText));
1670 wxTheClipboard->SetData(data);
1671 wxTheClipboard->Close();
1674 wxMessageDialog msgDialog(
this, _(
"Unable to copy to clipboard."), _(
"Error"), wxOK | wxCENTRE | wxICON_ERROR);
1675 msgDialog.ShowModal();
1678void DataReport::ExportCSVButtonClick(wxCommandEvent& event)
1680 std::vector<wxGrid*> grids = { m_gridPowerFlow, m_gridPFBuses, m_gridPFBranches,
1681 m_gridFault, m_gridFaultBuses, m_gridFaultBranches, m_gridFaultGenerators,
1682 m_gridHarmCurrents, m_gridHarmBuses, m_gridHarmBranches };
1687void DataReport::OnPFNotebookChanged(wxNotebookEvent& event)
1689 UpdateCurrentGrid();
1692void DataReport::OnFaultNotebookChanged(wxNotebookEvent& event)
1694 UpdateCurrentGrid();
1697void DataReport::OnHarmNotebookChanged(wxNotebookEvent& event)
1699 UpdateCurrentGrid();
1702void DataReport::OnMainNotebookChanged(wxNotebookEvent& event)
1704 UpdateCurrentGrid();
1707void DataReport::OnFontSizeSelected(wxCommandEvent& event)
1709 m_fontSize = wxAtoi(m_choiceFontSize->GetStringSelection());
1713void DataReport::OnTextPrecisionUpdate(wxCommandEvent& event)
1715 long precision = m_precision;
1716 if (m_textCtrlPrecision->GetValue().ToLong(&precision)) {
1717 if (precision >= 0) {
1718 m_precision = precision;
1719 FillValues(GRID_ALL);
1724void DataReport::OnMouseWheel(wxMouseEvent& event)
1726 if (event.ControlDown()) {
1727 if (event.GetWheelRotation() > 0) {
1728 size_t newSelection = m_choiceFontSize->GetSelection() + 1;
1729 if (newSelection < m_choiceFontSize->GetCount()) {
1730 m_choiceFontSize->SetSelection(newSelection);
1731 m_fontSize = wxAtoi(m_choiceFontSize->GetStringSelection());
1736 size_t newSelection = m_choiceFontSize->GetSelection() - 1;
1737 if (newSelection >= 0) {
1738 m_choiceFontSize->SetSelection(newSelection);
1739 m_fontSize = wxAtoi(m_choiceFontSize->GetStringSelection());
Node for power elements. All others power elements are connected through this.
Form that shows the results of power flow and fault calculations.
Base class for electrical calculations providing general utility methods.
const std::vector< SyncGenerator * > GetSyncGeneratorList() const
Get the synchronous generators of the system (use GetElementsFromList first).
const std::vector< Transformer * > GetTransformerList() const
Get the transformers of the system (use GetElementsFromList first).
const std::vector< Line * > GetLineList() const
Get the lines of the system (use GetElementsFromList first).
const std::vector< Bus * > GetBusList() const
Get the buses of the system (use GetElementsFromList first).
virtual void GetElementsFromList(std::vector< Element * > elementList)
Separate the power elements from a generic list.
const std::vector< HarmCurrent * > GetHarmCurrentList() const
Get the harmonic current source of the system (use GetElementsFromList first).
virtual std::vector< Element * > GetParentList() const
Get the parent list.
bool IsOnline() const
Checks if the element is online or offline.
static wxString StringFromDouble(double value, int minDecimal=1, int maxDecimals=13)
Convert a double value to string.
Synchronous generator power element.
This class manages the graphical and power elements. It is responsible for handling the user's intera...