Commit Graph

280 Commits

Author SHA1 Message Date
gaozheng 251046f885 fix(vtk): 切项目 clearCentral 补清底图瓦片(basemap->hide)
切项目时帘面/体素/切片/2D足迹已清,但底图瓦片(锚在旧项目地理位置)残留。
clearCentral 增 basemap->hide() 移除全部瓦片;新项目数据到来 onFrameReanchored
按新位置重显。至此切项目中央区(三栏+渲染图元+底图)全部清空。

build all 绿,341/341。
2026-06-23 19:06:52 +08:00
gaozheng 27905511e6 fix(vtk): 空态浮层钳进视图不溢出+文案更新;切项目清空中央区
- CenterOverlay::reposition 钳制浮层尺寸≤host、偏移取非负,缩小子视图时不再超界;
  空态标题/提示改为与当前功能一致(勾选左侧三维/二维/三维分析栏数据集渲染),标签换行
- 切换项目(topBar projectSwitchRequested / ProjectListDialog projectChosen,带 id≠当前
  守卫避开 delete-refresh)先 clearCentral:清三栏(col3D/col2D/colAnalysis setDatasets({}))
  + 清勾选集(checkedProfiles/Analysis/Slice)下发空到 VTK(pushChecked/syncSlices/
  setChecked2DDatasets({})) + 恢复空态浮层

build all 绿,341/341。
2026-06-23 18:56:40 +08:00
gaozheng bec6a376d5 fix(ui): 详情对话框页脚/表单改走 FormKit 符合视觉规范(去Arco式大按钮)
之前为"像原版"手搭 QFormLayout + Arco式页脚(45%等宽/两端对齐/多主按钮/顺序反),
违反 Geopro3.0 视觉规范 §6.7/§7.5/§7.0.10。改为规范实现(字段结构/API 不动):
- 白化/另存/滤波/网格化:页脚改 formkit::addDialogButtons(右对齐 取消+确定,主按钮蓝);
  异步确认改接 Ok 按钮 clicked(校验/whitenData/save 成功才 accept);表单改 makeEditForm
  +editLabel+capField+addSection;宽度按规范(白化560/另存420/滤波保留宽/网格分组)
- 滤波"保存设置"作次按钮(ActionRole)不抢 primary;网格化 上一步(次)左+取消/确定右
- 快查:ScatterFilterDialog 可编辑输入改 makeEditForm;AutoAnnotation 主操作 setDefault
- 异常各弹窗/反演表单 已合规未动

build all 绿,341/341。
2026-06-23 18:40:11 +08:00
gaozheng 7d0e72dec2 feat(ui): 全局下拉空态优化 EmptyAwareComboBox(占位+暂无数据,对齐Arco)
下拉无数据时原为空白框+空弹窗,不优雅。新增统一空态感知下拉对齐原版 Arco ASelect:
- EmptyAwareComboBox(QComboBox 子类):showPopup 无真实项时临时插禁用灰色「暂无数据」
  条(关闭即移除,不污染取值),仍可点开;占位经 setPlaceholderText(currentIndex=-1)显示
- FormKit 加 comboBox(placeholder) 统一入口
- 全局替换全部 37 处 new QComboBox:7 处数据驱动给占位(白化文件/异常类型/反演模型/
  导入类型脚本/导出模板),30 处仅换类保留自动选首项语义(逐处判断,不破坏取值)

build all 绿,341/341。
2026-06-23 17:35:54 +08:00
gaozheng 438ed78aad feat(detail): 新增异常类型完整1:1(ExceptionTypeDialog 880px双Tab图例编辑器)
替换最小版,完整复刻原版 ExceptionLabel 子弹窗:
- 新建 ExceptionTypeDialog(880px,双Tab异常属性/标注名称):
  异常属性Tab(类型名称/代号必填/标准编号/标准名称/说明 + 按markType点/线/面/文字的
  图例样式编辑器:形状/大小/颜色/不透明度/线形/填充/字体,选项默认对照原版)
  标注名称Tab(自定义格式+分隔符+可增删名称列表 fieldName/fieldCode)
- 仓储 newCustomExceptionType 替换为 addExceptionType(POST /business/exceptionType,
  body 全字段对照原版 handleBeforeOk:legend/exceptionNameList/type:2/exceptionMarkType)
- ExceptionDialog「新增异常类型」按钮接通,成功刷新类型下拉并选中

build all 绿,341/341。
2026-06-23 14:58:36 +08:00
gaozheng 6cc973a183 feat(detail): 异常详情坐标系/网格色阶templateId/新增异常类型 收尾1:1
- I11 异常详情经纬度/投影坐标:Anomaly 加 lonLatPts/eastNorthPts,parseDatasetAnomalies
  按原版响应字段(latitudeLongitude.latLon / geographicalCoordinates.coordinates)解析;
  坐标系下拉条件显示(有 latLon 才给三项,对照原版 latLon.length===0),纯展示不换算
- 网格剖面色阶 templateId:ContourPayload 加 templateId,inversion.grid 加载/重载解析
  getDetail 顶层 templateId,GridDataChartView 传入色阶编辑器→网格色阶另存覆盖可用
- 新增异常类型:仓储加 newCustomExceptionType(POST /business/customExceptionType
  {projectId,exceptionTypeName}),ExceptionDialog 按钮接通+刷新类型下拉

build all 绿,338/338。
2026-06-23 14:35:27 +08:00
gaozheng 3dfe8b54f5 feat(detail): 色阶编辑器另存覆盖 + 散点模板库可用(1:1)
- IColorTemplateRepository/Api 加 updateLvlTemplate(PUT /business/lvlTemplate
  {id,templateName,properties}),对照原版 updateLvlTemplate
- ColorScaleConfigDialog 另存为改自定义弹窗:名称+「覆盖原模板」复选(仅 lvlTemplateId
  非空可勾)→勾选 updateLvlTemplate / 否则 saveLvlTemplate;ctor 增 lvlTemplateId(默认空)
