1 /*# ---------------------------------------------------------------------
3 # Copyright (c) CREATIS (Centre de Recherche en Acquisition et Traitement de l'Image
5 # Authors : Eduardo Davila, Frederic Cervenansky, Claire Mouton
6 # Previous Authors : Laurent Guigues, Jean-Pierre Roux
7 # CreaTools website : www.creatis.insa-lyon.fr/site/fr/creatools_accueil
9 # This software is governed by the CeCILL-B license under French law and
10 # abiding by the rules of distribution of free software. You can use,
11 # modify and/ or redistribute the software under the terms of the CeCILL-B
12 # license as circulated by CEA, CNRS and INRIA at the following URL
13 # http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
14 # or in the file LICENSE.txt.
16 # As a counterpart to the access to the source code and rights to copy,
17 # modify and redistribute granted by the license, users are provided only
18 # with a limited warranty and the software's author, the holder of the
19 # economic rights, and the successive licensors have only limited
22 # The fact that you are presently reading this means that you have had
23 # knowledge of the CeCILL-B license and that you accept its terms.
24 # ------------------------------------------------------------------------ */
26 //---------------------------------------------------------------------------------------------
27 // Class definition include
28 //---------------------------------------------------------------------------------------------
31 // --------------------------------------------------------------------------------------------
32 // WX headers inclusion.
33 // For compilers that support precompilation, includes <wx/wx.h>.
34 // --------------------------------------------------------------------------------------------
40 //---------------------------------------------------------------------------------------------
41 // Class implementation
42 //---------------------------------------------------------------------------------------------
44 IMPLEMENT_CLASS(pPlotter, wxPanel)
46 //------------------------------------------------------------------------------------------------------------
47 // Generated events declaration and definition
48 //------------------------------------------------------------------------------------------------------------
49 BEGIN_DECLARE_EVENT_TYPES()
50 DECLARE_EVENT_TYPE( wxEVT_NW_TEXT_MESAGGE, -1 )
51 END_DECLARE_EVENT_TYPES()
53 DEFINE_EVENT_TYPE( wxEVT_NW_TEXT_MESAGGE )
55 // ----------------------------------------------------------------------------------------------------
56 // Handdled events from pColorBar
57 // ----------------------------------------------------------------------------------------------------
58 DECLARE_EVENT_TYPE(wxEVT_ADDED_POINT, -1)
59 DECLARE_EVENT_TYPE(wxEVT_REMOVED_POINT, -1)
60 DECLARE_EVENT_TYPE(wxEVT_MOVED_POINT, -1)
61 DECLARE_EVENT_TYPE(wxEVT_CHANGED_POINT, -1)
62 DECLARE_EVENT_TYPE(wxEVT_ON_COLOR_BAR, -1)
64 // ----------------------------------------------------------------------------------------------------
65 // Handdled events from plotter
66 // ----------------------------------------------------------------------------------------------------
67 DECLARE_EVENT_TYPE(wxEVT_PPLOTTER_CHANGED_FUNCTION, -1)
68 DECLARE_EVENT_TYPE(wxEVT_PPLOTTER_POINT_MOVE, -1)
69 DECLARE_EVENT_TYPE(wxEVT_PPLOTTER_POINT_ADD, -1)
70 DECLARE_EVENT_TYPE(wxEVT_PPLOTTER_POINT_DELETE, -1)
71 DECLARE_EVENT_TYPE(wxEVT_PPLOTTER_GUIDELINES, -1)
73 // ----------------------------------------------------------------------------------------------------
74 // Handdled events from max-min barrange
75 // ----------------------------------------------------------------------------------------------------
76 DECLARE_EVENT_TYPE(wxEVT_TSBAR, -1)
77 DECLARE_EVENT_TYPE(wxEVT_TSBAR_ACTUAL, -1)
78 DECLARE_EVENT_TYPE(wxEVT_TSBAR_START, -1)
79 DECLARE_EVENT_TYPE(wxEVT_TSBAR_END, -1)
80 DECLARE_EVENT_TYPE(wxEVT_TSBAR_MOVED, -1)
81 DECLARE_EVENT_TYPE(wxEVT_SELECTION_END, -1)
84 // ----------------------------------------------------------------------------------------------------
85 // EVENT TABLE (->Connect: analogous)
86 //-----------------------------------------------------------------------------------------------------
87 BEGIN_EVENT_TABLE(pPlotter, wxPanel)
89 //EVT_SIZE (pPlotter::OnSize)
91 // Connectting the handled envents for the plotter to the corresponding methods
92 EVT_COMMAND (-1,wxEVT_PPLOTTER_CHANGED_FUNCTION, pPlotter::onChangeFunction)
93 EVT_COMMAND (-1,wxEVT_PPLOTTER_POINT_MOVE, pPlotter::onMovePoint_Plotter)
94 EVT_COMMAND (-1,wxEVT_PPLOTTER_POINT_ADD, pPlotter::onAddedPoint_Plotter)
95 EVT_COMMAND (-1,wxEVT_PPLOTTER_POINT_DELETE, pPlotter::onRemovedPoint_Plotter)
96 EVT_COMMAND (-1,wxEVT_PPLOTTER_GUIDELINES, pPlotter::onGuideLines)
98 // Connectting the handled envents for the color bar to the corresponding methods
99 EVT_COMMAND (-1,wxEVT_ADDED_POINT, pPlotter :: onAdded_ColorPoint )
100 EVT_COMMAND (-1,wxEVT_REMOVED_POINT, pPlotter :: onRemoved_ColorPoint )
101 EVT_COMMAND (-1,wxEVT_MOVED_POINT, pPlotter :: onMoved_ColorPoint )
102 EVT_COMMAND (-1,wxEVT_CHANGED_POINT, pPlotter :: onChanged_ColorPoint )
103 EVT_COMMAND (-1,wxEVT_ON_COLOR_BAR, pPlotter :: onColorBar )
105 // Connectting the handled envents from the max-min barrange to the corresponding methods
106 EVT_COMMAND (-1,wxEVT_TSBAR, pPlotter::onBarrange)
107 EVT_COMMAND (-1,wxEVT_SELECTION_END, pPlotter::onSelectionEnd)
108 EVT_COMMAND (-1,wxEVT_TSBAR_MOVED, pPlotter::onMovedBar)
109 EVT_COMMAND (-1,wxEVT_TSBAR_ACTUAL, pPlotter:: onActualChange_Bar)
110 EVT_COMMAND (-1,wxEVT_TSBAR_START, pPlotter::onStartChange_Bar)
111 EVT_COMMAND (-1,wxEVT_TSBAR_END, pPlotter::onEndChange_Bar)
116 //---------------------------------------------------------------------------------------------
117 // Constructors & Destructors
118 //---------------------------------------------------------------------------------------------
120 * Creates an integrated plotter instance
121 * @param *parent Container window
123 pPlotter :: pPlotter (wxWindow *parent,int nWidth, int nHeight)
124 :wxPanel(parent,-1,wxDefaultPosition,wxDefaultSize,wxTAB_TRAVERSAL)
126 SetBackgroundColour(wxColour(255,255,255));
127 m_plot = new pPlotterWindow( this, -1, wxPoint(0,0), wxSize(nWidth,nHeight), wxSUNKEN_BORDER );
128 actualFunction =NULL;
129 // Adding the axis layers to the plotter
130 m_plot->AddLayer( new pPlotterScaleX() );
131 m_plot->AddLayer( new pPlotterScaleY() );
133 // Creating the log window
136 m_log = new wxTextCtrl( panel, -1, wxT("This is the log window.\n"), wxPoint(0,0), wxSize(400,100), wxTE_MULTILINE );
137 // Sharing the log window of the application with the plotter widget
138 m_plot->setmLog(m_log);
143 // Creating a function for the plotter with given points x-vector and y-vector
146 double vectX_F1 [] = { 0, 20, 50, 80, 100, 115, 120, 210, 220,250 };
149 // double vectX_F1 [] = { 0, 20, 50, 80, 100, 115, 120, 210, 220,250 };
151 double vectY_F1 [] = { 0, 40, 70, 100, 200, 100, 40, 170, 0, 50 };
152 pGraphicalFunction * f1 = m_plot ->getFunctionForVectors( vectX_F1, 10, vectY_F1, 10 );
153 // Including and drawing the created function in the plotter
156 m_plot->addFunction( f1 );
157 m_plot->addFunctionToMove(f1);
158 //m_plot->addFunctionToMove(f1);
159 wxPen mypen1(*wxBLUE, 2, wxDOT_DASH );
161 f1->SetPen( mypen1 );
165 //=================== lines to sychronyze the bars width with the drawed plotter--------------------------
167 mpWindow* mplotWindow = ((mpWindow*)m_plot);
168 float minReal_X = 0; //(float)mplotWindow->getMinScrX();
169 float maxReal_X =(float)mplotWindow->getMaxScrX();
170 //float scrX=(float)mplotWindow->GetScrX()-100; // JPRx
171 //double scaleX=(scrX/(maxReal_X))* (mplotWindow->getZoomFactor()); // JPRx
173 // Creating the color bar with values according to the plotter added widget
174 color_bar = new pColorBar(this, (m_plot->GetSize()).GetWidth(),40, true);
175 color_bar -> setRepresentedValues ((int)minReal_X, (int)maxReal_X);
176 color_bar -> setDeviceBlitStart (70,0);
177 color_bar -> setVisibleRange ((int)minReal_X,(int) maxReal_X);
178 color_bar -> setDeviceEndMargin (50);
181 // Creating the min-max barrange bar with values according to the plotter added widget
182 barrange = new mBarRange(this, (m_plot->GetSize()).GetWidth(),30);
183 barrange -> setVisibleLabels (false);
184 barrange -> setRepresentedValues (minReal_X, maxReal_X);
185 barrange -> setDeviceBlitStart (70,0);
186 barrange -> setDeviceEndMargin (50);
188 // Adding the components to the sizer
190 if(m_plot->getActualFunction())
193 wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
194 sizer->Add( m_plot, 4, wxEXPAND);
195 sizer->Add( color_bar,0, wxEXPAND );
196 sizer->Add( barrange, 0, wxEXPAND );
198 // sizer->Add( m_log, 0, wxEXPAND);
200 // Stablishing the layout and sizer of the panel
201 /*panel->*/SetAutoLayout(true);
202 /*panel->*/SetSizer(sizer);
205 /*panel->*/Refresh();
209 pPlotter :: ~pPlotter ()
215 //---------------------------------------------------------------------------------------------
217 //---------------------------------------------------------------------------------------------
219 Set the bars according to the actual function
222 void pPlotter::setAll()
224 actualFunction = m_plot->getActualFunction();
226 if (actualFunction != NULL)
228 barrange -> setActiveStateTo(true);
229 color_bar -> setActiveStateTo(true);
233 double realMin_X = actualFunction->getMinX();
234 text = text + realMin_X;
235 text = text + _T(" maxX=");
236 double realMax_X = actualFunction->getMaxX();
237 text = text + realMax_X;
239 int minShowed = actualFunction->getMinXShowed();
240 int maxShowed = actualFunction->getMaxXShowed();
242 barrange -> setRepresentedValues (realMin_X, realMax_X);
243 barrange->SetStart( minShowed );
244 barrange->SetEnd( maxShowed );
247 std::vector<pColorPoint *> actualColorPoints;
248 actualFunction -> getColorPoints(actualColorPoints);
249 if(actualColorPoints.empty())
250 color_bar ->reinitiateColorBar (realMin_X, realMax_X);
252 color_bar ->reinitiateColorBarTo(actualColorPoints);
254 color_bar -> setVisibleRange (minShowed, maxShowed);
257 color_bar -> RefreshForce();
258 barrange -> RefreshForce();
265 //*****************************************************************************************************
266 // Color bar control methods
267 //*****************************************************************************************************
269 //-----------------------------------------------------------------------------------------------------
270 // Updating methods for occured events in the color bar
271 //-----------------------------------------------------------------------------------------------------
272 void pPlotter :: onAdded_ColorPoint(wxCommandEvent& event)
275 text = _T( "Last event was on color bar: Color point added, total#");
277 actualFunction = m_plot->getActualFunction();
278 if(actualFunction!=NULL)
280 std::vector<pColorPoint *> actualColorPoints;
281 color_bar ->getAddedColorsPointsList(actualColorPoints);
282 actualFunction -> setColorPoints(actualColorPoints);
283 text << actualColorPoints.size();
288 void pPlotter :: onRemoved_ColorPoint(wxCommandEvent& event)
291 text = _T( "Last event on color bar: Color point removed total#");
293 actualFunction = m_plot->getActualFunction();
294 std::vector<pColorPoint *> actualColorPoints;
295 color_bar ->getAddedColorsPointsList(actualColorPoints);
296 actualFunction -> setColorPoints(actualColorPoints);
297 text << actualColorPoints.size();
301 void pPlotter :: onMoved_ColorPoint(wxCommandEvent& event)
304 text = _T( "Last event was on color bar: Color point moved to: ");
305 int lastReal_X = (int)(color_bar->getLastMovedColorPoint())->getRealX();
308 barrange ->setRealX_vertical_line (lastReal_X);
309 barrange -> RefreshForce();
311 m_plot->setRealGuideX (lastReal_X);
316 void pPlotter:: onChanged_ColorPoint(wxCommandEvent& event)
319 sendTMessage(_T("Last event was on color bar: Color point changed color"));
322 void pPlotter :: onColorBar( wxCommandEvent& event )
324 if( (barrange->getRealX_vertical_line())!=-1)
326 barrange ->setRealX_vertical_line (-1);
327 m_plot->setRealGuideX (-1);
329 barrange -> RefreshForce();
334 //*****************************************************************************************************
335 // Plotter control methods
336 //*****************************************************************************************************
340 * Method called when actual function is changed
342 void pPlotter :: onChangeFunction (wxCommandEvent& event)
344 actualFunction = m_plot->getActualFunction();
346 if (actualFunction != NULL)
348 if( !barrange->isActive() )
350 barrange -> setActiveStateTo(true);
351 color_bar -> setActiveStateTo(true);
355 text = _T("Last event was on plotter: function changed, minX=");
356 double realMin_X = actualFunction->getMinX();
358 text << _T(" maxX=");
359 double realMax_X = actualFunction->getMaxX();
362 int minShowed = actualFunction->getMinXShowed();
363 int maxShowed = actualFunction->getMaxXShowed();
365 barrange -> setRepresentedValues (realMin_X, realMax_X);
366 barrange->SetStart( minShowed );
367 barrange->SetEnd( maxShowed );
369 std::vector<pColorPoint *> actualColorPoints;
370 actualFunction -> getColorPoints(actualColorPoints);
371 if(actualColorPoints.empty())
372 color_bar ->reinitiateColorBar (realMin_X, realMax_X);
374 color_bar ->reinitiateColorBarTo(actualColorPoints);
376 color_bar -> setVisibleRange ((int)realMin_X, maxShowed);
379 color_bar -> RefreshForce();
380 barrange -> RefreshForce();
388 * Method called when a point is added to the actual function on the plotter
391 void pPlotter :: onAddedPoint_Plotter (wxCommandEvent& event)
394 m_plot->writeInText(text);
399 * Method called when a point is removed to the actual function on the plotter
401 void pPlotter :: onRemovedPoint_Plotter (wxCommandEvent& event)
404 m_plot->writeInText(text);
409 * Method called when a point is moved from the actual function on the plotter
411 void pPlotter :: onMovePoint_Plotter (wxCommandEvent& event)
414 m_plot->writeInText(text);
418 * Method called when turn off the guide line from the actual function on the plotter
420 void pPlotter::onGuideLines(wxCommandEvent& event)
427 //*****************************************************************************************************
428 // Max-Min Barrange control methods
429 //*****************************************************************************************************
433 void pPlotter::onBarrange(wxCommandEvent& event)
440 void pPlotter::onActualChange_Bar(wxCommandEvent& event)
442 int lastActual_X = barrange->GetActual();
444 color_bar ->setRealX_vertical_line (lastActual_X);
445 color_bar -> RefreshForce();
447 m_plot->setRealGuideX (lastActual_X);
451 text = _T( "Last event was on min-max bar: Actual triangle moved to: " );
452 text << lastActual_X;
457 * Method called when the start triangle is moved. Adjusts the plotter and color bar view-range.
459 void pPlotter::onStartChange_Bar(wxCommandEvent& event)
463 text = _T( "Last event was on min-max bar: Start triangle moved to: ");
464 int realMin_X = barrange->GetStart();
465 text += wxString::Format(_T("%d"), realMin_X);
466 double realMax_X = m_plot->getMaxScrX();
468 color_bar -> setVisibleRange (realMin_X, (int)realMax_X);
470 m_plot->actualizeViewRange(realMin_X, (int)realMax_X);
472 //setting the plotter for draw the functions that
475 float startP=(float)barrange->getStartShowPorcentage();
476 float endP=(float)barrange->getEndShowPorcentage();
477 m_plot->moveFunctions(startP,endP);
480 color_bar -> RefreshForce();
481 m_plot -> UpdateAll();
485 void pPlotter::onEndChange_Bar(wxCommandEvent& event)
488 text += _T("Last event was on min-max bar: End triangle moved to: ");
489 int realMax_X = barrange->GetEnd();
490 text += wxString::Format(_T("%d"),realMax_X);
491 double realMin_X = m_plot->getMinScrX();
492 color_bar -> setVisibleRange ((int)realMin_X, realMax_X);
493 m_plot->actualizeViewRange((int)realMin_X,realMax_X);
495 float startP=(float)barrange->getStartShowPorcentage();
496 float endP=(float)barrange->getEndShowPorcentage();
497 m_plot->moveFunctions(startP,endP);
499 color_bar -> RefreshForce();
500 m_plot -> UpdateAll();
505 void pPlotter :: onSelectionEnd(wxCommandEvent& event)
507 if( (color_bar->getRealX_vertical_line())!=-1)
509 color_bar ->setRealX_vertical_line (-1);
510 m_plot->setRealGuideX (-1);
512 color_bar -> RefreshForce();
516 void pPlotter :: onMovedBar(wxCommandEvent& event)
519 text = _T( "Last event was on min-max bar: Moved bar to min:" );
521 int realMin_X = barrange->GetStart();
522 text += wxString::Format(_T("%d"),realMin_X);
525 int realMax_X = barrange->GetEnd();
526 text += wxString::Format(_T("%d"),realMax_X);
528 color_bar -> setVisibleRange (realMin_X, realMax_X);
530 float startP=(float)barrange->getStartShowPorcentage();
531 float endP=(float)barrange->getEndShowPorcentage();
532 m_plot->moveFunctions(startP,endP);
534 color_bar -> RefreshForce();
535 m_plot -> UpdateAll();
541 * Method for sending a text message to the container window
542 * @param theText Is the text of the message
544 void pPlotter :: sendTMessage(wxString theText)
546 //Creating a message event
547 wxCommandEvent puntualMSG_Event( wxEVT_NW_TEXT_MESAGGE, GetId() );
548 puntualMSG_Event.SetEventObject(this);
550 GetEventHandler()->ProcessEvent( puntualMSG_Event );
554 * Sets the text message
555 * @param nMessage Is the text message to set
557 void pPlotter :: setTextMessage(wxString nMessage)
563 * Gets the text message
564 * @param text Is the actual text message
566 wxString pPlotter :: getTextMessage()
571 * Add a function to the plotter
572 * when the function doesnt come from window
574 int pPlotter:: addFunction(pGraphicalFunction * function)
576 return m_plot->addFunction(function);
579 * Creates and returns a graphical funcion according to the indicated vectors.
581 pGraphicalFunction* pPlotter::getFunctionForVectors( double* vectorX, int sizeX,double * vectorY, int sizeY )
583 return m_plot->getFunctionForVectors(vectorX,sizeX, vectorY, sizeY );
588 void pPlotter::setType(int t)
593 Get a function in the plotter given the index
595 pGraphicalFunction* pPlotter:: getFunction(int index)
597 return m_plot->getFunction(index);
600 Adds function to move with the bar min max
602 int pPlotter::addFunctionToMove(pGraphicalFunction * function)
604 return m_plot->addFunctionToMove(function);
608 move the functions that the user wants to move
609 and that were setted in functionsToMove
610 @param porcentageMinX:the porcentage that the minShowed
611 of the funcntions have to be move
612 @param porcentageMaxX:the porcentage that the maxShowed
613 of the funcntions have to be move
616 void pPlotter:: moveFunctions(float porcentageMinX,float porcentageMaxX)
618 m_plot->moveFunctions(porcentageMinX,porcentageMaxX);
621 * deletes the function from the plotter
624 bool pPlotter::deleteFunction(pGraphicalFunction * function);
626 return m_plot->deleteFunction(function);
631 //--------------------
633 //---------------------
635 Returns the number of points that the bar color has
637 int pPlotter::getColorPointsSize()
639 return color_bar->getColorPointsSize();
642 Get the RGB values of the color point that is in the
645 void pPlotter::getBarColorDataAt(int index,double& x, int& red,int& green,int& blue)
647 color_bar->getDataAt(index,x,red,green,blue);
651 returns true if the point was succesfully added
652 PRE: 0<=red<=255 0<=green<=255 0<=blue<=255
654 bool pPlotter::addColorPoint(int x,int red,int green, int blue)
656 wxColour color= wxColour(red,green,blue);
657 return color_bar->addColorPoint((double)x, color);
659 void pPlotter::eraseColorPoints()
661 int min=(int)color_bar->getMinValue();
662 int max=(int)color_bar->getMaxValue();
663 color_bar->reinitiateColorBar(min,max);
666 //--------------------
668 //---------------------
669 float pPlotter::getMaxShowedPorcentage()
671 return barrange->getEndShowPorcentage();
673 float pPlotter::getMinShowedPorcentage()
675 return barrange->getStartShowPorcentage();
677 float pPlotter::getActualShowedPorcentage()
679 return barrange->getActualShowPorcentage();
682 //--------------------
683 // plotter Information
684 //---------------------
685 void pPlotter::setActual(pGraphicalFunction* nActual)
687 m_plot->setActualFunction(nActual);
689 void pPlotter::update()
691 //if it is a plotter of histograms
692 if(m_plot->getType()==2)
694 pGraphicalFunction* tf= m_plot->getActualFunction();
697 tf->clearSplineVectors();
698 tf->addSplinesPoints();
699 tf->initializeSplineVectors();
705 //----------------------------
706 //Handling Options Menu
707 //----------------------------
709 void pPlotter::setPopUpMenu(bool startD,bool stopD,bool smooth,bool line, bool zoomIn,
710 bool zoomOut,bool showPoints,bool noShowPoints,bool changeColor, bool addP,
711 bool delPoint,bool load,bool save)
713 m_plot->setPopUpMenu(startD, stopD, smooth, line, zoomIn,
714 zoomOut, showPoints, noShowPoints, changeColor, addP,
715 delPoint, load, save);
720 if the user resize the window
726 void pPlotter::OnSize( wxSizeEvent &WXUNUSED(event) )
729 GetClientSize(&scrX,&scrY);
730 m_plot->SetSize(scrX,scrY);
733 pGraphicalFunction* actual=m_plot->getActualFunction();
736 actual->setScreens(scrX,scrY);
746 ** Returns two vectors, the grey level of the point and its value, the value is between [0,1]
748 void pPlotter::GetValuesPointsFunction(std::vector<double>& greylevel,std::vector<double>& value, int histogramsize)
750 if(actualFunction != NULL){
751 double* xval = actualFunction->getX_RealValues();
752 double* yval = actualFunction->getY_RealValues();
754 actualFunction->getScaleY();
755 for(int i = 0; i < actualFunction->getSizePoints();i++){
756 greylevel.push_back(xval[i]);
757 value.push_back(yval[i]/histogramsize);
763 ** Returns two vectors, the grey level of the point and its value, the red, green
764 ** and blue value is between [0,1]
766 void pPlotter::GetValuesColorPointsFunction(std::vector<double>& greylevel,
767 std::vector<double>& red,
768 std::vector<double>& green,
769 std::vector<double>& blue)
772 if(color_bar != NULL){
774 std::vector<pColorPoint*> colors;
775 color_bar->getAddedColorsPointsList(colors);
777 for(int i = 0; i < colors.size();i++){
778 pColorPoint* pcolor = colors[i];
780 greylevel.push_back(pcolor->getRealX());
781 wxColour colour = pcolor->getColor();
783 double _red = (double)(colour.Red())/255.0;
784 double _green = (double)(colour.Green())/255.0;
785 double _blue = (double)(colour.Blue())/255.0;
788 green.push_back(_green);
789 blue.push_back(_blue);