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 #include "mitkVectorImageVtkGlyphMapper3D.h"
00019
00020 #include <vtkMaskedGlyph3D.h>
00021 #include <vtkActor.h>
00022 #include <vtkPolyDataMapper.h>
00023 #include <vtkArrowSource.h>
00024 #include <vtkLineSource.h>
00025 #include <vtkImageData.h>
00026 #include <vtkPolyData.h>
00027 #include <vtkPointData.h>
00028 #include <vtkLookupTable.h>
00029 #include <mitkLookupTable.h>
00030 #include <mitkLookupTableProperty.h>
00031
00032
00033
00034
00035
00036 mitk::VectorImageVtkGlyphMapper3D::VectorImageVtkGlyphMapper3D()
00037 {
00038 m_RandomMode = true;
00039 m_UseMaskPoints = true;
00040 m_MaximumNumberOfPoints = 5000;
00041 m_GlyphType = ArrowGlyph;
00042 m_Glyph3DGenerator = vtkMaskedGlyph3D::New();
00043 m_Glyph3DMapper = vtkPolyDataMapper::New();
00044 m_Glyph3DActor = vtkActor::New();
00045 }
00046
00047 vtkProp* mitk::VectorImageVtkGlyphMapper3D::GetVtkProp(mitk::BaseRenderer* )
00048 {
00049 return m_Glyph3DActor;
00050 }
00051
00052
00053
00054
00055 mitk::VectorImageVtkGlyphMapper3D::~VectorImageVtkGlyphMapper3D()
00056 {
00057 if ( m_Glyph3DMapper != NULL )
00058 m_Glyph3DMapper->Delete();
00059 if ( m_Glyph3DGenerator != NULL )
00060 m_Glyph3DGenerator->Delete();
00061 }
00062
00063
00064
00065
00066
00067 void mitk::VectorImageVtkGlyphMapper3D::GenerateData()
00068 {
00069
00070
00071
00072 mitk::Image::Pointer mitkImage = this->GetInput();
00073 if ( mitkImage.GetPointer() == NULL )
00074 {
00075 itkWarningMacro( << "VectorImage is null !" );
00076 return ;
00077 }
00078
00079
00080
00081
00082 if ( mitkImage->GetPixelType().GetNumberOfComponents() <= 1 )
00083 {
00084 itkWarningMacro( << "VectorImage has only one scalar component!" );
00085 return ;
00086 }
00087
00088 vtkImageData* vtkImage = mitkImage->GetVtkImageData();
00089
00090
00091
00092
00093 vtkPointData* pointData = vtkImage->GetPointData();
00094 if ( pointData == NULL )
00095 {
00096 itkWarningMacro( << "vtkImage->GetPointData() returns NULL!" );
00097 return ;
00098 }
00099 if ( pointData->GetNumberOfArrays() == 0 )
00100 {
00101 itkWarningMacro( << "vtkImage->GetPointData()->GetNumberOfArrays() is 0!" );
00102 return ;
00103 }
00104 else if ( pointData->GetArrayName( 0 ) == NULL )
00105 {
00106 vtkImage->GetPointData() ->GetArray( 0 ) ->SetName( "vector" );
00107 }
00108
00109 if ( vtkImage->GetNumberOfPoints() != 0 )
00110 {
00111
00112
00113
00114
00115
00116 vtkPolyData* glyph;
00117 if ( m_GlyphType == LineGlyph )
00118 {
00119 vtkLineSource * lineSource = vtkLineSource::New();
00120 lineSource->Update();
00121 glyph = lineSource->GetOutput();
00122 }
00123 else if ( m_GlyphType == ArrowGlyph )
00124 {
00125 vtkArrowSource * arrowSource = vtkArrowSource::New();
00126 arrowSource->Update();
00127 glyph = arrowSource->GetOutput();
00128 }
00129 else
00130 {
00131
00132
00133 itkWarningMacro( << "unknown glyph type!" );
00134 vtkLineSource * lineSource = vtkLineSource::New();
00135 lineSource->Update();
00136 glyph = lineSource->GetOutput();
00137 }
00138 m_RandomMode = false;
00139 m_UseMaskPoints = false;
00140 m_MaximumNumberOfPoints = 80*80*80;
00141
00142
00143
00144 m_Glyph3DGenerator->SetSource( glyph );
00145 m_Glyph3DGenerator->SetInput( vtkImage );
00146
00147 m_Glyph3DGenerator->SetInputArrayToProcess (1, 0,0, vtkDataObject::FIELD_ASSOCIATION_POINTS , "vector");
00148
00149
00150 m_Glyph3DGenerator->OrientOn();
00151 m_Glyph3DGenerator->SetVectorModeToUseVector();
00152 m_Glyph3DGenerator->SetScaleFactor( 0.00392156862745 );
00153 m_Glyph3DGenerator->SetScaleModeToScaleByVector();
00154 m_Glyph3DGenerator->SetUseMaskPoints( m_UseMaskPoints );
00155 m_Glyph3DGenerator->SetRandomMode( m_RandomMode );
00156 m_Glyph3DGenerator->SetMaximumNumberOfPoints( m_MaximumNumberOfPoints );
00157 m_Glyph3DGenerator->Update();
00158 m_Glyph3DMapper->SetInput( m_Glyph3DGenerator->GetOutput() );
00159 m_Glyph3DActor->SetMapper( m_Glyph3DMapper );
00160
00161 if (GetDataNode()->GetProperty("LookupTable"))
00162 {
00163 mitk::LookupTable::Pointer mitkLookupTable = mitk::LookupTable::New();
00164 m_Glyph3DMapper->Update();
00165 mitkLookupTable->SetVtkLookupTable(dynamic_cast<vtkLookupTable*>(m_Glyph3DMapper->GetLookupTable()));
00166 mitk::LookupTableProperty::Pointer LookupTableProp = mitk::LookupTableProperty::New( mitkLookupTable );
00167 GetDataNode()->SetProperty( "LookupTable", LookupTableProp );
00168 }
00169 else
00170 {
00171 mitk::LookupTableProperty::Pointer mitkLutProp = dynamic_cast<mitk::LookupTableProperty*>(GetDataNode()->GetProperty("LookupTable"));
00172 if (mitkLutProp.IsNotNull())
00173 m_Glyph3DMapper->SetLookupTable( mitkLutProp->GetLookupTable()->GetVtkLookupTable() );
00174
00175 }
00176
00177
00178
00179
00180
00181 }
00182 }
00183
00184
00185
00186
00187
00188 void mitk::VectorImageVtkGlyphMapper3D::GenerateData( mitk::BaseRenderer* renderer )
00189 {
00190 if ( IsVisible( renderer ) == false )
00191 {
00192 if ( m_Glyph3DActor != NULL )
00193 m_Glyph3DActor->VisibilityOff();
00194 return ;
00195 }
00196 else
00197 {
00198 if ( m_Glyph3DActor != NULL )
00199 m_Glyph3DActor->VisibilityOn();
00200 }
00201 }
00202
00203
00204
00205
00206
00207
00208 mitk::Image* mitk::VectorImageVtkGlyphMapper3D::GetInput()
00209 {
00210 return const_cast<mitk::Image*>( dynamic_cast<mitk::Image*>( this->GetData() ) );
00211 }
00212