- 散点路径接通模板库:工厂给 Scatter 视图注入 colorTplRepo,构造色阶编辑器传
  colorTplRepo+projectId+data_.templateId→另存/打开/覆盖可用(原 nullptr 禁用)
- 3D 体色阶编辑器(main.cpp)及网格(GridDataChartView)用默认空 templateId,行为不变

build all 绿,336/336。
2026-06-23 14:08:35 +08:00
gaozheng 0212fb5d2e feat(detail): 自动标注对话框补等值线预览图(I13 1:1)
右上补轻量 QwtPlot+ContourPlotItem 渲染反演网格等值面(复用 GridDataChartView 同款
渲染器与 ColorMapService);执行自动标注后 parseDatasetAnomalies 解析预演异常实时叠加,
删除预览行同步移除。构造改收 Grid+ColorScale(统计从 grid.values 算)。

build all 绿,336/336。
2026-06-23 13:53:56 +08:00
gaozheng 75cf8d40ba fix(detail): 反演动态表单支持11种控件+必填校验 + grid按钮视觉 + 色阶templateId
- InversionFormDialog 动态表单不再一律下拉:复用项目既有 parseEditableForm +
  DynamicFormEditor(与对象/结构编辑同款),按 displayComponentType 渲染 11 种控件
  (文本/只读/复选/下拉/日期/时间/日期时间/多行/数字按dataType+limit/树选降级/步进)
  + requiredType 必填校验/只读禁用。生成视电阻率纯select行为不变。
  删除被孤立的 InversionFormParse + 其测试。
- grid 反演按钮行:左"电法列表"radio + 右蓝色主按钮 space-between(仅dd_grid)
- 色阶保存带 templateId(ScatterPayload+DTO捕获色阶detail顶层templateId,measurement
  与反演原数据两路;空可省,对照原版)

后续项(未动,与3D共享风险):ColorScaleConfigDialog 另存覆盖/散点模板库可用。
build all 绿,336/336。GPR/金字塔/.superpowers WIP 未碰。
2026-06-23 12:44:42 +08:00
gaozheng 6bc7c23a8c fix(detail): inversion 异常/自动标注/描述交互返工对齐原版 + 修 getExceptionName
- I9 文字标注:落点后弹 ExceptionTextDialog(字体/大小/颜色/不透明度/内容)写 customLegend;
  补"新增异常类型"按钮(完整子流程标注待办);Anomaly 增 Text=4 + 文字字段
- 修 getExceptionName:原版 data 为纯字符串,客户端误当对象解析→名称回填失败;
  改 wireString 解析,回调签名改 (bool,QString,QString);切类型每次回填
- I10 删除文案对齐原版 contourContentDelete
- I11 详情返工:380px 抽屉式双Tab(图例/坐标),线样式改只读,坐标系切换(图形/经纬度/投影)
  +顶点数+导出txt(经纬度/投影无换算数据,标注;图形坐标可用),提交体仍 {id,exceptionName,remark}
- I13 自动标注返工:1400px,规则卡片(标题/折叠/删除),阈值模式 radio(切换清空),
  右上统计(max/min/mean/median),预览表序号+逐条删除(等值线预览图高成本待办)
- I14 富文本补 背景色/对齐/字体族 工具栏 + QuillDelta 字体族往返;去下划线/列表(原版无)

build all 绿,339/339。GPR/金字塔 WIP 未碰。
2026-06-23 12:26:16 +08:00
gaozheng c21226a3d7 fix(detail): measurement 对话框/工具条视觉返工对齐原版
以原版 web 为准返工 measurement 散点交互视觉:
- 数据过滤:1000px;左直方图(hover柱变红+tooltip)+右信息区(数值范围/占比/原始点数/
  当前点数橙色高亮)+底部双手柄范围滑块(新增RangeSlider)+计算分布/重置;min/max输入
  最大在上最小在下;三方联动(输入↔滑块↔直方图)
