|
|
@@ -0,0 +1,239 @@
|
|
|
+# Cornerstone3D 多 Viewport 工具管理 - 当前按钮分析
|
|
|
+
|
|
|
+## 一、当前 FunctionArea 按钮清单
|
|
|
+
|
|
|
+基于 [`FunctionArea.tsx`](../src/pages/view/components/FunctionArea.tsx) 的分析,当前共有 **30 个功能按钮**:
|
|
|
+
|
|
|
+### 1. 标记类按钮 (Annotation Buttons)
|
|
|
+| Action | Title (i18n) | Icon | 当前行为 |
|
|
|
+|--------|--------------|------|---------|
|
|
|
+| `Add L Mark` | 添加 L 标记 | LMark | 一次性操作 |
|
|
|
+| `Add R Mark` | 添加 R 标记 | RMark | 一次性操作 |
|
|
|
+| `AddMark` | 添加标记 | AddMark | 切换到标记面板 |
|
|
|
+| `Delete Selected Mark` | 删除选中标记 | EraseMark | 一次性操作 |
|
|
|
+
|
|
|
+### 2. 图像变换按钮 (Image Transform Buttons)
|
|
|
+| Action | Title (i18n) | Icon | 当前行为 |
|
|
|
+|--------|--------------|------|---------|
|
|
|
+| `Horizontal Flip` | 水平翻转 | HReverse | 一次性操作 |
|
|
|
+| `Vertical Flip` | 垂直翻转 | VReverse | 一次性操作 |
|
|
|
+| `Rotate Counterclockwise 90` | 逆时针旋转90° | RotateL90 | 一次性操作 |
|
|
|
+| `Rotate Clockwise 90` | 顺时针旋转90° | RotateR90 | 一次性操作 |
|
|
|
+| `Rotate Any Angle` | 任意角度旋转 | RotateAnyDegree | 一次性操作 |
|
|
|
+
|
|
|
+### 3. 裁剪/掩码按钮 (Crop/Mask Buttons)
|
|
|
+| Action | Title (i18n) | Icon | 当前行为 |
|
|
|
+|--------|--------------|------|---------|
|
|
|
+| `Crop Selected Area` | 裁剪选定区域 | Crop | ❌ 未实现 |
|
|
|
+| `Delete Digital Mask` | 删除数字掩码 | btn_RemoveCrop | ❌ 未实现 |
|
|
|
+| `Add Mask` | 添加掩码 | AddMask | 激活掩码工具 |
|
|
|
+| `Delete Mask` | 删除掩码 | DeleteMask | 清除掩码 |
|
|
|
+
|
|
|
+### 4. 亮度/对比度按钮 (Brightness/Contrast Buttons)
|
|
|
+| Action | Title (i18n) | Icon | 当前行为 | 特殊标记 |
|
|
|
+|--------|--------------|------|---------|---------|
|
|
|
+| `Adjust Brightness and Contrast` | 调整亮度对比度 | btn_BrightnessContrast | 调整亮度对比度 | ✅ **STATEFUL_BUTTON** |
|
|
|
+| `Invert Contrast` | 反色对比 | btn_ReverseColour | 一次性操作 | |
|
|
|
+
|
|
|
+### 5. 布局按钮 (Layout Buttons)
|
|
|
+| Action | Title (i18n) | Icon | 当前行为 |
|
|
|
+|--------|--------------|------|---------|
|
|
|
+| `1x1 Layout` | 1x1 布局 | 1x1_normal | 切换布局 |
|
|
|
+| `1x2 Layout` | 1x2 布局 | 1x2_normal | 切换布局 |
|
|
|
+| `2x2 Layout` | 2x2 布局 | 2x1_normal | 切换布局 |
|
|
|
+| `4x4 Layout` | 4x4 布局 | 2x2_normal | 切换布局 |
|
|
|
+
|
|
|
+### 6. 放大/缩放按钮 (Zoom/Magnify Buttons)
|
|
|
+| Action | Title (i18n) | Icon | 当前行为 | 特殊标记 |
|
|
|
+|--------|--------------|------|---------|---------|
|
|
|
+| `Magnifier` | 放大镜 | Magnifier | 激活放大镜工具 | ✅ **STATEFUL_BUTTON** |
|
|
|
+| `Fit Size` | 适应窗口大小 | FitInWindow | 一次性操作 | |
|
|
|
+| `Original Size` | 原始大小 | 1by1_normal | 一次性操作 | |
|
|
|
+| `Zoom Image` | 缩放图像 | Zoom | ❌ 未实现 | |
|
|
|
+
|
|
|
+### 7. 导航/交互按钮 (Navigation/Interaction Buttons)
|
|
|
+| Action | Title (i18n) | Icon | 当前行为 |
|
|
|
+|--------|--------------|------|---------|
|
|
|
+| `Reset Cursor` | 重置光标 | btn_pointer | ❌ 未实现 |
|
|
|
+| `Pan` | 平移 | Pan | ❌ 未实现 |
|
|
|
+| `Image Comparison` | 图像对比 | btn_Compare | ❌ 未实现 |
|
|
|
+
|
|
|
+### 8. 图像处理按钮 (Image Processing Buttons)
|
|
|
+| Action | Title (i18n) | Icon | 当前行为 |
|
|
|
+|--------|--------------|------|---------|
|
|
|
+| `Invert Image` | 反转图像 | Invert | 一次性操作 |
|
|
|
+| `Reset Image` | 重置图像 | Reset | 一次性操作 |
|
|
|
+| `Snapshot` | 快照 | imgsnapshot | ❌ 未实现 |
|
|
|
+
|
|
|
+### 9. 高级功能按钮 (Advanced Feature Buttons)
|
|
|
+| Action | Title (i18n) | Icon | 当前行为 |
|
|
|
+|--------|--------------|------|---------|
|
|
|
+| `Advanced Processing` | 高级处理 | btn_Imageprocess | 切换到高级处理面板 |
|
|
|
+| `Image Measurement` | 图像测量 | btn_Measurements | 切换到测量面板 |
|
|
|
+| `Rectangle Crop` | 矩形裁剪 | rectangle-crop | 切换到矩形裁剪面板 |
|
|
|
+| `More` | 更多 | btn_OtherSetting | 切换到更多功能面板 |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 二、按钮行为分类
|
|
|
+
|
|
|
+### A. 一次性操作按钮 (One-time Action)
|
|
|
+**特点:** 点击后立即执行,不保持状态
|
|
|
+- 所有标记按钮
|
|
|
+- 所有图像变换按钮
|
|
|
+- Invert Contrast, Fit Size, Original Size
|
|
|
+- Invert Image, Reset Image
|
|
|
+- Delete Mask
|
|
|
+
|
|
|
+### B. 状态按钮 (Stateful Toggle)
|
|
|
+**特点:** 点击激活工具,再次点击停用
|
|
|
+- ✅ **Adjust Brightness and Contrast** (在 `STATEFUL_BUTTON_ACTIONS`)
|
|
|
+- ✅ **Magnifier** (在 `STATEFUL_BUTTON_ACTIONS`)
|
|
|
+- Zoom Image
|
|
|
+- Pan
|
|
|
+
|
|
|
+### C. 面板切换按钮 (Panel Switch)
|
|
|
+**特点:** 打开侧边栏面板
|
|
|
+- AddMark, Advanced Processing
|
|
|
+- Image Measurement, Rectangle Crop, More
|
|
|
+
|
|
|
+### D. 未实现按钮 (Not Implemented)
|
|
|
+- Crop Selected Area, Delete Digital Mask
|
|
|
+- Image Comparison, Zoom Image
|
|
|
+- Reset Cursor, **Pan**, Snapshot
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 三、关键发现
|
|
|
+
|
|
|
+### 1. 当前问题
|
|
|
+1. **Pan 按钮未实现**:设计文档提到的 `Pan` 工具目前被 `showNotImplemented()` 拦截
|
|
|
+2. **WindowLevel 工具缺失**:没有独立的 WindowLevel 按钮
|
|
|
+3. **状态管理不一致**:
|
|
|
+ - "Adjust Brightness and Contrast" 在 `STATEFUL_BUTTON_ACTIONS` 中
|
|
|
+ - 但其 `handleButtonClick` 逻辑调用 `adjustBrightnessAndContrast(viewportId)` (一次性操作)
|
|
|
+ - 与设计文档的 "持续工具" 语义冲突
|
|
|
+
|
|
|
+### 2. Cornerstone3D 工具对应关系
|
|
|
+| FunctionArea Action | Cornerstone3D Tool | 当前状态 |
|
|
|
+|---------------------|-------------------|---------|
|
|
|
+| `Adjust Brightness and Contrast` | `WindowLevelTool` | 按钮存在,但行为是一次性函数调用 |
|
|
|
+| `Pan` | `PanTool` | 按钮存在,但被标记为"未实现" |
|
|
|
+| `Magnifier` | `MagnifyTool` | 按钮存在,标记为 STATEFUL |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 四、设计文档要求对照
|
|
|
+
|
|
|
+### 设计文档需求
|
|
|
+```typescript
|
|
|
+// 两个工具作为示例
|
|
|
+tools: ['WindowLevel', 'Pan']
|
|
|
+
|
|
|
+// 行为规则
|
|
|
+1. 点击按钮 → 工具 Active + 抢左键 + 按钮高亮
|
|
|
+2. 再次点击 → 工具 Passive + 释放左键 + 取消高亮
|
|
|
+3. 同一时间:允许无工具抢左键,不允许多个工具同时抢左键
|
|
|
+```
|
|
|
+
|
|
|
+### 当前实现差距
|
|
|
+1. **WindowLevel**:
|
|
|
+ - ❌ 无独立按钮名称(被隐藏在 "Adjust Brightness and Contrast")
|
|
|
+ - ❌ 无 Redux 状态管理(只在 `STATEFUL_BUTTON_ACTIONS` 集合中)
|
|
|
+ - ❌ 无 ToolGroup 绑定逻辑
|
|
|
+
|
|
|
+2. **Pan**:
|
|
|
+ - ✅ 按钮存在
|
|
|
+ - ❌ 被 `showNotImplemented()` 拦截
|
|
|
+ - ❌ 无 Redux 状态管理
|
|
|
+ - ❌ 无 ToolGroup 绑定逻辑
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 五、建议实现路径
|
|
|
+
|
|
|
+### 选项 A:最小改动(推荐)
|
|
|
+**映射现有按钮到 Cornerstone3D 工具**
|
|
|
+
|
|
|
+1. **WindowLevel** → "Adjust Brightness and Contrast" 按钮
|
|
|
+ - 修改 `handleButtonClick` 逻辑
|
|
|
+ - 从一次性函数调用改为 Redux toggle
|
|
|
+ - 添加 `activeTools['WindowLevel']` 状态
|
|
|
+
|
|
|
+2. **Pan** → "Pan" 按钮
|
|
|
+ - 移除 `showNotImplemented()` 拦截
|
|
|
+ - 添加 Redux toggle 逻辑
|
|
|
+ - 添加 `activeTools['Pan']` 状态
|
|
|
+
|
|
|
+### 选项 B:完整重构
|
|
|
+**统一所有工具到新架构**
|
|
|
+
|
|
|
+1. 重命名/重构所有 STATEFUL 按钮
|
|
|
+2. 区分 "交互工具"(需要鼠标绑定)和 "一次性操作"
|
|
|
+3. 统一使用 Redux `activeTools` 管理所有持续工具
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 六、后续问题
|
|
|
+
|
|
|
+请确认以下设计决策:
|
|
|
+
|
|
|
+1. **工具互斥性**:
|
|
|
+ - WindowLevel 和 Pan 是否互斥?
|
|
|
+ - 是否允许两者都处于非激活状态?
|
|
|
+
|
|
|
+2. **按钮映射**:
|
|
|
+ - 确认使用 "Adjust Brightness and Contrast" → WindowLevel
|
|
|
+ - 确认使用 "Pan" → PanTool
|
|
|
+
|
|
|
+3. **其他工具**:
|
|
|
+ - Magnifier 是否也需要纳入新架构?
|
|
|
+ - 测量工具是否保持现状?
|
|
|
+
|
|
|
+4. **向后兼容**:
|
|
|
+ - 是否需要保持现有 `adjustBrightnessAndContrast(viewportId)` 函数?
|
|
|
+ - 或完全替换为新的 ToolGroup 绑定逻辑?
|
|
|
+## 七、需求
|
|
|
+1. Adjust Brightness and Contrast 、Magnifier 、Zoom Image、pan。这4个是有状态按钮。点击任一按钮后,其他三个按钮对应的工具处于失活状态,不再绑定鼠标左键了;被点击的按钮绑定了鼠标左键。对应工具成功激活并绑定左键后高亮。
|
|
|
+2. 点击面板上的任一按钮,不论是一面板切换按钮,还是一次性按钮,当前绑定鼠标左键的按钮要失活,不再和鼠标左键绑定
|
|
|
+3. 重置光标按钮的功能。清除几个状态按钮的按下状态。
|
|
|
+4. 多分格状态下。按钮可用性如下表:
|
|
|
+ 1.
|
|
|
+按钮名 所在分组 多分格可用性
|
|
|
+Add L Mark【添加L标记】 FunctionArea (功能区) ❌
|
|
|
+Add R Mark【添加R标记】 FunctionArea (功能区) ❌
|
|
|
+Add Mask【添加标记】 FunctionArea (功能区) ❌
|
|
|
+Delete Selected Mark【删除标记】 FunctionArea (功能区) ❌
|
|
|
+添加Mask【人医】 FunctionArea (功能区) ❌
|
|
|
+Delete Mask【删除Mask】 FunctionArea (功能区) ❌
|
|
|
+Horizontal Flip【水平翻转】 FunctionArea (功能区) ✅
|
|
|
+Vertical Flip【竖直翻转】 FunctionArea (功能区) ✅
|
|
|
+Rotate Counterclockwise 90°【逆时针旋转90°】 FunctionArea (功能区) ✅
|
|
|
+Rotate Clockwise 90°【顺时针旋转90°】 FunctionArea (功能区) ✅
|
|
|
+Rotate Any Angle【任意角度旋转】 FunctionArea (功能区) ❌
|
|
|
+Crop Selected Area【裁剪图像】【人医】 FunctionArea (功能区) ❌
|
|
|
+Delete Digital Mask【删除数字遮挡线】【人医】 FunctionArea (功能区) ❌
|
|
|
+Adjust Brightness and Contrast【鼠标调节亮度对比度】 FunctionArea (功能区) ✅
|
|
|
+Image Comparison【图像对比】 FunctionArea (功能区) ✅
|
|
|
+反色对比 FunctionArea (功能区) ✅
|
|
|
+1x1 Layout FunctionArea (功能区) ✅
|
|
|
+1x2 Layout FunctionArea (功能区) ✅
|
|
|
+2x2 Layout FunctionArea (功能区) ✅
|
|
|
+4x4 Layout FunctionArea (功能区) ✅
|
|
|
+Magnifier【放大镜】 FunctionArea (功能区) ❌
|
|
|
+Fit Size【适应大小】 FunctionArea (功能区) ✅
|
|
|
+Original Size【原始大小】 FunctionArea (功能区) ✅
|
|
|
+Zoom Image【缩放图像】 FunctionArea (功能区) ✅
|
|
|
+Reset Cursor【重置光标】 FunctionArea (功能区) ✅
|
|
|
+Pan【漫游】 FunctionArea (功能区) ✅
|
|
|
+Invert Image【反色图像】 FunctionArea (功能区) ❌
|
|
|
+Reset Image【重置图像】 FunctionArea (功能区) ❌
|
|
|
+Snapshot【快照】 FunctionArea (功能区) ❌
|
|
|
+Advanced Processing【高级处理】 FunctionArea (功能区) ❌
|
|
|
+Image Measurement【测量工具】 FunctionArea (功能区) ❌
|
|
|
+矩形裁剪【人医】 FunctionArea (功能区) ❌
|
|
|
+More【更多】 FunctionArea (功能区) ❌
|
|
|
+拒绝 ImageStateControl (图像状态控制) ❌
|
|
|
+恢复 ImageStateControl (图像状态控制) ❌
|
|
|
+另存为 ImageStateControl (图像状态控制) ❌
|
|
|
+Send【发送】 TransferArea (传输区) ✅
|