]> Creatis software - cpPlugins.git/blobdiff - lib/cpExtensions/QT/SimpleMPRWidget.h
...
[cpPlugins.git] / lib / cpExtensions / QT / SimpleMPRWidget.h
index f6d90f094aba7120ba7d29370eb2fbb1a071b38e..04ed994898f710f698a629205ffbead51c8b759e 100644 (file)
@@ -6,11 +6,11 @@
 #ifdef cpExtensions_QT4
 
 #include <map>
+#include <set>
 #include <QWidget>
-#include <vtkPolyDataNormals.h>
-#include <vtkQuadricLODActor.h>
-#include <vtkRenderer.h>
-#include <vtkStripper.h>
+#include <vtkInteractorStyleTrackballCamera.h>
+#include <vtkRenderWindowInteractor.h>
+#include <vtkProp.h>
 #include <vtkSmartPointer.h>
 #include <cpExtensions/Visualization/ImageSliceActors.h>
 
@@ -39,54 +39,37 @@ namespace cpExtensions
     public:
       typedef SimpleMPRWidget Self;
 
-      typedef cpExtensions::Visualization::ImageSliceActors TActors;
+      struct TActorCmp
+      {
+        bool operator()(
+          const vtkSmartPointer< vtkProp >& a,
+          const vtkSmartPointer< vtkProp >& b
+          ) const
+          { return( a.GetPointer( ) < b.GetPointer( ) ); }
+      };
+      typedef std::set< vtkSmartPointer< vtkProp >, TActorCmp >  TActors;
+      typedef std::map< std::string, TActors >              TNamedActors;
+      typedef cpExtensions::Visualization::ImageSliceActors TSliceActors;
 
+    protected:
       /**
        */
-      struct PolyDataActor
+      class _3DInteractorStyle
+        : public vtkInteractorStyleTrackballCamera
       {
-        vtkSmartPointer< vtkPolyData >        Data;
-        vtkSmartPointer< vtkPolyDataNormals > Normals;
-        vtkSmartPointer< vtkStripper >        Stripper;
-        vtkSmartPointer< vtkPolyDataMapper >  Mapper;
-        vtkSmartPointer< vtkActor >           Actor;
-
-        void Configure( vtkPolyData* data )
-          {
-            this->Data = data;
-            double r[ 2 ];
-            this->Data->GetScalarRange( r );
-
-            this->Normals  = vtkSmartPointer< vtkPolyDataNormals >::New( );
-            this->Stripper = vtkSmartPointer< vtkStripper >::New( );
-            this->Mapper   = vtkSmartPointer< vtkPolyDataMapper >::New( );
-            this->Normals->SetInputData( this->Data );
-            this->Normals->SetFeatureAngle( 60.0 );
-            this->Stripper->SetInputConnection(
-              this->Normals->GetOutputPort( )
-              );
-            this->Mapper->SetInputConnection(
-              this->Stripper->GetOutputPort( )
-              );
-            this->Mapper->UseLookupTableScalarRangeOff( );
-            this->Mapper->SetScalarRange( r[ 0 ], r[ 1 ] );
-
-            unsigned long nPolys = this->Data->GetNumberOfPolys( );
-            if( nPolys < cpExtensions_MAX_POLYS )
-            {
-              this->Actor = vtkSmartPointer< vtkActor >::New( );
-              this->Actor->SetMapper( this->Mapper );
-            }
-            else
-            {
-              vtkSmartPointer< vtkQuadricLODActor > actor =
-                vtkSmartPointer< vtkQuadricLODActor >::New( );
-              actor->SetMapper( this->Mapper );
-              actor->DeferLODConstructionOff( );
-              this->Actor = actor.GetPointer( );
-
-            } // fi
-          }
+      public:
+        vtkTypeMacro(
+          _3DInteractorStyle, vtkInteractorStyleTrackballCamera
+          );
+
+      public:
+        static _3DInteractorStyle* New( );
+        virtual void OnChar( )       { }
+        virtual void OnKeyDown( )    { }
+        virtual void OnKeyUp( )      { }
+        virtual void OnKeyRelease( ) { }
+        virtual void OnKeyPress( );
       };
 
     public:
@@ -95,13 +78,22 @@ namespace cpExtensions
 
       // Data management
       void Clear( );
-      void SetMainImage( vtkImageData* image );
-      void AddMesh( vtkPolyData* mesh );
+      void SetMainImage( vtkImageData* image, const std::string& name );
+      void SetMainActor( vtkImageActor* actor, const std::string& name );
+      void AddImage( vtkImageData* image, const std::string& name );
+      void AddImageActor( vtkImageActor* actor, const std::string& name );
+      void AddMesh( vtkPolyData* mesh, const std::string& name );
+      void AddMeshActor( vtkProp3D* actor, const std::string& name );
+      void AddActor( vtkProp* actor, const std::string& name );
+      const TActors& GetActors( const std::string& name ) const;
 
       // Visual objects
       vtkRenderWindowInteractor* GetInteractor( unsigned int i );
+      vtkRenderer* GetRenderer( unsigned int i );
+      vtkRenderWindow* GetRenderWindow( unsigned int i );
 
-      vtkActor* GetActor( vtkPolyData* mesh );
+    protected:
+      void _AssociateSlices( );
 
     private slots:
       void _SyncBottom( int a, int b );
@@ -111,11 +103,11 @@ namespace cpExtensions
       Ui::SimpleMPRWidget* m_UI;
       QVTKWidget*          m_VTK[ 4 ];
 
-      vtkSmartPointer< vtkRenderer > m_Renderers[ 4 ];
-      vtkSmartPointer< TActors >     m_2DSlices[ 3 ];
-      vtkSmartPointer< TActors >     m_3DSlices[ 3 ];
+      vtkSmartPointer< vtkRenderer >  m_Renderers[ 4 ];
+      vtkSmartPointer< TSliceActors > m_2DSlices[ 3 ];
+      vtkSmartPointer< TSliceActors > m_3DSlices[ 3 ];
 
-      std::map< vtkPolyData*, PolyDataActor > m_PolyDatas;
+      TNamedActors m_NamedActors;
     };
 
   } // ecapseman