DicomMetadataAnalyzer代码放置方案.md 6.2 KB

DicomMetadataAnalyzer代码放置方案

1. 现有项目结构分析

当前 /src/utils/ 目录结构

src/utils/
├── buttonAvailabilityConfig.ts
├── cornerstoneToolsSetup.ts
├── dicomTagFormatter.ts          // 👈 已有DICOM相关工具
├── eventEmitter.ts
├── measurementToolManager.ts     // 👈 测量工具管理器
├── notificationHelper.ts
├── overlayPositionCalculator.ts
├── throttle.ts
└── useButtonAvailability.ts

观察到的模式

  • 工具类直接放在 utils/ 目录下
  • 已有DICOM相关的工具:dicomTagFormatter.ts
  • 已有管理器模式:measurementToolManager.ts

2. DicomMetadataAnalyzer放置方案

方案A:单文件方案(推荐)

src/utils/
├── ... (现有文件)
└── dicomMetadataAnalyzer.ts      // 🆕 新增分析器

优点

  • 与现有结构保持一致
  • 简单直接,易于查找
  • 遵循现有的命名约定

适用场景

  • DicomMetadataAnalyzer功能相对独立
  • 不需要过多的辅助文件

方案B:模块化方案(如需扩展推荐)

src/utils/
├── ... (现有文件)
└── dicom/                        // 🆕 DICOM专用模块
    ├── DicomMetadataAnalyzer.ts  // 主分析器
    ├── DicomCacheManager.ts      // 缓存管理器  
    ├── types.ts                  // 类型定义
    └── index.ts                  // 统一导出

优点

  • 便于未来扩展DICOM相关功能
  • 模块化管理,职责清晰
  • 类型定义独立管理

适用场景

  • 计划添加更多DICOM分析功能
  • 需要复杂的类型定义和辅助工具

3. 推荐方案:方案A + 渐进式扩展

第一阶段:单文件实现

src/utils/dicomMetadataAnalyzer.ts

第二阶段:根据需要模块化

当功能扩展到一定程度时,再重构为模块化结构。

4. 具体文件内容规划

src/utils/dicomMetadataAnalyzer.ts

// DicomMetadataAnalyzer 主要功能
export interface DicomAnalysisResult {
  frameCount: number;
  isMultiFrame: boolean;
  frameType?: string;
  // ... 其他分析结果
}

export class DicomMetadataAnalyzer {
  private static cache = new Map<string, DicomAnalysisResult>();
  
  static async analyze(imageId: string, viewport?: any): Promise<DicomAnalysisResult> {
    // 实现分析逻辑
  }
  
  static async detectFrameCount(imageId: string, viewport?: any): Promise<number> {
    // 向后兼容的简化方法
  }
  
  // 其他静态方法...
}

// 导出类型和主类
export { DicomMetadataAnalyzer as default };

5. 在项目中的使用方式

导入方式

// 在 StackViewer 中使用
import DicomMetadataAnalyzer, { DicomAnalysisResult } from '@/utils/dicomMetadataAnalyzer';

// 或者使用命名导入
import { DicomMetadataAnalyzer, DicomAnalysisResult } from '@/utils/dicomMetadataAnalyzer';

使用示例

// src/pages/view/components/viewers/stack.image.viewer.tsx
import { DicomMetadataAnalyzer } from '@/utils/dicomMetadataAnalyzer';

const StackViewer = ({ imageUrls, viewportId, ... }) => {
  const [analysisResult, setAnalysisResult] = useState(null);

  useEffect(() => {
    const analyzeImage = async () => {
      try {
        const result = await DicomMetadataAnalyzer.analyze(imageUrls[0], viewport);
        setAnalysisResult(result);
        
        if (result.isMultiFrame) {
          // 初始化播放功能
        }
      } catch (error) {
        console.error('DICOM analysis failed:', error);
      }
    };

    analyzeImage();
  }, [imageUrls, viewportId]);

  // ... 组件渲染逻辑
};

6. 与现有代码的集成

与 dicomTagFormatter.ts 的关系

// 可以复用现有的DICOM标签格式化功能
import { formatDicomTag } from '@/utils/dicomTagFormatter';

export class DicomMetadataAnalyzer {
  private static formatAnalysisResult(metadata: any): DicomAnalysisResult {
    // 复用现有的标签格式化逻辑
    const formattedData = formatDicomTag(metadata);
    // ... 进一步处理
  }
}

与 measurementToolManager.ts 的协作

// measurementToolManager.ts 可能需要知道是否为多帧
import { DicomMetadataAnalyzer } from '@/utils/dicomMetadataAnalyzer';

export class MeasurementToolManager {
  static async setupTools(viewportId: string, imageId: string) {
    // 根据多帧检测结果决定工具配置
    const analysis = await DicomMetadataAnalyzer.analyze(imageId);
    
    if (analysis.isMultiFrame) {
      // 配置多帧相关的测量工具
    }
  }
}

7. TypeScript配置

确保路径解析正确

tsconfig.json 中确认路径映射:

{
  "compilerOptions": {
    "baseUrl": "./src",
    "paths": {
      "@/*": ["*"],
      "@/utils/*": ["utils/*"]
    }
  }
}

导入别名示例

// 使用别名导入
import { DicomMetadataAnalyzer } from '@/utils/dicomMetadataAnalyzer';

// 或相对路径导入
import { DicomMetadataAnalyzer } from '../../../utils/dicomMetadataAnalyzer';

8. 测试文件放置

测试文件结构

src/
├── utils/
│   └── dicomMetadataAnalyzer.ts
└── __tests__/
    └── utils/
        └── dicomMetadataAnalyzer.test.ts

或者与源文件同目录:

src/utils/
├── dicomMetadataAnalyzer.ts
└── dicomMetadataAnalyzer.test.ts

9. 推荐实施步骤

第一步:创建基础文件

  1. 创建 src/utils/dicomMetadataAnalyzer.ts
  2. 实现基本的多帧检测功能
  3. 在 StackViewer 中集成使用

第二步:完善功能

  1. 添加缓存机制
  2. 增强错误处理
  3. 添加更多分析维度

第三步:优化和扩展

  1. 性能优化
  2. 添加测试用例
  3. 根据需要进行模块化重构

10. 文件命名约定

基于现有项目的命名模式:

  • 文件名:使用驼峰命名 dicomMetadataAnalyzer.ts
  • 类名:使用帕斯卡命名 DicomMetadataAnalyzer
  • 导出方式:支持默认导出和命名导出

这样的命名方式与现有的 measurementToolManager.ts 保持一致。


总结:推荐采用方案A(单文件方案),将 DicomMetadataAnalyzer 直接放在 src/utils/dicomMetadataAnalyzer.ts,这样既符合现有项目结构,又便于后续维护和扩展。