- 另存为(RawData):280px、标题"数据另存为"、确认/取消
- 色阶/另存/过滤成功 toast
- 信息面板 A红/B蓝/M绿/N橙(#F4B008);tooltip"查看散点属性"/"散点的点选"
- X/Y/V/值类型下拉固定宽 120/160/160/120;无高程禁用 X/Y
- 导出置工具条最右(页头HeaderAction跨ddCode静态)

API 字段未动。build all 绿。
2026-06-23 11:53:13 +08:00
gaozheng 4a1fecb149 fix(detail): inversion 处理类对话框视觉返工对齐原版(白化/网格化/滤波/另存)
之前用客户端 FormKit 外壳导致与原版 web modal 系统性不一致,以原版为准返工:
- 白化:550px、第2项"白化文件"、边界扩展改文本框、确认/取消顺序、标签右对齐
- 网格化:步1 500/步2 800px、网格参数/数据值设置双分组栅格、"数据值保存为"、
  补恢复默认值按钮 + 间距↔点数双向联动 + 分项校验
- 滤波:900px 左树右设置双卡片、"忽略"、矩阵行列表头 + 奇偶校验
- 另存为(Inversion):标题"另存为新的网格数据"、400px、默认名"网格数据1"、确认/取消
- 工具条:异常标注/自动标注/另存为、原数据另存为 右对齐

API 端点/请求体字段未动(已 1:1)。build all + test 324/324 绿。
2026-06-23 11:31:14 +08:00
gaozheng 8f167b62c9 fix(detail): 白化 tmObjectId 经 open 链路从数据集列表透传(修模板列表为空)
白化「白化模板/模型」方式文件列表为空:原 plan A 用 getDsObjectDetail(dsId)
取 structParentId,实测该响应不含此字段。原版 web 取自数据集行所属 TM
(dsFileRow.structParentId)。

改为 plan B:tmObjectId 从 datasetsLoaded(tmObjectId) 存入树节点新角色
kDsTmObjectIdRole,双击/右键打开时读出,经 openDataset→datasetOpened 信号
→Panel→Page→DetailViewFactory→GridDataChartView 透传,openWhitening 直接用,
删除 getDsObjectDetail 懒拉。

build all(app 链接) + test 全绿,320/320。
2026-06-23 10:51:12 +08:00
gaozheng ec4a7e81ef feat(detail): 补全详情视图剩余交互(框选/绘形/直方图/行级可见性/富文本/白化)
继续数据集详情视图 100% 复刻,补齐上批后置/降级的 6 项。

- M2 measurement 列表行级可见性:DataTableView 载荷驱动可交互开关列
  (仅 measurement 启用),行级 popconfirm → saveDisplayStatus
- M3 数据过滤直方图:新增自绘 ScatterHistogramView,分布柱 + 选区高亮 +
  与 min/max 输入联动
- M14 散点框选:ScatterMarqueePicker 橡皮筋框选 + ScatterPlotItem 选中高亮,
  显示/隐藏对选中子集操作
- I9 异常图上绘形:ContourDrawTool 在等值面上交互绘制 点/线/面/文字
  (先弹窗填类型/名称→图上绘制→newException),坐标表保留为兜底
- I14 富文本描述:DescriptionPanel 升级富文本(粗体/斜体/下划线/字色/字号/
  标题/列表) + QuillDelta 与 Quill Delta 常见格式往返(非 Quill 不可字节级1:1)
- I3 白化 tmObjectId:openWhitening 经 getDsObjectDetail 取 structParentId

修复 ScatterHistogram 命名冲突(widget 改名 ScatterHistogramView,与
ScatterDataOps 的分箱结构 struct 区分),desktop 目标恢复可链接。

抽纯函数 ChartPickGeometry/QuillDelta/buildScatterHistogram + 单测。
build app + test 全绿,318/318 通过。
2026-06-23 10:33:14 +08:00
gaozheng 12813bd8d0 feat(detail): 数据集详情视图交互复刻(measurement/inversion/grid)
对照原版 web 1:1 复刻数据集详情视图的写操作交互,补齐既有视图的全部
可交互能力。

基础设施
- 新增写操作命令仓储 IDatasetCommandRepository + ApiDatasetCommandRepository
  (26 个写/查接口,端点逐字对照原版 apis),回调式异步沿用 ApiColorTemplateRepository 模式
- 写操作注入链平行 setColorTemplateRepo:main→Panel→Page→DetailViewFactory→视图,
  透传 cmdRepo + dsIdGetter
- 新增共享对话框 InversionFormDialog/SaveAsDialog/ScatterFilterDialog/GridWizardDialog/
  WhiteningDialog/FilterDialog/ExceptionDialog/ExceptionDetailDialog/AutoAnnotationDialog
- 纯函数 InversionFormParse/ScatterDataOps/InversionProcessOps/ContourSimplify + 单测

measurement(M1-M13):可见性持久化、数据过滤、X/Y/V轴、值类型、色阶配置、
  生成视电阻率、反演运算、另存为、导出DAT、信息点选
inversion 网格(I1-I15):网格化向导、白化、滤波、等值线提示、简化容差(真生效)、
  异常增删改查+定位、自动标注、描述保存、另存为
inversion 原数据(O1-O3) + grid 反演(G1,functionList 驱动)

后置/降级(台账 §6.4):M14框选、M2行级可见性、M3过滤直方图、I9图上绘形、
  I14富文本(Qt无Quill)、I3白化tmObjectId透传

测试 285/285 通过
2026-06-23 09:21:37 +08:00
gaozheng 08b8ebbf01 feat(ui): 统一对话框外壳+全局控件高度,数据集属性改只读
对话框外壳(formkit)统一,编辑态与只读态同款卡片/分组/边距/按钮栏:
- 新增 dialogRoot/formCard/cardBody/addDialogButtons;buildDetailDialog 复用 formCard
- 生成三维体/导入/导出/异常保存/对象新建/等值线/色阶/设置等对话框迁到统一外壳
- FormKit.hpp 直接 include QLabel/QFrame(editLabel/formCard 返回类型在调用点需完整)

全局控件高度/外观一次补齐(QSS,覆盖所有对话框):
- QSpinBox/QDoubleSpinBox 经 QAbstractSpinBox 统一 box,与输入框/下拉框同高;上下按钮扁平 chevron
- QPlainTextEdit/QTextEdit 补输入框同款边框/圆角/底色
- 新增 chevron-up.svg(数字框上箭头)

数据集属性改为纯只读:移除"修改描述"功能(QTextEdit+保存+saved 信号+repo 依赖),
DatasetAttrPanel 构造简化、main.cpp 相应接线清理
2026-06-23 09:13:17 +08:00
gaozheng 959f030c98 feat(ui): 表单渲染单一真相层(formkit)+只读渲染器(KeyValueView),统一编辑/只读/详情表单
把分散在各文件手搭的表单收敛到唯一实现,杜绝"同类控件各处不一"的漂移:
- 新增 FormKit(DetailForm/buildDetailDialog + makeEditForm/editLabel/capField/addSection)
- 新增 KeyValueView 为唯一只读键值渲染器(§6.4);DynamicFormView 改为内嵌它
- 三维体/切片/异常详情对话框由裸 QFormLayout 迁到 DetailForm+KeyValueView(随内容自适应)
- 生成三维体对话框 + DynamicFormEditor 改用 formkit 可编辑套件(标签列/行距/分组逐像素一致)
- 分组标题统一为 formkit::addSection(编辑态与只读态共用同一段代码)

控件一致性:
- 下拉框/日期框扁平 chevron 箭头(qrc 内嵌 SVG),去 Fusion 原生斜角;日期框补齐输入框同款 box
- 无候选项的"选择"字段退化为 QLineEdit,不再用几何异类的可编辑下拉框
- QComboBox/QDateEdit/QTimeEdit min-height/padding 与 QLineEdit 对齐 → 同高

规范:§7.0.2 标签列宽由区间改精确常量(可编辑100/只读72);新增 §7.0.10 实现纪律
(唯一实现、禁手搭 QFormLayout、精确常量、控件构造一致性、新表单并排验收)
2026-06-23 07:28:48 +08:00
gaozheng 8e91351dab fix(vtk): 二维足迹不可见 + 台湾区天地图底图全占位图
三处缺陷,均由「勾选二维数据集 → VTK 看不到渲染/底图」串起:

1) 摆放默认关闭致足迹静默丢弃
   Column2DDataset「2D视图」下拉可见默认项为 Z=0(setCurrentIndex(1)),
   但该初始信号在 connect 前发射、且组件早于 main.cpp 接线构造 → 永不送达控制器,
   控制器 placement2dMode_ 仍为 0(关闭),勾选被记录却不入场(setChecked2DDatasets
   守卫 placement!=0 不通过)。改:控制器默认 1、main.cpp view2dMode 默认 1,
   与下拉可见默认项对齐,彻底摆脱对信号时序的依赖。

