86 lines
4.1 KiB
Markdown
86 lines
4.1 KiB
Markdown
# 实现方案 - 2026-05-08-01-53-07
|
||
|
||
## 修改目标
|
||
|
||
1. 固定融合视角的 DICOM 物理尺寸基准,使切片范围变化不改变模型原始位置。
|
||
2. DICOM 切片范围默认显示到最高切片,并支持 `M-N` 双向范围选择。
|
||
3. 优化逆向工作区布局,浏览器放大后可滚动访问 DICOM 切片范围。
|
||
4. 项目库项目加载/导入后后台预加载 DICOM 与模型预览。
|
||
5. 模型切分开启后,在 DICOM 切割帧上叠加 Mask 轮廓/填充,直观看到切割位置。
|
||
|
||
## 涉及路径
|
||
|
||
- `WebSite/src/components/ProjectLibrary.tsx`
|
||
- `WebSite/src/components/ReverseWorkspace.tsx`
|
||
- `WebSite/server.ts`
|
||
- `工程分析/经验记录.md`
|
||
|
||
## 技术路线
|
||
|
||
### 固定 DICOM 体基准
|
||
|
||
- 后端 `dicom-fusion-volume` 的 `physicalSize.depth` 改为完整 DICOM 序列深度,而不是当前 `start/end` 范围深度。
|
||
- 前端 FusionThreeView 使用完整物理尺寸计算 DICOM box 和模型缩放,范围变化只改变参与显示的帧,不改变空间基准。
|
||
- 模型 pivot 保持 DICOM 中心,不根据切片范围重新定位。
|
||
|
||
### 双向范围滑条
|
||
|
||
- 恢复 `sliceStart` 与 `sliceEnd` 两个状态,但 UI 使用同一范围卡片表达。
|
||
- 初始值设为 `sliceStart=maxSlice`、`sliceEnd=maxSlice`,即默认最高切片。
|
||
- 请求接口前将 `min(sliceStart,sliceEnd)` 和 `max(sliceStart,sliceEnd)` 作为真实 `M-N`。
|
||
- UI 显示 `M-N / total`,并提供两个滑条在同一区域控制左右端点。
|
||
|
||
### 放大布局
|
||
|
||
- 逆向工作区根容器允许纵向滚动。
|
||
- 主三列区域保留内部滚动,左侧融合区域不因高度压缩导致 DICOM 范围卡片不可达。
|
||
|
||
### 后台预加载
|
||
|
||
- 项目库加载项目列表后,对默认/选中项目发起低成本预加载:
|
||
- DICOM 预览中间帧。
|
||
- 前几个 STL preview。
|
||
- 融合体最高切片。
|
||
- 使用 `void` 异步调用,不阻塞 UI。
|
||
|
||
### 切割 Mask 叠加
|
||
|
||
- FusionThreeView 中当 `cutEnabled` 时,根据当前切割帧创建 DICOM texture overlay。
|
||
- 在切割帧平面上叠加半透明橙色 Mask 区域和边界线,表示模型切割位置。
|
||
- 该 Mask 是可视化辅助层,不改变模型、不写出 NIfTI。
|
||
|
||
## 数据流或交互流程
|
||
|
||
1. 进入逆向工作区读取项目,计算 `maxSlice=dicomCount-1`。
|
||
2. 初始范围设为 `maxSlice-maxSlice`。
|
||
3. 用户拖动双向范围控制,前端排序后请求 `dicom-fusion-volume?start=M&end=N`。
|
||
4. 后端返回当前范围帧,但 physical depth 始终以完整 DICOM 序列计算。
|
||
5. FusionThreeView 使用固定 DICOM box 渲染 DICOM 与模型,模型位姿不受范围变化影响。
|
||
6. 启用模型切分后,在切割帧平面叠加 Mask 预览。
|
||
|
||
## 兼容性与回滚方案
|
||
|
||
- 对任意 DICOM 总数使用 `dicomCount` 和接口返回 `total`,不硬编码 300。
|
||
- 若项目没有 DICOM 或 STL,预加载自动跳过。
|
||
- 回滚本次 commit 可恢复旧的单端点切片范围与切割显示。
|
||
|
||
## 预计文件变更
|
||
|
||
- `server.ts`:修正融合体 physical depth 基准。
|
||
- `ProjectLibrary.tsx`:新增项目后台预加载。
|
||
- `ReverseWorkspace.tsx`:双向范围、布局滚动、固定模型空间、切割 Mask 叠加。
|
||
|
||
## 人工审核状态
|
||
|
||
用户已声明本次不需要二次人工确认,按默认执行确认规则直接执行。
|
||
|
||
## 执行记录
|
||
|
||
- 已将后端 `dicom-fusion-volume` 的 `physicalSize.depth` 改为完整 DICOM 序列深度,避免切片范围变化导致 DICOM 体和模型空间重新缩放。
|
||
- 已将融合视图中每张 DICOM 帧的 Z 位置改为按真实 `volume.indices` 映射到完整 DICOM 深度,范围变化只增减显示帧,不重新铺满空间。
|
||
- 已将逆向工作区 DICOM 切片范围改为双端点控制,支持 `M-N` 显示范围。
|
||
- 已将默认切片范围初始化为最高切片 `maxSlice-maxSlice`,不硬编码 300。
|
||
- 已让逆向工作区根容器支持纵向滚动,浏览器放大时仍可滚动访问 DICOM 切片范围。
|
||
- 已在项目库中加入项目后台预加载:最高 DICOM 预览、最高融合体、前三个 STL 预览。
|
||
- 已在模型切分开启时,在切割 DICOM 帧上叠加橙色 Mask 预览和边界标记,使用户能直接在 DICOM 上看到切割位置。
|