]> Creatis software - cpPlugins.git/blob - lib/cpExtensions/QT/SimpleMPRWidget.h
MVC integration at 50%
[cpPlugins.git] / lib / cpExtensions / QT / SimpleMPRWidget.h
1 #ifndef __CPEXTENSIONS__QT__SIMPLEMPRWIDGET__H__
2 #define __CPEXTENSIONS__QT__SIMPLEMPRWIDGET__H__
3
4 #include <cpExtensions/Config.h>
5
6 #ifdef cpExtensions_QT4
7
8 #include <map>
9 #include <QWidget>
10 #include <vtkPolyDataNormals.h>
11 #include <vtkQuadricLODActor.h>
12 #include <vtkRenderer.h>
13 #include <vtkStripper.h>
14 #include <vtkSmartPointer.h>
15 #include <cpExtensions/Visualization/ImageSliceActors.h>
16
17 #define cpExtensions_MAX_POLYS 65535
18
19 // -------------------------------------------------------------------------
20 class QVTKWidget;
21
22 namespace Ui
23 {
24   class SimpleMPRWidget;
25 }
26
27 // -------------------------------------------------------------------------
28 namespace cpExtensions
29 {
30   namespace QT
31   {
32     /**
33      */
34     class cpExtensions_EXPORT SimpleMPRWidget
35       : public QWidget
36     {
37       Q_OBJECT;
38
39     public:
40       typedef SimpleMPRWidget Self;
41
42       typedef cpExtensions::Visualization::ImageSliceActors TSliceActors;
43
44       /**
45        */
46       struct PolyDataActor
47       {
48         vtkSmartPointer< vtkPolyData >        Data;
49         vtkSmartPointer< vtkPolyDataNormals > Normals;
50         vtkSmartPointer< vtkStripper >        Stripper;
51         vtkSmartPointer< vtkPolyDataMapper >  Mapper;
52         vtkSmartPointer< vtkActor >           Actor;
53
54         void Configure( vtkPolyData* data )
55           {
56             this->Data = data;
57             double r[ 2 ];
58             this->Data->GetScalarRange( r );
59
60             this->Normals  = vtkSmartPointer< vtkPolyDataNormals >::New( );
61             this->Stripper = vtkSmartPointer< vtkStripper >::New( );
62             this->Mapper   = vtkSmartPointer< vtkPolyDataMapper >::New( );
63             this->Normals->SetInputData( this->Data );
64             this->Normals->SetFeatureAngle( 60.0 );
65             this->Stripper->SetInputConnection(
66               this->Normals->GetOutputPort( )
67               );
68             this->Mapper->SetInputConnection(
69               this->Stripper->GetOutputPort( )
70               );
71             this->Mapper->UseLookupTableScalarRangeOff( );
72             this->Mapper->SetScalarRange( r[ 0 ], r[ 1 ] );
73
74             unsigned long nPolys = this->Data->GetNumberOfPolys( );
75             if( nPolys < cpExtensions_MAX_POLYS )
76             {
77               this->Actor = vtkSmartPointer< vtkActor >::New( );
78               this->Actor->SetMapper( this->Mapper );
79             }
80             else
81             {
82               vtkSmartPointer< vtkQuadricLODActor > actor =
83                 vtkSmartPointer< vtkQuadricLODActor >::New( );
84               actor->SetMapper( this->Mapper );
85               actor->DeferLODConstructionOff( );
86               this->Actor = actor.GetPointer( );
87
88             } // fi
89           }
90       };
91
92     public:
93       explicit SimpleMPRWidget( QWidget* parent = 0 );
94       virtual ~SimpleMPRWidget( );
95
96       // Data management
97       void Clear( );
98       void SetMainImage( vtkImageData* image );
99       void SetMainActor( vtkImageActor* actor );
100       void AddImage( vtkImageData* image );
101       void AddImageActor( vtkImageActor* actor );
102       void AddMesh( vtkPolyData* mesh );
103       void AddMeshActor( vtkActor* actor );
104       void AddActor( vtkProp* actor );
105
106       // Visual objects
107       vtkRenderWindowInteractor* GetInteractor( unsigned int i );
108       vtkRenderer* GetRenderer( unsigned int i );
109       vtkRenderWindow* GetRenderWindow( unsigned int i );
110       /* TODO
111          std::vector< std::pair< vtkImageActor*, vtkRenderer* > >
112          GetMainImageActors( );
113          vtkActor* GetActor( vtkPolyData* mesh );
114       */
115
116     protected:
117       void _AssociateSlices( );
118
119     private slots:
120       void _SyncBottom( int a, int b );
121       void _SyncTop( int a, int b );
122
123     protected:
124       Ui::SimpleMPRWidget* m_UI;
125       QVTKWidget*          m_VTK[ 4 ];
126
127       vtkSmartPointer< vtkRenderer >  m_Renderers[ 4 ];
128       vtkSmartPointer< TSliceActors > m_2DSlices[ 3 ];
129       vtkSmartPointer< TSliceActors > m_3DSlices[ 3 ];
130
131       std::map< vtkPolyData*, PolyDataActor > m_PolyDatas;
132     };
133
134   } // ecapseman
135
136 } // ecapseman
137
138 #endif // cpExtensions_QT4
139
140 #endif // __CPEXTENSIONS__QT__SIMPLEMPRWIDGET__H__
141
142 // eof - $RCSfile$