129{
130 if (ValidateData()) {
131 wxString errorMsg;
132 m_emtElement->UpdateData(m_properties);
133 if (!m_emtElement->CalculateCurrent(errorMsg, Mode::Both, true, true)) {
134 wxMessageDialog msgDialog(m_parent, errorMsg, _("Error"), wxOK | wxCENTRE | wxICON_ERROR);
135 msgDialog.ShowModal();
136 return;
137 }
138 std::vector<double> time, in, timeSamp, inSamp, outR, outI, outM, outP, freq;
139 std::vector <double> timeThreePhase, currentA, currentB, currentC;
140 std::vector <double> magIa, magIb, magIc, angIa, angIb, angIc;
141
142 auto inFFTData = m_emtElement->GetEMTElementData().inFFTData;
143 auto outFFTData = m_emtElement->GetEMTElementData().outFFTData;
144
145
146
147
148 for (auto& data : m_emtElement->GetEMTElementData().atpSampleData)
149 {
150 time.emplace_back(data.t);
151 currentA.emplace_back(data.current[0]);
152 currentB.emplace_back(data.current[1]);
153 currentC.emplace_back(data.current[2]);
154 magIa.emplace_back(data.mag[0]);
155 magIb.emplace_back(data.mag[1]);
156 magIc.emplace_back(data.mag[2]);
157 angIa.emplace_back(data.angle[0] * 180.0 / M_PI);
158 angIb.emplace_back(data.angle[1] * 180.0 / M_PI);
159 angIc.emplace_back(data.angle[2] * 180.0 / M_PI);
160
161 }
162 for (auto data : inFFTData) {
163 timeSamp.emplace_back(data.first);
164 inSamp.emplace_back(data.second);
165 }
166 for (auto data : outFFTData) {
167 outR.emplace_back(data.second.real());
168 outI.emplace_back(data.second.imag());
169 outM.emplace_back(abs(data.second));
170 outP.emplace_back(arg(data.second) * 180.0 / M_PI);
171 freq.emplace_back(data.first);
172 }
173
174
175 std::vector<double> currMag, currPha, harmOrder;
176 auto harmData = m_emtElement->GetEMTElementData().currHarmonics;
177
178
179
180
181
182
183 for (auto const& data : harmData) {
184 currMag.emplace_back(abs(data.second));
185 currPha.emplace_back(arg(data.second) * 180.0 / M_PI);
186 harmOrder.emplace_back(static_cast<double>(data.first));
187 }
188
189 std::vector<ElementPlotData> plotDataList;
190
191 ElementPlotData plot3PATPData(_(
"ATP Three-phase output"), ElementPlotData::CurveType::CT_TEST);
192 ElementPlotData plotFFTData(_(
"Fourier Analysis"), ElementPlotData::CurveType::CT_TEST);
193 ElementPlotData plotCurrData(_(
"Current Phasor"), ElementPlotData::CurveType::CT_TEST);
194
195
196
197 plot3PATPData.AddData(currentA, _("Phase A Current"));
198 plot3PATPData.AddData(currentB, _("Phase B Current"));
199 plot3PATPData.AddData(currentC, _("Phase C Current"));
200 plot3PATPData.AddData(magIa, _("Magnitude A Current"));
201 plot3PATPData.AddData(magIb, _("Magnitude B Current"));
202 plot3PATPData.AddData(magIc, _("Magnitude C Current"));
203 plot3PATPData.AddData(angIa, _("Angle A Current"));
204 plot3PATPData.AddData(angIb, _("Angle B Current"));
205 plot3PATPData.AddData(angIc, _("Angle C Current"));
206 plot3PATPData.AddData(timeThreePhase, _("Time 3f"));
207
208 plotFFTData.AddData(inSamp, _("Input"));
209 plotFFTData.AddData(timeSamp, _("Time Sampled"));
210 plotFFTData.AddData(outR, _("Real"));
211 plotFFTData.AddData(outI, _("Imaginary"));
212 plotFFTData.AddData(outM, _("Magnitude"));
213 plotFFTData.AddData(outP, _("Phase"));
214 plotFFTData.AddData(freq, _("Frequency"));
215
216 plotCurrData.AddData(currMag, _("Magnitude"));
217 plotCurrData.AddData(currPha, _("Phase"));
218 plotCurrData.AddData(harmOrder, _("Harmonic Order"));
219
220
221 plotDataList.push_back(plot3PATPData);
222 plotDataList.push_back(plotFFTData);
223 plotDataList.push_back(plotCurrData);
224
225
226 auto& cwMngr = m_workspace->GetChartWindowManager();
227 cwMngr.Open(plotDataList, time);
228 }
229}