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 "mitkMeshVtkMapper3D.h"
00019 #include "mitkDataNode.h"
00020 #include "mitkProperties.h"
00021 #include "mitkVtkPropRenderer.h"
00022
00023 #ifndef VCL_VC60
00024 #include "mitkMeshUtil.h"
00025 #endif
00026
00027 #include <vtkActor.h>
00028 #include <vtkFollower.h>
00029 #include <vtkAssembly.h>
00030 #include <vtkProp3DCollection.h>
00031 #include <vtkRenderer.h>
00032 #include <vtkPropAssembly.h>
00033
00034
00035 #include <vtkProperty.h>
00036 #include <vtkPolyDataMapper.h>
00037 #include <stdlib.h>
00038
00039 const mitk::Mesh* mitk::MeshVtkMapper3D::GetInput()
00040 {
00041 return static_cast<const mitk::Mesh * > ( GetData() );
00042 }
00043
00044 vtkProp* mitk::MeshVtkMapper3D::GetVtkProp(mitk::BaseRenderer * )
00045 {
00046 return m_PropAssembly;
00047 }
00048
00049 void mitk::MeshVtkMapper3D::UpdateVtkTransform(mitk::BaseRenderer * )
00050 {
00051 vtkLinearTransform * vtktransform =
00052 this->GetDataNode()->GetVtkTransform(this->GetTimestep());
00053
00054 m_SpheresActor->SetUserTransform(vtktransform);
00055 m_ContourActor->SetUserTransform(vtktransform);
00056 }
00057
00058 mitk::MeshVtkMapper3D::MeshVtkMapper3D()
00059 : m_PropAssembly(NULL)
00060 {
00061 m_Spheres = vtkAppendPolyData::New();
00062 m_Contour = vtkPolyData::New();
00063
00064 m_SpheresActor = vtkActor::New();
00065 m_SpheresMapper = vtkPolyDataMapper::New();
00066 m_SpheresActor->SetMapper(m_SpheresMapper);
00067
00068 m_ContourActor = vtkActor::New();
00069 m_ContourMapper = vtkPolyDataMapper::New();
00070 m_ContourActor->SetMapper(m_ContourMapper);
00071 m_ContourActor->GetProperty()->SetAmbient(1.0);
00072
00073 m_PropAssembly = vtkPropAssembly::New();
00074
00075
00076
00077 }
00078
00079 mitk::MeshVtkMapper3D::~MeshVtkMapper3D()
00080 {
00081 m_ContourActor->Delete();
00082 m_SpheresActor->Delete();
00083 m_ContourMapper->Delete();
00084 m_SpheresMapper->Delete();
00085 m_PropAssembly->Delete();
00086 m_Spheres->Delete();
00087 m_Contour->Delete();
00088 }
00089
00090 void mitk::MeshVtkMapper3D::GenerateData()
00091 {
00092 m_PropAssembly->VisibilityOn();
00093
00094 if(m_PropAssembly->GetParts()->IsItemPresent(m_SpheresActor))
00095 m_PropAssembly->RemovePart(m_SpheresActor);
00096 if(m_PropAssembly->GetParts()->IsItemPresent(m_ContourActor))
00097 m_PropAssembly->RemovePart(m_ContourActor);
00098
00099 m_Spheres->RemoveAllInputs();
00100 m_Contour->Initialize();
00101
00102 mitk::Mesh::Pointer input = const_cast<mitk::Mesh*>(this->GetInput());
00103 input->Update();
00104
00105 mitk::Mesh::DataType::Pointer itkMesh = input->GetMesh( this->GetTimestep() );
00106
00107 if ( itkMesh.GetPointer() == NULL)
00108 {
00109 m_PropAssembly->VisibilityOff();
00110 return;
00111 }
00112
00113
00114 mitk::Mesh::PointsContainer::Iterator i;
00115
00116 int j;
00117
00118 float floatRgba[4] = {1.0f,1.0f,1.0f,1.0f};
00119 vtkFloatingPointType doubleRgba[4]={1.0f,1.0f,1.0f,1.0f};
00120 mitk::Color tmpColor;
00121
00122
00123 m_DataNode->GetColor(floatRgba, NULL);
00124
00125 if (dynamic_cast<mitk::ColorProperty*>(this->GetDataNode()->GetProperty("unselectedcolor")) != NULL)
00126 {
00127 tmpColor = dynamic_cast<mitk::ColorProperty *>(this->GetDataNode()->GetProperty("unselectedcolor"))->GetValue();
00128 floatRgba[0] = tmpColor[0];
00129 floatRgba[1] = tmpColor[1];
00130 floatRgba[2] = tmpColor[2];
00131 floatRgba[3] = 1.0f;
00132 doubleRgba[0] = floatRgba[0];
00133 doubleRgba[1] = floatRgba[1];
00134 doubleRgba[2] = floatRgba[2];
00135 doubleRgba[3] = floatRgba[3];
00136 }
00137
00138 if(itkMesh->GetNumberOfPoints()>0)
00139 {
00140
00141 float pointSize = 2.0;
00142 mitk::FloatProperty::Pointer pointSizeProp = dynamic_cast<mitk::FloatProperty *>(this->GetDataNode()->GetProperty("pointsize"));
00143 if (pointSizeProp.IsNotNull())
00144 pointSize = pointSizeProp->GetValue();
00145
00146 for (j=0, i=itkMesh->GetPoints()->Begin(); i!=itkMesh->GetPoints()->End() ; i++,j++)
00147 {
00148 vtkSphereSource *sphere = vtkSphereSource::New();
00149
00150 sphere->SetRadius(pointSize);
00151 sphere->SetCenter(i.Value()[0],i.Value()[1],i.Value()[2]);
00152
00153 m_Spheres->AddInput(sphere->GetOutput());
00154 sphere->Delete();
00155 }
00156
00157
00158 m_SpheresMapper->SetInput(m_Spheres->GetOutput());
00159 m_SpheresActor->GetProperty()->SetColor(doubleRgba);
00160 m_PropAssembly->AddPart(m_SpheresActor);
00161 }
00162
00163 if(itkMesh->GetNumberOfCells()>0)
00164 {
00165
00166 #ifdef VCL_VC60
00167 itkExceptionMacro(<<"MeshVtkMapper3D currently not working for MS Visual C++ 6.0, because MeshUtils are currently not supported.");
00168 #else
00169 m_Contour = MeshUtil<mitk::Mesh::MeshType>::MeshToPolyData(itkMesh.GetPointer(), false, false, 0, NULL, m_Contour);
00170 #endif
00171
00172 if(m_Contour->GetNumberOfCells()>0)
00173 {
00174
00175 m_ContourMapper->SetInput(m_Contour);
00176 bool wireframe=true;
00177 GetDataNode()->GetVisibility(wireframe, NULL, "wireframe");
00178 if(wireframe)
00179 m_ContourActor->GetProperty()->SetRepresentationToWireframe();
00180 else
00181 m_ContourActor->GetProperty()->SetRepresentationToSurface();
00182 m_ContourActor->GetProperty()->SetColor(doubleRgba);
00183 m_PropAssembly->AddPart(m_ContourActor);
00184 }
00185 }
00186 }
00187
00188
00189 void mitk::MeshVtkMapper3D::GenerateData( mitk::BaseRenderer* renderer )
00190 {
00191 SetVtkMapperImmediateModeRendering(m_ContourMapper);
00192 SetVtkMapperImmediateModeRendering(m_SpheresMapper);
00193
00194 if(IsVisible(renderer)==false)
00195 {
00196 m_SpheresActor->VisibilityOff();
00197 m_ContourActor->VisibilityOff();
00198 return;
00199 }
00200
00201 bool makeContour = false;
00202 this->GetDataNode()->GetBoolProperty("show contour", makeContour);
00203
00204 if (makeContour)
00205 {
00206 m_ContourActor->VisibilityOn();
00207 }
00208 else
00209 {
00210 m_ContourActor->VisibilityOff();
00211 }
00212
00213 bool showPoints = true;
00214 this->GetDataNode()->GetBoolProperty("show points", showPoints);
00215 if(showPoints)
00216 {
00217 m_SpheresActor->VisibilityOn();
00218 }
00219 else
00220 {
00221 m_SpheresActor->VisibilityOff();
00222 }
00223 }
00224
00225 void mitk::MeshVtkMapper3D::ResetMapper( BaseRenderer* )
00226 {
00227 m_PropAssembly->VisibilityOff();
00228 }