2) 足迹未重锚 frame → 投到数百公里外、移动视角也找不到
   GeoLocalFrame 启动锚在样本 grid1 中位经纬;addCurtain 会重锚到剖面真实经纬,
   但 addMapLine 未重锚 → 台湾足迹(经120.8/纬24.7)按样本锚点投到世界原点数十万米外。
   改:抽出 anchorFrameIfNeeded(剖面/足迹共用),首个带经纬数据(无论帘面或足迹)
   重锚原点;控制器 setChecked2DDatasets 在空场景首批足迹时取景(fitOnArrival)。

3) 台湾区天地图卫星只覆盖到 z16,z17/z18 返回固定「无影像」占位图
   底图四叉树拉近时细分到 kMaxZoom=18 → 台湾中心瓦片全是占位图(实测 z17/z18
   字节恒等 size=4769/MD5 c0edbdcb,z16 为真实影像;内地有 z18 故正常)。
   改:TileBasemap 加自适应 satMaxZoom_,isTiandituNoImagery 按 大小+MD5 精确识别
   占位图 → 学习把卫星上限降到 z-1 并重铺(台湾 18→16 收敛,用 z16 真实影像放大);
   refineTile 卫星层用学习上限,街道矢量仍到 z18;show()/换源复位、refresh 保留。
   内地项目零影响(z18 有影像,永不触发降级)。

测试:253/253 通过;新增 TwoDDefaultPlacementRendersAtZeroOnCheck 回归,
原依赖「默认关闭」的两个用例改为显式 set2DPlacement(0)。
2026-06-22 20:31:25 +08:00
gaozheng 5e60446210 feat(vtk): 色阶编辑器(2D/3D共享)+模板库后端+剖面着色修正+二维数据集足迹
本会话主要交付:
- 色阶配置对话框 1:1 复刻原版(colorLevel/contourLevel/contourLine/colorEditor + colorUtils):
  左三列⚙表格(层级/线形/颜色) + 层级⚙/线形⚙/颜色⚙ 子对话框 + 连续渐变(直方图/读出/min-max/反转)
  + .lvl/.clr 导入导出;文案/校验对齐原版精确 i18n。
- lvl/clr 模板库接真实后端:IColorTemplateRepository + ApiColorTemplateRepository,
  另存/打开/新建色阶/配色方案下拉 经仓储注入 2D(GridDataChartView)与 3D(主对话框)。
- 剖面帘面着色对齐原版 threeContour.js getTerrainColor:上界 stop 取色 + 满 RGB,
  修正"色带整体下移一格 / 发浅发灰 / 丢 alpha"导致与原版差异大的问题。
- 二维数据集视图首切片:勾选轨迹类数据集 → 足迹平铺进 View3D 地图
  (Api3dRepository::loadMapLine 走 dd/ert/trajectory/line + MapLineActor + col2D 接线),
  view2DMode 控摆放高度,顶/底锚真实地表高程(zRefElev)。
- 测试 252 全绿。

并含本分支前序未提交的 UI 工作(ToastOverlay/TopBar/Theme/DynamicForm/若干 panel),
经 CMakeLists/main.cpp 纠缠,随此 checkpoint 一并提交。未纳入未跟踪的 png/yml 及审查报告 txt。
2026-06-22 12:48:45 +08:00
gaozheng b3b030767d fix(startup): 样本/PROJ 数据随包+相对定位+启动防护,修复他机登录后无界面崩溃
登录成功后 buildWorkbench 同步调 repo.loadGrid("grid1") 构建世界系,而
LocalSampleRepository 指向写死的开发机绝对路径 docs/剖面网格数据...;该路径
在他机不存在,readFile 打开失败抛 runtime_error,沿未加保护的调用链冒泡出
main 触发 std::terminate,进程在 window->show() 前消失——表现为登录框关闭
后既无主界面也无进程。本机因该路径存在而正常。

- main.cpp 改为运行时定位样本目录:优先 exe 旁 sampledata/,回退源码树开发
  路径;PROJ_DATA 候选已含 exe 旁 proj/。均不依赖写死绝对路径。
- main.cpp 给 buildWorkbench 包 try/catch:启动期同步加载失败弹可见错误而非
  静默退出(防护 PROJ/数据缺失等任意启动异常)。
- build_installer.ps1 随包 sampledata/(样本演示数据)与 proj/(PROJ 数据)到
  exe 旁,使他机 2D 演示视图与 3D CRS 配准可用。
2026-06-19 17:55:05 +08:00
gaozheng 5beb13c5e2 fix(login): RSA 公钥内嵌二进制(qrc),修复他机登录 invalid public key pem
main.cpp 原先从写死的开发机绝对路径 D:/Git/lanbingtech/geopro/resources/
rsa_public_key.pem 读公钥;readPem 读不到时静默返回空串,RsaEncryptor 解析
失败抛 invalid public key PEM。安装包从未打包该 pem,故仅本机可登录。

