1 #include <qpopupmenu.h>
2 #include <qcolordialog.h>
5 #include <vtkRenderer.h>
6 #include <vtkActorCollection.h>
8 #include "SUIT_Session.h"
10 #include "SVTK_Selection.h"
11 #include "SVTK_ViewModel.h"
12 #include "SVTK_ViewWindow.h"
15 #include "SVTK_RenderWindowInteractor.h"
16 #include "SVTK_RenderWindow.h"
20 #include "SALOME_Actor.h"
21 #include "SALOME_InteractiveObject.hxx"
23 #include "Utils_ORB_INIT.hxx"
24 #include "Utils_SINGLETON.hxx"
25 #include "SALOME_ModuleCatalog_impl.hxx"
26 #include "SALOME_NamingService.hxx"
28 #include "SALOMEDSClient.hxx"
29 #include "SALOMEDS_StudyManager.hxx"
31 // in order NOT TO link with SalomeApp, here the code returns SALOMEDS_Study.
32 // SalomeApp_Study::studyDS() does it as well, but -- here it is retrieved from
33 // SALOMEDS::StudyManager - no linkage with SalomeApp.
35 static _PTR(Study) getStudyDS()
37 SALOMEDSClient_Study* aStudy = NULL;
38 _PTR(StudyManager) aMgr( new SALOMEDS_StudyManager() );
40 // get id of SUIT_Study, if it's a SalomeApp_Study, it will return
41 // id of its underlying SALOMEDS::Study
42 SUIT_Application* app = SUIT_Session::session()->activeApplication();
43 if ( !app ) return _PTR(Study)(aStudy);
44 SUIT_Study* stud = app->activeStudy();
45 if ( !stud ) return _PTR(Study)(aStudy);
46 const int id = stud->id(); // virtual method, must return SALOMEDS_Study id
47 // get SALOMEDS_Study with this id from StudyMgr
48 return aMgr->GetStudyByID( id );
51 //==========================================================
52 SVTK_Viewer::SVTK_Viewer()
54 myTrihedronSize = 100;
57 //==========================================================
58 SVTK_Viewer::~SVTK_Viewer()
62 QColor SVTK_Viewer::backgroundColor() const
67 void SVTK_Viewer::setBackgroundColor( const QColor& c )
73 //==========================================================
74 SUIT_ViewWindow* SVTK_Viewer::createView( SUIT_Desktop* theDesktop )
76 SVTK_ViewWindow* vw = new SVTK_ViewWindow( theDesktop, this );
77 vw->setBackgroundColor( backgroundColor() );
78 vw->SetTrihedronSize( trihedronSize() );
82 int SVTK_Viewer::trihedronSize() const
84 return myTrihedronSize;
87 void SVTK_Viewer::setTrihedronSize( const int sz )
91 SUIT_ViewManager* vm = getViewManager();
95 QPtrVector<SUIT_ViewWindow> vec = vm->getViews();
96 for ( int i = 0; i < vec.count(); i++ )
98 SUIT_ViewWindow* win = vec.at( i );
99 if ( !win || !win->inherits( "SVTK_ViewWindow" ) )
102 SVTK_ViewWindow* vw = (SVTK_ViewWindow*)win;
103 vw->SetTrihedronSize( sz );
107 //==========================================================
108 void SVTK_Viewer::setViewManager(SUIT_ViewManager* theViewManager)
110 SUIT_ViewModel::setViewManager(theViewManager);
112 if ( !theViewManager )
115 connect(theViewManager, SIGNAL(mousePress(SUIT_ViewWindow*, QMouseEvent*)),
116 this, SLOT(onMousePress(SUIT_ViewWindow*, QMouseEvent*)));
118 connect(theViewManager, SIGNAL(mouseMove(SUIT_ViewWindow*, QMouseEvent*)),
119 this, SLOT(onMouseMove(SUIT_ViewWindow*, QMouseEvent*)));
121 connect(theViewManager, SIGNAL(mouseRelease(SUIT_ViewWindow*, QMouseEvent*)),
122 this, SLOT(onMouseRelease(SUIT_ViewWindow*, QMouseEvent*)));
125 //==========================================================
126 void SVTK_Viewer::contextMenuPopup( QPopupMenu* thePopup )
128 thePopup->insertItem( VTKViewer_Viewer::tr( "MEN_DUMP_VIEW" ), this, SLOT( onDumpView() ) );
129 thePopup->insertItem( VTKViewer_Viewer::tr( "MEN_CHANGE_BACKGROUD" ), this, SLOT( onChangeBgColor() ) );
131 thePopup->insertSeparator();
133 SVTK_ViewWindow* aView = (SVTK_ViewWindow*)(myViewManager->getActiveView());
134 if ( aView && !aView->getToolBar()->isVisible() )
135 thePopup->insertItem( VTKViewer_Viewer::tr( "MEN_SHOW_TOOLBAR" ), this, SLOT( onShowToolbar() ) );
138 //==========================================================
139 void SVTK_Viewer::onMousePress(SUIT_ViewWindow* vw, QMouseEvent* event)
141 if(SVTK_ViewWindow* aVW = dynamic_cast<SVTK_ViewWindow*>(vw)){
142 if(SVTK_RenderWindowInteractor* aRWI = aVW->getRWInteractor()){
143 switch(event->button()) {
145 aRWI->LeftButtonPressed(event) ;
148 aRWI->MiddleButtonPressed(event) ;
151 aRWI->RightButtonPressed(event) ;
160 //==========================================================
163 ::onMouseMove(SUIT_ViewWindow* vw, QMouseEvent* event)
165 if(SVTK_ViewWindow* aVW = dynamic_cast<SVTK_ViewWindow*>(vw)){
166 if(SVTK_RenderWindowInteractor* aRWI = aVW->getRWInteractor()){
167 aRWI->MouseMove( event );
172 //==========================================================
175 ::onMouseRelease(SUIT_ViewWindow* vw, QMouseEvent* event)
177 if(SVTK_ViewWindow* aVW = dynamic_cast<SVTK_ViewWindow*>(vw)){
178 if(SVTK_RenderWindowInteractor* aRWI = aVW->getRWInteractor()){
179 switch(event->button()) {
181 aRWI->LeftButtonReleased(event) ;
184 aRWI->MiddleButtonReleased(event) ;
187 aRWI->RightButtonReleased(event) ;
196 //==========================================================
199 ::enableSelection(bool isEnabled)
201 mySelectionEnabled = isEnabled;
202 //!! To be done for view windows
205 //==========================================================
208 ::enableMultiselection(bool isEnable)
210 myMultiSelectionEnabled = isEnable;
211 //!! To be done for view windows
214 void SVTK_Viewer::onDumpView()
216 SVTK_ViewWindow* aView = (SVTK_ViewWindow*)(myViewManager->getActiveView());
221 //==========================================================
222 void SVTK_Viewer::onChangeBgColor()
224 QPtrVector<SUIT_ViewWindow> aViews = myViewManager->getViews();
225 for(int i = 0, iEnd = aViews.size(); i < iEnd; i++)
226 if(SUIT_ViewWindow* aViewWindow = aViews.at(i))
227 if(SVTK_ViewWindow* aView = dynamic_cast<SVTK_ViewWindow*>(aViewWindow)){
228 QColor aColor = QColorDialog::getColor( aView->backgroundColor(), aView);
229 if ( aColor.isValid() )
230 aView->setBackgroundColor(aColor);
234 //==========================================================
239 QPtrVector<SUIT_ViewWindow> aViews = myViewManager->getViews();
240 for(int i = 0, iEnd = aViews.size(); i < iEnd; i++)
241 if(SUIT_ViewWindow* aViewWindow = aViews.at(i))
242 if(SVTK_ViewWindow* aView = dynamic_cast<SVTK_ViewWindow*>(aViewWindow))
243 aView->getToolBar()->show();
246 //==========================================================
249 ::Display( const SALOME_VTKPrs* prs )
251 // try do downcast object
252 if(const SVTK_Prs* aPrs = dynamic_cast<const SVTK_Prs*>( prs )){
255 if(vtkActorCollection* anActorCollection = aPrs->GetObjects()){
256 // get SALOMEDS Study
257 _PTR(Study) aStudy(getStudyDS());
258 anActorCollection->InitTraversal();
259 while(vtkActor* anActor = anActorCollection->GetNextActor()){
260 if(SALOME_Actor* anAct = SALOME_Actor::SafeDownCast(anActor)){
261 // Set visibility flag
262 Handle(SALOME_InteractiveObject) anObj = anAct->getIO();
263 if(!anObj.IsNull() && anObj->hasEntry() && aStudy){
264 ToolsGUI::SetVisibility(aStudy,anObj->getEntry(),true,this);
266 // just display the object
267 QPtrVector<SUIT_ViewWindow> aViews = myViewManager->getViews();
268 for(int i = 0, iEnd = aViews.size(); i < iEnd; i++){
269 if(SUIT_ViewWindow* aViewWindow = aViews.at(i)){
270 if(SVTK_ViewWindow* aView = dynamic_cast<SVTK_ViewWindow*>(aViewWindow)){
271 if(SVTK_RenderWindowInteractor* aRWI = aView->getRWInteractor()){
272 aRWI->Display(anAct,false);
273 if(anAct->IsSetCamera()){
274 vtkRenderer* aRenderer = aView->getRenderer();
275 anAct->SetCamera( aRenderer->GetActiveCamera() );
287 //==========================================================
290 ::Erase( const SALOME_VTKPrs* prs, const bool forced )
292 // try do downcast object
293 if(const SVTK_Prs* aPrs = dynamic_cast<const SVTK_Prs*>( prs )){
296 if(vtkActorCollection* anActorCollection = aPrs->GetObjects()){
297 // get SALOMEDS Study
298 _PTR(Study) aStudy(getStudyDS());
299 anActorCollection->InitTraversal();
300 while(vtkActor* anActor = anActorCollection->GetNextActor())
301 if(SALOME_Actor* anAct = SALOME_Actor::SafeDownCast(anActor)){
302 // Set visibility flag
303 Handle(SALOME_InteractiveObject) anObj = anAct->getIO();
304 if(!anObj.IsNull() && anObj->hasEntry() && aStudy){
305 ToolsGUI::SetVisibility(aStudy,anObj->getEntry(),false,this);
307 // just display the object
308 QPtrVector<SUIT_ViewWindow> aViews = myViewManager->getViews();
309 for(int i = 0, iEnd = aViews.size(); i < iEnd; i++){
310 if(SUIT_ViewWindow* aViewWindow = aViews.at(i))
311 if(SVTK_ViewWindow* aView = dynamic_cast<SVTK_ViewWindow*>(aViewWindow))
312 if(SVTK_RenderWindowInteractor* aRWI = aView->getRWInteractor())
314 aRWI->Remove(anAct,false);
316 aRWI->Erase(anAct,forced);
323 //==========================================================
326 ::EraseAll( const bool forced )
328 _PTR(Study) aStudy(getStudyDS());
329 QPtrVector<SUIT_ViewWindow> aViews = myViewManager->getViews();
330 for(int i = 0, iEnd = aViews.size(); i < iEnd; i++){
331 if(SUIT_ViewWindow* aViewWindow = aViews.at(i)){
332 if(SVTK_ViewWindow* aView = dynamic_cast<SVTK_ViewWindow*>(aViewWindow)){
333 vtkRenderer* aRenderer = aView->getRenderer();
334 vtkActorCollection* anActorCollection = aRenderer->GetActors();
335 anActorCollection->InitTraversal();
336 while(vtkActor* anActor = anActorCollection->GetNextActor()){
337 if(SALOME_Actor* anAct = SALOME_Actor::SafeDownCast(anActor)){
338 // Set visibility flag
339 Handle(SALOME_InteractiveObject) anObj = anAct->getIO();
340 if(!anObj.IsNull() && anObj->hasEntry() && aStudy)
341 ToolsGUI::SetVisibility(aStudy,anObj->getEntry(),false,this);
343 aRenderer->RemoveActor(anAct);
346 anAct->SetVisibility( false );
347 // erase dependent actors
348 vtkActorCollection* aCollection = vtkActorCollection::New();
349 anAct->GetChildActors( aCollection );
350 aCollection->InitTraversal();
351 while(vtkActor* aSubAct = aCollection->GetNextActor())
352 aSubAct->SetVisibility( false );
353 aCollection->Delete();
363 //==========================================================
366 ::CreatePrs( const char* entry )
368 SVTK_Prs* prs = new SVTK_Prs();
370 vtkRenderer* rnr = ( (SVTK_ViewWindow*) getViewManager()->getActiveView() )->getRenderer();
371 vtkActorCollection* theActors = rnr->GetActors();
372 theActors->InitTraversal();
374 while( ( ac = theActors->GetNextActor() ) ) {
375 SALOME_Actor* anActor = SALOME_Actor::SafeDownCast( ac );
376 if ( anActor && anActor->hasIO() && !strcmp( anActor->getIO()->getEntry(), entry ) ) {
377 prs->AddObject( ac );
384 //==========================================================
387 ::BeforeDisplay( SALOME_Displayer* d )
389 d->BeforeDisplay( this, SALOME_VTKViewType() );
392 //==========================================================
394 SVTK_Viewer::AfterDisplay( SALOME_Displayer* d )
396 d->AfterDisplay( this, SALOME_VTKViewType() );
399 //==========================================================
402 ::isVisible( const Handle(SALOME_InteractiveObject)& io )
404 QPtrVector<SUIT_ViewWindow> aViews = myViewManager->getViews();
405 for(int i = 0, iEnd = aViews.size(); i < iEnd; i++)
406 if(SUIT_ViewWindow* aViewWindow = aViews.at(i))
407 if(SVTK_ViewWindow* aView = dynamic_cast<SVTK_ViewWindow*>(aViewWindow))
408 if(SVTK_RenderWindowInteractor* aRWI = aView->getRWInteractor())
409 if(!aRWI->isVisible( io ))
414 //==========================================================
419 // if (theUpdateTrihedron) onAdjustTrihedron();
420 QPtrVector<SUIT_ViewWindow> aViews = myViewManager->getViews();
421 for(int i = 0, iEnd = aViews.size(); i < iEnd; i++)
422 if(SUIT_ViewWindow* aViewWindow = aViews.at(i))
423 if(SVTK_ViewWindow* aView = dynamic_cast<SVTK_ViewWindow*>(aViewWindow))
424 if(SVTK_RenderWindow* aRW = aView->getRenderWindow())
430 ::onSelectionChanged()
432 emit selectionChanged();