From 6241eb3a7e8e34fc69e3946a4a529b13af3a809e Mon Sep 17 00:00:00 2001 From: gaozheng Date: Tue, 9 Jun 2026 11:54:48 +0800 Subject: [PATCH] =?UTF-8?q?feat(app):=20CentralScene=20=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E9=A9=B1=E5=8A=A8=20helper=EF=BC=88=E8=A7=A3=E8=80=A6=E4=B8=AD?= =?UTF-8?q?=E5=A4=AE=E4=B8=89=E7=BB=B4=E7=BC=96=E6=8E=92=EF=BC=8C=E4=B8=8B?= =?UTF-8?q?=E4=B8=80=E8=BD=AE=E6=8E=A5=E7=9C=9F=E5=AE=9EDS=E5=A4=8D?= =?UTF-8?q?=E7=94=A8=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/CMakeLists.txt | 3 ++- src/app/CentralScene.cpp | 44 ++++++++++++++++++++++++++++++++++++++++ src/app/CentralScene.hpp | 31 ++++++++++++++++++++++++++++ 3 files changed, 77 insertions(+), 1 deletion(-) create mode 100644 src/app/CentralScene.cpp create mode 100644 src/app/CentralScene.hpp diff --git a/src/app/CMakeLists.txt b/src/app/CMakeLists.txt index 2215046..f398122 100644 --- a/src/app/CMakeLists.txt +++ b/src/app/CMakeLists.txt @@ -22,7 +22,8 @@ add_executable(geopro_desktop WIN32 login/LoginWindow.cpp panels/AnomalyListPanel.cpp panels/DatasetListPanel.cpp - panels/ObjectTreePanel.cpp) + panels/ObjectTreePanel.cpp + CentralScene.cpp) target_include_directories(geopro_desktop PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) diff --git a/src/app/CentralScene.cpp b/src/app/CentralScene.cpp new file mode 100644 index 0000000..2579151 --- /dev/null +++ b/src/app/CentralScene.cpp @@ -0,0 +1,44 @@ +#include "CentralScene.hpp" + +#include +#include +#include + +#include "CameraPreset.hpp" +#include "Scene.hpp" +#include "actors/CurtainActor.hpp" +#include "actors/MapLineActor.hpp" +#include "geo/GeoLocalFrame.hpp" + +namespace geopro::app { + +void rebuildCentralScene(geopro::render::Scene& scene, vtkRenderer* renderer, + vtkRenderWindow* renderWindow, ViewMode mode, + const std::vector& sections, bool showCurtain, + const geopro::core::GeoLocalFrame& frame, double verticalExaggeration) { + scene.clear(); + const bool is2D = (mode == ViewMode::Map2D); + renderer->SetBackground(is2D ? 0.96 : 1.0, is2D ? 0.97 : 1.0, is2D ? 0.99 : 1.0); + + for (const auto& s : sections) { + if (is2D) { + auto line = geopro::render::buildSurveyLine(s.grid, frame); + if (line) scene.addActor(line); + } else if (showCurtain) { + auto curtain = geopro::render::buildCurtain(s.grid, s.colorScale, frame); + if (curtain) { + curtain->SetScale(1.0, 1.0, verticalExaggeration); // 纵向夸张成墙 + scene.addActor(curtain); + } + } + } + + if (is2D) + geopro::render::applyTop2D(renderer); + else + geopro::render::applyFree3D(renderer); + renderer->ResetCamera(); + renderWindow->Render(); +} + +} // namespace geopro::app diff --git a/src/app/CentralScene.hpp b/src/app/CentralScene.hpp new file mode 100644 index 0000000..1e75032 --- /dev/null +++ b/src/app/CentralScene.hpp @@ -0,0 +1,31 @@ +#pragma once +#include + +#include "model/ColorScale.hpp" +#include "model/Field.hpp" + +namespace geopro::core { class GeoLocalFrame; } +namespace geopro::render { class Scene; } +class vtkRenderer; +class vtkRenderWindow; + +namespace geopro::app { + +// 中央视图模式:二维地图(测线红线俯视)/ 三维视图(断面墙)。 +enum class ViewMode { Map2D, View3D }; + +// 一个待渲染剖面:grid(2D 测线 / 3D 帘面都用)+ colorScale(3D 帘面上色)。 +struct SectionInput { + geopro::core::Grid grid; + geopro::core::ColorScale colorScale; +}; + +// 中央场景重建(脱离对象树,按显式 sections 渲染): +// 2D = 每个 section 的 buildSurveyLine;3D = 每个 section 的 buildCurtain(受 showCurtain)。 +// 下一轮接真实 DS:构建 sections 后调用本函数即可,render 层零改动。 +void rebuildCentralScene(geopro::render::Scene& scene, vtkRenderer* renderer, + vtkRenderWindow* renderWindow, ViewMode mode, + const std::vector& sections, bool showCurtain, + const geopro::core::GeoLocalFrame& frame, double verticalExaggeration); + +} // namespace geopro::app