Commit Graph

152 Commits

Author SHA1 Message Date
gaozheng 11349e533c feat(vtk): 底图(B方案)天地图改卫星影像img层(局部卫星地面,对齐原版观感) 2026-06-17 08:02:15 +08:00
gaozheng a588b651a6 feat(vtk): 天地图底图瓦片层 TileBasemap(③:复用WMTS token,经同一frame配准,col2D地图开关) 2026-06-16 22:01:57 +08:00
gaozheng 5d1cf07882 fix(vtk): 抽屉折叠按钮 ◀▶ 文字改 SVG chevron 图标(根因:YaHei缺三角符→DirectWrite字体回退崩);回退GDI临时方案 2026-06-16 18:59:44 +08:00
gaozheng 5fe1c298d2 fix(vtk): 改用 GDI 字体引擎绕开 DirectWrite 字体回退崩溃(勾选数据集渲染时 QPushButton sizeHint 触发,见crash dump) 2026-06-16 18:48:29 +08:00
gaozheng e34abd271f feat(vtk): 注入 Api3dRepository 渲染真实 ERT 帘面+删样本桥(勾选真实ds→真实数据)(①.4) 2026-06-16 18:38:30 +08:00
gaozheng 624cdcbb2e fix(vtk): 本阶段勾选3D数据集渲染样本帘面(LocalSample仅样本;Api3dRepository就绪后改真id) 2026-06-16 17:51:07 +08:00
gaozheng 5e15941cd2 fix(vtk): 修审查问题(H1 setDatasets信号风暴/H2异步陈旧批次竞态/I1全屏按钮互斥) 2026-06-16 17:08:45 +08:00
gaozheng 24d88530af feat(vtk): 三栏数据集列表按维度过滤数据驱动(替换grid1假实现) 2026-06-16 16:46:42 +08:00
gaozheng 2179f149b7 feat(vtk): dockState bump v3 + VTK视图/数据详情 全屏按钮(隐藏其余dock) 2026-06-16 16:17:59 +08:00
gaozheng 5e57d462c8 refactor(vtk): 删三浮层+分段切换,改挂三栏抽屉,接信号,中央改名VTK视图 2026-06-16 15:49:35 +08:00
gaozheng f3a1ba9f99 fix(vtk): 恢复原型切片可拖动配置(SLICE_MOTION)+双击正视(去按钮)
据用户指出'原型阶段切片可拖动调整',查 git(f57291a)原型配置:
  SetLeftButtonAction(VTK_SLICE_MOTION_ACTION) + SetMiddleButtonAction(VTK_CURSOR_ACTION)
我的 SliceTool 漏了这两行→默认左键是窗位调整(无用)→拖切片面无反应=用户的'不能调'。
- 补回两行: 左键拖动=移动切面; 切面边缘 margins 拖动=旋转角度(F25 任意切片可调)。
- 双击正视(D40)改用 widget StartInteractionEvent 检测(同一切片350ms内两次=双击→正视),
  恢复 spec 的双击交互, 去掉上一版擅自加的'正视'按钮(改了需求, 错)。
- 选中=触碰(onInteract); 滚轮/关闭=选中切片; 相机旋转=空白处拖动。ctest 221/221
2026-06-16 11:07:30 +08:00
gaozheng 87c5cc910e fix(vtk): 恢复任意切片可调(F25)+触碰选中+正视按钮(不再砍功能)
之前用 InteractionOff 砍掉了切片可调(F25),错。改回:
- widget 交互保持开启 → 任意切片可拖动调整角度/位置(F25 恢复); 拖切面=widget 处理。
- 选中改为监听 widget StartInteractionEvent(SliceTool::onInteract → selectByTool):
  触碰某切片即选中+高亮(widget 开交互后独占切面事件,拾取式选中失效,故改观察式)。
- 正视(E54)从双击改为工具条「正视」按钮(faceSelected): 双击会被 widget 抢、QVTK 上本不稳。
- 滚轮推进/关闭 仍作用于选中切片; 相机旋转=空白处拖动(默认 trackball)。
- ctest 221/221
2026-06-16 10:50:05 +08:00
gaozheng 87b90a2022 fix(vtk): P3 切片交互手感修复(用户实测反馈)
- 删左上「视图详情」遗留的禁用「切片」复选框(P1占位,已被P3工具条取代)
- 点击跳变 + 绕点旋转无效: onPicked 焦点与相机位置同步平移同一delta,
  图像不跳、旋转中心移到命中点(原来只改焦点致视图突变)
- 双击正视无效: 弃 vtkRenderHWindowInteractor::GetRepeatCount(QVTK+Win不可靠),
  改 std::chrono 手动判双击(间隔<350ms且位置相近); 避开 vtkTimerLog 依赖
- 选中移除: 随上面拾取修复,单击切片可选中→关闭移除选中项(不再只能倒序)
2026-06-16 09:09:38 +08:00
gaozheng 85d4ff57df feat(vtk): P3 三维分析切片交互(核心) — 轴向/任意切片+滚轮+拾取+正视
interact/ 交互层(README早规划,本期落地):
- SlicePlaneMath: 纯几何(法向/45°/滚轮平移/双击正视相机含竖直兜底/最近切片), 25 单测
- SliceTool: 封装 vtkImagePlaneWidget — 轴向(上下/前后/左右,角度固定)+任意45°(Origin/Pt1/Pt2),
  套色阶LUT, reslice着色(非cutter), close幂等
- PickInteractorStyle: 继承TrackballCamera+vtkCellPicker, 拾取/双击/滚轮回调
- InteractionManager: 活动切片/选中态/滚轮分发/拾取联动/翻转, 体素变更先closeAll再附着
- VtkSceneView 暴露 currentVolumeImage_(含VE) + onVolumeChanged; main.cpp 切片工具条(上下/前后/左右/任意/翻转/关闭)
- ctest 221/221

评审修复:
- H1 vtkTrivialProducer 提为成员(局部变量构造后析构→管线断裂崩溃)
- H2 uninstallStyle 向 interactor 注销 style
- H3 safeRender 统一守 destroying_ 跳过析构期 Render
- M1 advance 刚性平移 origin+point1+point2(只移origin致轴向切面变形)
- M2 closeSelected 选中位就近不跳0; M4 sliceBar 加 BottomLeftAnchor 随resize

