00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "mitkEnhancedPointSetVtkMapper3D.h"
00020
00021
00022 #include <algorithm>
00023
00024 #include "mitkDataNode.h"
00025 #include "mitkProperties.h"
00026 #include "mitkLookupTables.h"
00027
00028 #include "mitkColorProperty.h"
00029
00030
00031 #include <vtkActor.h>
00032
00033 #include <vtkAssembly.h>
00034 #include <vtkProp3DCollection.h>
00035 #include <vtkTubeFilter.h>
00036
00037 #include <vtkSphereSource.h>
00038 #include <vtkCubeSource.h>
00039 #include <vtkConeSource.h>
00040 #include <vtkCylinderSource.h>
00041 #include <vtkProperty.h>
00042 #include <vtkPolyDataMapper.h>
00043 #include <vtkTransformPolyDataFilter.h>
00044
00045 #include <vtkPolyDataAlgorithm.h>
00046
00047 #include <mitkLookupTableProperty.h>
00048
00049
00050 const mitk::PointSet* mitk::EnhancedPointSetVtkMapper3D::GetInput()
00051 {
00052 return static_cast<const mitk::PointSet * > ( GetData() );
00053 }
00054
00055 mitk::EnhancedPointSetVtkMapper3D::EnhancedPointSetVtkMapper3D()
00056 {
00057 m_Contour = vtkActor::New();
00058 m_ContourSource = vtkTubeFilter::New();
00059 m_PropAssembly = vtkAssembly::New();
00060 }
00061
00062 vtkProp* mitk::EnhancedPointSetVtkMapper3D::GetVtkProp(mitk::BaseRenderer* )
00063 {
00064 return m_PropAssembly;
00065 }
00066
00067 mitk::EnhancedPointSetVtkMapper3D::~EnhancedPointSetVtkMapper3D()
00068 {
00069 m_Contour->Delete();
00070 m_ContourSource->Delete();
00071 m_PropAssembly->Delete();
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083 }
00084
00085 void mitk::EnhancedPointSetVtkMapper3D::ReleaseGraphicsResources(vtkWindow * )
00086 {
00087
00088
00089 }
00090
00091 void mitk::EnhancedPointSetVtkMapper3D::UpdateVtkObjects()
00092 {
00093
00094 const mitk::PointSet* pointset = this->GetInput();
00095
00096 int timestep = this->GetTimestep();
00097
00098 mitk::PointSet::DataType* itkPointSet = pointset->GetPointSet( timestep );
00099 mitk::PointSet::PointsContainer* points = itkPointSet->GetPoints();
00100 mitk::PointSet::PointDataContainer* pointData = itkPointSet->GetPointData();
00101
00102 assert(points->Size() == pointData->Size());
00103
00104 mitk::PointSet::PointsIterator pIt;
00105 mitk::PointSet::PointDataIterator pdIt;
00106
00107
00108 for (ActorMap::iterator it = m_PointActors.begin(); it != m_PointActors.end(); )
00109 {
00110 PointIdentifier id = it->first;
00111 if (!points->IndexExists(id))
00112 {
00113 this->RemoveEntryFromSourceMaps(id);
00114 m_PropAssembly->GetParts()->RemoveItem(it->second.first);
00115 if (it->second.first != NULL)
00116 it->second.first->Delete();
00117 ActorMap::iterator er = it;
00118 ++it;
00119 m_PointActors.erase(er);
00120 }
00121 else
00122 ++it;
00123 }
00124
00125
00126 for (pIt = points->Begin(), pdIt = pointData->Begin(); pIt != itkPointSet->GetPoints()->End(); ++pIt, ++pdIt)
00127 {
00128 PointIdentifier pointID = pIt->Index();
00129 assert (pointID == pdIt->Index());
00130
00131 mitk::PointSet::PointType point = pIt->Value();
00132 mitk::PointSet::PointDataType data = pdIt->Value();
00133
00134 ActorMap::iterator aIt = m_PointActors.find(pointID);
00135
00136
00137 vtkActor* a = NULL;
00138 bool newPoint = (aIt == m_PointActors.end());
00139 bool specChanged = (!newPoint && data.pointSpec != aIt->second.second);
00140
00141 if (newPoint)
00142 {
00143 a = vtkActor::New();
00144 vtkPolyDataMapper* m = vtkPolyDataMapper::New();
00145 a->SetMapper(m);
00146 m->UnRegister( NULL );
00147 aIt = m_PointActors.insert(std::make_pair(pointID, std::make_pair(a, data.pointSpec))).first;
00148 m_PropAssembly->AddPart(a);
00149 }
00150 else
00151 {
00152 a = aIt->second.first;
00153 if (specChanged)
00154 {
00155 this->RemoveEntryFromSourceMaps( pointID );
00156 }
00157 }
00158 if ( newPoint || specChanged )
00159 {
00160 vtkPolyDataAlgorithm* source = NULL;
00161 switch (data.pointSpec)
00162 {
00163 case PTSTART:
00164 m_CubeSources[pointID] = vtkCubeSource::New();
00165 source = m_CubeSources[pointID];
00166 break;
00167 case PTCORNER:
00168 m_ConeSources[pointID] = vtkConeSource::New();
00169 source = m_ConeSources[pointID];
00170 break;
00171 case PTEDGE:
00172 m_CylinderSources[pointID] = vtkCylinderSource::New();
00173 source = m_CylinderSources[pointID];
00174 break;
00175 case PTUNDEFINED:
00176 case PTEND:
00177 default:
00178 m_SphereSources[pointID] = vtkSphereSource::New();
00179 source = m_SphereSources[pointID];
00180 break;
00181 }
00182 vtkPolyDataMapper* m = dynamic_cast<vtkPolyDataMapper*>(a->GetMapper());
00183 assert(m != NULL);
00184 m->SetInput(source->GetOutput());
00185 aIt->second.second = data.pointSpec;
00186 }
00187 }
00188 }
00189
00190
00191
00192 void mitk::EnhancedPointSetVtkMapper3D::GenerateData()
00193 {
00194 this->UpdateVtkObjects();
00195 }
00196
00197
00198 void mitk::EnhancedPointSetVtkMapper3D::ApplyProperties( mitk::BaseRenderer * renderer )
00199 {
00200
00201
00202 const mitk::PointSet* pointset = this->GetInput();
00203 int timestep = this->GetTimestep();
00204 mitk::PointSet::DataType* itkPointSet = pointset->GetPointSet( timestep );
00205 mitk::PointSet::PointsContainer* points = itkPointSet->GetPoints();
00206 mitk::PointSet::PointDataContainer* pointData = itkPointSet->GetPointData();
00207 assert(points->Size() == pointData->Size());
00208 mitk::PointSet::PointsIterator pIt;
00209 mitk::PointSet::PointDataIterator pdIt;
00210 mitk::DataNode* n = this->GetDataNode();
00211 assert(n != NULL);
00212
00213 for (pIt = points->Begin(), pdIt = pointData->Begin(); pIt != itkPointSet->GetPoints()->End(); ++pIt, ++pdIt)
00214 {
00215 PointIdentifier pointID = pIt->Index();
00216 assert (pointID == pdIt->Index());
00217
00218 mitk::PointSet::PointType point = pIt->Value();
00219 mitk::PointSet::PointDataType data = pdIt->Value();
00220
00221 ActorMap::iterator aIt = m_PointActors.find(pointID);
00222 assert(aIt != m_PointActors.end());
00223
00224 vtkActor* a = aIt->second.first;
00225 assert(a != NULL);
00226
00227 SetVtkMapperImmediateModeRendering(a->GetMapper());
00228
00229
00230
00231 bool pointVisibility = true;
00232 bool visValueFound = false;
00233 mitk::BaseProperty* visProp = n->GetProperty("visibility", renderer);
00234 mitk::BoolLookupTableProperty* visLTProp = dynamic_cast<mitk::BoolLookupTableProperty*>(visProp);
00235 if (visLTProp != NULL)
00236 {
00237 mitk::BoolLookupTable visLookupTable = visLTProp->GetValue();
00238
00239
00240 try
00241 {
00242 pointVisibility = visLookupTable.GetTableValue(pointID);
00243 visValueFound = true;
00244 }
00245 catch (...)
00246 {
00247 }
00248
00249 }
00250 if (visValueFound == false)
00251 {
00252 pointVisibility = n->IsVisible(renderer, "show points");
00253 }
00254 a->SetVisibility(pointVisibility);
00255
00256
00257 float opacity = 1.0;
00258 bool opValueFound = false;
00259 mitk::BaseProperty* opProp = n->GetProperty("opacity", renderer);
00260 mitk::FloatLookupTableProperty* opLTProp = dynamic_cast<mitk::FloatLookupTableProperty*>(opProp);
00261 if (opLTProp != NULL)
00262 {
00263 mitk::FloatLookupTable opLookupTable = opLTProp->GetValue();
00264
00265
00266 try
00267 {
00268 opacity = opLookupTable.GetTableValue(pointID);
00269 opValueFound = true;
00270 }
00271 catch (...)
00272 {
00273 }
00274
00275 }
00276 if (opValueFound == false)
00277 {
00278 n->GetOpacity(opacity, renderer);
00279 }
00280 a->GetProperty()->SetOpacity(opacity);
00282
00283
00284 float pointSize = 1.0;
00285 n->GetFloatProperty( "pointsize", pointSize, renderer);
00286 switch (data.pointSpec)
00287 {
00288 case PTSTART:
00289 m_CubeSources[pointID]->SetXLength(pointSize);
00290 m_CubeSources[pointID]->SetYLength(pointSize);
00291 m_CubeSources[pointID]->SetZLength(pointSize);
00292
00293 break;
00294 case PTCORNER:
00295 m_ConeSources[pointID]->SetRadius(pointSize/2);
00296 m_ConeSources[pointID]->SetHeight(pointSize);
00297 m_ConeSources[pointID]->SetResolution(2);
00298
00299 break;
00300 case PTEDGE:
00301 m_CylinderSources[pointID]->SetRadius(pointSize/2);
00302 m_CylinderSources[pointID]->SetHeight(pointSize);
00303 m_CylinderSources[pointID]->CappingOn();
00304 m_CylinderSources[pointID]->SetResolution(6);
00305
00306 break;
00307 case PTUNDEFINED:
00308 case PTEND:
00309 default:
00310 m_SphereSources[pointID]->SetRadius(pointSize/2);
00311 m_SphereSources[pointID]->SetThetaResolution(10);
00312 m_SphereSources[pointID]->SetPhiResolution(10);
00313
00314 break;
00315 }
00316
00317
00318 mitk::Point3D pos = pIt->Value();
00319 aIt->second.first->SetPosition(pos[0], pos[1], pos[2]);
00320
00321
00322 float color[3];
00323 if (data.selected)
00324 {
00325 if(!n->GetColor(color, renderer, "selectedcolor"))
00326 n->GetColor(color, renderer);
00327 }
00328 else
00329 {
00330 mitk::BaseProperty* a = n->GetProperty("colorLookupTable", renderer);
00331 mitk::LookupTableProperty* b = dynamic_cast<mitk::LookupTableProperty*>(a);
00332 if (b != NULL)
00333 {
00334 mitk::LookupTable::Pointer c = b->GetLookupTable();
00335 vtkLookupTable *d = c->GetVtkLookupTable();
00336 double *e=d->GetTableValue(pointID);
00337 color[0]=e[0];
00338 color[1]=e[1];
00339 color[2]=e[2];
00340 }
00341 else
00342 {
00343 if(!n->GetColor(color, renderer, "unselectedcolor"))
00344 n->GetColor(color, renderer);
00345 }
00346 }
00347
00348
00349
00350 a->GetProperty()->SetColor(color[0], color[1], color[2]);
00351
00352
00353 }
00354
00355
00356
00357
00358
00359
00360
00361 }
00362
00363
00364 void mitk::EnhancedPointSetVtkMapper3D::GenerateData( mitk::BaseRenderer * renderer )
00365 {
00366 ApplyProperties(renderer);
00367 }
00368
00369
00370 void mitk::EnhancedPointSetVtkMapper3D::UpdateVtkTransform(mitk::BaseRenderer * )
00371 {
00372
00373
00374
00375
00376
00377
00378
00379
00380 }
00381
00382
00383 void mitk::EnhancedPointSetVtkMapper3D::SetDefaultProperties(mitk::DataNode* node, mitk::BaseRenderer* renderer, bool overwrite)
00384 {
00385 node->AddProperty( "line width", mitk::IntProperty::New(2), renderer, overwrite );
00386 node->AddProperty( "pointsize", mitk::FloatProperty::New(1.0), renderer, overwrite);
00387 node->AddProperty( "selectedcolor", mitk::ColorProperty::New(1.0f, 1.0f, 0.0f), renderer, overwrite);
00388 node->AddProperty( "unselectedcolor", mitk::ColorProperty::New(0.5f, 1.0f, 0.5f), renderer, overwrite);
00389 node->AddProperty( "color", mitk::ColorProperty::New(1.0f, 0.0f, 0.0f), renderer, overwrite);
00390 node->AddProperty( "show contour", mitk::BoolProperty::New(false), renderer, overwrite );
00391 node->AddProperty( "contourcolor", mitk::ColorProperty::New(1.0f, 0.0f, 0.0f), renderer, overwrite);
00392 node->AddProperty( "contoursize", mitk::FloatProperty::New(0.5), renderer, overwrite );
00393 node->AddProperty( "close contour", mitk::BoolProperty::New(false), renderer, overwrite );
00394 node->AddProperty( "show points", mitk::BoolProperty::New(true), renderer, overwrite );
00395 node->AddProperty( "show label", mitk::BoolProperty::New(false), renderer, overwrite );
00396 node->AddProperty( "label", mitk::StringProperty::New("P"), renderer, overwrite );
00397 node->AddProperty( "opacity", mitk::FloatProperty::New(1.0), renderer, overwrite );
00398 Superclass::SetDefaultProperties(node, renderer, overwrite);
00399 }
00400
00401
00402 void mitk::EnhancedPointSetVtkMapper3D::DeleteVtkObject( vtkObject* o)
00403 {
00404 if (o != NULL)
00405 o->Delete();
00406 }
00407
00408
00409 void mitk::EnhancedPointSetVtkMapper3D::RemoveEntryFromSourceMaps( mitk::PointSet::PointIdentifier pointID )
00410 {
00411 ActorMap::iterator aIt = m_PointActors.find(pointID);
00412 if (aIt == m_PointActors.end())
00413 return;
00414
00415 switch (aIt->second.second)
00416 {
00417 case PTSTART:
00418 m_CubeSources[pointID]->Delete();
00419 m_CubeSources.erase(pointID);
00420 break;
00421
00422 case PTCORNER:
00423 m_ConeSources[pointID]->Delete();
00424 m_ConeSources.erase(pointID);
00425 break;
00426
00427 case PTEDGE:
00428 m_CylinderSources[pointID]->Delete();
00429 m_CylinderSources.erase(pointID);
00430 break;
00431
00432 case PTUNDEFINED:
00433 case PTEND:
00434 default:
00435 m_SphereSources[pointID]->Delete();
00436 m_SphereSources.erase(pointID);
00437 break;
00438 }
00439 }