import { useEffect, useState, useRef } from 'react'; import * as cornerstone from '@cornerstonejs/core'; import * as cornerstoneTools from '@cornerstonejs/tools'; import { imageLoader } from '@cornerstonejs/core'; import type { ImageEnhancementSDK } from '@/lib/image-enhancement-sdk'; import { createImageEnhancementSDK, IMAGE_LOADER_SCHEMA } from '@/lib/image-enhancement-sdk'; interface UseImageEnhancementSDKOptions { sopInstanceUid: string; enabled: boolean; // 是否启用SDK(仅在WASM模式下启用) } interface UseImageEnhancementSDKReturn { sdk: ImageEnhancementSDK | null; isSDKReady: boolean; isInitializing: boolean; error: Error | null; } /** * 自定义Hook:管理Image Enhancement SDK的生命周期 * * @param options 配置选项 * @returns SDK实例和状态 */ export const useImageEnhancementSDK = ( options: UseImageEnhancementSDKOptions ): UseImageEnhancementSDKReturn => { const { sopInstanceUid, enabled } = options; const [sdk, setSdk] = useState(null); const [isSDKReady, setIsSDKReady] = useState(false); const [isInitializing, setIsInitializing] = useState(false); const [error, setError] = useState(null); // 使用ref避免重复初始化 const initializingRef = useRef(false); const sdkRef = useRef(null); useEffect(() => { // 如果未启用或没有图像ID,直接返回 if (!enabled || !sopInstanceUid) { return; } // 如果已经在初始化或已初始化,避免重复 if (initializingRef.current || sdkRef.current) { return; } const initializeSDK = async () => { initializingRef.current = true; setIsInitializing(true); setError(null); try { console.log('🔧 开始初始化Image Enhancement SDK...'); // 1. 初始化Cornerstone3D核心库 if (!cornerstone.cache) { await cornerstone.init(); console.log('✅ Cornerstone3D核心库初始化完成'); } // 2. 初始化Cornerstone Tools try { await cornerstoneTools.init(); console.log('✅ Cornerstone Tools初始化完成'); } catch (err) { // Tools可能已经初始化,忽略错误 console.log('ℹ️ Cornerstone Tools已初始化'); } // 3. 构建配置参数 const baseUrl = '/dr/api/v1/pub'; const tifUrl = `${baseUrl}/tif/${sopInstanceUid}-0001.tif`; const dcmUrl = `${baseUrl}/dcm/${sopInstanceUid}.dcm`; console.log('SDK配置:', { sopInstanceUid, tifUrl, dcmUrl, }); // 4. 创建SDK实例 const sdkInstance = await createImageEnhancementSDK({ wasmUrl: '/static/DRENHANCE.js', tifUrl, dcmUrl, tifServiceBaseUrl: baseUrl, authorization: '', // 从全局配置获取 language: 'zh_CN', product: 'DROS', source: 'Electron', }); // 5. 等待SDK就绪 await new Promise(resolve => setTimeout(resolve, 500)); // 6. 注册enhanced loader console.log('注册 "enhanced" loader 到 Cornerstone...'); imageLoader.registerImageLoader( IMAGE_LOADER_SCHEMA, sdkInstance.imageLoader.getLoaderFunction() ); console.log('✅ Loader注册成功'); // 7. 保存SDK实例 sdkRef.current = sdkInstance; setSdk(sdkInstance); setIsSDKReady(true); console.log('✅ Image Enhancement SDK初始化完成'); } catch (err) { const error = err instanceof Error ? err : new Error('SDK初始化失败'); console.error('❌ SDK初始化失败:', error); setError(error); } finally { setIsInitializing(false); initializingRef.current = false; } }; initializeSDK(); // 清理函数 return () => { if (sdkRef.current) { console.log('🧹 清理SDK资源...'); // SDK清理逻辑(如果有) sdkRef.current = null; setSdk(null); setIsSDKReady(false); } }; }, [enabled, sopInstanceUid]); return { sdk, isSDKReady, isInitializing, error, }; };