// 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 <utilities.h>
// OCC includes
#include <TopoDS.hxx>
#include <vtkRenderer.h>
#include <vtkProperty.h>
-#include "VTKViewer_Actor.h"
+#include <QSet>
-#include "SVTK_DeviceActor.h"
-#include "SALOME_Actor.h"
+// GEOM includes
+#include <GEOM_Actor.h>
-// QT
-#include <QString>
-#include <QColor>
+// GUI includes
+#include <VTKViewer_Actor.h>
+#include <SVTK_DeviceActor.h>
+#include <SALOME_InteractiveObject.hxx>
+#include <SUIT_ResourceMgr.h>
+#include <SUIT_Session.h>
#ifdef _DEBUG_
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 - "<<this);
}
-SMESH_PreviewActorsCollection
-::~SMESH_PreviewActorsCollection()
+SMESH_PreviewActorsCollection::~SMESH_PreviewActorsCollection()
{
if(MYDEBUG) MESSAGE("~SMESH_PreviewActorsCollection - "<<this);
- if (myRenderer)
- RemoveFromRender(myRenderer);
-
- QMap<int, GEOM_Actor*>::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;
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<int> 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 )
myRenderer = theRenderer;
QMap<int, GEOM_Actor*>::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<int, GEOM_Actor*>::iterator iter = myMapOfActors.begin();
for ( ; iter != myMapOfActors.end(); ++iter )
iter.value()->RemoveFromRender( theRenderer );
mySelector = theSelector;
}
-void SMESH_PreviewActorsCollection::HighlightAll( bool theHighlight ){
+void SMESH_PreviewActorsCollection::HighlightAll( bool theHighlight )
+{
QMap<int, GEOM_Actor*>::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<int, GEOM_Actor*>::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<int, GEOM_Actor*>::iterator iter = myMapOfActors.begin();
+ for ( ; iter != myMapOfActors.end(); ++iter )
+ if ( GEOM_Actor* anActor = iter.value() )
+ anActor->Delete();
+ myMapOfActors.clear();
+}