geopro/docs/superpowers/STATUS.md

105 lines
13 KiB
Markdown
Raw Permalink 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.

# Geopro 3.0 桌面客户端 — 当前状态与交接M1 进行中)
**更新**2026-06-07 · **分支**`feat/m1-core`(尚未合并 master
> 本文件是**会话交接的单一事实来源**。下次继续前先读本文 + `specs/2026-06-07-geopro-desktop-m1-design.md`(设计基线)。计划在 `plans/`。
> **铁律教训**:渲染正确性**必须用离屏 PNG 肉眼核对**,不能只看"进程启动不崩"。工具:`tests/spike/render_verify.cpp` → `render_verify.exe` → `D:/dev/spike_data/verify_*.png`。本会话多次"声称成功"实为自欺,根因就是没看像素。
---
## 1. 现在能跑起来的东西(已离屏 PNG 核对 / 真机验证)
桌面 app `geopro_desktop`:
- **真实登录**:LoginWindow(用户名/密码/图形验证码/记住)→ `verifyCodeCheck` → RSA 加密密码 → `login2` → token → 进工作台。**真机登录成功**;输入框样式已修(三态白底深字)。
- **工作台 ADS 三区 + 数据详情**:
- **左上 对象显示栏**:GS→TM(测线),复选框勾选测线 → 控制中央显示哪些测线的 dd_section。
- **左下 数据真实显示栏**(对齐原型):单击测线 → 列其采集批次(数据集,tab 数据/文件);单击采集批次 → 数据详情+异常列表+属性。启动自动选首测线+首数据集。
- **中央 二维地图 / 三维视图**(两个**真内容**,非相机切换):
- 二维地图 = `MapLineActor`:测线 `lat/lon` 轨迹**红线**俯视(浅底),像地图。
- 三维视图 = `CurtainActor`:沿测线的**竖直断面墙**(分段色带,z 纵向夸张×3,沿弯曲测线弯)。中央工具条**仅**「二维地图/三维视图」。**3D 左上「视图详情」浮层**(对齐原型,仅 3D 显示)五图层勾选:**帘面 / 体素 / 切片 / 地形**(体素=`buildVoxelFromScatters` 散点经 EPSG:4547 配准 IDW;切片=`vtkImagePlaneWidget` 在体素 image 上交互拖切面=dd_slice;地形=`TerrainActor` GDAL 读 DEM 高程面 + 影像 EPSG:3857 重投影贴图;后三者需 PROJ,不可用则禁用)。
- **下方 数据详情**:工具条「原数据/网格数据」切换 +「显示异常/显示电极/显示等值线」开关(对齐原型)。单击数据集 → 网格数据=`GridContourActor` 平面剖面(#18,colorBar 真实非均匀分段值上色,纵向夸张×1.5);原数据=`ScatterActor` 彩色方块散点(#17);显示异常=`AnomalyActor` dashed 折线叠加;显示电极=`ElectrodeActor` 顶边 ▼ 标记;显示等值线=#18 黑色等值线显隐(同纵向夸张对齐)。
- **右上 异常列表**(对齐原型):单击数据集→列该数据集异常(颜色块+名称(类型)+派生「位置/深/尺寸」),勾选框显隐,与数据详情异常叠加联动(取消勾选→该异常虚线隐藏)。
- **右下 属性**:名称/网格 nx×ny/vmin·vmax/异常数。
- 单元测试累计 **40 个全绿**(core/data/net/render;含 Scatter 2 + Anomaly 4 + VoxelRegister 1 + Electrode 2 + Terrain 2、修复了陈旧的 Curtain mapper 类型断言);离屏 `verify_section/map/curtain_3d/scatter/section_anomaly(含电极▼)/voxel_top/voxel_3d/terrain_3d(DEM+影像贴图).png` 均核对正确。
## 2. 各 Phase 完成度
| Phase | 内容 | 状态 |
|---|---|---|
| P0 | 三 spike | ✅ |
| P1 | core(LocalFrame/模型/ColorScale/IDW/CrsTransform/GeoLocalFrame) | ✅ |
| P2 | data(解析器/LocalSampleRepository)+ 对象树 | ✅ |
| P3 | 登录(RsaEncryptor/ApiClient/AuthService/LoginWindow) | ✅(**Credential 记住免登录未做**) |
| P4 | 渲染:render 层 + 二维地图(线)+ 三维(帘面/体素/切片/地形)+ 数据详情(#18/#17/异常/电极) | ✅ **核心全达成**:三视图 + #17 + 异常 + dd_voxel + dd_slice + DEM地形影像 + 原型六面板。**剩**:底图瓦片(M1.5)、数值标签、Credential 免登录、Z 基准统一、dock 透视持久化 |
## 3. 构建约定(**机器本地**
- VS2026(MSVC 14.51)+ 官方 MSVC Qt 6.11.1(`D:\Qt\6.11.1\msvc2022_64`)+ vcpkg(`d:\dev\vcpkg`)。
- 方案②-修订:Qt/VTK/ADS/QtKeychain 对接官方 Qt(不走 vcpkg);非 Qt 依赖走 vcpkg。VTK 9.6.2 源码编在 `external/vtk-install`。统一 **Release**
- **构建/测试经** `& cmd /c "D:\Git\lanbingtech\geopro\external\dev.bat <cmd>"`(**PowerShell 调**,Bash 下参数透传坏)。C: 极小→TEMP/构建全在 D:。
- **app 构建前先** `taskkill /IM geopro_desktop.exe /F`(运行中 LNK1104 锁 exe)。
- 部署:`D:\Qt\6.11.1\msvc2022_64\bin\windeployqt.exe --release <exe>`(找不到 ads dll 的警告无害);VTK/vcpkg dll 由 POST_BUILD `TARGET_RUNTIME_DLLS` 拷。
- **离屏渲染验证**:`render_verify` 需 PATH 加 `external\vtk-install\bin` + `build\release\vcpkg_installed\x64-windows\bin`;且体素/地形需 `PROJ_DATA=...\vcpkg_installed\x64-windows\share\proj`、`GDAL_DATA=...\share\gdal` 再运行。
- **GDAL**:已加 vcpkg `gdal`(首次编译久,连带 hdf5/netcdf/geos 等;已缓存)。app/测试运行时需 PROJ_DATA(app main() 已自动按候选路径设;部署须随包附带 proj/gdal 数据)。
- **改源码用 Write 工具,勿用 PowerShell `Set-Content -Encoding UTF8`**(会把中文注释弄乱、断构建)。
## 4. 关键决策与已核实事实
- 登录:基址 `http://tenant.geomative.cn/pop-api`;头 `geomativeauthorization: Geomative <token>`;`getImageCode` 验证码答案**明文** `data.code`;`verifyCodeCheck→login2` 靠**会话 cookie** 串联;login2 `checkCode` 空;token=`data.accessToken`。
- **RSA 公钥已取**(Playwright route 注入 setPublicKey hook + 缓存绕过 + 真登录捕获),`resources/rsa_public_key.pem`(RSA-2048,PKCS#1 v1.5)。
- **CRS ✅ 已实证确定(2026-06-08)**:剖面 `projectX/Y` 的真实 CRS = **EPSG:4547「CGCS2000 / 3-degree Gauss-Kruger CM 114E」**(=`+proj=tmerc +lat_0=0 +lon_0=114 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80`)。
- **如何确定**:同一条测线既有网格电极 `lat/lon`(EPSG:4326)又有散点 `projectX/Y`;用 pyproj 把 lat/lon→EPSG:4547 得 `dX=+0.20m, dY=+0.30m`(亚米级),反向→经纬 `dlon/dlat≈3e-6°(~0.3m)`。Krassovsky(北京54)椭球差 44m 排除→**椭球=GRS80/CGCS2000(与 WGS84 现今差<1m,M1 可视化无影响)**。
- 旧结论"EPSG:32649 解出 111°E"是因 32649 中央经线=111°E;改用 CM=114°E 即完美吻合
- **影像 `image.tfw` 仍是 EPSG:3857**(与项目系不同,DEM/底图须 PROJ 重投影);`dem.tif` 自身 CRS GDAL 读时核对
- **影响**:DEM/影像 **dd_voxel 回归 不再被 CRS 阻塞**——散点 projX/Y 可经 EPSG:45474326→`GeoLocalFrame` 与帘面/地图配准
- **坐标统一**:帘面/地图/数据详情已统一用 **lat/lon→GeoLocalFrame(等距圆柱)局部米**;dd_voxel 输入(散点 projX/projY)现可经 **EPSG:4547→lat/lon→GeoLocalFrame** 配准(CRS 已定);VoxelActor 代码就绪,待接入
- 网格 `v`/`z` `[j=y][i=x]`,点序 i 最快;深度 `y` 越大越深渲染时 **z 取负**;colorBar 网格色阶 alpha=0255、LVL 色阶 alpha=01;等值线级用 **colorBar 真实分段值**(均匀分级会一片蓝)。
## 5. 正确的视图模型(已实现,**P4 续做务必照此,勿再走偏**
对齐原型 + 物探用户工作流:
- **二维地图** **三维视图** **两种不同内容**(地图=测线线/点/底图;3D=断面墙/体素/地形),**不是同一物体换相机**。
- **数据详情**(下方)才是"分析单条数据集"的专业图(ERT=#18 平面反演剖面)。
- 体素异常体是 3D 视图里的内容/派生产物,**不是对象树里硬塞的兄弟节点**。
- 渲染表现由 **dd 类型**决定(dd_section帘面/剖面;dd_voxel体绘制;轨迹;异常线/)。
- **2D 相机可考虑锁旋转**(只平移缩放)以区别 3D
## 6. 已知问题 / 待办P4 下次会话)
1. ~~**散点 #17**:`ScatterActor`(剖面原数据 2597 点彩色散点),数据详情"原数据"视图~~ **已完成**(2026-06-08,离屏 PNG 核对吻合 Python 真值,接入数据详情反演剖面/原数据切换;app 待人工登录肉眼复核交互)。
2. ~~**异常叠加**:`AnomalyActor`(markType 点/线/面)~~ **已完成**(2026-06-08,叠加在数据详情 #18/#17 ,「显示异常开关默认开;离屏 `verify_section_anomaly.png` 折线位置吻合 ref_18;样本 3 异常均 markType=2 dashed;app 待人工登录复核)。****:dashed 点画在 VTK OpenGL2 下偏弱(几乎实线),几何/颜色/位置正确,纯观感项可后续调
3. ~~**DEM/影像地形**~~ **已完成**(2026-06-08)。`render::buildTerrain`(GDAL dem.tif 高程 + image.tif 影像;DEM CRS4326GeoLocalFrame 配准成 warp ;影像 EPSG:3857像素纹理坐标贴图)。离屏 `verify_terrain_3d.png` 卫星影像正确贴微起伏面方向正立配准对位。****:影像须用 **GDAL 读像素**(vtkTIFFReader 对此压缩 TIFF 报错);+2 单测;接入 app 3D地形图层dem.tif 低分辨率起伏细微Z 基准与帘面/体素夸张未统一(spec M-3 待办)。
- **dd_slice 交互切片** 已完成(同日):3D切片图层=`vtkImagePlaneWidget` 在体素 image 拖切面(spec M1-b);**左键拖动=移动切面**(默认左键取值光标已改),中键=取值;纵向夸张已烤进体素 image(zDisplayScale),切片/体绘制/帘面同坐标系(切片穿过体素)。
- **性能排查结论(2026-06-08,实测)**:体绘制走 **GPU(RTX3060)**,拖动每帧~715ms( CPU 回退,前判误);拖动流畅。**唯一卡点=首次开体素/切片的 GPU 着色器编译+体上传(一次性 ~1.21.7s)**,属固有成本,M1 可接受(如需消除可后续 pre-warm)。体绘制设 Auto/InteractiveAdjustSampleDistances=0(全程统一全质量,GPU 够快)。教训:勿臆测性能根因(CPU回退/磁盘flush 均被实测否定),用帧间隙时间戳实测定位
4. **dd_voxel 回归**: **已完成**(2026-06-08,CRS 已定 EPSG:4547)。`render::buildVoxelFromScatters`:散点 projX/Y45474326GeoLocalFrame 配准 + IDW(maxDist 裁剪)→ `buildVoxel`;离屏 `verify_voxel_top.png` 两臂支撑吻合 ref voxel_hslice、`verify_voxel_3d.png` profile1 片贴合帘面;+1 单测(VoxelRegister, PROJ_DATA)。**UI 已接入**(增量3):3D视图详情浮层体素图层勾选驱动;main() 自动设 PROJ_DATA(部署须随包附带 proj 数据);PROJ 不可用则该层禁用。****:仅 2 交叉线薄十字片(15.9% 充填,半透明偏淡),可信满体需3线(设计 §1014)。**dd_slice 交互切片未做**(buildVoxel 已暴露 image reslice widget)。
5. **底图瓦片**(二维地图,天地图/Mapbox):M1.5
6. **Credential(QtKeychain)**:记住一个月免登录持久化(P3 Task2 未做)。
7. 多测线:当前样本仅 1 dd_section(grid1);多条共存机制已就绪,加数据即叠加
8. 取景微调(数据详情/帘面的相机余量);纵向夸张倍数(剖面1.5/帘面3)可做成可调
9. render 仍部分内联在 main.cpp;可逐步抽到 view/controller
10. **布局对齐原型**(权威参考 `http://prototype.geomative.cn/`;截图存 `.playwright-mcp/`)。**计划见 `plans/2026-06-08-m1-prototype-layout.md`(六面板 + view/ 抽取,增量序列)**。进度:
- **增量1 右上「异常列表」**(2026-06-08,`panels/AnomalyListPanel`,与数据详情显隐联动;待人工复核)。
- **增量2 左下「数据列表」+ 对象树到 TM 层**(2026-06-08,`panels/DatasetListPanel`; GSTM 复选驱动中央, DS 移出树入数据列表 tab 数据/文件, DS 单击详情+异常+属性, 启动自动选首测线/首数据集;待人工复核)。
- **增量3 3D「视图详情」图层浮层**(2026-06-08,QFrame 浮于 QVTK 左上, 3D 显示;帘面/体素图层勾选;体素经此正经接入=之前移除的工具条开关的正确归宿;main() PROJ_DATA;待人工复核浮层渲染+体素显隐)。
- 🔶 **增量4 电极标记 + 工具条**(2026-06-08,`ElectrodeActor` 顶边 PNG 核对吻合; +「显示电极/显示等值线开关;待人工复核)。****:数值标签色阶配置/滤波处理(M1.5/进阶)。
- 渲染积木累计含 `ElectrodeActor`(顶边 ▼)、`TerrainActor`(DEM 高程面 + 影像纹理,GDAL)。底图瓦片=M1.5。
- 架构:新面板抽到 `src/app/panels/`(暂随 app 编译, login/),控制 main.cpp 体量;后续可升 `src/view/`
## 7. 渲染验证手段(务必用)
```
cmd /c "...\external\dev.bat cmake --build build/release --target render_verify"
# 运行(PATH 加 vtk-install\bin 与 vcpkg bin)→ 看 D:/dev/spike_data/verify_*.png
```
新增/改动渲染后,先用此离屏 PNG 核对方向/颜色/几何,再接进 appapp 是交互窗口,无法离屏验证,接入后需人工登录肉眼确认
## 8. 文档与工具索引
- 设计基线:`specs/2026-06-07-geopro-desktop-m1-design.md`(§45 已含正确视图模型注记)
- 计划:`plans/` phase0-4 + `2026-06-07-m1-view-redesign.md`(正确视图模型)+ spike-report
- 环境:`../ENV_SETUP_Windows.md`
- 验证脚本:`tools/validate_samples.py`(#17/#18 真值)、`tools/validate_voxel.py`(voxel)、`tests/spike/render_verify.cpp`(app 渲染积木离屏核对)
- 渲染积木(render ):`MapLineActor`(测线线)、`CurtainActor`(断面墙)、`GridContourActor`(#18 平面)、`ScatterActor`(#17 散点)、`AnomalyActor`(异常 /线/)、`VoxelActor`(`buildVoxel` 体绘制)、`buildVoxelFromScatters`(散点CRS配准IDW体素,VoxelFromScatters.hpp)、`ColorLutBuilder`、`CameraPreset`、`Scene`;`core::GeoLocalFrame`(经纬局部米)、`core::CrsTransform`(PROJ,EPSG:45474326)。
- 散点 #17 专属色阶经 `LocalSampleRepository::loadScatterColorScale`(剖面原数据自带色阶,范围/分段与网格色阶不同)。