1#include "LabelManager.h"
6#include "../editors/Workspace.h"
8LabelManager::LabelManager(wxWindow* parent,
Workspace* workspace)
9 : LabelManagerBase(parent), m_workspace(workspace)
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)"),
15 _(L
"Current (i → j)"), _(L
"Current (j → i)"),
16 _(L
"Fault current (i → j)"), _(L
"Fault current (j → i)") };
18 m_checkListBoxLine->Append(branchOptions);
19 std::vector<wxString> transformerOptions = branchOptions;
20 transformerOptions.push_back(_(L
"Tap"));
21 m_checkListBoxTransformer->Append(transformerOptions);
23 m_textCtrlPrecision->SetValue(wxString::Format(
"%d", m_precision));
26 SetSize(GetBestSize());
29LabelManager::~LabelManager()
33void LabelManager::OnCheckListSelected(wxCommandEvent& event)
36 UpdatePreview(m_choicebook->GetSelection());
41void LabelManager::UpdatePreview(
int selection)
43 std::vector<wxCheckListBox*> checkListBoxes = { m_checkListBoxBus, m_checkListBoxGenerator,
44 m_checkListBoxLoad, m_checkListBoxLine, m_checkListBoxTransformer, m_checkListBoxCapacitor,
45 m_checkListBoxInductor, m_checkListBoxIndMotor, m_checkListBoxSyncMotor };
47 m_richTextCtrlPreview->Clear();
48 for (
auto* checkListBox : checkListBoxes) {
49 SetPreviewText(checkListBox);
53wxString LabelManager::GetBusPreviewText(
int dataID)
61 switch (m_radioBoxVoltage->GetSelection())
64 return wxString::Format(
"%.*f p.u.\n", m_precision, 1.0);
67 return wxString::Format(
"%.*f V\n", m_precision, 13800.0);
70 return wxString::Format(
"%.*f kV\n", m_precision, 13.8);
77 switch (m_radioBoxAngle->GetSelection())
80 return wxString::Format(
"%.*f°\n", m_precision, 30.0);
83 return wxString::Format(
"%.*f rad\n", m_precision, 0.5235987756);
90 return GetCurrent3fText({ 25.54, 0.0, 0.0 });
93 switch (m_radioBoxVoltage->GetSelection())
96 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);
99 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);
102 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);
109 return GetPowerText(_(
"VA"), 5.0);
112 return wxString::Format(_(
"THD = %.*f%%\n"), m_precision, 5.36);
120wxString LabelManager::GetGeneratorPreviewText(
int dataID)
125 return _(
"Generator 1\n");
128 return GetPowerText(_(
"W"), 1.0);
131 return GetPowerText(_(
"var"), 0.3);
134 return GetCurrent3fText({ 22.54, 0.0, 0.0 });
142wxString LabelManager::GetPowerText(wxString unit,
double puValue)
144 switch (m_radioBoxPower->GetSelection()) {
146 return wxString::Format(
"%.*f p.u.\n", m_precision, puValue);
149 return wxString::Format(
"%.*f %s\n", m_precision, puValue * 1.0e8, unit);
152 return wxString::Format(
"%.*f k%s\n", m_precision, puValue * 1.0e5, unit);
155 return wxString::Format(
"%.*f M%s\n", m_precision, puValue * 1.0e2, unit);
163wxString LabelManager::GetCurrent3fText(
const std::array<double, 3>& puCurrents)
165 switch (m_radioBoxCurrent->GetSelection())
168 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]);
171 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);
174 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]);
182wxString LabelManager::GetCurrentOrVoltageText(wxString unit,
double puValue)
186 switch (m_radioBoxVoltage->GetSelection())
189 return wxString::Format(
"%.*f p.u.\n", m_precision, puValue);
192 return wxString::Format(
"%.*f V\n", m_precision, puValue * 13800.0);
195 return wxString::Format(
"%.*f kV\n", m_precision, puValue * 13.8);
201 else if (unit == _(
"A"))
203 switch (m_radioBoxCurrent->GetSelection())
206 return wxString::Format(
"%.*f p.u.\n", m_precision, puValue);
209 return wxString::Format(
"%.*f A\n", m_precision, puValue * 1e3);
212 return wxString::Format(
"%.*f kA\n", m_precision, puValue);
222void LabelManager::SetPreviewText(wxCheckListBox* checkListBox)
224 int id = checkListBox->GetId();
228 checkListBox->GetCheckedItems(checked);
232 name = _(
"Bus label");
233 for (
int i : checked) {
234 text += GetBusPreviewText(i);
237 case ID_CL_GENERATOR: {
238 name = _(
"Generator label");
239 for (
int i : checked) {
240 text += GetGeneratorPreviewText(i);
244 name = _(
"Load label");
245 for (
int i : checked) {
246 text += GetLoadPreviewText(i);
250 name = _(
"Line label");
251 for (
int i : checked) {
252 text += GetLinePreviewText(i);
255 case ID_CL_TRANSFORMER: {
256 name = _(
"Transformer label");
257 for (
int i : checked) {
258 text += GetTransformerPreviewText(i);
261 case ID_CL_CAPACITOR: {
262 name = _(
"Capacitor label");
263 for (
int i : checked) {
264 text += GetCapacitorPreviewText(i);
267 case ID_CL_INDUCTOR: {
268 name = _(
"Inductor label");
269 for (
int i : checked) {
270 text += GetInductorPreviewText(i);
273 case ID_CL_INDMOTOR: {
274 name = _(
"Induction motor label");
275 for (
int i : checked) {
276 text += GetIndMotorPreviewText(i);
279 case ID_CL_SYNCMOTOR: {
280 name = _(
"Synchronous motor label");
281 for (
int i : checked) {
282 text += GetSyncMotorPreviewText(i);
289 if (!checked.IsEmpty()) {
290 m_richTextCtrlPreview->BeginUnderline();
291 m_richTextCtrlPreview->BeginBold();
292 m_richTextCtrlPreview->WriteText(name);
293 m_richTextCtrlPreview->EndBold();
294 m_richTextCtrlPreview->EndUnderline();
295 m_richTextCtrlPreview->Newline();
296 m_richTextCtrlPreview->BeginLeftIndent(60);
297 m_richTextCtrlPreview->WriteText(text);
298 m_richTextCtrlPreview->EndLeftIndent();
299 m_richTextCtrlPreview->Newline();
303wxString LabelManager::GetLoadPreviewText(
int dataID)
308 return _(
"Load 1\n");
311 return GetPowerText(_(
"W"), 1.0);
314 return GetPowerText(_(
"var"), 0.3);
323wxString LabelManager::GetLinePreviewText(
int dataID)
328 return _(
"Line 1\n");
331 return GetPowerText(_(
"W"), 1.0);
334 return GetPowerText(_(
"W"), -1.0);
337 return GetPowerText(_(
"var"), 0.3);
340 return GetPowerText(_(
"var"), -0.3);
343 return GetPowerText(_(
"W"), 0.02);
346 return GetCurrentOrVoltageText(_(
"A"), 0.5);
349 return GetCurrentOrVoltageText(_(
"A"), -0.5);
352 return GetCurrent3fText({ 25.56, 0.0, 0.0 });
355 return GetCurrent3fText({ -25.56, 0.0, 0.0 });
363wxString LabelManager::GetTransformerPreviewText(
int dataID)
368 return _(
"Transformer 1\n");
371 return GetPowerText(_(
"W"), 1.0);
374 return GetPowerText(_(
"W"), -1.0);
377 return GetPowerText(_(
"var"), 0.3);
380 return GetPowerText(_(
"var"), -0.3);
383 return GetPowerText(_(
"W"), 0.02);
386 return GetCurrentOrVoltageText(_(
"A"), 0.5);
389 return GetCurrentOrVoltageText(_(
"A"), -0.5);
392 return GetCurrent3fText({ 25.56, 0.0, 0.0 });
395 return GetCurrent3fText({ -25.56, 0.0, 0.0 });
398 return wxString::Format(_(
"Tap = %.*f p.u.\n"), m_precision, 1.0);
406wxString LabelManager::GetCapacitorPreviewText(
int dataID)
411 return _(
"Capacitor 1\n");
414 return GetPowerText(_(
"var"), 1.0);
423wxString LabelManager::GetInductorPreviewText(
int dataID)
428 return _(
"Inductor 1\n");
431 return GetPowerText(_(
"var"), 1.0);
440wxString LabelManager::GetIndMotorPreviewText(
int dataID)
445 return _(
"Induction Motor 1\n");
448 return GetPowerText(_(
"W"), 1.0);
451 return GetPowerText(_(
"var"), 0.3);
460wxString LabelManager::GetSyncMotorPreviewText(
int dataID)
465 return _(
"Synchronous Compensator 1\n");
468 return GetPowerText(_(
"W"), 0.01);
471 return GetPowerText(_(
"var"), 1.0);
480void LabelManager::OnChoicebookChanged(wxChoicebookEvent& event)
482 UpdatePreview(m_choicebook->GetSelection());
486void LabelManager::OnUnitChanged(wxCommandEvent& event)
488 UpdatePreview(m_choicebook->GetSelection());
492void LabelManager::OnPrecisionTextUpdate(wxCommandEvent& event)
495 if (m_textCtrlPrecision->GetValue().ToLong(&precision) && precision >= 0) {
496 m_precision =
static_cast<size_t>(precision);
497 UpdatePreview(m_choicebook->GetSelection());
502void LabelManager::OnApplyButtonClick(wxCommandEvent& event)
504 if (m_checkBoxReplace->GetValue()) {
505 m_workspace->RemoveAllTextElements();
507 ElectricalUnit voltageUnitList[3] = { ElectricalUnit::UNIT_PU, ElectricalUnit::UNIT_V, ElectricalUnit::UNIT_kV };
508 ElectricalUnit currentUnitList[3] = { ElectricalUnit::UNIT_PU, ElectricalUnit::UNIT_A, ElectricalUnit::UNIT_kA };
509 ElectricalUnit sUnitList[4] = { ElectricalUnit::UNIT_PU, ElectricalUnit::UNIT_VA, ElectricalUnit::UNIT_kVA, ElectricalUnit::UNIT_MVA };
510 ElectricalUnit pUnitList[4] = { ElectricalUnit::UNIT_PU, ElectricalUnit::UNIT_W, ElectricalUnit::UNIT_kW, ElectricalUnit::UNIT_MW };
511 ElectricalUnit qUnitList[4] = { ElectricalUnit::UNIT_PU, ElectricalUnit::UNIT_var, ElectricalUnit::UNIT_kvar, ElectricalUnit::UNIT_Mvar };
512 ElectricalUnit angleUnitList[2] = { ElectricalUnit::UNIT_DEGREE, ElectricalUnit::UNIT_RADIAN };
514 ElectricalUnit voltageUnit = voltageUnitList[m_radioBoxVoltage->GetSelection()];
515 ElectricalUnit currentUnit = currentUnitList[m_radioBoxCurrent->GetSelection()];
516 ElectricalUnit sUnit = sUnitList[m_radioBoxPower->GetSelection()];
517 ElectricalUnit pUnit = pUnitList[m_radioBoxPower->GetSelection()];
518 ElectricalUnit qUnit = qUnitList[m_radioBoxPower->GetSelection()];
519 ElectricalUnit angleUnit = angleUnitList[m_radioBoxAngle->GetSelection()];
521 auto elementList = m_workspace->GetElementList();
522 int numTxtElements = 0;
523 for (
auto* element : elementList) {
524 ElementType elementType = element->GetElementType();
529 TextID textOptions[7] = { ID_TXT_NAME, ID_TXT_VOLTAGE, ID_TXT_ANGLE, ID_TXT_FAULTCURRENT, ID_TXT_FAULTVOLTAGE, ID_TXT_SCC, ID_TXT_THD };
530 ElectricalUnit textUnits[7] = { ElectricalUnit::UNIT_NONE, voltageUnit, angleUnit, currentUnit, voltageUnit, sUnit, ElectricalUnit::UNIT_NONE };
531 m_checkListBoxBus->GetCheckedItems(checked);
532 for (
int i : checked) {
533 m_workspace->InsertTextElement(textOptions[i], element, textUnits[i], m_precision);
537 case TYPE_CAPACITOR: {
538 TextID textOptions[2] = { ID_TXT_NAME, ID_TXT_REACTIVE_POWER };
539 ElectricalUnit textUnits[2] = { ElectricalUnit::UNIT_NONE, qUnit };
540 m_checkListBoxCapacitor->GetCheckedItems(checked);
541 for (
int i : checked) {
542 m_workspace->InsertTextElement(textOptions[i], element, textUnits[i], m_precision);
546 case TYPE_IND_MOTOR: {
547 TextID textOptions[3] = { ID_TXT_NAME, ID_TXT_ACTIVE_POWER, ID_TXT_REACTIVE_POWER };
548 ElectricalUnit textUnits[3] = { ElectricalUnit::UNIT_NONE, pUnit, qUnit };
549 m_checkListBoxIndMotor->GetCheckedItems(checked);
550 for (
int i : checked) {
551 m_workspace->InsertTextElement(textOptions[i], element, textUnits[i], m_precision);
555 case TYPE_INDUCTOR: {
556 TextID textOptions[2] = { ID_TXT_NAME, ID_TXT_REACTIVE_POWER };
557 ElectricalUnit textUnits[2] = { ElectricalUnit::UNIT_NONE, qUnit };
558 m_checkListBoxInductor->GetCheckedItems(checked);
559 for (
int i : checked) {
560 m_workspace->InsertTextElement(textOptions[i], element, textUnits[i], m_precision);
565 TextID lineTextOptions[10] = { ID_TXT_NAME, ID_TXT_BRANCH_ACTIVE_POWER_1_2, ID_TXT_BRANCH_ACTIVE_POWER_2_1,
566 ID_TXT_BRANCH_REACTIVE_POWER_1_2, ID_TXT_BRANCH_REACTIVE_POWER_2_1, ID_TXT_BRANCH_LOSSES,
567 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 };
568 ElectricalUnit textUnits[10] = { ElectricalUnit::UNIT_NONE, pUnit, pUnit, qUnit, qUnit, pUnit, currentUnit, currentUnit, currentUnit, currentUnit };
569 m_checkListBoxLine->GetCheckedItems(checked);
570 for (
int i : checked) {
571 m_workspace->InsertTextElement(lineTextOptions[i], element, textUnits[i], m_precision);
576 TextID textOptions[3] = { ID_TXT_NAME, ID_TXT_ACTIVE_POWER, ID_TXT_REACTIVE_POWER };
577 ElectricalUnit textUnits[3] = { ElectricalUnit::UNIT_NONE, pUnit, qUnit };
578 m_checkListBoxLoad->GetCheckedItems(checked);
579 for (
int i : checked) {
580 m_workspace->InsertTextElement(textOptions[i], element, textUnits[i], m_precision);
584 case TYPE_SYNC_GENERATOR: {
585 TextID textOptions[4] = { ID_TXT_NAME, ID_TXT_ACTIVE_POWER, ID_TXT_REACTIVE_POWER, ID_TXT_FAULTCURRENT };
586 ElectricalUnit textUnits[4] = { ElectricalUnit::UNIT_NONE, pUnit, qUnit, currentUnit };
587 m_checkListBoxGenerator->GetCheckedItems(checked);
588 for (
int i : checked) {
589 m_workspace->InsertTextElement(textOptions[i], element, textUnits[i], m_precision);
593 case TYPE_SYNC_MOTOR: {
594 TextID textOptions[3] = { ID_TXT_NAME, ID_TXT_ACTIVE_POWER, ID_TXT_REACTIVE_POWER };
595 ElectricalUnit textUnits[3] = { ElectricalUnit::UNIT_NONE, pUnit, qUnit };
596 m_checkListBoxSyncMotor->GetCheckedItems(checked);
597 for (
int i : checked) {
598 m_workspace->InsertTextElement(textOptions[i], element, textUnits[i], m_precision);
602 case TYPE_TRANSFORMER: {
603 TextID lineTextOptions[11] = { ID_TXT_NAME, ID_TXT_BRANCH_ACTIVE_POWER_1_2, ID_TXT_BRANCH_ACTIVE_POWER_2_1,
604 ID_TXT_BRANCH_REACTIVE_POWER_1_2, ID_TXT_BRANCH_REACTIVE_POWER_2_1, ID_TXT_BRANCH_LOSSES,
605 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,
607 ElectricalUnit textUnits[11] = { ElectricalUnit::UNIT_NONE, pUnit, pUnit, qUnit, qUnit, pUnit, currentUnit, currentUnit, currentUnit, currentUnit,
608 ElectricalUnit::UNIT_PU };
609 m_checkListBoxTransformer->GetCheckedItems(checked);
610 for (
int i : checked) {
611 m_workspace->InsertTextElement(lineTextOptions[i], element, textUnits[i], m_precision);
619 if (numTxtElements != 0) {
620 m_workspace->SaveCurrentState();
621 m_workspace->UpdateTextElements();
626void LabelManager::OnCancelButtonClick(wxCommandEvent& event)
628 EndModal(wxID_CANCEL);
This class manages the graphical and power elements. It is responsible for handling the user's intera...