改为经 Qt 资源 :/keys/rsa_public_key.pem 读取(公钥可安全内嵌),运行时零
外部文件依赖,任意机器一致,安装包脚本无需改动。

- 新增 src/app/resources/keys.qrc(alias 指向仓库根 pem 单一来源)
- CMakeLists 把 keys.qrc 加入 geopro_desktop 源
- main.cpp 改 QFile 读 qrc;删除孤儿 readPem 及其专用 fstream/sstream
2026-06-19 17:28:26 +08:00
gaozheng b97ea68109 feat(vtk): 三维体/切片数据详情对话框(#6)-右键属性表+体统计持久化
- VolumePropertiesDialog/SlicePropertiesDialog 只读属性对话框(仿异常详情)
- Api3dRepository::volumeInfo 取参数+统计;StoredVolume 持久化聚合测点数(finalizeVolume)
- main.cpp 右键「数据详情」按 ddCode 分派(dd_voxel→体/dd_slice→切片);接口与 LocalSample 零改动
- 切片不含统计(切面网格仓储不持久化,守 YAGNI);体统计仅 loaded 时显示,否则占位
- 单测 +2(volumeInfo loaded前/未知id) → 230/230 绿
2026-06-18 20:28:15 +08:00
gaozheng c83f63a8f5 feat(vtk): 异常属性对话框(#4c-3, R83)-双击异常列表弹只读属性
- AnomalyPropertiesDialog:名称/类型/标记类型/归属三维体/异常体/顶点世界坐标/备注,只读
- Column3DAnalysis:留存 anomalies_,双击 itemDoubleClicked 按 id 回查发 anomalyPropertiesRequested
- main:接线打开对话框
- 截图字段:模型/端点无,不展示(保存对话框截图为mock未持久化)

编译绿(build.bat app);用户实测通过。#4 异常功能收口。
2026-06-18 19:26:02 +08:00
gaozheng 44d31a824d feat(vtk): 异常列表选中→VTK高亮联动(#4c-2, R84 list→VTK)
- I3dSceneView::setSelectedAnomaly + VtkSceneView 实现(选中异常 actor 加粗高亮、其余恢复);
  anomalyProps_ 改 vtkActor 以设线宽/点尺寸
- main:Column3DAnalysis::anomalySelected → sceneView->setSelectedAnomaly
- FakeView 补 setSelectedAnomaly 空实现

编译全绿(build.bat all);用户实测通过。
反向(VTK点异常→回选列表)本期未做(需异常 actor 拾取)。
2026-06-18 19:06:14 +08:00
gaozheng 324d4ac605 feat(vtk): 三维分析区 3D 异常控制(#4c-1)-列表+显示过滤+单条显隐+删除
三维分析栏加 3D 异常控制(异常挂三维体,mock):
- 布局:数据集树 + 「异常」分组框(显示过滤下拉 + 异常列表)放进可拖拽竖向 Splitter,数据集树占多
- 显示过滤(R86-87):全部显示/随GS/随数据集/全部隐藏 —— 独立于体勾选控制 VTK 异常可见性
  (随GS 暂同随数据集;loadAnomalyTree 空key=全部、非空=该体)
- 单条显隐勾选 → setAnomalyVisible;右键「删除异常」→ deleteAnomaly + 刷新
- refreshAnomalies:按档位算异常集合 → clear+addAnomaly 重渲染 + 填列表 + Render
  (修过滤切换后 VTK 不重绘、与列表脱节的 bug)
- 创建异常后经 refreshAnomalies 入列表

编译链接绿(build.bat app exit 0);用户实测通过。
待做:4c-2 列表选中→VTK 高亮联动(R84,需视图 setAnomalySelected);4c-3 异常属性面板(R83);单条显隐态持久化。
2026-06-18 18:57:26 +08:00
gaozheng 6210d615f3 feat(vtk): 异常圈定+保存闭环(#4b)+多项交互修复
#4b 异常圈定→保存→渲染→持久 闭环(异常挂三维体,mock 持久化):
- AnomalyDrawTool:切片平面上圈定多边形(屏幕射线-平面求交落点);左键加点(醒目黄圆点)、
  鼠标移动虚线橡皮筋(末点→光标跟手)、双击/右键/回车闭合、Esc 取消、左上屏幕提示;高优先级观察者绘制期独占输入
- AnomalySaveDialog:名称/异常类型(mock)/备注 + 截图预览及尺寸(R50)
- 切片右键「创建异常」接通:圈定→草稿渲染→截图→保存对话框→saveAnomaly(挂三维体)→红色多边形渲染
- onVolumeChanged→reloadAnomalies:体到场重载其异常(= 显示过滤"随数据集"默认档)
- SliceExport 加 captureRenderWindowPng(异常截图,带尺寸);Anomaly 补 exceptionTypeId/remark

交互修复(用户实测确认):
- 生成三维体**按勾选集合**(checkbox)收集源,不再受行高亮/右键项影响(撤销错误的多选子类)
- buildVolume 网格**覆盖全程**:包络过大时放大间距(fitAxis)而非截断 → 跨 TM 多剖面不再丢远端剖面
- 滚轮回退为"推进当前选中切片";点击切片外**取消选中**(取消后滚轮恢复相机缩放)
- 修圈定闭合误触切片:闭合事件提前 abort,避免漏给切片 widget 触发 slice-motion

文档:plans/2026-06-18-vtk-3d-anomaly.md §6 摆放决策(3D异常控制在三维分析区/右侧总表为全集)+§7/§8 状态;
  design spec 顶部更正块(异常挂三维体/remarkSourceType=标注形态/无截图字段/独立显隐);HANDOFF 更新到 4a/4b。

编译链接绿(build.bat app exit 0);4b 闭环 + 交互修复已用户实测通过。下一步 4c:三维分析区 3D 异常控制(树+过滤R86-87+VTK选中联动R84+显隐+删除)。
2026-06-18 18:31:46 +08:00
gaozheng 4e1b8e7635 feat(vtk): 异常3D基础(#4a)-Anomaly补3D几何+buildAnomaly3D+视图异常方法+Api mock持久化(挂三维体)
异常功能地基(对象→三维体→异常;异常挂三维体非切片,见记忆 vtk-3d-persistence-structure):
- core::Anomaly 补 id/volumeDsId(=remarkSourceId)/consortiumId/worldPts(3D世界点)/planeNormal·planeOrigin,
  保留 2D localPts(剖面详情兼容)
- render::buildAnomaly3D(单异常→世界坐标 点/折线/闭合多边形 actor,不翻y/不压z;抽 buildActor 共享 2D/3D)
- I3dSceneView + VtkSceneView:addAnomaly/removeAnomaly/clearAnomalies/setAnomalyVisible(按 id 跟踪 actor,
  worldPts 已含VE 故不再 SetScale;clear 一并清异常)
- Api3dRepository:StoredAnomaly + saveAnomaly/loadAnomalyTree(按 volumeDsId 过滤+consortiumId 分组异常体)/
  deleteAnomaly/deleteAnomalyGroup 内存 mock(取代 stub onErr)

同时修复测试漂移(此前 3a 加 isVolumeDataset 纯虚 + 3c 改 loadVolume 回调签名后,geopro_tests 一直未随之更新):
- FakeView 补异常方法;FakeSceneRepo 补 isVolumeDataset(可配置 volumeIds)+修 loadVolume 签名
- test_3d_repo loadVolume 回调改 (VolumeGrid,ColorScale)
- 控制器测试 View3DWithVoxelAddsVolume 按新"类型分流"语义重写为 View3DVolumeDatasetAddsVolume(体素XOR帘面)

编译全绿(build.bat all);228/228 单元测试通过。4a 为地基(无 UI 接线、尚不可见),圈定/保存见 4b。
2026-06-18 13:04:14 +08:00
gaozheng d56e35f93d feat(vtk): 切片生命周期重构(3b/3c)-已存切片重渲染+保存链接+场景列表同步
切片"未保存↔已保存"统一状态模型,修复多项交互不一致(用户实测通过):
- 保存=链接当前切片到新 dd_slice(不重绘)+三维分析栏自动展开勾选(syncSlices 按 dsId 去重)→
  不再出现"保存后旧渲染还在、再勾选出现两个"的重复切片
- 持久化存精确三点(Origin/Point1/Point2)+axis(SliceSpec),重渲染逐点精确还原 → 尺寸/朝向一致
  (修"重渲染切片明显变大")
- VTK视图「关闭」已保存切片 → onSliceClosed → 取消列表勾选(场景↔列表双向同步)
- VTK视图「保存」按"未保存/已保存"分派:未保存→createSlice+link+autocheck;已保存→saveSlice 覆盖位姿
- 已保存切片在三维分析栏勾选→在当前活动体上按 spec 还原渲染;取消→移除;靠 onVolumeChanged→syncSlices
  解决"父体异步到场"排序(SliceTool 还原构造/dsId 标签;InteractionManager showSavedSlice/hideSavedSlice/
  selectSavedSlice;Api isSliceDataset/sliceSpec)
- 菜单统一/精简:VTK视图与列表导出统一为「导出▸(图片·dat)」;移除列表(三维体/切片)的"显示/隐藏"(勾选即显隐);
  列表保存=覆盖位姿、保存为=另存新切片
- 修 Column3DAnalysis::setDatasets:按 dsId 保留勾选态 + 仅勾选集变化才发信号 →
  保存切片不再连带取消三维体勾选/重置列表

编译链接绿(build.bat app exit 0);上述场景已用户实测通过。
2026-06-18 09:40:19 +08:00
gaozheng afdd98f416 feat(vtk): 切片右键菜单(VTK视图)+切片持久化mock+导出图片(切片本身,高清)/dat (#3a)
- VTK视图切片右键菜单(设计§2.3):正视图/翻转/关闭(接现有交互)、导出图片/导出dat、保存、创建异常(占位→#4)
  - 右键经 InteractionManager 高优先级(1.0)交互器观察者实现:先于 vtkImagePlaneWidget 消费右键
    (widget 会抢右键并 abort,故 InteractorStyle::OnRightButtonDown 不触发);命中切片或回退选中切片→弹菜单
- 切片持久化 mock:Api3dRepository createSlice/saveSlice/deleteSlice 内存态 + sliceRows()
  (ddCode=dd_slice,parentId=所属体→三维分析栏树中挂父体下,符合需求 R19 对象/三维体/切片结构)
- 导出为图片=导出切片本身(需求 R52):切片重采样 2D → 上采样至最长边2048(保长宽比) → 切片色阶LUT上色 → PNG
  (非整窗截图);导出dat=切片重采样标量网格
- 三维分析栏接线(#5部分):显示/隐藏(VtkSceneView::toggleDatasetVisibility)、切片删除、色阶占位
- main.cpp refreshAnalysis 合并 volumeRows+sliceRows 注入三维分析栏

编译链接绿(build.bat app exit 0);右键菜单/保存/导出图片(切片·高清)已用户实测通过。
3b 待做:已保存切片在分析栏勾选后的重渲染(从 spec 重建)、分析栏保存/另存/导出;#4 异常接真实后端。
2026-06-18 08:09:15 +08:00
gaozheng b261374cc9 feat(vtk): 客户端生成三维体流程(#1)-多源IDW插值+按类型分流体素/帘面
- core::buildVolume 共享管线(散点→GridSpec→IDW→值域),LocalSample/Api 同源,消除调参漂移
- VolumeBuildParams:参数必存(源ds+插值模型/参数+色阶);不冻结gridSpec,改用"源ds锁定"不变式(留校验TODO)
- Api3dRepository:内存体存储 + createVolume/volumeRows/isVolumeDataset + 多源loadVolume
  (复用loadSection走inversion.grid,竖向=g.y高程,与帘面构造性对齐;绕开scatter端点y/z语义坑)
- loadVolume 回调改交付(VolumeGrid, ColorScale):体色阶=源剖面色阶(mock体在dsRepo无条目)
- UI:Column3DDataset(源数据栏)多选+右键「生成三维体」+ VolumeParamsDialog(IDW;克里金占位)
- 生成的体归三维分析栏(Column3DAnalysis,设计§2.1),非数据集栏;main.cpp 两栏勾选聚合下发,体不被后端刷新冲掉
- VtkSceneController 按 isVolumeDataset 分流体素/帘面,取代失效的全局 showVoxel/showCurtain

编译链接绿(build.bat app exit 0);未GUI实测(Claude无法验VTK渲染)。设计/计划见 docs/superpowers/plans/2026-06-17-vtk-3d-volume-create-flow.md
2026-06-17 20:56:07 +08:00
gaozheng 3635f295b2 fix(vtk): 拉最远仍加载超大面积根因=比范围还大的粗瓦盖住数据中心过了距离剔除;改为瓦片大于范围则强制细分,真正限定在动态范围内 2026-06-17 18:05:30 +08:00
gaozheng 223b8ecf70 perf(vtk): 瓦片就近优先加载(离相机近的先拉,用户正看区域最先出)+并发8->12 2026-06-17 17:58:43 +08:00
gaozheng 484992a434 feat(vtk): 底图范围按剖面合并范围动态定(半径x10,夹2-30km),随勾选增删自动伸缩;取代固定10km/234km 2026-06-17 17:52:45 +08:00
gaozheng c5577ce071 fix(vtk): 剖面被切根因=远处底图把近裁剪面顶出去切掉近处剖面;调小近裁剪容差(1e-5)+底图限数据周围10km(远裁剪面有界) 2026-06-17 17:25:40 +08:00
gaozheng 052fdc1168 refactor(vtk): VE默认值收敛为单一来源(kVerticalExaggeration一处定义,组合根下发控制器/底图/UI);加预设取景诊断日志 2026-06-17 17:10:24 +08:00
gaozheng 97dfd54445 chore(vtk): 默认水平/垂直比例 2.0→1.0(真实比例) 2026-06-17 16:47:58 +08:00
gaozheng 876d88c251 fix(vtk): 地形半透明(0.55)-根因是剖面改真实高程后落地下,不透明地形从侧面遮挡地下剖面;半透明后剖面可从任意角度透过地面看到(专业地球物理三维标准做法) 2026-06-17 16:32:02 +08:00
gaozheng e718336385 fix(vtk): 合并渲染前更新裁剪面-异步落地的瓦片纳入近/远裁剪范围,治瓦片到达后被切(屏幕暗带) 2026-06-17 16:10:12 +08:00
gaozheng c3f72fdc8d fix(vtk): A-复刻原版垂直配准.剖面z用真实高程+g.y(原版data.y=高程,非深度);地形改真实高程(去基准减法)x同一VE;剖面与地形同系对齐,剖面顶≈地表露出地面 2026-06-17 16:00:14 +08:00
gaozheng 692ee057ab fix(vtk): 瓦片视锥剔除只用4侧面不用近/远裁剪面-根治首帧远处瓦片被随几何变化的远裁剪面误剔除(等多久不出/微动才出) 2026-06-17 15:45:57 +08:00
gaozheng e15930d8fb fix(vtk): 治首帧部分瓦片需手动微动才出-相机程序化变化(取景/预设/缩放)后经onCameraChanged通知底图按新视锥重算覆盖 2026-06-17 15:30:59 +08:00
gaozheng fb43237830 fix(vtk): 修垂直偏移根因-四叉树粗块先到时baseline未定就按全高程warp把地形抬高;改show时先拉数据中心DEM定基准再铺瓦片(全场同一基准) 2026-06-17 15:19:16 +08:00
gaozheng fd43051d8d perf(vtk): 撤销防抖定时器,改合并渲染(requestRender:同事件循环多次请求只渲一帧)治滚轮卡顿-根因是逐瓦片重复Render 2026-06-17 15:09:00 +08:00
gaozheng 69a81b2eac fix(vtk): 统一相机取景用数据包围盒-预设按钮(上下左右)不再被底图推远; 基准高程锚数据中心(确定性)修垂直偏移; 滚轮交互防抖140ms治缩放卡顿 2026-06-17 14:53:33 +08:00
gaozheng 67eaade7bd fix(vtk): 根治底图被'蒙版'切=远裁剪面忽略底图(UseBounds=false所致);底图改回参与裁剪+坐标轴/取景改用数据自身包围盒,交互后ResetCameraClippingRange含底图 2026-06-17 14:36:26 +08:00
gaozheng 0ac2765fd7 fix(vtk): 四叉树加视锥剔除(只细分视野内瓦片,根治预算被屏幕外块耗尽致粗块/拉近无图/地形丢失)+焦点自校正平面方向 2026-06-17 14:18:04 +08:00
gaozheng ca847f5a77 refactor(vtk): 底图改真正四叉树多级LOD(按屏幕误差细分,近细远粗铺满视野)取代单层级+视野盒+独立粗底,根治倾斜模糊/黑边 2026-06-17 14:03:31 +08:00
gaozheng 63e7874175 fix(vtk): 加请求限流(最多8并发,治瓦片暴发饱和单域名致加载不进/卡死)+精细优先于粗底排队 2026-06-17 13:47:29 +08:00
gaozheng b5bab42825 fix(vtk): 加远处粗底图层(z13~34km,随地形起伏,持久不purge)填到天边治倾斜露黑边;基准高程base/detail共用保连续 2026-06-17 12:20:24 +08:00
gaozheng 52f7a7d5e8 feat(vtk): 底图按相机可视范围覆盖(视锥交z=0,治旋转黑边,带上限+回退)+影像/DEM缓存跨隐藏-重选复用(治重选慢) 2026-06-17 12:10:01 +08:00
gaozheng a4866de68c fix(vtk): 底图覆盖半径3->4治近距旋转黑边; 纹理加mipmap+各向异性16x+edgeClamp治潜在糊/接缝渗色 2026-06-17 11:47:03 +08:00
gaozheng 5f27e59685 perf(vtk): DEM源换Mapbox terrain-RGB(原版web同款,全球CDN比AWS Terrarium快)+对应解码公式 2026-06-17 11:15:45 +08:00
gaozheng 23ed390faf fix(vtk): 底图瓦片SetUseBounds(false)-不参与包围盒/相机取景,修复勾第二个ds后坐标轴被底图撑到公里级 2026-06-17 11:05:16 +08:00
gaozheng d27ef37a24 feat(vtk): VTK全屏进入时展开左侧三栏抽屉(drawer本在vtkDock内,确保可见) 2026-06-17 10:49:17 +08:00
gaozheng ad3310b5bb feat(vtk): 默认天地图底图(下拉默认项)+frame重锚后在数据位置加载(onFrameReanchored,免启动拉无关瓦片) 2026-06-17 10:49:17 +08:00
gaozheng c03dc35469 feat(vtk): 勾选/取消增量渲染-按ds跟踪图元,diff增删不全量重建;clear保留底图;增量不重置相机(全量/首批才取景) 2026-06-17 10:49:06 +08:00
gaozheng d99e5c61f4 fix(vtk): 消除地形先平面后逐块形变-改DEM到位直接铺起伏块(拉不到才降级平面)+DEM缓存(同祖先块复用)减少逐块卡顿 2026-06-17 10:15:53 +08:00
gaozheng 33e9949623 fix(vtk): 地形不出根因-看小测区LOD选z16-18>DEM上限15致fetchTerrain静默退出;改取祖先DEM瓦片按经纬采样+诊断日志 2026-06-17 10:06:43 +08:00
gaozheng 67f767d787 fix(vtk): DEM瓦片改https(S3对http返回403,实测)+失败打日志便于诊断SSL 2026-06-17 09:56:12 +08:00
gaozheng ef8a9da254 feat(vtk): 底图地面起伏-AWS Terrarium DEM瓦片位移网格+卫星贴图(平面先铺,DEM到位换起伏,拉不到则降级平面) 2026-06-17 09:47:16 +08:00
gaozheng 29ea44560d fix(vtk): 底图LOD消除缩放空白闪烁(延迟清理旧层,落地后再删)+按层级Z偏移防共面z-fighting 2026-06-17 08:54:20 +08:00
gaozheng aaf150ca2e feat(vtk): 底图LOD-按相机视距自动选瓦片层级+覆盖可视范围+增量增删(交互结束触发) 2026-06-17 08:19:04 +08:00
gaozheng 11349e533c feat(vtk): 底图(B方案)天地图改卫星影像img层(局部卫星地面,对齐原版观感) 2026-06-17 08:02:15 +08:00
gaozheng 8fceb6c1f3 fix(vtk): 二维数据集栏「地图」下拉默认隐藏(选天地图即触发显示) 2026-06-16 22:05:37 +08:00
gaozheng a588b651a6 feat(vtk): 天地图底图瓦片层 TileBasemap(③:复用WMTS token,经同一frame配准,col2D地图开关) 2026-06-16 22:01:57 +08:00
gaozheng c06f9ea0f8 refactor(vtk): GeoLocalFrame 就地 reanchor + 帘面重锚改就地(共享 frame 一致,供底图等同源对齐) 2026-06-16 22:01:57 +08:00
gaozheng fe04bb1266 feat(vtk): 帘面按首个真实剖面 lat/lon 重锚 GeoLocalFrame 原点(②)
默认原点取自样本、可能离真实数据很远→局部坐标巨大、轴刻度无意义。每次 clear 后首个带经纬剖面
到达时把原点重锚到其 lat/lon 中心:坐标从0附近起、轴刻度有意义,同一选择内多剖面共用→相互地理配准。
无经纬剖面是平面、不受影响。
2026-06-16 21:00:20 +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 575529e5a0 fix(vtk): 数据集卡片代理支持复选框(可勾选项画框+点击切换)+折叠按钮加图标样式 2026-06-16 17:34:32 +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 d81494fd5e feat(vtk): ColumnDrawer 抽屉容器(三tab+折叠) 2026-06-16 15:33:39 +08:00
gaozheng 5f19a0c0db feat(vtk): 三维分析栏 widget(对象→三维体→切片树+两套右键菜单) 2026-06-16 15:30:01 +08:00
gaozheng b6143a0cb6 fix(vtk): Column2DDataset 自定义Z整行隐藏(setRowVisible,非自定义不留孤标签) 2026-06-16 15:26:46 +08:00
gaozheng efc09a5877 feat(vtk): 二维数据集栏 widget(地图/2D视图+自定义Z输入+2D列表) 2026-06-16 15:23:25 +08:00
gaozheng 45662ff897 style(vtk): Column3DDataset 中文/×改直写字面量(去掉多余十六进制转义,对齐代码库惯例) 2026-06-16 15:20:22 +08:00
gaozheng 97d1e70099 feat(vtk): 三维数据集栏 widget(4工具条栏位+3D数据集列表,只发信号) 2026-06-16 15:16:53 +08:00
gaozheng 3f24ad81e3 feat(vtk): 维度过滤纯函数 splitByDimension + 单测 2026-06-16 15:11:07 +08:00
gaozheng 529ffc023c feat(vtk): 加 Glyph::Fullscreen 图标(三栏重构全屏按钮用) 2026-06-16 15:03:54 +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