geopro/docs/superpowers/HANDOFF-2026-06-26-vtk-anom...

100 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# HANDOFF — VTK 3D 视图:创建异常打磨 + 切片/异常交互 + 二维分析改造2026-06-26
> 分支 `feat/vtk-3d-view`。桌面端 Qt6 + VTK 9.6。本会话围绕「创建异常」全链路打磨、切片/异常交互修复、全局中文化,最后转入「二维分析改造」的需求厘清 + 写 spec。**下一步=按 spec 实现二维分析 A 期。**
---
## 0. 立刻要做的事(下个会话从这里开始)
**二维分析改造 A 期已实现**(未提交,下个会话需用户实跑反馈手感/角度。spec`docs/superpowers/specs/2026-06-26-2d-analysis-topdown-elevation.md`commit `227ee8f`)。分期 A→B→C
- **A已实现 ✅build+439测试全绿未提交**一场景两相机。切「二维分析」tab → 近俯视(下压12°≈78°俯角)+禁旋转(左键改平移、仅平移/缩放);按维度翻 actor `SetVisibility`(轨迹↔体/帘面/异常,**不清空**);切片 `SetEnabled` 显隐(不销毁);地形+底图常驻;切回三维还原相机快照。**待用户实跑**:①近俯视角度是否合适②切换是否瞬时③左键平移手感④切回三维视角还原是否自然。
- 改动文件:`CameraPreset.{hpp,cpp}`(applyNearTop2D)、`PickInteractorStyle.{hpp,cpp}`(setLock2D)、`SliceTool.{hpp,cpp}`(setVisible)、`InteractionManager.{hpp,cpp}`(setMode2D)、`VtkSceneView.{hpp,cpp}`(setAnalysisMode2D+mapLineDs_+相机快照)、`ColumnDrawer.{hpp,cpp}`(analysisModeChanged 信号)、`main.cpp`(接信号)。
- 已知小风险2D 取景 `computeDataBounds` 含隐藏的 3D 体包围盒(地形主导,影响小);切片 `SetEnabled` 显隐属 GUI 不可自测项。
- **B下一步**:二维里选中 2D 内容(单/多选)→ 竖向拖动只改**高程 Z**、锁 XY、实时高程读数。锚点新增 2D 拾取-拖动交互(仅 Z 平移),可参考切片 widget`PickInteractorStyle` 在 lock2D 下保留拾取A 期为简化已禁拾取B 期需放开 2D 内容拾取)。
- **注意**A 期 lock2D 下 `OnLeftButtonDown` 直接 StartPan、跳过拾取。B 期要支持选中 2D 内容拖动,需改为「命中 2D 足迹→进入 Z 拖动;否则平移」。
- **C**dd_raster 纳入 2D 过滤 + 按 ddCode 分派渲染 + 栅格地理配准贴地形。**阻塞dd_raster 数据端点未确认**。
---
## 1. 环境 / 命令 / 铁律(必读)
- **构建**:用 PowerShell 工具跑 `cmd /c "D:\Git\lanbingtech\geopro\build.bat app"`Claude 的 Bash 跑 build 会被环境劫持,用 PowerShell。测试 `build.bat test`ctest**439 用例**)。`vswhere.exe not recognized` 噪声无害。LNK1104=exe 被运行中的 app 锁,需用户关 app 才能链接。
- **回复用中文**(用户要求)。
- **CLAUDE.md 两条绑定规则**:①发现技术债当场修,不以"非本轮引入"搪塞;②**能自己做的绝不让用户做**——日志(`%LOCALAPPDATA%/Geomative/Geopro3/logs/geopro_*.log`)/数据/构建/诊断都自己来,只在 LNK1104 关 app、或真正产品决策才找用户。
- **git**:精确 `git add <files>`(仓库有并行 GPR 会话的脏文件 `.superpowers/sdd/*`、`docs/.../poc-lod-shots/*.png`**勿误提交**)。提交无 Co-Authored-By全局禁
- **后端 token可访问真实接口用户给的**`geomativeauthorization: Geomative e6c1259748644c8da0954d864bb82604`base URL `http://tenant.geomative.cn/pop-api`;样例 projectId `1439735554211840`。可用 curl 查接口。
---
## 2. 本会话已完成(提交清单,新→旧)
**创建异常全链路(核心工作量)**
- `227ee8f` 二维分析 specdoc
- `c1a824e` 二维维度分类对齐数据字典 DD0623去 3 个已删除轨迹类型dimensionOf/dimOf/测试)。
- `e8bb2f8`/`1648ccb`/`f230ca8` 异常绘制提示vtkTextActor 渲染不出中文 → 改 **app 层 QLabel 浮层**(右上角、深底方角、不挡鼠标);列表切到别对象清切片选中(`deselectSlice`)。
- `9782a2b` 删除切片/异常加确认框 + **弹框按钮全局中文化**Qt zh_CN 翻译器 + `formkit::addDialogButtons` 默认「确定/取消」+ 打包补 qtbase_zh_CN.qm
- `306d7bc` 提示移右上角 + **线双击结束含双击位置**(去回滚)。
- `d7ab770` **切片保存后定稿锁定**`SetInteraction(0)` 不可移动/旋转)+ VTK/列表菜单去「保存·另存」。
- `91a7106` **结束手势**:点=单击即完成、线=双击、面=**点回起点闭合**(近起点 12px 吸附+橡皮筋指向起点)。
- `1a70ca0` 异常对话框加**样式预览**(选中类型 legend 可视化:点球/线/面)。
- `4ae8286` **异常截图配色与切面一致**:取 widget 自身 `GetColorMap()` 输出(非另建 LUT→ 逐像素一致 + RGBA 外区透明消蓝边。
- `d470dc8` 双击/单击隔离(后被 `306d7bc` 改回"含双击位置"+ 异常类型下拉误显「暂无数据」(`EmptyAwareComboBox::realItemCount` 用错 flags 角色→改 `model()->flags()`)。
- `04af569` 返工(点交互/点渲染小球/截图/类型空态)。
- `75c1327`→`3ed1ea7`→`58544ff`→`c6756aa` 截图相机方案A(已废)、**异常类型接平台真实类型**(`listExceptionTypes` 按形态)、**点/线/面三态**子菜单、**样式接平台 legend**(`getExceptionTypeDetail`)。
- 截图最终方案:**只从切片 2D 剖面图、按异常几何 buffer 裁剪**`captureAnomalyShotFromSlice`GIS buffer+掩膜,点圆/线胶囊/面外扩多边形)。
**其它**
- `56e4b3a` 登录验证码容器白底。
- `8563693` 分段折叠向上收起stretch 动态:展开=1/折叠=0+尾弹簧)。
- `d6e52cb` 三维分析分段面板视觉打磨chevron 段头/描边新增按钮/顶部留白)。
- `fb911a9` 坐标轴面板硬编码色 token 化。
- `cdd7613` vtk-3d-openapi 文档对齐实测DsPage 行在 `data.list`、DsRow 全字段、装置不在 data/page
- `2f6ec7d`→`1742b75`→`31ad7a4` **装置筛选**data/page 行不带 properties→改按行自带 `typeName/dsTypeCode` 筛选parseDsRows 兼容对象形态。
- 期间生成了一次安装包:`installer/dist/Geopro_Setup_3.0.0-20260625.exe`(脚本 `installer/build_installer.ps1`,含 windeployqt+样本+PROJ+vc_redist
---
## 3. 创建异常功能现状已落地端到端可用mock 保存)
入口VTK 切片右键 →「创建异常 → 点/线/面」。流程:圈定(AnomalyDrawTool)→草稿渲染→**从切片2D图buffer裁剪截图**→对话框(名称/异常类型[接平台]/样式预览/备注/截图)→保存(mock)→刷新树+渲染异常 actor。
- **关键文件**`src/render/interact/AnomalyDrawTool.{hpp,cpp}`(三态绘制:点单击完成/线双击/面点起点闭合Esc取消/Backspace撤点`src/app/AnomalySaveDialog.{hpp,cpp}`(接 `cmdRepo.listExceptionTypes`/`getExceptionTypeDetail`,样式预览);`src/app/SliceExport.{hpp,cpp}``captureAnomalyShotFromSlice``src/render/actors/AnomalyActor.cpp`(点=球/线=折线/面=闭合多边形);`src/app/main.cpp`onSliceContextMenuRequested ~509 起:菜单+绘制+对话框+保存接线QLabel 提示浮层)。
- **样式来源**:选中平台异常类型 → `getExceptionTypeDetail` 取 legendpolylineColor/Width/Shape, pointColor…→ 套到异常 lineColor/lineWidth/dashed。
- **截图**:只裁切片那张 2D 剖面图(`InteractionManager::selectedSliceColorImage` 现取 `SliceTool::coloredResliceImage()`=widget ColorMap 输出,与屏幕同源)。
### 仍卡在后端P3非客户端问题
- **异常真保存 `newException`** 卡:异常 `remarkSourceId` 须指向真实 dsObjectId三维体/切片),但真后端**无任何登记三维体/切片为 dsObject 的端点**(实测 `voxel/generate`、`slice/generate`、通用 `dsObject create` 全无)。当前 `saveAnomaly` 是内存 mock。后端补登记端点后整链可接真。
- 平台「点」类异常类型该项目为空(线/面有)→ 画点时类型下拉空属正常。
---
## 4. 二维分析改造——已确认的设计决策(与用户逐条敲定)
1. **不分两个场景**:一个 3D 地形场景(带高程)+ 底图贴地形,两栏只是相机不同。"二维分析只是 3D 的固定视角"。
2. **二维相机**:锁定**近俯视(7580°非绝对正俯视)**,禁旋转,仅平移+缩放。(绝对正俯视看不出高程→留倾斜)
3. **切 tab 显隐**:翻另一方数据集 `SetVisibility`**不显示,非清空**)→ 性能零代价VTK 跳过不可见 actor、切换瞬时、只占内存。地形+底图常驻。**绝不清空**(重体素重建会卡)。
4. **高程拖动(C1)**:二维里选中 2D 内容(单/多选)→ 竖向拖动只改**高程 Z**、锁 XY、实时读数。用途=分离叠在一起的 2D 层。
5. **维度过滤**2D = `dd_trajectory_data`+ C 期 `dd_raster``dd_radar_2d/3d` 是 3D不进 2D。已对齐 DD0623`c1a824e`)。
6. **雷达客户反馈**:只影响数据模型 + **3D 视图**渲染(二维雷达=线、三维雷达=切面、带打标)+ 详情页校准——**均属另立任务,不在本次 2D 改造**。2D 只显示轨迹线、打标暂不做(与本设计一致)。
---
## 5. 关键代码锚点(二维分析改造用)
- 切 2D 视图模式钩子:`Column2DDataset::view2DModeChanged` → `main.cpp``sceneCtrl`(搜 `view2DModeChanged`)。
- 维度分类:`src/app/DatasetDimension.cpp::dimOf`col2D 用);`src/data/api/Api3dRepository.cpp` + `src/data/repo/LocalSample3dRepository.cpp::dimensionOf`
- 2D 内容注入:`main.cpp` ~502 `col2D->setDatasets(splitByDimension(...).dim2D)`;勾选渲染 `Column2DDataset::checkedDatasetsChanged``loadMapLine`/`MapLineActor`。
- 场景/相机/可见:`VtkSceneView`actor 管理)、`VtkSceneController`、`InteractionManager`(拾取/选中,新增 `deselectSlice`)。
- 地形+底图:`buildTerrain`带高程VE 垂直夸张相关)、`TileBasemap`(天地图按经纬贴)。
- 数据字典:`D:\Projects\GEOPRO\DD0623.xlsx`46 个 ddCode序号/ddCode/领域/含义/状态/**展示模式(2D/3D)**/**展示形态**/备注…。解析openpyxl 可用,中文 GBK 终端会乱码→导 UTF-8 文件再 Read。
---
## 6. 待确认/风险
- **dd_raster 数据端点**(像素+四至/投影)未确认 → C 期阻塞。
- 近俯视角度需实机调;高程是否落库暂定会话内(不落库)。
- §3 翻可见标志需可靠区分每个 actor 的维度归属。
- 切相机/可见与现有 view2DModeChanged、底图、地形 VE 逻辑勿打架。
- **GUI 无法登录自测**:相机/截图/交互类改动我只能保证编译+逻辑,视觉/手感需用户实跑反馈。
---
## 7. 相关记忆/文档
- 记忆库 `MEMORY.md`(如 login-chain-truth、vtk-3d-persistence-structure、build-vs2026-vcpkg-gotchas、deploy-hardcoded-dev-paths 等)。
- vtk-3d API 设计草案:`docs/api/vtk-3d-openapi.json`已对齐实测0.6.1)。
- 真后端 API`docs/apis/business_OpenAPI.json`。
- 二维分析 spec`docs/superpowers/specs/2026-06-26-2d-analysis-topdown-elevation.md`。