Power System Platform  2026w10a-beta
Loading...
Searching...
No Matches
HarmCurrentForm.cpp
1#include "../elements/powerElement/HarmCurrent.h"
2#include "HarmCurrentForm.h"
3
4HarmCurrentForm::HarmCurrentForm(wxWindow* parent, HarmCurrent* harmCurrent) : HarmCurrentFormBase(parent)
5{
6 m_parent = parent;
7 m_harmCurrent = harmCurrent;
8
9 m_listCtrlHarmCurrentList->AppendColumn(_("Order"));
10 m_listCtrlHarmCurrentList->AppendColumn(_("Current"));
11 m_listCtrlHarmCurrentList->AppendColumn(_("Unit"));
12 m_listCtrlHarmCurrentList->AppendColumn(_("Angle"));
13
14 auto data = m_harmCurrent->GetElectricalData();
15 m_textCtrlName->SetValue(data.name);
16 for(unsigned int i = 0; i < data.harmonicOrder.size(); ++i) {
17 long item = m_listCtrlHarmCurrentList->InsertItem(m_maxID, wxString::Format("%d", data.harmonicOrder[i]));
18 m_listCtrlHarmCurrentList->SetItem(item, 1, m_harmCurrent->StringFromDouble(data.injHarmCurrent[i], 1));
19 m_listCtrlHarmCurrentList->SetItem(item, 2, data.injHarmCurrentUnit[i] == ElectricalUnit::UNIT_A ? _("A") : _("p.u."));
20 m_listCtrlHarmCurrentList->SetItem(item, 3, m_harmCurrent->StringFromDouble(data.injHarmAngle[i], 1));
21 m_maxID++;
22 }
23
24 SetSize(GetBestSize());
25 Layout();
26}
27
28HarmCurrentForm::~HarmCurrentForm() {}
29
30void HarmCurrentForm::OnCancelButtonClick(wxCommandEvent& event) { EndModal(wxID_CANCEL); }
31void HarmCurrentForm::OnOKButtonClick(wxCommandEvent& event)
32{
33 if(ValidateData()) EndModal(wxID_OK);
34}
35
36bool HarmCurrentForm::ValidateData()
37{
38 wxString name = m_textCtrlName->GetValue();
39 std::vector<int> harmonicOrder;
40 std::vector<double> injHarmCurrent;
41 std::vector<ElectricalUnit> injHarmCurrentUnit;
42 std::vector<double> injHarmAngle;
43
44 long item = -1;
45 while(true) {
46 item = m_listCtrlHarmCurrentList->GetNextItem(item, wxLIST_NEXT_ALL);
47 if(item == -1) break;
48 harmonicOrder.push_back(wxAtoi(m_listCtrlHarmCurrentList->GetItemText(item, 0)));
49 double injCurrent = 0.0;
50 if(!m_listCtrlHarmCurrentList->GetItemText(item, 1).ToDouble(&injCurrent)) { return false; }
51 injHarmCurrent.push_back(injCurrent);
52 if(m_listCtrlHarmCurrentList->GetItemText(item, 2) == "A")
53 injHarmCurrentUnit.push_back(ElectricalUnit::UNIT_A);
54 else
55 injHarmCurrentUnit.push_back(ElectricalUnit::UNIT_PU);
56 double injCAngle = 0.0;
57 if(!m_listCtrlHarmCurrentList->GetItemText(item, 3).ToDouble(&injCAngle)) { return false; }
58 injHarmAngle.push_back(injCAngle);
59 }
60
61 auto data = m_harmCurrent->GetElectricalData();
62 data.name = name;
63 data.harmonicOrder = harmonicOrder;
64 data.injHarmCurrent = injHarmCurrent;
65 data.injHarmCurrentUnit = injHarmCurrentUnit;
66 data.injHarmAngle = injHarmAngle;
67 m_harmCurrent->SetElectricalData(data);
68
69 return true;
70}
71void HarmCurrentForm::OnAddButtonClick(wxCommandEvent& event)
72{
73 wxString order = m_pgPropHarmOrder->GetValue().GetString(); // Get order in properties
74 // Look if already have the order in the list
75 long item = -1;
76 bool findOrder = false;
77 while(true) {
78 item = m_listCtrlHarmCurrentList->GetNextItem(item, wxLIST_NEXT_ALL);
79 if(item == -1) break;
80 if(m_listCtrlHarmCurrentList->GetItemText(item, 0) == order) {
81 findOrder = true;
82 break;
83 }
84 }
85
86 if(!findOrder) item = m_listCtrlHarmCurrentList->InsertItem(m_maxID, m_pgPropHarmOrder->GetValue().GetString());
87 m_listCtrlHarmCurrentList->SetItem(item, 1, m_pgPropHarmCurrent->GetValue().GetString());
88 m_listCtrlHarmCurrentList->SetItem(item, 2, m_pgPropUnit->GetValue().GetInteger() == 0 ? _("A") : _("p.u."));
89 m_listCtrlHarmCurrentList->SetItem(item, 3, m_pgPropHarmAngle->GetValue().GetString());
90 if(!findOrder) m_maxID++;
91
92 SortList();
93}
94void HarmCurrentForm::OnRemoveButtonClick(wxCommandEvent& event)
95{
96 std::vector<long> itemList;
97 long item = -1;
98 while(true) {
99 item = m_listCtrlHarmCurrentList->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
100 if(item == -1) break;
101 itemList.push_back(item);
102 }
103 for(int i = static_cast<int>(itemList.size()) - 1; i >= 0; --i) {
104 m_listCtrlHarmCurrentList->DeleteItem(itemList[i]);
105 }
106}
107
108void HarmCurrentForm::SortList()
109{
110 // Get data, sort and recreate list.
111
112 std::vector<int> harmonicOrder;
113 std::vector<double> injHarmCurrent;
114 std::vector<ElectricalUnit> injHarmCurrentUnit;
115 std::vector<double> injHarmAngle;
116
117 // Get data
118 long item = -1;
119 while(true) {
120 item = m_listCtrlHarmCurrentList->GetNextItem(item, wxLIST_NEXT_ALL);
121 if(item == -1) break;
122 harmonicOrder.push_back(wxAtoi(m_listCtrlHarmCurrentList->GetItemText(item, 0)));
123 double injCurrent = 0.0;
124 if(!m_listCtrlHarmCurrentList->GetItemText(item, 1).ToDouble(&injCurrent)) return;
125 injHarmCurrent.push_back(injCurrent);
126 if(m_listCtrlHarmCurrentList->GetItemText(item, 2) == "A")
127 injHarmCurrentUnit.push_back(ElectricalUnit::UNIT_A);
128 else
129 injHarmCurrentUnit.push_back(ElectricalUnit::UNIT_PU);
130 double injCAngle = 0.0;
131 if(!m_listCtrlHarmCurrentList->GetItemText(item, 3).ToDouble(&injCAngle)) return;
132 injHarmAngle.push_back(injCAngle);
133 }
134
135 // Sort
136 for(unsigned int i = 0; i < harmonicOrder.size(); ++i) {
137 for(unsigned int j = 0; j < harmonicOrder.size(); ++j) {
138 if(harmonicOrder[i] < harmonicOrder[j]) {
139 int h = harmonicOrder[j];
140 harmonicOrder[j] = harmonicOrder[i];
141 harmonicOrder[i] = h;
142
143 double current = injHarmCurrent[j];
144 injHarmCurrent[j] = injHarmCurrent[i];
145 injHarmCurrent[i] = current;
146
147 auto unit = injHarmCurrentUnit[j];
148 injHarmCurrentUnit[j] = injHarmCurrentUnit[i];
149 injHarmCurrentUnit[i] = unit;
150
151 double angle = injHarmAngle[j];
152 injHarmAngle[j] = injHarmAngle[i];
153 injHarmAngle[i] = angle;
154 }
155 }
156 }
157
158 // Clear all and reconstruct list
159 m_listCtrlHarmCurrentList->ClearAll();
160 m_listCtrlHarmCurrentList->AppendColumn(_("Order"));
161 m_listCtrlHarmCurrentList->AppendColumn(_("Current"));
162 m_listCtrlHarmCurrentList->AppendColumn(_("Unit"));
163 m_listCtrlHarmCurrentList->AppendColumn(_("Angle"));
164 m_maxID = 0;
165 for(unsigned int i = 0; i < harmonicOrder.size(); ++i) {
166 long item = m_listCtrlHarmCurrentList->InsertItem(m_maxID, wxString::Format("%d", harmonicOrder[i]));
167 m_listCtrlHarmCurrentList->SetItem(item, 1, m_harmCurrent->StringFromDouble(injHarmCurrent[i], 1));
168 m_listCtrlHarmCurrentList->SetItem(item, 2, injHarmCurrentUnit[i] == ElectricalUnit::UNIT_A ? _("A") : _("p.u."));
169 m_listCtrlHarmCurrentList->SetItem(item, 3, m_harmCurrent->StringFromDouble(injHarmAngle[i], 1));
170 m_maxID++;
171 }
172}
static wxString StringFromDouble(double value, int minDecimal=1, int maxDecimals=13)
Convert a double value to string.
Definition Element.cpp:533
Shunt Harmonic Corrent Source.
Definition HarmCurrent.h:24