feat/vtk-3d-view #7

Merged
gaozheng merged 301 commits from feat/vtk-3d-view into main 2026-06-27 18:43:52 +08:00
5 changed files with 23 additions and 1 deletions
Showing only changes of commit 44d31a824d - Show all commits

View File

@ -9,6 +9,7 @@
#include <QString> #include <QString>
#include <vtkActor.h> #include <vtkActor.h>
#include <vtkProperty.h>
#include <vtkBoundingBox.h> #include <vtkBoundingBox.h>
#include <vtkCubeAxesActor.h> #include <vtkCubeAxesActor.h>
#include <vtkProp.h> #include <vtkProp.h>
@ -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); 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, void VtkSceneView::setAxes(geopro::controller::AxesMode mode, geopro::controller::AxesUnit unit,
int fontSize) { int fontSize) {
axesMode_ = mode; axesMode_ = mode;

View File

@ -17,6 +17,7 @@ namespace geopro::render { class Scene; }
class vtkRenderer; class vtkRenderer;
class vtkRenderWindow; class vtkRenderWindow;
class vtkProp; class vtkProp;
class vtkActor;
namespace geopro::app { namespace geopro::app {
@ -43,6 +44,7 @@ public:
void removeAnomaly(const std::string& anomalyId) override; void removeAnomaly(const std::string& anomalyId) override;
void clearAnomalies() override; void clearAnomalies() override;
void setAnomalyVisible(const std::string& anomalyId, bool visible) 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, void setAxes(geopro::controller::AxesMode mode, geopro::controller::AxesUnit unit,
int fontSize) override; int fontSize) override;
void applyCameraView(geopro::controller::ViewDir dir) override; void applyCameraView(geopro::controller::ViewDir dir) override;
@ -111,7 +113,7 @@ private:
std::map<std::string, std::vector<vtkSmartPointer<vtkProp>>> dsProps_; std::map<std::string, std::vector<vtkSmartPointer<vtkProp>>> dsProps_;
std::vector<vtkSmartPointer<vtkProp>> miscProps_; std::vector<vtkSmartPointer<vtkProp>> miscProps_;
std::string volumeOwnerDs_; // 当前 currentVolumeImage_ 归属的 ds其被移除时置空切片源 std::string volumeOwnerDs_; // 当前 currentVolumeImage_ 归属的 ds其被移除时置空切片源
std::map<std::string, vtkSmartPointer<vtkProp>> anomalyProps_; // 异常 id → 3D actor std::map<std::string, vtkSmartPointer<vtkActor>> anomalyProps_; // 异常 id → 3D actor
}; };
} // namespace geopro::app } // namespace geopro::app

View File

@ -780,6 +780,11 @@ void buildWorkbench(QMainWindow& window, geopro::data::LocalSampleRepository& re
sceneView->setAnomalyVisible(id.toStdString(), vis); sceneView->setAnomalyVisible(id.toStdString(), vis);
renderWindowPtr->Render(); renderWindowPtr->Render();
}); });
// 列表选中异常 → VTK 高亮联动R84list→VTK
QObject::connect(ca, &geopro::app::Column3DAnalysis::anomalySelected, vtkWidget,
[sceneView](const QString& id) {
sceneView->setSelectedAnomaly(id.toStdString());
});
// 删除异常 → 删 mock + 刷新渲染/列表。 // 删除异常 → 删 mock + 刷新渲染/列表。
QObject::connect(ca, &geopro::app::Column3DAnalysis::anomalyDeleteRequested, &window, QObject::connect(ca, &geopro::app::Column3DAnalysis::anomalyDeleteRequested, &window,
[scene3dRepo, refreshAnomalies](const QString& id) { [scene3dRepo, refreshAnomalies](const QString& id) {

View File

@ -45,6 +45,8 @@ public:
virtual void removeAnomaly(const std::string& anomalyId) = 0; virtual void removeAnomaly(const std::string& anomalyId) = 0;
virtual void clearAnomalies() = 0; virtual void clearAnomalies() = 0;
virtual void setAnomalyVisible(const std::string& anomalyId, bool visible) = 0; virtual void setAnomalyVisible(const std::string& anomalyId, bool visible) = 0;
// 高亮选中的异常列表↔VTK 联动 R84选中者加粗高亮、其余恢复空 id = 全不选。
virtual void setSelectedAnomaly(const std::string& anomalyId) = 0;
// 坐标轴设置P2显示方式 + 刻度单位 + 字号。视图据当前场景包围盒重建坐标轴 prop。 // 坐标轴设置P2显示方式 + 刻度单位 + 字号。视图据当前场景包围盒重建坐标轴 prop。
// None 模式 = 移除坐标轴rebuild 时由控制器在 clear 后重新下发当前坐标轴设置。 // None 模式 = 移除坐标轴rebuild 时由控制器在 clear 后重新下发当前坐标轴设置。

View File

@ -84,6 +84,7 @@ struct FakeView : I3dSceneView {
void removeAnomaly(const std::string&) override {} void removeAnomaly(const std::string&) override {}
void clearAnomalies() override {} void clearAnomalies() override {}
void setAnomalyVisible(const std::string&, bool) override {} void setAnomalyVisible(const std::string&, bool) override {}
void setSelectedAnomaly(const std::string&) override {}
int props() const { return surveyLines + curtains + volumes + terrains; } int props() const { return surveyLines + curtains + volumes + terrains; }
}; };