2026-05-24-19-11-30 调整位姿微调步进为0.001

This commit is contained in:
2026-05-24 19:19:11 +08:00
parent 21b04ecffd
commit b6e6ace233
7 changed files with 173 additions and 12 deletions

View File

@@ -13,7 +13,7 @@
当前 Docker 构建会同步包含以下能力:
- 二维逆向分割映射按实体填充显示rib、skin 等薄壳或细长构件会做局部实体化兜底,导出的分割 Label Map 也按填充区域写入。
- 模型位姿支持以模型中心沿 X/Y/Z 轴镜像翻转,保存、项目库预览和导出均沿用该位姿。
- 模型位姿支持以模型中心沿 X/Y/Z 轴镜像翻转,平移和缩放支持 `0.001` 级微调,保存、项目库预览和导出均沿用该位姿。
- “构件分别导出”会把所有构件 NIfTI 文件集中到导出包内的 `segmentation-parts/` 目录。
- 项目库 DICOM 首页支持滚轮缩放、拖拽平移和位置重置。
- 项目库与工作区的 DICOM 切片编号按医学影像顺序显示,滑条使用非进度条样式。

View File

@@ -126,6 +126,9 @@ const modelPoseLimits: Record<ModelPoseKey, { min: number; max: number }> = {
scale: { min: 0.5, max: 2.5 },
};
const modelPoseStepPrecision: Partial<Record<ModelPoseKey, number>> = {
translateX: 3,
translateY: 3,
translateZ: 3,
scale: 3,
};
@@ -2136,16 +2139,16 @@ export default function ProjectLibrary({
{ key: 'rotateX' as const, label: '旋转 X', min: -180, max: 180, step: 1, value: modelPose.rotateX, minus: '-90°', plus: '+90°', delta: 90 },
{ key: 'rotateY' as const, label: '旋转 Y', min: -180, max: 180, step: 1, value: modelPose.rotateY, minus: '-90°', plus: '+90°', delta: 90 },
{ key: 'rotateZ' as const, label: '旋转 Z', min: -180, max: 180, step: 1, value: modelPose.rotateZ, minus: '-90°', plus: '+90°', delta: 90 },
{ key: 'translateX' as const, label: '平移 X', min: -2, max: 2, step: 0.05, value: modelPose.translateX, minus: '-X', plus: '+X', delta: 0.25 },
{ key: 'translateY' as const, label: '平移 Y', min: -2, max: 2, step: 0.05, value: modelPose.translateY, minus: '-Y', plus: '+Y', delta: 0.25 },
{ key: 'translateZ' as const, label: '平移 Z', min: -2, max: 2, step: 0.05, value: modelPose.translateZ, minus: '-Z', plus: '+Z', delta: 0.25 },
{ key: 'scale' as const, label: '缩放', min: 0.5, max: 2.5, step: 0.005, value: modelPose.scale, minus: '-0.005', plus: '+0.005', delta: 0.005 },
{ key: 'translateX' as const, label: '平移 X', min: -2, max: 2, step: 0.001, value: modelPose.translateX, minus: '-0.001', plus: '+0.001', delta: 0.001 },
{ key: 'translateY' as const, label: '平移 Y', min: -2, max: 2, step: 0.001, value: modelPose.translateY, minus: '-0.001', plus: '+0.001', delta: 0.001 },
{ key: 'translateZ' as const, label: '平移 Z', min: -2, max: 2, step: 0.001, value: modelPose.translateZ, minus: '-0.001', plus: '+0.001', delta: 0.001 },
{ key: 'scale' as const, label: '缩放', min: 0.5, max: 2.5, step: 0.001, value: modelPose.scale, minus: '-0.001', plus: '+0.001', delta: 0.001 },
].map((item) => (
<div key={item.key} className="grid grid-cols-[48px_40px_1fr_40px_42px] items-center gap-2">
<div key={item.key} className="grid grid-cols-[48px_48px_1fr_48px_42px] items-center gap-2">
<span className="text-[10px] font-bold text-slate-500">{item.label}</span>
<button
onClick={() => nudgeModelPose(item.key, -item.delta)}
className="h-6 rounded-md bg-white text-[10px] font-bold text-slate-500 shadow-sm border border-slate-100 hover:text-blue-600 hover:bg-blue-50"
className="h-6 rounded-md bg-white text-[9px] font-bold text-slate-500 shadow-sm border border-slate-100 hover:text-blue-600 hover:bg-blue-50"
title={`${item.label} ${item.minus}`}
>
{item.minus}
@@ -2161,7 +2164,7 @@ export default function ProjectLibrary({
/>
<button
onClick={() => nudgeModelPose(item.key, item.delta)}
className="h-6 rounded-md bg-white text-[10px] font-bold text-slate-500 shadow-sm border border-slate-100 hover:text-blue-600 hover:bg-blue-50"
className="h-6 rounded-md bg-white text-[9px] font-bold text-slate-500 shadow-sm border border-slate-100 hover:text-blue-600 hover:bg-blue-50"
title={`${item.label} ${item.plus}`}
>
{item.plus}

View File

@@ -87,10 +87,10 @@ const poseStepConfig: Record<ModelPoseKey, { min: number; max: number; step: num
rotateX: { min: -180, max: 180, step: 1, minus: '-90°', plus: '+90°', quick: 90 },
rotateY: { min: -180, max: 180, step: 1, minus: '-90°', plus: '+90°', quick: 90 },
rotateZ: { min: -180, max: 180, step: 1, minus: '-90°', plus: '+90°', quick: 90 },
translateX: { min: -2, max: 2, step: 0.005, minus: '-X', plus: '+X' },
translateY: { min: -2, max: 2, step: 0.005, minus: '-Y', plus: '+Y' },
translateZ: { min: -2, max: 2, step: 0.005, minus: '-Z', plus: '+Z' },
scale: { min: 0.5, max: 3, step: 0.005, minus: '-S', plus: '+S' },
translateX: { min: -2, max: 2, step: 0.001, minus: '-0.001', plus: '+0.001' },
translateY: { min: -2, max: 2, step: 0.001, minus: '-0.001', plus: '+0.001' },
translateZ: { min: -2, max: 2, step: 0.001, minus: '-0.001', plus: '+0.001' },
scale: { min: 0.5, max: 3, step: 0.001, minus: '-0.001', plus: '+0.001' },
};
const defaultModelPose: ModelPose = {

View File

@@ -0,0 +1,54 @@
# 实现方案-2026-05-24-19-11-30
## 实现方案文档路径
`工程分析/实现方案-2026-05-24-19-11-30.md`
## 修改目标
- 将平移 X/Y/Z 和缩放的控件步进统一改为 `0.001`
- 保证项目库和逆向工作区两处位姿控件同步。
- 保证显示格式和状态精度支持三位小数。
## 涉及路径
- `WebSite/src/components/ReverseWorkspace.tsx`
- `WebSite/src/components/ProjectLibrary.tsx`
- `Docker部署/README.md`
- `工程分析/经验记录.md`
## 技术路线
- 检查现有 `poseStepConfig`、项目库位姿控件数组和格式化函数。
-`translateX/translateY/translateZ/scale``step`、按钮文案、快捷 delta 调整为 `0.001`
- 为平移字段补充三位小数精度处理,避免浮点累积或显示截断。
- 保持旋转字段不变。
## 执行步骤
1. 定位所有平移和缩放步进配置。
2. 修改逆向工作区位姿控件。
3. 修改项目库位姿控件。
4. 更新 Docker 部署说明与经验记录。
5. 运行类型检查和构建。
6. 重新部署并验证服务。
7. 提交并推送到 Gitea。
## 兼容性与回滚方案
- 位姿字段结构不变,只改变前端输入步进和精度。
- 已保存的旧位姿仍可正常读取。
- 如需回滚,恢复本次 commit 并重新部署即可。
## 预计文件变更
- 2 个前端组件文件。
- 1 个 Docker 部署说明文件。
- 3 个工程分析当次文档。
- 1 个经验记录追加。
## 提交与部署策略
- Commit message 使用 `2026-05-24-19-11-30 调整位姿微调步进为0.001`
- 构建通过后重启 `tmux` 会话 `revoxelseg-dicom`
- 验证本机和公网入口。

View File

@@ -0,0 +1,46 @@
# 测试方案-2026-05-24-19-11-30
## 测试方案文档路径
`工程分析/测试方案-2026-05-24-19-11-30.md`
## 静态检查
- 执行 `cd WebSite && npm run lint`
- 搜索 `translateX``translateY``translateZ``scale` 控件配置,确认步进统一为 `0.001`
## 构建检查
- 执行 `cd WebSite && npm run build`
- 确认生产构建成功。
## 关键业务场景验证
- 逆向工作区平移和缩放按钮每次微调为 `0.001`
- 逆向工作区 range 和 number 输入步长为 `0.001`
- 项目库模型位姿平移和缩放按钮每次微调为 `0.001`
- 相关数值显示保留三位小数。
## 医学影像数据相关边界验证
- 本次不修改 DICOM/STL 数据和映射算法。
- 微调位姿后,融合视图和逆向分割映射视图继续使用同一位姿。
- 保存项目、导出结果和锁定快照不丢失 0.001 级别位姿。
## 部署验证
- 重启 `tmux` 会话 `revoxelseg-dicom`
- 验证 `http://127.0.0.1:4000/api/health`
- 验证 `http://127.0.0.1:4000/`
- 验证 `https://revoxel.huijutec.cn/api/health``https://revoxel.huijutec.cn/`
## Git/Gitea 备份验证
- 只暂存本次相关文件。
- 提交 message 包含 `2026-05-24-19-11-30`
- 推送到 Gitea `main` 后确认本地分支与远端同步。
## 风险与回归关注点
- 平移和缩放需同步修改项目库、逆向工作区和显示精度,避免一个页面可微调而另一个页面截断。
- 旋转步进不应被误改。

View File

@@ -1765,3 +1765,17 @@ C. 解决问题方案
D. 后续如何避免问题
后续遇到薄壳、肋骨、皮肤、血管等结构显示成点线时要同时检查三件事STL preview 是否因上限导致抽样缺面、二维切面算法是否跳过水平/切线段、透明材质是否造成三维自排序噪声。实体化显示和导出必须同步处理,不能只改 UI但局部厚度兜底属于演示/显示后处理,接入真实体素化算法后应作为可配置显示选项,而不是替代真实分割算法。
## 2026-05-24-19-11-30 位姿微调步进要与显示精度同步
A. 问题现象
用户希望缩放、平移每次移动改为 `0.001`,以便后续对模型与 DICOM 的配准做更细微调整。
B. 原因分析
逆向工作区和项目库各自维护位姿控件步进;平移、缩放曾使用 `0.005``0.05``0.25` 等不同粒度。若只改按钮步进,不同步滑杆 step、显示精度和归一化取整保存后的位姿可能看起来或实际不是 0.001 级别。
C. 处理方式
将逆向工作区 `poseStepConfig` 中平移 X/Y/Z 与缩放步进统一为 `0.001`,项目库位姿控件的按钮 delta、range step 也统一为 `0.001`。同时为项目库平移字段补充三位小数归一化,保证按钮、滑杆、显示、保存和导出使用同一精度。
D. 后续建议
后续调整位姿控件时,要把步进、按钮 delta、range step、数字显示、状态归一化和导出数据一起检查不要只改单个页面或单个控件否则会出现项目库与逆向工作区微调精度不一致。

View File

@@ -0,0 +1,44 @@
# 需求分析-2026-05-24-19-11-30
## 开始时间
2026-05-24-19-11-30
## 原始需求摘要
用户要求将缩放、平移每次移动步进改为 `0.001`,方便后续对模型位姿做更细微的调整。
## 业务目标
- 提高模型位姿微调精度,尤其是平移 X/Y/Z 和缩放。
- 保持逆向工作区与项目库中位姿控件行为一致。
- 确保保存、导出和锁定快照中的位姿数据保留 0.001 级别精度。
## 输入与输出
- 输入:用户点击平移/缩放的 `-``+` 按钮、拖动滑条或输入数值。
- 输出:平移和缩放每次微调按 `0.001` 变化,界面显示和内部状态保留三位小数。
## 影响范围
- `WebSite/src/components/ReverseWorkspace.tsx`:逆向工作区位姿控件步进。
- `WebSite/src/components/ProjectLibrary.tsx`:项目库模型位姿控件步进。
- `Docker部署/README.md`:同步说明位姿微调精度。
- `工程分析/经验记录.md`:记录位姿步进和精度同步经验。
## 关键约束
- 只调整平移和缩放步进,不改变旋转步进和模型空间映射算法。
- 不修改原始 DICOM/STL 数据。
- 控件显示、数值输入、保存状态和导出位姿必须保持一致。
## 风险点
- 仅改按钮步进但不改 range/number step会造成不同入口精度不一致。
- 如果格式化仍按两位显示,用户会看不到 0.001 级变化。
- 如果服务端位姿归一化精度不足,保存后可能丢失微调结果。
## 待确认问题或默认假设
- 默认“缩放、平移每次移动”指平移 X/Y/Z 和缩放的微调按钮、滑条、数字输入步长统一为 `0.001`
- 旋转仍保留当前步进,不在本次调整范围内。