1 #include <qpopupmenu.h>
\r
2 #include <qcolordialog.h>
\r
4 #include <vtkCamera.h>
\r
5 #include <vtkRenderer.h>
\r
6 #include <vtkActorCollection.h>
\r
8 #include "SUIT_Session.h"
\r
10 #include "SVTK_Selection.h"
\r
11 #include "SVTK_ViewModel.h"
\r
12 #include "SVTK_ViewWindow.h"
\r
13 #include "SVTK_Prs.h"
\r
15 #include "VTKViewer_ViewModel.h"
\r
17 #include "SVTK_RenderWindowInteractor.h"
\r
18 #include "SVTK_RenderWindow.h"
\r
20 //#include <ToolsGUI.h>
\r
22 #include <SALOME_Actor.h>
\r
23 #include <SALOME_InteractiveObject.hxx>
\r
25 // Temporarily commented to avoid awful dependecy on SALOMEDS
\r
26 // TODO: better mechanism of storing display/erse status in a study
\r
27 // should be provided...
\r
28 //#include "Utils_ORB_INIT.hxx"
\r
29 //#include "Utils_SINGLETON.hxx"
\r
30 //#include "SALOME_ModuleCatalog_impl.hxx"
\r
31 //#include "SALOME_NamingService.hxx"
\r
33 //#include "SALOMEDSClient.hxx"
\r
34 //#include "SALOMEDS_StudyManager.hxx"
\r
36 // in order NOT TO link with SalomeApp, here the code returns SALOMEDS_Study.
\r
37 // SalomeApp_Study::studyDS() does it as well, but -- here it is retrieved from
\r
38 // SALOMEDS::StudyManager - no linkage with SalomeApp.
\r
40 // Temporarily commented to avoid awful dependecy on SALOMEDS
\r
41 // TODO: better mechanism of storing display/erse status in a study
\r
42 // should be provided...
\r
43 //static _PTR(Study) getStudyDS()
\r
45 // SALOMEDSClient_Study* aStudy = NULL;
\r
46 // _PTR(StudyManager) aMgr( new SALOMEDS_StudyManager() );
\r
47 // get id of SUIT_Study, if it's a SalomeApp_Study, it will return
\r
48 // id of its underlying SALOMEDS::Study
\r
49 // SUIT_Application* app = SUIT_Session::session()->activeApplication();
\r
50 // if ( !app ) return _PTR(Study)(aStudy);
\r
51 // SUIT_Study* stud = app->activeStudy();
\r
52 // if ( !stud ) return _PTR(Study)(aStudy);
\r
53 // const int id = stud->id(); // virtual method, must return SALOMEDS_Study id
\r
54 // get SALOMEDS_Study with this id from StudyMgr
\r
55 // return aMgr->GetStudyByID( id );
\r
58 //==========================================================
\r
59 SVTK_Viewer::SVTK_Viewer()
\r
61 myTrihedronSize = 100;
\r
64 //==========================================================
\r
65 SVTK_Viewer::~SVTK_Viewer()
\r
69 QColor SVTK_Viewer::backgroundColor() const
\r
74 void SVTK_Viewer::setBackgroundColor( const QColor& c )
\r
80 //==========================================================
\r
81 SUIT_ViewWindow* SVTK_Viewer::createView( SUIT_Desktop* theDesktop )
\r
83 SVTK_ViewWindow* vw = new SVTK_ViewWindow( theDesktop, this );
\r
84 vw->setBackgroundColor( backgroundColor() );
\r
85 vw->SetTrihedronSize( trihedronSize() );
\r
89 int SVTK_Viewer::trihedronSize() const
\r
91 return myTrihedronSize;
\r
94 void SVTK_Viewer::setTrihedronSize( const int sz )
\r
96 myTrihedronSize = sz;
\r
98 SUIT_ViewManager* vm = getViewManager();
\r
102 QPtrVector<SUIT_ViewWindow> vec = vm->getViews();
\r
103 for ( int i = 0; i < vec.count(); i++ )
\r
105 SUIT_ViewWindow* win = vec.at( i );
\r
106 if ( !win || !win->inherits( "SVTK_ViewWindow" ) )
\r
109 SVTK_ViewWindow* vw = (SVTK_ViewWindow*)win;
\r
110 vw->SetTrihedronSize( sz );
\r
114 //==========================================================
\r
115 void SVTK_Viewer::setViewManager(SUIT_ViewManager* theViewManager)
\r
117 SUIT_ViewModel::setViewManager(theViewManager);
\r
119 if ( !theViewManager )
\r
122 connect(theViewManager, SIGNAL(mousePress(SUIT_ViewWindow*, QMouseEvent*)),
\r
123 this, SLOT(onMousePress(SUIT_ViewWindow*, QMouseEvent*)));
\r
125 connect(theViewManager, SIGNAL(mouseMove(SUIT_ViewWindow*, QMouseEvent*)),
\r
126 this, SLOT(onMouseMove(SUIT_ViewWindow*, QMouseEvent*)));
\r
128 connect(theViewManager, SIGNAL(mouseRelease(SUIT_ViewWindow*, QMouseEvent*)),
\r
129 this, SLOT(onMouseRelease(SUIT_ViewWindow*, QMouseEvent*)));
\r
132 //==========================================================
\r
133 void SVTK_Viewer::contextMenuPopup( QPopupMenu* thePopup )
\r
135 thePopup->insertItem( VTKViewer_Viewer::tr( "MEN_DUMP_VIEW" ), this, SLOT( onDumpView() ) );
\r
136 thePopup->insertItem( VTKViewer_Viewer::tr( "MEN_CHANGE_BACKGROUD" ), this, SLOT( onChangeBgColor() ) );
\r
138 thePopup->insertSeparator();
\r
140 SVTK_ViewWindow* aView = (SVTK_ViewWindow*)(myViewManager->getActiveView());
\r
141 if ( aView && !aView->getToolBar()->isVisible() )
\r
142 thePopup->insertItem( VTKViewer_Viewer::tr( "MEN_SHOW_TOOLBAR" ), this, SLOT( onShowToolbar() ) );
\r
145 //==========================================================
\r
146 void SVTK_Viewer::onMousePress(SUIT_ViewWindow* vw, QMouseEvent* event)
\r
148 if(SVTK_ViewWindow* aVW = dynamic_cast<SVTK_ViewWindow*>(vw)){
\r
149 if(SVTK_RenderWindowInteractor* aRWI = aVW->getRWInteractor()){
\r
150 switch(event->button()) {
\r
152 aRWI->LeftButtonPressed(event) ;
\r
155 aRWI->MiddleButtonPressed(event) ;
\r
158 aRWI->RightButtonPressed(event) ;
\r
167 //==========================================================
\r
170 ::onMouseMove(SUIT_ViewWindow* vw, QMouseEvent* event)
\r
172 if(SVTK_ViewWindow* aVW = dynamic_cast<SVTK_ViewWindow*>(vw)){
\r
173 if(SVTK_RenderWindowInteractor* aRWI = aVW->getRWInteractor()){
\r
174 aRWI->MouseMove( event );
\r
179 //==========================================================
\r
182 ::onMouseRelease(SUIT_ViewWindow* vw, QMouseEvent* event)
\r
184 if(SVTK_ViewWindow* aVW = dynamic_cast<SVTK_ViewWindow*>(vw)){
\r
185 if(SVTK_RenderWindowInteractor* aRWI = aVW->getRWInteractor()){
\r
186 switch(event->button()) {
\r
188 aRWI->LeftButtonReleased(event) ;
\r
191 aRWI->MiddleButtonReleased(event) ;
\r
194 aRWI->RightButtonReleased(event) ;
\r
203 //==========================================================
\r
206 ::enableSelection(bool isEnabled)
\r
208 mySelectionEnabled = isEnabled;
\r
209 //!! To be done for view windows
\r
212 //==========================================================
\r
215 ::enableMultiselection(bool isEnable)
\r
217 myMultiSelectionEnabled = isEnable;
\r
218 //!! To be done for view windows
\r
221 void SVTK_Viewer::onDumpView()
\r
223 SVTK_ViewWindow* aView = (SVTK_ViewWindow*)(myViewManager->getActiveView());
\r
225 aView->onDumpView();
\r
228 //==========================================================
\r
229 void SVTK_Viewer::onChangeBgColor()
\r
231 QPtrVector<SUIT_ViewWindow> aViews = myViewManager->getViews();
\r
232 for(int i = 0, iEnd = aViews.size(); i < iEnd; i++)
\r
233 if(SUIT_ViewWindow* aViewWindow = aViews.at(i))
\r
234 if(SVTK_ViewWindow* aView = dynamic_cast<SVTK_ViewWindow*>(aViewWindow)){
\r
235 QColor aColor = QColorDialog::getColor( aView->backgroundColor(), aView);
\r
236 if ( aColor.isValid() )
\r
237 aView->setBackgroundColor(aColor);
\r
241 //==========================================================
\r
246 QPtrVector<SUIT_ViewWindow> aViews = myViewManager->getViews();
\r
247 for(int i = 0, iEnd = aViews.size(); i < iEnd; i++)
\r
248 if(SUIT_ViewWindow* aViewWindow = aViews.at(i))
\r
249 if(SVTK_ViewWindow* aView = dynamic_cast<SVTK_ViewWindow*>(aViewWindow))
\r
250 aView->getToolBar()->show();
\r
253 //==========================================================
\r
256 ::Display( const SALOME_VTKPrs* prs )
\r
258 // try do downcast object
\r
259 if(const SVTK_Prs* aPrs = dynamic_cast<const SVTK_Prs*>( prs )){
\r
262 if(vtkActorCollection* anActorCollection = aPrs->GetObjects()){
\r
263 // get SALOMEDS Study
\r
264 // Temporarily commented to avoid awful dependecy on SALOMEDS
\r
265 // TODO: better mechanism of storing display/erse status in a study
\r
266 // should be provided...
\r
267 // _PTR(Study) aStudy(getStudyDS());
\r
268 anActorCollection->InitTraversal();
\r
269 while(vtkActor* anActor = anActorCollection->GetNextActor()){
\r
270 if(SALOME_Actor* anAct = SALOME_Actor::SafeDownCast(anActor)){
\r
271 // Set visibility flag
\r
272 // Temporarily commented to avoid awful dependecy on SALOMEDS
\r
273 // TODO: better mechanism of storing display/erse status in a study
\r
274 // should be provided...
\r
275 //Handle(SALOME_InteractiveObject) anObj = anAct->getIO();
\r
276 //if(!anObj.IsNull() && anObj->hasEntry() && aStudy){
\r
277 // ToolsGUI::SetVisibility(aStudy,anObj->getEntry(),true,this);
\r
279 // just display the object
\r
280 QPtrVector<SUIT_ViewWindow> aViews = myViewManager->getViews();
\r
281 for(int i = 0, iEnd = aViews.size(); i < iEnd; i++){
\r
282 if(SUIT_ViewWindow* aViewWindow = aViews.at(i)){
\r
283 if(SVTK_ViewWindow* aView = dynamic_cast<SVTK_ViewWindow*>(aViewWindow)){
\r
284 if(SVTK_RenderWindowInteractor* aRWI = aView->getRWInteractor()){
\r
285 aRWI->Display(anAct,false);
\r
286 if(anAct->IsSetCamera()){
\r
287 vtkRenderer* aRenderer = aView->getRenderer();
\r
288 anAct->SetCamera( aRenderer->GetActiveCamera() );
\r
300 //==========================================================
\r
303 ::Erase( const SALOME_VTKPrs* prs, const bool forced )
\r
305 // try do downcast object
\r
306 if(const SVTK_Prs* aPrs = dynamic_cast<const SVTK_Prs*>( prs )){
\r
309 if(vtkActorCollection* anActorCollection = aPrs->GetObjects()){
\r
310 // get SALOMEDS Study
\r
311 // Temporarily commented to avoid awful dependecy on SALOMEDS
\r
312 // TODO: better mechanism of storing display/erse status in a study
\r
313 // should be provided...
\r
314 //_PTR(Study) aStudy(getStudyDS());
\r
315 anActorCollection->InitTraversal();
\r
316 while(vtkActor* anActor = anActorCollection->GetNextActor())
\r
317 if(SALOME_Actor* anAct = SALOME_Actor::SafeDownCast(anActor)){
\r
318 // Set visibility flag
\r
319 // Temporarily commented to avoid awful dependecy on SALOMEDS
\r
320 // TODO: better mechanism of storing display/erse status in a study
\r
321 // should be provided...
\r
322 //Handle(SALOME_InteractiveObject) anObj = anAct->getIO();
\r
323 //if(!anObj.IsNull() && anObj->hasEntry() && aStudy){
\r
324 // ToolsGUI::SetVisibility(aStudy,anObj->getEntry(),false,this);
\r
326 // just display the object
\r
327 QPtrVector<SUIT_ViewWindow> aViews = myViewManager->getViews();
\r
328 for(int i = 0, iEnd = aViews.size(); i < iEnd; i++){
\r
329 if(SUIT_ViewWindow* aViewWindow = aViews.at(i))
\r
330 if(SVTK_ViewWindow* aView = dynamic_cast<SVTK_ViewWindow*>(aViewWindow))
\r
331 if(SVTK_RenderWindowInteractor* aRWI = aView->getRWInteractor())
\r
333 aRWI->Remove(anAct,false);
\r
335 aRWI->Erase(anAct,forced);
\r
342 //==========================================================
\r
345 ::EraseAll( const bool forced )
\r
347 // Temporarily commented to avoid awful dependecy on SALOMEDS
\r
348 // TODO: better mechanism of storing display/erse status in a study
\r
349 // should be provided...
\r
350 //_PTR(Study) aStudy(getStudyDS());
\r
351 QPtrVector<SUIT_ViewWindow> aViews = myViewManager->getViews();
\r
352 for(int i = 0, iEnd = aViews.size(); i < iEnd; i++){
\r
353 if(SUIT_ViewWindow* aViewWindow = aViews.at(i)){
\r
354 if(SVTK_ViewWindow* aView = dynamic_cast<SVTK_ViewWindow*>(aViewWindow)){
\r
355 vtkRenderer* aRenderer = aView->getRenderer();
\r
356 vtkActorCollection* anActorCollection = aRenderer->GetActors();
\r
357 anActorCollection->InitTraversal();
\r
358 while(vtkActor* anActor = anActorCollection->GetNextActor()){
\r
359 if(SALOME_Actor* anAct = SALOME_Actor::SafeDownCast(anActor)){
\r
360 // Set visibility flag
\r
361 // Temporarily commented to avoid awful dependecy on SALOMEDS
\r
362 // TODO: better mechanism of storing display/erse status in a study
\r
363 // should be provided...
\r
364 //Handle(SALOME_InteractiveObject) anObj = anAct->getIO();
\r
365 //if(!anObj.IsNull() && anObj->hasEntry() && aStudy)
\r
366 // ToolsGUI::SetVisibility(aStudy,anObj->getEntry(),false,this);
\r
368 aRenderer->RemoveActor(anAct);
\r
370 // just erase actor
\r
371 anAct->SetVisibility( false );
\r
372 // erase dependent actors
\r
373 vtkActorCollection* aCollection = vtkActorCollection::New();
\r
374 anAct->GetChildActors( aCollection );
\r
375 aCollection->InitTraversal();
\r
376 while(vtkActor* aSubAct = aCollection->GetNextActor())
\r
377 aSubAct->SetVisibility( false );
\r
378 aCollection->Delete();
\r
388 //==========================================================
\r
391 ::CreatePrs( const char* entry )
\r
393 SVTK_Prs* prs = new SVTK_Prs();
\r
395 vtkRenderer* rnr = ( (SVTK_ViewWindow*) getViewManager()->getActiveView() )->getRenderer();
\r
396 vtkActorCollection* theActors = rnr->GetActors();
\r
397 theActors->InitTraversal();
\r
399 while( ( ac = theActors->GetNextActor() ) ) {
\r
400 SALOME_Actor* anActor = SALOME_Actor::SafeDownCast( ac );
\r
401 if ( anActor && anActor->hasIO() && !strcmp( anActor->getIO()->getEntry(), entry ) ) {
\r
402 prs->AddObject( ac );
\r
409 //==========================================================
\r
412 ::BeforeDisplay( SALOME_Displayer* d )
\r
414 d->BeforeDisplay( this, SALOME_VTKViewType() );
\r
417 //==========================================================
\r
419 SVTK_Viewer::AfterDisplay( SALOME_Displayer* d )
\r
421 d->AfterDisplay( this, SALOME_VTKViewType() );
\r
424 //==========================================================
\r
427 ::isVisible( const Handle(SALOME_InteractiveObject)& io )
\r
429 QPtrVector<SUIT_ViewWindow> aViews = myViewManager->getViews();
\r
430 for(int i = 0, iEnd = aViews.size(); i < iEnd; i++)
\r
431 if(SUIT_ViewWindow* aViewWindow = aViews.at(i))
\r
432 if(SVTK_ViewWindow* aView = dynamic_cast<SVTK_ViewWindow*>(aViewWindow))
\r
433 if(SVTK_RenderWindowInteractor* aRWI = aView->getRWInteractor())
\r
434 if(!aRWI->isVisible( io ))
\r
439 //==========================================================
\r
444 // if (theUpdateTrihedron) onAdjustTrihedron();
\r
445 QPtrVector<SUIT_ViewWindow> aViews = myViewManager->getViews();
\r
446 for(int i = 0, iEnd = aViews.size(); i < iEnd; i++)
\r
447 if(SUIT_ViewWindow* aViewWindow = aViews.at(i))
\r
448 if(SVTK_ViewWindow* aView = dynamic_cast<SVTK_ViewWindow*>(aViewWindow))
\r
449 if(SVTK_RenderWindow* aRW = aView->getRenderWindow())
\r
455 ::onSelectionChanged()
\r
457 emit selectionChanged();
\r