X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSOCC%2FSOCC_ViewModel.cxx;h=aa9ed64b2ae762a1e6ff5c917690352d20bc55fa;hb=331294345d3e1716fbf79ae25a2851011729be79;hp=8d425a47c63d9d753e5dc20e575a0bd979a22b6e;hpb=399155730966dfc225fbb24f66204b05664385f2;p=modules%2Fgui.git diff --git a/src/SOCC/SOCC_ViewModel.cxx b/src/SOCC/SOCC_ViewModel.cxx index 8d425a47c..aa9ed64b2 100755 --- a/src/SOCC/SOCC_ViewModel.cxx +++ b/src/SOCC/SOCC_ViewModel.cxx @@ -1,28 +1,33 @@ -// Copyright (C) 2005 OPEN CASCADE, CEA/DEN, EDF R&D, PRINCIPIA R&D -// +// 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. -// -// 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 +// 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 +// 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" @@ -33,46 +38,16 @@ //#include CORBA_CLIENT_HEADER(SALOMEDS) #include -#include #include #include - -// Temporarily commented to avoid awful dependecy on SALOMEDS -// TODO: better mechanism of storing display/erse status in a study -// should be provided... -//#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. - -// 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 ); -//} +#include /*! Constructor @@ -116,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 ) ) ) @@ -147,13 +122,6 @@ bool SOCC_Viewer::isInViewer( const Handle(SALOME_InteractiveObject)& obj, { 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() ) { @@ -172,17 +140,19 @@ bool SOCC_Viewer::isInViewer( const Handle(SALOME_InteractiveObject)& obj, */ 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; @@ -197,21 +167,21 @@ bool SOCC_Viewer::isVisible( const Handle(SALOME_InteractiveObject)& obj ) 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 ); + } } - } } /*! @@ -223,21 +193,21 @@ void SOCC_Viewer::setColor( const Handle(SALOME_InteractiveObject)& obj, 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 ); + } } - } } /*! @@ -249,21 +219,21 @@ void SOCC_Viewer::switchRepresentation( const Handle(SALOME_InteractiveObject)& 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 ); + } } - } } /*! @@ -289,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; } } @@ -316,22 +286,9 @@ void SOCC_Viewer::Display( const SALOME_OCCPrs* prs ) if ( !anOCCPrs || anOCCPrs->IsNull() ) return; - // 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) 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 ); @@ -343,68 +300,58 @@ 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 - // 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() ) - //{ - // 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 ); + Handle(SALOME_AISShape) aSh = Handle(SALOME_AISShape)::DownCast (anAIS); + if (!aSh.IsNull()) + { + 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 @@ -414,8 +361,7 @@ void SOCC_Viewer::Display( const SALOME_OCCPrs* prs ) // Handle(SALOME_InteractiveObject)::DownCast( anAIS->GetOwner() ); //if ( !anObj.IsNull() && anObj->hasEntry() ) //{ - // if ( study ) - // ToolsGUI::SetVisibility( study, anObj->getEntry(), true, this ); + // ToolsGUI::SetVisibility( anObj->getEntry(), true, this ); //} // Deactivate object if necessary @@ -423,6 +369,7 @@ void SOCC_Viewer::Display( const SALOME_OCCPrs* prs ) ic->Deactivate( anAIS ); } } + updateTrihedron(); } @@ -438,12 +385,6 @@ void SOCC_Viewer::Erase( const SALOME_OCCPrs* prs, const bool forced ) if ( !anOCCPrs || anOCCPrs->IsNull() ) return; - // 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) study(getStudyDS()); - // get context Handle(AIS_InteractiveContext) ic = getAISContext(); @@ -456,8 +397,7 @@ 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 // Temporarily commented to avoid awful dependecy on SALOMEDS // TODO: better mechanism of storing display/erse status in a study @@ -468,12 +408,12 @@ void SOCC_Viewer::Erase( const SALOME_OCCPrs* prs, const bool forced ) // Handle(SALOME_InteractiveObject)::DownCast( anAIS->GetOwner() ); // if ( !anObj.IsNull() && anObj->hasEntry() ) // { - // if ( study ) - // ToolsGUI::SetVisibility( study, anObj->getEntry(), true, this ); + // ToolsGUI::SetVisibility( anObj->getEntry(), true, this ); // } //} } } + updateTrihedron(); } @@ -481,14 +421,8 @@ void SOCC_Viewer::Erase( const SALOME_OCCPrs* prs, const bool forced ) Erase all presentations \param forced - removes all objects from context */ -void SOCC_Viewer::EraseAll( const bool forced ) +void SOCC_Viewer::EraseAll( SALOME_Displayer* d, const bool forced ) { - // 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) study(getStudyDS()); - // get context Handle(AIS_InteractiveContext) ic = getAISContext(); @@ -500,12 +434,12 @@ 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 // Temporarily commented to avoid awful dependecy on SALOMEDS @@ -513,20 +447,18 @@ void SOCC_Viewer::EraseAll( const bool forced ) // should be provided... //if ( !forced ) { // Handle(SALOME_InteractiveObject) anObj = - // Handle(SALOME_InteractiveObject)::DownCast( anIO->GetOwner() ); + // Handle(SALOME_InteractiveObject)::DownCast( anIO->GetOwner() ); // if ( !anObj.IsNull() && anObj->hasEntry() ) { - // if ( study ) - // ToolsGUI::SetVisibility( study, anObj->getEntry(), true, this ); + // ToolsGUI::SetVisibility( anObj->getEntry(), true, this ); // } //} } - // display trihedron if necessary - if ( isTrihedronDisplayed ) - getAISContext()->Display( getTrihedron() ); - else - Repaint(); + SALOME_View::EraseAll( d, forced ); + + Repaint(); + updateTrihedron(); } /*! @@ -535,37 +467,33 @@ void SOCC_Viewer::EraseAll( const bool forced ) */ 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; } /*! - Activates selection of sub shapes + Activates selection of sub-shapes */ -void SOCC_Viewer::LocalSelection( const SALOME_OCCPrs* thePrs, const int theMode ) +void SOCC_Viewer::LocalSelection( const SALOME_OCCPrs* thePrs, const std::list modes ) { Handle(AIS_InteractiveContext) ic = getAISContext(); @@ -577,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; @@ -587,28 +515,46 @@ 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 ); } } } } /*! - 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 { @@ -621,65 +567,27 @@ void SOCC_Viewer::GlobalSelection( const bool update ) const } } -/*! - Auxiliary method called before displaying of objects -*/ -void SOCC_Viewer::BeforeDisplay( SALOME_Displayer* d ) -{ - d->BeforeDisplay( this, SALOME_OCCViewType() ); -} /*! - Auxiliary method called after displaying of objects + \Collect objects visible in viewer + \param theList - visible objects collection */ -void SOCC_Viewer::AfterDisplay( SALOME_Displayer* d ) +void SOCC_Viewer::GetVisible( SALOME_ListIO& theList ) { - d->AfterDisplay( this, SALOME_OCCViewType() ); -} - -/*! - Get new and current trihedron size corresponding to the current model size -*/ -bool SOCC_Viewer::getTrihedronSize( double& theNewSize, double& theSize ) -{ - 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 ); + } } - /*! Updates current viewer */ @@ -693,9 +601,18 @@ void SOCC_Viewer::Repaint() /*! create SOCC_ViewWindow */ -SUIT_ViewWindow* SOCC_Viewer::createView( SUIT_Desktop* theDesktop ) +/*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); }