X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSVTK%2FSVTK_ViewModel.cxx;h=67519dd80b399adf7255afee1318aa34f2ed46a5;hb=d0b0c10e5649e0338079df4a53cf95044792d989;hp=d0e2556d1624648f56ca4a7ebdd1dbde58e52ab1;hpb=bb8609caf7881d966fbb88dec0a7822736da93f5;p=modules%2Fgui.git diff --git a/src/SVTK/SVTK_ViewModel.cxx b/src/SVTK/SVTK_ViewModel.cxx index d0e2556d1..67519dd80 100644 --- a/src/SVTK/SVTK_ViewModel.cxx +++ b/src/SVTK/SVTK_ViewModel.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2022 CEA/DEN, EDF R&D, OPEN CASCADE // // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS @@ -6,7 +6,7 @@ // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either -// version 2.1 of the License. +// version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -23,13 +23,13 @@ #include #include #include +#include #include #include #include //#include "SUIT_Session.h" -#include "SVTK_Selection.h" #include "SVTK_ViewModel.h" #include "SVTK_ViewWindow.h" #include "SVTK_View.h" @@ -51,29 +51,6 @@ // VSR: Uncomment below line to allow texture background support in VTK viewer #define VTK_ENABLE_TEXTURED_BACKGROUND - -// in order NOT TO link with SalomeApp, here the code returns SALOMEDS_Study. -// SalomeApp_Study::studyDS() does it as well, but -- here it is retrieved from -// SALOMEDS::StudyManager - no linkage with SalomeApp. - -// Temporarily commented to avoid awful dependecy on SALOMEDS -// TODO: better mechanism of storing display/erse status in a study -// should be provided... -//static _PTR(Study) getStudyDS() -//{ -// SALOMEDSClient_Study* aStudy = NULL; -// _PTR(StudyManager) aMgr( new SALOMEDS_StudyManager() ); - // get id of SUIT_Study, if it's a SalomeApp_Study, it will return - // id of its underlying SALOMEDS::Study -// SUIT_Application* app = SUIT_Session::session()->activeApplication(); -// if ( !app ) return _PTR(Study)(aStudy); -// SUIT_Study* stud = app->activeStudy(); -// if ( !stud ) return _PTR(Study)(aStudy); -// const int id = stud->id(); // virtual method, must return SALOMEDS_Study id - // get SALOMEDS_Study with this id from StudyMgr -// return aMgr->GetStudyByID( id ); -//} - /*! Constructor */ @@ -85,13 +62,17 @@ SVTK_Viewer::SVTK_Viewer() myIncrementSpeed = 10; myIncrementMode = 0; myProjMode = 0; + myStereoType = 0; + myAnaglyphFilter = 0; myStyle = 0; myZoomingStyle = 0; - myDynamicPreSelection = false; + mySelectionEnabled = true; + myPreSelectionMode = Standard_Preselection; mySpaceBtn[0] = 1; mySpaceBtn[1] = 2; mySpaceBtn[2] = 9; myDefaultBackground = Qtx::BackgroundData( Qt::black ); + myQuadBufferSupport = false; } /*! @@ -126,6 +107,21 @@ QString SVTK_Viewer::backgroundData( QStringList& gradList, QIntList& idList, QI return tr("BG_IMAGE_FILES"); } +/*! Get data for supported background modes: gradient types, identifiers and supported image formats */ +void SVTK_Viewer::stereoData( QStringList& typeList, QIntList& idList ) +{ + typeList << tr("ST_CRYSTALEYES") << tr("ST_REDBLUE") << + tr("ST_INTERLACED") << tr("ST_LEFT") << + tr("ST_RIGHT") << tr("ST_DRESDEN") << + tr("ST_ANAGLYPH") << tr("ST_CHECKERBOARD") << + tr("ST_SPLITVIEWPORTHORIZONTAL"); + idList << CrystalEyesType << RedBlueType << + InterlacedType << LeftType << + RightType << DresdenType << + AnaglyphType << CheckerboardType << + SplitViewPortHorizontalType; +} + //! Get background color of the viewer [obsolete] QColor SVTK_Viewer::backgroundColor() const { @@ -177,9 +173,13 @@ SUIT_ViewWindow* SVTK_Viewer::createView( SUIT_Desktop* theDesktop ) aViewWindow->SetTrihedronSize( trihedronSize(), trihedronRelative() ); aViewWindow->SetStaticTrihedronVisible( isStaticTrihedronVisible() ); aViewWindow->SetProjectionMode( projectionMode() ); + aViewWindow->SetStereoType( stereoType() ); + aViewWindow->SetAnaglyphFilter( anaglyphFilter() ); + aViewWindow->SetQuadBufferSupport( isQuadBufferSupport() ); aViewWindow->SetInteractionStyle( interactionStyle() ); aViewWindow->SetZoomingStyle( zoomingStyle() ); - aViewWindow->SetDynamicPreSelection( dynamicPreSelection() ); + aViewWindow->SetPreSelectionMode( preSelectionMode() ); + aViewWindow->SetSelectionEnabled( isSelectionEnabled() ); aViewWindow->SetIncrementalSpeed( incrementalSpeed(), incrementalSpeedMode() ); aViewWindow->SetSpacemouseButtons( spacemouseBtn(1), spacemouseBtn(2), spacemouseBtn(3) ); @@ -187,7 +187,7 @@ SUIT_ViewWindow* SVTK_Viewer::createView( SUIT_Desktop* theDesktop ) this, SLOT(onActorAdded(VTKViewer_Actor*))); connect(aViewWindow, SIGNAL( actorRemoved(VTKViewer_Actor*) ), this, SLOT(onActorRemoved(VTKViewer_Actor*))); - + return aViewWindow; } @@ -219,7 +219,7 @@ void SVTK_Viewer::setTrihedronSize( const double theSize, const bool theRelative if (SUIT_ViewManager* aViewManager = getViewManager()) { QVector aViews = aViewManager->getViews(); - for ( uint i = 0; i < aViews.count(); i++ ) + for ( int i = 0; i < aViews.count(); i++ ) { if ( TViewWindow* aView = dynamic_cast(aViews.at( i )) ) aView->SetTrihedronSize( theSize, theRelative ); @@ -245,7 +245,7 @@ void SVTK_Viewer::setStaticTrihedronVisible( const bool theIsVisible ) if (SUIT_ViewManager* aViewManager = getViewManager()) { QVector aViews = aViewManager->getViews(); - for ( uint i = 0; i < aViews.count(); i++ ) + for ( int i = 0; i < aViews.count(); i++ ) { if ( TViewWindow* aView = dynamic_cast(aViews.at( i )) ) aView->SetStaticTrihedronVisible( theIsVisible ); @@ -269,11 +269,11 @@ int SVTK_Viewer::projectionMode() const void SVTK_Viewer::setProjectionMode( const int theMode ) { if ( myProjMode != theMode ) { - myProjMode = theMode; - + if ( theMode != SVTK_ViewWindow::Stereo ) + myProjMode = theMode; if (SUIT_ViewManager* aViewManager = getViewManager()) { QVector aViews = aViewManager->getViews(); - for ( uint i = 0; i < aViews.count(); i++ ) + for ( int i = 0; i < aViews.count(); i++ ) { if ( TViewWindow* aView = dynamic_cast(aViews.at( i )) ) aView->SetProjectionMode( theMode ); @@ -282,6 +282,89 @@ void SVTK_Viewer::setProjectionMode( const int theMode ) } } +/*! + \return stereo type +*/ +int SVTK_Viewer::stereoType() const +{ + return myStereoType; +} + +/*! + Sets stereo type + \param theType - new stereo type +*/ +void SVTK_Viewer::setStereoType( const int theType ) +{ + if ( myStereoType != theType ) { + myStereoType = theType; + + if (SUIT_ViewManager* aViewManager = getViewManager()) { + QVector aViews = aViewManager->getViews(); + for ( int i = 0; i < aViews.count(); i++ ) + { + if ( TViewWindow* aView = dynamic_cast(aViews.at( i )) ) + aView->SetStereoType( theType ); + } + } + } +} + +/*! + \return anaglyph filter +*/ +int SVTK_Viewer::anaglyphFilter() const +{ + return myAnaglyphFilter; +} + +/*! + Sets anaglyph filter + \param theFilter - new anaglyph filter +*/ +void SVTK_Viewer::setAnaglyphFilter( const int theFilter ) +{ + if ( myAnaglyphFilter != theFilter ) { + myAnaglyphFilter = theFilter; + + if (SUIT_ViewManager* aViewManager = getViewManager()) { + QVector aViews = aViewManager->getViews(); + for ( int i = 0; i < aViews.count(); i++ ) + { + if ( TViewWindow* aView = dynamic_cast(aViews.at( i )) ) + aView->SetAnaglyphFilter( theFilter ); + } + } + } +} + +/*! + \return support quad-buffered stereo +*/ +bool SVTK_Viewer::isQuadBufferSupport() const +{ + return myQuadBufferSupport; +} + +/*! + Set support quad-buffered stereo + \param theEnable - enable/disable support quad-buffered stereo +*/ +void SVTK_Viewer::setQuadBufferSupport( const bool theEnable ) +{ + if ( myQuadBufferSupport != theEnable ) { + myQuadBufferSupport = theEnable; + + if (SUIT_ViewManager* aViewManager = getViewManager()) { + QVector aViews = aViewManager->getViews(); + for ( int i = 0; i < aViews.count(); i++ ) + { + if ( TViewWindow* aView = dynamic_cast(aViews.at( i )) ) + aView->SetQuadBufferSupport( theEnable ); + } + } + } +} /*! \return interaction style */ @@ -300,7 +383,7 @@ void SVTK_Viewer::setInteractionStyle( const int theStyle ) if (SUIT_ViewManager* aViewManager = getViewManager()) { QVector aViews = aViewManager->getViews(); - for ( uint i = 0; i < aViews.count(); i++ ) + for ( int i = 0; i < aViews.count(); i++ ) { if ( TViewWindow* aView = dynamic_cast(aViews.at( i )) ) aView->SetInteractionStyle( theStyle ); @@ -326,7 +409,7 @@ void SVTK_Viewer::setZoomingStyle( const int theStyle ) if (SUIT_ViewManager* aViewManager = getViewManager()) { QVector aViews = aViewManager->getViews(); - for ( uint i = 0; i < aViews.count(); i++ ) + for ( int i = 0; i < aViews.count(); i++ ) { if ( TViewWindow* aView = dynamic_cast(aViews.at( i )) ) aView->SetZoomingStyle( theStyle ); @@ -335,27 +418,27 @@ void SVTK_Viewer::setZoomingStyle( const int theStyle ) } /*! - \return dynamic preselection + \return current preselection mode */ -bool SVTK_Viewer::dynamicPreSelection() const +Preselection_Mode SVTK_Viewer::preSelectionMode() const { - return myDynamicPreSelection; + return myPreSelectionMode; } /*! - Sets dynamic preselection - \param theMode - new dynamic preselection mode + Sets preselection mode + \param theMode - new preselection mode */ -void SVTK_Viewer::setDynamicPreSelection( const bool theMode ) +void SVTK_Viewer::setPreSelectionMode( Preselection_Mode theMode ) { - myDynamicPreSelection = theMode; + myPreSelectionMode = theMode; if (SUIT_ViewManager* aViewManager = getViewManager()) { QVector aViews = aViewManager->getViews(); - for ( uint i = 0; i < aViews.count(); i++ ) + for ( int i = 0; i < aViews.count(); i++ ) { if ( TViewWindow* aView = dynamic_cast(aViews.at( i )) ) - aView->SetDynamicPreSelection( theMode ); + aView->SetPreSelectionMode( theMode ); } } } @@ -388,7 +471,7 @@ void SVTK_Viewer::setIncrementalSpeed( const int theValue, const int theMode ) if (SUIT_ViewManager* aViewManager = getViewManager()) { QVector aViews = aViewManager->getViews(); - for ( uint i = 0; i < aViews.count(); i++ ) + for ( int i = 0; i < aViews.count(); i++ ) { if ( TViewWindow* aView = dynamic_cast(aViews.at( i )) ) aView->SetIncrementalSpeed( theValue, theMode ); @@ -419,7 +502,7 @@ void SVTK_Viewer::setSpacemouseButtons( const int theBtn1, const int theBtn2, co if (SUIT_ViewManager* aViewManager = getViewManager()) { QVector aViews = aViewManager->getViews(); - for ( uint i = 0; i < aViews.count(); i++ ) + for ( int i = 0; i < aViews.count(); i++ ) { if ( TViewWindow* aView = dynamic_cast(aViews.at( i )) ) aView->SetSpacemouseButtons( theBtn1, theBtn2, theBtn3 ); @@ -446,6 +529,9 @@ void SVTK_Viewer::setViewManager(SUIT_ViewManager* theViewManager) connect(theViewManager, SIGNAL(mouseRelease(SUIT_ViewWindow*, QMouseEvent*)), this, SLOT(onMouseRelease(SUIT_ViewWindow*, QMouseEvent*))); + + connect(theViewManager, SIGNAL(viewCreated(SUIT_ViewWindow*)), + this, SLOT(onViewCreated(SUIT_ViewWindow*))); } /*! @@ -460,7 +546,7 @@ void SVTK_Viewer::contextMenuPopup( QMenu* thePopup ) if(TViewWindow* aView = dynamic_cast(myViewManager->getActiveView())){ //Support of several toolbars in the popup menu - QList lst = qFindChildren( aView ); + QList lst = aView->findChildren(); QList::const_iterator it = lst.begin(), last = lst.end(); for( ; it!=last; it++ ) thePopup->addAction( (*it)->toggleViewAction() ); @@ -471,19 +557,19 @@ void SVTK_Viewer::contextMenuPopup( QMenu* thePopup ) /*! SLOT: called on mouse button press, empty implementation */ -void SVTK_Viewer::onMousePress(SUIT_ViewWindow* vw, QMouseEvent* event) +void SVTK_Viewer::onMousePress(SUIT_ViewWindow* /*vw*/, QMouseEvent* /*event*/) {} /*! SLOT: called on mouse move, empty implementation */ -void SVTK_Viewer::onMouseMove(SUIT_ViewWindow* vw, QMouseEvent* event) +void SVTK_Viewer::onMouseMove(SUIT_ViewWindow* /*vw*/, QMouseEvent* /*event*/) {} /*! SLOT: called on mouse button release, empty implementation */ -void SVTK_Viewer::onMouseRelease(SUIT_ViewWindow* vw, QMouseEvent* event) +void SVTK_Viewer::onMouseRelease(SUIT_ViewWindow* /*vw*/, QMouseEvent* /*event*/) {} /*! @@ -494,6 +580,32 @@ void SVTK_Viewer::enableSelection(bool isEnabled) { mySelectionEnabled = isEnabled; //!! To be done for view windows + + if (SUIT_ViewManager* aViewManager = getViewManager()) { + QVector aViews = aViewManager->getViews(); + for ( int i = 0; i < aViews.count(); i++ ) + { + if ( TViewWindow* aView = dynamic_cast(aViews.at( i )) ) + aView->SetSelectionEnabled( isEnabled ); + } + } + + if(!isEnabled) { + //clear current selection in the viewer + bool blocked = blockSignals( true ); + if ( SUIT_ViewManager* aViewMgr = getViewManager() ) { + if( SVTK_ViewWindow* aViewWindow = dynamic_cast( aViewMgr->getActiveView() ) ){ + if( SVTK_Selector* aSelector = aViewWindow->GetSelector() ) { + if(SVTK_View* aView = aViewWindow->getView()){ + aSelector->ClearIObjects(); + aView->onSelectionChanged(); + } + } + } + } + blockSignals( blocked ); + } + } /*! @@ -557,11 +669,6 @@ void SVTK_Viewer::Display( const SALOME_VTKPrs* prs ) if(aPrs->IsNull()) return; if(vtkActorCollection* anActorCollection = aPrs->GetObjects()){ - // get SALOMEDS Study - // Temporarily commented to avoid awful dependecy on SALOMEDS - // TODO: better mechanism of storing display/erse status in a study - // should be provided... - // _PTR(Study) aStudy(getStudyDS()); anActorCollection->InitTraversal(); while(vtkActor* anActor = anActorCollection->GetNextActor()){ if(SALOME_Actor* anAct = SALOME_Actor::SafeDownCast(anActor)){ @@ -572,8 +679,8 @@ void SVTK_Viewer::Display( const SALOME_VTKPrs* prs ) // TODO: better mechanism of storing display/erse status in a study // should be provided... //Handle(SALOME_InteractiveObject) anObj = anAct->getIO(); - //if(!anObj.IsNull() && anObj->hasEntry() && aStudy){ - // ToolsGUI::SetVisibility(aStudy,anObj->getEntry(),true,this); + //if(!anObj.IsNull() && anObj->hasEntry()){ + // ToolsGUI::SetVisibility(anObj->getEntry(),true,this); //} // just display the object QVector aViews = myViewManager->getViews(); @@ -606,11 +713,6 @@ void SVTK_Viewer::Erase( const SALOME_VTKPrs* prs, const bool forced ) if(aPrs->IsNull()) return; if(vtkActorCollection* anActorCollection = aPrs->GetObjects()){ - // get SALOMEDS Study - // Temporarily commented to avoid awful dependecy on SALOMEDS - // TODO: better mechanism of storing display/erase status in a study - // should be provided... - //_PTR(Study) aStudy(getStudyDS()); anActorCollection->InitTraversal(); while(vtkActor* anActor = anActorCollection->GetNextActor()) if(SALOME_Actor* anAct = SALOME_Actor::SafeDownCast(anActor)){ @@ -619,8 +721,8 @@ void SVTK_Viewer::Erase( const SALOME_VTKPrs* prs, const bool forced ) // TODO: better mechanism of storing display/erase status in a study // should be provided... //Handle(SALOME_InteractiveObject) anObj = anAct->getIO(); - //if(!anObj.IsNull() && anObj->hasEntry() && aStudy){ - // ToolsGUI::SetVisibility(aStudy,anObj->getEntry(),false,this); + //if(!anObj.IsNull() && anObj->hasEntry()){ + // ToolsGUI::SetVisibility(anObj->getEntry(),false,this); //} // just display the object QVector aViews = myViewManager->getViews(); @@ -643,12 +745,8 @@ void SVTK_Viewer::Erase( const SALOME_VTKPrs* prs, const bool forced ) Erase all presentations \param forced - removes all objects from view */ -void SVTK_Viewer::EraseAll( const bool forced ) +void SVTK_Viewer::EraseAll( SALOME_Displayer* d, const bool forced ) { - // Temporarily commented to avoid awful dependecy on SALOMEDS - // TODO: better mechanism of storing display/erse status in a study - // should be provided... - //_PTR(Study) aStudy(getStudyDS()); QVector aViews = myViewManager->getViews(); for(int i = 0, iEnd = aViews.size(); i < iEnd; i++){ if(SVTK_ViewWindow* aViewWindow = dynamic_cast(aViews.at(i))) @@ -664,12 +762,12 @@ void SVTK_Viewer::EraseAll( const bool forced ) // TODO: better mechanism of storing display/erse status in a study // should be provided... //Handle(SALOME_InteractiveObject) anObj = anAct->getIO(); - //if(!anObj.IsNull() && anObj->hasEntry() && aStudy) - // ToolsGUI::SetVisibility(aStudy,anObj->getEntry(),false,this); - if(forced) + //if(!anObj.IsNull() && anObj->hasEntry()) + // ToolsGUI::SetVisibility(anObj->getEntry(),false,this); + if(forced){ if(SVTK_Renderer* aRnd = aView->GetRenderer()) aRnd->RemoveActor(anAct); - else{ + }else{ // just erase actor anAct->SetVisibility( false ); // erase dependent actors @@ -684,6 +782,9 @@ void SVTK_Viewer::EraseAll( const bool forced ) } } } + + SALOME_View::EraseAll( d, forced ); + Repaint(); } @@ -693,7 +794,7 @@ void SVTK_Viewer::EraseAll( const bool forced ) */ SALOME_Prs* SVTK_Viewer::CreatePrs( const char* entry ) { - SVTK_Prs* prs = new SVTK_Prs(); + SVTK_Prs* prs = new SVTK_Prs( entry ); if ( entry ) { if(SVTK_ViewWindow* aViewWindow = dynamic_cast(getViewManager()->getActiveView())) if(SVTK_View* aView = aViewWindow->getView()){ @@ -768,3 +869,10 @@ void SVTK_Viewer::onActorRemoved(VTKViewer_Actor* theActor) { emit actorRemoved((SVTK_ViewWindow*)sender(), theActor); } + +void SVTK_Viewer::onViewCreated( SUIT_ViewWindow* view) { +#ifdef VGL_WORKAROUND + if ( SVTK_ViewWindow* svw = dynamic_cast( view ) ) + QTimer::singleShot(500, [svw] () { svw->Repaint(); } ); +#endif +}