feat/vtk-3d-view #7
Loading…
Reference in New Issue
No description provided.
Delete Branch "feat/vtk-3d-view"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
- 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 异常接真实后端。登录成功后 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 配准可用。- 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 未碰。- 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。- 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。- 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。抽公共重组核 reorganizeRegion(RegionReorganizer.{hpp,cpp})为单一真源: C2 ViewAdaptiveVolumeSource 改委托、C3 AsyncRegionBuilder 也调它(真 DRY)。 AsyncRegionBuilder:后台 worker 调重组核构建 vtkImageData,主线程非阻塞 takeLatest 取最新就绪;requestTarget supersede 收敛最新不堆积。线程安全: vtkImageData refcount 增减全在 mutex 内/单线程独占,析构置 stop 唤醒干净 join。 测试:5 个异步用例(同步一致/supersede 收敛/析构忙时干净 join/并发 400 次不崩 不死锁/takeLatest 非阻塞)全绿;C1+C2 的 17 个 ViewAdaptive* 抽核后回归全绿。把 gpr3dv(P1)处理链产出的处理后立方体桥接到 geopro 已有的量化+ChunkedVolumeStore +VTK 体绘制,渲出第一条线(明星路_001)的真三维体。算法零改动,仅复用 geopro 量化/ store/渲染。 - 新增桥接 src/io/gpr/Gpr3dvVolumeBridge.{hpp,cpp}(独立 target geopro_gpr3dv_bridge, 不污染纯 C++17 解析层):走 P1 原版 API load→buildVolumeData→runPipeline(默认链) →再 buildVolumeData(处理后),得 volumeData[通道][道][样本];轴映射 X=道/Y=通道/ Z=样本;扫值域定 Quant(offset=中点);世界 spacing(dx=道距/dy=通道横距/dz=深度采样距)。 - gpr_poc 加子命令 build-line <lineDir> <linePrefix> --out <store> [--levels N]: 桥接→ChunkedVolumeStore::write+buildPyramid,报维度/量化/spacing/内存/耗时;view 渲。 - 测试 tests/io/gpr/test_gpr3dv_volume_bridge.cpp:合成 2 通道 Impulse 测线走真链, 校验轴映射/spacing/量化(offset=中点)/稠密体无 kBlank/缺线抛异常。 真实数据验收(明星路_001):体维度 45305×14×796(道×通道×样本,样本由 821 经零时校正 裁至 796),处理后值域[-9249,9206] scale=0.288 offset=-21.5,spacing dx=0.049/dy=0.105/ dz=0.0101m,落盘 845MB 压缩比 1.14x;view --preview/--base 渲出无纹理错、整卷盖全。 全量测试通过。旧 col3D_/colAnalysis_ 自分段重构后已 hide() 不入 tab、运行时不发信号,其 18 处 connect 全为死接线。本次彻底退役: - 删 main.cpp 中 10 个 c3(Column3DDataset)+7 个 ca(Column3DAnalysis)+1 个 col3D() VE 接线 - 删 ColumnDrawer 的 col3D_/colAnalysis_ 成员/访问器/实例化/include/前向声明 - 删 4 个源文件 Column3DDataset.{hpp,cpp} / Column3DAnalysis.{hpp,cpp} + CMake 条目 唯一运行时仍在跑的 ca 消费是 refreshAnomalies(读 anomalyFilterMode 写 setAnomalies): 档位改恒「全部显示」(=隐藏 ca 的当前等效行为),异常列表已由 refreshAnalysis 经 voxelTree 全量注入新分段 tab,故去掉 ca->setAnomalies。零可见回归。 已知遗留(旧栏退役暴露,均非本次引入,待新分段段补 API): - 新建/关闭切片不再自动勾选/取消列表(CategorySection 无 setItemChecked) - 异常显示过滤档位、列表选中→VTK高亮(R84)随 ca 信号退役,待新段补信号 构建:configure+app 链接通过;测试 isolated 全绿(AsyncRegionBuilder 预取测试满载 flaky, 隔离复跑 3/3 过,属 GPR 域与本次无关)- 5.1 关闭按钮空白:全局 QPushButton padding(6px14px) 挤掉 ×,显式 setStyleSheet padding:0 - 5.2 取消某轴「显示」时禁用其 min/max 编辑框(show toggled→lo/hi setEnabled,回灌同步) - 5.3 隐藏轴后刻度数字仍在:SetXAxisVisibility 只关线,补 SetXAxisLabelVisibility/TickVisibility - 5.4 应用即全量重绘→改增量:setAxesConfig 不再 rebuildInternal(clear场景),改 view_.setAxes+setAxesRanges+renderIncremental(仅重建坐标轴 prop,不动数据/相机) - 5.5 放大系数下拉→滑块(1~10×,恢复重构前交互):拖动实时改标签,sliderReleased 才发 verticalExaggerationChanged 触发一次重建(VE 改几何须重建但不在拖动中连续重建) main.cpp 接 applied(去scale) + verticalExaggerationChanged(→控制器+底图) 构建:app 链接通过- issue1 真因:voxel(三维体)段数据来自 mock voxelTree,但 setBuckets 用 splitByCategory 的空桶 (对象树 ds 里无 dd_voxel→必空)先 setDatasets(空) 清掉其勾选,随后 section("voxel")->setDatasets (voxelTree) 重填时勾选已丢→「创建切片/异常后体/切片选择被清空」。修:setBuckets 跳过 voxel 段 - 异常副标题没时间:saveAnomaly 没设 createTime(main 构建 Anomaly 也没设)→补当前时间(mock) - 新切片自动勾选:CategorySection::setChecked(dsId) + 保存切片回调在 refreshAnalysis 后勾选新切片 (恢复旧行为,避免刚存的切片因未勾被 syncSlices 隐藏) 未解(下轮):issue2 选第二个体时第一个体切片消失=单"当前体"模型固有限制(syncSlices 只显示 volumeDsId==currentVolumeDsId 的切片),需多体并发切片渲染改造 构建:app 链接通过69e8790),④拾取串选留待live调试按原型「创建异常→点/线/面」改造: - 右键菜单单项「创建异常」→ 点/线/面 子菜单;形态(1/2/3)同时驱动绘制 mode、a.markType、 对话框查平台类型的 remarkSourceType(core::AnomalyMarkType 与 remarkSourceType 同值,一个 shape 贯通) - AnomalyDrawTool 泛化 DrawMode{Point,Line,Face}:点≥1(再点重定位微调)/线≥2(开放)/面≥3(闭合); 最少点数按模式;分形态屏幕提示 - 交互按锁定规范:**双击/回车 提交**(去掉右键提交,右键绘制中消费不响应保留菜单语义); **Backspace/Delete 撤上一点**;Esc 取消 - AnomalyActor 已支持点(verts)/折线/闭合多边形三态渲染,无需改 测试:439/439 通过修正前一轮误判:异常样式("与平台一致")不依赖真后端保存链——getDetail/{id} 端点存在且返回 legend。 - 新增 getExceptionTypeDetail(typeId) → GET /business/exceptionType/getDetail/{id}(wireObject 取 data) - AnomalySaveDialog 选中类型变化时拉其 legend,按形态(1点 pointColor / 2线·3面 polylineColor+Width+ Shape→dashed)派生样式;首项自动预取 - main accept 后用 dlg.styleColor/Width/Dashed 覆盖默认(#ff3030/2/实线)→异常按平台类型样式渲染 注:真保存(newException)仍卡——实测真后端无任何登记三维体/切片为 dsObject 的端点(voxel/slice generate 无、通用 dsObject create 也无),异常 remarkSourceId 无真实实体可指,是后端缺端点的硬依赖。 测试:通过1) 数据列表三维体/切片右键「色阶…」→「色阶」(去省略号)。 3) VTK 右键关闭已保存切片后,数据列表仍勾选:onSliceClosed 此前从未连接 → 接 setChecked(dsId,false)。 4) 异常取消选中(选别的对象/点 VTK 空白)后异常图形仍高亮: - 选中非异常对象 → setSelectedAnomaly("") 清异常高亮; - onSliceSelectionChanged 收到空 dsId(点空白/清选) → 一并清异常高亮。 构建:app 链接通过3) 删除切片/异常前弹确认框(警告图标 + 明确「删除/取消」中文按钮 + 不可撤销提示)。 4) 弹框默认英文 OK/Cancel/Yes/No 全局中文化: - 安装 Qt 自带 zh_CN 翻译(QMessageBox/QDialogButtonBox/QFileDialog 等标准按钮);加载兼顾 dev(Qt 安装路径)与部署版(exe 旁 translations\)。 - formkit::addDialogButtons 默认按钮 QString()→「确定/取消」(不依赖翻译就位,覆盖自建对话框)。 - 打包脚本补拷 qtbase_zh_CN.qm(windeployqt --no-translations 不带)。 测试:439/439 通过三维分析选中切片后切到二维分析,残留的selected_使InteractionManager::onWheel 持续消费滚轮(二维下无法缩放),且切回三维仍残留高亮。setMode2D进入二维时清切片 选中+高亮,并经onSliceSelectionChanged("")联动清三维分析列表选中行与异常高亮。 与VtkSceneView::setAnalysisMode2D离开二维时clearMapLineSelection清足迹选中相对称。