99 lines
11 KiB
Markdown
99 lines
11 KiB
Markdown
# 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→DS,复选框勾选 → 控制中央显示哪些测线。
|
||
- **中央 二维地图 / 三维视图**(两个**真内容**,非相机切换):
|
||
- 二维地图 = `MapLineActor`:测线 `lat/lon` 轨迹**红线**俯视(浅底),像地图。
|
||
- 三维视图 = `CurtainActor`:沿测线的**竖直断面墙**(分段色带,z 纵向夸张×3,沿弯曲测线弯)。中央工具条**仅**「二维地图/三维视图」(对齐原型,无体素按钮)。
|
||
- **下方 数据详情**:工具条「原数据/网格数据」切换 +「显示异常」开关(对齐原型命名)。单击数据集 → 网格数据=`GridContourActor` 平面剖面(#18,colorBar 真实非均匀分段值上色,纵向夸张×1.5);原数据=`ScatterActor` 彩色方块散点(#17,x=距离/y=深度取负,用散点自带色阶);显示异常=`AnomalyActor` 在上图叠加异常 dashed 折线(同纵向夸张对齐)。
|
||
- **右 属性**:名称/网格 nx×ny/vmin·vmax。
|
||
- 单元测试累计 **36 个全绿**(core/data/net/render;含 Scatter 2 + Anomaly 4 + VoxelRegister 1、修复了陈旧的 Curtain mapper 类型断言);离屏 `verify_section/map/curtain_3d/scatter/section_anomaly/voxel_top/voxel_3d.png` 均核对正确(scatter 吻合 ref_17、异常吻合 ref_18、体素 footprint 吻合 ref voxel_hslice 的两臂支撑)。
|
||
|
||
## 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 引擎已验证(UI 未接,待 3D 图层控制)**;**DEM地形(需加gdal) / 底图瓦片 / dd_slice / 布局对齐原型(左下数据列表/右上异常列表/电极/3D图层浮层) 未做** |
|
||
|
||
## 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` 再运行。
|
||
- **改源码用 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:4547→4326→`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=0–255、LVL 色阶 alpha=0–1;等值线级用 **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/影像地形**:加 vcpkg `gdal`;GDAL 读 dem.tif/image.tif;**影像 EPSG:3857 必须 PROJ 重投影到世界系**;`vtkWarpScalar` 地形面 + 纹理。
|
||
4. **dd_voxel 回归**:🔶 **引擎已完成并验证**(2026-06-08,CRS 已定 EPSG:4547)。`render::buildVoxelFromScatters`:散点 projX/Y→4547→4326→GeoLocalFrame 配准 + IDW(maxDist 裁剪)→ `buildVoxel`;离屏 `verify_voxel_top.png` 两臂支撑吻合 ref voxel_hslice、`verify_voxel_3d.png` profile1 片贴合帘面;+1 单测(VoxelRegister,需 PROJ_DATA)。**UI 未接入**:曾加"体素"工具条开关,但与二维/三维平级令人困惑且不在原型,**已移除**;待做 **3D 图层控制(对齐原型「视图详情」浮层)** 再正经接入(届时 main() 需设 PROJ_DATA + 部署随包附带 proj 数据)。**注**:仅 2 交叉线→薄十字片(15.9% 充填,半透明偏淡),可信满体需≥3线(设计 §10/§14)。**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/`)。原型为**四区六面板**,当前 app 为简化版,缺:
|
||
- **左下「数据真实显示栏」**:选中 TM(测线)后列其采集批次(=DS 数据集),tab「数据/文件」。当前 app 把 DS 直接塞树里。
|
||
- **右上「异常列表」**:异常条目(名称/深度/尺寸/电阻率 + 颜色标记 + 眼睛显隐),与数据详情「显示异常」联动。
|
||
- **数据详情工具条**:原型还有 色阶配置/滤波处理/显示等值线标签/纵化容差滑块/显示电极/网格 等(当前仅原数据·网格数据·显示异常)。
|
||
- **电极标记**:剖面顶部倒三角▼电极位 + 数值标签;**底图影像**(3D 卫星底图 + 测线落地)= DEM/底图任务(CRS 阻塞)。
|
||
诚实记录:已对齐者=中央二维/三维切换、数据详情原数据/网格数据/显示异常、对象树、属性。
|
||
|
||
## 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 核对方向/颜色/几何,再接进 app。app 是交互窗口,无法离屏验证,接入后需人工登录肉眼确认。
|
||
|
||
## 8. 文档与工具索引
|
||
|
||
- 设计基线:`specs/2026-06-07-geopro-desktop-m1-design.md`(§4/§5 已含正确视图模型注记)
|
||
- 计划:`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:4547↔4326)。
|
||
- 散点 #17 专属色阶经 `LocalSampleRepository::loadScatterColorScale`(剖面原数据自带色阶,范围/分段与网格色阶不同)。
|