1 // Copyright (C) 2003 CEA/DEN, EDF R&D
5 // File : Plot2d_ViewFrame.cxx
6 // Author : Vadim SANDLER
10 #include "Plot2d_ViewFrame.h"
11 #include "Plot2d_SetupViewDlg.h"
12 #include "Plot2d_Prs.h"
14 #include "QAD_Desktop.h"
15 #include "QAD_ResourceMgr.h"
16 #include "QAD_FileDlg.h"
17 #include "QAD_Tools.h"
18 #include "QAD_MessageBox.h"
19 #include "QAD_Config.h"
20 #include "SALOME_Selection.h"
21 #include "Plot2d_CurveContainer.h"
22 #include "Plot2d_Curve.h"
23 #include "Plot2d_FitDataDlg.h"
24 #include "utilities.h"
25 #include "qapplication.h"
27 #include <qtoolbutton.h>
29 #include <qcolordialog.h>
31 #include <qwt_plot_canvas.h>
33 #include "utilities.h"
36 #include <SALOMEconfig.h>
37 #include CORBA_SERVER_HEADER(SALOMEDS)
38 #include CORBA_SERVER_HEADER(SALOMEDS_Attributes)
41 #define DEFAULT_LINE_WIDTH 0 // (default) line width
42 #define DEFAULT_MARKER_SIZE 9 // default marker size
43 #define MIN_RECT_SIZE 11 // min sensibility area size
46 const char* imageZoomCursor[] = {
51 "................................",
52 "................................",
53 ".#######........................",
54 "..aaaaaaa.......................",
55 "................................",
56 ".............#####..............",
57 "...........##.aaaa##............",
58 "..........#.aa.....a#...........",
59 ".........#.a.........#..........",
60 ".........#a..........#a.........",
61 "........#.a...........#.........",
62 "........#a............#a........",
63 "........#a............#a........",
64 "........#a............#a........",
65 "........#a............#a........",
66 ".........#...........#.a........",
67 ".........#a..........#a.........",
68 ".........##.........#.a.........",
69 "........#####.....##.a..........",
70 ".......###aaa#####.aa...........",
71 "......###aa...aaaaa.......#.....",
72 ".....###aa................#a....",
73 "....###aa.................#a....",
74 "...###aa...............#######..",
75 "....#aa.................aa#aaaa.",
76 ".....a....................#a....",
77 "..........................#a....",
78 "...........................a....",
79 "................................",
80 "................................",
81 "................................",
82 "................................"};
85 //=================================================================================
86 // Plot2d_ViewFrame implementation
87 //=================================================================================
92 Plot2d_ViewFrame::Plot2d_ViewFrame( QWidget* parent, const QString& title )
93 : QAD_ViewFrame( parent, title ),
94 myOperation( NoOpId ),
96 myShowLegend( true ), myLegendPos( 1 ),
97 myMarkerSize( DEFAULT_MARKER_SIZE ),
98 myTitle( "" ), myXTitle( "" ), myYTitle( "" ),
99 myBackground( white ),
100 myTitleEnabled( true ), myXTitleEnabled( true ), myYTitleEnabled( true ),
101 myXGridMajorEnabled( true ), myYGridMajorEnabled( true ),
102 myXGridMinorEnabled( false ), myYGridMinorEnabled( false ),
103 myXGridMaxMajor( 8 ), myYGridMaxMajor( 8 ), myXGridMaxMinor( 5 ), myYGridMaxMinor( 5 ),
104 myXMode( 0 ), myYMode( 0 )
107 myCurves.setAutoDelete( true );
109 myPlot = new Plot2d_Plot2d( this );
110 setCentralWidget( myPlot );
114 connect( myPlot, SIGNAL( plotMouseMoved( const QMouseEvent& ) ),
115 this, SLOT( plotMouseMoved( const QMouseEvent& ) ) );
116 connect( myPlot, SIGNAL( plotMousePressed( const QMouseEvent& ) ),
117 this, SLOT( plotMousePressed( const QMouseEvent& ) ) );
118 connect( myPlot, SIGNAL( plotMouseReleased( const QMouseEvent& ) ),
119 this, SLOT( plotMouseReleased( const QMouseEvent& ) ) );
120 connect( myPlot, SIGNAL( legendClicked( long ) ),
121 this, SLOT( onLegendClicked( long ) ) );
123 /* Initial Setup - get from the preferences */
126 myPlot->setMargin( 5 );
127 setCurveType( myCurveType, false );
128 setXGrid( myXGridMajorEnabled, myXGridMaxMajor, myXGridMinorEnabled, myXGridMaxMinor, false );
129 setYGrid( myYGridMajorEnabled, myYGridMaxMajor, myYGridMinorEnabled, myYGridMaxMinor, false );
130 setMainTitle( myTitleEnabled, myTitle, false );
131 setXTitle( myXTitleEnabled, myXTitle, false );
132 setYTitle( myYTitleEnabled, myYTitle, false );
133 setHorScaleMode( myXMode, false );
134 setVerScaleMode( myYMode, false );
135 setBackgroundColor( myBackground );
136 setLegendPos( myLegendPos );
137 showLegend( myShowLegend, false );
141 resize( (int)(0.8 * parent->width()), (int)(0.8 * parent->height()) );
147 Plot2d_ViewFrame::~Plot2d_ViewFrame()
150 qApp->removeEventFilter( this );
153 Creates popup menu actions
155 void Plot2d_ViewFrame::createActions()
157 QAD_ResourceMgr* rmgr = QAD_Desktop::getResourceManager();
158 /* Linear/logarithmic mode */
160 QActionPGroup* modeHorGrp = new QActionPGroup( this );
161 modeHorGrp->setExclusive( TRUE );
162 QActionP* linearXAction = new QActionP ( tr( "TOT_PLOT2D_MODE_LINEAR_HOR"),
163 rmgr->loadPixmap( "SALOMEGUI", tr("ICON_PLOT2D_MODE_LINEAR_HOR") ) ,
164 tr( "MEN_PLOT2D_MODE_LINEAR_HOR" ), 0, modeHorGrp );
165 linearXAction->setStatusTip ( tr( "PRP_PLOT2D_MODE_LINEAR_HOR" ) );
166 linearXAction->setToggleAction( true );
167 myActions.insert( ModeXLinearId, linearXAction );
168 QActionP* logXAction = new QActionP ( tr( "TOT_PLOT2D_MODE_LOGARITHMIC_HOR"),
169 rmgr->loadPixmap( "SALOMEGUI", tr("ICON_PLOT2D_MODE_LOGARITHMIC_HOR") ) ,
170 tr( "MEN_PLOT2D_MODE_LOGARITHMIC_HOR" ), 0, modeHorGrp );
171 logXAction->setStatusTip ( tr( "PRP_PLOT2D_MODE_LOGARITHMIC_HOR" ) );
172 logXAction->setToggleAction( true );
173 myActions.insert( ModeXLogarithmicId, logXAction );
174 connect( modeHorGrp, SIGNAL( selected( QActionP* ) ), this, SLOT( onHorMode() ) );
177 QActionPGroup* modeVerGrp = new QActionPGroup( this );
178 modeVerGrp->setExclusive( TRUE );
179 QActionP* linearYAction = new QActionP ( tr( "TOT_PLOT2D_MODE_LINEAR_VER"),
180 rmgr->loadPixmap( "SALOMEGUI", tr("ICON_PLOT2D_MODE_LINEAR_VER") ) ,
181 tr( "MEN_PLOT2D_MODE_LINEAR_VER" ), 0, modeVerGrp );
182 linearYAction->setStatusTip ( tr( "PRP_PLOT2D_MODE_LINEAR_VER" ) );
183 linearYAction->setToggleAction( true );
184 myActions.insert( ModeYLinearId, linearYAction );
185 QActionP* logYAction = new QActionP ( tr( "TOT_PLOT2D_MODE_LOGARITHMIC_VER"),
186 rmgr->loadPixmap( "SALOMEGUI", tr("ICON_PLOT2D_MODE_LOGARITHMIC_VER") ) ,
187 tr( "MEN_PLOT2D_MODE_LOGARITHMIC_VER" ), 0, modeVerGrp );
188 logYAction->setStatusTip ( tr( "PRP_PLOT2D_MODE_LOGARITHMIC_VER" ) );
189 logYAction->setToggleAction( true );
190 myActions.insert( ModeYLogarithmicId, logYAction );
191 connect( modeVerGrp, SIGNAL( selected( QActionP* ) ), this, SLOT( onVerMode() ) );
194 QActionP* legendAction = new QActionP ( tr( "TOT_PLOT2D_SHOW_LEGEND"),
195 rmgr->loadPixmap( "SALOMEGUI", tr("ICON_PLOT2D_SHOW_LEGEND") ) ,
196 tr( "MEN_PLOT2D_SHOW_LEGEND" ), 0, this );
197 legendAction->setStatusTip ( tr( "PRP_PLOT2D_SHOW_LEGEND" ) );
198 legendAction->setToggleAction( true );
199 myActions.insert( LegendId, legendAction );
200 connect( legendAction, SIGNAL( activated() ), this, SLOT( onLegend() ) );
203 QActionPGroup* curveGrp = new QActionPGroup( this );
204 curveGrp->setExclusive( TRUE );
205 QActionP* pointsAction = new QActionP ( tr( "TOT_PLOT2D_CURVES_POINTS"),
206 rmgr->loadPixmap( "SALOMEGUI", tr("ICON_PLOT2D_CURVES_POINTS") ) ,
207 tr( "MEN_PLOT2D_CURVES_POINTS" ), 0, curveGrp );
208 pointsAction->setStatusTip ( tr( "PRP_PLOT2D_CURVES_POINTS" ) );
209 pointsAction->setToggleAction( true );
210 myActions.insert( CurvePointsId, pointsAction );
211 QActionP* linesAction = new QActionP ( tr( "TOT_PLOT2D_CURVES_LINES"),
212 rmgr->loadPixmap( "SALOMEGUI", tr("ICON_PLOT2D_CURVES_LINES") ) ,
213 tr( "MEN_PLOT2D_CURVES_LINES" ), 0, curveGrp );
214 linesAction->setStatusTip ( tr( "PRP_PLOT2D_CURVES_LINES" ) );
215 linesAction->setToggleAction( true );
216 myActions.insert( CurveLinesId, linesAction );
217 QActionP* splinesAction = new QActionP ( tr( "TOT_PLOT2D_CURVES_SPLINES"),
218 rmgr->loadPixmap( "SALOMEGUI", tr("ICON_PLOT2D_CURVES_SPLINES") ) ,
219 tr( "MEN_PLOT2D_CURVES_SPLINES" ), 0, curveGrp );
220 splinesAction->setStatusTip ( tr( "PRP_PLOT2D_CURVES_SPLINES" ) );
221 splinesAction->setToggleAction( true );
222 myActions.insert( CurveSplinesId, splinesAction );
223 connect( curveGrp, SIGNAL( selected( QActionP* ) ), this, SLOT( onCurves() ) );
226 QActionP* settingsAction = new QActionP ( tr( "TOT_PLOT2D_SETTINGS"),
227 rmgr->loadPixmap( "SALOMEGUI", tr("ICON_PLOT2D_SETTINGS") ) ,
228 tr( "MEN_PLOT2D_SETTINGS" ), 0, this );
229 settingsAction->setStatusTip ( tr( "PRP_PLOT2D_SETTINGS" ) );
230 myActions.insert( SettingsId, settingsAction );
231 connect( settingsAction, SIGNAL( activated() ), this, SLOT( onSettings() ) );
234 QActionP* fitDataAction = new QActionP ( tr( "TOT_PLOT2D_FITDATA"),
235 rmgr->loadPixmap( "SALOMEGUI", tr("ICON_PLOT2D_FITDATA") ) ,
236 tr( "MEN_PLOT2D_FITDATA" ), 0, this );
237 fitDataAction->setStatusTip ( tr( "PRP_PLOT2D_FITDATA" ) );
238 myActions.insert( FitDataId, fitDataAction );
239 connect( fitDataAction, SIGNAL( activated() ), this, SLOT( onFitData() ) );
242 QActionP* changeBGAction = new QActionP ( tr( "TOT_PLOT2D_CHANGE_BACKGROUND"),
243 tr( "MEN_PLOT2D_CHANGE_BACKGROUND" ), 0, this );
244 fitDataAction->setStatusTip ( tr( "PRP_PLOT2D_CHANGE_BACKGROUND" ) );
245 myActions.insert( ChangeBackgroundId, changeBGAction );
246 connect( changeBGAction, SIGNAL( activated() ), this, SLOT( onChangeBackground() ) );
249 Gets window's central widget
251 QWidget* Plot2d_ViewFrame::getViewWidget()
253 return (QWidget*)myPlot;
255 /* Popup management : sets Popup server */
256 void Plot2d_ViewFrame::setPopupServer( QAD_Application* App )
258 // QAD_PopupClientServer::setPopupServer( (QAD_PopupServer*)App );
263 void Plot2d_ViewFrame::onCreatePopup()
268 QPopupMenu* scalingPopup = new QPopupMenu( myPopup );
269 myActions[ ModeXLinearId ]->addTo( scalingPopup );
270 myActions[ ModeXLogarithmicId ]->addTo( scalingPopup );
271 scalingPopup->insertSeparator();
272 myActions[ ModeYLinearId ]->addTo( scalingPopup );
273 myActions[ ModeYLogarithmicId ]->addTo( scalingPopup );
274 myActions[ FitDataId ]->addTo( myPopup );
275 myPopup->insertItem( tr( "SCALING_POPUP" ), scalingPopup );
277 QPopupMenu* curTypePopup = new QPopupMenu( myPopup );
278 myActions[ CurvePointsId ]->addTo( curTypePopup );
279 myActions[ CurveLinesId ]->addTo( curTypePopup );
280 myActions[ CurveSplinesId ]->addTo( curTypePopup );
281 myPopup->insertItem( tr( "CURVE_TYPE_POPUP" ), curTypePopup );
283 myPopup->insertSeparator();
284 myActions[ LegendId ]->addTo( myPopup );
286 myPopup->insertSeparator();
287 myActions[ SettingsId ]->addTo( myPopup );
289 myPopup->insertSeparator();
290 myActions[ ChangeBackgroundId ]->addTo( myPopup );
294 Renames curve if it is found
296 void Plot2d_ViewFrame::rename( const Handle(SALOME_InteractiveObject)& IObject, QString newName )
298 Plot2d_Curve* curve = getCurveByIO( IObject );
300 curve->setVerTitle( newName );
301 int key = hasCurve( curve );
303 myPlot->setCurveTitle( key, newName );
304 // int legendIndex = myPlot->getLegend()->findFirstKey( key );
305 // if ( legendIndex != myPlot->getLegend()->itemCnt() )
306 // myPlot->getLegend()->setText( legendIndex, aSymbol );
312 Returns true if interactive object is presented in the viewer
314 bool Plot2d_ViewFrame::isInViewer( const Handle(SALOME_InteractiveObject)& IObject )
316 if( getCurveByIO( IObject ) != NULL )
319 if(!IObject.IsNull()){
320 QIntDictIterator<Plot2d_Curve> it(myCurves);
321 for(; it.current();++it){
322 if(it.current()->hasIO() && it.current()->getTableIO()->isSame(IObject))
329 Returns true if interactive object is presented in the viewer and displayed
331 bool Plot2d_ViewFrame::isVisible( const Handle(SALOME_InteractiveObject)& IObject )
333 Plot2d_Curve* curve = getCurveByIO( IObject );
335 int key = hasCurve( curve );
337 return myPlot->curve( key )->enabled();
342 Return interactive obeject if is presented in the viewer
344 Handle(SALOME_InteractiveObject) Plot2d_ViewFrame::FindIObject( const char* Entry )
346 Handle(SALOME_InteractiveObject) o;
347 QIntDictIterator<Plot2d_Curve> it( myCurves );
348 for ( ; it.current(); ++it ) {
349 if ( it.current()->hasIO() && !strcmp( it.current()->getIO()->getEntry(), Entry ) ) {
350 o = it.current()->getIO();
357 Actually this method just re-displays curves which refers to the <IObject>
359 void Plot2d_ViewFrame::Display( const Handle(SALOME_InteractiveObject)& IObject, bool update )
361 Plot2d_Curve* curve = getCurveByIO( IObject );
363 updateCurve( curve, update );
366 Actually this method just erases all curves which don't refer to <IOBject>
367 and re-displays curve which is of <IObject>
369 void Plot2d_ViewFrame::DisplayOnly( const Handle(SALOME_InteractiveObject)& IObject )
371 Plot2d_Curve* curve = getCurveByIO( IObject );
372 QList<Plot2d_Curve> clist;
374 for ( int i = 0; i < clist.count(); i++ ) {
375 if ( clist.at( i ) != curve )
378 updateCurve( curve, false );
383 Removes from the viewer the curves which refer to <IObject>
385 void Plot2d_ViewFrame::Erase( const Handle(SALOME_InteractiveObject)& IObject, bool update )
387 Plot2d_Curve* curve = getCurveByIO( IObject );
389 eraseCurve( curve, update );
390 // it can be table or container object selected
391 QAD_Study* activeStudy = QAD_Application::getDesktop()->getActiveStudy();
392 SALOMEDS::SObject_var aSO = activeStudy->getStudyDocument()->FindObjectID(IObject->getEntry());
393 if ( !aSO->_is_nil() ) {
394 SALOMEDS::ChildIterator_var aIter = activeStudy->getStudyDocument()->NewChildIterator( aSO );
395 for ( ; aIter->More(); aIter->Next() ) {
396 SALOMEDS::SObject_var aChildSO = aIter->Value();
397 SALOMEDS::SObject_var refSO;
398 if ( aChildSO->ReferencedObject( refSO ) && !refSO->_is_nil() )
400 curve = getCurveByIO( new SALOME_InteractiveObject( aChildSO->GetID(), "", "" ) );
402 eraseCurve( curve, update );
407 Actually this method just re-displays all curves which are presented in the viewer
409 void Plot2d_ViewFrame::DisplayAll()
411 QList<Plot2d_Curve> clist;
413 for ( int i = 0; i < clist.count(); i++ ) {
414 updateCurve( clist.at( i ), false );
419 Removes all curves from the view
421 void Plot2d_ViewFrame::EraseAll()
428 Redraws viewframe contents
430 void Plot2d_ViewFrame::Repaint()
437 bool Plot2d_ViewFrame::eventFilter( QObject* o, QEvent* e )
439 if ( ( e->type() == QEvent::MouseButtonPress || e->type() == QEvent::KeyPress ) && o != myPlot->canvas() ) {
440 myOperation = NoOpId;
441 qApp->removeEventFilter( this );
443 return QMainWindow::eventFilter( o, e );
448 void Plot2d_ViewFrame::setTitle( const QString& title )
450 setMainTitle( myTitleEnabled, title, true );
453 Reads Plot2d view settings from the preferences
455 void Plot2d_ViewFrame::readPreferences()
457 if ( QAD_CONFIG->hasSetting( "Plot2d:CurveType" ) ) { // curve type
458 myCurveType = QAD_CONFIG->getSetting( "Plot2d:CurveType" ).toInt();
459 if ( myCurveType < 0 || myCurveType > 2 ) myCurveType = 1;
461 if ( QAD_CONFIG->hasSetting( "Plot2d:ShowLegend" ) ) {
462 myShowLegend = QAD_CONFIG->getSetting( "Plot2d:ShowLegend" ) == QString( "true" ); // show legend
464 if ( QAD_CONFIG->hasSetting( "Plot2d:LegendPos" ) ) { // legend position
465 myLegendPos = QAD_CONFIG->getSetting( "Plot2d:LegendPos" ).toInt();
466 if ( myLegendPos < 0 || myLegendPos > 3 ) myLegendPos = 1;
468 if ( QAD_CONFIG->hasSetting( "Plot2d:MarkerSize" ) ) { // marker size
469 myMarkerSize = QAD_CONFIG->getSetting( "Plot2d:MarkerSize" ).toInt();
471 if ( QAD_CONFIG->hasSetting( "Plot2d:Background" ) ) { // background color
472 QString bgString = QAD_CONFIG->getSetting( "Plot2d:Background" );
473 QStringList bgData = QStringList::split( ":", bgString, true );
474 int bgRed = 0, bgGreen = 0, bgBlue = 0;
475 if ( bgData.count() > 0 ) bgRed = bgData[ 0 ].toInt();
476 if ( bgData.count() > 1 ) bgGreen = bgData[ 1 ].toInt();
477 if ( bgData.count() > 2 ) bgBlue = bgData[ 2 ].toInt();
478 myBackground = QColor( bgRed, bgGreen, bgBlue );
480 if ( QAD_CONFIG->hasSetting( "Plot2d:ShowTitle" ) ) { // main title
481 myTitleEnabled = QAD_CONFIG->getSetting( "Plot2d:ShowTitle" ) == QString( "true" );
483 if ( QAD_CONFIG->hasSetting( "Plot2d:ShowHorTitle" ) ) { // hor.axis title
484 myXTitleEnabled = QAD_CONFIG->getSetting( "Plot2d:ShowHorTitle" ) == QString( "true" );
486 if ( QAD_CONFIG->hasSetting( "Plot2d:ShowVerTitle" ) ) { // ver.axisn title
487 myYTitleEnabled = QAD_CONFIG->getSetting( "Plot2d:ShowVerTitle" ) == QString( "true" );
489 if ( QAD_CONFIG->hasSetting( "Plot2d:EnableHorMajorGrid" ) ) { // grid
490 myXGridMajorEnabled = QAD_CONFIG->getSetting( "Plot2d:EnableHorMajorGrid" ) == QString( "true" );
492 if ( QAD_CONFIG->hasSetting( "Plot2d:EnableVerMajorGrid" ) ) {
493 myYGridMajorEnabled = QAD_CONFIG->getSetting( "Plot2d:EnableVerMajorGrid" ) == QString( "true" );
495 if ( QAD_CONFIG->hasSetting( "Plot2d:EnableHorMinorGrid" ) ) {
496 myXGridMinorEnabled = QAD_CONFIG->getSetting( "Plot2d:EnableHorMinorGrid" ) == QString( "true" );
498 if ( QAD_CONFIG->hasSetting( "Plot2d:EnableVerMinorGrid" ) ) {
499 myYGridMinorEnabled = QAD_CONFIG->getSetting( "Plot2d:EnableVerMinorGrid" ) == QString( "true" );
501 if ( QAD_CONFIG->hasSetting( "Plot2d:HorMajorGridMax" ) ) {
502 myXGridMaxMajor = QAD_CONFIG->getSetting( "Plot2d:HorMajorGridMax" ).toInt();
504 if ( QAD_CONFIG->hasSetting( "Plot2d:VerMajorGridMax" ) ) {
505 myYGridMaxMajor = QAD_CONFIG->getSetting( "Plot2d:VerMajorGridMax" ).toInt();
507 if ( QAD_CONFIG->hasSetting( "Plot2d:HorMinorGridMax" ) ) {
508 myXGridMaxMinor = QAD_CONFIG->getSetting( "Plot2d:HorMinorGridMax" ).toInt();
510 if ( QAD_CONFIG->hasSetting( "Plot2d:VerMinorGridMax" ) ) {
511 myYGridMaxMinor = QAD_CONFIG->getSetting( "Plot2d:VerMinorGridMax" ).toInt();
513 if ( QAD_CONFIG->hasSetting( "Plot2d:HorScaleMode" ) ) { // scale mode
514 myXMode = QAD_CONFIG->getSetting( "Plot2d:HorScaleMode" ).toInt();
515 if ( myXMode < 0 || myXMode > 1 ) myXMode = 0;
517 if ( QAD_CONFIG->hasSetting( "Plot2d:VerScaleMode" ) ) {
518 myYMode = QAD_CONFIG->getSetting( "Plot2d:VerScaleMode" ).toInt();
519 if ( myYMode < 0 || myYMode > 1 ) myYMode = 0;
523 Writes Plot2d view settings to the preferences
525 void Plot2d_ViewFrame::writePreferences()
527 QAD_CONFIG->addSetting( "Plot2d:CurveType", myCurveType ); // curve type
528 QAD_CONFIG->addSetting( "Plot2d:ShowLegend", myShowLegend ? "true" : "false" ); // show legend
529 QAD_CONFIG->addSetting( "Plot2d:LegendPos", myLegendPos ); // legend position
530 QAD_CONFIG->addSetting( "Plot2d:MarkerSize", myMarkerSize ); // marker size
532 bgData.append( QString::number( myBackground.red() ) );
533 bgData.append( QString::number( myBackground.green() ) );
534 bgData.append( QString::number( myBackground.blue() ) );
535 QAD_CONFIG->addSetting( "Plot2d:Background", bgData.join( ":" ) ); // background color
536 QAD_CONFIG->addSetting( "Plot2d:ShowTitle", myTitleEnabled ? "true" : "false" ); // titles
537 QAD_CONFIG->addSetting( "Plot2d:ShowHorTitle", myXTitleEnabled ? "true" : "false" );
538 QAD_CONFIG->addSetting( "Plot2d:ShowVerTitle", myYTitleEnabled ? "true" : "false" );
539 QAD_CONFIG->addSetting( "Plot2d:EnableHorMajorGrid", myXGridMajorEnabled ? "true" : "false" ); // grid
540 QAD_CONFIG->addSetting( "Plot2d:EnableVerMajorGrid", myYGridMajorEnabled ? "true" : "false" );
541 QAD_CONFIG->addSetting( "Plot2d:EnableHorMinorGrid", myXGridMinorEnabled ? "true" : "false" );
542 QAD_CONFIG->addSetting( "Plot2d:EnableVerMinorGrid", myYGridMinorEnabled ? "true" : "false" );
543 QAD_CONFIG->addSetting( "Plot2d:HorMajorGridMax", myXGridMaxMajor );
544 QAD_CONFIG->addSetting( "Plot2d:VerMajorGridMax", myYGridMaxMajor );
545 QAD_CONFIG->addSetting( "Plot2d:HorMinorGridMax", myXGridMaxMinor );
546 QAD_CONFIG->addSetting( "Plot2d:VerMinorGridMax", myYGridMaxMinor );
547 QAD_CONFIG->addSetting( "Plot2d:HorScaleMode", myXMode ); // scale mode
548 QAD_CONFIG->addSetting( "Plot2d:VerScaleMode", myYMode );
551 Prints mouse cursor coordinates into string
553 QString Plot2d_ViewFrame::getInfo( const QPoint& pnt )
555 bool xFound = false, yFound = false;
556 double xCoord, yCoord;
557 const QwtScaleDiv* aXscale = myPlot->axisScale( QwtPlot::xBottom );
558 for ( int i = 0; i < aXscale->majCnt(); i++ ) {
559 double majXmark = aXscale->majMark( i );
560 int xmark = myPlot->transform( QwtPlot::xBottom, majXmark );
561 if ( xmark-2 == pnt.x() ) {
564 MESSAGE("Plot2d_ViewFrame::getInfo : close maj X mark("<<i<<") = "<<majXmark<<" "<<xmark<<" "<<pnt.x());
569 for ( int i = 0; i < aXscale->minCnt(); i++ ) {
570 double minXmark = aXscale->minMark( i );
571 int xmark = myPlot->transform( QwtPlot::xBottom, minXmark );
572 if ( xmark-2 == pnt.x() ) {
575 MESSAGE("Plot2d_ViewFrame::getInfo : close min X mark("<<i<<") = "<<minXmark<<" "<<xmark<<" "<<pnt.x());
580 const QwtScaleDiv* aYscale = myPlot->axisScale( QwtPlot::yLeft );
581 for ( int i = 0; i < aYscale->majCnt(); i++ ) {
582 double majYmark = aYscale->majMark( i );
583 int ymark = myPlot->transform( QwtPlot::yLeft, majYmark );
584 if ( ymark-2 == pnt.y() ) {
591 for ( int i = 0; i < aYscale->minCnt(); i++ ) {
592 double minYmark = aYscale->minMark( i );
593 int ymark = myPlot->transform( QwtPlot::yLeft, minYmark );
594 if ( ymark-2 == pnt.y() ) {
601 QString strX = QString::number( xFound ? xCoord : myPlot->invTransform( QwtPlot::xBottom, pnt.x() ) ).stripWhiteSpace();
604 QString strY = QString::number( yFound ? yCoord : myPlot->invTransform( QwtPlot::yLeft, pnt.y() ) ).stripWhiteSpace();
607 QString info = tr("INF_COORDINATES").arg( strX ).arg( strY );
611 Converts Plot2d_Curve's marker style to Qwt marker style [ static ]
613 static QwtSymbol::Style plot2qwtMarker( Plot2d_Curve::MarkerType m )
615 QwtSymbol::Style ms = QwtSymbol::None;
617 case Plot2d_Curve::Circle:
618 ms = QwtSymbol::Ellipse; break;
619 case Plot2d_Curve::Rectangle:
620 ms = QwtSymbol::Rect; break;
621 case Plot2d_Curve::Diamond:
622 ms = QwtSymbol::Diamond; break;
623 case Plot2d_Curve::DTriangle:
624 ms = QwtSymbol::DTriangle; break;
625 case Plot2d_Curve::UTriangle:
626 ms = QwtSymbol::UTriangle; break;
627 case Plot2d_Curve::LTriangle: // Qwt confuses LTriangle and RTriangle :(((
628 ms = QwtSymbol::RTriangle; break;
629 case Plot2d_Curve::RTriangle: // Qwt confuses LTriangle and RTriangle :(((
630 ms = QwtSymbol::LTriangle; break;
631 case Plot2d_Curve::Cross:
632 ms = QwtSymbol::Cross; break;
633 case Plot2d_Curve::XCross:
634 ms = QwtSymbol::XCross; break;
635 case Plot2d_Curve::None:
637 ms = QwtSymbol::None; break;
642 Converts Qwt marker style to Plot2d_Curve's marker style [ static ]
644 static Plot2d_Curve::MarkerType qwt2plotMarker( QwtSymbol::Style m )
646 Plot2d_Curve::MarkerType ms = Plot2d_Curve::None;
648 case QwtSymbol::Ellipse:
649 ms = Plot2d_Curve::Circle; break;
650 case QwtSymbol::Rect:
651 ms = Plot2d_Curve::Rectangle; break;
652 case QwtSymbol::Diamond:
653 ms = Plot2d_Curve::Diamond; break;
654 case QwtSymbol::DTriangle:
655 ms = Plot2d_Curve::DTriangle; break;
656 case QwtSymbol::UTriangle:
657 ms = Plot2d_Curve::UTriangle; break;
658 case QwtSymbol::RTriangle: // Qwt confuses LTriangle and RTriangle :(((
659 ms = Plot2d_Curve::LTriangle; break;
660 case QwtSymbol::LTriangle: // Qwt confuses LTriangle and RTriangle :(((
661 ms = Plot2d_Curve::RTriangle; break;
662 case QwtSymbol::Cross:
663 ms = Plot2d_Curve::Cross; break;
664 case QwtSymbol::XCross:
665 ms = Plot2d_Curve::XCross; break;
666 case QwtSymbol::None:
668 ms = Plot2d_Curve::None; break;
673 Converts Plot2d_Curve's line style to Qwt line style [ static ]
675 static Qt::PenStyle plot2qwtLine( Plot2d_Curve::LineType p )
677 Qt::PenStyle ps = Qt::NoPen;
679 case Plot2d_Curve::Solid:
680 ps = Qt::SolidLine; break;
681 case Plot2d_Curve::Dash:
682 ps = Qt::DashLine; break;
683 case Plot2d_Curve::Dot:
684 ps = Qt::DotLine; break;
685 case Plot2d_Curve::DashDot:
686 ps = Qt::DashDotLine; break;
687 case Plot2d_Curve::DashDotDot:
688 ps = Qt::DashDotDotLine; break;
689 case Plot2d_Curve::NoPen:
691 ps = Qt::NoPen; break;
696 Converts Qwt line style to Plot2d_Curve's line style [ static ]
698 static Plot2d_Curve::LineType qwt2plotLine( Qt::PenStyle p )
700 Plot2d_Curve::LineType ps = Plot2d_Curve::NoPen;
703 ps = Plot2d_Curve::Solid; break;
705 ps = Plot2d_Curve::Dash; break;
707 ps = Plot2d_Curve::Dot; break;
708 case Qt::DashDotLine:
709 ps = Plot2d_Curve::DashDot; break;
710 case Qt::DashDotDotLine:
711 ps = Plot2d_Curve::DashDotDot; break;
714 ps = Plot2d_Curve::NoPen; break;
721 void Plot2d_ViewFrame::displayCurve( Plot2d_Curve* curve, bool update )
725 if ( hasCurve( curve ) ) {
726 updateCurve( curve, update );
729 long curveKey = myPlot->insertCurve( curve->getVerTitle() );
730 myCurves.insert( curveKey, curve );
731 if ( curve->isAutoAssign() ) {
732 QwtSymbol::Style typeMarker;
734 Qt::PenStyle typeLine;
735 myPlot->getNextMarker( typeMarker, color, typeLine );
736 myPlot->setCurvePen( curveKey, QPen( color, DEFAULT_LINE_WIDTH, typeLine ) );
737 myPlot->setCurveSymbol( curveKey, QwtSymbol( typeMarker,
740 QSize( myMarkerSize, myMarkerSize ) ) );
741 curve->setColor( color );
742 curve->setLine( qwt2plotLine( typeLine ) );
743 curve->setMarker( qwt2plotMarker( typeMarker ) );
746 Qt::PenStyle ps = plot2qwtLine( curve->getLine() );
747 QwtSymbol::Style ms = plot2qwtMarker( curve->getMarker() );
748 myPlot->setCurvePen( curveKey, QPen( curve->getColor(), curve->getLineWidth(), ps ) );
749 myPlot->setCurveSymbol( curveKey, QwtSymbol( ms,
750 QBrush( curve->getColor() ),
751 QPen( curve->getColor() ),
752 QSize( myMarkerSize, myMarkerSize ) ) );
754 if ( myCurveType == 0 )
755 myPlot->setCurveStyle( curveKey, QwtCurve::NoCurve );
756 else if ( myCurveType == 1 )
757 myPlot->setCurveStyle( curveKey, QwtCurve::Lines );
758 else if ( myCurveType == 2 )
759 myPlot->setCurveStyle( curveKey, QwtCurve::Spline );
760 myPlot->setCurveData( curveKey, curve->horData(), curve->verData(), curve->nbPoints() );
767 Adds curves into view
769 void Plot2d_ViewFrame::displayCurves( Plot2d_CurveContainer& curves, bool update )
771 myPlot->setUpdatesEnabled( false );
772 for ( int i = 0; i < curves.count(); i++ ) {
773 displayCurve( curves.curve( i ), false );
776 myPlot->setUpdatesEnabled( true );
783 void Plot2d_ViewFrame::eraseCurve( Plot2d_Curve* curve, bool update )
787 int curveKey = hasCurve( curve );
789 myPlot->removeCurve( curveKey );
790 myCurves.remove( curveKey );
799 void Plot2d_ViewFrame::eraseCurves( Plot2d_CurveContainer& curves, bool update )
801 for ( int i = 0; i < curves.count(); i++ ) {
802 eraseCurve( curves.curve( i ), false );
809 Updates curves attributes
811 void Plot2d_ViewFrame::updateCurve( Plot2d_Curve* curve, bool update )
815 int curveKey = hasCurve( curve );
817 if ( !curve->isAutoAssign() ) {
818 Qt::PenStyle ps = plot2qwtLine( curve->getLine() );
819 QwtSymbol::Style ms = plot2qwtMarker( curve->getMarker() );
820 myPlot->setCurvePen( curveKey, QPen( curve->getColor(), curve->getLineWidth(), ps ) );
821 myPlot->setCurveSymbol( curveKey, QwtSymbol( ms,
822 QBrush( curve->getColor() ),
823 QPen( curve->getColor() ),
824 QSize( myMarkerSize, myMarkerSize ) ) );
826 myPlot->setCurveTitle( curveKey, curve->getVerTitle() );
827 myPlot->setCurveData( curveKey, curve->horData(), curve->verData(), curve->nbPoints() );
828 myPlot->curve( curveKey )->setEnabled( true );
835 Returns curve key if is is displayed in the viewer and 0 otherwise
837 int Plot2d_ViewFrame::hasCurve( Plot2d_Curve* curve )
839 QIntDictIterator<Plot2d_Curve> it( myCurves );
840 for ( ; it.current(); ++it ) {
841 if ( it.current() == curve )
842 return it.currentKey();
846 Plot2d_Curve* Plot2d_ViewFrame::getCurveByIO( const Handle(SALOME_InteractiveObject)& theIObject )
848 if ( !theIObject.IsNull() ) {
849 QIntDictIterator<Plot2d_Curve> it( myCurves );
850 for ( ; it.current(); ++it ) {
851 if ( it.current()->hasIO() && it.current()->getIO()->isSame( theIObject ) )
858 Gets lsit of displayed curves
860 int Plot2d_ViewFrame::getCurves( QList<Plot2d_Curve>& clist )
863 clist.setAutoDelete( false );
864 QIntDictIterator<Plot2d_Curve> it( myCurves );
865 for ( ; it.current(); ++it ) {
866 clist.append( it.current() );
868 return clist.count();
872 Updates titles according to curves
874 #define BRACKETIZE(x) QString( "[ " ) + x + QString( " ]" )
875 void Plot2d_ViewFrame::updateTitles()
877 QAD_Study* activeStudy = QAD_Application::getDesktop()->getActiveStudy();
878 QIntDictIterator<Plot2d_Curve> it( myCurves );
879 QStringList aXTitles;
880 QStringList aYTitles;
885 while ( it.current() ) {
886 // collect titles and units from all curves...
887 QString xTitle = it.current()->getHorTitle().stripWhiteSpace();
888 QString yTitle = it.current()->getVerTitle().stripWhiteSpace();
889 QString xUnits = it.current()->getHorUnits().stripWhiteSpace();
890 QString yUnits = it.current()->getVerUnits().stripWhiteSpace();
892 aYTitles.append( yTitle );
893 if ( aXTitles.find( xTitle ) == aXTitles.end() )
894 aXTitles.append( xTitle );
895 if ( aXUnits.find( xUnits ) == aXUnits.end() )
896 aXUnits.append( xUnits );
897 if ( aYUnits.find( yUnits ) == aYUnits.end() )
898 aYUnits.append( yUnits );
900 if ( activeStudy && it.current()->hasTableIO() ) {
901 SALOMEDS::SObject_var SO = activeStudy->getStudyDocument()->FindObjectID( it.current()->getTableIO()->getEntry() );
902 if ( !SO->_is_nil() ) {
903 SALOMEDS::GenericAttribute_var anAttr;
904 if ( SO->FindAttribute( anAttr, "AttributeName" ) ) {
905 SALOMEDS::AttributeName_var aNameAttr = SALOMEDS::AttributeName::_narrow( anAttr );
906 QString aName = aNameAttr->Value();
907 if ( !aName.isEmpty() && aTables.find( aName ) == aTables.end() )
908 aTables.append( aName );
916 // ... and update plot 2d view
917 QString xUnits, yUnits;
918 if ( aXUnits.count() == 1 && !aXUnits[0].isEmpty() )
919 xUnits = BRACKETIZE( aXUnits[0] );
920 if ( aYUnits.count() == 1 && !aYUnits[0].isEmpty())
921 yUnits = BRACKETIZE( aYUnits[0] );
922 QString xTitle, yTitle;
923 if ( aXTitles.count() == 1 && aXUnits.count() == 1 )
924 xTitle = aXTitles[0];
925 if ( aYTitles.count() == 1 )
926 yTitle = aYTitles[0];
928 if ( !xTitle.isEmpty() && !xUnits.isEmpty() )
930 if ( !yTitle.isEmpty() && !yUnits.isEmpty() )
933 setXTitle( myXTitleEnabled, xTitle + xUnits );
934 setYTitle( myYTitleEnabled, yTitle + yUnits );
935 setTitle( aTables.join("; ") );
938 Fits the view to see all data
940 void Plot2d_ViewFrame::fitAll()
942 myPlot->setAxisAutoScale( QwtPlot::yLeft );
943 myPlot->setAxisAutoScale( QwtPlot::xBottom );
947 Fits the view to rectangle area (pixels)
949 void Plot2d_ViewFrame::fitArea( const QRect& area )
951 QRect rect = area.normalize();
952 if ( rect.width() < MIN_RECT_SIZE ) {
953 rect.setWidth( MIN_RECT_SIZE );
954 rect.setLeft( rect.left() - MIN_RECT_SIZE/2 );
956 if ( rect.height() < MIN_RECT_SIZE ) {
957 rect.setHeight( MIN_RECT_SIZE );
958 rect.setTop( rect.top() - MIN_RECT_SIZE/2 );
960 myPlot->setAxisScale( QwtPlot::yLeft,
961 myPlot->invTransform( QwtPlot::yLeft, rect.top() ),
962 myPlot->invTransform( QwtPlot::yLeft, rect.bottom() ) );
963 myPlot->setAxisScale( QwtPlot::xBottom,
964 myPlot->invTransform( QwtPlot::xBottom, rect.left() ),
965 myPlot->invTransform( QwtPlot::xBottom, rect.right() ) );
969 Tests if it is necessary to start operation on mouse action
971 int Plot2d_ViewFrame::testOperation( const QMouseEvent& me )
973 int btn = me.button() | me.state();
974 int zoomBtn = ControlButton | LeftButton;
975 int panBtn = ControlButton | MidButton;
976 int fitBtn = ControlButton | RightButton;
978 if ( btn == zoomBtn )
987 Mode toolbar buttons slot - horizontal axis (<Linear>/<Logarithmic>)
989 void Plot2d_ViewFrame::onHorMode()
991 if ( myActions[ ModeXLinearId ]->isOn() )
992 setHorScaleMode( 0 );
993 else if ( myActions[ ModeXLogarithmicId ]->isOn() )
994 setHorScaleMode( 1 );
997 Mode toolbar buttons slot - vertical axis (<Linear>/<Logarithmic>)
999 void Plot2d_ViewFrame::onVerMode()
1001 if ( myActions[ ModeYLinearId ]->isOn() )
1002 setVerScaleMode( 0 );
1003 else if ( myActions[ ModeYLogarithmicId ]->isOn() )
1004 setVerScaleMode( 1 );
1007 "Show/hide legend" toolbar action slot
1009 void Plot2d_ViewFrame::onLegend()
1011 showLegend( myActions[ LegendId ]->isOn() );
1014 "Curve type" toolbar action slot
1016 void Plot2d_ViewFrame::onCurves()
1018 if ( myActions[ CurvePointsId ]->isOn() )
1020 else if ( myActions[ CurveLinesId ]->isOn() )
1022 else if ( myActions[ CurveSplinesId ]->isOn() )
1026 "Settings" toolbar action slot
1028 void Plot2d_ViewFrame::onSettings()
1030 #ifdef TEST_AUTOASSIGN
1031 typedef QMap<int,int> IList;
1032 typedef QMap<QString,int> SList;
1035 cols[ "red-min" ] = 1000;
1036 cols[ "red-max" ] = -1;
1037 cols[ "green-min" ] = 1000;
1038 cols[ "green-max" ] = -1;
1039 cols[ "blue-min" ] = 1000;
1040 cols[ "blue-max" ] = -1;
1041 for ( unsigned i = 0; i < 10000; i++ ) {
1042 QwtSymbol::Style typeMarker;
1044 Qt::PenStyle typeLine;
1045 myPlot->getNextMarker( typeMarker, color, typeLine );
1046 if ( mars.contains(typeMarker) )
1047 mars[ typeMarker ] = mars[ typeMarker ]+1;
1049 mars[ typeMarker ] = 0;
1050 if ( lins.contains(typeLine) )
1051 lins[ typeLine ] = lins[ typeLine ]+1;
1053 lins[ typeLine ] = 0;
1054 if ( cols[ "red-max" ] < color.red() )
1055 cols[ "red-max" ] = color.red();
1056 if ( cols[ "red-min" ] > color.red() )
1057 cols[ "red-min" ] = color.red();
1058 if ( cols[ "green-max" ] < color.green() )
1059 cols[ "green-max" ] = color.green();
1060 if ( cols[ "green-min" ] > color.green() )
1061 cols[ "green-min" ] = color.green();
1062 if ( cols[ "blue-max" ] < color.blue() )
1063 cols[ "blue-max" ] = color.blue();
1064 if ( cols[ "blue-min" ] > color.blue() )
1065 cols[ "blue-min" ] = color.blue();
1067 for (IList::Iterator it = mars.begin(); it != mars.end(); ++it)
1068 MESSAGE("markers( " << it.key() << ") = " << it.data() );
1069 for (IList::Iterator it = lins.begin(); it != lins.end(); ++it)
1070 MESSAGE("lines( " << it.key() << ") = " << it.data() );
1071 for (SList::Iterator it = cols.begin(); it != cols.end(); ++it)
1072 MESSAGE("colors( " << it.key() << ") = " << it.data() );
1075 Plot2d_SetupViewDlg* dlg = new Plot2d_SetupViewDlg( this, true );
1076 dlg->setMainTitle( myTitleEnabled, myTitle );
1077 dlg->setXTitle( myXTitleEnabled, myXTitle );
1078 dlg->setYTitle( myYTitleEnabled, myYTitle );
1079 dlg->setCurveType( myCurveType );
1080 dlg->setLegend( myShowLegend, myLegendPos );
1081 dlg->setMarkerSize( myMarkerSize );
1082 dlg->setBackgroundColor( myBackground );
1083 dlg->setMajorGrid( myXGridMajorEnabled, myPlot->axisMaxMajor( QwtPlot::xBottom ),
1084 myYGridMajorEnabled, myPlot->axisMaxMajor( QwtPlot::yLeft ) );
1085 dlg->setMinorGrid( myXGridMinorEnabled, myPlot->axisMaxMinor( QwtPlot::xBottom ),
1086 myYGridMinorEnabled, myPlot->axisMaxMinor( QwtPlot::yLeft ) );
1087 dlg->setScaleMode( myXMode, myYMode );
1089 if ( dlg->exec() == QDialog::Accepted ) {
1090 // horizontal axis title
1091 setXTitle( dlg->isXTitleEnabled(), dlg->getXTitle(), false );
1092 // vertical axis title
1093 setYTitle( dlg->isYTitleEnabled(), dlg->getYTitle(), false );
1095 setMainTitle( dlg->isMainTitleEnabled(), dlg->getMainTitle(), true );
1097 if ( myCurveType != dlg->getCurveType() ) {
1098 setCurveType( dlg->getCurveType(), false );
1101 if ( myShowLegend != dlg->isLegendEnabled() ) {
1102 showLegend( dlg->isLegendEnabled(), false );
1104 if ( myLegendPos != dlg->getLegendPos() ) {
1105 setLegendPos( dlg->getLegendPos() );
1108 if ( myMarkerSize != dlg->getMarkerSize() ) {
1109 setMarkerSize( dlg->getMarkerSize(), false );
1112 if ( myBackground != dlg->getBackgroundColor() ) {
1113 setBackgroundColor( dlg->getBackgroundColor() );
1116 bool aXGridMajorEnabled, aXGridMinorEnabled, aYGridMajorEnabled, aYGridMinorEnabled;
1117 int aXGridMaxMajor, aXGridMaxMinor, aYGridMaxMajor, aYGridMaxMinor;
1118 dlg->getMajorGrid( aXGridMajorEnabled, aXGridMaxMajor, aYGridMajorEnabled, aYGridMaxMajor );
1119 dlg->getMinorGrid( aXGridMinorEnabled, aXGridMaxMinor, aYGridMinorEnabled, aYGridMaxMinor );
1120 setXGrid( aXGridMajorEnabled, aXGridMaxMajor, aXGridMinorEnabled, aXGridMaxMinor, false );
1121 setYGrid( aYGridMajorEnabled, aYGridMaxMajor, aYGridMinorEnabled, aYGridMaxMinor, false );
1123 if ( myXMode != dlg->getXScaleMode() ) {
1124 setHorScaleMode( dlg->getXScaleMode() );
1126 if ( myYMode != dlg->getYScaleMode() ) {
1127 setVerScaleMode( dlg->getYScaleMode() );
1131 // update preferences
1132 if ( dlg->isSetAsDefault() )
1138 "Fit Data" command slot
1140 void Plot2d_ViewFrame::onFitData()
1142 Plot2d_FitDataDlg* dlg = new Plot2d_FitDataDlg( this );
1143 int ixMin = myPlot->canvasMap( QwtPlot::xBottom ).i1();
1144 int ixMax = myPlot->canvasMap( QwtPlot::xBottom ).i2();
1145 int iyMin = myPlot->canvasMap( QwtPlot::yLeft ).i1();
1146 int iyMax = myPlot->canvasMap( QwtPlot::yLeft ).i2();
1147 double xMin = myPlot->invTransform(QwtPlot::xBottom, ixMin);
1148 double xMax = myPlot->invTransform(QwtPlot::xBottom, ixMax);
1149 double yMin = myPlot->invTransform(QwtPlot::yLeft, iyMin);
1150 double yMax = myPlot->invTransform(QwtPlot::yLeft, iyMax);
1152 dlg->setRange( xMin, xMax, yMin, yMax );
1153 if ( dlg->exec() == QDialog::Accepted ) {
1154 int mode = dlg->getRange( xMin, xMax, yMin, yMax );
1155 if ( mode == 0 || mode == 2 )
1156 myPlot->setAxisScale( QwtPlot::yLeft, yMax, yMin );
1157 if ( mode == 0 || mode == 1 )
1158 myPlot->setAxisScale( QwtPlot::xBottom, xMin, xMax );
1164 Change background color
1166 void Plot2d_ViewFrame::onChangeBackground()
1168 QColor selColor = QColorDialog::getColor ( backgroundColor(), this );
1169 if ( selColor.isValid() ) {
1170 setBackgroundColor( selColor );
1176 void Plot2d_ViewFrame::setCurveType( int curveType, bool update )
1178 myCurveType = curveType;
1179 if ( curveType == 0 )
1180 myActions[ CurvePointsId ]->setOn( true );
1181 else if ( curveType == 1 )
1182 myActions[ CurveLinesId ]->setOn( true );
1183 else if ( curveType == 2 )
1184 myActions[ CurveSplinesId ]->setOn( true );
1186 QArray<long> keys = myPlot->curveKeys();
1187 for ( int i = 0; i < keys.count(); i++ ) {
1188 if ( myCurveType == 0 )
1189 myPlot->setCurveStyle( keys[i], QwtCurve::NoCurve );
1190 else if ( myCurveType == 1 )
1191 myPlot->setCurveStyle( keys[i], QwtCurve::Lines );
1192 else if ( myCurveType == 2 )
1193 myPlot->setCurveStyle( keys[i], QwtCurve::Spline );
1201 void Plot2d_ViewFrame::showLegend( bool show, bool update )
1203 myShowLegend = show;
1204 myActions[ LegendId ]->setOn( myShowLegend );
1206 myPlot->setAutoLegend( myShowLegend );
1207 myPlot->enableLegend( myShowLegend );
1213 Sets legend position : 0 - left, 1 - right, 2 - top, 3 - bottom
1215 void Plot2d_ViewFrame::setLegendPos( int pos )
1220 myPlot->setLegendPos( Qwt::Left );
1223 myPlot->setLegendPos( Qwt::Right );
1226 myPlot->setLegendPos( Qwt::Top );
1229 myPlot->setLegendPos( Qwt::Bottom );
1234 Sets new marker size
1236 void Plot2d_ViewFrame::setMarkerSize( const int size, bool update )
1238 if ( myMarkerSize != size ) {
1239 myMarkerSize = size;
1240 QArray<long> keys = myPlot->curveKeys();
1241 for ( int i = 0; i < keys.count(); i++ ) {
1242 QwtPlotCurve* crv = myPlot->curve( keys[i] );
1244 QwtSymbol aSymbol = crv->symbol();
1245 aSymbol.setSize( myMarkerSize, myMarkerSize );
1246 crv->setSymbol( aSymbol );
1247 int legendIndex = myPlot->getLegend()->findFirstKey( keys[i] );
1248 if ( legendIndex != myPlot->getLegend()->itemCnt() )
1249 myPlot->getLegend()->setSymbol( legendIndex, aSymbol );
1257 Sets background color
1259 void Plot2d_ViewFrame::setBackgroundColor( const QColor& color )
1261 myBackground = color;
1262 //myPlot->setCanvasBackground( myBackground );
1263 myPlot->canvas()->setPalette( myBackground );
1264 myPlot->setPalette( myBackground );
1265 QPalette aPal = myPlot->getLegend()->palette();
1266 for ( int i = 0; i < QPalette::NColorGroups; i++ ) {
1267 QPalette::ColorGroup cg = (QPalette::ColorGroup)i;
1268 aPal.setColor( cg, QColorGroup::Base, myBackground );
1269 aPal.setColor( cg, QColorGroup::Background, myBackground );
1271 myPlot->getLegend()->setPalette( aPal );
1274 Gets background color
1276 QColor Plot2d_ViewFrame::backgroundColor() const
1278 return myBackground;
1281 Sets hor.axis grid parameters
1283 void Plot2d_ViewFrame::setXGrid( bool xMajorEnabled, const int xMajorMax,
1284 bool xMinorEnabled, const int xMinorMax,
1287 myXGridMajorEnabled = xMajorEnabled;
1288 myXGridMinorEnabled = xMinorEnabled;
1289 myXGridMaxMajor = xMajorMax;
1290 myXGridMaxMinor = xMinorMax;
1291 myPlot->setAxisMaxMajor( QwtPlot::xBottom, myXGridMaxMajor );
1292 myPlot->setAxisMaxMinor( QwtPlot::xBottom, myXGridMaxMinor );
1293 myPlot->enableGridX( myXGridMajorEnabled );
1294 myPlot->enableGridXMin( myXGridMinorEnabled );
1299 Sets ver.axis grid parameters
1301 void Plot2d_ViewFrame::setYGrid( bool yMajorEnabled, const int yMajorMax,
1302 bool yMinorEnabled, const int yMinorMax,
1305 myYGridMajorEnabled = yMajorEnabled;
1306 myYGridMinorEnabled = yMinorEnabled;
1307 myYGridMaxMajor = yMajorMax;
1308 myYGridMaxMinor = yMinorMax;
1309 myPlot->setAxisMaxMajor( QwtPlot::yLeft, myYGridMaxMajor );
1310 myPlot->setAxisMaxMinor( QwtPlot::yLeft, myYGridMaxMinor );
1311 myPlot->enableGridY( myYGridMajorEnabled );
1312 myPlot->enableGridYMin( myYGridMinorEnabled );
1319 void Plot2d_ViewFrame::setMainTitle( bool enabled, const QString& title, bool update )
1321 myTitleEnabled = enabled;
1323 myPlot->setTitle( myTitleEnabled ? myTitle : QString::null );
1330 void Plot2d_ViewFrame::setXTitle( bool enabled, const QString& title, bool update )
1332 myXTitleEnabled = enabled;
1334 myPlot->setAxisTitle( QwtPlot::xBottom, myXTitleEnabled ? myXTitle : QString::null );
1341 void Plot2d_ViewFrame::setYTitle( bool enabled, const QString& title, bool update )
1343 myYTitleEnabled = enabled;
1345 myPlot->setAxisTitle( QwtPlot::yLeft, myYTitleEnabled ? myYTitle : QString::null );
1350 Sets scale mode for horizontal axis: 0 - linear, 1 - logarithmic
1352 void Plot2d_ViewFrame::setHorScaleMode( const int mode, bool update )
1355 if ( myXMode == 0 ) { // linear
1356 myActions[ ModeXLogarithmicId ]->setOn( false );
1357 myActions[ ModeXLinearId ]->setOn( true );
1358 myPlot->changeAxisOptions( QwtPlot::xBottom, QwtAutoScale::Logarithmic, false );
1360 else { // logarithmic
1361 myActions[ ModeXLinearId ]->setOn( false );
1362 myActions[ ModeXLogarithmicId ]->setOn( true );
1363 myPlot->changeAxisOptions( QwtPlot::xBottom, QwtAutoScale::Logarithmic, true );
1366 // myPlot->replot();
1370 Sets scale mode for vertical axis: 0 - linear, 1 - logarithmic
1372 void Plot2d_ViewFrame::setVerScaleMode( const int mode, bool update )
1375 if ( myYMode == 0 ) { // linear
1376 myActions[ ModeYLogarithmicId ]->setOn( false );
1377 myActions[ ModeYLinearId ]->setOn( true );
1378 myPlot->changeAxisOptions( QwtPlot::yLeft, QwtAutoScale::Logarithmic, false );
1380 else { // logarithmic
1381 myActions[ ModeYLinearId ]->setOn( false );
1382 myActions[ ModeYLogarithmicId ]->setOn( true );
1383 myPlot->changeAxisOptions( QwtPlot::yLeft, QwtAutoScale::Logarithmic, true );
1386 // myPlot->replot();
1390 Slot, called when Legend item is clicked
1392 void Plot2d_ViewFrame::onLegendClicked( long key )
1394 Plot2d_Curve* curve = myCurves[ key ];
1395 if ( curve && curve->hasIO() ) {
1396 SALOME_Selection* Sel = SALOME_Selection::Selection( QAD_Application::getDesktop()->getActiveStudy()->getSelection() );
1397 Sel->ClearIObjects();
1398 Sel->AddIObject( curve->getIO(), true );
1403 Slot, called when user presses mouse button
1405 void Plot2d_ViewFrame::plotMousePressed( const QMouseEvent& me )
1407 if ( myOperation == NoOpId )
1408 myOperation = testOperation( me );
1409 if ( myOperation != NoOpId ) {
1411 if ( myOperation == ZoomId ) {
1412 myPlot->canvas()->setCursor( QCursor( QPixmap( imageZoomCursor ) ) );
1414 else if ( myOperation == PanId ) {
1415 myPlot->canvas()->setCursor( QCursor( Qt::SizeAllCursor ) );
1417 else if ( myOperation == FitAreaId ) {
1418 myPlot->canvas()->setCursor( QCursor( Qt::PointingHandCursor ) );
1419 myPlot->setOutlineStyle( Qwt::Rect );
1423 int btn = me.button() | me.state();
1424 if ( btn == RightButton ) {
1427 QAD_Tools::checkPopup( myPopup );
1428 if ( myPopup->count()>0 ) {
1429 myPopup->exec( QCursor::pos() );
1435 myPlot->setOutlineStyle( Qwt::Cross );
1436 QAD_Application::getDesktop()->putInfo( getInfo( me.pos() ) );
1441 Slot, called when user moves mouse
1443 void Plot2d_ViewFrame::plotMouseMoved( const QMouseEvent& me )
1445 int dx = me.pos().x() - myPnt.x();
1446 int dy = me.pos().y() - myPnt.y();
1448 if ( myOperation != NoOpId) {
1449 if ( myOperation == ZoomId ) {
1450 this->incrementalZoom( dx, dy );
1453 else if ( myOperation == PanId ) {
1454 this->incrementalPan( dx, dy );
1459 QAD_Application::getDesktop()->putInfo( getInfo( me.pos() ) );
1463 Slot, called when user releases mouse
1465 void Plot2d_ViewFrame::plotMouseReleased( const QMouseEvent& me )
1467 if ( myOperation == FitAreaId ) {
1468 QRect rect( myPnt, me.pos() );
1471 myPlot->canvas()->setCursor( QCursor( Qt::CrossCursor ) );
1472 myPlot->setOutlineStyle( Qwt::Triangle );
1473 QAD_Application::getDesktop()->putInfo( tr( "INF_READY" ) );
1474 myOperation = NoOpId;
1477 View operations : Pan view
1479 void Plot2d_ViewFrame::onViewPan()
1481 myOperation = PanId;
1482 qApp->installEventFilter( this );
1485 View operations : Zoom view
1487 void Plot2d_ViewFrame::onViewZoom()
1489 myOperation = ZoomId;
1490 qApp->installEventFilter( this );
1493 View operations : Fot All
1495 void Plot2d_ViewFrame::onViewFitAll()
1500 View operations : Fit Area
1502 void Plot2d_ViewFrame::onViewFitArea()
1504 myOperation = FitAreaId;
1505 qApp->installEventFilter( this );
1508 View operations : Global panning
1510 void Plot2d_ViewFrame::onViewGlobalPan()
1511 { MESSAGE( "Plot2d_ViewFrame::onViewGlobalPan : NOT SUPPORTED" ); }
1513 View operations : Rotate view
1515 void Plot2d_ViewFrame::onViewRotate()
1516 { MESSAGE( "Plot2d_ViewFrame::onViewRotate : NOT SUPPORTED" ); }
1518 View operations : Reset view
1520 void Plot2d_ViewFrame::onViewReset()
1521 { MESSAGE( "Plot2d_ViewFrame::onViewReset : NOT SUPPORTED" ); }
1523 View operations : View front
1525 void Plot2d_ViewFrame::onViewFront()
1526 { MESSAGE( "Plot2d_ViewFrame::onViewFront : NOT SUPPORTED" ); }
1528 View operations : View back
1530 void Plot2d_ViewFrame::onViewBack()
1531 { MESSAGE( "Plot2d_ViewFrame::onViewBack : NOT SUPPORTED" ); }
1533 View operations : View right
1535 void Plot2d_ViewFrame::onViewRight()
1536 { MESSAGE( "Plot2d_ViewFrame::onViewRight : NOT SUPPORTED" ); }
1538 View operations : View left
1540 void Plot2d_ViewFrame::onViewLeft()
1541 { MESSAGE( "Plot2d_ViewFrame::onViewLeft : NOT SUPPORTED" ); }
1543 View operations : View bottom
1545 void Plot2d_ViewFrame::onViewBottom()
1546 { MESSAGE( "Plot2d_ViewFrame::onViewBottom : NOT SUPPORTED" ); }
1548 View operations : View top
1550 void Plot2d_ViewFrame::onViewTop()
1551 { MESSAGE( "Plot2d_ViewFrame::onViewTop : NOT SUPPORTED" ); }
1553 View operations : Show/hide trihedron
1555 void Plot2d_ViewFrame::onViewTrihedron()
1556 { MESSAGE( "Plot2d_ViewFrame::onViewTrihedron : NOT SUPPORTED" ); }
1559 //=================================================================================
1560 // Plot2d_Plot2d implementation
1561 //=================================================================================
1566 Plot2d_Plot2d::Plot2d_Plot2d( QWidget* parent )
1570 enableOutline( true );
1571 setOutlineStyle( Qwt::Triangle );
1572 setOutlinePen( green );
1574 setAutoLegend( false );
1575 setLegendFrameStyle( QFrame::Box | QFrame::Sunken );
1576 enableLegend( false );
1578 enableGridX( false );
1579 enableGridXMin( false );
1580 enableGridY( false );
1581 enableGridYMin( false );
1582 // auto scaling by default
1583 setAxisAutoScale( QwtPlot::yLeft );
1584 setAxisAutoScale( QwtPlot::xBottom );
1587 Recalculates and redraws Plot 2d view
1589 void Plot2d_Plot2d::replot()
1591 updateLayout(); // to fix bug(?) of Qwt - view is not updated when title is changed
1595 Checks if two colors are close to each other [ static ]
1596 uses COLOR_DISTANCE variable as max tolerance for comparing of colors
1598 const long COLOR_DISTANCE = 100;
1599 const int MAX_ATTEMPTS = 10;
1600 static bool closeColors( const QColor& color1, const QColor& color2 )
1602 long tol = abs( color2.red() - color1.red() ) +
1603 abs( color2.green() - color1.green() ) +
1604 abs( color2.blue() - color1.blue() );
1606 return ( tol <= COLOR_DISTANCE );
1609 Gets new unique marker for item if possible
1611 void Plot2d_Plot2d::getNextMarker( QwtSymbol::Style& typeMarker, QColor& color, Qt::PenStyle& typeLine )
1616 int aRed = (int)( 256.0 * random() / RAND_MAX); // generate random color
1617 int aGreen = (int)( 256.0 * random() / RAND_MAX); // ...
1618 int aBlue = (int)( 256.0 * random() / RAND_MAX); // ...
1619 int aMarker = (int)( 9.0 * random() / RAND_MAX) + 1; // 9 markers types ( not including empty )
1620 int aLine = (int)( 5.0 * random() / RAND_MAX) + 1; // 5 line types ( not including empty )
1622 typeMarker = ( QwtSymbol::Style )aMarker;
1623 color = QColor( aRed, aGreen, aBlue );
1624 typeLine = ( Qt::PenStyle )aLine;
1627 if ( cnt == MAX_ATTEMPTS )
1630 bOk = !existMarker( typeMarker, color, typeLine );
1633 static int aMarker = -1;
1634 static int aColor = -1;
1635 static int aLine = -1;
1637 if ( myColors.isEmpty() ) {
1638 // creating colors list
1639 myColors.append( Qt::white );
1640 myColors.append( Qt::blue );
1641 myColors.append( Qt::gray );
1642 myColors.append( Qt::darkGreen );
1643 myColors.append( Qt::magenta );
1644 myColors.append( Qt::darkGray );
1645 myColors.append( Qt::red );
1646 myColors.append( Qt::darkBlue );
1647 myColors.append( Qt::darkYellow );
1648 myColors.append( Qt::cyan );
1649 myColors.append( Qt::darkRed );
1650 myColors.append( Qt::darkCyan );
1651 myColors.append( Qt::yellow );
1652 myColors.append( Qt::darkMagenta );
1653 myColors.append( Qt::green );
1654 myColors.append( Qt::black );
1657 int nbMarkers = 11; // QwtSymbol supports 11 marker types
1658 int nbLines = 6; // Qt supports 6 line types
1659 int nbColors = myColors.count(); // number of default colors supported
1661 aMarker = ( aMarker + 1 ) % nbMarkers;
1662 if ( aMarker == QwtSymbol::None || aMarker == QwtSymbol::Triangle ) aMarker++;
1663 aColor = ( aColor + 1 ) % nbColors;
1664 aLine = ( aLine + 1 ) % nbLines;
1665 if ( aLine == Qt::NoPen ) aLine++;
1667 typeMarker = ( QwtSymbol::Style )aMarker;
1668 color = myColors[ aColor ];
1669 typeLine = ( Qt::PenStyle )aLine;
1670 if ( !existMarker( typeMarker, color, typeLine ) )
1674 for ( i = 0; i < nbMarkers; i++ ) {
1675 aMarker = ( aMarker + 1 ) % nbMarkers;
1676 if ( aMarker == QwtSymbol::None || aMarker == QwtSymbol::Triangle ) aMarker++;
1677 for ( j = 0; j < nbColors; j++ ) {
1678 aColor = ( aColor + 1 ) % nbColors;
1679 for ( k = 0; k < nbLines; k++ ) {
1680 aLine = ( aLine + 1 ) % nbLines;
1681 if ( aLine == Qt::NoPen ) aLine++;
1682 if ( !existMarker( ( QwtSymbol::Style )aMarker, aColor, ( Qt::PenStyle )aLine ) ) {
1683 typeMarker = ( QwtSymbol::Style )aMarker;
1684 color = myColors[ aColor ];
1685 typeLine = ( Qt::PenStyle )aLine;
1694 Checks if marker belongs to any enitity
1696 bool Plot2d_Plot2d::existMarker( const QwtSymbol::Style typeMarker, const QColor& color, const Qt::PenStyle typeLine )
1698 // getting all curves
1699 QArray<long> keys = curveKeys();
1702 if ( closeColors( color, backgroundColor() ) )
1704 for ( int i = 0; i < keys.count(); i++ ) {
1705 QwtPlotCurve* crv = curve( keys[i] );
1707 QwtSymbol::Style aStyle = crv->symbol().style();
1708 QColor aColor = crv->pen().color();
1709 Qt::PenStyle aLine = crv->pen().style();
1710 // if ( aStyle == typeMarker && aColor == color && aLine == typeLine )
1711 if ( aStyle == typeMarker && closeColors( aColor,color ) && aLine == typeLine )
1718 //==========================================================
1720 * Plot2d_ViewFrame::Display
1721 * Display presentation
1723 //==========================================================
1724 void Plot2d_ViewFrame::Display( const SALOME_Prs2d* prs )
1726 // try do downcast object
1727 const Plot2d_Prs* aPlot2dPrs = dynamic_cast<const Plot2d_Prs*>( prs );
1728 if ( !aPlot2dPrs || aPlot2dPrs->IsNull() )
1731 // display all curves from presentation
1732 Plot2d_CurveContainer aCurves = aPlot2dPrs->GetObjects();
1733 displayCurves( aCurves );
1736 //==========================================================
1738 * Plot2d_ViewFrame::Erase
1739 * Erase presentation
1741 //==========================================================
1742 void Plot2d_ViewFrame::Erase( const SALOME_Prs2d* prs, const bool )
1744 // try do downcast object
1745 const Plot2d_Prs* aPlot2dPrs = dynamic_cast<const Plot2d_Prs*>( prs );
1746 if ( !aPlot2dPrs || aPlot2dPrs->IsNull() )
1749 // erase all curves from presentation
1750 Plot2d_CurveContainer aCurves = aPlot2dPrs->GetObjects();
1751 eraseCurves( aCurves );
1754 //==========================================================
1756 * Plot2d_ViewFrame::CreatePrs
1757 * Create presentation by entry
1759 //==========================================================
1760 SALOME_Prs* Plot2d_ViewFrame::CreatePrs( const char* entry )
1762 Plot2d_Prs* prs = new Plot2d_Prs();
1764 QIntDictIterator<Plot2d_Curve> it( myCurves );
1765 for ( ; it.current(); ++it ) {
1766 if ( it.current()->hasIO() && !strcmp( it.current()->getIO()->getEntry(), entry ) ) {
1767 prs->AddObject( it.current() );
1774 //==========================================================
1776 * Plot2d_ViewFrame::BeforeDisplay
1777 * Axiluary method called before displaying of objects
1779 //==========================================================
1780 void Plot2d_ViewFrame::BeforeDisplay( SALOME_Displayer* d )
1782 d->BeforeDisplay( this, SALOME_Plot2dViewType() );
1785 //==========================================================
1787 * Plot2d_ViewFrame::AfterDisplay
1788 * Axiluary method called after displaying of objects
1790 //==========================================================
1791 void Plot2d_ViewFrame::AfterDisplay( SALOME_Displayer* d )
1793 d->AfterDisplay( this, SALOME_Plot2dViewType() );
1796 #define INCREMENT_FOR_OP 10
1798 //=======================================================================
1799 // Plot2d_ViewFrame::onPanLeft
1800 // Performs incremental panning to the left
1801 //=======================================================================
1802 void Plot2d_ViewFrame::onPanLeft()
1804 this->incrementalPan( -INCREMENT_FOR_OP, 0 );
1807 //=======================================================================
1808 // Plot2d_ViewFrame::onPanRight
1809 // Performs incremental panning to the right
1810 //=======================================================================
1811 void Plot2d_ViewFrame::onPanRight()
1813 this->incrementalPan( INCREMENT_FOR_OP, 0 );
1816 //=======================================================================
1817 // Plot2d_ViewFrame::onPanUp
1818 // Performs incremental panning to the top
1819 //=======================================================================
1820 void Plot2d_ViewFrame::onPanUp()
1822 this->incrementalPan( 0, -INCREMENT_FOR_OP );
1825 //=======================================================================
1826 // Plot2d_ViewFrame::onPanDown
1827 // Performs incremental panning to the bottom
1828 //=======================================================================
1829 void Plot2d_ViewFrame::onPanDown()
1831 this->incrementalPan( 0, INCREMENT_FOR_OP );
1834 //=======================================================================
1835 // Plot2d_ViewFrame::onZoomIn
1836 // Performs incremental zooming in
1837 //=======================================================================
1838 void Plot2d_ViewFrame::onZoomIn()
1840 this->incrementalZoom( INCREMENT_FOR_OP, INCREMENT_FOR_OP );
1843 //=======================================================================
1844 // Plot2d_ViewFrame::onZoomOut
1845 // Performs incremental zooming out
1846 //=======================================================================
1847 void Plot2d_ViewFrame::onZoomOut()
1849 this->incrementalZoom( -INCREMENT_FOR_OP, -INCREMENT_FOR_OP );
1852 //=======================================================================
1853 // Plot2d_ViewFrame::incrementalPan
1854 // Incremental zooming operation
1855 //=======================================================================
1856 void Plot2d_ViewFrame::incrementalPan( const int incrX, const int incrY ) {
1857 QwtDiMap xMap = myPlot->canvasMap( QwtPlot::xBottom );
1858 QwtDiMap yMap = myPlot->canvasMap( QwtPlot::yLeft );
1860 myPlot->setAxisScale( QwtPlot::yLeft,
1861 myPlot->invTransform( QwtPlot::yLeft, yMap.i1()-incrY ),
1862 myPlot->invTransform( QwtPlot::yLeft, yMap.i2()-incrY ) );
1863 myPlot->setAxisScale( QwtPlot::xBottom,
1864 myPlot->invTransform( QwtPlot::xBottom, xMap.i1()-incrX ),
1865 myPlot->invTransform( QwtPlot::xBottom, xMap.i2()-incrX ) );
1869 //=======================================================================
1870 // Plot2d_ViewFrame::incrementalZoom
1871 // Incremental panning operation
1872 //=======================================================================
1873 void Plot2d_ViewFrame::incrementalZoom( const int incrX, const int incrY ) {
1874 QwtDiMap xMap = myPlot->canvasMap( QwtPlot::xBottom );
1875 QwtDiMap yMap = myPlot->canvasMap( QwtPlot::yLeft );
1877 myPlot->setAxisScale( QwtPlot::yLeft,
1878 myPlot->invTransform( QwtPlot::yLeft, yMap.i1() ),
1879 myPlot->invTransform( QwtPlot::yLeft, yMap.i2() + incrY ) );
1880 myPlot->setAxisScale( QwtPlot::xBottom,
1881 myPlot->invTransform( QwtPlot::xBottom, xMap.i1() ),
1882 myPlot->invTransform( QwtPlot::xBottom, xMap.i2() - incrX ) );