11 KiB
11 KiB
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 拖动;否则平移」。
- 注意:A 期 lock2D 下
- 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 URLhttp://tenant.geomative.cn/pop-api;样例 projectId1439735554211840。可用 curl 查接口。
2. 本会话已完成(提交清单,新→旧)
创建异常全链路(核心工作量)
227ee8f二维分析 spec(doc)。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 化。cdd7613vtk-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取 legend(polylineColor/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. 二维分析改造——已确认的设计决策(与用户逐条敲定)
- 不分两个场景:一个 3D 地形场景(带高程)+ 底图贴地形,两栏只是相机不同。"二维分析只是 3D 的固定视角"。
- 二维相机:锁定近俯视(75–80°,非绝对正俯视),禁旋转,仅平移+缩放。(绝对正俯视看不出高程→留倾斜)
- 切 tab 显隐:翻另一方数据集
SetVisibility(不显示,非清空)→ 性能零代价(VTK 跳过不可见 actor)、切换瞬时、只占内存。地形+底图常驻。绝不清空(重体素重建会卡)。 - 高程拖动(C1):二维里选中 2D 内容(单/多选)→ 竖向拖动只改高程 Z、锁 XY、实时读数。用途=分离叠在一起的 2D 层。
- 维度过滤:2D =
dd_trajectory_data(+ C 期dd_raster);dd_radar_2d/3d是 3D(不进 2D)。已对齐 DD0623(c1a824e)。 - 雷达客户反馈:只影响数据模型 + 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~502col2D->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。