| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148 |
- 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<ImageEnhancementSDK | null>(null);
- const [isSDKReady, setIsSDKReady] = useState(false);
- const [isInitializing, setIsInitializing] = useState(false);
- const [error, setError] = useState<Error | null>(null);
-
- // 使用ref避免重复初始化
- const initializingRef = useRef(false);
- const sdkRef = useRef<ImageEnhancementSDK | null>(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,
- };
- };
|