X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FOBJECT%2FSMESH_PreviewActorsCollection.cxx;h=b5e145cc5513398218277e5249196c9a52f4e8d9;hb=43db13f33a1d75fae36db8f06fa378ed7906a332;hp=91e38e35418a441c2582cdb2dcce3ffce8a425f7;hpb=2de294b09ac8b9ace071a01db9cb4e235f1eadbb;p=modules%2Fsmesh.git diff --git a/src/OBJECT/SMESH_PreviewActorsCollection.cxx b/src/OBJECT/SMESH_PreviewActorsCollection.cxx index 91e38e354..b5e145cc5 100644 --- a/src/OBJECT/SMESH_PreviewActorsCollection.cxx +++ b/src/OBJECT/SMESH_PreviewActorsCollection.cxx @@ -1,32 +1,25 @@ -// Copyright (C) 2007-2010 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE // -// 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 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 -// Lesser General Public License for more details. +// 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 +// 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 +// 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( true ); - 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(); +}