From 38b9ea61981cff9dff3ec1a3d3b399be54cb6446 Mon Sep 17 00:00:00 2001 From: vsr Date: Tue, 9 Aug 2011 07:46:44 +0000 Subject: [PATCH] 0021343: EDF 1930 SMESH: Huge memory occupation when assigning an hypothesis to a big model --- src/OBJECT/SMESH_PreviewActorsCollection.cxx | 223 +++++++++++-------- src/OBJECT/SMESH_PreviewActorsCollection.h | 34 ++- 2 files changed, 157 insertions(+), 100 deletions(-) diff --git a/src/OBJECT/SMESH_PreviewActorsCollection.cxx b/src/OBJECT/SMESH_PreviewActorsCollection.cxx index 04903f25d..a88218c20 100644 --- a/src/OBJECT/SMESH_PreviewActorsCollection.cxx +++ b/src/OBJECT/SMESH_PreviewActorsCollection.cxx @@ -17,16 +17,9 @@ // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // -// SMESH OBJECT : interactive object for SMESH visualization -// File : SMESH_PreviewActorsCollection.cxx -// Author : -// Module : SMESH -// #include "SMESH_PreviewActorsCollection.h" -#include "utilities.h" - -#include "SALOME_InteractiveObject.hxx" +#include // OCC includes #include @@ -39,14 +32,17 @@ #include #include -#include "VTKViewer_Actor.h" +#include -#include "SVTK_DeviceActor.h" -#include "SALOME_Actor.h" +// GEOM includes +#include -// QT -#include -#include +// GUI includes +#include +#include +#include +#include +#include #ifdef _DEBUG_ static int MYDEBUG = 0; @@ -54,38 +50,34 @@ static int MYDEBUG = 0; static int MYDEBUG = 0; #endif -using namespace std; - - -//vtkStandardNewMacro(SMESH_PreviewActorsCollection); - -SMESH_PreviewActorsCollection -::SMESH_PreviewActorsCollection() +SMESH_PreviewActorsCollection::SMESH_PreviewActorsCollection() : + mySelector( 0 ), myRenderer( 0 ), myCurrentChunk( 0 ), myChunkSize( 0 ), myIsShown( true ) { if(MYDEBUG) MESSAGE("SMESH_PreviewActorsCollection - "<::iterator iter = myMapOfActors.begin(); - for ( ; iter != myMapOfActors.end(); ++iter ) - if ( GEOM_Actor* anActor = iter.value() ) - anActor->Delete(); - myMapOfActors.clear(); + clearActors(); } -bool SMESH_PreviewActorsCollection::Init( const TopoDS_Shape& theShape, TopAbs_ShapeEnum theType, const QString& theEntry ) +bool SMESH_PreviewActorsCollection::Init( const TopoDS_Shape& theShape, + TopAbs_ShapeEnum theType, + const QString& theEntry ) { + SUIT_ResourceMgr* mgr = SUIT_Session::session()->resourceMgr(); + + myType = theType; + myEntry = theEntry; myMainShape = theShape; myMapOfActors.clear(); myMapOfShapes.Clear(); + myIndices.clear(); + myCurrentChunk = 0; + myChunkSize = mgr->integerValue( "SMESH", "preview_actor_chunk_size", 100 ); if ( theShape.IsNull() ) return false; @@ -94,72 +86,30 @@ bool SMESH_PreviewActorsCollection::Init( const TopoDS_Shape& theShape, TopAbs_S anIO->setEntry( theEntry.toLatin1().constData() ); // get indexes of seleted elements - TopExp::MapShapes(theShape, myMapOfShapes); - + TopExp::MapShapes( theShape, myMapOfShapes ); TopExp_Explorer exp( theShape, theType ); - for ( ; exp.More(); exp.Next() ) { - int index = myMapOfShapes.FindIndex( exp.Current() ); - if ( index && !myMapOfActors.contains( index ) ) { - // create actor if the index is present - if ( GEOM_Actor* anActor = createActor( exp.Current().Oriented(TopAbs_FORWARD))) { - // Create new entry for actor - QString aString = theEntry; - aString += QString("_%1").arg( index ); // add index to actor entry - - // Create interactive object - Handle( SALOME_InteractiveObject ) anIO = new SALOME_InteractiveObject(); - anIO->setEntry( aString.toLatin1().constData() ); - - // Init Actor - anActor->SetVectorMode( theType==TopAbs_EDGE ); - anActor->setIO( anIO ); - anActor->SetSelector( mySelector ); - anActor->SetPickable( true ); - anActor->SetResolveCoincidentTopology( true ); - - // Add Actor to the Actors Map - myMapOfActors.insert(index, anActor); - } - } - } - mySelector->ClearIObjects(); + QSet indices; + for ( ; exp.More(); exp.Next() ) + indices << myMapOfShapes.FindIndex( exp.Current() ); + myIndices = indices.toList(); + qSort(myIndices); - return true; + // show current chunk + showCurrentChunk(); + + return count() > 0; } GEOM_Actor* SMESH_PreviewActorsCollection::createActor(const TopoDS_Shape& shape) { GEOM_Actor* actor = GEOM_Actor::New(); - actor->SetShape(shape,0,0); - - //Color Properties - /* - vtkProperty* aProp = vtkProperty::New(); - vtkProperty* aHLProp = vtkProperty::New(); - vtkProperty* aPHLProp = vtkProperty::New(); - - aProp->SetColor( 255, 0, 0); - actor->SetProperty(aProp); - - aHLProp->SetColor( 255, 255, 255); - actor->SetHighlightProperty(aHLProp); - - aPHLProp->SetColor( 155, 155, 155); - aPHLProp->SetLineWidth ( 3 ); - aPHLProp->SetOpacity ( 0.75 ); - actor->SetPreHighlightProperty(aPHLProp); - - aProp->Delete(); - aHLProp->Delete(); - aPHLProp->Delete(); - */ - + actor->SetShape( shape, 0, 0 ); return actor; } GEOM_Actor* SMESH_PreviewActorsCollection::GetActorByIndex(int index) { - return myMapOfActors.value(index); + return myMapOfActors.value( index ); } int SMESH_PreviewActorsCollection::GetIndexByShape( const TopoDS_Shape& theShape ) @@ -172,11 +122,14 @@ void SMESH_PreviewActorsCollection::AddToRender(vtkRenderer* theRenderer) myRenderer = theRenderer; QMap::iterator iter = myMapOfActors.begin(); - for ( ; iter != myMapOfActors.end(); ++iter ) + for ( ; iter != myMapOfActors.end(); ++iter ) { + iter.value()->SetVisibility( myIsShown ); iter.value()->AddToRender( theRenderer ); + } } -void SMESH_PreviewActorsCollection::RemoveFromRender(vtkRenderer* theRenderer){ +void SMESH_PreviewActorsCollection::RemoveFromRender(vtkRenderer* theRenderer) +{ QMap::iterator iter = myMapOfActors.begin(); for ( ; iter != myMapOfActors.end(); ++iter ) iter.value()->RemoveFromRender( theRenderer ); @@ -187,20 +140,108 @@ void SMESH_PreviewActorsCollection::SetSelector(SVTK_Selector* theSelector) mySelector = theSelector; } -void SMESH_PreviewActorsCollection::HighlightAll( bool theHighlight ){ +void SMESH_PreviewActorsCollection::HighlightAll( bool theHighlight ) +{ QMap::iterator iter = myMapOfActors.begin(); for ( ; iter != myMapOfActors.end(); ++iter ) iter.value()->Highlight( theHighlight ); } -void SMESH_PreviewActorsCollection::HighlightID( int index ){ +void SMESH_PreviewActorsCollection::HighlightID( int index ) +{ GEOM_Actor* anActor = GetActorByIndex( index ); if ( anActor && !anActor->isHighlighted() ) anActor->Highlight( true ); } -void SMESH_PreviewActorsCollection::SetShown( bool shown ){ +void SMESH_PreviewActorsCollection::SetShown( bool shown ) +{ + myIsShown = shown; QMap::iterator iter = myMapOfActors.begin(); for ( ; iter != myMapOfActors.end(); ++iter ) iter.value()->SetVisibility( shown ); } + +int SMESH_PreviewActorsCollection::count() const +{ + return myIndices.count(); +} + +int SMESH_PreviewActorsCollection::chunkSize() const +{ + return myChunkSize; +} + +int SMESH_PreviewActorsCollection::currentChunk() const +{ + return myCurrentChunk; +} + +bool SMESH_PreviewActorsCollection::hasPrevious() const +{ + return chunkSize() > 0 && currentChunk() > 0; +} + +bool SMESH_PreviewActorsCollection::hasNext() const +{ + return chunkSize() > 0 && (currentChunk()+1)*chunkSize() < count(); +} + +void SMESH_PreviewActorsCollection::previous() +{ + if ( !hasPrevious() ) return; + myCurrentChunk--; + showCurrentChunk(); +} + +void SMESH_PreviewActorsCollection::next() +{ + if ( !hasNext() ) return; + myCurrentChunk++; + showCurrentChunk(); +} + +void SMESH_PreviewActorsCollection::showCurrentChunk() +{ + clearActors(); + int imin = currentChunk() * chunkSize(); + int imax = std::min( (currentChunk()+1) * chunkSize(), count() ); + for ( int i = imin; i < imax; i++ ) { + int index = myIndices[i]; + if ( !index || myMapOfActors.contains( index ) ) continue; + TopoDS_Shape s = myMapOfShapes.FindKey( index ); + if ( s.IsNull() ) continue; + // create actor if the index is present + if ( GEOM_Actor* anActor = createActor( s.Oriented(TopAbs_FORWARD))) { + // Create new entry for actor + QString entry = QString( "%1_%2" ).arg( myEntry ).arg( index ); + // Create interactive object + Handle( SALOME_InteractiveObject ) anIO = new SALOME_InteractiveObject(); + anIO->setEntry( entry.toLatin1().constData() ); + // Init Actor + anActor->SetVectorMode( myType==TopAbs_EDGE ); + anActor->setIO( anIO ); + anActor->SetSelector( mySelector ); + anActor->SetPickable( true ); + anActor->SetResolveCoincidentTopology( true ); + + // Add Actor to the Actors Map + myMapOfActors.insert(index, anActor); + } + } + mySelector->ClearIObjects(); + if ( myRenderer ) + AddToRender( myRenderer ); +} + +void SMESH_PreviewActorsCollection::clearActors() +{ + if (myRenderer) + RemoveFromRender(myRenderer); + + QMap::iterator iter = myMapOfActors.begin(); + for ( ; iter != myMapOfActors.end(); ++iter ) + if ( GEOM_Actor* anActor = iter.value() ) + anActor->Delete(); + myMapOfActors.clear(); +} diff --git a/src/OBJECT/SMESH_PreviewActorsCollection.h b/src/OBJECT/SMESH_PreviewActorsCollection.h index 1078266b6..914c71036 100644 --- a/src/OBJECT/SMESH_PreviewActorsCollection.h +++ b/src/OBJECT/SMESH_PreviewActorsCollection.h @@ -26,22 +26,22 @@ #ifndef SMESH_PREVIEW_ACTOR_COLLECTION_H #define SMESH_PREVIEW_ACTOR_COLLECTION_H -#include "SMESH_Actor.h" -#include #include "SMESH_Object.h" + #include -#include #include #include -#include +#include #include +#include class vtkRenderer; class GEOM_Actor; +class SVTK_Selector; class SMESHOBJECT_EXPORT SMESH_PreviewActorsCollection { - public: +public: SMESH_PreviewActorsCollection(); ~SMESH_PreviewActorsCollection(); @@ -61,15 +61,31 @@ class SMESHOBJECT_EXPORT SMESH_PreviewActorsCollection void SetShown( bool ); - protected: - GEOM_Actor* createActor( const TopoDS_Shape& ); - - protected: + int count() const; + int chunkSize() const; + int currentChunk() const; + bool hasPrevious() const; + bool hasNext() const; + void previous(); + void next(); + +protected: + GEOM_Actor* createActor( const TopoDS_Shape& ); + void showCurrentChunk(); + void clearActors(); + +protected: + TopAbs_ShapeEnum myType; + QString myEntry; TopoDS_Shape myMainShape; SVTK_Selector* mySelector; vtkRenderer* myRenderer; TopTools_IndexedMapOfShape myMapOfShapes; QMap myMapOfActors; + QList myIndices; + int myCurrentChunk; + int myChunkSize; + bool myIsShown; }; -- 2.39.2