summaryrefslogtreecommitdiffstats
path: root/Project/ChartView.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Project/ChartView.cpp')
-rw-r--r--Project/ChartView.cpp110
1 files changed, 109 insertions, 1 deletions
diff --git a/Project/ChartView.cpp b/Project/ChartView.cpp
index a8f6448..cc7140f 100644
--- a/Project/ChartView.cpp
+++ b/Project/ChartView.cpp
@@ -45,7 +45,7 @@ ChartView::~ChartView() {}
void ChartView::SetMPWindow()
{
m_mpWindow = new mpWindow(this, wxID_ANY);
-
+
m_mpWindow->SetDoubleBuffered(true);
m_mpWindow->SetMargins(20, 10, 40, 60);
@@ -447,3 +447,111 @@ wxTreeItemId ChartView::UpdateAllPlots(wxTreeItemId root)
wxTreeItemId dummyID;
return dummyID;
}
+
+void ChartView::OnMenuExpCSVClick(wxCommandEvent& event)
+{
+ wxFileDialog saveFileDialog(this, _("Save CSV file"), "", "", "CSV file (*.csv)|*.csv",
+ wxFD_SAVE | wxFD_OVERWRITE_PROMPT);
+ if(saveFileDialog.ShowModal() == wxID_CANCEL) return;
+
+ wxTextFile csvFile(saveFileDialog.GetPath());
+ if(!csvFile.Create()) {
+ if(!csvFile.Open()) {
+ wxMessageDialog msgDialog(this, _("It was not possible to open or create the selected file."), _("Error"),
+ wxOK | wxCENTRE | wxICON_ERROR);
+ msgDialog.ShowModal();
+ }
+ } else
+ csvFile.Open();
+ if(csvFile.IsOpened()) {
+ csvFile.Clear();
+ csvFile.AddLine(GetActiveCurvesCSV());
+ csvFile.Write();
+ csvFile.Close();
+ }
+}
+
+wxString ChartView::GetActiveCurvesCSV()
+{
+ std::vector<PlotData*> activePlotDataList;
+ GetActivePlotData(m_treeCtrl->GetRootItem(), activePlotDataList);
+
+ std::vector<double> xValues;
+ wxString xName = "";
+
+ // Find X axis curve, if none is found, X is the m_time.
+ bool foundXAxis = false;
+ for(auto it = activePlotDataList.begin(), itEnd = activePlotDataList.end(); it != itEnd; ++it) {
+ PlotData* data = *it;
+ if(data->GetAxis() == 1) {
+ xValues = data->GetValues();
+ xName = data->GetName();
+ foundXAxis = true;
+ activePlotDataList.erase(it);
+ delete data;
+ break;
+ }
+ }
+ if(!foundXAxis) {
+ xValues = m_time;
+ xName = _("Time");
+ }
+
+ // Build CSV text.
+ wxString csvText = xName + ";";
+ // Header
+ for(auto it = activePlotDataList.begin(), itEnd = activePlotDataList.end(); it != itEnd; ++it) {
+ PlotData* data = *it;
+ csvText += data->GetName() + ";";
+ }
+ csvText[csvText.length() - 1] = '\n';
+ // Values
+ for(unsigned int i = 0; i < xValues.size(); ++i) {
+ csvText += wxString::FromCDouble(xValues[i], 13) + ";";
+ for(unsigned int j = 0; j < activePlotDataList.size(); ++j) {
+ double value = 0.0;
+ if(i < activePlotDataList[j]->GetValues().size()) {
+ value = activePlotDataList[j]->GetValues()[i];
+ }
+ csvText += wxString::FromCDouble(value, 13) + ";";
+ }
+ csvText[csvText.length() - 1] = '\n';
+ }
+
+ // Clear active plot data vector.
+ for(auto it = activePlotDataList.begin(); it != activePlotDataList.end(); ++it) {
+ delete(*it);
+ }
+ activePlotDataList.clear();
+
+ return csvText;
+}
+
+wxTreeItemId ChartView::GetActivePlotData(wxTreeItemId root, std::vector<PlotData*>& plotDataList)
+{
+ wxTreeItemIdValue cookie;
+ wxTreeItemId item = m_treeCtrl->GetFirstChild(root, cookie);
+ wxTreeItemId child;
+
+ while(item.IsOk()) {
+ if(PlotData* data = dynamic_cast<PlotData*>(m_treeCtrl->GetItemData(item))) {
+ if(data->IsPlot() || data->GetAxis() == 1) {
+ wxString parentName = m_treeCtrl->GetItemText(m_treeCtrl->GetItemParent(item));
+
+ PlotData* dataCopy = new PlotData();
+ *dataCopy = *data;
+ dataCopy->SetName(data->GetName() + " (" + parentName + ")");
+ plotDataList.push_back(dataCopy);
+ }
+ }
+
+ if(m_treeCtrl->ItemHasChildren(item)) {
+ wxTreeItemId nextChild = GetActivePlotData(item, plotDataList);
+ if(nextChild.IsOk()) return nextChild;
+ }
+ item = m_treeCtrl->GetNextChild(root, cookie);
+ }
+
+ wxTreeItemId dummyID;
+ return dummyID;
+}