diff options
author | Thales Lima Oliveira <thaleslima.ufu@gmail.com> | 2017-05-03 19:15:52 -0300 |
---|---|---|
committer | Thales Lima Oliveira <thaleslima.ufu@gmail.com> | 2017-05-03 19:15:52 -0300 |
commit | fb34d58e810ca4d9c886a0d4f9f2ae24cf45dbf9 (patch) | |
tree | fdafe78aea92607eec0964dafe65d8f54a8b53fe /Project | |
parent | 50f31898499d1d1e1ebc8ab9c9c26d3b4ec1b3c1 (diff) | |
download | PSP.git-fb34d58e810ca4d9c886a0d4f9f2ae24cf45dbf9.tar.gz PSP.git-fb34d58e810ca4d9c886a0d4f9f2ae24cf45dbf9.tar.xz PSP.git-fb34d58e810ca4d9c886a0d4f9f2ae24cf45dbf9.zip |
Chart view implemented
Diffstat (limited to 'Project')
-rw-r--r-- | Project/ChartView.cpp | 186 | ||||
-rw-r--r-- | Project/ChartView.h | 7 | ||||
-rw-r--r-- | Project/ChartView.wxcp | 4 | ||||
-rw-r--r-- | Project/ChartViewBase.cpp | 6 | ||||
-rw-r--r-- | Project/ControlEditor.cpp | 20 | ||||
-rw-r--r-- | Project/Project.mk | 2 | ||||
-rw-r--r-- | Project/main.cpp | 3 |
7 files changed, 192 insertions, 36 deletions
diff --git a/Project/ChartView.cpp b/Project/ChartView.cpp index a9ac2c6..199060a 100644 --- a/Project/ChartView.cpp +++ b/Project/ChartView.cpp @@ -6,6 +6,7 @@ ChartView::ChartView(wxWindow* parent, std::vector<ElementPlotData> epdList, std { m_epdList = epdList; m_time = time; + m_xAxisValues = time; m_menuItemShowGrid->Check(m_hideGrid ? false : true); m_menuItemShowLabel->Check(m_showLeg); @@ -23,12 +24,20 @@ ChartView::ChartView(wxWindow* parent, std::vector<ElementPlotData> epdList, std m_pgPropAxisLimit->SetValue(wxT("<composed>")); m_pgMgr->Collapse(m_pgPropAxisLimit); + // Add line type choices + m_pgProplineType->AddChoice(_("Solid"), wxPENSTYLE_SOLID); + m_pgProplineType->AddChoice(_("Dot"), wxPENSTYLE_DOT); + m_pgProplineType->AddChoice(_("Dash"), wxPENSTYLE_SHORT_DASH); + m_pgProplineType->AddChoice(_("Dot and dash"), wxPENSTYLE_DOT_DASH); + m_pgProplineType->AddChoice(_("Cross"), wxPENSTYLE_CROSS_HATCH); + m_pgProplineType->AddChoice(_("Driagonal cross"), wxPENSTYLE_CROSSDIAG_HATCH); + SetMPWindow(); GetSizer()->Add(m_mpWindow, 1, wxEXPAND, WXC_FROM_DIP(5)); SetTreectrl(); Layout(); SetInitialSize(); - + BuildColourList(); } @@ -107,6 +116,40 @@ void ChartView::OnPropertyGridChange(wxPropertyGridEvent& event) { bool fit = false; + if(m_treeCtrl->GetSelection()) { + if(PlotData* data = dynamic_cast<PlotData*>(m_treeCtrl->GetItemData(m_treeCtrl->GetSelection()))) { + if(event.GetPropertyName() == _("Draw")) { + bool isPlotting = m_pgPropDraw->GetValue(); + data->SetPlot(isPlotting); + if(isPlotting) { + wxColour colour = GetNextColour(); + data->SetColour(colour); + m_pgPropColor->SetValue(static_cast<wxVariant>(colour)); + } + fit = true; + } else if(event.GetPropertyName() == _("Color")) { + wxColour colour; + colour << m_pgPropColor->GetValue(); + data->SetColour(colour); + } else if(event.GetPropertyName() == _("Thickness")) { + data->SetThick(m_pgProplineThick->GetValue().GetInteger()); + } else if(event.GetPropertyName() == _("Type")) { + data->SetPenType(static_cast<wxPenStyle>(m_pgProplineType->GetValue().GetInteger())); + } else if(event.GetPropertyName() == _("Axis")) { + int axis = m_pgProplineAxis->GetValue().GetInteger(); + if(axis == 1) { // Y + // All lines to Y axis + AllToYAxis(m_treeCtrl->GetRootItem()); + // curva selecionada para o eixo X + m_treeCtrl->SetItemTextColour(m_treeCtrl->GetSelection(), *wxRED); + m_xAxisValues = data->GetValues(); + } + data->SetAxis(axis); + fit = true; + } + } + } + if(event.GetPropertyName() == _("Margins")) { m_mpWindow->SetMargins(m_pgPropMarginsUp->GetValue().GetLong(), m_pgPropMarginsRight->GetValue().GetLong(), m_pgPropMarginsBot->GetValue().GetLong(), m_pgPropMarginsLeft->GetValue().GetLong()); @@ -138,8 +181,69 @@ void ChartView::OnMenuDarkThemeClick(wxCommandEvent& event) m_mpWindow->UpdateAll(); } -void ChartView::OnMenuSaveImageClick(wxCommandEvent& event) {} -void ChartView::OnMenuSendClipClick(wxCommandEvent& event) {} +void ChartView::OnMenuSaveImageClick(wxCommandEvent& event) +{ + int x = m_mpWindow->GetScreenPosition().x; + int y = m_mpWindow->GetScreenPosition().y; + int width = m_mpWindow->GetSize().GetWidth(); + int height = m_mpWindow->GetSize().GetHeight(); + + wxScreenDC dcScreen; + wxBitmap screenshot(width, height); + + wxMemoryDC memDC; + memDC.SelectObject(screenshot); + + memDC.Blit(0, 0, width, height, &dcScreen, x, y); + memDC.SelectObject(wxNullBitmap); + + wxFileDialog saveFileDialog( + this, _("Save image"), "", "", + "PNG image file (*.png)|*.png|Bitmap image file (*.bmp)|*.bmp|JPEG image file (*.jpg)|*.jpg", + wxFD_SAVE | wxFD_OVERWRITE_PROMPT); + if(saveFileDialog.ShowModal() == wxID_CANCEL) return; + + wxFileName imagePath(saveFileDialog.GetPath()); + wxBitmapType imageType = wxBITMAP_TYPE_BMP; + + if(imagePath.GetExt() == "png") + imageType = wxBITMAP_TYPE_PNG; + else if(imagePath.GetExt() == "jpg") + imageType = wxBITMAP_TYPE_JPEG; + + screenshot.SaveFile(imagePath.GetFullPath(), imageType); +} + +void ChartView::OnMenuSendClipClick(wxCommandEvent& event) +{ + int x = m_mpWindow->GetScreenPosition().x; + int y = m_mpWindow->GetScreenPosition().y; + int width = m_mpWindow->GetSize().GetWidth(); + int height = m_mpWindow->GetSize().GetHeight(); + + wxScreenDC dcScreen; + wxBitmap screenshot(width, height); + + wxMemoryDC memDC; + memDC.SelectObject(screenshot); + + memDC.Blit(0, 0, width, height, &dcScreen, x, y); + memDC.SelectObject(wxNullBitmap); + + if(wxTheClipboard->Open()) { + wxTheClipboard->SetData(new wxBitmapDataObject(screenshot)); + wxTheClipboard->Close(); + + wxMessageDialog msgDialog(this, _("Chart send to clipboard"), _("Info"), wxOK | wxICON_INFORMATION, + wxDefaultPosition); + msgDialog.ShowModal(); + } else { + wxMessageDialog msgDialog(this, _("It was not possible to send to clipboard"), _("Error"), wxOK | wxICON_ERROR, + wxDefaultPosition); + msgDialog.ShowModal(); + } +} + void ChartView::OnMenuShowCoordinatesClick(wxCommandEvent& event) { m_showCoords = event.IsChecked(); @@ -181,6 +285,7 @@ void ChartView::UpdatePlot(bool fit) m_mpWindow->DelAllLayers(true, false); // GoAllTrees(treeCtrl_ChartSelection->GetRootItem()); + UpdateAllPlots(m_treeCtrl->GetRootItem()); m_xaxis = new mpScaleX(m_pgPropXLabel->GetValueAsString(), mpALIGN_BOTTOM, true); m_yaxis = new mpScaleY(m_pgPropYLabel->GetValueAsString(), mpALIGN_LEFT, true); @@ -221,26 +326,22 @@ void ChartView::UpdatePlot(bool fit) void ChartView::OnTreeItemActivated(wxTreeEvent& event) { - PlotData* data = dynamic_cast<PlotData*>(m_treeCtrl->GetItemData(event.GetItem())); - - if(data) { + if(PlotData* data = dynamic_cast<PlotData*>(m_treeCtrl->GetItemData(event.GetItem()))) { bool isPlotting = data->IsPlot() ? false : true; data->SetPlot(isPlotting); m_pgPropDraw->SetValue(data->IsPlot()); if(isPlotting) { wxColour colour = GetNextColour(); - wxVariant vColour; - vColour << colour; - //data->SetColour(colour); - m_pgPropColor->SetValue(vColour); + data->SetColour(colour); + m_pgPropColor->SetValue(static_cast<wxVariant>(colour)); } UpdatePlot(true); } if(event.GetItem() == m_treeTimeID) { - // AllToYAxis(treeCtrl_ChartSelection->GetRootItem()); + AllToYAxis(m_treeCtrl->GetRootItem()); m_treeCtrl->SetItemTextColour(m_treeTimeID, *wxRED); - // xAxisValues = time; + m_xAxisValues = m_time; UpdatePlot(true); } @@ -249,8 +350,7 @@ void ChartView::OnTreeItemActivated(wxTreeEvent& event) void ChartView::OnTreeItemSelectionChanged(wxTreeEvent& event) { - PlotData* data = dynamic_cast<PlotData*>(m_treeCtrl->GetItemData(event.GetItem())); - if(data) { + if(PlotData* data = dynamic_cast<PlotData*>(m_treeCtrl->GetItemData(event.GetItem()))) { m_pgPropDraw->SetValue(data->IsPlot()); wxVariant colour; colour << data->GetColour(); @@ -277,8 +377,8 @@ void ChartView::BuildColourList() m_colourList.push_back(wxColour(255, 0, 128)); m_colourList.push_back(wxColour(0, 128, 255)); m_colourList.push_back(wxColour(128, 128, 128)); - m_colourList.push_back(wxColour(0, 0, 0)); - m_itColourList = m_colourList.end(); + m_colourList.push_back(*wxBLACK); + m_itColourList = --m_colourList.end(); } wxColour ChartView::GetNextColour() @@ -290,3 +390,57 @@ wxColour ChartView::GetNextColour() return *m_itColourList; } + +wxTreeItemId ChartView::AllToYAxis(wxTreeItemId root) +{ + wxTreeItemIdValue cookie; + wxTreeItemId item = m_treeCtrl->GetFirstChild(root, cookie); + wxTreeItemId child; + + while(item.IsOk()) { + m_treeCtrl->SetItemTextColour(item, *wxBLACK); + if(PlotData* data = dynamic_cast<PlotData*>(m_treeCtrl->GetItemData(item))) data->SetAxis(0); // X axis. + + if(m_treeCtrl->ItemHasChildren(item)) { + wxTreeItemId nextChild = AllToYAxis(item); + if(nextChild.IsOk()) return nextChild; + } + item = m_treeCtrl->GetNextChild(root, cookie); + } + + wxTreeItemId dummyID; + return dummyID; +} + +wxTreeItemId ChartView::UpdateAllPlots(wxTreeItemId root) +{ + 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()) { + wxString parentName = m_treeCtrl->GetItemText(m_treeCtrl->GetItemParent(item)); + mpFXYVector* newLayer = new mpFXYVector(data->GetName() + " (" + parentName + ")"); + newLayer->SetData(m_xAxisValues, data->GetValues()); + newLayer->SetContinuity(true); + wxPen layerPen(data->GetColour(), data->GetThick(), data->GetPenType()); + newLayer->SetPen(layerPen); + newLayer->SetDrawOutsideMargins(false); + newLayer->ShowName(false); + + m_mpWindow->AddLayer(newLayer); + } + } + + if(m_treeCtrl->ItemHasChildren(item)) { + wxTreeItemId nextChild = UpdateAllPlots(item); + if(nextChild.IsOk()) return nextChild; + } + item = m_treeCtrl->GetNextChild(root, cookie); + } + + wxTreeItemId dummyID; + return dummyID; +} diff --git a/Project/ChartView.h b/Project/ChartView.h index a219608..b40a63d 100644 --- a/Project/ChartView.h +++ b/Project/ChartView.h @@ -4,6 +4,10 @@ #include "wxMathPlot/mathplot.h" #include <wx/msgdlg.h> +#include <wx/clipbrd.h> +#include <wx/bitmap.h> +#include <wx/dcscreen.h> +#include <wx/filedlg.h> class ElementPlotData; @@ -32,6 +36,8 @@ class ChartView : public ChartViewBase virtual void SetTreectrl(); virtual void BuildColourList(); virtual wxColour GetNextColour(); + virtual wxTreeItemId AllToYAxis(wxTreeItemId root); + virtual wxTreeItemId UpdateAllPlots(wxTreeItemId root); wxPGProperty* m_pgPropColor = NULL; @@ -39,6 +45,7 @@ class ChartView : public ChartViewBase std::vector<ElementPlotData> m_epdList; std::vector<double> m_time; + std::vector<double> m_xAxisValues; mpWindow* m_mpWindow = NULL; mpScaleX* m_xaxis = NULL; diff --git a/Project/ChartView.wxcp b/Project/ChartView.wxcp index 2f590ee..c1d3cfc 100644 --- a/Project/ChartView.wxcp +++ b/Project/ChartView.wxcp @@ -1177,11 +1177,11 @@ }, { "type": "string", "m_label": "String Value", - "m_value": "1" + "m_value": "" }, { "type": "multi-string", "m_label": "Choices:", - "m_value": "Solid;Dot;Dash;Dot and dash;Cross;Diagonal cross" + "m_value": "" }, { "type": "multi-string", "m_label": "Array Integer Values", diff --git a/Project/ChartViewBase.cpp b/Project/ChartViewBase.cpp index 8c2bc32..4b33d5c 100644 --- a/Project/ChartViewBase.cpp +++ b/Project/ChartViewBase.cpp @@ -93,12 +93,6 @@ ChartViewBase::ChartViewBase(wxWindow* parent, wxWindowID id, const wxString& ti m_pgMgrArr.Clear(); m_pgMgrIntArr.Clear(); - m_pgMgrArr.Add(_("Solid")); - m_pgMgrArr.Add(_("Dot")); - m_pgMgrArr.Add(_("Dash")); - m_pgMgrArr.Add(_("Dot and dash")); - m_pgMgrArr.Add(_("Cross")); - m_pgMgrArr.Add(_("Diagonal cross")); m_pgProplineType = m_pgMgr->AppendIn( m_pgPropLineProp, new wxEnumProperty( _("Type"), wxPG_LABEL, m_pgMgrArr, m_pgMgrIntArr, 0) ); m_pgProplineType->SetHelpString(wxT("")); m_pgProplineType->SetEditor( wxT("Choice") ); diff --git a/Project/ControlEditor.cpp b/Project/ControlEditor.cpp index a3ab3d9..a9d0213 100644 --- a/Project/ControlEditor.cpp +++ b/Project/ControlEditor.cpp @@ -618,27 +618,27 @@ void ControlEditor::OnKeyDown(wxKeyEvent& event) { //tests if(event.ControlDown() && event.ShiftDown()) { - std::vector<double> time, x2, x3; - for(int i=0; i<100; ++i) { + std::vector<double> time, sinC, cosC, tgC; + for(int i=0; i<360; ++i) { time.push_back(i); - x2.push_back(std::pow(static_cast<double>(i),2)); - x3.push_back(std::pow(static_cast<double>(i),3)); + sinC.push_back(std::sin(wxDegToRad(i))); + cosC.push_back(std::cos(wxDegToRad(i))); + tgC.push_back(std::tan(wxDegToRad(i))); } std::vector<ElementPlotData> epdList; ElementPlotData curve1Data(_("Func. polinomiais 1"), ElementPlotData::CT_BUS); - curve1Data.AddData(x2, _("x^2")); - curve1Data.AddData(x3, _("x^3")); + curve1Data.AddData(sinC, _("seno")); epdList.push_back(curve1Data); ElementPlotData curve2Data(_("Func. polinomiais 2"), ElementPlotData::CT_BUS); - curve2Data.AddData(x2, _("x^2")); - curve2Data.AddData(x3, _("x^3")); + curve2Data.AddData(tgC, _("tangente")); epdList.push_back(curve2Data); ElementPlotData curve3Data(_("Func. polinomiais 3"), ElementPlotData::CT_SYNC_GENERATOR); - curve3Data.AddData(x2, _("x^2")); - curve3Data.AddData(x3, _("x^3")); + curve3Data.AddData(sinC, _("seno")); + curve3Data.AddData(cosC, _("cosseno")); + curve3Data.AddData(tgC, _("tangente")); epdList.push_back(curve3Data); ChartView* cView = new ChartView(this, epdList, time); diff --git a/Project/Project.mk b/Project/Project.mk index 3125163..c43d7d9 100644 --- a/Project/Project.mk +++ b/Project/Project.mk @@ -13,7 +13,7 @@ CurrentFileName := CurrentFilePath := CurrentFileFullPath := User :=NDSE-69 -Date :=27/04/2017 +Date :=03/05/2017 CodeLitePath :="C:/Program Files/CodeLite" LinkerName :=C:/TDM-GCC-64/bin/g++.exe SharedObjectLinkerName :=C:/TDM-GCC-64/bin/g++.exe -shared -fPIC diff --git a/Project/main.cpp b/Project/main.cpp index 515b433..e24860d 100644 --- a/Project/main.cpp +++ b/Project/main.cpp @@ -25,8 +25,9 @@ public: virtual bool OnInit() { - // Add png image handler + // Add image handlers wxImage::AddHandler(new wxPNGHandler); + wxImage::AddHandler(new wxJPEGHandler); wxLocale* locale = new wxLocale(); LoadCatalogs(locale); |