X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSOCC%2FSOCC_ViewModel.cxx;h=aa9ed64b2ae762a1e6ff5c917690352d20bc55fa;hb=331294345d3e1716fbf79ae25a2851011729be79;hp=b78328d7f40c2ea687c5966f5bbe4aab3376f84c;hpb=4e9a2ea0d9a4b6c9a74deac8b84173fa7221b046;p=modules%2Fgui.git diff --git a/src/SOCC/SOCC_ViewModel.cxx b/src/SOCC/SOCC_ViewModel.cxx index b78328d7f..aa9ed64b2 100755 --- a/src/SOCC/SOCC_ViewModel.cxx +++ b/src/SOCC/SOCC_ViewModel.cxx @@ -1,61 +1,76 @@ +// Copyright (C) 2007-2016 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 +// +// 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, 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 +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + #include "SOCC_ViewModel.h" #include "SOCC_Prs.h" #include "SOCC_ViewWindow.h" #include "SUIT_Session.h" -#include "SUIT_Application.h" +#include "SUIT_ResourceMgr.h" +//#include "SUIT_Application.h" -#include "ToolsGUI.h" +//#include "ToolsGUI.h" -#include -#include CORBA_CLIENT_HEADER(SALOMEDS) +// Temporarily commented to avoid awful dependecy on SALOMEDS +// TODO: better mechanism of storing display/erse status in a study +// should be provided... +//#include +//#include CORBA_CLIENT_HEADER(SALOMEDS) #include -#include #include #include - -#include -#include -#include -#include - -#include "SALOMEDSClient.hxx" -#include "SALOMEDS_StudyManager.hxx" +#include +#include #include +#include -// 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. - -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 ); -} +#include +/*! + Constructor + \param DisplayTrihedron - is trihedron displayed +*/ SOCC_Viewer::SOCC_Viewer( bool DisplayTrihedron ) : OCCViewer_Viewer( DisplayTrihedron ) { } +/*! + Destructor +*/ SOCC_Viewer::~SOCC_Viewer() { } +/*! + Hilights/unhilights object in viewer + \param obj - object to be updated + \param hilight - if it is true, object will be hilighted, otherwise it will be unhilighted + \param update - update current viewer +*/ bool SOCC_Viewer::highlight( const Handle(SALOME_InteractiveObject)& obj, bool hilight, bool upd ) { @@ -76,7 +91,7 @@ bool SOCC_Viewer::highlight( const Handle(SALOME_InteractiveObject)& obj, { if ( !isInLocal ) OCCViewer_Viewer::highlight( ite.Value(), hilight, false ); - // highlight subshapes only when local selection is active + // highlight sub-shapes only when local selection is active else { /*if ( ite.Value()->IsKind( STANDARD_TYPE( SALOME_AISShape ) ) ) @@ -97,18 +112,16 @@ bool SOCC_Viewer::highlight( const Handle(SALOME_InteractiveObject)& obj, return false; } +/*! + \return true if object is in viewer or in collector + \param obj - object to be checked + \param onlyInViewer - search object only in viewer (so object must be displayed) +*/ bool SOCC_Viewer::isInViewer( const Handle(SALOME_InteractiveObject)& obj, bool onlyInViewer ) { AIS_ListOfInteractive List; getAISContext()->DisplayedObjects(List); - - if( !onlyInViewer ) { - AIS_ListOfInteractive List1; - getAISContext()->ObjectsInCollector(List1); - List.Append(List1); - } - AIS_ListIteratorOfListOfInteractive ite(List); for ( ; ite.More(); ite.Next() ) { @@ -121,84 +134,113 @@ bool SOCC_Viewer::isInViewer( const Handle(SALOME_InteractiveObject)& obj, return false; } +/*! + \return true if object is displayed in viewer + \param obj - object to be checked +*/ bool SOCC_Viewer::isVisible( const Handle(SALOME_InteractiveObject)& obj ) { - AIS_ListOfInteractive List; - getAISContext()->DisplayedObjects( List ); - AIS_ListIteratorOfListOfInteractive ite( List ); - for ( ; ite.More(); ite.Next() ) - { - Handle(SALOME_InteractiveObject) anObj = - Handle(SALOME_InteractiveObject)::DownCast( ite.Value()->GetOwner() ); - - if ( !anObj.IsNull() && anObj->hasEntry() && anObj->isSame( obj ) ) - return getAISContext()->IsDisplayed( ite.Value() ); + std::map< std::string , std::vector >::iterator it=entry2aisobjects.find(obj->getEntry()); + if(it != entry2aisobjects.end()) + { + // get context + Handle (AIS_InteractiveContext) ic = getAISContext(); + std::vector& List = it->second; + for( unsigned int ind = 0; ind < List.size(); ind++ ) + { + Handle(AIS_InteractiveObject) anAIS=List[ind]; + if(ic->IsDisplayed(anAIS)) + return true; + } } return false; } +/*! + Sets color of object + \param obj - object to be updated + \param color - new color + \param update - update current viewer +*/ void SOCC_Viewer::setColor( const Handle(SALOME_InteractiveObject)& obj, const QColor& color, bool update ) { - AIS_ListOfInteractive List; - getAISContext()->DisplayedObjects(List); - - AIS_ListIteratorOfListOfInteractive ite(List); - for ( ; ite.More(); ite.Next() ) - { - Handle(SALOME_InteractiveObject) anObj = - Handle(SALOME_InteractiveObject)::DownCast( ite.Value()->GetOwner() ); + if(obj.IsNull() || !obj->hasEntry() ) + return; - if ( !anObj.IsNull() && anObj->hasEntry() && anObj->isSame( obj ) ) + if(entry2aisobjects.count(obj->getEntry())>0) { - OCCViewer_Viewer::setColor( ite.Value(), color, update ); - return; + // get context + Handle (AIS_InteractiveContext) ic = getAISContext(); + std::vector& List = entry2aisobjects[obj->getEntry()]; + for( unsigned int ind = 0; ind < List.size(); ind++ ) + { + Handle(AIS_InteractiveObject) anAIS=List[ind]; + if( !anAIS.IsNull() && ic->IsDisplayed(anAIS)) + OCCViewer_Viewer::setColor( anAIS, color, update ); + } } - } } +/*! + Changes display mode of object + \param obj - object to be processed + \param mode - new display mode + \param update - update current viewer +*/ void SOCC_Viewer::switchRepresentation( const Handle(SALOME_InteractiveObject)& obj, int mode, bool update ) { - AIS_ListOfInteractive List; - getAISContext()->DisplayedObjects(List); - - AIS_ListIteratorOfListOfInteractive ite(List); - for ( ; ite.More(); ite.Next() ) - { - Handle(SALOME_InteractiveObject) anObj = - Handle(SALOME_InteractiveObject)::DownCast( ite.Value()->GetOwner() ); + if(obj.IsNull() || !obj->hasEntry() ) + return; - if ( !anObj.IsNull() && anObj->hasEntry() && anObj->isSame( obj ) ) + if(entry2aisobjects.count(obj->getEntry())>0) { - OCCViewer_Viewer::switchRepresentation( ite.Value(), mode, update ); - return; + // get context + Handle (AIS_InteractiveContext) ic = getAISContext(); + std::vector& List = entry2aisobjects[obj->getEntry()]; + for( unsigned int ind = 0; ind < List.size(); ind++ ) + { + Handle(AIS_InteractiveObject) anAIS=List[ind]; + if( !anAIS.IsNull() && ic->IsDisplayed(anAIS)) + OCCViewer_Viewer::switchRepresentation( anAIS, mode, update ); + } } - } } +/*! + Changes transparency of object + \param obj - object to be processed + \param trans - new transparency + \param update - update current viewer +*/ void SOCC_Viewer::setTransparency( const Handle(SALOME_InteractiveObject)& obj, float trans, bool update ) { - AIS_ListOfInteractive List; - getAISContext()->DisplayedObjects( List ); - - AIS_ListIteratorOfListOfInteractive ite( List ); - for ( ; ite.More(); ite.Next() ) - { - Handle(SALOME_InteractiveObject) anObj = - Handle(SALOME_InteractiveObject)::DownCast( ite.Value()->GetOwner() ); + if(obj.IsNull() || !obj->hasEntry() ) + return; - if ( !anObj.IsNull() && anObj->hasEntry() && anObj->isSame( obj ) ) + if(entry2aisobjects.count(obj->getEntry())>0) { - OCCViewer_Viewer::setTransparency( ite.Value(), trans, update ); - return; + // get context + Handle (AIS_InteractiveContext) ic = getAISContext(); + std::vector& List = entry2aisobjects[obj->getEntry()]; + for( unsigned int ind = 0; ind < List.size(); ind++ ) + { + Handle(AIS_InteractiveObject) anAIS=List[ind]; + if( !anAIS.IsNull() && ic->IsDisplayed(anAIS)) + OCCViewer_Viewer::setTransparency( anAIS, trans, update ); + } } - } } +/*! + Changes name of object + \param obj - object to be renamed + \param name - new name +*/ void SOCC_Viewer::rename( const Handle(SALOME_InteractiveObject)& obj, const QString& name ) { @@ -217,7 +259,7 @@ void SOCC_Viewer::rename( const Handle(SALOME_InteractiveObject)& obj, Handle(SALOME_InteractiveObject) IO = aSh->getIO(); if ( IO->isSame( obj ) ) { - aSh->setName( (char*)name.latin1() ); + aSh->setName( name.toUtf8().data() ); break; } } @@ -232,10 +274,11 @@ void SOCC_Viewer::rename( const Handle(SALOME_InteractiveObject)& obj, } } -//======================================================================= -// name : Display -// Purpose : Display presentation -//======================================================================= + +/*! + Display presentation + \param prs - presentation +*/ void SOCC_Viewer::Display( const SALOME_OCCPrs* prs ) { // try do downcast object @@ -243,19 +286,9 @@ void SOCC_Viewer::Display( const SALOME_OCCPrs* prs ) if ( !anOCCPrs || anOCCPrs->IsNull() ) return; - // get SALOMEDS Study - _PTR(Study) study(getStudyDS()); - // get context Handle (AIS_InteractiveContext) ic = getAISContext(); - // get all displayed objects - AIS_ListOfInteractive List; - ic->DisplayedObjects( List ); - // get objects in the collector - AIS_ListOfInteractive ListCollector; - ic->ObjectsInCollector( ListCollector ); - // get objects to be displayed AIS_ListOfInteractive anAISObjects; anOCCPrs->GetObjects( anAISObjects ); @@ -267,87 +300,84 @@ void SOCC_Viewer::Display( const SALOME_OCCPrs* prs ) if ( !anAIS.IsNull() ) { // try to find presentation in the viewer - bool bDisplayed = false; - AIS_ListIteratorOfListOfInteractive ite( List ); - for ( ; ite.More(); ite.Next() ) - { - // compare presentations by handles - // if the object is already displayed - nothing to do more - if ( ite.Value() == anAIS ) - { - // Deactivate object if necessary - if ( !anOCCPrs->ToActivate() ) - ic->Deactivate( anAIS ); - bDisplayed = true; - break; - } - } - - if ( bDisplayed ) - continue; - // then try to find presentation in the collector - bDisplayed = false; - ite.Initialize( ListCollector ); - for ( ; ite.More(); ite.Next() ) - { - // compare presentations by handles - // if the object is in collector - display it - if ( ite.Value() == anAIS ) + // if the object is already displayed - nothing to do more + if(ic->IsDisplayed(anAIS)) { - ic->DisplayFromCollector( anAIS, false ); - // Deactivate object if necessary if ( !anOCCPrs->ToActivate() ) ic->Deactivate( anAIS ); - bDisplayed = true; - - // Set visibility flag - Handle(SALOME_InteractiveObject) anObj = - Handle(SALOME_InteractiveObject)::DownCast( anAIS->GetOwner() ); - if ( !anObj.IsNull() && anObj->hasEntry() ) - { - if ( study ) - ToolsGUI::SetVisibility( study, anObj->getEntry(), true, this ); - } - - break; + continue; } - } - if ( bDisplayed ) - continue; // if object is not displayed and not found in the collector - display it if ( anAIS->IsKind( STANDARD_TYPE(AIS_Trihedron) ) ) { Handle(AIS_Trihedron) aTrh = Handle(AIS_Trihedron)::DownCast( anAIS ); double aNewSize = 100, aSize = 100; - getTrihedronSize( aNewSize, aSize ); + computeTrihedronSize( aNewSize, aSize ); aTrh->SetSize( aTrh == getTrihedron() ? aNewSize : 0.5 * aNewSize ); } ic->Display( anAIS, false ); - - // Set visibility flag - Handle(SALOME_InteractiveObject) anObj = - Handle(SALOME_InteractiveObject)::DownCast( anAIS->GetOwner() ); - if ( !anObj.IsNull() && anObj->hasEntry() ) + Handle(SALOME_AISShape) aSh = Handle(SALOME_AISShape)::DownCast (anAIS); + if (!aSh.IsNull()) { - if ( study ) - ToolsGUI::SetVisibility( study, anObj->getEntry(), true, this ); + aSh->SetClippable (prs->IsClippable()); + applyExistingClipPlanesToObject (anAIS); + bool top = (aSh->isTopLevel() && aSh->switchTopLevel()); + ic->SetZLayer( aSh, top ? getTopLayerId() : 0 ); + if(!aSh->toActivate()) + { + ic->Deactivate( aSh ); + } } + //Register anAIS (if it has an entry) in entry2aisobjects map + Handle(SALOME_InteractiveObject) anObj = Handle(SALOME_InteractiveObject)::DownCast( anAIS->GetOwner() ); + if ( !anObj.IsNull() && anObj->hasEntry()) + { + std::vector& List = entry2aisobjects[anObj->getEntry()]; + int found=0; + for ( unsigned int ind = 0; ind < List.size(); ind++ ) + { + if(List[ind] == anAIS) + { + found=1; + break; + } + } + if(!found) + { + List.push_back(anAIS); + } + } + + // Set visibility flag + // Temporarily commented to avoid awful dependecy on SALOMEDS + // TODO: better mechanism of storing display/erse status in a study + // should be provided... + //Handle(SALOME_InteractiveObject) anObj = + // Handle(SALOME_InteractiveObject)::DownCast( anAIS->GetOwner() ); + //if ( !anObj.IsNull() && anObj->hasEntry() ) + //{ + // ToolsGUI::SetVisibility( anObj->getEntry(), true, this ); + //} + // Deactivate object if necessary if ( !anOCCPrs->ToActivate() ) ic->Deactivate( anAIS ); } } + updateTrihedron(); } -//======================================================================= -// name : Erase -// Purpose : Erase presentation -//======================================================================= + +/*! + Erase presentation + \param prs - presentation + \param forced - removes object from context +*/ void SOCC_Viewer::Erase( const SALOME_OCCPrs* prs, const bool forced ) { // try do downcast object @@ -355,9 +385,6 @@ void SOCC_Viewer::Erase( const SALOME_OCCPrs* prs, const bool forced ) if ( !anOCCPrs || anOCCPrs->IsNull() ) return; - // get SALOMEDS Study - _PTR(Study) study(getStudyDS()); - // get context Handle(AIS_InteractiveContext) ic = getAISContext(); @@ -370,32 +397,32 @@ void SOCC_Viewer::Erase( const SALOME_OCCPrs* prs, const bool forced ) Handle(AIS_InteractiveObject) anAIS = aIter.Value(); if ( !anAIS.IsNull() ) { // erase the object from context : move it to collector - ic->Erase( anAIS, false, forced ? false : true ); - + ic->Erase( anAIS, false ); // Set visibility flag if necessary - if ( !forced ) - { - Handle(SALOME_InteractiveObject) anObj = - Handle(SALOME_InteractiveObject)::DownCast( anAIS->GetOwner() ); - if ( !anObj.IsNull() && anObj->hasEntry() ) - { - if ( study ) - ToolsGUI::SetVisibility( study, anObj->getEntry(), true, this ); - } - } + // Temporarily commented to avoid awful dependecy on SALOMEDS + // TODO: better mechanism of storing display/erse status in a study + // should be provided... + //if ( !forced ) + //{ + // Handle(SALOME_InteractiveObject) anObj = + // Handle(SALOME_InteractiveObject)::DownCast( anAIS->GetOwner() ); + // if ( !anObj.IsNull() && anObj->hasEntry() ) + // { + // ToolsGUI::SetVisibility( anObj->getEntry(), true, this ); + // } + //} } } + updateTrihedron(); } -//======================================================================= -// name : EraseAll -// Purpose : Erase all presentations -//======================================================================= -void SOCC_Viewer::EraseAll( const bool forced ) -{ - // get SALOMEDS Study - _PTR(Study) study(getStudyDS()); +/*! + Erase all presentations + \param forced - removes all objects from context +*/ +void SOCC_Viewer::EraseAll( SALOME_Displayer* d, const bool forced ) +{ // get context Handle(AIS_InteractiveContext) ic = getAISContext(); @@ -407,70 +434,66 @@ void SOCC_Viewer::EraseAll( const bool forced ) ic->DisplayedObjects( aList ); AIS_ListIteratorOfListOfInteractive anIter( aList ); for ( ; anIter.More(); anIter.Next() ) { - if ( isTrihedronDisplayed && anIter.Value()->DynamicType() == STANDARD_TYPE( AIS_Trihedron ) ) + if ( (isTrihedronDisplayed && anIter.Value()->DynamicType() == STANDARD_TYPE( AIS_Trihedron ) ) ) continue; // erase an object Handle(AIS_InteractiveObject) anIO = anIter.Value(); - ic->Erase( anIO, false, forced ? false : true ); + ic->Erase( anIO, false ); // Set visibility flag if necessary - if ( !forced ) { - Handle(SALOME_InteractiveObject) anObj = - Handle(SALOME_InteractiveObject)::DownCast( anIO->GetOwner() ); - - if ( !anObj.IsNull() && anObj->hasEntry() ) { - if ( study ) - ToolsGUI::SetVisibility( study, anObj->getEntry(), true, this ); - } - } + // Temporarily commented to avoid awful dependecy on SALOMEDS + // TODO: better mechanism of storing display/erse status in a study + // should be provided... + //if ( !forced ) { + // Handle(SALOME_InteractiveObject) anObj = + // Handle(SALOME_InteractiveObject)::DownCast( anIO->GetOwner() ); + + // if ( !anObj.IsNull() && anObj->hasEntry() ) { + // ToolsGUI::SetVisibility( anObj->getEntry(), true, this ); + // } + //} } - // display trihedron if necessary - if ( isTrihedronDisplayed ) - getAISContext()->Display( getTrihedron() ); - else - Repaint(); + SALOME_View::EraseAll( d, forced ); + + Repaint(); + updateTrihedron(); } -//======================================================================= -// name : CreatePrs -// Purpose : Create presentation corresponding to the entry -//======================================================================= +/*! + Create presentation corresponding to the entry + \param entry - entry +*/ SALOME_Prs* SOCC_Viewer::CreatePrs( const char* entry ) { - SOCC_Prs* prs = new SOCC_Prs(); + SOCC_Prs* prs = new SOCC_Prs(entry); if ( entry ) { - // get context - Handle(AIS_InteractiveContext) ic = getAISContext(); - - // get displayed objects - AIS_ListOfInteractive List; - ic->DisplayedObjects( List ); - // get objects in the collector - AIS_ListOfInteractive ListCollector; - ic->ObjectsInCollector( ListCollector ); - List.Append( ListCollector ); - - AIS_ListIteratorOfListOfInteractive ite( List ); - for ( ; ite.More(); ite.Next() ) - { - Handle(SALOME_InteractiveObject) anObj = - Handle(SALOME_InteractiveObject)::DownCast( ite.Value()->GetOwner() ); - - if ( !anObj.IsNull() && anObj->hasEntry() && strcmp( anObj->getEntry(), entry ) == 0 ) - prs->AddObject( ite.Value() ); - } + if(entry2aisobjects.count(entry)>0) + { + //ais object exists + std::vector List = entry2aisobjects[entry]; + // get context + Handle(AIS_InteractiveContext) ic = getAISContext(); + //add all ais + for ( unsigned int ind = 0; ind < List.size(); ind++ ) + { + Handle(AIS_InteractiveObject) anAIS=List[ind]; + if(ic->IsDisplayed(anAIS)) + { + prs->AddObject( anAIS ); + } + } + } } return prs; } -//======================================================================= -// name : LocalSelection -// Purpose : Activates selection of sub shapes -//======================================================================= -void SOCC_Viewer::LocalSelection( const SALOME_OCCPrs* thePrs, const int theMode ) +/*! + Activates selection of sub-shapes +*/ +void SOCC_Viewer::LocalSelection( const SALOME_OCCPrs* thePrs, const std::list modes ) { Handle(AIS_InteractiveContext) ic = getAISContext(); @@ -482,7 +505,7 @@ void SOCC_Viewer::LocalSelection( const SALOME_OCCPrs* thePrs, const int theMode bool allObjects = thePrs == 0 || thePrs->IsNull(); if ( !ic->HasOpenedContext() ) { ic->ClearCurrents( false ); - ic->OpenLocalContext( allObjects, true, true ); + ic->OpenLocalContext( Standard_False, Standard_True, Standard_True ); } AIS_ListOfInteractive anObjs; @@ -492,30 +515,47 @@ void SOCC_Viewer::LocalSelection( const SALOME_OCCPrs* thePrs, const int theMode else anOCCPrs->GetObjects( anObjs ); + std::list sel_modes; + for ( int i = TopAbs_COMPOUND; i < TopAbs_SHAPE; i++ ) + if ( std::find(modes.begin(), modes.end(), (int)TopAbs_SHAPE) != modes.end() || std::find(modes.begin(), modes.end(), i) != modes.end()) + sel_modes.push_back(i); + // Activate selection of objects from prs AIS_ListIteratorOfListOfInteractive aIter( anObjs ); for ( ; aIter.More(); aIter.Next() ) { Handle(AIS_InteractiveObject) anAIS = aIter.Value(); if ( !anAIS.IsNull() ) { + std::list::const_iterator it; if ( anAIS->IsKind( STANDARD_TYPE( AIS_Shape ) ) ) { ic->Load( anAIS, -1, false ); - ic->Activate( anAIS, AIS_Shape::SelectionMode( (TopAbs_ShapeEnum)theMode ) ); + for( it = sel_modes.begin(); it != sel_modes.end(); ++it ) + ic->Activate( anAIS, AIS_Shape::SelectionMode( (TopAbs_ShapeEnum)*it ) ); } else if ( anAIS->DynamicType() != STANDARD_TYPE(AIS_Trihedron) ) { ic->Load( anAIS, -1, false ); - ic->Activate( anAIS, theMode ); + for( it = sel_modes.begin(); it != sel_modes.end(); ++it ) + ic->Activate( anAIS, *it ); } } } } -//======================================================================= -// name : GlobalSelection -// Purpose : Deactivates selection of sub shapes -//======================================================================= +/*! + Activates selection of sub-shapes +*/ +void SOCC_Viewer::LocalSelection( const SALOME_OCCPrs* thePrs, const int theMode ) +{ + std::list modes; + modes.push_back( theMode ); + LocalSelection( thePrs, modes ); +} + +/*! + Deactivates selection of sub-shapes +*/ void SOCC_Viewer::GlobalSelection( const bool update ) const { Handle(AIS_InteractiveContext) ic = getAISContext(); @@ -527,85 +567,52 @@ void SOCC_Viewer::GlobalSelection( const bool update ) const } } -//======================================================================= -// name : BeforeDisplay -// Purpose : Axiluary method called before displaying of objects -//======================================================================= -void SOCC_Viewer::BeforeDisplay( SALOME_Displayer* d ) -{ - d->BeforeDisplay( this, SALOME_OCCViewType() ); -} - -//======================================================================= -// name : AfterDisplay -// Purpose : Axiluary method called after displaying of objects -//======================================================================= -void SOCC_Viewer::AfterDisplay( SALOME_Displayer* d ) -{ - d->AfterDisplay( this, SALOME_OCCViewType() ); -} -//======================================================================= -// name : getTrihedronSize -// Purpose : Get new and current trihedron size corresponding to the -// current model size -//======================================================================= -bool SOCC_Viewer::getTrihedronSize( double& theNewSize, double& theSize ) +/*! + \Collect objects visible in viewer + \param theList - visible objects collection +*/ +void SOCC_Viewer::GetVisible( SALOME_ListIO& theList ) { - theNewSize = 100; - theSize = 100; - - //SRN: BUG IPAL8996, a usage of method ActiveView without an initialization - Handle(V3d_Viewer) viewer = getViewer3d(); - viewer->InitActiveViews(); - if(!viewer->MoreActiveViews()) return false; - - Handle(V3d_View) view3d = viewer->ActiveView(); - //SRN: END of fix - - if ( view3d.IsNull() ) - return false; - - double Xmin = 0, Ymin = 0, Zmin = 0, Xmax = 0, Ymax = 0, Zmax = 0; - double aMaxSide; - - view3d->View()->MinMaxValues( Xmin, Ymin, Zmin, Xmax, Ymax, Zmax ); - - if ( Xmin == RealFirst() || Ymin == RealFirst() || Zmin == RealFirst() || - Xmax == RealLast() || Ymax == RealLast() || Zmax == RealLast() ) - return false; - - aMaxSide = Xmax - Xmin; - if ( aMaxSide < Ymax -Ymin ) aMaxSide = Ymax -Ymin; - if ( aMaxSide < Zmax -Zmin ) aMaxSide = Zmax -Zmin; - - float aSizeInPercents = SUIT_Session::session()->resourceMgr()->doubleValue("Viewer","TrihedronSize", 105.); - - static float EPS = 5.0E-3; - theSize = getTrihedron()->Size(); - theNewSize = aMaxSide*aSizeInPercents / 100.0; + AIS_ListOfInteractive List; + getAISContext()->DisplayedObjects(List); + + AIS_ListIteratorOfListOfInteractive ite(List); + for ( ; ite.More(); ite.Next() ) + { + Handle(SALOME_InteractiveObject) anObj = + Handle(SALOME_InteractiveObject)::DownCast( ite.Value()->GetOwner() ); - return fabs( theNewSize - theSize ) > theSize * EPS || - fabs( theNewSize - theSize) > theNewSize * EPS; + if ( !anObj.IsNull() && anObj->hasEntry() ) + theList.Append( anObj ); + } } -//======================================================================= -// name : Repaint -// Purpose : -//======================================================================= +/*! + Updates current viewer +*/ void SOCC_Viewer::Repaint() { // onAdjustTrihedron(); getViewer3d()->Update(); } -//======================================================================= -// name : createView -// Purpose : create SOCC_ViewWindow -//======================================================================= -SUIT_ViewWindow* SOCC_Viewer::createView( SUIT_Desktop* theDesktop ) + +/*! + create SOCC_ViewWindow +*/ +/*SUIT_ViewWindow* SOCC_Viewer::createView( SUIT_Desktop* theDesktop ) { SOCC_ViewWindow* view = new SOCC_ViewWindow(theDesktop, this); - initView( view ); + //initView( view ); + initView( view->getView(OCCViewer_ViewFrame::MAIN_VIEW) ); return view; + }*/ + +/* + * Returns a new OCCViewer_ViewWindow instance which will be placed as a sub window in ViewFrame + */ +OCCViewer_ViewWindow* SOCC_Viewer::createSubWindow() +{ + return new SOCC_ViewWindow( 0, this); }