14 #include "../DataManagement/mitkBoundingShapeUtil.h" 16 #include <vtkAppendPolyData.h> 17 #include <vtkCamera.h> 18 #include <vtkCubeSource.h> 19 #include <vtkDataSetMapper.h> 21 #include <vtkPolyData.h> 22 #include <vtkPolyDataMapper.h> 23 #include <vtkSphereSource.h> 24 #include <vtkTransformFilter.h> 28 class BoundingShapeVtkMapper3D::Impl
30 class LocalStorage :
public Mapper::BaseLocalStorage
34 ~LocalStorage()
override;
36 LocalStorage(
const LocalStorage &) =
delete;
37 LocalStorage &
operator=(
const LocalStorage &) =
delete;
39 std::vector<vtkSmartPointer<vtkSphereSource>> Handles;
40 vtkSmartPointer<vtkActor> Actor;
41 vtkSmartPointer<vtkActor> HandleActor;
42 vtkSmartPointer<vtkActor> SelectedHandleActor;
43 vtkSmartPointer<vtkPropAssembly> PropAssembly;
47 Impl() : DistanceFromCam(1.0)
52 for (
int i = 0; i < 6; ++i)
56 double DistanceFromCam;
57 std::vector<Handle> HandlePropertyList;
62 mitk::BoundingShapeVtkMapper3D::Impl::LocalStorage::LocalStorage()
63 : Actor(vtkSmartPointer<vtkActor>::
New()),
64 HandleActor(vtkSmartPointer<vtkActor>::
New()),
65 SelectedHandleActor(vtkSmartPointer<vtkActor>::
New()),
66 PropAssembly(vtkSmartPointer<vtkPropAssembly>::
New())
68 for (
int i = 0; i < 6; i++)
69 Handles.push_back(vtkSmartPointer<vtkSphereSource>::New());
72 mitk::BoundingShapeVtkMapper3D::Impl::LocalStorage::~LocalStorage()
78 Superclass::SetDefaultProperties(node, renderer, overwrite);
81 mitk::BoundingShapeVtkMapper3D::BoundingShapeVtkMapper3D() : m_Impl(
new Impl)
85 mitk::BoundingShapeVtkMapper3D::~BoundingShapeVtkMapper3D()
102 if (dataNode ==
nullptr)
105 bool isVisible =
false;
106 dataNode->GetBoolProperty(
"Bounding Shape.3D Rendering", isVisible, renderer);
108 actor->SetVisibility(isVisible);
110 float lineWidth = 1.0f;
111 dataNode->GetFloatProperty(
"Bounding Shape.Line.Width", lineWidth, renderer);
113 auto property = actor->GetProperty();
114 property->SetLineWidth(lineWidth);
121 if (dataNode ==
nullptr)
124 vtkCamera *camera = renderer->
GetVtkRenderer()->GetActiveCamera();
126 auto localStorage = m_Impl->LocalStorageHandler.GetLocalStorage(renderer);
127 bool needGenerateData = localStorage->GetLastGenerateDataTime() < dataNode->GetMTime();
128 double distance = camera->GetDistance();
130 if (std::abs(distance - m_Impl->DistanceFromCam) >
mitk::eps)
132 m_Impl->DistanceFromCam = distance;
133 needGenerateData =
true;
136 if (needGenerateData)
138 bool isVisible =
true;
139 dataNode->GetVisibility(isVisible, renderer);
143 localStorage->Actor->VisibilityOff();
148 auto *geometryData =
dynamic_cast<GeometryData *
>(dataNode->GetData());
149 if (geometryData ==
nullptr)
165 sqrt((p0[0] - p4[0]) * (p0[0] - p4[0]) + (p0[1] - p4[1]) * (p0[1] - p4[1]) + (p0[2] - p4[2]) * (p0[2] - p4[2]));
167 sqrt((p0[0] - p2[0]) * (p0[0] - p2[0]) + (p0[1] - p2[1]) * (p0[1] - p2[1]) + (p0[2] - p2[2]) * (p0[2] - p2[2]));
169 sqrt((p0[0] - p1[0]) * (p0[0] - p1[0]) + (p0[1] - p1[1]) * (p0[1] - p1[1]) + (p0[2] - p1[2]) * (p0[2] - p1[2]));
174 if (m_Impl->HandlePropertyList.size() == 6)
184 m_Impl->HandlePropertyList[0].SetPosition(pointLeft);
185 m_Impl->HandlePropertyList[1].SetPosition(pointRight);
186 m_Impl->HandlePropertyList[2].SetPosition(pointTop);
187 m_Impl->HandlePropertyList[3].SetPosition(pointBottom);
188 m_Impl->HandlePropertyList[4].SetPosition(pointFront);
189 m_Impl->HandlePropertyList[5].SetPosition(pointBack);
192 auto cube = vtkCubeSource::New();
193 cube->SetXLength(extent[0] / spacing[0]);
194 cube->SetYLength(extent[1] / spacing[1]);
195 cube->SetZLength(extent[2] / spacing[2]);
198 vtkSmartPointer<vtkMatrix4x4> imageTransform = geometry->GetVtkTransform()->GetMatrix();
199 auto translation = vtkSmartPointer<vtkTransform>::New();
200 translation->Translate(center[0] - imageTransform->GetElement(0, 3),
201 center[1] - imageTransform->GetElement(1, 3),
202 center[2] - imageTransform->GetElement(2, 3));
204 auto transform = vtkSmartPointer<vtkTransform>::New();
205 transform->SetMatrix(imageTransform);
206 transform->PostMultiply();
207 transform->Concatenate(translation);
211 auto transformFilter = vtkSmartPointer<vtkTransformFilter>::New();
212 transformFilter->SetInputData(cube->GetOutput());
213 transformFilter->SetTransform(transform);
214 transformFilter->Update();
217 vtkSmartPointer<vtkPolyData> polydata = transformFilter->GetPolyDataOutput();
218 if (polydata ==
nullptr)
220 localStorage->Actor->VisibilityOff();
228 if (handleSizeProperty !=
nullptr)
229 initialHandleSize = handleSizeProperty->GetValue();
231 initialHandleSize = 1.0 / 40.0;
234 ((camera->GetDistance() * std::tan(vtkMath::RadiansFromDegrees(camera->GetViewAngle()))) / 2.0) *
237 if (localStorage->PropAssembly->GetParts()->IsItemPresent(localStorage->HandleActor))
238 localStorage->PropAssembly->RemovePart(localStorage->HandleActor);
239 if (localStorage->PropAssembly->GetParts()->IsItemPresent(localStorage->Actor))
240 localStorage->PropAssembly->RemovePart(localStorage->Actor);
242 auto selectedhandlemapper = vtkSmartPointer<vtkPolyDataMapper>::New();
243 auto appendPoly = vtkSmartPointer<vtkAppendPolyData>::New();
246 dynamic_cast<mitk::IntProperty *
>(dataNode->GetProperty(
"Bounding Shape.Active Handle ID"));
249 for (
auto &handle : localStorage->Handles)
251 Point3D handlecenter = m_Impl->HandlePropertyList[i].GetPosition();
252 handle->SetCenter(handlecenter[0], handlecenter[1], handlecenter[2]);
253 handle->SetRadius(handlesize);
255 if (activeHandleId ==
nullptr)
257 appendPoly->AddInputConnection(handle->GetOutputPort());
261 if (activeHandleId->GetValue() != m_Impl->HandlePropertyList[i].GetIndex())
263 appendPoly->AddInputConnection(handle->GetOutputPort());
267 selectedhandlemapper->SetInputData(handle->GetOutput());
268 localStorage->SelectedHandleActor->SetMapper(selectedhandlemapper);
269 localStorage->SelectedHandleActor->GetProperty()->SetColor(0, 1, 0);
270 localStorage->SelectedHandleActor->GetMapper()->SetInputDataObject(handle->GetOutput());
271 localStorage->PropAssembly->AddPart(localStorage->SelectedHandleActor);
276 appendPoly->Update();
278 auto mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
279 mapper->SetInputData(polydata);
281 auto handlemapper = vtkSmartPointer<vtkPolyDataMapper>::New();
282 handlemapper->SetInputData(appendPoly->GetOutput());
284 localStorage->Actor->SetMapper(mapper);
285 localStorage->Actor->GetMapper()->SetInputDataObject(polydata);
286 localStorage->Actor->GetProperty()->SetOpacity(0.3);
289 if (selectedColor !=
nullptr)
292 localStorage->Actor->GetProperty()->SetColor(color[0], color[1], color[2]);
295 localStorage->HandleActor->SetMapper(handlemapper);
296 if (activeHandleId ==
nullptr)
298 localStorage->HandleActor->GetProperty()->SetColor(1, 1, 1);
302 localStorage->HandleActor->GetProperty()->SetColor(1, 0, 0);
305 localStorage->HandleActor->GetMapper()->SetInputDataObject(appendPoly->GetOutput());
308 this->ApplyBoundingShapeProperties(renderer, localStorage->Actor);
311 this->ApplyBoundingShapeProperties(renderer, localStorage->HandleActor);
314 this->ApplyBoundingShapeProperties(renderer, localStorage->SelectedHandleActor);
321 localStorage->Actor->VisibilityOn();
322 localStorage->HandleActor->VisibilityOn();
323 localStorage->SelectedHandleActor->VisibilityOn();
325 localStorage->PropAssembly->AddPart(localStorage->Actor);
326 localStorage->PropAssembly->AddPart(localStorage->HandleActor);
327 localStorage->PropAssembly->VisibilityOn();
329 localStorage->UpdateGenerateDataTime();
334 return m_Impl->LocalStorageHandler.GetLocalStorage(renderer)->PropAssembly;
mitk::BaseProperty * GetProperty(const char *propertyKey, const mitk::BaseRenderer *renderer=nullptr, bool fallBackOnDataProperties=true) const
Get the property (instance of BaseProperty) with key propertyKey from the PropertyList of the rendere...
void ApplyColorAndOpacityProperties(BaseRenderer *, vtkActor *) override
Apply specific color and opacity properties read from the PropertyList. Reimplemented in GLmapper (do...
vtkRenderer * GetVtkRenderer() const
void ApplyColorAndOpacityProperties(BaseRenderer *, vtkActor *) override
Apply specific color and opacity properties read from the PropertyList. Reimplemented in GLmapper (do...
virtual DataNode * GetDataNode() const
Get the DataNode containing the data to map. Method only returns valid DataNode Pointer if the mapper...
vtkProp * GetVtkProp(BaseRenderer *renderer) override
Organizes the rendering process.
DataCollection - Class to facilitate loading/accessing structured data.
std::vector< mitk::Point3D > GetCornerPoints(mitk::BaseGeometry::Pointer geometry, bool visualizationOffset)
helper function for calculating corner points of the bounding object from a given geometry ...
BaseLocalStorage & operator=(const BaseLocalStorage &)=delete
std::vector< int > GetHandleIndices(int index)
The ColorProperty class RGB color property.
void ApplyBoundingShapeProperties(BaseRenderer *renderer, vtkActor *)
Data class only having a BaseGeometry but not containing any specific data.
Point< ScalarType, 3 > Point3D
itk::RGBPixel< float > Color
Color Standard RGB color typedef (float)
void GenerateDataForRenderer(BaseRenderer *renderer) override
Generate the data needed for rendering into renderer.
const float selectedColor[]
MITKCORE_EXPORT const ScalarType eps
static void SetDefaultProperties(DataNode *node, BaseRenderer *renderer=nullptr, bool overwrite=false)
mitk::Point3D CalcAvgPoint(mitk::Point3D a, mitk::Point3D b)
helper function for calculating the average of two points
Class for nodes of the DataTree.