Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include <mitkGL.h>
00020 #include "mitkPolyDataGLMapper2D.h"
00021
00022 #include "mitkBaseRenderer.h"
00023 #include "mitkPlaneGeometry.h"
00024 #include "mitkSurface.h"
00025 #include "mitkColorProperty.h"
00026 #include "mitkProperties.h"
00027 #include "mitkAbstractTransformGeometry.h"
00028 #include "mitkVtkMapper3D.h"
00029
00030 #include <vtkPolyData.h>
00031 #include <vtkPolyDataSource.h>
00032 #include <vtkPlane.h>
00033 #include <vtkCutter.h>
00034 #include <vtkPoints.h>
00035 #include <vtkCellArray.h>
00036 #include <vtkLookupTable.h>
00037 #include <vtkPointData.h>
00038 #include <vtkCellData.h>
00039 #include <vtkDataArray.h>
00040 #include <vtkPolyData.h>
00041 #include <vtkLinearTransform.h>
00042 #include <vtkActor.h>
00043 #include <vtkPolyDataMapper.h>
00044 #include <vtkScalarsToColors.h>
00045
00046 #include <itkProcessObject.h>
00047
00048 void mitk::PolyDataGLMapper2D::Paint( mitk::BaseRenderer * renderer )
00049 {
00050 if ( IsVisible( renderer ) == false )
00051 return ;
00052
00053
00054 mitk::BaseData::Pointer input = const_cast<mitk::BaseData*>( GetData() );
00055
00056 assert( input );
00057
00058 input->Update();
00059
00060 vtkPolyData * vtkpolydata = this->GetVtkPolyData();
00061 assert( vtkpolydata );
00062
00063
00064 vtkLinearTransform * vtktransform = GetDataNode() ->GetVtkTransform();
00065
00066 if (vtktransform)
00067 {
00068 vtkLinearTransform * inversetransform = vtktransform->GetLinearInverse();
00069
00070 Geometry2D::ConstPointer worldGeometry = renderer->GetCurrentWorldGeometry2D();
00071 PlaneGeometry::ConstPointer worldPlaneGeometry = dynamic_cast<const PlaneGeometry*>( worldGeometry.GetPointer() );
00072
00073 if ( vtkpolydata != NULL )
00074 {
00075 Point3D point;
00076 Vector3D normal;
00077
00078 if(worldPlaneGeometry.IsNotNull())
00079 {
00080
00081 point=worldPlaneGeometry->GetOrigin();
00082 normal=worldPlaneGeometry->GetNormal(); normal.Normalize();
00083 m_Plane->SetTransform((vtkAbstractTransform*)NULL);
00084 }
00085 else
00086 {
00087
00088 return;
00089 AbstractTransformGeometry::ConstPointer worldAbstractGeometry = dynamic_cast<const AbstractTransformGeometry*>(renderer->GetCurrentWorldGeometry2D());
00090 if(worldAbstractGeometry.IsNotNull())
00091 {
00092
00093 point=const_cast<mitk::BoundingBox*>(worldAbstractGeometry->GetParametricBoundingBox())->GetMinimum();
00094 FillVector3D(normal, 0, 0, 1);
00095 m_Plane->SetTransform(worldAbstractGeometry->GetVtkAbstractTransform()->GetInverse());
00096 }
00097 else
00098 return;
00099 }
00100
00101 vtkFloatingPointType vp[ 3 ], vnormal[ 3 ];
00102
00103 vnl2vtk(point.Get_vnl_vector(), vp);
00104 vnl2vtk(normal.Get_vnl_vector(), vnormal);
00105
00106
00107
00108
00109
00110 inversetransform->TransformPoint( vp, vp );
00111 inversetransform->TransformNormalAtPoint( vp, vnormal, vnormal );
00112
00113 m_Plane->SetOrigin( vp );
00114 m_Plane->SetNormal( vnormal );
00115
00116
00117 m_Cutter->SetInput( vtkpolydata );
00118
00119
00120
00121
00122 m_Cutter->Update();
00123
00124
00125 mitk::DisplayGeometry::Pointer displayGeometry = renderer->GetDisplayGeometry();
00126 assert( displayGeometry );
00127
00128
00129
00130 ApplyProperties( renderer );
00131
00132
00133 vtkPolyData * contour = m_Cutter->GetOutput();
00134
00135 vtkPoints *vpoints = contour->GetPoints();
00136 vtkCellArray *vpolys = contour->GetLines();
00137 vtkPointData *vpointdata = contour->GetPointData();
00138 vtkDataArray* vscalars = vpointdata->GetScalars();
00139
00140 vtkCellData *vcelldata = contour->GetCellData();
00141 vtkDataArray* vcellscalars = vcelldata->GetScalars();
00142
00143 int i, numberOfCells = vpolys->GetNumberOfCells();
00144
00145 Point3D p;
00146 Point2D p2d, last, first;
00147
00148 vpolys->InitTraversal();
00149 vtkScalarsToColors* lut = GetVtkLUT();
00150 assert ( lut != NULL );
00151
00152 for ( i = 0;i < numberOfCells;++i )
00153 {
00154 vtkIdType *cell(NULL);
00155 vtkIdType cellSize(0);
00156
00157 vpolys->GetNextCell( cellSize, cell );
00158
00159 if ( m_ColorByCellData )
00160 {
00161 vtkFloatingPointType* color = lut->GetColor( vcellscalars->GetComponent( i, 0 ) );
00162 glColor3f( color[ 0 ], color[ 1 ], color[ 2 ] );
00163 }
00164 if ( m_ColorByPointData )
00165 {
00166 vtkFloatingPointType* color = lut->GetColor( vscalars->GetComponent( cell[0], 0 ) );
00167 glColor3f( color[ 0 ], color[ 1 ], color[ 2 ] );
00168 }
00169
00170 glBegin ( GL_LINE_LOOP );
00171 for ( int j = 0;j < cellSize;++j )
00172 {
00173 vpoints->GetPoint( cell[ j ], vp );
00174
00175 vtktransform->TransformPoint( vp, vp );
00176
00177 vtk2itk( vp, p );
00178
00179
00180 worldGeometry->Map( p, p2d );
00181
00182
00183 displayGeometry->WorldToDisplay( p2d, p2d );
00184
00185
00186
00187
00188
00189 glVertex2f( p2d[0], p2d[1] );
00190 }
00191 glEnd ();
00192 }
00193 }
00194 }
00195 }
00196
00197
00198
00199
00200
00201 vtkPolyDataMapper* mitk::PolyDataGLMapper2D::GetVtkPolyDataMapper()
00202 {
00203 return NULL;
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223 }
00224
00225
00226
00227 vtkPolyData* mitk::PolyDataGLMapper2D::GetVtkPolyData( )
00228 {
00229 vtkPolyDataMapper * polyDataMapper = GetVtkPolyDataMapper();
00230 if ( polyDataMapper == NULL )
00231 return NULL;
00232 else
00233 return polyDataMapper->GetInput();
00234 }
00235
00236
00237
00238 vtkScalarsToColors* mitk::PolyDataGLMapper2D::GetVtkLUT( )
00239 {
00240 vtkPolyDataMapper * polyDataMapper = GetVtkPolyDataMapper();
00241 if ( polyDataMapper == NULL )
00242 return NULL;
00243 else
00244 return polyDataMapper->GetLookupTable();
00245 }
00246
00247
00248 bool mitk::PolyDataGLMapper2D::IsConvertibleToVtkPolyData()
00249 {
00250 return ( GetVtkPolyDataMapper() != NULL );
00251 }
00252
00253 mitk::PolyDataGLMapper2D::PolyDataGLMapper2D()
00254 {
00255 m_Plane = vtkPlane::New();
00256 m_Cutter = vtkCutter::New();
00257
00258 m_Cutter->SetCutFunction( m_Plane );
00259 m_Cutter->GenerateValues( 1, 0, 1 );
00260
00261 m_ColorByCellData = false;
00262 m_ColorByPointData = false;
00263
00264
00265
00266
00267
00268
00269 }
00270
00271
00272
00273 mitk::PolyDataGLMapper2D::~PolyDataGLMapper2D()
00274 {}
00275