From e380a19acba80235e488de4c33218ed6303ff9f6 Mon Sep 17 00:00:00 2001 From: admin <572701190@qq.com> Date: Sun, 24 May 2026 19:24:26 +0800 Subject: [PATCH] =?UTF-8?q?2026-05-24-19-17-13=20=E8=A1=A5=E9=BD=90?= =?UTF-8?q?=E4=BD=8D=E5=A7=BF=E7=B2=BE=E5=BA=A6=E5=B9=B6=E9=9A=90=E8=97=8F?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E6=8B=89=E4=BC=B8=E6=88=90=E5=8A=9F=E6=8F=90?= =?UTF-8?q?=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Docker部署/README.md | 2 +- WebSite/server.ts | 10 ++++- WebSite/src/components/ReverseWorkspace.tsx | 7 +-- 工程分析/实现方案-2026-05-24-19-11-30.md | 12 ++++-- 工程分析/实现方案-2026-05-24-19-17-13.md | 48 +++++++++++++++++++++ 工程分析/测试方案-2026-05-24-19-17-13.md | 44 +++++++++++++++++++ 工程分析/经验记录.md | 22 +++++++++- 工程分析/需求分析-2026-05-24-19-11-30.md | 1 + 工程分析/需求分析-2026-05-24-19-17-13.md | 42 ++++++++++++++++++ 9 files changed, 174 insertions(+), 14 deletions(-) create mode 100644 工程分析/实现方案-2026-05-24-19-17-13.md create mode 100644 工程分析/测试方案-2026-05-24-19-17-13.md create mode 100644 工程分析/需求分析-2026-05-24-19-17-13.md diff --git a/Docker部署/README.md b/Docker部署/README.md index f2a4acc..836bda7 100644 --- a/Docker部署/README.md +++ b/Docker部署/README.md @@ -13,7 +13,7 @@ 当前 Docker 构建会同步包含以下能力: - 二维逆向分割映射按实体填充显示,rib、skin 等薄壳或细长构件会做局部实体化兜底,导出的分割 Label Map 也按填充区域写入。 -- 模型位姿支持以模型中心沿 X/Y/Z 轴镜像翻转,平移和缩放支持 `0.001` 级微调,保存、项目库预览和导出均沿用该位姿。 +- 模型位姿支持以模型中心沿 X/Y/Z 轴镜像翻转,平移和缩放支持 `0.001` 级微调,保存、项目库预览和导出均沿用该位姿;自动拉伸完成后不再在位姿区保留成功提示。 - “构件分别导出”会把所有构件 NIfTI 文件集中到导出包内的 `segmentation-parts/` 目录。 - 项目库 DICOM 首页支持滚轮缩放、拖拽平移和位置重置。 - 项目库与工作区的 DICOM 切片编号按医学影像顺序显示,滑条使用非进度条样式。 diff --git a/WebSite/server.ts b/WebSite/server.ts index 4270d1d..f338a02 100644 --- a/WebSite/server.ts +++ b/WebSite/server.ts @@ -155,6 +155,12 @@ const defaultModelPose: ModelPoseValue = { flipY: false, flipZ: false, }; +const modelPoseValuePrecision: Partial> = { + translateX: 3, + translateY: 3, + translateZ: 3, + scale: 3, +}; interface DicomAttributes { patientName: string; @@ -442,9 +448,11 @@ function defaultModelPoses(): ModelPoseRecord[] { function normalizeModelPoseValue(value: Partial | undefined): ModelPoseValue { const read = (key: keyof ModelPoseValue, fallback: number, min: number, max: number) => { const nextValue = value?.[key]; - return typeof nextValue === 'number' && Number.isFinite(nextValue) + const clampedValue = typeof nextValue === 'number' && Number.isFinite(nextValue) ? clampNumber(nextValue, min, max) : fallback; + const precision = modelPoseValuePrecision[key]; + return typeof precision === 'number' ? Number(clampedValue.toFixed(precision)) : clampedValue; }; const readBoolean = (key: keyof ModelPoseValue, fallback: boolean) => ( typeof value?.[key] === 'boolean' ? Boolean(value?.[key]) : fallback diff --git a/WebSite/src/components/ReverseWorkspace.tsx b/WebSite/src/components/ReverseWorkspace.tsx index 659cb6f..f2f7c5f 100644 --- a/WebSite/src/components/ReverseWorkspace.tsx +++ b/WebSite/src/components/ReverseWorkspace.tsx @@ -3027,15 +3027,10 @@ export default function ReverseWorkspace({ dicomSize.y / (Math.max(rotatedSize.y, 1e-6) * baseScale), dicomSize.z / (Math.max(rotatedSize.z, 1e-6) * baseScale), ); - const limitedByVolume = axisFitScale > containmentScale + 1e-6; const nextScale = clampPoseValue('scale', Math.min(axisFitScale, containmentScale)); const nextPose = { ...modelPose, scale: nextScale }; updateModelPose({ scale: nextScale }, { markCustom: !options.silentInitial, keepStatus: true }); - setPoseImportStatus( - limitedByVolume - ? `已按 ${axis.toUpperCase()} 方向拉伸,并限制在 DICOM 体范围内` - : `已按 ${axis.toUpperCase()} 方向进行三维等比例拉伸`, - ); + setPoseImportStatus(''); if (options.silentInitial) { savedWorkspaceSnapshotRef.current = createWorkspaceSnapshot({ modelPose: nextPose, diff --git a/工程分析/实现方案-2026-05-24-19-11-30.md b/工程分析/实现方案-2026-05-24-19-11-30.md index 025e971..fef1a6a 100644 --- a/工程分析/实现方案-2026-05-24-19-11-30.md +++ b/工程分析/实现方案-2026-05-24-19-11-30.md @@ -14,6 +14,7 @@ - `WebSite/src/components/ReverseWorkspace.tsx` - `WebSite/src/components/ProjectLibrary.tsx` +- `WebSite/server.ts` - `Docker部署/README.md` - `工程分析/经验记录.md` @@ -22,6 +23,7 @@ - 检查现有 `poseStepConfig`、项目库位姿控件数组和格式化函数。 - 将 `translateX/translateY/translateZ/scale` 的 `step`、按钮文案、快捷 delta 调整为 `0.001`。 - 为平移字段补充三位小数精度处理,避免浮点累积或显示截断。 +- 服务端保存和读取模型位姿时,对平移和缩放执行三位小数归一化。 - 保持旋转字段不变。 ## 执行步骤 @@ -29,10 +31,11 @@ 1. 定位所有平移和缩放步进配置。 2. 修改逆向工作区位姿控件。 3. 修改项目库位姿控件。 -4. 更新 Docker 部署说明与经验记录。 -5. 运行类型检查和构建。 -6. 重新部署并验证服务。 -7. 提交并推送到 Gitea。 +4. 修改服务端位姿归一化精度。 +5. 更新 Docker 部署说明与经验记录。 +6. 运行类型检查和构建。 +7. 重新部署并验证服务。 +8. 提交并推送到 Gitea。 ## 兼容性与回滚方案 @@ -43,6 +46,7 @@ ## 预计文件变更 - 2 个前端组件文件。 +- 1 个服务端文件。 - 1 个 Docker 部署说明文件。 - 3 个工程分析当次文档。 - 1 个经验记录追加。 diff --git a/工程分析/实现方案-2026-05-24-19-17-13.md b/工程分析/实现方案-2026-05-24-19-17-13.md new file mode 100644 index 0000000..2af1e88 --- /dev/null +++ b/工程分析/实现方案-2026-05-24-19-17-13.md @@ -0,0 +1,48 @@ +# 实现方案-2026-05-24-19-17-13 + +## 实现方案文档路径 + +`工程分析/实现方案-2026-05-24-19-17-13.md` + +## 修改目标 + +- 自动拉伸成功后不再写入“已按 X/Y/Z 方向进行三维等比例拉伸”类持久状态。 +- 保留 `stretchingAxis` 按钮加载状态与 `fusionError` 错误提示。 + +## 涉及路径 + +- `WebSite/src/components/ReverseWorkspace.tsx` +- `Docker部署/README.md` +- `工程分析/经验记录.md` + +## 技术路线 + +- 定位 `applyModelStretchByAxis` 中成功分支的 `setPoseImportStatus`。 +- 成功更新 `scale` 后清空 `poseImportStatus`,避免残留成功文案。 +- 不修改 `catch` 与前置校验中的 `setFusionError`。 + +## 执行步骤 + +1. 检查自动拉伸按钮与状态提示的调用路径。 +2. 修改自动拉伸成功后的状态处理。 +3. 运行类型检查与构建。 +4. 重新部署并验证服务。 +5. 作为自动拉伸提示的后续界面微调单独提交并推送。 + +## 兼容性与回滚方案 + +- 只影响成功提示文案,不影响位姿计算和保存数据。 +- 如需恢复提示,可回滚本次 commit 或重新加入成功状态文案。 + +## 预计文件变更 + +- 1 个前端组件文件。 +- 1 个 Docker 部署说明文件。 +- 3 个工程分析当次文档。 +- 1 个经验记录追加。 + +## 提交与部署策略 + +- Commit message 包含 `2026-05-24-19-17-13` 和自动拉伸提示调整说明。 +- 构建通过后重启 `tmux` 会话 `revoxelseg-dicom`。 +- 验证本机和公网入口。 diff --git a/工程分析/测试方案-2026-05-24-19-17-13.md b/工程分析/测试方案-2026-05-24-19-17-13.md new file mode 100644 index 0000000..a040fcb --- /dev/null +++ b/工程分析/测试方案-2026-05-24-19-17-13.md @@ -0,0 +1,44 @@ +# 测试方案-2026-05-24-19-17-13 + +## 测试方案文档路径 + +`工程分析/测试方案-2026-05-24-19-17-13.md` + +## 静态检查 + +- 执行 `cd WebSite && npm run lint`。 +- 搜索自动拉伸成功提示,确认不再输出“已按 Z 方向进行三维等比例拉伸”。 + +## 构建检查 + +- 执行 `cd WebSite && npm run build`。 +- 确认生产构建成功。 + +## 关键业务场景验证 + +- 点击 X/Y/Z 自动拉伸时,按钮仍显示加载态。 +- 自动拉伸成功后模型缩放位姿更新,但页面下方不残留成功提示。 +- 数据未加载或角度不满足条件时,仍显示错误提示。 + +## 医学影像数据相关边界验证 + +- 本次不修改 DICOM/STL 读取、切片排序、分割映射和导出算法。 +- 自动拉伸后的位姿仍参与融合视图、保存和导出。 + +## 部署验证 + +- 重启 `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 备份验证 + +- 暂存本次相关源码、Docker 说明和工程分析文档。 +- 提交 message 包含本次时间戳。 +- 推送到 Gitea `main` 后确认本地分支与远端同步。 + +## 风险与回归关注点 + +- 不能隐藏失败提示。 +- 自动拉伸成功后不应影响 `markCustom` 和工作区保存状态判断。 diff --git a/工程分析/经验记录.md b/工程分析/经验记录.md index d1a0dfd..2ca3ab8 100644 --- a/工程分析/经验记录.md +++ b/工程分析/经验记录.md @@ -1775,7 +1775,25 @@ B. 原因分析 逆向工作区和项目库各自维护位姿控件步进;平移、缩放曾使用 `0.005`、`0.05` 和 `0.25` 等不同粒度。若只改按钮步进,不同步滑杆 step、显示精度和归一化取整,保存后的位姿可能看起来或实际不是 0.001 级别。 C. 处理方式 -将逆向工作区 `poseStepConfig` 中平移 X/Y/Z 与缩放步进统一为 `0.001`,项目库位姿控件的按钮 delta、range step 也统一为 `0.001`。同时为项目库平移字段补充三位小数归一化,保证按钮、滑杆、显示、保存和导出使用同一精度。 +将逆向工作区 `poseStepConfig` 中平移 X/Y/Z 与缩放步进统一为 `0.001`,项目库位姿控件的按钮 delta、range step 也统一为 `0.001`。同时为项目库和服务端平移/缩放字段补充三位小数归一化,保证按钮、滑杆、显示、保存和导出使用同一精度。 D. 后续建议 -后续调整位姿控件时,要把步进、按钮 delta、range step、数字显示、状态归一化和导出数据一起检查;不要只改单个页面或单个控件,否则会出现项目库与逆向工作区微调精度不一致。 +后续调整位姿控件时,要把步进、按钮 delta、range step、数字显示、前端状态归一化、服务端保存归一化和导出数据一起检查;不要只改单个页面或单个控件,否则会出现项目库与逆向工作区微调精度不一致。 + +## 2026-05-24-19-17-13 自动拉伸成功提示不要长期占位 + +A. 具体问题 + +用户点击 `Z拉伸` 后,页面保留“已按 Z 方向进行三维等比例拉伸”提示。该提示不是错误,也不需要长期显示,容易占用界面注意力。 + +B. 产生问题原因 + +自动拉伸成功分支复用了位姿导入/保存状态 `poseImportStatus`,并在每次成功后写入持久成功文案;按钮本身已经有 `stretchingAxis` 加载态,成功后的额外文字反馈并非必要。 + +C. 解决问题方案 + +自动拉伸成功后仍更新模型 `scale` 并保持工作区脏状态判断,但立即清空 `poseImportStatus`。前置校验和异常分支继续写入 `fusionError`,确保数据未加载、角度不满足条件或计算失败时仍有明确错误提示。 + +D. 后续如何避免问题 + +后续新增操作反馈时,要区分“处理中反馈”“成功反馈”和“错误反馈”。短操作可以只保留按钮加载态和错误提示,避免把普通成功信息写入长期占位区域;如果确实需要成功提示,应设计为短暂 toast 或局部临时状态。 diff --git a/工程分析/需求分析-2026-05-24-19-11-30.md b/工程分析/需求分析-2026-05-24-19-11-30.md index a479152..f6c78ce 100644 --- a/工程分析/需求分析-2026-05-24-19-11-30.md +++ b/工程分析/需求分析-2026-05-24-19-11-30.md @@ -23,6 +23,7 @@ - `WebSite/src/components/ReverseWorkspace.tsx`:逆向工作区位姿控件步进。 - `WebSite/src/components/ProjectLibrary.tsx`:项目库模型位姿控件步进。 +- `WebSite/server.ts`:服务端位姿归一化精度。 - `Docker部署/README.md`:同步说明位姿微调精度。 - `工程分析/经验记录.md`:记录位姿步进和精度同步经验。 diff --git a/工程分析/需求分析-2026-05-24-19-17-13.md b/工程分析/需求分析-2026-05-24-19-17-13.md new file mode 100644 index 0000000..ee03971 --- /dev/null +++ b/工程分析/需求分析-2026-05-24-19-17-13.md @@ -0,0 +1,42 @@ +# 需求分析-2026-05-24-19-17-13 + +## 开始时间 + +2026-05-24-19-17-13 + +## 原始需求摘要 + +用户反馈点击 `Z拉伸` 后不需要显示“已按 Z 方向进行三维等比例拉伸”,或者只在“自动拉伸”区域短暂显示后隐去。 + +## 业务目标 + +- 自动拉伸操作完成后不在页面下方残留成功提示。 +- 保留按钮自身的加载反馈,让用户能知道当前正在拉伸。 +- 保留拉伸失败、数据未加载、角度不满足条件等错误提示。 + +## 输入与输出 + +- 输入:用户点击逆向工作区融合视角中的 X/Y/Z 自动拉伸按钮。 +- 输出:成功后只更新模型缩放位姿,不显示持久成功提示;失败时仍显示明确错误原因。 + +## 影响范围 + +- `WebSite/src/components/ReverseWorkspace.tsx`:自动拉伸成功后的状态提示处理。 +- `Docker部署/README.md`:同步说明容器部署包含该界面行为。 +- `工程分析/经验记录.md`:记录成功提示与错误提示的分离经验。 + +## 关键约束 + +- 不改变自动拉伸计算逻辑。 +- 不改变保存、导出、模型位姿字段结构。 +- 不隐藏失败提示,避免用户无法判断拉伸为什么没有生效。 + +## 风险点 + +- 如果直接清空所有状态,可能把错误提示也隐藏。 +- 如果保留 `keepStatus` 但不清空成功状态,旧的“已按 Z 方向...”仍可能残留。 + +## 待确认问题或默认假设 + +- 默认本次只去掉自动拉伸成功后的持久提示,不新增单独的临时 toast。 +- X/Y 方向自动拉伸成功提示也同步按同一规则处理,保证交互一致。