66 lines
2.6 KiB
Markdown
66 lines
2.6 KiB
Markdown
# 实现方案
|
||
|
||
开始时间:2026-05-08-02-36-12
|
||
|
||
## 本次方案路径
|
||
|
||
`工程分析/实现方案-2026-05-08-02-36-12.md`
|
||
|
||
## 实现目标
|
||
|
||
在 DICOM 阅览中实现真实 STL 模型切分 mask,并用单个双端点进度条控制起点/终点帧。
|
||
|
||
## 涉及文件
|
||
|
||
- `web_backend.py`
|
||
- `WebSite/src/App.tsx`
|
||
- `工程分析/经验记录.md`
|
||
|
||
## 执行步骤
|
||
|
||
1. 后端新增 STL 模型目录和缓存:
|
||
- `MODEL_DIR = web_library/_stl_models`
|
||
- `STL_MODEL_CACHE`
|
||
- 支持 ASCII STL 和 binary STL 解析为三角面数组。
|
||
2. 后端新增 STL 上传接口:
|
||
- `POST /api/model/upload`
|
||
- 使用请求体保存 STL 文件。
|
||
- 返回 `modelId`、`name`、`triangleCount`。
|
||
3. 后端新增 DICOM 几何元数据提取:
|
||
- 基于排序后的 DICOM 文件读取 `ImagePositionPatient`、`ImageOrientationPatient`、`PixelSpacing`。
|
||
- 构造 patient 坐标到体素坐标的转换。
|
||
- 元数据不足时降级为 STL 已是体素坐标。
|
||
4. 后端增强 `/api/library/reformat-preview`:
|
||
- 支持 `modelId` 参数。
|
||
- 当传入模型时,根据 `plane` 和 `index` 计算 STL 三角面与当前 DICOM 切片平面的交线。
|
||
- 将交线栅格化并填充形成 mask,叠加到 DICOM PNG 上。
|
||
- 返回 `maskPixels`,便于前端知道该帧是否有模型穿透。
|
||
5. 前端 DICOM 阅览新增模型切分控制:
|
||
- STL 文件上传按钮。
|
||
- 模型切分开关。
|
||
- 一个双端点进度条控制起点/终点,两个端点允许交叉。
|
||
- 起点/终点数值按当前切片总数约束。
|
||
6. 前端模型切分展示:
|
||
- 模型切分关闭:保留当前单帧 DICOM 阅览。
|
||
- 模型切分开启:显示起点帧、终点帧两张 DICOM 图,并请求后端叠加真实 STL mask。
|
||
- 不再显示无意义的 CT MASK 图片或伪造圆圈 mask。
|
||
7. 执行测试方案。
|
||
8. 更新 `工程分析/经验记录.md`。
|
||
9. 提交并推送 Gitea,commit 信息使用 `2026-05-08-02-36-12 实现STL模型切分mask`。
|
||
10. 重新部署到 `http://192.168.3.11:3005/`。
|
||
|
||
## 回滚思路
|
||
|
||
若 STL mask 功能不符合预期,可回滚 `web_backend.py` 中 STL 上传/解析/mask 叠加逻辑,以及 `WebSite/src/App.tsx` 中模型切分 UI,恢复纯 DICOM 阅览。
|
||
|
||
## 风险控制
|
||
|
||
- STL 解析结果和 DICOM 体数据都使用缓存,避免高频重复解析。
|
||
- mask 叠加只影响阅览 PNG,不修改原始 DICOM 和形变输出。
|
||
- 双端点进度条不影响普通 DICOM 阅览切片滑杆。
|
||
- 若 STL 与 DICOM 空间不匹配,前端仍显示 DICOM 切片,并以 `maskPixels=0` 表示该帧无交集。
|
||
|
||
## 人工审核状态
|
||
|
||
用户已明确本次不需要人工二次确认,直接执行。
|