Page MenuHomePhabricator

PointSetVtkMapper2D-patch.diff

Authored By
Lafebre
Jul 8 2021, 7:10 PM
Size
5 KB
Referenced Files
None
Subscribers
None

PointSetVtkMapper2D-patch.diff

diff --git a/Modules/Core/include/mitkPointSetVtkMapper2D.h b/Modules/Core/include/mitkPointSetVtkMapper2D.h
index e447f6fe58..f476acf75e 100644
--- a/Modules/Core/include/mitkPointSetVtkMapper2D.h
+++ b/Modules/Core/include/mitkPointSetVtkMapper2D.h
@@ -207,6 +207,9 @@ namespace mitk
* displayed e.g. toggle visiblity of the propassembly */
void ResetMapper(BaseRenderer *renderer) override;
+ /** \brief Determine a renderer's resolution in mm per screen pixel. */
+ double GetScreenResolution(const mitk::BaseRenderer *renderer) const;
+
/* \brief Fills the vtk objects, thus it is only called when the point set has been changed.
* This function iterates over the input point set and determines the glyphs which lie in a specific
* range around the current slice. Those glyphs are rendered using a specific shape defined in vtk glyph source
@@ -233,6 +236,7 @@ namespace mitk
int m_IDShapeProperty; // ID for mitkPointSetShape Enumeration Property "Pointset.2D.shape"
bool m_FillShape; // "Pointset.2D.fill shape" property
float m_DistanceToPlane; // "Pointset.2D.distance to plane" property
+ bool m_FixedSizeOnScreen; // "Pointset.2D.fixed size on screen" property
};
} // namespace mitk
diff --git a/Modules/Core/src/Rendering/mitkPointSetVtkMapper2D.cpp b/Modules/Core/src/Rendering/mitkPointSetVtkMapper2D.cpp
index 81ad158b38..8f5441d357 100644
--- a/Modules/Core/src/Rendering/mitkPointSetVtkMapper2D.cpp
+++ b/Modules/Core/src/Rendering/mitkPointSetVtkMapper2D.cpp
@@ -109,7 +109,8 @@ mitk::PointSetVtkMapper2D::PointSetVtkMapper2D()
m_Point2DSize(6),
m_IDShapeProperty(mitk::PointSetShapeProperty::CROSS),
m_FillShape(false),
- m_DistanceToPlane(4.0f)
+ m_DistanceToPlane(4.0f),
+ m_FixedSizeOnScreen(false)
{
}
@@ -272,6 +273,7 @@ void mitk::PointSetVtkMapper2D::CreateVTKRenderObjects(mitk::BaseRenderer *rende
mitk::Point2D preLastPt2d = pt2d; // projected_p in display coordinates before lastPt2
const mitk::PlaneGeometry *geo2D = renderer->GetCurrentWorldPlaneGeometry();
+ double resolution = this->GetScreenResolution(renderer);
vtkLinearTransform *dataNodeTransform = input->GetGeometry()->GetVtkTransform();
@@ -306,6 +308,11 @@ void mitk::PointSetVtkMapper2D::CreateVTKRenderObjects(mitk::BaseRenderer *rende
// compute distance to current plane
float dist = geo2D->Distance(point);
+ // measure distance in screen pixel units if requested
+ if (m_FixedSizeOnScreen)
+ {
+ dist /= resolution;
+ }
// draw markers on slices a certain distance away from the points
// location according to the tolerance threshold (m_DistanceToPlane)
@@ -316,13 +323,15 @@ void mitk::PointSetVtkMapper2D::CreateVTKRenderObjects(mitk::BaseRenderer *rende
{
ls->m_SelectedPoints->InsertNextPoint(point[0], point[1], point[2]);
// point is scaled according to its distance to the plane
- ls->m_SelectedScales->InsertNextTuple3(std::max(0.0f, m_Point2DSize - (2 * dist)), 0, 0);
+ ls->m_SelectedScales->InsertNextTuple3(
+ std::max(0.0f, m_Point2DSize - (2 * dist)), 0, 0);
}
else
{
ls->m_UnselectedPoints->InsertNextPoint(point[0], point[1], point[2]);
// point is scaled according to its distance to the plane
- ls->m_UnselectedScales->InsertNextTuple3(std::max(0.0f, m_Point2DSize - (2 * dist)), 0, 0);
+ ls->m_UnselectedScales->InsertNextTuple3(
+ std::max(0.0f, m_Point2DSize - (2 * dist)), 0, 0);
}
//---- LABEL -----//
@@ -531,6 +540,10 @@ void mitk::PointSetVtkMapper2D::CreateVTKRenderObjects(mitk::BaseRenderer *rende
// apply transform of current plane to glyphs
ls->m_UnselectedGlyph3D->SetSourceConnection(transformFilterU->GetOutputPort());
ls->m_UnselectedGlyph3D->SetInputData(ls->m_VtkUnselectedPointListPolyData);
+ if (m_FixedSizeOnScreen)
+ {
+ ls->m_UnselectedGlyph3D->SetScaleFactor(resolution);
+ }
ls->m_UnselectedGlyph3D->SetScaleModeToScaleByVector();
ls->m_UnselectedGlyph3D->SetVectorModeToUseVector();
@@ -557,6 +570,10 @@ void mitk::PointSetVtkMapper2D::CreateVTKRenderObjects(mitk::BaseRenderer *rende
// apply transform of current plane to glyphs
ls->m_SelectedGlyph3D->SetSourceConnection(transformFilterS->GetOutputPort());
ls->m_SelectedGlyph3D->SetInputData(ls->m_VtkSelectedPointListPolyData);
+ if (m_FixedSizeOnScreen)
+ {
+ ls->m_SelectedGlyph3D->SetScaleFactor(resolution);
+ }
ls->m_SelectedGlyph3D->SetScaleModeToScaleByVector();
ls->m_SelectedGlyph3D->SetVectorModeToUseVector();
@@ -614,6 +631,7 @@ void mitk::PointSetVtkMapper2D::GenerateDataForRenderer(mitk::BaseRenderer *rend
}
node->GetBoolProperty("Pointset.2D.fill shape", m_FillShape, renderer);
node->GetFloatProperty("Pointset.2D.distance to plane", m_DistanceToPlane, renderer);
+ node->GetBoolProperty("Pointset.2D.fixed size on screen", m_FixedSizeOnScreen, renderer);
mitk::PointSetShapeProperty::Pointer shape =
dynamic_cast<mitk::PointSetShapeProperty *>(this->GetDataNode()->GetProperty("Pointset.2D.shape", renderer));
@@ -747,3 +765,21 @@ void mitk::PointSetVtkMapper2D::SetDefaultProperties(mitk::DataNode *node, mitk:
Superclass::SetDefaultProperties(node, renderer, overwrite);
}
+
+double mitk::PointSetVtkMapper2D::GetScreenResolution(
+ const mitk::BaseRenderer *renderer) const
+{
+ Point2D pD1, pD2;
+ pD1[0] = 0;
+ pD1[1] = 0;
+ pD2[0] = 0;
+ pD2[1] = 1;
+
+ // Calculate world coordinates of in-plane screen pixels (0, 0) and (0, 1).
+ Point3D pW1, pW2;
+ renderer->DisplayToWorld(pD1, pW1);
+ renderer->DisplayToWorld(pD2, pW2);
+
+ // For 2D renderers, the distance between these points is the screen resolution.
+ return pW1.EuclideanDistanceTo(pW2);
+}

File Metadata

Mime Type
text/x-diff
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
1392885
Default Alt Text
PointSetVtkMapper2D-patch.diff (5 KB)

Event Timeline