]> Creatis software - cpPlugins.git/blob - lib/cpExtensions/QT/SimpleMPRWidget.h
d5f33539fe0fb5cd29a0437fa32f65d55f3cc8ca
[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 TActors;
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 AddMesh( vtkPolyData* mesh );
100
101       // Visual objects
102       vtkRenderWindowInteractor* GetInteractor( unsigned int i );
103       vtkRenderer* GetRenderer( unsigned int i );
104       std::vector< std::pair< vtkImageActor*, vtkRenderer* > >
105         GetMainImageActors( );
106       vtkActor* GetActor( vtkPolyData* mesh );
107
108     private slots:
109       void _SyncBottom( int a, int b );
110       void _SyncTop( int a, int b );
111
112     protected:
113       Ui::SimpleMPRWidget* m_UI;
114       QVTKWidget*          m_VTK[ 4 ];
115
116       vtkSmartPointer< vtkRenderer > m_Renderers[ 4 ];
117       vtkSmartPointer< TActors >     m_2DSlices[ 3 ];
118       vtkSmartPointer< TActors >     m_3DSlices[ 3 ];
119
120       std::map< vtkPolyData*, PolyDataActor > m_PolyDatas;
121     };
122
123   } // ecapseman
124
125 } // ecapseman
126
127 #endif // cpExtensions_QT4
128
129 #endif // __CPEXTENSIONS__QT__SIMPLEMPRWIDGET__H__
130
131 // eof - $RCSfile$