From b3ffe905334f6975d6e8ae7f8bd27e4878df78ac Mon Sep 17 00:00:00 2001 From: kradchen Date: Thu, 23 Oct 2025 15:51:09 +0800 Subject: [PATCH] fix: fix world model point map bug --- .../Rendering/Measure/AngleAnnotationActor.cpp | 15 ++++++--------- .../Rendering/Measure/OpenPolyAnnotationActor.cpp | 15 ++++++++++----- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/src/src/Rendering/Measure/AngleAnnotationActor.cpp b/src/src/Rendering/Measure/AngleAnnotationActor.cpp index f45be10..01eadc6 100644 --- a/src/src/Rendering/Measure/AngleAnnotationActor.cpp +++ b/src/src/Rendering/Measure/AngleAnnotationActor.cpp @@ -137,9 +137,8 @@ void AngleAnnotationActor::onMeasureMouseMove(vtkRenderWindowInteractor *iren) { int y = iren->GetEventPosition()[1]; vtkRenderer *renderer = iren->FindPokedRenderer(x, y); if (!renderer) return; - renderer->SetDisplayPoint(x, y, 0.0); - renderer->DisplayToWorld(); - double *p = renderer->GetWorldPoint(); + double p[3]={0.0,0.0,0.0}; + MapScreenPointToWorld(x, y,renderer,p); if (this->placedPointCount == 1) { controlP2->SetWorldPosition(p); this->SetWorldPosition2(p); @@ -155,9 +154,8 @@ bool AngleAnnotationActor::onMeasureLeftButtonDown(vtkRenderWindowInteractor *ir int y = iren->GetEventPosition()[1]; vtkRenderer *renderer = iren->FindPokedRenderer(x, y); if (!renderer) return false; - renderer->SetDisplayPoint(x, y, 0.0); - renderer->DisplayToWorld(); - double *p = renderer->GetWorldPoint(); + double p[3]={0.0,0.0,0.0}; + MapScreenPointToWorld(x, y,renderer,p); if (this->placedPointCount == 0) { controlP1->SetWorldPosition(p); controlP2->SetWorldPosition(p); @@ -184,9 +182,8 @@ bool AngleAnnotationActor::onMeasureLeftButtonUp(vtkRenderWindowInteractor *iren int y = iren->GetEventPosition()[1]; vtkRenderer *renderer = iren->FindPokedRenderer(x, y); if (!renderer) return true; - renderer->SetDisplayPoint(x, y, 0.0); - renderer->DisplayToWorld(); - double *p = renderer->GetWorldPoint(); + double p[3]={0.0,0.0,0.0}; + MapScreenPointToWorld(x, y,renderer,p); if (this->placedPointCount == 1) { controlP2->SetWorldPosition(p); this->SetWorldPosition2(p); diff --git a/src/src/Rendering/Measure/OpenPolyAnnotationActor.cpp b/src/src/Rendering/Measure/OpenPolyAnnotationActor.cpp index 3cc8631..b0bd44f 100644 --- a/src/src/Rendering/Measure/OpenPolyAnnotationActor.cpp +++ b/src/src/Rendering/Measure/OpenPolyAnnotationActor.cpp @@ -69,9 +69,8 @@ bool OpenPolyAnnotationActor::onMeasureLeftButtonDown(vtkRenderWindowInteractor int y = iren->GetEventPosition()[1]; vtkRenderer *renderer = iren->FindPokedRenderer(x, y); if (!renderer) return false; - renderer->SetDisplayPoint(x, y, 0.0); - renderer->DisplayToWorld(); - double *p = renderer->GetWorldPoint(); + double p[3]={0.0,0.0,0.0}; + MapScreenPointToWorld(x, y,renderer,p); auto controlP = ControlPointRActor::New(); controlP->SetWorldPosition(p); @@ -189,12 +188,18 @@ void OpenPolyAnnotationActor::UpdatePerimeterAndAreaText() double *rp = renderPoints->GetPoint(0); text->SetDisplayPosition(rp[0] + 10, rp[1] - 20); double distance = 0.0; - for (vtkIdType i = 1; i < BaseDataPoints->GetNumberOfPoints(); ++i) + for (vtkIdType i = 0; i < BaseDataPoints->GetNumberOfPoints(); ++i) { double p1[3] = {0.}; double p2[3] = {0.}; BaseDataPoints->GetPoint(i, p1); - BaseDataPoints->GetPoint(i - 1, p2); + if (i+1GetNumberOfPoints()) + { + BaseDataPoints->GetPoint(i + 1, p2); + } + else if (Closed){ + BaseDataPoints->GetPoint(0, p2); + } distance += std::sqrt(vtkMath::Distance2BetweenPoints(p1, p2)); }