442{
443 m_changingValues = true;
446
447 double basePower = m_workspace->GetProperties()->GetSimulationPropertiesData().basePower;
448 switch (m_workspace->GetProperties()->GetSimulationPropertiesData().basePowerUnit) {
450 basePower *= 1e3;
451 } break;
453 basePower *= 1e6;
454 } break;
455 default:
456 break;
457 }
458
459 int rowNumber = 1;
465
466
467 if (gridToFill == GRID_ALL || gridToFill == GRID_PF) {
468 double kActivePower = 1.0;
469 if (m_gridPowerFlow->GetCellValue(0, 4) == m_activePowerChoices[1])
470 kActivePower = basePower;
471 else if (m_gridPowerFlow->GetCellValue(0, 4) == m_activePowerChoices[2])
472 kActivePower = basePower / 1e3;
473 else if (m_gridPowerFlow->GetCellValue(0, 4) == m_activePowerChoices[3])
474 kActivePower = basePower / 1e6;
475
476 double kReactivePower = 1.0;
477 if (m_gridPowerFlow->GetCellValue(0, 5) == m_reactivePowerChoices[1])
478 kReactivePower = basePower;
479 else if (m_gridPowerFlow->GetCellValue(0, 5) == m_reactivePowerChoices[2])
480 kReactivePower = basePower / 1e3;
481 else if (m_gridPowerFlow->GetCellValue(0, 5) == m_reactivePowerChoices[3])
482 kReactivePower = basePower / 1e6;
483
484 for (auto it = lineList.begin(), itEnd = lineList.end(); it != itEnd; ++it) {
486
487 wxString busName1 = "-";
489 busName1 =
static_cast<Bus*
>(line->
GetParentList()[0])->GetElectricalData().name;
490 wxString busName2 = "-";
492 busName2 =
static_cast<Bus*
>(line->
GetParentList()[1])->GetElectricalData().name;
493
494 wxString isOnline = _("Yes");
495 wxColour textColour = m_gridPowerFlow->GetDefaultCellTextColour();
497 isOnline = _("No");
498 textColour = m_offlineColour;
499 }
500 for (int i = 0; i < 2; ++i) {
501 for (int j = 0; j < 7; ++j) { m_gridPowerFlow->SetCellTextColour(rowNumber + i, j, textColour); }
502 }
503
504 auto data = line->GetPUElectricalData(basePower);
505
506 m_gridPowerFlow->SetCellValue(rowNumber, 0, _("Line"));
507 m_gridPowerFlow->SetCellValue(rowNumber, 1, data.name);
508 m_gridPowerFlow->SetCellValue(rowNumber, 2, busName1);
509 m_gridPowerFlow->SetCellValue(rowNumber, 3, busName2);
510 m_gridPowerFlow->SetCellValue(rowNumber, 4,
511 line->
StringFromDouble(std::real(data.powerFlow[0]) * kActivePower, 0, m_precision));
512 m_gridPowerFlow->SetCellValue(rowNumber, 5,
513 line->
StringFromDouble(std::imag(data.powerFlow[0]) * kReactivePower, 0, m_precision));
514 m_gridPowerFlow->SetCellValue(rowNumber, 6, isOnline);
515 rowNumber++;
516
517 m_gridPowerFlow->SetCellValue(rowNumber, 0, _("Line"));
518 m_gridPowerFlow->SetCellValue(rowNumber, 1, data.name);
519 m_gridPowerFlow->SetCellValue(rowNumber, 2, busName2);
520 m_gridPowerFlow->SetCellValue(rowNumber, 3, busName1);
521 m_gridPowerFlow->SetCellValue(rowNumber, 4,
522 line->
StringFromDouble(std::real(data.powerFlow[1]) * kActivePower, 0, m_precision));
523 m_gridPowerFlow->SetCellValue(rowNumber, 5,
524 line->
StringFromDouble(std::imag(data.powerFlow[1]) * kReactivePower, 0, m_precision));
525 m_gridPowerFlow->SetCellValue(rowNumber, 6, isOnline);
526 rowNumber++;
527 }
528
529 for (auto it = transformerList.begin(), itEnd = transformerList.end(); it != itEnd; ++it) {
531 auto data = transformer->GetPUElectricalData(basePower);
532
533 wxString busName1 = "-";
535 busName1 =
static_cast<Bus*
>(transformer->
GetParentList()[0])->GetElectricalData().name;
536 wxString busName2 = "-";
538 busName2 =
static_cast<Bus*
>(transformer->
GetParentList()[1])->GetElectricalData().name;
539
540 wxString isOnline = _("Yes");
541 wxColour textColour = m_gridPowerFlow->GetDefaultCellTextColour();
543 isOnline = _("No");
544 textColour = m_offlineColour;
545 }
546 for (int i = 0; i < 2; ++i) {
547 for (int j = 0; j < 7; ++j) { m_gridPowerFlow->SetCellTextColour(rowNumber + i, j, textColour); }
548 }
549
550 m_gridPowerFlow->SetCellValue(rowNumber, 0, _("Transformer"));
551 m_gridPowerFlow->SetCellValue(rowNumber, 1, data.name);
552 m_gridPowerFlow->SetCellValue(rowNumber, 2, busName1);
553 m_gridPowerFlow->SetCellValue(rowNumber, 3, busName2);
554 m_gridPowerFlow->SetCellValue(rowNumber, 4,
555 transformer->
StringFromDouble(std::real(data.powerFlow[0]) * kActivePower, 0, m_precision));
556 m_gridPowerFlow->SetCellValue(rowNumber, 5,
557 transformer->
StringFromDouble(std::imag(data.powerFlow[0]) * kReactivePower, 0, m_precision));
558 m_gridPowerFlow->SetCellValue(rowNumber, 6, isOnline);
559 rowNumber++;
560
561 m_gridPowerFlow->SetCellValue(rowNumber, 0, _("Transformer"));
562 m_gridPowerFlow->SetCellValue(rowNumber, 1, data.name);
563 m_gridPowerFlow->SetCellValue(rowNumber, 2, busName2);
564 m_gridPowerFlow->SetCellValue(rowNumber, 3, busName1);
565 m_gridPowerFlow->SetCellValue(rowNumber, 4,
566 transformer->
StringFromDouble(std::real(data.powerFlow[1]) * kActivePower, 0, m_precision));
567 m_gridPowerFlow->SetCellValue(rowNumber, 5,
568 transformer->
StringFromDouble(std::imag(data.powerFlow[1]) * kReactivePower, 0, m_precision));
569 m_gridPowerFlow->SetCellValue(rowNumber, 6, isOnline);
570 rowNumber++;
571 }
572 m_gridPowerFlow->AutoSize();
573 m_gridPowerFlow->GetContainingSizer()->Layout();
574 }
575
576
577 if (gridToFill == GRID_ALL || gridToFill == GRID_PFBUSES) {
578 double kActivePower = 1.0;
579 if (m_gridPFBuses->GetCellValue(0, 4) == m_activePowerChoices[1])
580 kActivePower = basePower;
581 else if (m_gridPFBuses->GetCellValue(0, 4) == m_activePowerChoices[2])
582 kActivePower = basePower / 1e3;
583 else if (m_gridPFBuses->GetCellValue(0, 4) == m_activePowerChoices[3])
584 kActivePower = basePower / 1e6;
585
586 double kReactivePower = 1.0;
587 if (m_gridPFBuses->GetCellValue(0, 5) == m_reactivePowerChoices[1])
588 kReactivePower = basePower;
589 else if (m_gridPFBuses->GetCellValue(0, 5) == m_reactivePowerChoices[2])
590 kReactivePower = basePower / 1e3;
591 else if (m_gridPFBuses->GetCellValue(0, 5) == m_reactivePowerChoices[3])
592 kReactivePower = basePower / 1e6;
593
594 rowNumber = 1;
595 for (auto it = busList.begin(), itEnd = busList.end(); it != itEnd; ++it) {
597 auto data = bus->GetElectricalData();
598
599 double vb = std::abs(data.nominalVoltage);
601 double kVoltage = 1.0;
602 if (m_gridPFBuses->GetCellValue(0, 2) == m_voltageChoices[1])
603 kVoltage = vb;
604 else if (m_gridPFBuses->GetCellValue(0, 2) == m_voltageChoices[2])
605 kVoltage = vb / 1e3;
606
607 m_gridPFBuses->SetCellValue(rowNumber, 0, data.name);
608 wxString busTypeString = "";
609 switch (data.busType) {
611 busTypeString = _("Slack");
612 } break;
614 busTypeString = _("PV");
615 } break;
617 busTypeString = _("PQ");
618 } break;
619 }
620 m_gridPFBuses->SetCellValue(rowNumber, 1, busTypeString);
621 m_gridPFBuses->SetCellValue(rowNumber, 2, bus->
StringFromDouble(std::abs(data.voltage) * kVoltage, 0, m_precision));
622 m_gridPFBuses->SetCellValue(rowNumber, 3, bus->
StringFromDouble(wxRadToDeg(std::arg(data.voltage)), 0, m_precision));
623 m_gridPFBuses->SetCellValue(rowNumber, 4, bus->
StringFromDouble(std::real(data.power) * kActivePower, 0, m_precision));
624 m_gridPFBuses->SetCellValue(rowNumber, 5, bus->
StringFromDouble(std::imag(data.power) * kReactivePower, 0, m_precision));
625 rowNumber++;
626 }
627 m_gridPFBuses->AutoSize();
628 m_gridPFBuses->GetContainingSizer()->Layout();
629 }
630
631
632 if (gridToFill == GRID_ALL || gridToFill == GRID_PFBRANCHES) {
633 rowNumber = 1;
634 for (auto it = lineList.begin(), itEnd = lineList.end(); it != itEnd; ++it) {
636 auto data = line->GetPUElectricalData(basePower);
637
638 double vb = data.nominalVoltage;
640 double zb = (vb * vb) / basePower;
641
642 wxString busName1 = "-";
644 busName1 =
static_cast<Bus*
>(line->
GetParentList()[0])->GetElectricalData().name;
645 wxString busName2 = "-";
647 busName2 =
static_cast<Bus*
>(line->
GetParentList()[1])->GetElectricalData().name;
648 wxString isOnline = _("Yes");
649 wxColour textColour = m_gridPFBranches->GetDefaultCellTextColour();
651 isOnline = _("No");
652 textColour = m_offlineColour;
653 }
654 for (int j = 0; j < 10; ++j) { m_gridPFBranches->SetCellTextColour(rowNumber, j, textColour); }
655
656 m_gridPFBranches->SetCellValue(rowNumber, 0, _("Line"));
657 m_gridPFBranches->SetCellValue(rowNumber, 1, data.name);
658
659 m_gridPFBranches->SetCellValue(rowNumber, 2, busName1);
660 m_gridPFBranches->SetCellValue(rowNumber, 3, busName2);
661
662 double k = 1.0;
663 if (m_gridPFBranches->GetCellValue(0, 4) == m_resistanceChoices[1]) k = zb;
664 m_gridPFBranches->SetCellValue(rowNumber, 4, line->
StringFromDouble(data.resistance * k, 0, m_precision));
665 k = 1.0;
666 if (m_gridPFBranches->GetCellValue(0, 5) == m_indReactanceChoices[1]) k = zb;
667 m_gridPFBranches->SetCellValue(rowNumber, 5, line->
StringFromDouble(data.indReactance * k, 0, m_precision));
668 k = 1.0;
669 if (m_gridPFBranches->GetCellValue(0, 6) == m_capSusceptanceChoices[1]) k = zb;
670 m_gridPFBranches->SetCellValue(rowNumber, 6, line->
StringFromDouble(data.capSusceptance / k, 0, m_precision));
671 m_gridPFBranches->SetCellValue(rowNumber, 7, "-");
672 m_gridPFBranches->SetCellValue(rowNumber, 8, "-");
673 m_gridPFBranches->SetCellValue(rowNumber, 9, isOnline);
674 rowNumber++;
675 }
676 for (auto it = transformerList.begin(), itEnd = transformerList.end(); it != itEnd; ++it) {
678 auto data = transformer->GetPUElectricalData(basePower);
679
680 double vb = 0.0;
681 if (data.baseVoltage == 0) {
682 vb = data.primaryNominalVoltage;
684 }
685 else {
686 vb = data.secondaryNominalVoltage;
688 }
689 double zb = (vb * vb) / basePower;
690
691 wxString busName1 = "-";
693 busName1 =
static_cast<Bus*
>(transformer->
GetParentList()[0])->GetElectricalData().name;
694 wxString busName2 = "-";
696 busName2 =
static_cast<Bus*
>(transformer->
GetParentList()[1])->GetElectricalData().name;
697
698 wxString isOnline = _("Yes");
699 wxColour textColour = m_gridPFBranches->GetDefaultCellTextColour();
701 isOnline = _("No");
702 textColour = m_offlineColour;
703 }
704 for (int j = 0; j < 10; ++j) { m_gridPFBranches->SetCellTextColour(rowNumber, j, textColour); }
705
706 m_gridPFBranches->SetCellValue(rowNumber, 0, _("Transformer"));
707 m_gridPFBranches->SetCellValue(rowNumber, 1, data.name);
708 m_gridPFBranches->SetCellValue(rowNumber, 2, busName1);
709 m_gridPFBranches->SetCellValue(rowNumber, 3, busName2);
710
711 double k = 1.0;
712 if (m_gridPFBranches->GetCellValue(0, 4) == m_resistanceChoices[1]) k = zb;
713 m_gridPFBranches->SetCellValue(rowNumber, 4, transformer->
StringFromDouble(data.resistance * k, 0, m_precision));
714 k = 1.0;
715 if (m_gridPFBranches->GetCellValue(0, 5) == m_indReactanceChoices[1]) k = zb;
716 m_gridPFBranches->SetCellValue(rowNumber, 5, transformer->
StringFromDouble(data.indReactance * k, 0, m_precision));
717 m_gridPFBranches->SetCellValue(rowNumber, 6, "-");
718 m_gridPFBranches->SetCellValue(rowNumber, 7, transformer->
StringFromDouble(data.turnsRatio, 0, m_precision));
719 m_gridPFBranches->SetCellValue(rowNumber, 8, transformer->
StringFromDouble(data.phaseShift, 0, m_precision));
720 m_gridPFBranches->SetCellValue(rowNumber, 9, isOnline);
721 rowNumber++;
722 }
723 m_gridPFBranches->AutoSize();
724 m_gridPFBranches->GetContainingSizer()->Layout();
725 }
726
727
728 if (gridToFill == GRID_ALL || gridToFill == GRID_FAULT) {
729 rowNumber = 2;
730 for (auto it = busList.begin(), itEnd = busList.end(); it != itEnd; ++it) {
732 auto data = bus->GetElectricalData();
733 if (data.hasFault) {
734 double vb = bus->GetValueFromUnit(data.nominalVoltage, data.nominalVoltageUnit);
735 double ib = basePower / (std::sqrt(3.0) * vb);
736
737 m_gridFault->SetCellValue(rowNumber, 0, data.name);
738
739 double kCurrent = 1.0;
740 if (m_gridFault->GetCellValue(1, 1) == m_currentChoices[1]) {
741 kCurrent = ib;
742 }
743 else if (m_gridFault->GetCellValue(1, 1) == m_currentChoices[2]) {
744 kCurrent = ib / 1e3;
745 }
746 m_gridFault->SetCellValue(rowNumber, 1,
747 bus->
StringFromDouble(std::abs(data.faultCurrent[0]) * kCurrent, 0, m_precision));
748
749 m_gridFault->SetCellValue(rowNumber, 2,
750 bus->
StringFromDouble(wxRadToDeg(std::arg(data.faultCurrent[0])), 0, m_precision));
751
752 kCurrent = 1.0;
753 if (m_gridFault->GetCellValue(1, 3) == m_currentChoices[1]) {
754 kCurrent = ib;
755 }
756 else if (m_gridFault->GetCellValue(1, 3) == m_currentChoices[2]) {
757 kCurrent = ib / 1e3;
758 }
759 m_gridFault->SetCellValue(rowNumber, 3,
760 bus->
StringFromDouble(std::abs(data.faultCurrent[1]) * kCurrent, 0, m_precision));
761
762 m_gridFault->SetCellValue(rowNumber, 4,
763 bus->
StringFromDouble(wxRadToDeg(std::arg(data.faultCurrent[1])), 0, m_precision));
764
765 kCurrent = 1.0;
766 if (m_gridFault->GetCellValue(1, 5) == m_currentChoices[1]) {
767 kCurrent = ib;
768 }
769 else if (m_gridFault->GetCellValue(1, 5) == m_currentChoices[2]) {
770 kCurrent = ib / 1e3;
771 }
772 m_gridFault->SetCellValue(rowNumber, 5,
773 bus->
StringFromDouble(std::abs(data.faultCurrent[2]) * kCurrent, 0, m_precision));
774
775 m_gridFault->SetCellValue(rowNumber, 6,
776 bus->
StringFromDouble(wxRadToDeg(std::arg(data.faultCurrent[2])), 0, m_precision));
777
778 rowNumber++;
779 }
780 }
781 m_gridFault->AutoSize();
782 m_gridFault->GetContainingSizer()->Layout();
783 }
784
785
786 if (gridToFill == GRID_ALL || gridToFill == GRID_FAULTBUSES) {
787 rowNumber = 2;
788 for (auto it = busList.begin(), itEnd = busList.end(); it != itEnd; ++it) {
790 auto data = bus->GetElectricalData();
791 double vb = bus->GetValueFromUnit(data.nominalVoltage, data.nominalVoltageUnit);
792
793 m_gridFaultBuses->SetCellValue(rowNumber, 0, data.name);
794 double kVoltage = 1.0;
795 if (m_gridFaultBuses->GetCellValue(1, 1) == m_voltageChoices[1]) {
796 kVoltage = vb;
797 }
798 else if (m_gridFaultBuses->GetCellValue(1, 1) == m_voltageChoices[2]) {
799 kVoltage = vb / 1e3;
800 }
801 m_gridFaultBuses->SetCellValue(rowNumber, 1,
802 bus->
StringFromDouble(std::abs(data.faultVoltage[0]) * kVoltage, 0, m_precision));
803 m_gridFaultBuses->SetCellValue(rowNumber, 2,
804 bus->
StringFromDouble(wxRadToDeg(std::arg(data.faultVoltage[0])), 0, m_precision));
805
806 kVoltage = 1.0;
807 if (m_gridFaultBuses->GetCellValue(1, 3) == m_voltageChoices[1]) {
808 kVoltage = vb;
809 }
810 else if (m_gridFaultBuses->GetCellValue(1, 3) == m_voltageChoices[2]) {
811 kVoltage = vb / 1e3;
812 }
813 m_gridFaultBuses->SetCellValue(rowNumber, 3,
814 bus->
StringFromDouble(std::abs(data.faultVoltage[1]) * kVoltage, 0, m_precision));
815 m_gridFaultBuses->SetCellValue(rowNumber, 4,
816 bus->
StringFromDouble(wxRadToDeg(std::arg(data.faultVoltage[1])), 0, m_precision));
817
818 kVoltage = 1.0;
819 if (m_gridFaultBuses->GetCellValue(1, 5) == m_voltageChoices[1]) {
820 kVoltage = vb;
821 }
822 else if (m_gridFaultBuses->GetCellValue(1, 5) == m_voltageChoices[2]) {
823 kVoltage = vb / 1e3;
824 }
825 m_gridFaultBuses->SetCellValue(rowNumber, 5,
826 bus->
StringFromDouble(std::abs(data.faultVoltage[2]) * kVoltage, 0, m_precision));
827 m_gridFaultBuses->SetCellValue(rowNumber, 6,
828 bus->
StringFromDouble(wxRadToDeg(std::arg(data.faultVoltage[2])), 0, m_precision));
829
830 rowNumber++;
831 }
832 m_gridFaultBuses->AutoSize();
833 m_gridFaultBuses->GetContainingSizer()->Layout();
834 }
835
836
837 if (gridToFill == GRID_ALL || gridToFill == GRID_FAULTBRANCHES) {
838 rowNumber = 2;
839 for (auto it = lineList.begin(), itEnd = lineList.end(); it != itEnd; ++it) {
841 auto data = line->GetPUElectricalData(basePower);
842
843 double vb = line->GetValueFromUnit(data.nominalVoltage, data.nominalVoltageUnit);
844 double ib = basePower / (std::sqrt(3.0) * vb);
845
846 wxString busName1 = "-";
848 busName1 =
static_cast<Bus*
>(line->
GetParentList()[0])->GetElectricalData().name;
849 wxString busName2 = "-";
851 busName2 =
static_cast<Bus*
>(line->
GetParentList()[1])->GetElectricalData().name;
852
853 wxString isOnline = _("Yes");
854 wxColour textColour = m_gridFaultBranches->GetDefaultCellTextColour();
856 isOnline = _("No");
857 textColour = m_offlineColour;
858 }
859 for (int i = 0; i < 2; ++i) {
860 for (int j = 0; j < 11; ++j) { m_gridFaultBranches->SetCellTextColour(rowNumber + i, j, textColour); }
861 }
862
863 m_gridFaultBranches->SetCellValue(rowNumber, 0, _("Line"));
864 m_gridFaultBranches->SetCellValue(rowNumber, 1, data.name);
865 m_gridFaultBranches->SetCellValue(rowNumber, 2, busName1);
866 m_gridFaultBranches->SetCellValue(rowNumber, 3, busName2);
867
868 double kCurrent = 1.0;
869 if (m_gridFaultBranches->GetCellValue(1, 4) == m_currentChoices[1]) {
870 kCurrent = ib;
871 }
872 else if (m_gridFaultBranches->GetCellValue(1, 4) == m_currentChoices[2]) {
873 kCurrent = ib / 1e3;
874 }
875 m_gridFaultBranches->SetCellValue(rowNumber, 4,
876 line->
StringFromDouble(std::abs(data.faultCurrent[0][0]) * kCurrent, 0, m_precision));
877 m_gridFaultBranches->SetCellValue(rowNumber, 5,
878 line->
StringFromDouble(wxRadToDeg(std::arg(data.faultCurrent[0][0])), 0, m_precision));
879 kCurrent = 1.0;
880 if (m_gridFaultBranches->GetCellValue(1, 6) == m_currentChoices[1]) {
881 kCurrent = ib;
882 }
883 else if (m_gridFaultBranches->GetCellValue(1, 6) == m_currentChoices[2]) {
884 kCurrent = ib / 1e3;
885 }
886 m_gridFaultBranches->SetCellValue(rowNumber, 6,
887 line->
StringFromDouble(std::abs(data.faultCurrent[0][1]) * kCurrent, 0, m_precision));
888 m_gridFaultBranches->SetCellValue(rowNumber, 7,
889 line->
StringFromDouble(wxRadToDeg(std::arg(data.faultCurrent[0][1])), 0, m_precision));
890 kCurrent = 1.0;
891 if (m_gridFaultBranches->GetCellValue(1, 8) == m_currentChoices[1]) {
892 kCurrent = ib;
893 }
894 else if (m_gridFaultBranches->GetCellValue(1, 8) == m_currentChoices[2]) {
895 kCurrent = ib / 1e3;
896 }
897 m_gridFaultBranches->SetCellValue(rowNumber, 8,
898 line->
StringFromDouble(std::abs(data.faultCurrent[0][2]) * kCurrent, 0, m_precision));
899 m_gridFaultBranches->SetCellValue(rowNumber, 9,
900 line->
StringFromDouble(wxRadToDeg(std::arg(data.faultCurrent[0][2])), 0, m_precision));
901 m_gridFaultBranches->SetCellValue(rowNumber, 10, isOnline);
902 rowNumber++;
903
904 m_gridFaultBranches->SetCellValue(rowNumber, 0, _("Line"));
905 m_gridFaultBranches->SetCellValue(rowNumber, 1, data.name);
906 m_gridFaultBranches->SetCellValue(rowNumber, 2, busName2);
907 m_gridFaultBranches->SetCellValue(rowNumber, 3, busName1);
908 kCurrent = 1.0;
909 if (m_gridFaultBranches->GetCellValue(1, 4) == m_currentChoices[1]) {
910 kCurrent = ib;
911 }
912 else if (m_gridFaultBranches->GetCellValue(1, 4) == m_currentChoices[2]) {
913 kCurrent = ib / 1e3;
914 }
915 m_gridFaultBranches->SetCellValue(rowNumber, 4,
916 line->
StringFromDouble(std::abs(data.faultCurrent[1][0]) * kCurrent, 0, m_precision));
917 m_gridFaultBranches->SetCellValue(rowNumber, 5,
918 line->
StringFromDouble(wxRadToDeg(std::arg(data.faultCurrent[1][0])), 0, m_precision));
919 kCurrent = 1.0;
920 if (m_gridFaultBranches->GetCellValue(1, 6) == m_currentChoices[1]) {
921 kCurrent = ib;
922 }
923 else if (m_gridFaultBranches->GetCellValue(1, 6) == m_currentChoices[2]) {
924 kCurrent = ib / 1e3;
925 }
926 m_gridFaultBranches->SetCellValue(rowNumber, 6,
927 line->
StringFromDouble(std::abs(data.faultCurrent[1][1]) * kCurrent, 0, m_precision));
928 m_gridFaultBranches->SetCellValue(rowNumber, 7,
929 line->
StringFromDouble(wxRadToDeg(std::arg(data.faultCurrent[1][1])), 0, m_precision));
930 kCurrent = 1.0;
931 if (m_gridFaultBranches->GetCellValue(1, 8) == m_currentChoices[1]) {
932 kCurrent = ib;
933 }
934 else if (m_gridFaultBranches->GetCellValue(1, 8) == m_currentChoices[2]) {
935 kCurrent = ib / 1e3;
936 }
937 m_gridFaultBranches->SetCellValue(rowNumber, 8,
938 line->
StringFromDouble(std::abs(data.faultCurrent[1][2]) * kCurrent, 0, m_precision));
939 m_gridFaultBranches->SetCellValue(rowNumber, 9,
940 line->
StringFromDouble(wxRadToDeg(std::arg(data.faultCurrent[1][2])), 0, m_precision));
941 m_gridFaultBranches->SetCellValue(rowNumber, 10, isOnline);
942 rowNumber++;
943 }
944
945 for (auto it = transformerList.begin(), itEnd = transformerList.end(); it != itEnd; ++it) {
947 auto data = transformer->GetPUElectricalData(basePower);
948
949 double vb = transformer->GetValueFromUnit(data.primaryNominalVoltage, data.primaryNominalVoltageUnit);
950 double ibp = basePower / (std::sqrt(3.0) * vb);
951 vb = transformer->GetValueFromUnit(data.secondaryNominalVoltage, data.secondaryNominalVoltageUnit);
952 double ibs = basePower / (std::sqrt(3.0) * vb);
953
954 wxString busName1 = "-";
956 busName1 =
static_cast<Bus*
>(transformer->
GetParentList()[0])->GetElectricalData().name;
957 wxString busName2 = "-";
959 busName2 =
static_cast<Bus*
>(transformer->
GetParentList()[1])->GetElectricalData().name;
960
961 wxString isOnline = _("Yes");
962 wxColour textColour = m_gridFaultBranches->GetDefaultCellTextColour();
964 isOnline = _("No");
965 textColour = m_offlineColour;
966 }
967 for (int i = 0; i < 2; ++i) {
968 for (int j = 0; j < 11; ++j) { m_gridFaultBranches->SetCellTextColour(rowNumber + i, j, textColour); }
969 }
970
971 m_gridFaultBranches->SetCellValue(rowNumber, 0, _("Transformer"));
972 m_gridFaultBranches->SetCellValue(rowNumber, 1, data.name);
973 m_gridFaultBranches->SetCellValue(rowNumber, 2, busName1);
974 m_gridFaultBranches->SetCellValue(rowNumber, 3, busName2);
975
976 double kCurrent = 1.0;
977 if (m_gridFaultBranches->GetCellValue(1, 4) == m_currentChoices[1]) {
978 kCurrent = ibp;
979 }
980 else if (m_gridFaultBranches->GetCellValue(1, 4) == m_currentChoices[2]) {
981 kCurrent = ibp / 1e3;
982 }
983 m_gridFaultBranches->SetCellValue(
984 rowNumber, 4, transformer->
StringFromDouble(std::abs(data.faultCurrent[0][0]) * kCurrent, 0, m_precision));
985 m_gridFaultBranches->SetCellValue(
986 rowNumber, 5, transformer->
StringFromDouble(wxRadToDeg(std::arg(data.faultCurrent[0][0])), 0, m_precision));
987 kCurrent = 1.0;
988 if (m_gridFaultBranches->GetCellValue(1, 6) == m_currentChoices[1]) {
989 kCurrent = ibp;
990 }
991 else if (m_gridFaultBranches->GetCellValue(1, 6) == m_currentChoices[2]) {
992 kCurrent = ibp / 1e3;
993 }
994 m_gridFaultBranches->SetCellValue(
995 rowNumber, 6, transformer->
StringFromDouble(std::abs(data.faultCurrent[0][1]) * kCurrent, 0, m_precision));
996 m_gridFaultBranches->SetCellValue(
997 rowNumber, 7, transformer->
StringFromDouble(wxRadToDeg(std::arg(data.faultCurrent[0][1])), 0, m_precision));
998 kCurrent = 1.0;
999 if (m_gridFaultBranches->GetCellValue(1, 8) == m_currentChoices[1]) {
1000 kCurrent = ibp;
1001 }
1002 else if (m_gridFaultBranches->GetCellValue(1, 8) == m_currentChoices[2]) {
1003 kCurrent = ibp / 1e3;
1004 }
1005 m_gridFaultBranches->SetCellValue(
1006 rowNumber, 8, transformer->
StringFromDouble(std::abs(data.faultCurrent[0][2]) * kCurrent, 0, m_precision));
1007 m_gridFaultBranches->SetCellValue(
1008 rowNumber, 9, transformer->
StringFromDouble(wxRadToDeg(std::arg(data.faultCurrent[0][2])), 0, m_precision));
1009 m_gridFaultBranches->SetCellValue(rowNumber, 10, isOnline);
1010 rowNumber++;
1011
1012 m_gridFaultBranches->SetCellValue(rowNumber, 0, _("Transformer"));
1013 m_gridFaultBranches->SetCellValue(rowNumber, 1, data.name);
1014 m_gridFaultBranches->SetCellValue(rowNumber, 2, busName2);
1015 m_gridFaultBranches->SetCellValue(rowNumber, 3, busName1);
1016 kCurrent = 1.0;
1017 if (m_gridFaultBranches->GetCellValue(1, 4) == m_currentChoices[1]) {
1018 kCurrent = ibs;
1019 }
1020 else if (m_gridFaultBranches->GetCellValue(1, 4) == m_currentChoices[2]) {
1021 kCurrent = ibs / 1e3;
1022 }
1023 m_gridFaultBranches->SetCellValue(
1024 rowNumber, 4, transformer->
StringFromDouble(std::abs(data.faultCurrent[1][0]) * kCurrent, 0, m_precision));
1025 m_gridFaultBranches->SetCellValue(
1026 rowNumber, 5, transformer->
StringFromDouble(wxRadToDeg(std::arg(data.faultCurrent[1][0])), 0, m_precision));
1027 kCurrent = 1.0;
1028 if (m_gridFaultBranches->GetCellValue(1, 6) == m_currentChoices[1]) {
1029 kCurrent = ibs;
1030 }
1031 else if (m_gridFaultBranches->GetCellValue(1, 6) == m_currentChoices[2]) {
1032 kCurrent = ibs / 1e3;
1033 }
1034 m_gridFaultBranches->SetCellValue(
1035 rowNumber, 6, transformer->
StringFromDouble(std::abs(data.faultCurrent[1][1]) * kCurrent, 0, m_precision));
1036 m_gridFaultBranches->SetCellValue(
1037 rowNumber, 7, transformer->
StringFromDouble(wxRadToDeg(std::arg(data.faultCurrent[1][1])), 0, m_precision));
1038 kCurrent = 1.0;
1039 if (m_gridFaultBranches->GetCellValue(1, 8) == m_currentChoices[1]) {
1040 kCurrent = ibs;
1041 }
1042 else if (m_gridFaultBranches->GetCellValue(1, 8) == m_currentChoices[2]) {
1043 kCurrent = ibs / 1e3;
1044 }
1045 m_gridFaultBranches->SetCellValue(
1046 rowNumber, 8, transformer->
StringFromDouble(std::abs(data.faultCurrent[1][2]) * kCurrent, 0, m_precision));
1047 m_gridFaultBranches->SetCellValue(
1048 rowNumber, 9, transformer->
StringFromDouble(wxRadToDeg(std::arg(data.faultCurrent[1][2])), 0, m_precision));
1049 m_gridFaultBranches->SetCellValue(rowNumber, 10, isOnline);
1050 rowNumber++;
1051 }
1052
1053 m_gridFaultBranches->AutoSize();
1054 m_gridFaultBranches->GetContainingSizer()->Layout();
1055 }
1056
1057
1058 if (gridToFill == GRID_ALL || gridToFill == GRID_FAULTGENERATORS) {
1059 rowNumber = 2;
1060 for (auto it = generatorList.begin(), itEnd = generatorList.end(); it != itEnd; ++it) {
1062 auto data = generator->GetPUElectricalData(basePower);
1063 double vb = generator->GetValueFromUnit(data.nominalVoltage, data.nominalVoltageUnit);
1064 double ib = basePower / (std::sqrt(3.0) * vb);
1065
1066 m_gridFaultGenerators->SetCellValue(rowNumber, 0, data.name);
1067
1068 double kCurrent = 1.0;
1069 if (m_gridFaultGenerators->GetCellValue(1, 1) == m_currentChoices[1])
1070 kCurrent = ib;
1071 else if (m_gridFaultGenerators->GetCellValue(1, 1) == m_currentChoices[2])
1072 kCurrent = ib / 1e3;
1073 m_gridFaultGenerators->SetCellValue(rowNumber, 1,
1074 generator->
StringFromDouble(std::abs(data.faultCurrent[0]) * kCurrent, 0, m_precision));
1075 m_gridFaultGenerators->SetCellValue(
1076 rowNumber, 2, generator->
StringFromDouble(wxRadToDeg(std::arg(data.faultCurrent[0])), 0, m_precision));
1077
1078 kCurrent = 1.0;
1079 if (m_gridFaultGenerators->GetCellValue(1, 3) == m_currentChoices[1])
1080 kCurrent = ib;
1081 else if (m_gridFaultGenerators->GetCellValue(1, 3) == m_currentChoices[2])
1082 kCurrent = ib / 1e3;
1083 m_gridFaultGenerators->SetCellValue(rowNumber, 3,
1084 generator->
StringFromDouble(std::abs(data.faultCurrent[1]) * kCurrent, 0, m_precision));
1085 m_gridFaultGenerators->SetCellValue(
1086 rowNumber, 4, generator->
StringFromDouble(wxRadToDeg(std::arg(data.faultCurrent[1])), 0, m_precision));
1087
1088 kCurrent = 1.0;
1089 if (m_gridFaultGenerators->GetCellValue(1, 5) == m_currentChoices[1])
1090 kCurrent = ib;
1091 else if (m_gridFaultGenerators->GetCellValue(1, 5) == m_currentChoices[2])
1092 kCurrent = ib / 1e3;
1093 m_gridFaultGenerators->SetCellValue(rowNumber, 5,
1094 generator->
StringFromDouble(std::abs(data.faultCurrent[2]) * kCurrent, 0, m_precision));
1095 m_gridFaultGenerators->SetCellValue(
1096 rowNumber, 6, generator->
StringFromDouble(wxRadToDeg(std::arg(data.faultCurrent[2])), 0, m_precision));
1097
1098 rowNumber++;
1099 }
1100 m_gridFaultGenerators->AutoSize();
1101 m_gridFaultGenerators->GetContainingSizer()->Layout();
1102 }
1103
1104
1105 if (gridToFill == GRID_ALL || gridToFill == GRID_HARMCURRENT) {
1106 rowNumber = 1;
1107 for (auto* hCurrent : harmCurrentList) {
1108 if (hCurrent->GetParentList()[0]) {
1109 auto busData =
static_cast<Bus*
>(hCurrent->GetParentList()[0])->GetElectricalData();
1110 double vb = hCurrent->GetValueFromUnit(busData.nominalVoltage, busData.nominalVoltageUnit);
1111 double ib = basePower / (std::sqrt(3.0) * vb);
1112
1113 auto data = hCurrent->GetPUElectricalData(basePower, vb);
1114 m_gridHarmCurrents->SetCellSize(rowNumber, 0, data.harmonicOrder.size(), 1);
1115 m_gridHarmCurrents->SetCellValue(rowNumber, 0, data.name);
1116 m_gridHarmCurrents->SetCellSize(rowNumber, 1, data.harmonicOrder.size(), 1);
1117 m_gridHarmCurrents->SetCellValue(rowNumber, 1, busData.name);
1118 int i = 0;
1119 for (auto& order : data.harmonicOrder) {
1120 m_gridHarmCurrents->SetCellValue(rowNumber, 2, wxString::Format(wxT("%d%s"), order, wxString(L'\u00BA')));
1121 double kCurrent = 1.0;
1122 if (m_gridHarmCurrents->GetCellValue(0, 3) == m_currentChoices[1]) {
1123 kCurrent = ib;
1124 }
1125 else if (m_gridHarmCurrents->GetCellValue(0, 3) == m_currentChoices[2]) {
1126 kCurrent = ib / 1e3;
1127 }
1128 m_gridHarmCurrents->SetCellValue(rowNumber, 3, hCurrent->StringFromDouble(data.injHarmCurrent[i] * kCurrent, 0, m_precision));
1129 m_gridHarmCurrents->SetCellValue(rowNumber, 4, hCurrent->StringFromDouble(data.injHarmAngle[i], 0, m_precision) + wxString(L'\u00B0'));
1130 i++;
1131 rowNumber++;
1132 }
1133 }
1134 else {
1135 auto data = hCurrent->GetElectricalData();
1136 m_gridHarmCurrents->SetCellSize(rowNumber, 0, data.harmonicOrder.size(), 1);
1137 m_gridHarmCurrents->SetCellValue(rowNumber, 0, data.name);
1138 m_gridHarmCurrents->SetCellSize(rowNumber, 1, data.harmonicOrder.size(), 1);
1139 m_gridHarmCurrents->SetCellValue(rowNumber, 1, "-");
1140 int i = 0;
1141 for (auto& order : data.harmonicOrder) {
1142 m_gridHarmCurrents->SetCellValue(rowNumber, 2, wxString::Format(wxT("%d%s"), order, wxString(L'\u00BA')));
1143 m_gridHarmCurrents->SetCellValue(rowNumber, 3, "?");
1144 m_gridHarmCurrents->SetCellValue(rowNumber, 4, hCurrent->StringFromDouble(data.injHarmAngle[i], 0, m_precision) + wxString(L'\u00B0'));
1145 i++;
1146 rowNumber++;
1147 }
1148
1149 }
1150 }
1151 m_gridHarmCurrents->AutoSize();
1152 m_gridHarmCurrents->GetContainingSizer()->Layout();
1153 }
1154
1155
1156 if (gridToFill == GRID_ALL || gridToFill == GRID_HARMBUSES) {
1157 rowNumber = 1;
1158 for (auto* bus : busList) {
1159 auto data = bus->GetElectricalData();
1160 double vb = bus->GetValueFromUnit(data.nominalVoltage, data.nominalVoltageUnit);
1161
1162 m_gridHarmBuses->SetCellSize(rowNumber, 0, data.harmonicOrder.size(), 1);
1163 m_gridHarmBuses->SetCellValue(rowNumber, 0, data.name);
1164 m_gridHarmBuses->SetCellSize(rowNumber, 1, data.harmonicOrder.size(), 1);
1165 m_gridHarmBuses->SetCellValue(rowNumber, 1, bus->
StringFromDouble(data.thd, 0, m_precision) + wxT(
"%"));
1166 int i = 0;
1167 for (auto& order : data.harmonicOrder) {
1168 m_gridHarmBuses->SetCellValue(rowNumber, 2, wxString::Format(wxT("%d%s"), order, wxString(L'\u00BA')));
1169 wxString voltageStr = "";
1170 if (m_gridHarmBuses->GetCellValue(0, 3) == m_phaseVoltageChoices[0]) {
1171 voltageStr.Printf(wxString::Format("%%.%de", m_precision), std::abs(data.harmonicVoltage[i]));
1172 }
1173 else if (m_gridHarmBuses->GetCellValue(0, 3) == m_phaseVoltageChoices[1]) {
1174 voltageStr = bus->
StringFromDouble(std::abs(data.harmonicVoltage[i]) * vb / sqrt(3.0), 0, m_precision);
1175 }
1176 else if (m_gridHarmBuses->GetCellValue(0, 3) == m_phaseVoltageChoices[2]) {
1177 voltageStr = bus->
StringFromDouble(std::abs(data.harmonicVoltage[i]) * vb / (sqrt(3.0) * 1e3), 0, m_precision);
1178 }
1179 m_gridHarmBuses->SetCellValue(rowNumber, 3, voltageStr);
1180 m_gridHarmBuses->SetCellValue(rowNumber, 4, bus->
StringFromDouble(wxRadToDeg(std::arg(data.harmonicVoltage[i])), 0, m_precision) + wxString(L
'\u00B0'));
1181
1182 i++;
1183 rowNumber++;
1184 }
1185 }
1186 m_gridHarmBuses->AutoSize();
1187 m_gridHarmBuses->GetContainingSizer()->Layout();
1188 }
1189
1190
1191 if (gridToFill == GRID_ALL || gridToFill == GRID_HARMBRANCHES) {
1192 rowNumber = 1;
1193 for (auto* line : lineList) {
1194 auto data = line->GetPUElectricalData(basePower);
1195
1196 double vb = line->GetValueFromUnit(data.nominalVoltage, data.nominalVoltageUnit);
1197 double ib = basePower / (std::sqrt(3.0) * vb);
1198
1199 wxString busName1 = "-";
1201 busName1 =
static_cast<Bus*
>(line->
GetParentList()[0])->GetElectricalData().name;
1202 wxString busName2 = "-";
1204 busName2 =
static_cast<Bus*
>(line->
GetParentList()[1])->GetElectricalData().name;
1205
1206 wxString isOnline = _("Yes");
1207 wxColour textColour = m_gridHarmBranches->GetDefaultCellTextColour();
1209 isOnline = _("No");
1210 textColour = m_offlineColour;
1211 }
1212 for (int side = 0; side < 2; ++side) {
1213 for (unsigned int i = 0; i < data.harmonicOrder.size(); ++i) {
1214 for (int j = 0; j < 8; ++j) { m_gridHarmBranches->SetCellTextColour(rowNumber + i, j, textColour); }
1215 }
1216
1217 m_gridHarmBranches->SetCellSize(rowNumber, 0, data.harmonicOrder.size(), 1);
1218 m_gridHarmBranches->SetCellValue(rowNumber, 0, _("Line"));
1219 m_gridHarmBranches->SetCellSize(rowNumber, 1, data.harmonicOrder.size(), 1);
1220 m_gridHarmBranches->SetCellValue(rowNumber, 1, data.name);
1221 m_gridHarmBranches->SetCellSize(rowNumber, 2, data.harmonicOrder.size(), 1);
1222 m_gridHarmBranches->SetCellValue(rowNumber, 2, side == 0 ? busName1 : busName2);
1223 m_gridHarmBranches->SetCellSize(rowNumber, 3, data.harmonicOrder.size(), 1);
1224 m_gridHarmBranches->SetCellValue(rowNumber, 3, side == 0 ? busName2 : busName1);
1225 m_gridHarmBranches->SetCellSize(rowNumber, 7, data.harmonicOrder.size(), 1);
1226 m_gridHarmBranches->SetCellValue(rowNumber, 7, isOnline);
1227
1228 int i = 0;
1229 for (auto& order : data.harmonicOrder) {
1230 m_gridHarmBranches->SetCellValue(rowNumber, 4, wxString::Format(wxT("%d%s"), order, wxString(L'\u00BA')));
1231 wxString currentStr = "";
1232 wxString angleStr = "";
1234 if (m_gridHarmBranches->GetCellValue(0, 5) == m_currentChoices[0]) {
1235 currentStr.Printf(wxString::Format("%%.%de", m_precision), std::abs(data.harmonicCurrent[side][i]));
1236 }
1237 else if (m_gridHarmBranches->GetCellValue(0, 5) == m_currentChoices[1]) {
1238 currentStr = line->
StringFromDouble(std::abs(data.harmonicCurrent[side][i]) * ib, 0, m_precision);
1239 }
1240 else if (m_gridHarmBranches->GetCellValue(0, 5) == m_currentChoices[2]) {
1241 currentStr = line->
StringFromDouble(std::abs(data.harmonicCurrent[side][i]) * ib / 1e3, 0, m_precision);
1242 }
1243 angleStr = line->
StringFromDouble(wxRadToDeg(std::arg(data.harmonicCurrent[side][i])), 0, m_precision) + wxString(L
'\u00B0');
1244 }
1245 else {
1248 }
1249
1250 m_gridHarmBranches->SetCellValue(rowNumber, 5, currentStr);
1251 m_gridHarmBranches->SetCellValue(rowNumber, 6, angleStr);
1252
1253 i++;
1254 rowNumber++;
1255 }
1256 }
1257 }
1258
1259 for (auto* transformer : transformerList) {
1260 auto data = transformer->GetPUElectricalData(basePower);
1261
1262 double vb = transformer->GetValueFromUnit(data.primaryNominalVoltage, data.primaryNominalVoltageUnit);
1263 double ibp = basePower / (std::sqrt(3.0) * vb);
1264 vb = transformer->GetValueFromUnit(data.secondaryNominalVoltage, data.secondaryNominalVoltageUnit);
1265 double ibs = basePower / (std::sqrt(3.0) * vb);
1266
1267 wxString busName1 = "-";
1269 busName1 =
static_cast<Bus*
>(transformer->
GetParentList()[0])->GetElectricalData().name;
1270 wxString busName2 = "-";
1272 busName2 =
static_cast<Bus*
>(transformer->
GetParentList()[1])->GetElectricalData().name;
1273
1274 wxString isOnline = _("Yes");
1275 wxColour textColour = m_gridHarmBranches->GetDefaultCellTextColour();
1277 isOnline = _("No");
1278 textColour = m_offlineColour;
1279 }
1280 for (int side = 0; side < 2; ++side) {
1281 for (unsigned int i = 0; i < data.harmonicOrder.size(); ++i) {
1282 for (int j = 0; j < 8; ++j) { m_gridHarmBranches->SetCellTextColour(rowNumber + i, j, textColour); }
1283 }
1284 double ib = side == 0 ? ibp : ibs;
1285
1286 m_gridHarmBranches->SetCellSize(rowNumber, 0, data.harmonicOrder.size(), 1);
1287 m_gridHarmBranches->SetCellValue(rowNumber, 0, _("Transformer"));
1288 m_gridHarmBranches->SetCellSize(rowNumber, 1, data.harmonicOrder.size(), 1);
1289 m_gridHarmBranches->SetCellValue(rowNumber, 1, data.name);
1290 m_gridHarmBranches->SetCellSize(rowNumber, 2, data.harmonicOrder.size(), 1);
1291 m_gridHarmBranches->SetCellValue(rowNumber, 2, side == 0 ? busName1 : busName2);
1292 m_gridHarmBranches->SetCellSize(rowNumber, 3, data.harmonicOrder.size(), 1);
1293 m_gridHarmBranches->SetCellValue(rowNumber, 3, side == 0 ? busName2 : busName1);
1294 m_gridHarmBranches->SetCellSize(rowNumber, 7, data.harmonicOrder.size(), 1);
1295 m_gridHarmBranches->SetCellValue(rowNumber, 7, isOnline);
1296
1297 int i = 0;
1298 for (auto& order : data.harmonicOrder) {
1299 m_gridHarmBranches->SetCellValue(rowNumber, 4, wxString::Format(wxT("%d%s"), order, wxString(L'\u00BA')));
1300 wxString currentStr = "";
1301 wxString angleStr = "";
1303 if (m_gridHarmBranches->GetCellValue(0, 5) == m_currentChoices[0]) {
1304 currentStr.Printf(wxString::Format("%%.%de", m_precision), std::abs(data.harmonicCurrent[side][i]));
1305 }
1306 else if (m_gridHarmBranches->GetCellValue(0, 5) == m_currentChoices[1]) {
1307 currentStr = transformer->
StringFromDouble(std::abs(data.harmonicCurrent[side][i]) * ib, 0, m_precision);
1308 }
1309 else if (m_gridHarmBranches->GetCellValue(0, 5) == m_currentChoices[2]) {
1310 currentStr = transformer->
StringFromDouble(std::abs(data.harmonicCurrent[side][i]) * ib / 1e3, 0, m_precision);
1311 }
1312 angleStr = transformer->
StringFromDouble(wxRadToDeg(std::arg(data.harmonicCurrent[side][i])), 0, m_precision) + wxString(L
'\u00B0');
1313 }
1314 else {
1317 }
1318
1319 m_gridHarmBranches->SetCellValue(rowNumber, 5, currentStr);
1320 m_gridHarmBranches->SetCellValue(rowNumber, 6, angleStr);
1321
1322 i++;
1323 rowNumber++;
1324 }
1325 }
1326 }
1327
1328 m_gridHarmBranches->AutoSize();
1329 m_gridHarmBranches->GetContainingSizer()->Layout();
1330 }
1331
1332 m_changingValues = false;
1333}
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.