范围外(P4): 切片保存/导出/删除为数据集/三维分析树/右键菜单/异常圈定/详情
2026-06-16 08:23:16 +08:00
gaozheng 86e07722e5 fix(ui): P2 工具条去 border-radius,消除原生GL上四角浅色直角
对齐左上「视图详情」浮层做法:悬于 GL 画布的浮层不设圆角(圆角四角露父级浅底),
改直角矩形+不透明底。控件自身圆角(落在不透明frame上)保留。
2026-06-16 07:48:12 +08:00
gaozheng 73deb2b159 fix(ui): P2 三维数据集栏控件深色主题 — 修白底浅字看不清
工具条只设了文字色未设控件背景,下拉/按钮保持默认白底→浅字不可读。
补:QComboBox/QPushButton/QSlider 深色背景+边框+hover/pressed+下拉弹窗配色(canvas/* token)。
2026-06-16 07:45:07 +08:00
gaozheng 3dea339ddc feat(vtk): P2 三维数据集栏 — 坐标轴/比例/快捷视图/Zoom
- CameraPreset 扩 6 向快捷视图(前后左右上下) + zoomBy(透视改视角/正交改parallelScale) + fitView
- AxesActor(新, vtkCubeAxesActor): 显示模式 标准(外缘)/三维立体(静态边+网格线)/不显示;
  刻度 无/米/英尺(×3.28084)/经纬度(GeoLocalFrame反算); 字号12(字体待1.0确认)
- GeoLocalFrame 补 toLatLon 反算(等距圆柱)
- I3dSceneView 扩 setAxes/applyCameraView/zoom/fitView; VtkSceneController 加对应槽
  (坐标轴随场景重建; 快捷视图/zoom 仅改相机不重建)
- main.cpp 三维视图工具条: 坐标轴/刻度下拉(枚举绑itemData)+比例滑块(1-10)+6向钮+Zoom钮, 仅3D显示
- 测试 +24(toLatLon往返/相机6向/坐标轴单位换算/控制器编排), ctest 196/196

评审修复:
- HIGH rebuildAxes 异步路径坐标轴 prop 累积 → 持 currentAxes_ 重建前先移除(幂等)
- MEDIUM combo index 魔数 → itemData/currentData 取枚举值(防项序调整静默错位)

注: 坐标轴标准/立体语义 + 字体 + O点 为合理近似, 待 Geopro 1.0 实地确认精修
2026-06-15 21:54:48 +08:00
gaozheng 53ccdc07b0 fix(vtk): 勾选数据集时隐藏中央引导层,露出 P1 渲染
P1 接了 VtkSceneController 渲染但漏接 emptyState 显隐(main.cpp:368 注释本就要求
'接入真实数据后依是否为空调 setVisible'),不透明引导层盖住渲染。补:勾选有数据→隐藏、
取消→恢复。
2026-06-15 21:17:23 +08:00
gaozheng 0f521c5b24 feat(vtk): P1 复活中央渲染 — VtkSceneController + I3dSceneRepository + Scene加vtkProp
复活被 6241eb3 摘除的中央 VTK 数据驱动渲染:
- Scene 新增 addViewProp(vtkProp*):体绘制 vtkVolume(非 vtkActor)经此进场
- I3dSceneRepository(异步回调契约) + LocalSample3dRepository:dimensionOf 维度映射 /
  loadVolume→VolumeGrid(std::array 去裸数组) / loadTerrainPaths;data 层零 VTK 依赖
- VtkSceneController(QObject) 取代 main.cpp 死掉的 rebuildCentral lambda + 裸 show* 标志:
  勾选数据集/视图模式/图层/比例 → 经仓储取 core::* → I3dSceneView 重建场景;
  QPointer+generation 守异步回调生命周期与新鲜度;inRebuild_ 避免同步路径双 render
- I3dSceneView 抽象解耦编排与 VTK(VtkSceneView 真实现 + 测试 fake)
- 删除被取代的 CentralScene;main.cpp 接线 对象勾选/2D-3D/图层/主题(主题 context 用 sceneCtrl 防悬垂)
- 新增测试 14(Scene/3d-repo/VtkSceneController),ctest 172/172 全绿

构建基建修复(本就潜在缺陷,任何 clean 构建/新人 checkout 都会撞):
- vcpkg.json 加 builtin-baseline:新版 vcpkg manifest 模式必需,否则全新 checkout 无法 configure
- build.bat 修 vswhere(VS2026 预览 -latest 恒空 → -all -prerelease -requires VC.Tools)
  + 括号块内路径变量加引号(防 Program Files (x86) 的 ) 提前闭合)
2026-06-15 21:01:26 +08:00
gaozheng 85e455ae4b feat(workbench): 对象/数据集交互对齐规格 + 属性面板可编辑保存
提交体按 bundle/OpenAPI 源码确证修正(替换早期推断版本):
- 新建/编辑 GS:{gsTypeId,parentId(仅新建),projectId,name,responsiblePersonName,properties}
- 新建/编辑 TM:{tmTypeId,id?,name,properties,projectId,parentId,parentType:"1"}
- 去除误用的 typeId/type/structParentId/structParentConfType

动态表单:
- displayComponentType 全集控件映射(1-11 + 默认步进数字)
- requiredType 语义:1=必填、2=只读禁用、其他=可选
- 顶层固定字段(gsTypeId/tmTypeId/name/responsiblePersonName)

新建对象:
- 单弹框 + 框内类型下拉,选后刷新动态表单(GS/TM 对称)
- 方法类型用全局 project/tmList;GS 类型用 project/gsList
- 父对象按节点类型解析:选 TM 仅新建同级 TM(父=其GS/根);项目根按 GS 处理
- 对象树右键 + 面板「添加+」按钮按节点类型分项

属性面板可编辑保存:
- 对象属性面板可编辑 → PUT gsObject/tmObject
- 数据集属性面板:元字段只读 + 描述可编辑 → updateDsObject
  {dsObjectId,description,attachedParameters:{deltaContent}}

数据集:导入向导(multipart) + 模板导出对话框(templateExport/export)

文档:spec(§B 提交体/§E 源码补全) 与 plan 同步更新
2026-06-15 11:52:41 +08:00
gaozheng 1f0081ee34 feat(workbench): 对象/数据集视图交互 — 右键菜单/筛选/删除 + 动态表单编辑保存与新建TM
Batch1(骨架+读联动+删除+筛选):
- ApiClient 补 putJsonAsync/deleteAsync
- 删除 GS/TM/DS(真实 DELETE + 确认框 + 成功刷新)
- 对象树右键菜单(9项)/数据集右键菜单:属性·异常详情·详情联动接现有面板;显示隐藏/定位等 2D/3D 占位
- 快速筛选器(对象按类型批量勾选/反选;数据集按类型+创建日期客户端过滤)+ 数据集单击 tooltip
- 复选框手势修复:点勾选不再触发"选中"重载(viewport 事件过滤 + 复选框命中判定)

Batch2(动态表单引擎+写操作):
- DynamicFormEditor:getDynamicForm schema 驱动(comp1/4/6/7/8 + 必填校验 + properties 预填)
- ObjectFormDialog:拉真实表单→校验→提交
- 编辑保存 PUT /business/{gs|tm}Object(成功刷新,失败回显后端 msg)
- 新建 TM:queryTmType 选型→空表单→POST(带父 GS 上下文)
- 插件子菜单:列出真实 model/list(启动缓存)

数据层:
- EditableForm/TmTypeOption/ModelInfo DTO + parseEditableForm/parseTmTypes/parseModels
- StructNode.typeId;repo loadEditableForm/queryTmTypes/submitObject/listModels;controller currentProjectId()

注:保存/新建请求体为推断(OpenAPI 未文档化提交 body),待真实提交验证后定版。
docs: plans/2026-06-13-object-dataset-interactions.md, specs/2026-06-13-batch2-object-dataset-dialogs.md
2026-06-13 20:03:30 +08:00
gaozheng 2cf2b6aaa7 feat(dataset-detail): dd_grid 白化数据列表 + 引擎服务端分页(vxe-pager)
⑤ dd_grid 详情:单「列表」页签,序号/x/y 三列(均居中),服务端分页。
按原版(vxe-table)实测复刻:序号列前插、按页偏移自增;total 取 data.total;
分页器对齐 vxe-pager(上一页/页码…/下一页 + 前往N页 + 每页条数 50/100/500/1000 默认50 + 共N条记录)。

引擎新增分页能力(通用,后续分页型详情复用):
- TablePayload 加 pageNo/pageSize(>0 才渲染分页器;0=全量列表,measurement/trajectory 不受影响)
- GridDto.parseGridTable 复用通用 parseGridHeaderTable,前插序号列 + 回填分页态
- 仓储 loadAsync 增 pageNo/pageSize 透传,新增 grid.rows 加载器(端点 dd/ert/grid/rows,默认50条/页)
- 控制器新增 loadTabPaged(保留 3 参 loadTab 以维持 tabNeeded 连接)
- TablePager 分页器组件 + DataTableView 按 pageSize>0 显隐并转发 pageRequested
  → DatasetDetailPage/Panel.tabPageNeeded → Controller.loadTabPaged 反向链路
- GridStrategy(dd_grid 单分页页签) 注册入 main

测试:test_grid_dto(序号偏移/total/分页态/空数据) + grid.rows 分派 + GridStrategy 注册
+ 控制器 loadTabPaged 透传/默认页参;154/154 通过。
ABI 关键头(DetailPayloads.hpp)变更后全量重编 geopro 代码并验 obj 新鲜度。
2026-06-13 17:27:39 +08:00
gaozheng b033dc2a2c feat(dataset-detail): dd_trajectory_data 轨迹详情(地图+列表+高程)
在按类型渲染引擎上落地轨迹三页签,新增 LineProfile + WebMap 两个视图 kind。

- 地图(TrajectoryMapView:QWebEngineView + 本地 MapLibre GL JS 4.7.1):
  WebGL 引擎,天地图栅格 WMTS 底图(街道 vec_w+cva_w / 卫星 img_w+cia_w,token,
  t0-t7 子域,逐层 maxzoom);over-zoom 上采样平滑;街道/卫星图层切换 + 回到当前
  位置定位按钮;实心橙点(#ff8c00 白环)+ 连线 + 起点标;经纬度取自
  trajectory/line?frontCrsCode=EPSG:4326(服务端转 WGS84);runJavaScript 喂点(无 WebChannel)
- 高程(LineChartView:QwtPlot + QwtPlotCurve):X=电极号 #1..#40,Y=高程,
  数据空间预算样条平滑(非 Fitted,避免像素重拟合漂移);hover 用 QwtWidgetOverlay
  画虚线参考线+实心点(叠加层不 replot 主图→曲线零漂移)+ 自定义浮动框(#编号/●高程(m) 值)
- 列表:复用通用 DataTableView + 通用 gridHeaderDisplay→TablePayload 解析(14 列)
- LinePayload/MapPayload(DetailPayloads.hpp 加性);TrajectoryDto;TrajectoryStrategy
  (地图/WebMap+列表/Table+高程/LineProfile);ApiDatasetRepository loaderKey
  traj.map/traj.rows/traj.elev;DetailViewFactory LineProfile/WebMap;main 注册
- 构建:geopro_desktop 链接 Qt6::WebEngineWidgets/WebEngineQuick;main 加
  QtWebEngineQuick::initialize()+AA_ShareOpenGLContexts;CMake 部署 WebEngine 运行时

测试 143→148 全绿。夹具 tests/fixtures/dd/ert-trajectory-{rows,line}.json。
2026-06-13 16:36:28 +08:00
gaozheng bc5613f0d2 feat(dataset-detail): dd_ert_measurement_gr_data 接地电阻柱状图详情
在按类型渲染引擎上新增 Bar 视图 kind。

- 柱状图(BarChartView:QwtPlotBarChart 单系列 / QwtPlotMultiBarChart 分组):
  X=电极点 #1..#40(electrodeId),Y=电阻(欧姆)=p1Rg,单系列 P1 实心 #5470c6
  (任一行 p2Rg 非空时加分组系列 P2);Y 轴标题「电阻(单位:欧姆)」横排左上、
  X 轴标题「电极点」、图例 P1;主题跟随;析构 clearSeries 防悬垂
- 列表:复用通用 DataTableView,固定 7 列(ID/日期/时间/P1 Rg(Ω)/P1状态/
  P2 Rg(Ω)/P2状态)
- BarPayload(DetailPayloads.hpp 加性);GrMeasurementDto(parseGrBar/parseGrTable,
  响应为 JSON 数组,p1/p2 isDouble 守卫);GrMeasurementStrategy(柱状图/Bar+列表/Table);
  ApiDatasetRepository loaderKey gr.bar/gr.rows(同一端点不同解析);
  DetailViewFactory Bar case;main 注册

测试 138→143 全绿。夹具 tests/fixtures/dd/ert-gr-rows.json。
2026-06-13 11:46:47 +08:00
gaozheng a00aeb9a56 feat(dataset-detail): 按类型渲染引擎 + inversion 迁移 + dd_ert_measurement_data 详情
将数据集详情从硬编码 ERT 反演重构为通用「ddCode→页签→视图kind」渲染引擎,
把已验收的 dd_inversion_data 迁入新引擎(渲染零变化),并在引擎上实现
dd_ert_measurement_data(ERT原始数据)详情。

引擎:
- 策略声明页签:IDatasetChartStrategy::tabs()→vector<TabSpec{title,ViewKind,
  loaderKey,lazy}> 取代 hasGridPhase();控制器通用化(datasetOpened/loadTab/
  tabReady),按页签槽位保留 abort-and-replace + 句柄身份比对 + deleteLater 三件套
- 单一异步句柄 DetailLoad/ApiDetailLoad(QVariant 载荷),仓储 loadAsync(loaderKey,
  dsId) 扁平分派;删 ChartLoad/GridLoad/loadChartAsync/loadGridAsync/DatasetLoads.hpp
- 视图 IDetailView{widget,setPayload(QVariant)} + DetailViewFactory 按 ViewKind 实例化;
  载荷 Scatter/Contour/TablePayload(core/model/detail/DetailPayloads.hpp)
- Page 按 TabSpec 建页签 + 通用 lazy;inversion 散点/网格迁入,渲染代码未改

dd_ert_measurement_data(③散点伪剖面 + 列表):
- 散点复用 RawDataChartView/ScatterPlotItem:x=斜距/y=伪深度(负向)/色=视电阻率,
  连续 cauto(含负离群值),colorBar 取自 colorGradation businessCode=R0&type=3(混合
  hex+rgba/AlphaScale::Unit);电极灰菱形(#BEBEBE实心+白描边 size16);A/B/M/N 与电极
  浮动 hover;数据点尺寸对齐原版 12px;色阶底部横向(与反演一致)
- 通用 DataTableView(gridHeaderDisplay/filedList+rowList,均衡等宽列+居中+隐藏/显示
  开关列);MeasurementDto 解析(散点位置数组 + vmap 摊平)
- 工具条视觉 1:1(信息/框选/显示/隐藏/数据过滤/x·y·v·计算方法下拉/色阶配置/生成视电阻
  率/反演运算/另存为);显示隐藏+x/y 下拉轻交互,其余占位

测试 75→138 全绿。Phase0 真实响应夹具 tests/fixtures/dd/*。
2026-06-13 10:51:24 +08:00
gaozheng 10072eb4b3 feat(dataset-detail+app): 数据集树/按根分页 + 暗色主题保真 + 详情图保真 + 桌面日志崩溃捕获
本分支累积的数据集详情与桌面端健壮性工作(多轮迭代,已逐项实测/用户验收),一次性提交。

数据集列表树化 + 按根分页:
- 原版数据列表为 el-table 树(派生数据按 sourceShowParentId 挂源「原始数据」下);
  DsRow 加 parentId,parseDsRows 解析 sourceShowParentId(回退 parentId),
  DatasetListPanel 由 QListWidget 改建 QTreeWidget(卡片委托泛化到 QAbstractItemView)。
- 后端 data/page 按扁平 DS 分页 → 改为客户端按「第一层节点(根)」分页:
  loadRowsAsync 加 pageSize,selectObject 一次取全,新增 emitNextDataRootPage 按根切页(5根/页),
  loadMoreData 改同步切页;main.cpp 加载更多计数改按根。

暗色主题保真(浅色保持与原版 1:1,仅暗色改 token):
- 新增 ChartTheme::applyChartPlotTheme:按 isDarkTheme() 设 QwtPlot 画布/轴字/网格/零线配色,连 ThemeManager::changed 热切换。
- ColorBarWidget、LoadingOverlay 底色/蒙板/文字同步跟随主题。

详情图渲染保真:
- colorBar alpha 标度修复(混合 hex+rgba 格式,rgba alpha 为 0–1,Bit255→Unit)。
- 散点 cauto 归一化(ColorMapService.setDataRange 解耦色阶形状与数据归一化)。
- 散点 hover 提示(ScatterHoverTip,X/Y/值 3 位小数,canvas mouseTracking)。
- 详情页签用数据名命名。

桌面端日志 + 崩溃捕获:
- Logging:滚动日志 + MiniDump 崩溃捕获 + VEH 抛点符号化;main.cpp GuardedApplication::notify 顶层异常护栏。
- 根 CMakeLists Release 产出 PDB(/Zi /DEBUG);ColorMapService NaN/Inf 守卫。

测试 116→122 全绿(+ParseDsRowsParentIdForTree / DataPaginatesByRootNodeNotFlatCount / 散点/colormap 回归)。
2026-06-12 19:00:32 +08:00
gaozheng 5f00cdce7a refactor(net+data+app): ProjectListDialog 异步化 + 删同步 IProjectRepository/RepoResult/ApiClient.get|postJson(清除过渡技术债,全 App 网络层异步)
- ProjectListDialog 迁到 IAsyncProjectRepository:fillTypeFilter/query 改 abort-and-replace + 身份比对 + done/failed 双分支;析构 abort 在飞请求(退出契约)
- main.cpp buildWorkbench 形参改 IAsyncProjectRepository&
- ApiProjectRepository 删 public IProjectRepository 与 9 个同步方法实现;删不再用的 ok()/errorOf() helper
- 删除 src/data/repo/IProjectRepository.hpp(含 RepoResult,已无消费者)
- ApiClient 删同步 get/postJson + Impl::await + <QEventLoop>/ApiResponseParse.hpp include
2026-06-12 09:31:54 +08:00
gaozheng 0cb0ed8aa0 refactor(detail): 控制器按 ddCode 走 ChartStrategyRegistry 分派, 未注册优雅降级 (替代硬编码 dd_inversion_data)
- IDatasetChartStrategy + ChartStrategyRegistry 下移到控制器层 (src/controller, namespace geopro::controller), 删 app 层那份, 修层级倒置 (控制器不得依赖 app)
- 接口加 hasGridPhase(); ErtInversionStrategy 留 app 层, 改继承 controller 接口, hasGridPhase()=true
- DatasetDetailController 构造注入 ChartStrategyRegistry&; openDataset 用 registry.supports 降级; loadGridData 用 strategy->hasGridPhase 判定
- main.cpp 构造 registry 注册 ErtInversionStrategy 并注入 (registry 先于 detailCtrl 声明)
- 测试: registry 加 hasGridPhase 断言; 控制器加空注册表降级 + 无网格阶段跳过网格加载用例; 全量 109/109 绿 (基线 106)
2026-06-12 08:14:19 +08:00
gaozheng 8b3bc50f58 harden(app): setData 重置遮罩 + loadFailed context=detailPanel(防野指针) + LoadingOverlay Q_ASSERT(parent) + 删未用 include(评审 I-1/I-2/M-3/4/5) 2026-06-11 21:06:35 +08:00
gaozheng dc9506c260 feat(app): 网格懒加载「加载中」遮罩(LoadingOverlay) 接 loadStarted/隐藏于就绪或失败 2026-06-11 20:59:32 +08:00
gaozheng eaa3770f93 feat(app): qRegisterMetaType<ApiResponse> 注册(异步信号元类型,防御性) 2026-06-11 20:53:58 +08:00
gaozheng 53dbcee052 fix(ui): 数据详情dock设ForceNoScrollArea(禁ADS把标题/页签卷入整体滚动条),内容自适应填充 2026-06-11 17:57:54 +08:00
gaozheng bac0a198ff feat(ui): 网格数据懒加载接线(控制器 gridReady + 页签首次激活触发)
DatasetDetailController 新增 GridData 内嵌结构 + loadGridData slot
(busy 守卫, 仅 dd_inversion_data; 拉 rows+色阶type2+异常) + gridReady 信号。
buildTabbedPanel 暴露 tabGroup 供调用方监听页签切换。
DatasetDetailPage 在「网格数据」页签首次激活且未加载时 emit gridDataNeeded;
setGridData 转发给 GridDataChartView 并标记已加载(切 ds 重置)。
DatasetDetailPanel 透传 gridDataNeeded / 按 dsId 路由 setGridData。
main.cpp 接线 gridDataNeeded->loadGridData, gridReady->setGridData。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-11 17:00:07 +08:00
gaozheng 82b654176e fix(ui): 审查修复 loadFailed接线/控制器重入守卫+ddCode降级/散点越界/点异常/Tab deleteLater/makeLines
- main.cpp: DatasetDetailController::loadFailed 连接到 statusBar,5s 显示失败消息
- DatasetDetailController: 加 busy_ 重入守卫;ddCode 非 dd_inversion_data 时直接 loadFailed 降级
- DatasetChartView::showScatter: 按 x/y/v 三者最短长度循环,防越界;加 #include <algorithm>
- DatasetChartView::rebuildAnomalyItems: 先处理 markType==1 点异常(小方块),再走原折线/多边形分支
- DatasetChartView::clearChart: 加注释说明 scene_->clear() + anomalyItems_.clear() 不变式
- DatasetDetailPanel: tabCloseRequested 改用 deleteLater,避免在事件处理期间同步析构
- ContourBands: buildContourBands 按 opt.makeLines 决定是否开 GenerateContourEdgesOn 及提取等值线
2026-06-11 12:42:04 +08:00
gaozheng 08ba483550 feat(ui): 接线数据详情面板(移除旧VTK详情)+单击聚焦/双击打开/反向联动
- 移除旧 VTK 数据详情 dock(detailWidget/独立 renderer/工具条 原数据·网格数据·显示异常/电极/等值线)
  及 rebuildDetail lambda、共享态(currentDsId/detailMode/showAnomalies/...)与相关连接
- 清理因删除产生的孤儿:animateReveal、DetailMode、kScatterPointSize、kBarBtnQss
- 新建 DatasetDetailPanel 多 Tab 面板 dock(QGraphicsView 平面图表)
- buildWorkbench 加参 DatasetDetailController&;main() 构造 ApiDatasetRepository + DatasetDetailController
- 单击=属性表单+聚焦已开页;双击=openDataset(dsId,ddCode);chartReady→openOrUpdate;
  focusRequested→focusDataset;activeDatasetChanged→反向高亮列表
- 新增 kDsDdCodeRole(0x0104),populateDatasetList 写入 ddCode
- 保留 rebuildCentral 及中央场景、repo.loadGrid(grid1)
2026-06-11 12:18:18 +08:00
gaozheng 7a56e49584 feat(ui): 接线 对象单击/勾选/数据集单击 → 三面板(移除占位) 2026-06-10 21:04:38 +08:00
gaozheng 3ccb8df4ed fix(ui): 修复改名导致的停靠布局丢失(bump dockState键丢弃失配旧布局) + 用户区改回QToolButton(头像图标+姓名职务一行,整块可点)修复挤成一团 2026-06-10 17:41:46 +08:00
gaozheng 9e80b2fea1 feat(ui): 面板改名(对象/数据集/异常/数据集属性) + 原数据/网格数据改为下划线页签(与其他切换一致) + 表头图标间距对齐规范6px(§6.7) 2026-06-10 17:21:36 +08:00
gaozheng 2a666663e7 refactor(theme): 全部项目对话框迁移令牌 + 清理委托接管后失效的列表选中/前景死代码 2026-06-10 17:02:03 +08:00
gaozheng 8f31f043df feat(panels): 异常列表卡片化(色条+类型标签+显隐眼睛,真实数据)(规范§6.3) 2026-06-10 16:44:35 +08:00
gaozheng b26dcc1ca7 feat(panels): 数据/文件列表卡片化(标题+元信息双行+选中竖条)(规范§6.2) 2026-06-10 16:40:14 +08:00
gaozheng 824e8bdf62 refactor(theme): 工作台内联色(对象树/数据详情工具条/停靠分隔)迁移到令牌(规范§4.2/§6.1/§6.12) 2026-06-10 16:27:57 +08:00
gaozheng b2ec3459c7 fix(canvas): 视图详情浮层去圆角(直角)消除浅色模式四白角伪影 2026-06-10 16:14:51 +08:00
gaozheng e60bdbc150 fix(canvas): 空状态卡片用 canvas/bg 等色无缝底(原生GL覆盖透明失效的可靠解法) 2026-06-10 16:08:31 +08:00
gaozheng 8eb0c7413d fix(canvas): 空状态去不透明卡片(移除OpacityEffect) + 视图详情转深色画布浮层(规范§6.5/§7.11) 2026-06-10 16:03:21 +08:00
gaozheng 58cabc6350 fix(view): 2D/3D 统一面板表头(分段页签) + 画布空状态提示用 canvas 令牌融入深底(规范§5/§6.5) 2026-06-10 15:52:45 +08:00
gaozheng 9010b20b57 refactor(ui): 方案A — 移除 ElaWidgetTools,统一为标准 Qt + 单一设计系统
根因: 此前 Fusion+自定义QSS+ElaWidgetTools(自绘控件) 三套样式系统并存、互相打架,
是各种丑/不一致的来源。本次彻底收敛为一套:

- 移除 ElaWidgetTools 依赖(CMake FetchContent + 链接 + spike);所有 Ela* 控件 → 标准 Qt:
  ElaWindow→QMainWindow(原生标题栏)、ElaMenu/MenuBar→QMenu/QMenuBar、ElaLineEdit/ComboBox/
  CheckBox/PushButton/ToolButton/Text/TableWidget→对应 Qt、ElaIconButton→QToolButton+glyph
- 主题系统: 自建 ThemeManager(替代 ElaTheme,QStyleHints 检测系统明暗、持久化、changed 信号热切)
  + 单一「浅→暗」颜色映射(kDarkMap,全 UI 唯一颜色来源) + 单份 QSS(明色基线,暗色按表替换)
- 主题: 跟随系统/浅/深(持久化, 启动应用→登录与主页统一); 字号缩放经 scaledPx 覆盖内联 chrome
- NOTICE/关于 同步去掉 ElaWidgetTools
- ctest 53/53
2026-06-10 14:44:59 +08:00
gaozheng a13b58e09f feat(settings): 设置对话框(外观/关于) + 主题持久化 + 界面字号
- 主题持久化(QSettings ui/themeMode: system/light/dark): 启动时 applyPersistedThemeMode 在弹登录窗前
  应用 → 登录页与主页明暗统一(修登录页一直 dark); 设置里改主题热切, Ctrl+Shift+T 仍可用
- 界面字号(ui/fontScale: 90/100/115/130): applyPersistedFontScale 设 qApp 基准字体; scaledPx() 让
  内联 QSS 的 chrome(顶栏/面板表头/工具条/登录/浮层)字号也随之缩放; 字号改动重启后整体统一生效
- SettingsDialog: 左分类(外观/关于)+右页; 外观=主题下拉+字号下拉(+立即重启); 关于=版本+第三方许可
- 顶栏齿轮 → settingsRequested → 打开设置
2026-06-10 14:03:16 +08:00
gaozheng 52bdf054a6 fix(list): 数据/文件/异常列表退回标准 QListWidget + 写死强选中色
根因: ElaListView 的选中底走 BasicSelectedAlpha, setThemeColor 改它对 ElaListView 不生效(自绘控件坑),
选中色无法变强。与对象树同理, 退回 Qt 原生 QListWidget:
- 3 列表 ElaListView+QStandardItemModel → QListWidget+QListWidgetItem(populate/加载更多/点击/勾选 全回退)
- applyListSelection: 本地 QSS 写死强调蓝选中(明 #C2D9F2 / 暗 #33527A + 适配文字, :!active 防失焦淡),
  与对象树选中色完全一致, 100% 可控、明暗都清晰
- 行为(加载更多/数据集点击/异常勾选显隐)保持
2026-06-10 12:39:23 +08:00
gaozheng e3a1b18efa chore(ela): 去掉 GEOPRO_UI_SHELL 兜底开关 + 新增开源 NOTICE
- main: 删除 env 选壳分支与经典 QMainWindow 回退, ElaWindow 成为唯一外壳(迁移已稳定)
- NOTICE.md: 列出第三方组件与许可证(Qt LGPL / VTK BSD / ADS LGPL / ElaWidgetTools MIT /
  QtKeychain BSD) 及合规要点、Ela 版本钉定说明
2026-06-10 12:02:43 +08:00
gaozheng 107fed8182 fix(ela): 工具条选中态 + 切换器箭头改用 QToolButton+主题QSS(清晰可控)
ElaToolButton 硬限制: 选中态只画极淡 BasicHover(看不清)、展开箭头不可靠、且自绘无法被 QSS 覆盖。
故交互态强的这两类退回 QToolButton + applyThemedStyleSheet(用统一强调色):
- 视图/详情工具条(2D/3D, 原数据/网格数据, 显示异常/电极/等值线): 选中 = 强调色文字 + 2px 强调色下划线,
  明暗都清晰可辨
- 切换器: QToolButton + 文字'▾'(清晰, 不再是 ElaToolButton 那个发糙/消失的箭头) + 悬停底
其余(菜单/列表/树/表单/图标按钮)仍 Ela。强调色已全局统一为品牌蓝
2026-06-10 11:39:20 +08:00
gaozheng 0867636ea4 feat(ela): 统一品牌强调色 + 切换器箭头修复 + 图标中性化 + 树缩进收紧
配色根因: Ela 默认主色(#0067C0亮/#4CC2FF暗)与项目品牌蓝 #2D6CB5 是两种蓝, 互相打架。
- applyBrandAccent(): 用 ElaTheme::setThemeColor 把 Primary 设成品牌蓝(亮 #2D6CB5/暗 #5E9BD6,
  含 Hover/Press 三态) → 所有 Ela 原生控件选中/激活/标题栏强调 + 本项目 QSS 共用一套蓝
- 切换器图标: #2D6CB5 → setThemedGlyph 中性主题色(蓝只留给选中/激活), 与面板图标一致
- 切换器箭头: 成员 QToolButton* → ElaToolButton*, setMenu 走 Ela 重载 → Ela 自绘清晰展开箭头
  (之前去掉手加的▾后没箭头, 是因为基类 setMenu 不触发自绘)
- 对象树缩进 20→14, 更紧凑
2026-06-10 11:05:45 +08:00
gaozheng c5393e8ac3 fix(ela): 标题栏收紧 + 切换器去掉重复下拉箭头
- ElaWindow AppBarHeight 45→38(默认偏大, 更接近原生标题栏高度)(点1 过大)
- 切换器去掉文字里手加的 '▾'(ElaToolButton 给带菜单按钮自绘展开箭头, 原来与文字▾重复)(点2)
- 注: 显示为 100% 缩放, 无 DPI 模糊; 若 Ela 自带标题栏图标仍觉软, 属其 Fluent 渲染风格
2026-06-10 10:51:36 +08:00
gaozheng 3aa4e1bfe2 feat(ela): 视图/详情工具条 → ElaToolButton 行(替 QToolBar+QAction)
- 视图工具条(二维地图/三维视图): QToolBar+QActionGroup → QWidget+QHBoxLayout+ElaToolButton+QButtonGroup(互斥)
- 详情工具条(原数据/网格数据 互斥 + 显示异常/电极/等值线 开关): 同上 + QFrame 分隔
- 连接: QAction::triggered→QAbstractButton::clicked, QAction::toggled→QAbstractButton::toggled;
  视图模式/详情模式/叠加显隐 行为保持
- 注: 工具条交互(2D/3D 切换/详情模式/三个显隐开关)为活逻辑, 需运行验证
2026-06-10 10:27:33 +08:00
gaozheng 8e7563c0f5 feat(ela): 数据集/文件/异常列表 → ElaListView + QStandardItemModel
- DatasetListPanel/AnomalyListPanel: populate 签名 QListWidget*→QStandardItemModel*,
  QListWidgetItem→QStandardItem(setData(value,role)/setCheckable/setIcon/setForeground)
- main.cpp: 3 列表 → ElaListView + QStandardItemModel; removeLoadMore/addLoadMore 改 model
  (rowCount/item/removeRow/appendRow); itemClicked→clicked(QModelIndex);
  anomaly itemChanged→model itemChanged; 加载更多/勾选显隐/点击 行为保持
- 注: 列表交互(异常显隐/加载更多/数据集点击)为活逻辑, 需运行验证
2026-06-10 09:48:24 +08:00
gaozheng 68d832c57b fix(ela): 登录窗主题化 + VTK 背景稳健随主题 + 扫清所有硬编码浅色 QSS 遗漏
- 登录窗: setStyleSheet → applyThemedStyleSheet(整窗随主题, 品牌带文字用 white 关键字恒白);
  refreshBtn/errorLabel 也随主题。修暗系统下浅窗+暗 Ela 控件割裂、占位文字看不清
- VTK: 改为主题切换时重跑 rebuildCentral/rebuildDetail(走完整渲染必重绘, 兼顾 syncSystemTheme
  异步切暗时序); rebuildDetail 也按 vtkBackground 设背景
- 主动扫描修掉遗漏: dockManager 分隔条、数据集/文件列表、对象树枝/hint、空状态标题/提示 全走主题
- themed() 公共助手(给需拼接 ADS 样式的 dockManager)
2026-06-10 09:32:22 +08:00
gaozheng f5eff9e185 feat(ela): C VTK 视口背景随主题 + A 浮层勾选框 Ela 化
- vtkBackground(): 取 ElaTheme 窗口底色; CentralScene/详情渲染器初始用它; 切主题时中央+详情重设+刷新
- 浮层图层勾选(帘面/体素/切片/地形) → ElaCheckBox
- 说明: 自定义 chrome(工作空间/项目切换器/图标按钮/PanelHeader tab/工具条)保留并随主题(强换 Ela 会丢设计); 状态栏由 QSS 随主题
2026-06-10 09:17:45 +08:00
gaozheng 57c452e2d3 feat(ela): 菜单全换 ElaMenu/ElaMenuBar(根治圆角露直角) + 登出功能
- TopBar: 4 主菜单/子菜单/切换器菜单 → ElaMenu, 菜单栏 → ElaMenuBar(自绘透明圆角弹窗+随主题);
  去掉 #appMenuBar 内联 QSS; Theme.cpp 删除 QMenuBar/QMenu QSS(否则 border-radius 仍露直角)
- 登出: 头像改可点击 QToolButton + ElaMenu「退出登录」→ logoutRequested 信号;
  main 接信号 → forgetSession() 清凭证 + QProcess 重启回登录页(撤销之前的 GEOPRO_FORCE_LOGIN 补丁)
2026-06-10 09:12:05 +08:00
gaozheng 4a785ede88 fix(ela): 内联 chrome 也跟随主题 — 修暗色下切换器文字看不清等
截图问题根因: TopBar/PanelHeader/3D浮层 用每控件内联 setStyleSheet(硬编码浅色 hex),
未走全局 ElaTheme 替换 → 暗色下保持浅色令牌(深字落深底→看不清; 白底面板表头等)。
新增 applyThemedStyleSheet(widget,设计稿QSS): 按 ElaTheme 角色着色 + 随明暗自动重着色。
TopBar/PanelHeader/layerPanel/layerTitle 内联样式全改走它; 补 #EEF1F5/#E6EAF1/#EAEEF5 角色。
2026-06-10 08:59:59 +08:00
gaozheng 9091d8c929 fix(ela): 启动主题跟随 ElaTheme 初始模式(review M2)
避免系统暗色启动时登录窗(标准控件)与 Ela 控件明暗错配。
2026-06-10 07:57:41 +08:00
gaozheng c8812aa8a6 feat(ela): P3-a 登录窗 Ela 化 + eApp->init 无条件化
- main.cpp: eApp->init() 提到登录前无条件调用(Ela 控件在登录窗/各面板都要用,登录在选壳前)
- LoginWindow: 输入框→ElaLineEdit, 记住登录→ElaCheckBox, 登录按钮→ElaPushButton;
  去掉它们的自定义 QSS 让 Ela 自绘 Fluent+自动明暗; 品牌头/字段标签/验证码/刷新链接保留
- Ela 控件均继承对应 Qt 基类, 故成员仍用 Qt 指针(多态), 不改 .hpp; 现有方法调用照常
2026-06-10 07:49:15 +08:00
gaozheng 26404cee2f feat(ela): P2 暗色主题桥 — ElaTheme 明/暗 → 全局 QSS+调色板联动
- Theme.cpp: kDarkMap 浅→暗 hex 映射, 复用 kStyleSheet 结构生成暗色 QSS(含 ads--*);
  buildPalette(dark) 暗色调色板; applyThemeMode(app,dark); applyTheme=浅色快捷入口
- main.cpp(ela 分支): 连 ElaTheme::themeModeChanged → applyThemeMode 同步非 Ela 面;
  初始对齐(解 review C2); Ctrl+Shift+T 切换(正式按钮待 P3 TopBar Ela 化)
- VTK 视口背景暗色联动记入 P4(渲染器在 buildWorkbench 内, 需另接)
2026-06-10 07:43:46 +08:00
gaozheng af0012fd70 fix(ela): P1 底部状态栏贴底边 — setCentralCustomWidget 改 addPageNode
ElaCentralStackedWidget::setCustomWidget 用 insertWidget(0,...) 把控件插到页栈容器之上,
被禁用的空导航页栈仍占底部空间,状态栏不贴底边。改用 addPageNode 把工作台作为唯一页面
放进中心页栈,填满到底边。
2026-06-10 07:38:41 +08:00
gaozheng 8d938dd848 fix(ela): P1 code review 修复
- H1: ElaWidgetTools GIT_TAG 钉到 b80eadc(可复现)
- H3: 内层 QMainWindow 以 ElaWindow 为父构造(避免无父期调色板/DPI 抖动)
- M4: spike 改 option(GEOPRO_BUILD_ELA_SPIKE) 守卫,默认不编
- 备注: ctest 53/53 通过; C2(applyTheme 顺序)为 P1 有意共存,P2 主题桥统一; H2/M1 记入 P4
2026-06-09 21:39:47 +08:00
gaozheng fc282824b9 feat(ela): P1 换壳 — ElaWindow 包裹工作台(GEOPRO_UI_SHELL=ela 开关)
- src/app/CMakeLists: 链接 ElaWidgetTools + 部署 Qt 插件(platforms/imageformats/iconengines/styles)到 exe 旁
- main.cpp: GEOPRO_UI_SHELL=ela 时用 ElaWindow.setCentralCustomWidget 包裹内层 QMainWindow 承载工作台;
  经典壳为默认且行为不变(仅改堆分配); buildWorkbench 零改动; 全程可回退
- build.bat: 还原(撤销上次破坏脚本解析的中文 TEMP 注释); 构建临时目录改由调用方 TEMP->D: 设置
2026-06-09 21:34:27 +08:00
gaozheng 1a9fb72cf0 feat(ui): impeccable 设计令牌体系 + 空状态/语义色/动效 + dock 标题修复
- typeset: Theme.hpp 新增排版令牌(type::),统一各处散落字号/字重
- layout: 间距/圆角令牌(space::/radius::),圆角 6 档→2 档,手调奇数余白对称化
- delight: 中央空状态引导浮层、上下文化加载文案、登录错误淡入
- colorize: 语义色令牌(semantic::),项目状态着色、状态栏错误染色、异常徽标警示色(休眠)
- overdrive(休眠): 详情视图相机补间+actor淡入(animateReveal),待 dd 详情渲染接通后激活
- fix(dock): restoreState 后重新隐藏 ADS 子窗口标题栏,修复已保存布局下标题栏复现
2026-06-09 20:26:00 +08:00
gaozheng 0af33f1952 merge: 合并 feat/m1-finishing(dock持久化+记住登录QtKeychain+纵向夸张统一)到 feat/real-api-navigation
冲突解决:
- main.cpp:保留导航分支的解耦版 rebuildCentral(调 CentralScene),采纳 m1 的 dock 持久化/记住登录/setOrganizationName,常量统一为 kVerticalExaggeration
- spec 文档:保留当前扩展版(m1 初版为其子集)
- CMakeLists/app:QtKeychain + Credential 与 controller/ProjectListDialog 等自动合并共存
2026-06-09 18:57:33 +08:00
gaozheng b4824a6e4e feat(nav): 项目列表弹窗(名称/类型过滤+分页+8列,点项目名切换)+ 下拉全部项目入口 2026-06-09 18:17:23 +08:00
gaozheng ee8342f4bf feat(nav): ds数据/文件页签创建时间显示 + 加载更多分页(loadTmRows分页+total) 2026-06-09 15:29:42 +08:00
gaozheng 839e5c3487 feat(nav): 数据/文件页签接 data-page/file-page(按TM+classifyType拉取,文件页签展示名/大小) 2026-06-09 14:54:32 +08:00
gaozheng 5b18dc44ae style(app): 数据集列表去隔行变色,改为细分割线+hover/选中反馈 2026-06-09 14:31:25 +08:00
gaozheng 601706d120 fix: 代码评审整改(控制器防重入 + URL 百分号编码 + 测试/注释完善) 2026-06-09 12:15:04 +08:00
gaozheng 405fb2ae4f feat(app): 工作台接入真实导航(空间/项目/对象树/DS),中央渲染占位 2026-06-09 12:01:30 +08:00
gaozheng 6e78e50b0b feat(app): TopBar 升级为数据驱动类(工作空间/项目切换信号) 2026-06-09 11:48:40 +08:00
gaozheng 462cfaac9d feat(m1): dock 布局持久化 + 记住登录(QtKeychain) + 纵向夸张统一
- 3 dock 布局/窗口几何 QSettings 持久化(退出保存、启动恢复;ADS 按标题作键)
- 4 记住登录:FetchContent QtKeychain v0.14.0(Qt6,静态) + Credential 同步存取;登录窗加「记住登录(30天)」复选框;启动有有效 token 则免登录
- 5 Z 基准统一:kCurtainZScale(3)/kDetailYScale(1.5) 合并为单一 kVerticalExaggeration(2.0),帘面/体素/切片/剖面/地形一致
2026-06-09 09:42:27 +08:00
gaozheng 72761fc05f feat(ui): 工作台与登录 UI/UX 整体重构,对齐 Web 原型
- 登录窗品牌化重设计(头部横幅+纵向字段),移除默认账号密码
- 全局浅色主题精致化:基准字体 10pt、去线框留白、下划线标签页、扁平分隔条、High-DPI 直通、压平 Fusion 3D 立体描边
- 顶部:菜单栏(视图/项目管理/业务工具/设备 多级菜单)+ 工具条(工作空间切换/项目选择/帮助·通知·设置/用户)
- ADS 子窗口去除关闭·浮动·拖动等操作并隐藏自带标题栏;改用自绘面板表头(图标+标题+操作按钮)
- 右侧异常列表/对象属性合并为 Tab 面板,属性独立面板;数据集动态标题+数量徽标
- 矢量图标体系(Lucide SVG via QSvgRenderer);状态栏常驻坐标系/世界系原点
- 对象树修复:单标题、保留折叠箭头、选中高亮不覆盖缩进列
2026-06-08 21:06:59 +08:00
gaozheng a0fcc4cc62 fix(render): 切片偶尔停顿根因修复 — 体绘制改全程统一全质量 + 撤销诊断埋点
- 实测(render_verify + 帧耗时埋点)定位: 体绘制走 GPU(RTX3060), 每帧~7ms(669帧全<21ms),
  渲染根本不慢; 前判"CPU回退"错误。"偶尔停顿"是帧间间隙, 非慢帧。
- 根因: ①诊断埋点每帧 flush 磁盘(偶发延迟) ②vtkSmartVolumeMapper AutoAdjust 的"停手补高清"突跳。
- 修: 撤销帧耗时埋点(及无效的 DesiredUpdateRate 改动); VoxelActor 关交互降采样(Auto/Interactive
  AdjustSampleDistances=0)→全程统一全质量(GPU 足够), 消除停手补帧的突跳。
- 全 40 测试绿; app 构建干净。
2026-06-08 12:12:38 +08:00
gaozheng 6c60f5a83d perf(render): 拖切片不卡 — 交互时体绘制自动降采样
- 反馈: 开体素时拖切片卡(每帧全质量重渲 GPU 体绘制跟不上拖动帧率)。
- 修: 切片交互时 interactor DesiredUpdateRate=20fps + VoxelActor mapper
  Auto/InteractiveAdjustSampleDistances → 拖动时体绘制自动降采样提帧率, 松手按 StillUpdateRate 恢复全质量。
- 全 40 测试绿; app 构建干净。
2026-06-08 11:49:53 +08:00
gaozheng 65283492fb fix(render): 切片与体素纵向一致 — 把纵向夸张烤进体素 image(切片穿过体素而非在旁)
- 反馈: 切片显示在 3D 图形旁边/比例不符。根因: 切片(vtkImagePlaneWidget)作用于体素 image 原始
  米坐标(1x), 而体素体绘制/帘面是 3x(actor SetScale) → 纵向比例不一致, 切片错位。
- 修: buildVoxelFromScatters 加 zDisplayScale, 把纵向夸张烤进输出 image 的 z 原点/间距
  (IDW 采样仍用真实 cellZ); app 传 kCurtainZScale 并去掉 volume 的 actor SetScale。
  现体绘制/切片/帘面同在 3x 坐标 → 切片穿过体素、与帘面纵向一致。
- 全 40 测试绿; app 构建干净。(render_verify 仍用默认 1x 在原始坐标核对配准, 不受影响。)
2026-06-08 11:46:39 +08:00
gaozheng f57291a127 fix(render): 地形高程按测线地表基准 rebase + 切片改左键拖动移动切面
- 反馈1 地形浮空/偏位: 诊断确认 DEM 是 WGS84 经纬度(26x10, 覆盖~700x330m), 测线仅~70m 在其南缘
  (横向"偏"实为地形覆盖远大于测线, 地理正确); 纵向浮空因地形用绝对高程(16-95m) vs 帘面深度。
  → buildTerrain 加 zOffset(从高程减基准), app 传测线地表高程中位数 refElev, 使地形落在测线附近。
  完整 Z 基准统一(与帘面/体素夸张一致)仍属 spec M-3 待办。
- 反馈2 切片交互: vtkImagePlaneWidget 默认左键=取值光标(十字), 不直观; 改 左键=移动切面
  (VTK_SLICE_MOTION_ACTION)、中键=取值。现在左键拖动直接滑动切面。
- 全 40 测试绿; app 构建干净。
2026-06-08 11:38:14 +08:00
gaozheng 7007619bf2 feat(render): DEM 地形+影像贴图(spec ④) + dd_slice 交互切片
- TerrainActor(buildTerrain): GDAL 读 dem.tif(高程)+ image.tif(影像); DEM CRS→4326→
  GeoLocalFrame 配准成 vtkStructuredGrid warp 面; 影像经 GDAL 读像素(行翻转正立)作纹理,
  按经纬→EPSG:3857→像素 算纹理坐标贴图(影像/DEM 异源 CRS 重投影对位)。影像读失败→按高程上色。
  离屏 verify_terrain_3d.png 核对: 卫星影像正立贴微起伏面、配准对位。+2 单测。
- 注: 影像须 GDAL 读(vtkTIFFReader 对此压缩 TIFF 报错"reading the row")。
- dd_slice: 3D「视图详情」加「切片」图层 = vtkImagePlaneWidget 在体素 image 拖切面(spec M1-b)。
- 接入 app: 3D 浮层五图层(帘面/体素/切片/地形); repo.demPath()/imagePath(); PROJ 不可用则禁用。
- vcpkg 加 gdal(连带 hdf5/netcdf/geos 等, 已缓存); 全 40 测试绿; app 构建干净。
- 注: 地形/切片 Z 基准与帘面/体素纵向夸张未统一(spec M-3 待办); dem 低分辨率→起伏细微。
2026-06-08 11:25:45 +08:00
gaozheng 8466fe3a5a feat(view): 剖面电极标记 ▼ + 显示电极/显示等值线 开关(对齐原型, 增量4)
- ElectrodeActor(buildElectrodes): 剖面顶边(最浅深度)各 x 列画朝下三角 ▼; 坐标与 #18 一致。
  离屏 verify_section_anomaly.png 顶边电极带核对吻合; +2 单测(三角数/顶点位置/空安全)。
- 数据详情工具条加「显示电极」(默认开,网格数据模式)+「显示等值线」(默认开, gate #18 黑色等值线)。
- 全 38 测试绿; app 构建干净; 待人工登录复核。
- 增量4 剩: 数值标签 / 色阶配置 / 滤波处理(进阶/M1.5)。
2026-06-08 09:52:18 +08:00
gaozheng a2efef8ada feat(view): 3D「视图详情」图层浮层 + 体素正经接入(对齐原型, 增量3)
- 中央 QVTK 左上浮层(QFrame, 仅三维显示, 工具条下方, raise 置顶): 图层勾选「帘面 / 体素」。
- rebuildCentral: 帘面层 gate buildCurtain; 体素层 → buildVoxelFromScatters 体绘制(同纵向夸张)。
  showCurtain(默认开)/showVoxel(默认关)/crs 共享态; 切视图自动显隐浮层。
- 体素经此正经接入(取代 42a7ed1 移除的困惑工具条开关, 这才是它对齐原型的归宿)。
- main() 自动定位 PROJ_DATA(候选路径; 部署须随包附带 proj 数据); PROJ 不可用→体素勾选禁用+提示。
- app 构建干净; 待人工登录复核(浮层渲染于 QVTK 之上 + 勾体素出十字片)。
2026-06-08 09:42:09 +08:00
gaozheng 50c4de4019 feat(view): 左下数据列表 + 对象树收到测线层(对齐原型, 增量2)
- 对象树 GS→TM(测线复选, UserRole+2=tmId); DS(采集批次)移出树, 入左下「数据真实显示栏」
  (QTabWidget 数据/文件; panels/DatasetListPanel)。findTm 按 tmId 查 TM。
- 中央 rebuildCentral 改遍历勾选的测线 → 渲染其 dd_section(可多条共存)。
- 树单击测线→填数据列表; 数据列表单击采集批次→loadDataset(数据详情+异常列表+属性,抽共享 lambda)。
- 启动自动选首个含 dd_section 的测线 + 首数据集(对齐原型默认载入态)。
- structure 取一次共享; app 构建干净; 待人工登录复核。
2026-06-08 09:33:06 +08:00
gaozheng 127e9a0b21 feat(view): 右上异常列表面板 + 与数据详情异常显隐联动(对齐原型, 增量1)
- panels/AnomalyListPanel(populateAnomalyList): 颜色块 + 名称(类型) + 由 location.coordinate
  派生「位置 Xm·深 Ym·尺寸 Zm」; 可勾选(默认显示), UserRole 存异常下标。
- 右侧 dock 拆上下: 右上「异常列表」/ 右下「属性」(补"异常 N 个")。
- 单击数据集→重填列表(QSignalBlocker 防回灌)+ 清空隐藏集; 勾选变化→更新 hiddenAnoms
  → rebuildDetail 逐异常按下标过滤显隐(取消勾选→该异常虚线隐藏)。
- 计划落地 plans/2026-06-08-m1-prototype-layout.md(六面板对齐原型, 增量序列); STATUS §6.10 更新。
- app 构建干净; 待人工登录复核交互。
2026-06-08 09:24:11 +08:00
gaozheng 42a7ed16d4 fix(app): 移除令人困惑的「体素」工具条开关(与二维/三维平级且不在原型)
- dd_voxel 体素引擎(buildVoxelFromScatters)保留:已 PNG 核对 + 单测验证,是合格积木。
- 但把它做成中央工具条开关是设计失误:与"二维/三维"互斥视图平级却是复选、且仅 3D 生效,
  令人困惑(重蹈上会话"2维/3维/体素混淆"覆辙),且原型中央只有「二维地图|三维视图」。
- 中央恢复干净两视图(对齐原型)。体素待做 3D 图层控制(对齐原型「视图详情」浮层)再正经接入。
- 同步移除 app 内 CrsTransform/PROJ_DATA 等仅为该开关的接线; render 层引擎与测试不动。
2026-06-08 09:13:25 +08:00
gaozheng 9b77d07359 feat(render): dd_voxel 回归 — 散点经 EPSG:4547 配准到世界系成体素 + 3D 接入
- buildVoxelFromScatters(VoxelFromScatters): 两交叉测线散点(projX/Y) 经
  CrsTransform(EPSG:4547→4326) → GeoLocalFrame 局部米 + 深度(-ylist) 配准到帘面/地图
  同世界系, IDW(maxDist 裁剪 NaN 留空) → buildVoxel; 暴露 image 供后续 dd_slice。
- 离屏核对: verify_voxel_top.png 两臂支撑吻合 Python 真值 voxel_hslice;
  verify_voxel_3d.png profile1 片贴合帘面(同系配准正确)。
- 接入 app: 中央工具条「体素」开关(仅 3D 有效, 默认关), 与帘面同纵向夸张叠加。
  main() 按候选路径自动设 PROJ_DATA(部署须随包附带 proj 数据)。
- 新增 VoxelRegister 单测(需 PROJ_DATA, tests CMake 已注入); 全 36 测试绿。
- 注: 仅 2 交叉线→薄十字片(15.9% 充填), 体绘制半透明偏淡(低不透明度固有);
  可信满体需≥3线(设计 §10/§14)。dd_slice 交互切片未做。
2026-06-08 09:05:27 +08:00
gaozheng d4b4a4bc64 feat(render): 异常叠加(AnomalyActor) + 数据详情命名对齐原型
- AnomalyActor(buildAnomalies): 按 markType 点(vtkVertex)/线(开放polyline,dashed)
  /面(闭合polyline轮廓), 每异常一 actor 带自身 lineColor/width/dashed; 坐标(x,-y,0)
  与 #18 同空间。离屏 verify_section_anomaly.png 折线位置吻合 Python 真值 ref_18。
- 接入 app 数据详情: 「显示异常」开关(默认开)叠加在 #18/#17 上(同纵向夸张对齐)。
- 按原型(prototype.geomative.cn)重命名数据详情切换为「原数据/网格数据」并调顺序。
- 新增 test_anomaly 4 例(线/面闭合/点/空跳过/颜色/y取负); 全 35 测试绿。
- STATUS §6.10 记录原型权威布局与待对齐项(左下数据列表/右上异常列表/电极/底图)。
- 注: dashed 点画在 VTK OpenGL2 下偏弱(几何/颜色/位置正确), 纯观感项后续调。
2026-06-08 07:56:25 +08:00
gaozheng f51fe44533 feat(render): 散点#17(ScatterActor) — 数据详情「反演剖面/原数据」切换
- ScatterActor(buildScatter): ScatterField+ColorScale → vtkPolyData 彩色方块散点
  (x=距离/y=深度取负, 与#18同坐标系; 点标量+LUT, 色阶范围优先colorBar真实分段值)
- 离屏 verify_scatter.png 核对吻合 Python 真值 ref_17(三角拟断面/顶部深蓝/右侧紫)
- 接入 app 数据详情: 工具条「反演剖面(#18)/原数据(#17)」互斥切换, rebuildDetail 统一重建
- LocalSampleRepository.loadScatterColorScale: 散点自带色阶(范围/分段与网格色阶不同)
- 修复陈旧测试 test_curtain(断言改为 vtkPolyDataMapper+banded 非空 polydata)
- 新增 test_scatter 2 例(点数/verts/上色/y取负/退化安全); 全 31 测试绿
2026-06-08 07:43:49 +08:00
gaozheng ebd7779b51 feat(app): 中央二维地图(测线线)/三维视图(断面墙)两视图 + 数据详情(#18纵向夸张), 接入已验证渲染积木 2026-06-07 23:30:55 +08:00
gaozheng 7713271557 refactor(app): 中央地图/3D单场景(竖直帘面)+下方数据详情(#18平面剖面), 去除体素节点与模式混乱 2026-06-07 22:53:29 +08:00
gaozheng 51f217e1dd refactor(app): 视图改为对象树勾选驱动+单一2D/3D相机, 体素作为dd_voxel数据集(去除三模式混乱) 2026-06-07 22:29:21 +08:00
gaozheng 39b97ffb70 fix(app): 视图模式三按钮(二维/三维/三维体素)互斥连贯 — 切2D/3D回剖面,体素自身高亮 2026-06-07 22:15:55 +08:00
gaozheng 0413e4359a fix(app): 三维体素移除默认黑色切片面(稀疏体素切片多为空区/困惑); 切片待沿数据面的有意义交互再加 2026-06-07 22:06:27 +08:00
gaozheng 3bc006e271 fix(render): 体素卡死修复 — IDW 1/d²快速路径+maxDist提前跳过, 网格粗化(2m/1m), SmartVolumeMapper CPU回退, 忙碌光标; 按钮改名'三维体素' 2026-06-07 22:01:16 +08:00
gaozheng ebf1e0929d feat(render): dd_voxel 体绘制(IDW->vtkImageData->GPU RayCast) + 交互切片
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 21:51:21 +08:00
gaozheng cdf49020af feat(render): render 层(Scene/ColorLut/GridContourActor/相机预设) + 2D/3D 切换 2026-06-07 21:42:55 +08:00
gaozheng 711103e0a1 feat(app): LoginWindow(验证码+RSA真实登录) + 启动登录流程 2026-06-07 21:32:18 +08:00
gaozheng 519d0ed1df feat(app): 对象树->选中数据集->渲染剖面+属性 联动(本地样本) 2026-06-07 20:39:45 +08:00
gaozheng 59f4f0a41a feat(demo): 工作台 QVTK 视图渲染真实 ERT 网格剖面(#18)
端到端打通 core(ColorScale 上色)+ render(VTK banded contour 管线)+ view(Qt/ADS 停靠)。
中央面板显示真实剖面网格数据1的等值面+等值线; 左右为 Phase 2 占位面板。
数据暂从 D:/dev/spike_data 读取(真实 Repository/中文路径/API 属 Phase 2)。
2026-06-07 20:19:21 +08:00