86 lines
3.9 KiB
Markdown
86 lines
3.9 KiB
Markdown
# 实现方案 - 2026-05-04-05-56-34
|
||
|
||
## 修改目标
|
||
|
||
修正 DICOM 矢状面/冠状面的物理比例,新增 DICOM 详细信息查询;简化 3D 模型显示控制,加入更高实体化档位,并实现画布内鼠标旋转、平移、滚轮缩放且同步整体位姿控件。
|
||
|
||
## 涉及路径
|
||
|
||
- `WebSite/server.ts`
|
||
- `WebSite/src/types.ts`
|
||
- `WebSite/src/lib/api.ts`
|
||
- `WebSite/src/components/ProjectLibrary.tsx`
|
||
- `工程分析/经验记录.md`
|
||
|
||
## 技术路线
|
||
|
||
### 1. DICOM 空间信息解析
|
||
|
||
- 扩展后端 DICOM tag 解析:
|
||
- Pixel Spacing `(0028,0030)`:单张切片内行/列像素实际距离。
|
||
- Slice Thickness `(0018,0050)`。
|
||
- Spacing Between Slices `(0018,0088)`。
|
||
- Image Position Patient `(0020,0032)`:优先用相邻切片空间位置差计算真实切片间距。
|
||
- Patient、Study、Series、Modality、Manufacturer、Rows、Columns、Window、Rescale 等基础信息。
|
||
- 在 DICOM volume cache 中保存 `rowSpacing`、`columnSpacing`、`sliceSpacing`。
|
||
|
||
### 2. 多平面物理比例重采样
|
||
|
||
- 当前矢状面/冠状面生成后先得到原始矩阵。
|
||
- 根据物理尺寸计算目标比例:
|
||
- 横向:`切片数 * sliceSpacing`
|
||
- 矢状面纵向:`rows * rowSpacing`
|
||
- 冠状面纵向:`columns * columnSpacing`
|
||
- 以较小物理间距作为输出采样单位,将重建图像最近邻重采样到接近真实物理比例的像素宽高。
|
||
- 返回 `spacing` 和 `physicalSize`,供前端信息展示。
|
||
|
||
### 3. DICOM 详细信息查询
|
||
|
||
- 新增后端接口:`GET /api/projects/:projectId/dicom-info`。
|
||
- 返回默认项目第一张 DICOM 与序列聚合信息:
|
||
- patient、study、series、image、window、spacing、sequence、source 等分组。
|
||
- 前端 DICOM 影像页新增“信息”按钮,打开弹窗/面板展示基本信息、像素间距、切片间距、图像矩阵、物理尺寸、文件数量、首尾文件等。
|
||
|
||
### 4. 3D 模型控制简化与增强
|
||
|
||
- 去掉“白色实体”开关和“自动旋转”开关。
|
||
- 默认模型不自动旋转,正向放置。
|
||
- 实体化档位改为:`预览 / 标准 / 精细 / 超精细`。
|
||
- 后端 STL preview 抽样上限提升到 `72000`,前端超精细档使用 `72000`。
|
||
- 重置位姿按钮移动到“整体位姿”标题右侧。
|
||
|
||
### 5. 鼠标/滚轮位姿交互
|
||
|
||
- 在 `NativeStlViewer` 容器上监听 pointer 和 wheel:
|
||
- 左键拖拽:旋转 X/Y。
|
||
- 右键或 Shift+拖拽:平移 X/Y。
|
||
- 滚轮:缩放。
|
||
- 交互时通过 `onPoseChange` 回写 React state,使滑块数值同步变化。
|
||
- 禁用浏览器右键菜单,避免右键平移时弹出菜单。
|
||
- 位姿仍作用于整体 group,不改变 STL 构件相对位置。
|
||
|
||
## 数据流或交互流程
|
||
|
||
1. 前端请求 DICOM preview,后端解析/缓存体数据和空间信息,按真实物理比例输出矢状面/冠状面。
|
||
2. 前端点击 DICOM 信息按钮,请求 dicom-info,弹窗展示元数据和空间参数。
|
||
3. 前端进入 3D 模型页,按当前实体化档位请求 STL preview。
|
||
4. 用户拖拽/滚轮操作画布,`NativeStlViewer` 更新位姿并回写父组件,右侧滑块同步变化。
|
||
5. 用户点击重置位姿,模型回到默认正向摆放。
|
||
|
||
## 兼容性与回滚方案
|
||
|
||
- 若某些 DICOM tag 缺失,后端使用默认 spacing `1mm`,并在详情中展示“未知/默认”。
|
||
- 多平面重采样使用最近邻,避免引入新依赖;如比例异常可回滚到原始矩阵输出。
|
||
- 超精细档可能更慢,但保留低档位可回退。
|
||
- 鼠标交互只作用于项目库 3D 视图,不影响 DICOM、导出和逆向工作区。
|
||
|
||
## 预计文件变更
|
||
|
||
- 后端:DICOM metadata/spacing 解析、多平面重采样、dicom-info API、STL 上限。
|
||
- 前端:DICOM 信息弹窗、3D 控件重构、鼠标交互回写位姿。
|
||
- 文档:测试结果和经验记录追加。
|
||
|
||
## 人工审核状态
|
||
|
||
用户已明确本次无需人工二次确认,文档落地后直接执行。
|