From fe3428047190ccf46cb876b317cffa6ce3c81b80 Mon Sep 17 00:00:00 2001 From: kradchen Date: Tue, 22 Jul 2025 15:58:40 +0800 Subject: [PATCH] fix: fix Volume measure selected delete bug --- .../EllipsoidVolumeAnnotationActor.cpp | 10 ++++++++++ .../Measure/EllipsoidVolumeAnnotationActor.h | 1 + src/src/Rendering/Measure/Measure.h | 2 ++ src/src/Rendering/Viewer/DICOMImageViewer.cxx | 19 ++++--------------- 4 files changed, 17 insertions(+), 15 deletions(-) diff --git a/src/src/Rendering/Measure/EllipsoidVolumeAnnotationActor.cpp b/src/src/Rendering/Measure/EllipsoidVolumeAnnotationActor.cpp index a40a2c0..e8a1f86 100644 --- a/src/src/Rendering/Measure/EllipsoidVolumeAnnotationActor.cpp +++ b/src/src/Rendering/Measure/EllipsoidVolumeAnnotationActor.cpp @@ -29,6 +29,9 @@ EllipsoidVolumeAnnotationActor::EllipsoidVolumeAnnotationActor() : DraggableActo mRuler1->SetDistanceName(mRuler1->GetDistanceName()+"1"); mRuler2->SetDistanceName(mRuler2->GetDistanceName()+"2"); mRuler3->SetDistanceName(mRuler3->GetDistanceName()+"3"); + mRuler1->SetcontrolledActor(this); + mRuler2->SetcontrolledActor(this); + mRuler3->SetcontrolledActor(this); mRuler1->AddObserver(MeasureChangedEvent,this,&EllipsoidVolumeAnnotationActor::measureCallback); mRuler2->AddObserver(MeasureChangedEvent,this,&EllipsoidVolumeAnnotationActor::measureCallback); mRuler3->AddObserver(MeasureChangedEvent,this,&EllipsoidVolumeAnnotationActor::measureCallback); @@ -36,6 +39,13 @@ EllipsoidVolumeAnnotationActor::EllipsoidVolumeAnnotationActor() : DraggableActo } EllipsoidVolumeAnnotationActor::~EllipsoidVolumeAnnotationActor() { + mRuler1->SetcontrolledActor(nullptr); + mRuler2->SetcontrolledActor(nullptr); + mRuler3->SetcontrolledActor(nullptr); + mRuler1->SetRenderer(nullptr); + mRuler2->SetRenderer(nullptr); + mRuler3->SetRenderer(nullptr); + SetRenderer(nullptr); if (mRuler1)mRuler1->Delete(); if (mRuler2)mRuler2->Delete(); if (mRuler3)mRuler3->Delete(); diff --git a/src/src/Rendering/Measure/EllipsoidVolumeAnnotationActor.h b/src/src/Rendering/Measure/EllipsoidVolumeAnnotationActor.h index 0c278c8..89f1798 100644 --- a/src/src/Rendering/Measure/EllipsoidVolumeAnnotationActor.h +++ b/src/src/Rendering/Measure/EllipsoidVolumeAnnotationActor.h @@ -34,6 +34,7 @@ public: void ClearRenderingState(vtkRenderer* aRenderer = nullptr); + virtual bool Removable() { return false; } protected: EllipsoidVolumeAnnotationActor(); diff --git a/src/src/Rendering/Measure/Measure.h b/src/src/Rendering/Measure/Measure.h index d5a3dfb..82cb80f 100644 --- a/src/src/Rendering/Measure/Measure.h +++ b/src/src/Rendering/Measure/Measure.h @@ -64,6 +64,8 @@ public: virtual void ForceDelete() {}; virtual bool Valid() { return true; } + + virtual bool Removable() { return true; } virtual vtkProp* GetProp(){return nullptr;} diff --git a/src/src/Rendering/Viewer/DICOMImageViewer.cxx b/src/src/Rendering/Viewer/DICOMImageViewer.cxx index 91ebff3..98a1abd 100644 --- a/src/src/Rendering/Viewer/DICOMImageViewer.cxx +++ b/src/src/Rendering/Viewer/DICOMImageViewer.cxx @@ -1181,29 +1181,18 @@ void DICOMImageViewer::AddMeasures(vtkObject *, unsigned long eventid, void *cal void DICOMImageViewer::RemoveMeasures(vtkObject *, unsigned long eventid, void *calldata) { auto p = static_cast(calldata); auto da = DraggableActor::SafeDownCast(p); - if (da->IsA("ControlPointActor")) + while (da->GetcontrolledActor()) { - auto controlP = ControlPointActor::SafeDownCast(da); - if (nullptr == controlP) return; - if (nullptr == controlP->GetcontrolledActor()) return; - auto m = dynamic_cast(controlP->GetcontrolledActor()); - if (m == nullptr) return; - ClearCurrentSliceMeasure(); - measureStore->Remove(m); - this->InteractorStyle->ClearSelectedProp(); - ReloadCurrentSliceMeasure(); - this->Render(); + da = da->GetcontrolledActor(); } - else{ auto m = dynamic_cast(da); - if (m == nullptr) return; + if (m == nullptr) return; + if (!m->Removable())return; ClearCurrentSliceMeasure(); measureStore->Remove(m); this->InteractorStyle->ClearSelectedProp(); ReloadCurrentSliceMeasure(); this->Render(); - } - } void DICOMImageViewer::DeleteSelectedMeasure() {