spike(S2): ADS+QVTKOpenGLStereoWidget 浮动/重停靠不黑屏(用户实测) — 三 spike 全绿
- main.cpp: ADS CDockManager 承载 VTK 面板 + 占位面板 - CMakeLists: FetchContent 拉 ADS 对接官方 Qt; app 链 ads::qt6advanceddocking - Phase 0 spike 报告: 门槛 PASS, 记录实机环境/结论/构建约定/色阶映射待办
This commit is contained in:
parent
85e4dbea56
commit
9337340848
|
|
@ -42,11 +42,15 @@ find_package(VTK REQUIRED COMPONENTS
|
|||
# find_package(nlohmann_json CONFIG REQUIRED)
|
||||
# find_package(OpenSSL REQUIRED)
|
||||
|
||||
# ADS / QtKeychain:FetchContent 对接官方 Qt(spike#2 接入;体量小,源码编可接受)
|
||||
# include(FetchContent)
|
||||
# FetchContent_Declare(ads GIT_REPOSITORY https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-System.git GIT_TAG 4.3.1)
|
||||
# FetchContent_Declare(qtkeychain GIT_REPOSITORY https://github.com/frankosterfeld/qtkeychain.git GIT_TAG 0.14.3)
|
||||
# FetchContent_MakeAvailable(ads qtkeychain)
|
||||
# ADS(停靠):FetchContent 对接官方 Qt(spike S2)。QtKeychain 待登录层再加。
|
||||
include(FetchContent)
|
||||
set(ADS_VERSION 4.3.1 CACHE STRING "" FORCE)
|
||||
set(BUILD_EXAMPLES OFF CACHE BOOL "" FORCE)
|
||||
set(BUILD_STATIC OFF CACHE BOOL "" FORCE)
|
||||
FetchContent_Declare(ads
|
||||
GIT_REPOSITORY https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-System.git
|
||||
GIT_TAG 4.3.1)
|
||||
FetchContent_MakeAvailable(ads)
|
||||
|
||||
add_subdirectory(src)
|
||||
|
||||
|
|
|
|||
Binary file not shown.
|
After Width: | Height: | Size: 66 KiB |
|
|
@ -0,0 +1,46 @@
|
|||
# M1 Phase 0 — Spike 门槛结论报告
|
||||
|
||||
**日期**:2026-06-07
|
||||
**结论**:✅ **三个 spike 全部通过,门槛 PASS,可进入 Phase 1。**
|
||||
|
||||
## 实机环境(实测)
|
||||
|
||||
| 项 | 值 |
|
||||
|---|---|
|
||||
| VS | **Visual Studio 2026 (v18.0)**,MSVC 工具集 **14.51.36231**(cl 19.51) |
|
||||
| Qt | **官方 MSVC kit 6.11.1**(`D:\Qt\6.11.1\msvc2022_64`,v143 预编译) |
|
||||
| VTK | **9.6.2 源码编**对接官方 Qt → `external/vtk-install`(含 GUISupportQt) |
|
||||
| vcpkg | `d:\dev\vcpkg`(仅非 Qt 依赖;按层递增) |
|
||||
| 磁盘 | C: 仅 ~0.9GB → 全部源码/构建/TEMP 重定向到 D: |
|
||||
|
||||
## Spike 结果
|
||||
|
||||
| Spike | 内容 | 结果 |
|
||||
|---|---|---|
|
||||
| **S1 构建/部署** | 官方 Qt + 源码 VTK 编冒烟程序;部署 | ✅ 编译/链接/运行成功;**单一 Qt6Core.dll**(无双 Qt);qwindows 插件 + 66 VTK dll 部署;exe 启动存活 |
|
||||
| **S2 ADS+QVTK** | QVTKOpenGLStereoWidget 放 ADS 停靠区,浮动/重停靠 | ✅ 反复浮动/重停靠**不黑屏不崩溃**(用户实测确认) |
|
||||
| **S3 渲染管线** | 真实网格样本 banded contour 离屏渲染 | ✅ `vtkImageData→vtkDataSetSurfaceFilter→vtkBandedPolyDataContourFilter(GenerateContourEdges)` 出填充等值面+等值线,结构对齐 `ref_18`(设计 §4.3 的 B-1/B-2 修正成立) |
|
||||
|
||||
## 对设计的回写/确认
|
||||
|
||||
- **K-8 方案②-修订成立**:官方 MSVC Qt + 源码 VTK + vcpkg(非 Qt)可行,单一 Qt 已实证。原装 MinGW Qt 弃用。
|
||||
- **K-9 `QVTKOpenGLStereoWidget` 选型正确**:ADS reparent 不黑屏,无需禁用浮动。
|
||||
- **§4.3 网格管线选型正确**(S3 验证)。
|
||||
- **色阶精确映射**(colorBar 非均匀值)为 render 层细节:S3 用线性 LUT 颜色偏蓝,render 层须用 `vtkColorTransferFunction` 按 colorBar 实际值映射(已记)。
|
||||
- **VTK = 9.6.2**(非 9.3;对 Qt6.11 兼容更好,满足 spec "9.3+")。
|
||||
|
||||
## 构建约定(供后续/subagent 使用)
|
||||
|
||||
C: 空间紧张 + 需 MSVC 环境,所有构建/测试经包装器(封装 vcvars + TEMP→D: + cmake/ninja + VCPKG_ROOT):
|
||||
|
||||
```
|
||||
cmd /c "D:\Git\lanbingtech\geopro\external\dev.bat <command>"
|
||||
# 配置: ...dev.bat cmake --preset msvc-release
|
||||
# 构建: ...dev.bat cmake --build build/release --target <target>
|
||||
# 测试: ...dev.bat ctest --test-dir build/release --output-on-failure
|
||||
```
|
||||
当前统一用 **Release**(`build/release`):Debug 全量配置会因无 Debug VTK 而失败;core 纯逻辑测试 Release 即可。
|
||||
|
||||
## 下一步
|
||||
|
||||
进入 **Phase 1 — core 纯逻辑层**(`2026-06-07-m1-phase1-core.md`),subagent(opus 4.8)逐任务 TDD 实现:LocalFrame / 领域模型 / 阶梯色阶 / IDW / CrsTransform,以 `tools/validate_samples.py`、`validate_voxel.py` 结论为地面真值。
|
||||
|
|
@ -7,6 +7,7 @@ add_executable(geopro_desktop WIN32 main.cpp)
|
|||
target_link_libraries(geopro_desktop PRIVATE
|
||||
Qt6::Core Qt6::Gui Qt6::Widgets
|
||||
${VTK_LIBRARIES}
|
||||
ads::qt6advanceddocking
|
||||
)
|
||||
|
||||
# VTK 9 模块需 autoinit,否则渲染后端/工厂未注册,运行期黑屏或报错
|
||||
|
|
|
|||
|
|
@ -1,15 +1,17 @@
|
|||
// M1 spike 冒烟程序(设计 §15 spike#1/#2 起点)。
|
||||
// M1 spike 冒烟程序(设计 §15 spike#1/#2)。
|
||||
//
|
||||
// 验证目标:
|
||||
// 1) 全 vcpkg 下 Qt6 + VTK[qt] 共用同一份 Qt,可编译/链接/运行(无双 Qt 冲突)。
|
||||
// 2) QVTKOpenGLStereoWidget(QOpenGLWidget 系,ADS reparent 友好)能在 Qt 窗口里渲染。
|
||||
//
|
||||
// 跑通后:在此基础上接入 ADS 停靠(spike#2)、再展开 render/view 分层(实现计划)。
|
||||
// 1) 全 vcpkg 下 Qt6 + VTK[qt] 共用同一份 Qt,可编译/链接/运行(无双 Qt 冲突)。[S1 ✅]
|
||||
// 2) QVTKOpenGLStereoWidget 在 ADS 停靠面板里渲染,浮动/重停靠不黑屏。[S2]
|
||||
|
||||
#include <QApplication>
|
||||
#include <QLabel>
|
||||
#include <QMainWindow>
|
||||
#include <QSurfaceFormat>
|
||||
|
||||
#include <DockManager.h>
|
||||
#include <DockWidget.h>
|
||||
|
||||
#include <QVTKOpenGLStereoWidget.h>
|
||||
#include <vtkActor.h>
|
||||
#include <vtkConeSource.h>
|
||||
|
|
@ -20,36 +22,46 @@
|
|||
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
// VTK 要求在创建任何 QVTKOpenGL* 前设置默认 surface format
|
||||
QSurfaceFormat::setDefaultFormat(QVTKOpenGLStereoWidget::defaultFormat());
|
||||
|
||||
QApplication app(argc, argv);
|
||||
|
||||
QMainWindow window;
|
||||
window.setWindowTitle(QStringLiteral("Geopro 3.0 — spike smoke test (Qt + VTK)"));
|
||||
window.resize(1024, 720);
|
||||
|
||||
auto* vtkWidget = new QVTKOpenGLStereoWidget(&window);
|
||||
window.setCentralWidget(vtkWidget);
|
||||
window.setWindowTitle(QStringLiteral("Geopro 3.0 — spike (Qt + VTK + ADS)"));
|
||||
window.resize(1280, 800);
|
||||
|
||||
// ---- VTK 渲染(锥体)----
|
||||
auto* vtkWidget = new QVTKOpenGLStereoWidget();
|
||||
vtkNew<vtkGenericOpenGLRenderWindow> renderWindow;
|
||||
vtkWidget->setRenderWindow(renderWindow);
|
||||
|
||||
vtkNew<vtkConeSource> cone;
|
||||
cone->SetResolution(32);
|
||||
|
||||
vtkNew<vtkPolyDataMapper> mapper;
|
||||
mapper->SetInputConnection(cone->GetOutputPort());
|
||||
|
||||
vtkNew<vtkActor> actor;
|
||||
actor->SetMapper(mapper);
|
||||
|
||||
vtkNew<vtkRenderer> renderer;
|
||||
renderer->AddActor(actor);
|
||||
renderer->SetBackground(0.12, 0.13, 0.16); // 科学软件深色背景
|
||||
renderer->SetBackground(0.12, 0.13, 0.16);
|
||||
renderer->ResetCamera();
|
||||
renderWindow->AddRenderer(renderer);
|
||||
|
||||
// ---- ADS 停靠:VTK 面板 + 占位面板(用于测试浮动/重停靠)----
|
||||
auto* dockManager = new ads::CDockManager(&window);
|
||||
window.setCentralWidget(dockManager);
|
||||
|
||||
auto* vtkDock = new ads::CDockWidget(QStringLiteral("三维视图"));
|
||||
vtkDock->setWidget(vtkWidget);
|
||||
dockManager->addDockWidget(ads::CenterDockWidgetArea, vtkDock);
|
||||
|
||||
auto* leftDock = new ads::CDockWidget(QStringLiteral("对象列表"));
|
||||
leftDock->setWidget(new QLabel(QStringLiteral("(占位面板)")));
|
||||
dockManager->addDockWidget(ads::LeftDockWidgetArea, leftDock);
|
||||
|
||||
auto* rightDock = new ads::CDockWidget(QStringLiteral("属性"));
|
||||
rightDock->setWidget(new QLabel(QStringLiteral("(占位面板)")));
|
||||
dockManager->addDockWidget(ads::RightDockWidgetArea, rightDock);
|
||||
|
||||
window.show();
|
||||
return app.exec();
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue