1 // VISU VISUGUI : GUI of VISU component
3 // Copyright (C) 2003 CEA/DEN, EDF R&D
7 // File : VVTK_PickingDlg.cxx
8 // Author : Oleg Uvarov
11 #include "VVTK_PickingDlg.h"
13 #include "VISU_GaussPtsAct.h"
14 #include "VISU_GaussPtsSettings.h"
16 #include "SUIT_ResourceMgr.h"
17 #include "SUIT_Session.h"
19 #include "SVTK_RenderWindowInteractor.h"
21 #include <vtkActorCollection.h>
22 #include <vtkCallbackCommand.h>
23 #include <vtkObjectFactory.h>
24 #include <vtkRenderer.h>
25 #include <vtkGenericRenderWindowInteractor.h>
26 #include <vtkSmartPointer.h>
28 #include "utilities.h"
30 #include <qcheckbox.h>
31 #include <qcolordialog.h>
32 #include <qcombobox.h>
33 #include <qgroupbox.h>
36 #include <qpushbutton.h>
39 #include "QtxAction.h"
40 #include "QtxDblSpinBox.h"
41 #include "QtxIntSpinBox.h"
45 VVTK_PickingDlg::VVTK_PickingDlg( QWidget* parent, const char* name )
46 :QDialog( parent, name, false, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu ),
47 myEventCallbackCommand( vtkCallbackCommand::New() ),
48 myPickingSettings( VISU_PickingSettings::New() )
51 myEventCallbackCommand->Delete();
52 myEventCallbackCommand->SetClientData(this);
53 myEventCallbackCommand->SetCallback(VVTK_PickingDlg::ProcessEvents);
55 SUIT_ResourceMgr* aResourceMgr = SUIT_Session::session()->resourceMgr();
57 setCaption( tr( "PICKING_DLG_TITLE" ) );
58 setSizeGripEnabled(TRUE);
60 QVBoxLayout* TopLayout = new QVBoxLayout( this );
61 TopLayout->setSpacing(6);
62 TopLayout->setMargin(11);
64 QVBox* aBox = new QVBox( this );
69 QGroupBox* CursorGroup = new QGroupBox( tr( "CURSOR_TITLE" ), aBox, "CursorGroup" );
70 CursorGroup->setColumnLayout(0, Qt::Vertical );
71 CursorGroup->layout()->setSpacing( 0 );
72 CursorGroup->layout()->setMargin( 0 );
74 QGridLayout* CursorGroupLayout = new QGridLayout (CursorGroup->layout());
75 CursorGroupLayout->setAlignment(Qt::AlignTop | Qt::AlignCenter);
76 CursorGroupLayout->setSpacing(6);
77 CursorGroupLayout->setMargin(11);
79 QLabel* CursorSizeLabel = new QLabel( tr( "CURSOR_SIZE" ), CursorGroup );
80 myCursorSizeSpinBox = new QtxDblSpinBox( 0, 1, 0.1, CursorGroup );
81 myCursorSizeSpinBox->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
83 QLabel* PyramidHeightLabel = new QLabel( tr( "PYRAMID_HEIGHT" ), CursorGroup );
84 double aHeightMin=1.e-7;
85 double aHeightMax=10.;
86 double aHeightStep=0.1;
87 myPyramidHeightSpinBox = new QtxDblSpinBox(aHeightMin, aHeightMax, aHeightStep, CursorGroup );
88 myPyramidHeightSpinBox->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
90 QLabel* SelectionColorLabel = new QLabel( tr( "SELECTION_COLOR" ), CursorGroup );
91 mySelectionColorButton = new QPushButton( CursorGroup );
92 mySelectionColorButton->setPaletteBackgroundColor( Qt::blue );
93 mySelectionColorButton->setPaletteForegroundColor( Qt::blue );
94 connect( mySelectionColorButton, SIGNAL( clicked() ), this, SLOT( onColorButtonPressed() ) );
96 CursorGroupLayout->addWidget( CursorSizeLabel, 0, 0 );
97 CursorGroupLayout->addWidget( myCursorSizeSpinBox, 0, 1 );
98 CursorGroupLayout->addWidget( PyramidHeightLabel, 1, 0 );
99 CursorGroupLayout->addWidget( myPyramidHeightSpinBox, 1, 1 );
100 CursorGroupLayout->addWidget( SelectionColorLabel, 2, 0 );
101 CursorGroupLayout->addWidget( mySelectionColorButton, 2, 1 );
104 QGroupBox* ToleranceGroup = new QGroupBox( tr( "TOLERANCE_TITLE" ), aBox, "ToleranceGroup" );
105 ToleranceGroup->setColumnLayout(0, Qt::Vertical );
106 ToleranceGroup->layout()->setSpacing( 0 );
107 ToleranceGroup->layout()->setMargin( 0 );
109 QGridLayout* ToleranceGroupLayout = new QGridLayout (ToleranceGroup->layout());
110 ToleranceGroupLayout->setAlignment(Qt::AlignTop | Qt::AlignCenter);
111 ToleranceGroupLayout->setSpacing(6);
112 ToleranceGroupLayout->setMargin(11);
114 QLabel* PointToleranceLabel = new QLabel( tr( "POINT_TOLERANCE" ), ToleranceGroup );
115 myPointToleranceSpinBox = new QtxDblSpinBox( 0.001, 10.0, 0.01, ToleranceGroup );
116 myPointToleranceSpinBox->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
118 ToleranceGroupLayout->addWidget( PointToleranceLabel, 0, 0 );
119 ToleranceGroupLayout->addWidget( myPointToleranceSpinBox, 0, 1 );
121 // Information window
122 QGroupBox* InfoWindowGroup = new QGroupBox( tr( "INFO_WINDOW_TITLE" ), aBox, "InfoWindowGroup" );
123 InfoWindowGroup->setColumnLayout(0, Qt::Vertical );
124 InfoWindowGroup->layout()->setSpacing( 0 );
125 InfoWindowGroup->layout()->setMargin( 0 );
127 QGridLayout* InfoWindowGroupLayout = new QGridLayout (InfoWindowGroup->layout());
128 InfoWindowGroupLayout->setAlignment(Qt::AlignTop | Qt::AlignCenter);
129 InfoWindowGroupLayout->setSpacing(6);
130 InfoWindowGroupLayout->setMargin(11);
132 QLabel* TransparencyLabel = new QLabel( tr( "TRANSPARENCY" ), InfoWindowGroup );
133 myTransparencySpinBox = new QtxIntSpinBox( 0, 100, 10, InfoWindowGroup );
134 myTransparencySpinBox->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
136 InfoWindowGroupLayout->addWidget( TransparencyLabel, 0, 0 );
137 InfoWindowGroupLayout->addWidget( myTransparencySpinBox, 0, 1 );
139 QLabel* PositionLabel = new QLabel( tr( "POSITION" ), InfoWindowGroup );
140 myPositionComboBox = new QComboBox( InfoWindowGroup );
141 myPositionComboBox->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
143 myPositionComboBox->insertItem( tr( "BELOW_POINT" ) );
144 myPositionComboBox->insertItem( tr( "TOP_LEFT_CORNER" ) );
146 InfoWindowGroupLayout->addWidget( TransparencyLabel, 0, 0 );
147 InfoWindowGroupLayout->addWidget( myTransparencySpinBox, 0, 1 );
148 InfoWindowGroupLayout->addWidget( PositionLabel, 1, 0 );
149 InfoWindowGroupLayout->addWidget( myPositionComboBox, 1, 1 );
151 // Movement of the camera
152 QGroupBox* CameraGroup = new QGroupBox( tr( "CAMERA_TITLE" ), aBox, "CameraGroup" );
153 CameraGroup->setColumnLayout(0, Qt::Vertical );
154 CameraGroup->layout()->setSpacing( 0 );
155 CameraGroup->layout()->setMargin( 0 );
157 QGridLayout* CameraGroupLayout = new QGridLayout (CameraGroup->layout());
158 CameraGroupLayout->setAlignment(Qt::AlignTop | Qt::AlignCenter);
159 CameraGroupLayout->setSpacing(6);
160 CameraGroupLayout->setMargin(11);
162 QLabel* ZoomFactorLabel = new QLabel( tr( "ZOOM_FACTOR" ), CameraGroup );
163 myZoomFactorSpinBox = new QtxDblSpinBox( 0.1, 10.0, 0.1, CameraGroup );
164 myZoomFactorSpinBox->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
166 QLabel* StepNumberLabel = new QLabel( tr( "STEP_NUMBER" ), CameraGroup );
167 myStepNumberSpinBox = new QtxIntSpinBox( 1, 100, 1, CameraGroup );
168 myStepNumberSpinBox->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
170 CameraGroupLayout->addWidget( ZoomFactorLabel, 0, 0 );
171 CameraGroupLayout->addWidget( myZoomFactorSpinBox, 0, 1 );
172 CameraGroupLayout->addWidget( StepNumberLabel, 1, 0 );
173 CameraGroupLayout->addWidget( myStepNumberSpinBox, 1, 1 );
175 // Display parent mesh element
176 QGroupBox* ParentMeshGroup = new QGroupBox( tr( "PARENT_MESH_TITLE" ), aBox, "ParentMeshGroup" );
177 ParentMeshGroup->setColumnLayout(0, Qt::Vertical );
178 ParentMeshGroup->layout()->setSpacing( 0 );
179 ParentMeshGroup->layout()->setMargin( 0 );
181 QGridLayout* ParentMeshGroupLayout = new QGridLayout (ParentMeshGroup->layout());
182 ParentMeshGroupLayout->setAlignment(Qt::AlignTop | Qt::AlignLeft);
183 ParentMeshGroupLayout->setSpacing(6);
184 ParentMeshGroupLayout->setMargin(11);
186 myDisplayParentMeshCheckBox = new QCheckBox( tr( "DISPLAY_PARENT_MESH" ), ParentMeshGroup );
187 ParentMeshGroupLayout->addWidget( myDisplayParentMeshCheckBox, 0, 0 );
189 // Common buttons ===========================================================
190 QGroupBox* GroupButtons = new QGroupBox( this, "GroupButtons" );
191 GroupButtons->setColumnLayout(0, Qt::Vertical );
192 GroupButtons->layout()->setSpacing( 0 );
193 GroupButtons->layout()->setMargin( 0 );
194 QGridLayout* GroupButtonsLayout = new QGridLayout( GroupButtons->layout() );
195 GroupButtonsLayout->setAlignment( Qt::AlignTop );
196 GroupButtonsLayout->setSpacing( 6 );
197 GroupButtonsLayout->setMargin( 11 );
199 QPushButton* buttonApply = new QPushButton( tr( "&Apply" ), GroupButtons, "buttonApply" );
200 buttonApply->setAutoDefault( TRUE );
201 buttonApply->setDefault( TRUE );
202 GroupButtonsLayout->addWidget( buttonApply, 0, 0 );
203 GroupButtonsLayout->addItem( new QSpacerItem( 5, 5, QSizePolicy::Expanding, QSizePolicy::Minimum ), 0, 1 );
205 QPushButton* buttonClose = new QPushButton( tr( "&Close" ) , GroupButtons, "buttonClose" );
206 buttonClose->setAutoDefault( TRUE );
207 GroupButtonsLayout->addWidget( buttonClose, 0, 2 );
209 TopLayout->addWidget( aBox );
210 TopLayout->addWidget( GroupButtons );
212 connect( buttonApply, SIGNAL( clicked() ), this, SLOT( onClickApply() ) );
213 connect( buttonClose, SIGNAL( clicked() ), this, SLOT( onClickClose() ) );
216 VVTK_PickingDlg::~VVTK_PickingDlg()
220 void VVTK_PickingDlg::AddActor( VISU_GaussPtsAct* theActor )
222 theActor->SetPickingSettings( myPickingSettings.GetPointer() );
225 void VVTK_PickingDlg::RemoveActor( VISU_GaussPtsAct* theActor )
227 theActor->SetPickingSettings( NULL );
230 void VVTK_PickingDlg::Update()
232 float aCursorSize = 0.5;
233 float aPyramidHeight = 10.0;
234 float aPointTolerance = 0.1;
235 QColor aColor = Qt::yellow;
236 int anInfoWindowTransparency = 50;
237 int anInfoWindowPosition = VISU_PickingSettings::BelowPoint;
238 float aZoomFactor = 1.5;
239 int aStepNumber = 10;
240 bool aDisplayParentMesh = false;
242 if( !myPickingSettings->GetInitial() )
244 myCursorSizeSpinBox->setValue( myPickingSettings->GetCursorSize() );
245 myPyramidHeightSpinBox->setValue( myPickingSettings->GetPyramidHeight() );
246 myPointToleranceSpinBox->setValue( myPickingSettings->GetPointTolerance() );
247 myTransparencySpinBox->setValue( int(myPickingSettings->GetInfoWindowTransparency() * 100.0) );
248 myPositionComboBox->setCurrentItem( myPickingSettings->GetInfoWindowPosition() );
249 myZoomFactorSpinBox->setValue( myPickingSettings->GetZoomFactor() );
250 myStepNumberSpinBox->setValue( myPickingSettings->GetStepNumber() );
251 myDisplayParentMeshCheckBox->setChecked( myPickingSettings->GetDisplayParentMesh() );
253 float* aColor = myPickingSettings->GetColor();
254 mySelectionColorButton->setPaletteBackgroundColor( QColor( ( int )( aColor[0] * 255.0 ),
255 ( int )( aColor[1] * 255.0 ),
256 ( int )( aColor[2] * 255.0 ) ) );
261 SUIT_ResourceMgr* aResourceMgr = SUIT_Session::session()->resourceMgr();
263 aCursorSize = aResourceMgr->doubleValue( "VISU", "picking_cursor_size", aCursorSize );
264 myCursorSizeSpinBox->setValue( aCursorSize );
266 aPyramidHeight = aResourceMgr->doubleValue( "VISU", "picking_pyramid_height", aPyramidHeight );
267 myPyramidHeightSpinBox->setValue( aPyramidHeight );
269 aPointTolerance = aResourceMgr->doubleValue( "VISU", "picking_point_tolerance", aPointTolerance );
270 myPointToleranceSpinBox->setValue( aPointTolerance );
272 aColor = aResourceMgr->colorValue( "VISU", "picking_selection_color", aColor );
273 mySelectionColorButton->setPaletteBackgroundColor( aColor );
275 anInfoWindowTransparency = aResourceMgr->integerValue( "VISU", "picking_transparency", anInfoWindowTransparency );
276 myTransparencySpinBox->setValue( anInfoWindowTransparency );
278 anInfoWindowPosition = aResourceMgr->integerValue( "VISU", "picking_position", anInfoWindowPosition );
279 myPositionComboBox->setCurrentItem( anInfoWindowPosition );
281 aZoomFactor = aResourceMgr->doubleValue( "VISU", "picking_zoom_factor", aZoomFactor );
282 myZoomFactorSpinBox->setValue( aZoomFactor );
284 aStepNumber = aResourceMgr->integerValue( "VISU", "picking_step_number", aStepNumber );
285 myStepNumberSpinBox->setValue( aStepNumber );
287 aDisplayParentMesh = aResourceMgr->booleanValue( "VISU", "picking_display_parent_mesh", aDisplayParentMesh );
288 myDisplayParentMeshCheckBox->setChecked( aDisplayParentMesh );
294 VISU_PickingSettings*
296 ::GetPickingSettings()
298 return myPickingSettings.GetPointer();
301 void VVTK_PickingDlg::SetInteractor( SVTK_RenderWindowInteractor* theInteractor )
303 myInteractor = theInteractor;
305 theInteractor->GetDevice()->AddObserver(vtkCommand::KeyPressEvent,
306 myEventCallbackCommand.GetPointer(),
311 void VVTK_PickingDlg::ProcessEvents(vtkObject* vtkNotUsed(theObject),
312 unsigned long theEvent,
314 void* vtkNotUsed(theCallData))
316 VVTK_PickingDlg* self = reinterpret_cast<VVTK_PickingDlg*>(theClientData);
319 case vtkCommand::KeyPressEvent:
325 void VVTK_PickingDlg::KeyPressed()
327 if( myInteractor->GetDevice()->GetKeyCode() == 'P' )
329 bool aDisplayParentMesh = !myPickingSettings->GetDisplayParentMesh();
330 myPickingSettings->SetDisplayParentMesh( aDisplayParentMesh );
332 myDisplayParentMeshCheckBox->setChecked( aDisplayParentMesh );
334 myPickingSettings->InvokeEvent(VISU::UpdatePickingSettingsEvent,NULL);
338 void VVTK_PickingDlg::onClickApply()
340 myPickingSettings->SetInitial( false );
342 myPickingSettings->SetCursorSize( myCursorSizeSpinBox->value() );
343 myPickingSettings->SetPyramidHeight( myPyramidHeightSpinBox->value() );
344 myPickingSettings->SetPointTolerance( myPointToleranceSpinBox->value() );
345 myPickingSettings->SetInfoWindowTransparency( myTransparencySpinBox->value() / 100.0 );
346 myPickingSettings->SetInfoWindowPosition( myPositionComboBox->currentItem() );
347 myPickingSettings->SetZoomFactor( myZoomFactorSpinBox->value() );
348 myPickingSettings->SetStepNumber( myStepNumberSpinBox->value() );
349 myPickingSettings->SetDisplayParentMesh( myDisplayParentMeshCheckBox->isChecked() );
351 QColor aButtonColor = mySelectionColorButton->paletteBackgroundColor();
353 aColor[0] = aButtonColor.red() / 255.0;
354 aColor[1] = aButtonColor.green() / 255.0;
355 aColor[2] = aButtonColor.blue() / 255.0;
356 myPickingSettings->SetColor( aColor );
358 myPickingSettings->InvokeEvent(VISU::UpdatePickingSettingsEvent,NULL);
361 void VVTK_PickingDlg::onClickClose()
363 myAction->setOn( false );
367 void VVTK_PickingDlg::done( int r )
369 myAction->setOn( false );
373 void VVTK_PickingDlg::onColorButtonPressed()
375 QColor aColor = QColorDialog::getColor( mySelectionColorButton->paletteBackgroundColor(), this );
376 if( aColor.isValid() )
377 mySelectionColorButton->setPaletteBackgroundColor( aColor );