Browse Source

fix (1.39.0 -> 1.39.1): 修复自定义标记添加时的坐标计算问题

- 在 MarkPanel.tsx 中修复预定义标记的 dispatch payload,传递正确的标记类型
- 在 stack.image.viewer.tsx 中实现正确的世界坐标转换,确保标记显示在图像中心
- 添加渲染引擎检查和错误提示,提升稳定性

改动文件:
- src/pages/view/components/MarkPanel.tsx
- src/pages/view/components/viewers/stack.image.viewer.tsx
dengdx 1 tuần trước cách đây
mục cha
commit
a47baaa776

+ 15 - 0
CHANGELOG.md

@@ -2,6 +2,21 @@
 
 本项目的所有重要变更都将记录在此文件中。
 
+## [1.39.1] - 2025-12-31 16:00
+
+### 修复 (Fixed)
+
+- **修复自定义标记添加时的坐标计算问题** - 修复预定义标记和自定义标记的坐标计算错误,确保标记正确显示在图像中心位置
+  - 在 MarkPanel.tsx 中修正预定义标记的 dispatch action payload
+  - 在 stack.image.viewer.tsx 中实现正确的 canvas 到 world 坐标转换
+  - 添加渲染引擎存在性检查和用户错误提示
+  - 提升标记功能的准确性和稳定性
+
+**改动文件:**
+
+- src/pages/view/components/MarkPanel.tsx
+- src/pages/view/components/viewers/stack.image.viewer.tsx
+
 ## [1.39.0] - 2025-12-31 15:18
 
 ### 新增 (Added)

+ 1 - 1
package.json

@@ -1,6 +1,6 @@
 {
   "name": "zsis",
-  "version": "1.39.0",
+  "version": "1.39.1",
   "private": true,
   "description": "医学成像系统",
   "main": "main.js",

+ 1 - 1
src/pages/view/components/MarkPanel.tsx

@@ -211,7 +211,7 @@ const MarkPanel = () => {
               type="primary"
               onClick={() => {
                 if (selectedMark) {
-                  dispatch({ type: 'functionArea/setAction', payload: 'AddCustomMark' });
+                  dispatch({ type: 'functionArea/setAction', payload: `AddPredefinedMark:${selectedMark}` });
                   console.log(`添加自定义标记: ${selectedMark}`);
                 }
               }}

+ 17 - 6
src/pages/view/components/viewers/stack.image.viewer.tsx

@@ -36,6 +36,7 @@ import PolylineLengthMeasurementTool from '@/components/measures/PolylineLengthM
 import { PlaybackController } from '@/pages/view/components/playback/PlaybackController';
 import { FloatingPlaybackControls } from '@/pages/view/components/playback/FloatingPlaybackControls';
 import { getIpPort } from '@/API/config';
+import { getRenderingEngine } from '@cornerstonejs/core';
 
 const {
   MagnifyTool,
@@ -53,6 +54,7 @@ const {
 
 // 导入 cursors 用于光标管理
 import { cursors } from '@cornerstonejs/tools';
+import { message } from 'antd';
 const { MouseBindings } = csToolsEnums;
 // 全局工具状态变化监听器注册标志
 let cursorResetListenerRegistered = false;
@@ -520,14 +522,23 @@ export function addCustomMark(currentViewportId: string, text: string): void {
     console.error(`Element not found for viewport: ${currentViewportId}`);
     return;
   }
-
+const renderingEngine = getRenderingEngine("myRenderingEngine");
+if(renderingEngine===undefined){
+  console.error(`Rendering engine not found for viewport: ${currentViewportId}`);
+  message.error(`添加注释失败`);
+  return;
+}
+  const viewport = renderingEngine.getViewport(currentViewportId);
   // 计算标记位置(图像中心位置)
-  const elementHeight = element.getBoundingClientRect().height;
-  const elementWidth = element.getBoundingClientRect().width;
-  const position: Types.Point3 = [elementWidth / 2, elementHeight / 2, 0];
+  // 1️⃣ canvas 坐标(屏幕中心)
+  const { width, height } = element.getBoundingClientRect();
+  const canvasPoint: Types.Point2 = [width / 2, height / 2];
 
-  // 添加标签
-  LabelTool.hydrate(currentViewportId, position, text);
+  // 2️⃣ 转为 world 坐标(关键!)
+  const worldPoint = viewport.canvasToWorld(canvasPoint);
+
+  // 3️⃣ 使用 world 坐标 添加标签
+  LabelTool.hydrate(currentViewportId, worldPoint, text);
 
   // 恢复工具状态
   toolGroup.setToolPassive(LabelTool.toolName, {