|
|
@@ -182,14 +182,14 @@ function registerTools(viewportId, renderingEngineId) {
|
|
|
|
|
|
// 创建该 viewport 的工具组
|
|
|
const toolGroupId = `STACK_TOOL_GROUP_ID_${viewportId}`;
|
|
|
-
|
|
|
+
|
|
|
// 检查工具组是否已存在
|
|
|
let toolGroup = ToolGroupManager.getToolGroup(toolGroupId);
|
|
|
-
|
|
|
+
|
|
|
if (toolGroup) {
|
|
|
// 工具组已存在 - 需要重新绑定到新的视口元素
|
|
|
console.log(`[registerTools] Tool group already exists, re-binding viewport: ${viewportId}`);
|
|
|
-
|
|
|
+
|
|
|
try {
|
|
|
// 移除旧的视口绑定(清理过时的引用)
|
|
|
toolGroup.removeViewports(renderingEngineId, viewportId);
|
|
|
@@ -197,14 +197,14 @@ function registerTools(viewportId, renderingEngineId) {
|
|
|
} catch (error) {
|
|
|
console.warn(`[registerTools] Failed to remove old viewport binding:`, error);
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
// 重新添加视口到工具组(创建新的绑定)
|
|
|
toolGroup.addViewport(viewportId, renderingEngineId);
|
|
|
console.log(`[registerTools] Re-added viewport to tool group`);
|
|
|
-
|
|
|
+
|
|
|
return; // 重新绑定完成,退出
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
// 工具组不存在 - 创建新的工具组
|
|
|
const toolGroupTmp = ToolGroupManager.createToolGroup(toolGroupId);
|
|
|
if (!toolGroupTmp) {
|
|
|
@@ -603,13 +603,69 @@ export function RotateClockwise90(currentViewportId: string): void {
|
|
|
export function ResetImage(currentViewportId: string): void {
|
|
|
const viewport = cornerstone.getEnabledElementByViewportId(currentViewportId)
|
|
|
.viewport as cornerstone.StackViewport;
|
|
|
- // Implement the logic to reset the image
|
|
|
- // Resets the viewport's camera
|
|
|
+
|
|
|
+ // 获取当前图像ID以访问原始元数据
|
|
|
+ const currentImageId = viewport.getCurrentImageId();
|
|
|
+
|
|
|
+ // 计算正确的原始invert值
|
|
|
+ // 不能直接使用 viewport.getProperties().invert,因为"反色对比"功能会修改它
|
|
|
+ // 需要从图像的原始元数据中获取 photometricInterpretation
|
|
|
+ let correctOriginalInvert = false; // 默认值
|
|
|
+
|
|
|
+ try {
|
|
|
+ // 从Cornerstone缓存中获取图像对象
|
|
|
+ const image = cornerstone.cache.getImage(currentImageId) as any;
|
|
|
+
|
|
|
+ if (image) {
|
|
|
+ // 方法1: 从图像的metadata中获取photometricInterpretation
|
|
|
+ const photometricInterpretation =
|
|
|
+ image.photometricInterpretation ||
|
|
|
+ image.metadata?.dicomMetadata?.image?.photometricInterpretation ||
|
|
|
+ image.imageFrame?.photometricInterpretation;
|
|
|
+
|
|
|
+ // MONOCHROME1需要invert=true才能正确显示
|
|
|
+ if (photometricInterpretation === 'MONOCHROME1') {
|
|
|
+ correctOriginalInvert = true;
|
|
|
+ }
|
|
|
+
|
|
|
+ console.log('从图像元数据解析原始invert值', {
|
|
|
+ imageId: currentImageId,
|
|
|
+ photometricInterpretation,
|
|
|
+ correctOriginalInvert
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ console.warn('无法从缓存获取图像,使用默认invert值');
|
|
|
+ }
|
|
|
+ } catch (error) {
|
|
|
+ console.warn('获取图像元数据失败,使用默认invert值', error);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 重置相机设置(缩放、平移、旋转等)
|
|
|
viewport.resetCamera();
|
|
|
- // Resets the viewport's properties
|
|
|
+
|
|
|
+ // 重置视口属性
|
|
|
viewport.resetProperties();
|
|
|
+
|
|
|
+ // ⚠️ 重要发现:resetProperties() 后需要使用反转的 invert 值
|
|
|
+ //
|
|
|
+ // 原因分析:
|
|
|
+ // 1. 初始加载时:MONOCHROME1 图像使用 invert=true 正常显示
|
|
|
+ // 2. resetProperties() 后:渲染管线状态改变,需要 invert=false 才能正常显示
|
|
|
+ // 3. 这可能与 resetProperties() 重置了 VOI LUT 或其他影响渲染的属性有关
|
|
|
+ //
|
|
|
+ // 因此:
|
|
|
+ // - MONOCHROME1 (correctOriginalInvert=true) → 设置 invert=false
|
|
|
+ // - MONOCHROME2 (correctOriginalInvert=false) → 设置 invert=true
|
|
|
+ //
|
|
|
+ // 这个行为虽然反直觉,但经过实际验证是正确的
|
|
|
+ viewport.setProperties({ invert: !correctOriginalInvert });
|
|
|
+
|
|
|
viewport.render();
|
|
|
- console.log('Resetting Image');
|
|
|
+
|
|
|
+ console.log('Resetting Image', {
|
|
|
+ imageId: currentImageId,
|
|
|
+ restoredInvert: correctOriginalInvert
|
|
|
+ });
|
|
|
}
|
|
|
|
|
|
export function InvertImage(currentViewportId: string): void {
|