useImageEnhancementSDK.ts 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. import { useEffect, useState, useRef } from 'react';
  2. import * as cornerstone from '@cornerstonejs/core';
  3. import * as cornerstoneTools from '@cornerstonejs/tools';
  4. import { imageLoader } from '@cornerstonejs/core';
  5. import type { ImageEnhancementSDK } from '@/lib/image-enhancement-sdk';
  6. import {
  7. createImageEnhancementSDK,
  8. IMAGE_LOADER_SCHEMA
  9. } from '@/lib/image-enhancement-sdk';
  10. interface UseImageEnhancementSDKOptions {
  11. sopInstanceUid: string;
  12. enabled: boolean; // 是否启用SDK(仅在WASM模式下启用)
  13. }
  14. interface UseImageEnhancementSDKReturn {
  15. sdk: ImageEnhancementSDK | null;
  16. isSDKReady: boolean;
  17. isInitializing: boolean;
  18. error: Error | null;
  19. }
  20. /**
  21. * 自定义Hook:管理Image Enhancement SDK的生命周期
  22. *
  23. * @param options 配置选项
  24. * @returns SDK实例和状态
  25. */
  26. export const useImageEnhancementSDK = (
  27. options: UseImageEnhancementSDKOptions
  28. ): UseImageEnhancementSDKReturn => {
  29. const { sopInstanceUid, enabled } = options;
  30. const [sdk, setSdk] = useState<ImageEnhancementSDK | null>(null);
  31. const [isSDKReady, setIsSDKReady] = useState(false);
  32. const [isInitializing, setIsInitializing] = useState(false);
  33. const [error, setError] = useState<Error | null>(null);
  34. // 使用ref避免重复初始化
  35. const initializingRef = useRef(false);
  36. const sdkRef = useRef<ImageEnhancementSDK | null>(null);
  37. useEffect(() => {
  38. // 如果未启用或没有图像ID,直接返回
  39. if (!enabled || !sopInstanceUid) {
  40. return;
  41. }
  42. // 如果已经在初始化或已初始化,避免重复
  43. if (initializingRef.current || sdkRef.current) {
  44. return;
  45. }
  46. const initializeSDK = async () => {
  47. initializingRef.current = true;
  48. setIsInitializing(true);
  49. setError(null);
  50. try {
  51. console.log('🔧 开始初始化Image Enhancement SDK...');
  52. // 1. 初始化Cornerstone3D核心库
  53. if (!cornerstone.cache) {
  54. await cornerstone.init();
  55. console.log('✅ Cornerstone3D核心库初始化完成');
  56. }
  57. // 2. 初始化Cornerstone Tools
  58. try {
  59. await cornerstoneTools.init();
  60. console.log('✅ Cornerstone Tools初始化完成');
  61. } catch (err) {
  62. // Tools可能已经初始化,忽略错误
  63. console.log('ℹ️ Cornerstone Tools已初始化');
  64. }
  65. // 3. 构建配置参数
  66. const baseUrl = '/dr/api/v1/pub';
  67. const tifUrl = `${baseUrl}/tif/${sopInstanceUid}-0001.tif`;
  68. const dcmUrl = `${baseUrl}/dcm/${sopInstanceUid}.dcm`;
  69. console.log('SDK配置:', {
  70. sopInstanceUid,
  71. tifUrl,
  72. dcmUrl,
  73. });
  74. // 4. 创建SDK实例
  75. const sdkInstance = await createImageEnhancementSDK({
  76. wasmUrl: '/static/DRENHANCE.js',
  77. tifUrl,
  78. dcmUrl,
  79. tifServiceBaseUrl: baseUrl,
  80. authorization: '', // 从全局配置获取
  81. language: 'zh_CN',
  82. product: 'DROS',
  83. source: 'Electron',
  84. });
  85. // 5. 等待SDK就绪
  86. await new Promise(resolve => setTimeout(resolve, 500));
  87. // 6. 注册enhanced loader
  88. console.log('注册 "enhanced" loader 到 Cornerstone...');
  89. imageLoader.registerImageLoader(
  90. IMAGE_LOADER_SCHEMA,
  91. sdkInstance.imageLoader.getLoaderFunction()
  92. );
  93. console.log('✅ Loader注册成功');
  94. // 7. 保存SDK实例
  95. sdkRef.current = sdkInstance;
  96. setSdk(sdkInstance);
  97. setIsSDKReady(true);
  98. console.log('✅ Image Enhancement SDK初始化完成');
  99. } catch (err) {
  100. const error = err instanceof Error ? err : new Error('SDK初始化失败');
  101. console.error('❌ SDK初始化失败:', error);
  102. setError(error);
  103. } finally {
  104. setIsInitializing(false);
  105. initializingRef.current = false;
  106. }
  107. };
  108. initializeSDK();
  109. // 清理函数
  110. return () => {
  111. if (sdkRef.current) {
  112. console.log('🧹 清理SDK资源...');
  113. // SDK清理逻辑(如果有)
  114. sdkRef.current = null;
  115. setSdk(null);
  116. setIsSDKReady(false);
  117. }
  118. };
  119. }, [enabled, sopInstanceUid]);
  120. return {
  121. sdk,
  122. isSDKReady,
  123. isInitializing,
  124. error,
  125. };
  126. };