1 // Copyright (C) 2007-2014 CEA/DEN, EDF R&D, OPEN CASCADE
3 // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License, or (at your option) any later version.
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // Lesser General Public License for more details.
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
24 #include <QColorDialog>
27 #include <vtkCamera.h>
28 #include <vtkRenderer.h>
29 #include <vtkActorCollection.h>
31 //#include "SUIT_Session.h"
32 #include "SVTK_ViewModel.h"
33 #include "SVTK_ViewWindow.h"
34 #include "SVTK_View.h"
35 #include "SVTK_Renderer.h"
36 //#include "SVTK_MainWindow.h"
39 #include "VTKViewer_Algorithm.h"
40 #include "VTKViewer_ViewModel.h"
42 #include "SUIT_ViewModel.h"
43 #include "SUIT_ViewManager.h"
45 #include "SALOME_Actor.h"
47 #include "QtxActionToolMgr.h"
48 #include "QtxBackgroundTool.h"
50 // VSR: Uncomment below line to allow texture background support in VTK viewer
51 #define VTK_ENABLE_TEXTURED_BACKGROUND
54 // in order NOT TO link with SalomeApp, here the code returns SALOMEDS_Study.
55 // SalomeApp_Study::studyDS() does it as well, but -- here it is retrieved from
56 // SALOMEDS::StudyManager - no linkage with SalomeApp.
58 // Temporarily commented to avoid awful dependecy on SALOMEDS
59 // TODO: better mechanism of storing display/erse status in a study
60 // should be provided...
61 //static _PTR(Study) getStudyDS()
63 // SALOMEDSClient_Study* aStudy = NULL;
64 // _PTR(StudyManager) aMgr( new SALOMEDS_StudyManager() );
65 // get id of SUIT_Study, if it's a SalomeApp_Study, it will return
66 // id of its underlying SALOMEDS::Study
67 // SUIT_Application* app = SUIT_Session::session()->activeApplication();
68 // if ( !app ) return _PTR(Study)(aStudy);
69 // SUIT_Study* stud = app->activeStudy();
70 // if ( !stud ) return _PTR(Study)(aStudy);
71 // const int id = stud->id(); // virtual method, must return SALOMEDS_Study id
72 // get SALOMEDS_Study with this id from StudyMgr
73 // return aMgr->GetStudyByID( id );
79 SVTK_Viewer::SVTK_Viewer()
81 myTrihedronSize = 105;
82 myTrihedronRelative = true;
83 myIsStaticTrihedronVisible = true;
84 myIncrementSpeed = 10;
89 mySelectionEnabled = true;
90 myPreSelectionMode = Standard_Preselection;
94 myDefaultBackground = Qtx::BackgroundData( Qt::black );
100 SVTK_Viewer::~SVTK_Viewer()
104 /*! Get data for supported background modes: gradient types, identifiers and supported image formats */
105 QString SVTK_Viewer::backgroundData( QStringList& gradList, QIntList& idList, QIntList& txtList )
107 gradList << tr( "GT_HORIZONTALGRADIENT" )
108 << tr( "GT_VERTICALGRADIENT" )
109 << tr( "GT_FIRSTDIAGONALGRADIENT" )
110 << tr( "GT_SECONDDIAGONALGRADIENT" )
111 << tr( "GT_FIRSTCORNERGRADIENT" )
112 << tr( "GT_SECONDCORNERGRADIENT" )
113 << tr( "GT_THIRDCORNERGRADIENT" )
114 << tr( "GT_FOURTHCORNERGRADIENT" );
115 idList << HorizontalGradient
117 << FirstDiagonalGradient
118 << SecondDiagonalGradient
119 << FirstCornerGradient
120 << SecondCornerGradient
121 << ThirdCornerGradient
122 << FourthCornerGradient;
123 #ifdef VTK_ENABLE_TEXTURED_BACKGROUND
124 txtList << Qtx::CenterTexture << Qtx::TileTexture << Qtx::StretchTexture;
126 return tr("BG_IMAGE_FILES");
129 //! Get background color of the viewer [obsolete]
130 QColor SVTK_Viewer::backgroundColor() const
132 return background().color();
135 //! Set background color to the viewer [obsolete]
136 void SVTK_Viewer::setBackgroundColor( const QColor& c )
138 Qtx::BackgroundData bg = background();
144 \return background data
146 Qtx::BackgroundData SVTK_Viewer::background() const
148 return myDefaultBackground;
153 \param theBackground - new background data
155 void SVTK_Viewer::setBackground( const Qtx::BackgroundData& theBackground )
157 myDefaultBackground = theBackground.isValid() ? theBackground : Qtx::BackgroundData( Qt::black );
158 QVector<SUIT_ViewWindow*> aViews = myViewManager->getViews();
159 for(int i = 0, iEnd = aViews.size(); i < iEnd; i++){
160 if(SUIT_ViewWindow* aViewWindow = aViews.at(i)){
161 if(TViewWindow* aView = dynamic_cast<TViewWindow*>(aViewWindow)){
162 aView->setBackground(myDefaultBackground);
168 /*!Create new instance of view window on desktop \a theDesktop.
169 *\retval SUIT_ViewWindow* - created view window pointer.
171 SUIT_ViewWindow* SVTK_Viewer::createView( SUIT_Desktop* theDesktop )
173 TViewWindow* aViewWindow = new TViewWindow(theDesktop);
174 aViewWindow->Initialize(this);
176 aViewWindow->setBackground( background() );
177 aViewWindow->SetTrihedronSize( trihedronSize(), trihedronRelative() );
178 aViewWindow->SetStaticTrihedronVisible( isStaticTrihedronVisible() );
179 aViewWindow->SetProjectionMode( projectionMode() );
180 aViewWindow->SetInteractionStyle( interactionStyle() );
181 aViewWindow->SetZoomingStyle( zoomingStyle() );
182 aViewWindow->SetPreSelectionMode( preSelectionMode() );
183 aViewWindow->SetSelectionEnabled( isSelectionEnabled() );
184 aViewWindow->SetIncrementalSpeed( incrementalSpeed(), incrementalSpeedMode() );
185 aViewWindow->SetSpacemouseButtons( spacemouseBtn(1), spacemouseBtn(2), spacemouseBtn(3) );
187 connect(aViewWindow, SIGNAL( actorAdded(VTKViewer_Actor*) ),
188 this, SLOT(onActorAdded(VTKViewer_Actor*)));
189 connect(aViewWindow, SIGNAL( actorRemoved(VTKViewer_Actor*) ),
190 this, SLOT(onActorRemoved(VTKViewer_Actor*)));
196 \return trihedron size
198 double SVTK_Viewer::trihedronSize() const
200 return myTrihedronSize;
204 \return true if thihedron changes size in accordance with bounding box
206 bool SVTK_Viewer::trihedronRelative() const
208 return myTrihedronRelative;
212 Sets trihedron size and relativeness( whether thihedron changes size in accordance with bounding box)
213 \param theSize - new size
214 \param theRelative - new relativeness
216 void SVTK_Viewer::setTrihedronSize( const double theSize, const bool theRelative )
218 myTrihedronSize = theSize;
219 myTrihedronRelative = theRelative;
221 if (SUIT_ViewManager* aViewManager = getViewManager()) {
222 QVector<SUIT_ViewWindow*> aViews = aViewManager->getViews();
223 for ( uint i = 0; i < aViews.count(); i++ )
225 if ( TViewWindow* aView = dynamic_cast<TViewWindow*>(aViews.at( i )) )
226 aView->SetTrihedronSize( theSize, theRelative );
232 \return visibility status of the static trihedron
234 bool SVTK_Viewer::isStaticTrihedronVisible() const
236 return myIsStaticTrihedronVisible;
240 Sets visibility status of the static trihedron
241 \param theIsVisible - new visibility status
243 void SVTK_Viewer::setStaticTrihedronVisible( const bool theIsVisible )
245 myIsStaticTrihedronVisible = theIsVisible;
247 if (SUIT_ViewManager* aViewManager = getViewManager()) {
248 QVector<SUIT_ViewWindow*> aViews = aViewManager->getViews();
249 for ( uint i = 0; i < aViews.count(); i++ )
251 if ( TViewWindow* aView = dynamic_cast<TViewWindow*>(aViews.at( i )) )
252 aView->SetStaticTrihedronVisible( theIsVisible );
258 \return projection mode
260 int SVTK_Viewer::projectionMode() const
267 Sets projection mode: 0 - orthogonal, 1 - perspective projection
268 \param theMode - new projection mode
270 void SVTK_Viewer::setProjectionMode( const int theMode )
272 if ( myProjMode != theMode ) {
273 myProjMode = theMode;
275 if (SUIT_ViewManager* aViewManager = getViewManager()) {
276 QVector<SUIT_ViewWindow*> aViews = aViewManager->getViews();
277 for ( uint i = 0; i < aViews.count(); i++ )
279 if ( TViewWindow* aView = dynamic_cast<TViewWindow*>(aViews.at( i )) )
280 aView->SetProjectionMode( theMode );
287 \return interaction style
289 int SVTK_Viewer::interactionStyle() const
295 Sets interaction style: 0 - standard, 1 - keyboard free interaction
296 \param theStyle - new interaction style
298 void SVTK_Viewer::setInteractionStyle( const int theStyle )
302 if (SUIT_ViewManager* aViewManager = getViewManager()) {
303 QVector<SUIT_ViewWindow*> aViews = aViewManager->getViews();
304 for ( uint i = 0; i < aViews.count(); i++ )
306 if ( TViewWindow* aView = dynamic_cast<TViewWindow*>(aViews.at( i )) )
307 aView->SetInteractionStyle( theStyle );
313 \return zooming style
315 int SVTK_Viewer::zoomingStyle() const
317 return myZoomingStyle;
321 Sets zooming style: 0 - standard, 1 - advanced (at cursor)
322 \param theStyle - new zooming style
324 void SVTK_Viewer::setZoomingStyle( const int theStyle )
326 myZoomingStyle = theStyle;
328 if (SUIT_ViewManager* aViewManager = getViewManager()) {
329 QVector<SUIT_ViewWindow*> aViews = aViewManager->getViews();
330 for ( uint i = 0; i < aViews.count(); i++ )
332 if ( TViewWindow* aView = dynamic_cast<TViewWindow*>(aViews.at( i )) )
333 aView->SetZoomingStyle( theStyle );
339 \return current preselection mode
341 Preselection_Mode SVTK_Viewer::preSelectionMode() const
343 return myPreSelectionMode;
347 Sets preselection mode
348 \param theMode - new preselection mode
350 void SVTK_Viewer::setPreSelectionMode( Preselection_Mode theMode )
352 myPreSelectionMode = theMode;
354 if (SUIT_ViewManager* aViewManager = getViewManager()) {
355 QVector<SUIT_ViewWindow*> aViews = aViewManager->getViews();
356 for ( uint i = 0; i < aViews.count(); i++ )
358 if ( TViewWindow* aView = dynamic_cast<TViewWindow*>(aViews.at( i )) )
359 aView->SetPreSelectionMode( theMode );
365 \return incremental speed value
367 int SVTK_Viewer::incrementalSpeed() const
369 return myIncrementSpeed;
373 \return modification mode of the incremental speed
375 int SVTK_Viewer::incrementalSpeedMode() const
377 return myIncrementMode;
381 Set the incremental speed value and modification mode
382 \param theValue - new value
383 \param theMode - new mode: 0 - arithmetic, 1 - geometrical progression
385 void SVTK_Viewer::setIncrementalSpeed( const int theValue, const int theMode )
387 myIncrementSpeed = theValue;
388 myIncrementMode = theMode;
390 if (SUIT_ViewManager* aViewManager = getViewManager()) {
391 QVector<SUIT_ViewWindow*> aViews = aViewManager->getViews();
392 for ( uint i = 0; i < aViews.count(); i++ )
394 if ( TViewWindow* aView = dynamic_cast<TViewWindow*>(aViews.at( i )) )
395 aView->SetIncrementalSpeed( theValue, theMode );
401 \return spacemouse button assigned to the specified function
402 \param theIndex - function by number (from 1 to 3)
404 int SVTK_Viewer::spacemouseBtn( const int theIndex ) const
406 if ( theIndex < 1 || theIndex > 3 )
408 return mySpaceBtn[theIndex-1];
412 Set the spacemouse buttons
413 \param theBtn1, theBtn2, theBtn3 - new buttons
415 void SVTK_Viewer::setSpacemouseButtons( const int theBtn1, const int theBtn2, const int theBtn3 )
417 mySpaceBtn[0] = theBtn1;
418 mySpaceBtn[1] = theBtn2;
419 mySpaceBtn[2] = theBtn3;
421 if (SUIT_ViewManager* aViewManager = getViewManager()) {
422 QVector<SUIT_ViewWindow*> aViews = aViewManager->getViews();
423 for ( uint i = 0; i < aViews.count(); i++ )
425 if ( TViewWindow* aView = dynamic_cast<TViewWindow*>(aViews.at( i )) )
426 aView->SetSpacemouseButtons( theBtn1, theBtn2, theBtn3 );
432 Sets new view manager
433 \param theViewManager - new view manager
435 void SVTK_Viewer::setViewManager(SUIT_ViewManager* theViewManager)
437 SUIT_ViewModel::setViewManager(theViewManager);
439 if ( !theViewManager )
442 connect(theViewManager, SIGNAL(mousePress(SUIT_ViewWindow*, QMouseEvent*)),
443 this, SLOT(onMousePress(SUIT_ViewWindow*, QMouseEvent*)));
445 connect(theViewManager, SIGNAL(mouseMove(SUIT_ViewWindow*, QMouseEvent*)),
446 this, SLOT(onMouseMove(SUIT_ViewWindow*, QMouseEvent*)));
448 connect(theViewManager, SIGNAL(mouseRelease(SUIT_ViewWindow*, QMouseEvent*)),
449 this, SLOT(onMouseRelease(SUIT_ViewWindow*, QMouseEvent*)));
453 Builds popup for vtk viewer
455 void SVTK_Viewer::contextMenuPopup( QMenu* thePopup )
457 thePopup->addAction( VTKViewer_Viewer::tr( "MEN_DUMP_VIEW" ), this, SLOT( onDumpView() ) );
458 thePopup->addAction( VTKViewer_Viewer::tr( "MEN_CHANGE_BACKGROUND" ), this, SLOT( onChangeBackground() ) );
460 thePopup->addSeparator();
462 if(TViewWindow* aView = dynamic_cast<TViewWindow*>(myViewManager->getActiveView())){
463 //Support of several toolbars in the popup menu
464 QList<QToolBar*> lst = qFindChildren<QToolBar*>( aView );
465 QList<QToolBar*>::const_iterator it = lst.begin(), last = lst.end();
466 for( ; it!=last; it++ )
467 thePopup->addAction( (*it)->toggleViewAction() );
468 aView->RefreshDumpImage();
473 SLOT: called on mouse button press, empty implementation
475 void SVTK_Viewer::onMousePress(SUIT_ViewWindow* vw, QMouseEvent* event)
479 SLOT: called on mouse move, empty implementation
481 void SVTK_Viewer::onMouseMove(SUIT_ViewWindow* vw, QMouseEvent* event)
485 SLOT: called on mouse button release, empty implementation
487 void SVTK_Viewer::onMouseRelease(SUIT_ViewWindow* vw, QMouseEvent* event)
491 Enables/disables selection
492 \param isEnabled - new state
494 void SVTK_Viewer::enableSelection(bool isEnabled)
496 mySelectionEnabled = isEnabled;
497 //!! To be done for view windows
499 if (SUIT_ViewManager* aViewManager = getViewManager()) {
500 QVector<SUIT_ViewWindow*> aViews = aViewManager->getViews();
501 for ( uint i = 0; i < aViews.count(); i++ )
503 if ( TViewWindow* aView = dynamic_cast<TViewWindow*>(aViews.at( i )) )
504 aView->SetSelectionEnabled( isEnabled );
509 //clear current selection in the viewer
510 bool blocked = blockSignals( true );
511 if ( SUIT_ViewManager* aViewMgr = getViewManager() ) {
512 if( SVTK_ViewWindow* aViewWindow = dynamic_cast<SVTK_ViewWindow*>( aViewMgr->getActiveView() ) ){
513 if( SVTK_Selector* aSelector = aViewWindow->GetSelector() ) {
514 if(SVTK_View* aView = aViewWindow->getView()){
515 aSelector->ClearIObjects();
516 aView->onSelectionChanged();
521 blockSignals( blocked );
527 Enables/disables selection of many object
528 \param isEnabled - new state
530 void SVTK_Viewer::enableMultiselection(bool isEnable)
532 myMultiSelectionEnabled = isEnable;
533 //!! To be done for view windows
537 SLOT: called on dump view operation is activated, stores scene to raster file
539 void SVTK_Viewer::onDumpView()
541 if(SUIT_ViewWindow* aView = myViewManager->getActiveView())
546 SLOT: called if background color is to be changed changed, passes new color to view port
548 void SVTK_Viewer::onChangeBackground()
550 SVTK_ViewWindow* aView = dynamic_cast<SVTK_ViewWindow*>(myViewManager->getActiveView());
554 // get supported gradient types
555 QStringList gradList;
556 QIntList idList, txtList;
557 QString formats = backgroundData( gradList, idList, txtList );
560 Qtx::BackgroundData bgData = QtxBackgroundDialog::getBackground( aView->background(), // initial background
561 aView, // parent for dialog box
562 txtList, // allowed texture modes
563 true, // enable solid color mode
564 true, // enable gradient mode
565 false, // disable custom gradient mode
566 !txtList.isEmpty(), // enable texture mode
567 gradList, // gradient names
568 idList, // gradient identifiers
569 formats ); // image formats
571 // set chosen background data to the viewer
572 if ( bgData.isValid() )
573 aView->setBackground( bgData );
578 \param prs - presentation
580 void SVTK_Viewer::Display( const SALOME_VTKPrs* prs )
582 // try do downcast object
583 if(const SVTK_Prs* aPrs = dynamic_cast<const SVTK_Prs*>( prs )){
586 if(vtkActorCollection* anActorCollection = aPrs->GetObjects()){
587 // get SALOMEDS Study
588 // Temporarily commented to avoid awful dependecy on SALOMEDS
589 // TODO: better mechanism of storing display/erse status in a study
590 // should be provided...
591 // _PTR(Study) aStudy(getStudyDS());
592 anActorCollection->InitTraversal();
593 while(vtkActor* anActor = anActorCollection->GetNextActor()){
594 if(SALOME_Actor* anAct = SALOME_Actor::SafeDownCast(anActor)){
595 if(!anAct->ShouldBeDisplayed())
597 // Set visibility flag
598 // Temporarily commented to avoid awful dependecy on SALOMEDS
599 // TODO: better mechanism of storing display/erse status in a study
600 // should be provided...
601 //Handle(SALOME_InteractiveObject) anObj = anAct->getIO();
602 //if(!anObj.IsNull() && anObj->hasEntry() && aStudy){
603 // ToolsGUI::SetVisibility(aStudy,anObj->getEntry(),true,this);
605 // just display the object
606 QVector<SUIT_ViewWindow*> aViews = myViewManager->getViews();
607 for(int i = 0, iEnd = aViews.size(); i < iEnd; i++){
608 if(SVTK_ViewWindow* aViewWindow = dynamic_cast<SVTK_ViewWindow*>(aViews.at(i))){
609 if(SVTK_View* aView = aViewWindow->getView()){
610 aView->Display(anAct,false);
611 if(anAct->IsSetCamera()){
612 vtkRenderer* aRenderer = aView->getRenderer();
613 anAct->SetCamera( aRenderer->GetActiveCamera() );
626 \param prs - presentation
627 \param forced - removes object from view
629 void SVTK_Viewer::Erase( const SALOME_VTKPrs* prs, const bool forced )
631 // try do downcast object
632 if(const SVTK_Prs* aPrs = dynamic_cast<const SVTK_Prs*>( prs )){
635 if(vtkActorCollection* anActorCollection = aPrs->GetObjects()){
636 // get SALOMEDS Study
637 // Temporarily commented to avoid awful dependecy on SALOMEDS
638 // TODO: better mechanism of storing display/erase status in a study
639 // should be provided...
640 //_PTR(Study) aStudy(getStudyDS());
641 anActorCollection->InitTraversal();
642 while(vtkActor* anActor = anActorCollection->GetNextActor())
643 if(SALOME_Actor* anAct = SALOME_Actor::SafeDownCast(anActor)){
644 // Set visibility flag
645 // Temporarily commented to avoid awful dependecy on SALOMEDS
646 // TODO: better mechanism of storing display/erase status in a study
647 // should be provided...
648 //Handle(SALOME_InteractiveObject) anObj = anAct->getIO();
649 //if(!anObj.IsNull() && anObj->hasEntry() && aStudy){
650 // ToolsGUI::SetVisibility(aStudy,anObj->getEntry(),false,this);
652 // just display the object
653 QVector<SUIT_ViewWindow*> aViews = myViewManager->getViews();
654 for(int i = 0, iEnd = aViews.size(); i < iEnd; i++){
655 if(SVTK_ViewWindow* aViewWindow = dynamic_cast<SVTK_ViewWindow*>(aViews.at(i)))
656 if(SVTK_View* aView = aViewWindow->getView())
659 aView->Remove(anAct,false);
661 aView->Erase(anAct,forced);
670 Erase all presentations
671 \param forced - removes all objects from view
673 void SVTK_Viewer::EraseAll( const bool forced )
675 // Temporarily commented to avoid awful dependecy on SALOMEDS
676 // TODO: better mechanism of storing display/erse status in a study
677 // should be provided...
678 //_PTR(Study) aStudy(getStudyDS());
679 QVector<SUIT_ViewWindow*> aViews = myViewManager->getViews();
680 for(int i = 0, iEnd = aViews.size(); i < iEnd; i++){
681 if(SVTK_ViewWindow* aViewWindow = dynamic_cast<SVTK_ViewWindow*>(aViews.at(i)))
682 if(SVTK_View* aView = aViewWindow->getView()){
683 vtkRenderer* aRenderer = aView->getRenderer();
684 VTK::ActorCollectionCopy aCopy(aRenderer->GetActors());
685 vtkActorCollection* anActorCollection = aCopy.GetActors();
686 anActorCollection->InitTraversal();
687 while(vtkActor* anActor = anActorCollection->GetNextActor()){
688 if(SALOME_Actor* anAct = SALOME_Actor::SafeDownCast(anActor)){
689 // Set visibility flag
690 // Temporarily commented to avoid awful dependecy on SALOMEDS
691 // TODO: better mechanism of storing display/erse status in a study
692 // should be provided...
693 //Handle(SALOME_InteractiveObject) anObj = anAct->getIO();
694 //if(!anObj.IsNull() && anObj->hasEntry() && aStudy)
695 // ToolsGUI::SetVisibility(aStudy,anObj->getEntry(),false,this);
697 if(SVTK_Renderer* aRnd = aView->GetRenderer())
698 aRnd->RemoveActor(anAct);
701 anAct->SetVisibility( false );
702 // erase dependent actors
703 vtkActorCollection* aCollection = vtkActorCollection::New();
704 anAct->GetChildActors( aCollection );
705 aCollection->InitTraversal();
706 while(vtkActor* aSubAct = aCollection->GetNextActor())
707 aSubAct->SetVisibility( false );
708 aCollection->Delete();
718 Create presentation corresponding to the entry
721 SALOME_Prs* SVTK_Viewer::CreatePrs( const char* entry )
723 SVTK_Prs* prs = new SVTK_Prs();
725 if(SVTK_ViewWindow* aViewWindow = dynamic_cast<SVTK_ViewWindow*>(getViewManager()->getActiveView()))
726 if(SVTK_View* aView = aViewWindow->getView()){
727 vtkRenderer* aRenderer = aView->getRenderer();
728 VTK::ActorCollectionCopy aCopy(aRenderer->GetActors());
729 vtkActorCollection* theActors = aCopy.GetActors();
730 theActors->InitTraversal();
732 while( ( ac = theActors->GetNextActor() ) ) {
733 SALOME_Actor* anActor = SALOME_Actor::SafeDownCast( ac );
734 if ( anActor && anActor->hasIO() && !strcmp( anActor->getIO()->getEntry(), entry ) ) {
735 prs->AddObject( ac );
744 \return true if object is displayed in viewer
745 \param obj - object to be checked
747 bool SVTK_Viewer::isVisible( const Handle(SALOME_InteractiveObject)& io )
749 QVector<SUIT_ViewWindow*> aViews = myViewManager->getViews();
750 for(int i = 0, iEnd = aViews.size(); i < iEnd; i++)
751 if(SUIT_ViewWindow* aViewWindow = aViews.at(i))
752 if(TViewWindow* aViewWnd = dynamic_cast<TViewWindow*>(aViewWindow))
753 if(SVTK_View* aView = aViewWnd->getView())
754 if(!aView->isVisible( io ))
761 \Collect objects visible in viewer
762 \param theList - visible objects collection
764 void SVTK_Viewer::GetVisible( SALOME_ListIO& theList )
766 // here we collect object if it is disaplaed even one view
767 QVector<SUIT_ViewWindow*> aViews = myViewManager->getViews();
768 for(int i = 0, iEnd = aViews.size(); i < iEnd; i++)
769 if(SUIT_ViewWindow* aViewWindow = aViews.at(i))
770 if(TViewWindow* aViewWnd = dynamic_cast<TViewWindow*>(aViewWindow))
771 if(SVTK_View* aView = aViewWnd->getView())
772 aView->GetVisible( theList );
776 Updates current viewer
778 void SVTK_Viewer::Repaint()
780 // if (theUpdateTrihedron) onAdjustTrihedron();
781 QVector<SUIT_ViewWindow*> aViews = myViewManager->getViews();
782 for(int i = 0, iEnd = aViews.size(); i < iEnd; i++)
783 if(TViewWindow* aViewWindow = dynamic_cast<TViewWindow*>(aViews.at(i)))
784 if(SVTK_View* aView = aViewWindow->getView())
789 void SVTK_Viewer::onActorAdded(VTKViewer_Actor* theActor)
791 emit actorAdded((SVTK_ViewWindow*)sender(), theActor);
794 void SVTK_Viewer::onActorRemoved(VTKViewer_Actor* theActor)
796 emit actorRemoved((SVTK_ViewWindow*)sender(), theActor);