diff --git a/Modules/ROI/files.cmake b/Modules/ROI/files.cmake index 9880797ab8..1de29e9b16 100644 --- a/Modules/ROI/files.cmake +++ b/Modules/ROI/files.cmake @@ -1,15 +1,17 @@ set(H_FILES include/mitkROI.h include/mitkROIMapper2D.h include/mitkROIMapper3D.h + include/mitkROIMapperLocalStorage.h src/mitkROIMapperHelper.h src/mitkROIObjectFactory.h ) set(CPP_FILES mitkROI.cpp mitkROIMapper2D.cpp mitkROIMapper3D.cpp mitkROIMapperHelper.cpp + mitkROIMapperLocalStorage.cpp mitkROIObjectFactory.cpp ) diff --git a/Modules/ROI/include/mitkROIMapper2D.h b/Modules/ROI/include/mitkROIMapper2D.h index 0e8323592d..173915aaec 100644 --- a/Modules/ROI/include/mitkROIMapper2D.h +++ b/Modules/ROI/include/mitkROIMapper2D.h @@ -1,66 +1,58 @@ /*============================================================================ The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center (DKFZ) All rights reserved. Use of this source code is governed by a 3-clause BSD license that can be found in the LICENSE file. ============================================================================*/ #ifndef mitkROIMapper2D_h #define mitkROIMapper2D_h #include <mitkLocalStorageHandler.h> +#include <mitkROIMapperLocalStorage.h> #include <mitkVtkMapper.h> #include <MitkROIExports.h> -template <class T> -class vtkSmartPointer; - -class vtkPropAssembly; - namespace mitk { class MITKROI_EXPORT ROIMapper2D : public VtkMapper { - class LocalStorage : public Mapper::BaseLocalStorage + class LocalStorage : public ROIMapperLocalStorage { public: LocalStorage(); ~LocalStorage() override; - vtkPropAssembly* GetPropAssembly() const; - void SetPropAssembly(vtkPropAssembly* propAssembly); - const PlaneGeometry* GetLastPlaneGeometry() const; void SetLastPlaneGeometry(const PlaneGeometry* planeGeometry); protected: - vtkSmartPointer<vtkPropAssembly> m_PropAssembly; PlaneGeometry::ConstPointer m_LastPlaneGeometry; }; public: static void SetDefaultProperties(DataNode* node, BaseRenderer* renderer = nullptr, bool override = false); mitkClassMacro(ROIMapper2D, VtkMapper) itkFactorylessNewMacro(Self) vtkProp *GetVtkProp(mitk::BaseRenderer *renderer) override; protected: ROIMapper2D(); ~ROIMapper2D() override; void GenerateDataForRenderer(BaseRenderer* renderer) override; void ApplyColorAndOpacityProperties(BaseRenderer* renderer, vtkActor* actor) override; private: LocalStorageHandler<LocalStorage> m_LocalStorageHandler; }; } #endif diff --git a/Modules/ROI/include/mitkROIMapper3D.h b/Modules/ROI/include/mitkROIMapper3D.h index a4bb8f8618..e57d3b148a 100644 --- a/Modules/ROI/include/mitkROIMapper3D.h +++ b/Modules/ROI/include/mitkROIMapper3D.h @@ -1,60 +1,52 @@ /*============================================================================ The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center (DKFZ) All rights reserved. Use of this source code is governed by a 3-clause BSD license that can be found in the LICENSE file. ============================================================================*/ #ifndef mitkROIMapper3D_h #define mitkROIMapper3D_h #include <mitkLocalStorageHandler.h> +#include <mitkROIMapperLocalStorage.h> #include <mitkVtkMapper.h> #include <MitkROIExports.h> -#include <vtkPropAssembly.h> -#include <vtkSmartPointer.h> - namespace mitk { class MITKROI_EXPORT ROIMapper3D : public VtkMapper { - class LocalStorage : public Mapper::BaseLocalStorage + class LocalStorage : public ROIMapperLocalStorage { public: LocalStorage(); ~LocalStorage() override; - - vtkPropAssembly* GetPropAssembly() const; - void SetPropAssembly(vtkPropAssembly* propAssembly); - - protected: - vtkSmartPointer<vtkPropAssembly> m_PropAssembly; }; public: static void SetDefaultProperties(DataNode* node, BaseRenderer* renderer = nullptr, bool override = false); mitkClassMacro(ROIMapper3D, VtkMapper) itkFactorylessNewMacro(Self) vtkProp *GetVtkProp(mitk::BaseRenderer *renderer) override; protected: ROIMapper3D(); ~ROIMapper3D() override; void GenerateDataForRenderer(BaseRenderer* renderer) override; void ApplyColorAndOpacityProperties(BaseRenderer* renderer, vtkActor* actor) override; private: LocalStorageHandler<LocalStorage> m_LocalStorageHandler; }; } #endif diff --git a/Modules/ROI/include/mitkROIMapperLocalStorage.h b/Modules/ROI/include/mitkROIMapperLocalStorage.h new file mode 100644 index 0000000000..fddf8bfe67 --- /dev/null +++ b/Modules/ROI/include/mitkROIMapperLocalStorage.h @@ -0,0 +1,43 @@ +/*============================================================================ + +The Medical Imaging Interaction Toolkit (MITK) + +Copyright (c) German Cancer Research Center (DKFZ) +All rights reserved. + +Use of this source code is governed by a 3-clause BSD license that can be +found in the LICENSE file. + +============================================================================*/ + +#ifndef mitkROIMapperLocalStorage_h +#define mitkROIMapperLocalStorage_h + +#include <mitkMapper.h> + +template <class T> +class vtkSmartPointer; + +class vtkPropAssembly; + +namespace mitk +{ + class ROIMapperLocalStorage : public Mapper::BaseLocalStorage + { + public: + ROIMapperLocalStorage(); + ~ROIMapperLocalStorage() override; + + vtkPropAssembly* GetPropAssembly() const; + void SetPropAssembly(vtkPropAssembly* propAssembly); + + TimePointType GetLastTimePoint() const; + void SetLastTimePoint(TimePointType timePoint); + + protected: + vtkSmartPointer<vtkPropAssembly> m_PropAssembly; + TimePointType m_LastTimePoint; + }; +} + +#endif diff --git a/Modules/ROI/src/mitkROIMapper2D.cpp b/Modules/ROI/src/mitkROIMapper2D.cpp index c7784d6969..f05c3fb550 100644 --- a/Modules/ROI/src/mitkROIMapper2D.cpp +++ b/Modules/ROI/src/mitkROIMapper2D.cpp @@ -1,210 +1,199 @@ /*============================================================================ The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center (DKFZ) All rights reserved. Use of this source code is governed by a 3-clause BSD license that can be found in the LICENSE file. ============================================================================*/ #include <mitkROIMapper2D.h> #include "mitkROIMapperHelper.h" #include <vtkCubeSource.h> #include <vtkPlane.h> #include <vtkPolyDataMapper.h> #include <vtkPolyDataPlaneCutter.h> #include <vtkPropAssembly.h> #include <boost/algorithm/string.hpp> #include <regex> namespace { std::string GetName(const mitk::ROI::Element& roi) { auto property = roi.GetConstProperty("name"); if (property.IsNotNull()) { auto nameProperty = dynamic_cast<const mitk::StringProperty*>(property.GetPointer()); if (nameProperty != nullptr) return nameProperty->GetValue(); } return ""; } mitk::Point3D GetBottomLeftPoint(vtkPoints* points, mitk::BaseRenderer* renderer) { mitk::Point3D point = points->GetPoint(0); mitk::Point2D bottomLeftDisplayPoint; renderer->WorldToDisplay(point, bottomLeftDisplayPoint); auto numPoints = points->GetNumberOfPoints(); mitk::Point2D displayPoint; for (decltype(numPoints) i = 1; i < numPoints; ++i) { point.FillPoint(points->GetPoint(i)); renderer->WorldToDisplay(point, displayPoint); bottomLeftDisplayPoint[0] = std::min(bottomLeftDisplayPoint[0], displayPoint[0]); bottomLeftDisplayPoint[1] = std::min(bottomLeftDisplayPoint[1], displayPoint[1]); } renderer->DisplayToWorld(bottomLeftDisplayPoint, point); return point; } } mitk::ROIMapper2D::LocalStorage::LocalStorage() - : m_PropAssembly(vtkSmartPointer<vtkPropAssembly>::New()) { } mitk::ROIMapper2D::LocalStorage::~LocalStorage() { } -vtkPropAssembly* mitk::ROIMapper2D::LocalStorage::GetPropAssembly() const -{ - return m_PropAssembly; -} - -void mitk::ROIMapper2D::LocalStorage::SetPropAssembly(vtkPropAssembly* propAssembly) -{ - m_PropAssembly = propAssembly; -} - const mitk::PlaneGeometry* mitk::ROIMapper2D::LocalStorage::GetLastPlaneGeometry() const { return m_LastPlaneGeometry; } void mitk::ROIMapper2D::LocalStorage::SetLastPlaneGeometry(const PlaneGeometry* planeGeometry) { m_LastPlaneGeometry = planeGeometry; } void mitk::ROIMapper2D::SetDefaultProperties(DataNode* node, BaseRenderer* renderer, bool override) { Superclass::SetDefaultProperties(node, renderer, override); ROIMapperHelper::SetDefaultProperties(node, renderer, override); } mitk::ROIMapper2D::ROIMapper2D() { } mitk::ROIMapper2D::~ROIMapper2D() { } void mitk::ROIMapper2D::GenerateDataForRenderer(BaseRenderer* renderer) { const auto* dataNode = this->GetDataNode(); if (dataNode == nullptr) return; auto* localStorage = m_LocalStorageHandler.GetLocalStorage(renderer); const auto* planeGeometry = renderer->GetCurrentWorldPlaneGeometry(); if (localStorage->GetLastPlaneGeometry() != nullptr && localStorage->GetLastPlaneGeometry()->IsOnPlane(planeGeometry) && localStorage->GetLastGenerateDataTime() >= dataNode->GetMTime()) { return; } localStorage->SetLastPlaneGeometry(planeGeometry->Clone()); const auto* data = dynamic_cast<ROI*>(this->GetData()); if (data == nullptr) return; auto propAssembly = vtkSmartPointer<vtkPropAssembly>::New(); if (dataNode->IsVisible(renderer)) { const auto* geometry = data->GetGeometry(); const auto halfSpacing = geometry->GetSpacing() * 0.5f; auto plane = vtkSmartPointer<vtkPlane>::New(); plane->SetOrigin(planeGeometry->GetOrigin().data()); plane->SetNormal(planeGeometry->GetNormal().data()); for (const auto& roi : *data) { Point3D min; geometry->IndexToWorld(roi.Min, min); min -= halfSpacing; Point3D max; geometry->IndexToWorld(roi.Max, max); max += halfSpacing; auto cube = vtkSmartPointer<vtkCubeSource>::New(); cube->SetBounds(min[0], max[0], min[1], max[1], min[2], max[2]); auto cutter = vtkSmartPointer<vtkPolyDataPlaneCutter>::New(); cutter->SetInputConnection(cube->GetOutputPort()); cutter->SetPlane(plane); cutter->Update(); auto* slicePolyData = cutter->GetOutput(); if (slicePolyData->GetNumberOfLines() == 0) continue; auto mapper = vtkSmartPointer<vtkPolyDataMapper>::New(); mapper->SetInputConnection(cutter->GetOutputPort()); auto actor = vtkSmartPointer<vtkActor>::New(); actor->SetMapper(mapper); this->ApplyColorAndOpacityProperties(renderer, actor); ROIMapperHelper::ApplyIndividualProperties(roi.Properties, actor); propAssembly->AddPart(actor); if (std::string caption; dataNode->GetStringProperty("caption", caption, renderer)) { caption = ROIMapperHelper::ParseCaption(caption, roi); if (!caption.empty()) { auto bottomLeftPoint = GetBottomLeftPoint(slicePolyData->GetPoints(), renderer); auto captionActor = ROIMapperHelper::CreateCaptionActor(caption, bottomLeftPoint, actor->GetProperty(), dataNode, renderer); propAssembly->AddPart(captionActor); } } } } localStorage->SetPropAssembly(propAssembly); localStorage->UpdateGenerateDataTime(); } void mitk::ROIMapper2D::ApplyColorAndOpacityProperties(BaseRenderer* renderer, vtkActor* actor) { auto* property = actor->GetProperty(); float opacity = 1.0f; this->GetOpacity(opacity, renderer); property->SetOpacity(opacity); } vtkProp* mitk::ROIMapper2D::GetVtkProp(BaseRenderer* renderer) { return m_LocalStorageHandler.GetLocalStorage(renderer)->GetPropAssembly(); } diff --git a/Modules/ROI/src/mitkROIMapper3D.cpp b/Modules/ROI/src/mitkROIMapper3D.cpp index f68813ac34..be63054740 100644 --- a/Modules/ROI/src/mitkROIMapper3D.cpp +++ b/Modules/ROI/src/mitkROIMapper3D.cpp @@ -1,123 +1,112 @@ /*============================================================================ The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center (DKFZ) All rights reserved. Use of this source code is governed by a 3-clause BSD license that can be found in the LICENSE file. ============================================================================*/ #include <mitkROIMapper3D.h> #include <mitkROI.h> #include "mitkROIMapperHelper.h" #include <vtkActor.h> #include <vtkCubeSource.h> #include <vtkPolyDataMapper.h> #include <vtkSmartPointer.h> mitk::ROIMapper3D::LocalStorage::LocalStorage() - : m_PropAssembly(vtkSmartPointer<vtkPropAssembly>::New()) { } mitk::ROIMapper3D::LocalStorage::~LocalStorage() { } -vtkPropAssembly* mitk::ROIMapper3D::LocalStorage::GetPropAssembly() const -{ - return m_PropAssembly; -} - -void mitk::ROIMapper3D::LocalStorage::SetPropAssembly(vtkPropAssembly* propAssembly) -{ - m_PropAssembly = propAssembly; -} - void mitk::ROIMapper3D::SetDefaultProperties(DataNode* node, BaseRenderer* renderer, bool override) { Superclass::SetDefaultProperties(node, renderer, override); ROIMapperHelper::SetDefaultProperties(node, renderer, override); } mitk::ROIMapper3D::ROIMapper3D() { } mitk::ROIMapper3D::~ROIMapper3D() { } void mitk::ROIMapper3D::GenerateDataForRenderer(BaseRenderer* renderer) { const auto* dataNode = this->GetDataNode(); if (dataNode == nullptr) return; auto* localStorage = m_LocalStorageHandler.GetLocalStorage(renderer); if (localStorage->GetLastGenerateDataTime() >= dataNode->GetMTime()) return; const auto* data = dynamic_cast<ROI*>(this->GetData()); if (data == nullptr) return; auto propAssembly = vtkSmartPointer<vtkPropAssembly>::New(); if (dataNode->IsVisible(renderer)) { const auto* geometry = data->GetGeometry(); const auto halfSpacing = geometry->GetSpacing() * 0.5f; for (const auto& roi : *data) { Point3D min; geometry->IndexToWorld(roi.Min, min); min -= halfSpacing; Point3D max; geometry->IndexToWorld(roi.Max, max); max += halfSpacing; auto cube = vtkSmartPointer<vtkCubeSource>::New(); cube->SetBounds(min[0], max[0], min[1], max[1], min[2], max[2]); cube->Update(); auto mapper = vtkSmartPointer<vtkPolyDataMapper>::New(); mapper->SetInputConnection(cube->GetOutputPort()); auto actor = vtkSmartPointer<vtkActor>::New(); actor->SetMapper(mapper); this->ApplyColorAndOpacityProperties(renderer, actor); ROIMapperHelper::ApplyIndividualProperties(roi.Properties, actor); propAssembly->AddPart(actor); } } localStorage->SetPropAssembly(propAssembly); localStorage->UpdateGenerateDataTime(); } void mitk::ROIMapper3D::ApplyColorAndOpacityProperties(BaseRenderer* renderer, vtkActor* actor) { auto* property = actor->GetProperty(); float opacity = 1.0f; this->GetOpacity(opacity, renderer); property->SetOpacity(opacity); } vtkProp* mitk::ROIMapper3D::GetVtkProp(BaseRenderer* renderer) { return m_LocalStorageHandler.GetLocalStorage(renderer)->GetPropAssembly(); } diff --git a/Modules/ROI/src/mitkROIMapperLocalStorage.cpp b/Modules/ROI/src/mitkROIMapperLocalStorage.cpp new file mode 100644 index 0000000000..4c57abe8df --- /dev/null +++ b/Modules/ROI/src/mitkROIMapperLocalStorage.cpp @@ -0,0 +1,46 @@ +/*============================================================================ + +The Medical Imaging Interaction Toolkit (MITK) + +Copyright (c) German Cancer Research Center (DKFZ) +All rights reserved. + +Use of this source code is governed by a 3-clause BSD license that can be +found in the LICENSE file. + +============================================================================*/ + +#include <mitkROIMapperLocalStorage.h> + +#include <vtkPropAssembly.h> +#include <vtkSmartPointer.h> + +mitk::ROIMapperLocalStorage::ROIMapperLocalStorage() + : m_PropAssembly(vtkSmartPointer<vtkPropAssembly>::New()), + m_LastTimePoint(0.0) +{ +} + +mitk::ROIMapperLocalStorage::~ROIMapperLocalStorage() +{ +} + +vtkPropAssembly* mitk::ROIMapperLocalStorage::GetPropAssembly() const +{ + return m_PropAssembly; +} + +void mitk::ROIMapperLocalStorage::SetPropAssembly(vtkPropAssembly* propAssembly) +{ + m_PropAssembly = propAssembly; +} + +mitk::TimePointType mitk::ROIMapperLocalStorage::GetLastTimePoint() const +{ + return m_LastTimePoint; +} + +void mitk::ROIMapperLocalStorage::SetLastTimePoint(TimePointType timePoint) +{ + m_LastTimePoint = timePoint; +}