From 44d31a824db4a18c4a614d145c4753f9a8adca65 Mon Sep 17 00:00:00 2001 From: gaozheng Date: Thu, 18 Jun 2026 19:06:14 +0800 Subject: [PATCH] =?UTF-8?q?feat(vtk):=20=E5=BC=82=E5=B8=B8=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E9=80=89=E4=B8=AD=E2=86=92VTK=E9=AB=98=E4=BA=AE?= =?UTF-8?q?=E8=81=94=E5=8A=A8(#4c-2,=20R84=20list=E2=86=92VTK)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - I3dSceneView::setSelectedAnomaly + VtkSceneView 实现(选中异常 actor 加粗高亮、其余恢复); anomalyProps_ 改 vtkActor 以设线宽/点尺寸 - main:Column3DAnalysis::anomalySelected → sceneView->setSelectedAnomaly - FakeView 补 setSelectedAnomaly 空实现 编译全绿(build.bat all);用户实测通过。 反向(VTK点异常→回选列表)本期未做(需异常 actor 拾取)。 --- src/app/VtkSceneView.cpp | 12 ++++++++++++ src/app/VtkSceneView.hpp | 4 +++- src/app/main.cpp | 5 +++++ src/controller/I3dSceneView.hpp | 2 ++ tests/controller/test_vtk_scene_controller.cpp | 1 + 5 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/app/VtkSceneView.cpp b/src/app/VtkSceneView.cpp index 02ad444..4c60571 100644 --- a/src/app/VtkSceneView.cpp +++ b/src/app/VtkSceneView.cpp @@ -9,6 +9,7 @@ #include #include +#include #include #include #include @@ -218,6 +219,17 @@ void VtkSceneView::setAnomalyVisible(const std::string& anomalyId, bool visible) if (it != anomalyProps_.end() && it->second) it->second->SetVisibility(visible ? 1 : 0); } +void VtkSceneView::setSelectedAnomaly(const std::string& anomalyId) { + // 选中者加粗高亮、其余恢复常态(列表↔VTK 联动 R84)。 + for (auto& kv : anomalyProps_) { + if (!kv.second) continue; + const bool sel = (kv.first == anomalyId); + kv.second->GetProperty()->SetLineWidth(sel ? 5.0 : 2.0); + kv.second->GetProperty()->SetPointSize(sel ? 12.0 : 8.0); + } + if (renderWindow_) renderWindow_->Render(); +} + void VtkSceneView::setAxes(geopro::controller::AxesMode mode, geopro::controller::AxesUnit unit, int fontSize) { axesMode_ = mode; diff --git a/src/app/VtkSceneView.hpp b/src/app/VtkSceneView.hpp index f8ee829..82286eb 100644 --- a/src/app/VtkSceneView.hpp +++ b/src/app/VtkSceneView.hpp @@ -17,6 +17,7 @@ namespace geopro::render { class Scene; } class vtkRenderer; class vtkRenderWindow; class vtkProp; +class vtkActor; namespace geopro::app { @@ -43,6 +44,7 @@ public: void removeAnomaly(const std::string& anomalyId) override; void clearAnomalies() override; void setAnomalyVisible(const std::string& anomalyId, bool visible) override; + void setSelectedAnomaly(const std::string& anomalyId) override; void setAxes(geopro::controller::AxesMode mode, geopro::controller::AxesUnit unit, int fontSize) override; void applyCameraView(geopro::controller::ViewDir dir) override; @@ -111,7 +113,7 @@ private: std::map>> dsProps_; std::vector> miscProps_; std::string volumeOwnerDs_; // 当前 currentVolumeImage_ 归属的 ds(其被移除时置空切片源) - std::map> anomalyProps_; // 异常 id → 3D actor + std::map> anomalyProps_; // 异常 id → 3D actor }; } // namespace geopro::app diff --git a/src/app/main.cpp b/src/app/main.cpp index fdd6107..75aa2fb 100644 --- a/src/app/main.cpp +++ b/src/app/main.cpp @@ -780,6 +780,11 @@ void buildWorkbench(QMainWindow& window, geopro::data::LocalSampleRepository& re sceneView->setAnomalyVisible(id.toStdString(), vis); renderWindowPtr->Render(); }); + // 列表选中异常 → VTK 高亮联动(R84,list→VTK)。 + QObject::connect(ca, &geopro::app::Column3DAnalysis::anomalySelected, vtkWidget, + [sceneView](const QString& id) { + sceneView->setSelectedAnomaly(id.toStdString()); + }); // 删除异常 → 删 mock + 刷新渲染/列表。 QObject::connect(ca, &geopro::app::Column3DAnalysis::anomalyDeleteRequested, &window, [scene3dRepo, refreshAnomalies](const QString& id) { diff --git a/src/controller/I3dSceneView.hpp b/src/controller/I3dSceneView.hpp index 529582c..ffcdea0 100644 --- a/src/controller/I3dSceneView.hpp +++ b/src/controller/I3dSceneView.hpp @@ -45,6 +45,8 @@ public: virtual void removeAnomaly(const std::string& anomalyId) = 0; virtual void clearAnomalies() = 0; virtual void setAnomalyVisible(const std::string& anomalyId, bool visible) = 0; + // 高亮选中的异常(列表↔VTK 联动 R84):选中者加粗高亮、其余恢复;空 id = 全不选。 + virtual void setSelectedAnomaly(const std::string& anomalyId) = 0; // 坐标轴设置(P2):显示方式 + 刻度单位 + 字号。视图据当前场景包围盒重建坐标轴 prop。 // None 模式 = 移除坐标轴;rebuild 时由控制器在 clear 后重新下发当前坐标轴设置。 diff --git a/tests/controller/test_vtk_scene_controller.cpp b/tests/controller/test_vtk_scene_controller.cpp index 8bbbe5e..b238ebe 100644 --- a/tests/controller/test_vtk_scene_controller.cpp +++ b/tests/controller/test_vtk_scene_controller.cpp @@ -84,6 +84,7 @@ struct FakeView : I3dSceneView { void removeAnomaly(const std::string&) override {} void clearAnomalies() override {} void setAnomalyVisible(const std::string&, bool) override {} + void setSelectedAnomaly(const std::string&) override {} int props() const { return surveyLines + curtains + volumes + terrains; } };