gaozheng
|
687edfeca1
|
feat(store): ChunkedVolumeStore 增加多分辨率金字塔与每块 min/max
- buildPyramid(levels): level 0 全分辨率(复用 data.bin),level 1..levels
逐级 2x 平均降采样(ceil(n/2));非 blank 取均值 round,全 blank 置 kBlank。
各级独立 data_L<level>.bin + 逐块 qCompress。
- 每级每块计算并存 (min,max)(跳过 kBlank;全 blank 块 = (kBlank,kBlank)),
写入 meta.json 的 levels 数组并回填原 bricks 索引。
- 新增 levels()/bricksX|Y|Z(level)/dims(level)/readBrick(level,...)/
brickRange(level,...);保留兼容重载 readBrick(bx,by,bz)==readBrick(0,...)。
- 不破坏 Task 6/8:write/readBrick(bx,by,bz)/meta/bricksXYZ() 语义不变;
老 store 无 levels 时 levels()=1,brickRange(0,...) 惰性读块计算。
|
2026-06-23 11:52:47 +08:00 |
gaozheng
|
c15555dd8a
|
feat(io/gpr): 多通道 .iprb+.ord 装配 GprSurvey
assembleGprSurvey 把一条测线若干通道 .iprb(同名 .iprh)+.ord 装配为
geopro::core::GprSurvey:校验各通道 samples 一致、ntraces 取最小值对齐、
按 .ord 横偏 Y 升序重排通道(values 同步置换)、x0/z0=0、dx=道距、
dz=depthOfSample(1,h);通道数与 .ord 有效通道数不符抛 runtime_error。
索引 64 位。纯 C++17,零 Qt/VTK。
|
2026-06-23 11:36:56 +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
|
cc3c5bf755
|
feat(render): IVolumeRenderSource 接缝 + WholeVolumeSource(B) 整卷重组
新增 B/C 共用的体渲染数据源接口 IVolumeRenderSource(meta/update/
currentImages/sliceSource),并实现 B 的 WholeVolumeSource:构造时读
ChunkedVolumeStore,遍历所有 brick 按全局坐标(vtkIdType 64 位)重组为
整卷 VTK_SHORT vtkImageData(含边缘块),供整卷体绘制与切片 reslice。
VoxelActor 新增 buildVoxelI16FromImage 重载:直接以预构建 VTK_SHORT
图像成体,传函/着色复用量化域逻辑(抽出 assembleVolumeI16),不改动
Task 7 现有 buildVoxel/buildVoxelI16 行为。
geopro_render 链 geopro_store;新增 test_whole_volume_source 校验
dims/类型/边缘块重组位置。
|
2026-06-23 11:23:37 +08:00 |
gaozheng
|
b362156364
|
feat(render): VoxelActor 新增 buildVoxelI16 量化域体绘制
int16 量化体经 vtkShortArray 填 vtkImageData,vtkSmartVolumeMapper GPU 体绘制。
传递函数在量化域取控制点:qmin/qmax=q.toQ(vmin/vmaxPhys),颜色对每量化级用
q.toPhys 反查物理值再经 ColorScale 取色;kBlank→不透明度0(透明)。抽 assembleVolume
公用 mapper/property 配置,double 版 buildVoxel 行为不变。附无窗冒烟测试。
|
2026-06-23 11:12:25 +08:00 |
gaozheng
|
d908556166
|
feat(store): GPR 三维体分块压缩落盘 ChunkedVolumeStore
新增 geopro_store 库(B/C 方案共用基座):int16 体逐块 qCompress 压缩写入
data.bin + nlohmann-json sidecar(meta.json 记几何/量化/逐块偏移索引)。
write/readMeta/readBrick 三接口 + 边缘块(< brick)支持;偏移/长度全程 64 位。
不引入 vtkHDFWriter,不加 vcpkg 依赖(压缩用 QtCore 自带 zlib)。
|
2026-06-23 11:00:47 +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
|
a9e8eb9d5c
|
feat(core): GPR 结构化建体 buildGprVolume(X/Z 落格 + Y 向 1D 线性插值 → int16 量化体)
- 新增 GprSurvey 规则化建体输入模型(放 core/model 保持 geopro_core 自洽,避免 core->io 反向依赖)
- buildGprVolume: X/Z 取最近道/采样落格,仅跨通道 Y 做 1D 线性插值,边界外不外推
- int16 量化用值域中点为 offset 对称铺满 ~64000 码位,两端留余量不撞 int16/kBlank
- 整型乘积索引走 size_t
|
2026-06-23 10:45:06 +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
|
c6ff9c2271
|
feat(core): 新增 int16 量化体类型 ScalarVolumeI16 + Quant
GPR 三维体地基:int16 量化标量体,内存/显存/磁盘为 double 体的 1/4。
- Quant: 物理值↔int16 映射,toQ 下钳保留 INT16_MIN 给 kBlank 哨兵
- ScalarVolumeI16: 与 double ScalarVolume 并列,i 最快 k 最慢布局
- idx(i,j,k) 64 位计算(整卷可达约 96 亿体素,防 int 溢出)
- header-only,纯 C++17,零 Qt/VTK
|
2026-06-23 10:28:40 +08:00 |
gaozheng
|
0bbed9c0c3
|
feat(io/gpr): GPR 几何-通道横偏解析与采样深度换算
新增 geopro::io::gpr 两个纯 C++17 几何函数:
- parseChannelXOffsets: 解析 .ord 末列==1 的有效通道横向偏移
- depthOfSample: 按物理把采样序号换算为深度米(samples<=1 防除零)
含失败先行的单测,GprGeometry.cpp 接入 geopro_io_gpr,
test 接入 geopro_tests。
|
2026-06-23 10:19:11 +08:00 |
gaozheng
|
379875dff0
|
fix(io/gpr): traces/大小计算改 64 位防溢出
MSVC 的 long 是 32 位,samples*traces 大体下会溢出。
BScan.traces 改 std::int64_t;大小校验 expected 与 data
分配均在 64 位域计算,为后续整卷(数十亿体素)立纪律。
|
2026-06-23 10:10:05 +08:00 |
gaozheng
|
0d7f646941
|
feat(io/gpr): 实现 .iprb B-scan 二进制读取器
readIprb 读取 int16 雷达剖面(布局 [trace*samples + s]):
traces=lastTrace+1;校验文件字节数=samples*traces*2,
不符或打不开抛 std::runtime_error。纯 C++17,零 Qt/VTK。
|
2026-06-23 10:00:08 +08:00 |
gaozheng
|
c395921ca8
|
feat(io/gpr): 新增 .iprh 头解析器(纯 C++17,零 Qt/VTK)
- IprHeader/parseIprHeader:按行解析 KEY: value,支持含空格键名
(LAST TRACE/SOIL VELOCITY/DISTANCE INTERVAL)
- SOIL VELOCITY 由 m/µs 统一换算为 m/s 存储(×1e6)
- 缺 SAMPLES/LAST TRACE/CHANNELS 任一抛 std::runtime_error
- CMake 接线:src/io(gpr) 静态库 geopro_io_gpr + tests 链接
- TDD:2 个新用例,全测试套件 100% 通过
|
2026-06-23 09:45:13 +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
|
8684e52939
|
feat(vtk): 底图瓦片坐标数学 TileMath(EPSG:3857 经纬↔z/x/y+瓦片边界)+单测(P5基石)
|
2026-06-16 21:29:59 +08:00 |
gaozheng
|
fe04bb1266
|
feat(vtk): 帘面按首个真实剖面 lat/lon 重锚 GeoLocalFrame 原点(②)
默认原点取自样本、可能离真实数据很远→局部坐标巨大、轴刻度无意义。每次 clear 后首个带经纬剖面
到达时把原点重锚到其 lat/lon 中心:坐标从0附近起、轴刻度有意义,同一选择内多剖面共用→相互地理配准。
无经纬剖面是平面、不受影响。
|
2026-06-16 21:00:20 +08:00 |
gaozheng
|
b2740898f6
|
feat(vtk): parseInversionGrid 解析 lat/lon,弯曲测线渲染为曲面帘面
之前丢弃经纬度→所有剖面退化成 y=0 平面。解析后 CurtainActor 经 GeoLocalFrame 按真实测线摆位:
37/136 弯曲测线→曲面帘面,直线/无geo→平面(正确)。
|
2026-06-16 20:41:14 +08:00 |
gaozheng
|
37b433208e
|
fix(vtk): 帘面消隐无数据(NaN)格,根治真实反演剖面渲染崩溃(0xc0000005)
真实反演 v 矩阵大量 null→Grid 存 NaN→vtkBandedPolyDataContourFilter 裁剪运算崩(经真实API数据+崩溃栈定位)。
消隐含 NaN 的点(ghost)使其不入表面/色带滤镜+标量填0兜底;顺带清洗色带等值线值(去非有限/去重)。保留色带功能。
|
2026-06-16 20:41:13 +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
|
2934bacd34
|
refactor(vtk): 帘面渲染改异步走 loadSection(QPointer+generation守护,对齐volume路径)(①.3)
|
2026-06-16 18:29:45 +08:00 |
gaozheng
|
2d155c864c
|
feat(vtk): Api3dRepository(loadSection复用真实ERT反演端点;其余后端未就绪暂stub)(①.2)
|
2026-06-16 18:25:43 +08:00 |
gaozheng
|
744b55c1b6
|
feat(vtk): I3dSceneRepository 加异步 loadSection(帘面Grid+色阶)+LocalSample样本实现(①.1)
|
2026-06-16 18:18:38 +08:00 |
gaozheng
|
77f1b5543e
|
feat(vtk): I3dSceneRepository 补齐切片/异常/任务接口设计(spec §6.3-6.5)+LocalSample内存态stub
|
2026-06-16 18:11:21 +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
|
07f2f25b58
|
fix(vtk): 选中切片边框改亮青(0,0.95,1)+加粗, 未选暗灰, 拉开对比
|
2026-06-16 11:38:53 +08:00 |
gaozheng
|
5809b88a44
|
fix(vtk): D39 改为自定义 Rotate 绕支点增量旋转(真不跳)
前法错: 设焦点=切片中心会把相机位置挪走(透视视差)→画面平移=跳; 诊断只验了视向、漏看位置。
正确: 按下完全不动相机(不跳); 重写 Rotate(): 有选中物时, 用 T(c)R(up)R(right)T(-c) 把
相机 position/focal/up 绕选中切片中心 c 增量旋转→c 在世界/屏幕都不动、场景绕它转、无跳。
无选中回退默认绕焦点。ctest 221/221
|
2026-06-16 11:33:03 +08:00 |
gaozheng
|
8d94247dd9
|
feat(vtk): D39 以选中三维体/切片为中心旋转视图(不跳)
正确做法: 点击只选中(不动相机)→切换点选不跳; 在'按下开始拖动'那刻才把焦点设到
选中切片中心(焦点+位置同步补偿 delta→视向/距离不变、画面不跳), 之后默认 TrackballCamera
即绕该中心旋转。PickInteractorStyle 加 getRotateCenter 回调, InteractionManager 提供
选中切片中心; 无选中则绕默认焦点。ctest 221/221
|
2026-06-16 11:27:42 +08:00 |
gaozheng
|
2e5cc4e6db
|
chore(vtk): 移除未用的 InteractionManager::faceSelected(正视按钮已删, 双击走 faceSlice)
|
2026-06-16 11:19:03 +08:00 |
gaozheng
|
a7edfa5c78
|
fix(vtk): 轴向切片禁用旋转(G22-24 角度不能再调整),仅任意切片可转(F25)
上一版让所有切片都能拖边缘旋转,违反 G22-24(上下/前后/左右角度不能再调整)。
修: 轴向切片 SetMarginSizeX/Y(0) 去掉旋转抓取区→只能移动不能转;
任意切片(Oblique)保留默认 margin→可拖边缘旋转(F25)。ctest 221/221
|
2026-06-16 11:14:05 +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
|
43f8228e49
|
fix(vtk): 切片单击仅选中+高亮,不动相机(终态) — 切换切片不再跳
据用户实测: '按切片中心移焦点'(eb8cb9e)在切换两切片时仍跳(两次焦点跳动), 且切片中心≈体中心
→ 与默认绕中心旋转视觉等价、价值低。终态: 单击=仅选中+高亮, 拖动=默认 TrackballCamera 绕
场景/体中心旋转(稳定、永不跳)。spec C38 '以体为中心' 由此满足; 切片本身不自转(符合语义)。
|
2026-06-16 10:34:11 +08:00 |
gaozheng
|
eb8cb9e7ee
|
fix(vtk): 切片旋转支点用切片中心而非点击点(根因修复,据日志证据)
诊断日志证据: onPicked 改相机后 dir(视向) before==after, 补偿正确、点击瞬间画面不变;
但命中点 world 明显偏离体中心 → 之前以'点击点'为焦点, 拖动绕偏心点旋转→大幅摆动(=用户的'跳')。
根因修复: 旋转焦点设为**切片中心**(slices_[idx]->center(), ≈体中心, spec C38 '以切片为中心'),
焦点+位置同步平移保持画面不变 → 点击不跳、拖动绕切片中心居中旋转、不甩。
未命中切片则不动相机。
|
2026-06-16 10:26:29 +08:00 |