Power System Platform  2026w10a-beta
Loading...
Searching...
No Matches
LabelManager.cpp
1#include "LabelManager.h"
2
3#include <wx/msgdlg.h>
4#include <array>
5
6#include "../editors/Workspace.h"
7
8LabelManager::LabelManager(wxWindow* parent, Workspace* workspace)
9 : LabelManagerBase(parent), m_workspace(workspace)
10{
11 std::vector<wxString> branchOptions = { _(L"Name"),
12 _(L"Active power (i → j)"), _(L"Active power (j → i)"),
13 _(L"Rective power (i → j)"), _(L"Rective power (j → i)"),
14 _(L"Losses"),
15 _(L"Current (i → j)"), _(L"Current (j → i)"),
16 _(L"Fault current (i → j)"), _(L"Fault current (j → i)") };
17
18 m_checkListBoxLine->Append(branchOptions);
19 m_checkListBoxTransformer->Append(branchOptions);
20
21 m_textCtrlPrecision->SetValue(wxString::Format("%d", m_precision));
22
23 Layout();
24 SetSize(GetBestSize());
25}
26
27LabelManager::~LabelManager()
28{
29}
30
31void LabelManager::OnCheckListSelected(wxCommandEvent& event)
32{
33 //wxMessageBox(wxString::Format("%d", event.GetId()));
34 UpdatePreview(m_choicebook->GetSelection());
35
36 event.Skip();
37}
38
39void LabelManager::UpdatePreview(int selection)
40{
41 std::vector<wxCheckListBox*> checkListBoxes = { m_checkListBoxBus, m_checkListBoxGenerator,
42 m_checkListBoxLoad, m_checkListBoxLine, m_checkListBoxTransformer, m_checkListBoxCapacitor,
43 m_checkListBoxInductor, m_checkListBoxIndMotor, m_checkListBoxSyncMotor };
44
45 m_richTextCtrlPreview->Clear();
46 for (auto* checkListBox : checkListBoxes) {
47 SetPreviewText(checkListBox);
48 }
49}
50
51wxString LabelManager::GetBusPreviewText(int dataID)
52{
53 switch (dataID)
54 {
55 case 0: { // Name
56 return _("Bus 1\n");
57 } break;
58 case 1: { // Voltage
59 switch (m_radioBoxVoltage->GetSelection())
60 {
61 case 0: {
62 return wxString::Format("%.*f p.u.\n", m_precision, 1.0);
63 } break;
64 case 1: {
65 return wxString::Format("%.*f V\n", m_precision, 13800.0);
66 } break;
67 case 2: {
68 return wxString::Format("%.*f kV\n", m_precision, 13.8);
69 } break;
70 default:
71 break;
72 }
73 } break;
74 case 2: { // Angle
75 switch (m_radioBoxAngle->GetSelection())
76 {
77 case 0: {
78 return wxString::Format("%.*f°\n", m_precision, 30.0);
79 } break;
80 case 1: {
81 return wxString::Format("%.*f rad\n", m_precision, 0.5235987756);
82 } break;
83 default:
84 break;
85 }
86 } break;
87 case 3: { // Fault current
88 return GetCurrent3fText({ 25.54, 0.0, 0.0 });
89 } break;
90 case 4: { // Fault voltage
91 switch (m_radioBoxVoltage->GetSelection())
92 {
93 case 0: {
94 return wxString::Format("Va = %.*f p.u.\t Vb = %.*f p.u.\t Vc = %.*f p.u.\n", m_precision, 0.0, m_precision, 1.0404, m_precision, 1.0246);
95 } break;
96 case 1: {
97 return wxString::Format("Va = %.*f V\t Vb = %.*f V\t Vc = %.*f V\n", m_precision, 0.0, m_precision, 14356.91, m_precision, 14140.11);
98 } break;
99 case 2: {
100 return wxString::Format("Va = %.*f kV\t Vb = %.*f kV\t Vc = %.*f kV\n", m_precision, 0.0, m_precision, 14.35691, m_precision, 14.14011);
101 } break;
102 default:
103 break;
104 }
105 } break;
106 case 5: { // Short-circuit power
107 return GetPowerText(_("VA"), 5.0);
108 } break;
109 case 6: { // Voltage THD
110 return wxString::Format(_("THD = %.*f%%\n"), m_precision, 5.36);
111 } break;
112 default:
113 break;
114 }
115 return wxString();
116}
117
118wxString LabelManager::GetGeneratorPreviewText(int dataID)
119{
120 switch (dataID)
121 {
122 case 0: { // Name
123 return _("Generator 1\n");
124 } break;
125 case 1: { // Active power
126 return GetPowerText(_("W"), 1.0);
127 } break;
128 case 2: { // Reactive power
129 return GetPowerText(_("var"), 0.3);
130 } break;
131 case 3: { // Fault current
132 return GetCurrent3fText({ 22.54, 0.0, 0.0 });
133 } break;
134 default:
135 break;
136 }
137 return wxString();
138}
139
140wxString LabelManager::GetPowerText(wxString unit, double puValue)
141{
142 switch (m_radioBoxPower->GetSelection()) {
143 case 0: {
144 return wxString::Format("%.*f p.u.\n", m_precision, puValue);
145 } break;
146 case 1: {
147 return wxString::Format("%.*f %s\n", m_precision, puValue * 1.0e8, unit);
148 } break;
149 case 2: {
150 return wxString::Format("%.*f k%s\n", m_precision, puValue * 1.0e5, unit);
151 } break;
152 case 3: {
153 return wxString::Format("%.*f M%s\n", m_precision, puValue * 1.0e2, unit);
154 } break;
155 default:
156 break;
157 }
158 return wxString();
159}
160
161wxString LabelManager::GetCurrent3fText(const std::array<double, 3>& puCurrents)
162{
163 switch (m_radioBoxCurrent->GetSelection())
164 {
165 case 0: {
166 return wxString::Format("Ia = %.*f p.u.\t Ib = %.*f p.u.\t Ic = %.*f p.u.\n", m_precision, puCurrents[0], m_precision, puCurrents[1], m_precision, puCurrents[2]);
167 } break;
168 case 1: {
169 return wxString::Format("Ia = %.*f A\t Ib = %.*f A\t Ic = %.*f A\n", m_precision, puCurrents[0] * 1e3, m_precision, puCurrents[1] * 1e3, m_precision, puCurrents[2] * 1e3);
170 } break;
171 case 2: {
172 return wxString::Format("Ia = %.*f kA\t Ib = %.*f kA\t Ic = %.*f kA\n", m_precision, puCurrents[0], m_precision, puCurrents[1], m_precision, puCurrents[2]);
173 } break;
174 default:
175 break;
176 }
177 return wxString();
178}
179
180wxString LabelManager::GetCurrentOrVoltageText(wxString unit, double puValue)
181{
182 if (unit == _("V"))
183 {
184 switch (m_radioBoxVoltage->GetSelection())
185 {
186 case 0: {
187 return wxString::Format("%.*f p.u.\n", m_precision, puValue);
188 } break;
189 case 1: {
190 return wxString::Format("%.*f V\n", m_precision, puValue * 13800.0);
191 } break;
192 case 2: {
193 return wxString::Format("%.*f kV\n", m_precision, puValue * 13.8);
194 } break;
195 default:
196 break;
197 }
198 }
199 else if (unit == _("A"))
200 {
201 switch (m_radioBoxCurrent->GetSelection())
202 {
203 case 0: {
204 return wxString::Format("%.*f p.u.\n", m_precision, puValue);
205 } break;
206 case 1: {
207 return wxString::Format("%.*f A\n", m_precision, puValue * 1e3);
208 } break;
209 case 2: {
210 return wxString::Format("%.*f kA\n", m_precision, puValue);
211 } break;
212 default:
213 break;
214 }
215 }
216
217 return wxString();
218}
219
220void LabelManager::SetPreviewText(wxCheckListBox* checkListBox)
221{
222 int id = checkListBox->GetId();
223 wxString name = "";
224 wxString text = "";
225 wxArrayInt checked;
226 checkListBox->GetCheckedItems(checked);
227 switch (id)
228 {
229 case ID_CL_BUS: {
230 name = _("Bus label");
231 for (int i : checked) {
232 text += GetBusPreviewText(i);
233 }
234 } break;
235 case ID_CL_GENERATOR: {
236 name = _("Generator label");
237 for (int i : checked) {
238 text += GetGeneratorPreviewText(i);
239 }
240 } break;
241 case ID_CL_LOAD: {
242 name = _("Load label");
243 for (int i : checked) {
244 text += GetLoadPreviewText(i);
245 }
246 } break;
247 case ID_CL_LINE: {
248 name = _("Line label");
249 for (int i : checked) {
250 text += GetLinePreviewText(i);
251 }
252 } break;
253 case ID_CL_TRANSFORMER: {
254 name = _("Transformer label");
255 for (int i : checked) {
256 text += GetTransformerPreviewText(i);
257 }
258 } break;
259 case ID_CL_CAPACITOR: {
260 name = _("Capacitor label");
261 for (int i : checked) {
262 text += GetCapacitorPreviewText(i);
263 }
264 } break;
265 case ID_CL_INDUCTOR: {
266 name = _("Inductor label");
267 for (int i : checked) {
268 text += GetInductorPreviewText(i);
269 }
270 } break;
271 case ID_CL_INDMOTOR: {
272 name = _("Induction motor label");
273 for (int i : checked) {
274 text += GetIndMotorPreviewText(i);
275 }
276 } break;
277 case ID_CL_SYNCMOTOR: {
278 name = _("Synchronous motor label");
279 for (int i : checked) {
280 text += GetSyncMotorPreviewText(i);
281 }
282 } break;
283 default:
284 break;
285 }
286
287 if (!checked.IsEmpty()) {
288 m_richTextCtrlPreview->BeginUnderline();
289 m_richTextCtrlPreview->BeginBold();
290 m_richTextCtrlPreview->WriteText(name);
291 m_richTextCtrlPreview->EndBold();
292 m_richTextCtrlPreview->EndUnderline();
293 m_richTextCtrlPreview->Newline();
294 m_richTextCtrlPreview->BeginLeftIndent(60);
295 m_richTextCtrlPreview->WriteText(text);
296 m_richTextCtrlPreview->EndLeftIndent();
297 m_richTextCtrlPreview->Newline();
298 }
299}
300
301wxString LabelManager::GetLoadPreviewText(int dataID)
302{
303 switch (dataID)
304 {
305 case 0: { // Name
306 return _("Load 1\n");
307 } break;
308 case 1: { // Active power
309 return GetPowerText(_("W"), 1.0);
310 } break;
311 case 2: { // Reactive power
312 return GetPowerText(_("var"), 0.3);
313 } break;
314 return wxString();
315 default:
316 break;
317 }
318 return wxString();
319}
320
321wxString LabelManager::GetLinePreviewText(int dataID)
322{
323 switch (dataID)
324 {
325 case 0: { // Name
326 return _("Line 1\n");
327 } break;
328 case 1: { // Active power (i → j)
329 return GetPowerText(_("W"), 1.0);
330 } break;
331 case 2: { // Active power (j → i)
332 return GetPowerText(_("W"), -1.0);
333 } break;
334 case 3: { // Reactive power (i → j)
335 return GetPowerText(_("var"), 0.3);
336 } break;
337 case 4: { // Reactive power (j → i)
338 return GetPowerText(_("var"), -0.3);
339 } break;
340 case 5: { // Losses
341 return GetPowerText(_("W"), 0.02);
342 } break;
343 case 6: { // Current (i → j)
344 return GetCurrentOrVoltageText(_("A"), 0.5);
345 } break;
346 case 7: { // Current (j → i)
347 return GetCurrentOrVoltageText(_("A"), -0.5);
348 } break;
349 case 8: { // Fault current (i → j)
350 return GetCurrent3fText({ 25.56, 0.0, 0.0 });
351 } break;
352 case 9: { // Fault current (j → i)
353 return GetCurrent3fText({ -25.56, 0.0, 0.0 });
354 } break;
355 default:
356 break;
357 }
358 return wxString();
359}
360
361wxString LabelManager::GetTransformerPreviewText(int dataID)
362{
363 switch (dataID)
364 {
365 case 0: { // Name
366 return _("Transformer 1\n");
367 } break;
368 case 1: { // Active power (i → j)
369 return GetPowerText(_("W"), 1.0);
370 } break;
371 case 2: { // Active power (j → i)
372 return GetPowerText(_("W"), -1.0);
373 } break;
374 case 3: { // Reactive power (i → j)
375 return GetPowerText(_("var"), 0.3);
376 } break;
377 case 4: { // Reactive power (j → i)
378 return GetPowerText(_("var"), -0.3);
379 } break;
380 case 5: { // Losses
381 return GetPowerText(_("W"), 0.02);
382 } break;
383 case 6: { // Current (i → j)
384 return GetCurrentOrVoltageText(_("A"), 0.5);
385 } break;
386 case 7: { // Current (j → i)
387 return GetCurrentOrVoltageText(_("A"), -0.5);
388 } break;
389 case 8: { // Fault current (i → j)
390 return GetCurrent3fText({ 25.56, 0.0, 0.0 });
391 } break;
392 case 9: { // Fault current (j → i)
393 return GetCurrent3fText({ -25.56, 0.0, 0.0 });
394 } break;
395 default:
396 break;
397 }
398 return wxString();
399}
400
401wxString LabelManager::GetCapacitorPreviewText(int dataID)
402{
403 switch (dataID)
404 {
405 case 0: { // Name
406 return _("Capacitor 1\n");
407 } break;
408 case 1: { // Reactive power
409 return GetPowerText(_("var"), 1.0);
410 } break;
411 return wxString();
412 default:
413 break;
414 }
415 return wxString();
416}
417
418wxString LabelManager::GetInductorPreviewText(int dataID)
419{
420 switch (dataID)
421 {
422 case 0: { // Name
423 return _("Inductor 1\n");
424 } break;
425 case 1: { // Reactive power
426 return GetPowerText(_("var"), 1.0);
427 } break;
428 return wxString();
429 default:
430 break;
431 }
432 return wxString();
433}
434
435wxString LabelManager::GetIndMotorPreviewText(int dataID)
436{
437 switch (dataID)
438 {
439 case 0: { // Name
440 return _("Induction Motor 1\n");
441 } break;
442 case 1: { // Active power
443 return GetPowerText(_("W"), 1.0);
444 } break;
445 case 2: { // Reactive power
446 return GetPowerText(_("var"), 0.3);
447 } break;
448 return wxString();
449 default:
450 break;
451 }
452 return wxString();
453}
454
455wxString LabelManager::GetSyncMotorPreviewText(int dataID)
456{
457 switch (dataID)
458 {
459 case 0: { // Name
460 return _("Synchronous Compensator 1\n");
461 } break;
462 case 1: { // Active power
463 return GetPowerText(_("W"), 0.01);
464 } break;
465 case 2: { // Reactive power
466 return GetPowerText(_("var"), 1.0);
467 } break;
468 return wxString();
469 default:
470 break;
471 }
472 return wxString();
473}
474
475void LabelManager::OnChoicebookChanged(wxChoicebookEvent& event)
476{
477 UpdatePreview(m_choicebook->GetSelection());
478 event.Skip();
479}
480
481void LabelManager::OnUnitChanged(wxCommandEvent& event)
482{
483 UpdatePreview(m_choicebook->GetSelection());
484 event.Skip();
485}
486
487void LabelManager::OnPrecisionTextUpdate(wxCommandEvent& event)
488{
489 long precision;
490 if (m_textCtrlPrecision->GetValue().ToLong(&precision) && precision >= 0) {
491 m_precision = static_cast<size_t>(precision);
492 UpdatePreview(m_choicebook->GetSelection());
493 }
494 event.Skip();
495}
496
497void LabelManager::OnApplyButtonClick(wxCommandEvent& event)
498{
499 if (m_checkBoxReplace->GetValue()) {
500 m_workspace->RemoveAllTextElements();
501 }
508
509 ElectricalUnit voltageUnit = voltageUnitList[m_radioBoxVoltage->GetSelection()];
510 ElectricalUnit currentUnit = currentUnitList[m_radioBoxCurrent->GetSelection()];
511 ElectricalUnit sUnit = sUnitList[m_radioBoxPower->GetSelection()];
512 ElectricalUnit pUnit = pUnitList[m_radioBoxPower->GetSelection()];
513 ElectricalUnit qUnit = qUnitList[m_radioBoxPower->GetSelection()];
514 ElectricalUnit angleUnit = angleUnitList[m_radioBoxAngle->GetSelection()];
515
516 auto elementList = m_workspace->GetElementList();
517 int numTxtElements = 0;
518 for (auto* element : elementList) {
519 ElementType elementType = element->GetElementType();
520 wxArrayInt checked;
521 switch (elementType)
522 {
523 case TYPE_BUS: {
524 TextID textOptions[7] = { ID_TXT_NAME, ID_TXT_VOLTAGE, ID_TXT_ANGLE, ID_TXT_FAULTCURRENT, ID_TXT_FAULTVOLTAGE, ID_TXT_SCC, ID_TXT_THD };
525 ElectricalUnit textUnits[7] = { ElectricalUnit::UNIT_NONE, voltageUnit, angleUnit, currentUnit, voltageUnit, sUnit, ElectricalUnit::UNIT_NONE };
526 m_checkListBoxBus->GetCheckedItems(checked);
527 for (int i : checked) {
528 m_workspace->InsertTextElement(textOptions[i], element, textUnits[i], m_precision);
529 numTxtElements++;
530 }
531 } break;
532 case TYPE_CAPACITOR: {
533 TextID textOptions[2] = { ID_TXT_NAME, ID_TXT_REACTIVE_POWER };
534 ElectricalUnit textUnits[2] = { ElectricalUnit::UNIT_NONE, qUnit };
535 m_checkListBoxCapacitor->GetCheckedItems(checked);
536 for (int i : checked) {
537 m_workspace->InsertTextElement(textOptions[i], element, textUnits[i], m_precision);
538 numTxtElements++;
539 }
540 } break;
541 case TYPE_IND_MOTOR: {
542 TextID textOptions[3] = { ID_TXT_NAME, ID_TXT_ACTIVE_POWER, ID_TXT_REACTIVE_POWER };
543 ElectricalUnit textUnits[3] = { ElectricalUnit::UNIT_NONE, pUnit, qUnit };
544 m_checkListBoxIndMotor->GetCheckedItems(checked);
545 for (int i : checked) {
546 m_workspace->InsertTextElement(textOptions[i], element, textUnits[i], m_precision);
547 numTxtElements++;
548 }
549 } break;
550 case TYPE_INDUCTOR: {
551 TextID textOptions[2] = { ID_TXT_NAME, ID_TXT_REACTIVE_POWER };
552 ElectricalUnit textUnits[2] = { ElectricalUnit::UNIT_NONE, qUnit };
553 m_checkListBoxInductor->GetCheckedItems(checked);
554 for (int i : checked) {
555 m_workspace->InsertTextElement(textOptions[i], element, textUnits[i], m_precision);
556 numTxtElements++;
557 }
558 } break;
559 case TYPE_LINE: {
560 TextID lineTextOptions[10] = { ID_TXT_NAME, ID_TXT_BRANCH_ACTIVE_POWER_1_2, ID_TXT_BRANCH_ACTIVE_POWER_2_1,
561 ID_TXT_BRANCH_REACTIVE_POWER_1_2, ID_TXT_BRANCH_REACTIVE_POWER_2_1, ID_TXT_BRANCH_LOSSES,
562 ID_TXT_BRANCH_CURRENT_1_2, ID_TXT_BRANCH_CURRENT_2_1, ID_TXT_BRANCH_FAULT_CURRENT_1_2, ID_TXT_BRANCH_FAULT_CURRENT_2_1 };
563 ElectricalUnit textUnits[10] = { ElectricalUnit::UNIT_NONE, pUnit, pUnit, qUnit, qUnit, pUnit, currentUnit, currentUnit, currentUnit, currentUnit };
564 m_checkListBoxLine->GetCheckedItems(checked);
565 for (int i : checked) {
566 m_workspace->InsertTextElement(lineTextOptions[i], element, textUnits[i], m_precision);
567 numTxtElements++;
568 }
569 } break;
570 case TYPE_LOAD: {
571 TextID textOptions[3] = { ID_TXT_NAME, ID_TXT_ACTIVE_POWER, ID_TXT_REACTIVE_POWER };
572 ElectricalUnit textUnits[3] = { ElectricalUnit::UNIT_NONE, pUnit, qUnit };
573 m_checkListBoxLoad->GetCheckedItems(checked);
574 for (int i : checked) {
575 m_workspace->InsertTextElement(textOptions[i], element, textUnits[i], m_precision);
576 numTxtElements++;
577 }
578 } break;
579 case TYPE_SYNC_GENERATOR: {
580 TextID textOptions[4] = { ID_TXT_NAME, ID_TXT_ACTIVE_POWER, ID_TXT_REACTIVE_POWER, ID_TXT_FAULTCURRENT };
581 ElectricalUnit textUnits[4] = { ElectricalUnit::UNIT_NONE, pUnit, qUnit, currentUnit };
582 m_checkListBoxGenerator->GetCheckedItems(checked);
583 for (int i : checked) {
584 m_workspace->InsertTextElement(textOptions[i], element, textUnits[i], m_precision);
585 numTxtElements++;
586 }
587 } break;
588 case TYPE_SYNC_MOTOR: {
589 TextID textOptions[3] = { ID_TXT_NAME, ID_TXT_ACTIVE_POWER, ID_TXT_REACTIVE_POWER };
590 ElectricalUnit textUnits[3] = { ElectricalUnit::UNIT_NONE, pUnit, qUnit };
591 m_checkListBoxSyncMotor->GetCheckedItems(checked);
592 for (int i : checked) {
593 m_workspace->InsertTextElement(textOptions[i], element, textUnits[i], m_precision);
594 numTxtElements++;
595 }
596 } break;
597 case TYPE_TRANSFORMER: {
598 TextID lineTextOptions[10] = { ID_TXT_NAME, ID_TXT_BRANCH_ACTIVE_POWER_1_2, ID_TXT_BRANCH_ACTIVE_POWER_2_1,
599 ID_TXT_BRANCH_REACTIVE_POWER_1_2, ID_TXT_BRANCH_REACTIVE_POWER_2_1, ID_TXT_BRANCH_LOSSES,
600 ID_TXT_BRANCH_CURRENT_1_2, ID_TXT_BRANCH_CURRENT_2_1, ID_TXT_BRANCH_FAULT_CURRENT_1_2, ID_TXT_BRANCH_FAULT_CURRENT_2_1 };
601 ElectricalUnit textUnits[10] = { ElectricalUnit::UNIT_NONE, pUnit, pUnit, qUnit, qUnit, pUnit, currentUnit, currentUnit, currentUnit, currentUnit };
602 m_checkListBoxTransformer->GetCheckedItems(checked);
603 for (int i : checked) {
604 m_workspace->InsertTextElement(lineTextOptions[i], element, textUnits[i], m_precision);
605 numTxtElements++;
606 }
607 } break;
608 default:
609 break;
610 }
611 }
612 if (numTxtElements != 0) {
613 m_workspace->SaveCurrentState();
614 m_workspace->UpdateTextElements();
615 }
616 EndModal(wxID_OK);
617}
618
619void LabelManager::OnCancelButtonClick(wxCommandEvent& event)
620{
621 EndModal(wxID_CANCEL);
622}
ElectricalUnit
Electrical units.
This class manages the graphical and power elements. It is responsible for handling the user's intera...
Definition Workspace.h:103