2026-05-20-02-55-11 修复头部STL实体导出

This commit is contained in:
2026-05-20 03:02:30 +08:00
parent 68fb0cb564
commit b9c0f17313
5 changed files with 332 additions and 13 deletions

View File

@@ -0,0 +1,51 @@
# 实现方案:完整 STL 网格导出与实体填充增强
实现方案文档路径:`工程分析/实现方案-2026-05-20-02-55-11.md`
## 修改目标
修复大面数 STL 构件导出后在 ITK-SNAP 中呈散点的问题,使分割 NIfTI 的 Label Map 基于完整二进制 STL 三角面求交,并在每层生成连续实体区域。
## 涉及路径
- `WebSite/server.ts`
- `工程分析/需求分析-2026-05-20-02-55-11.md`
- `工程分析/实现方案-2026-05-20-02-55-11.md`
- `工程分析/测试方案-2026-05-20-02-55-11.md`
- `工程分析/经验记录.md`
## 技术路线
1. 保留 `createStlPreview` 作为网页预览和 bounds 统计来源。
2. 新增导出专用 STL 迭代逻辑,直接读取完整二进制 STL buffer 中的全部三角面,不再使用 `sampleLimit=200000` 的预览顶点数组作为 NIfTI 生成输入。
3. 对每个三角面执行当前位姿变换、DICOM 物理坐标映射、Mesh-Plane Intersection 和扫描线光栅化。
4. 将每个构件、每个 slice 的 rows 光栅化到临时 mask再做四边 flood fill填补闭合区域内部孔洞后写入最终 Label Map。
5. 保持 `visible/all` 分割范围、labels JSON、导出包结构不变。
## 执行步骤
1. 阅读当前导出生成链路,确认抽样来源和填充缺口。
2. 编写完整 STL 三角面读取辅助函数,避免长期缓存完整顶点数组。
3. 替换 `createSegmentationData` 中遍历 `payload.vertices` 的逻辑。
4. 增强后端 slice mask 的内部孔洞填补。
5. 运行类型检查、构建、导出接口验证。
6. 用脚本检查导出的 Label Map 体素分布,重点确认 `头部` label 不再只集中于少量散点。
7. 追加经验记录、提交、推送并重新部署。
## 兼容性与回滚方案
- API 参数和前端调用不变,外部使用者无需调整。
- 若完整 STL 导出耗时不可接受,可在后续引入后台任务或空间索引;本次先保证导出结果正确。
- 回滚时可恢复到上一个提交,但会重新暴露大面数构件抽样导致的散点问题。
## 预计文件变更
- `WebSite/server.ts`:新增完整 STL 迭代与 slice mask 填充逻辑。
- `工程分析/*-2026-05-20-02-55-11.md`:记录本次工作流。
- `工程分析/经验记录.md`:追加 A/B/C/D 经验。
## 提交与部署策略
- 只暂存本次相关代码和工程分析文档。
- commit message 包含 `2026-05-20-02-55-11` 和简要描述。
- 推送到 Gitea 后使用 `tmux` 会话 `revoxelseg-dicom` 重新部署。