# 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 ```typescript // DicomMetadataAnalyzer 主要功能 export interface DicomAnalysisResult { frameCount: number; isMultiFrame: boolean; frameType?: string; // ... 其他分析结果 } export class DicomMetadataAnalyzer { private static cache = new Map(); static async analyze(imageId: string, viewport?: any): Promise { // 实现分析逻辑 } static async detectFrameCount(imageId: string, viewport?: any): Promise { // 向后兼容的简化方法 } // 其他静态方法... } // 导出类型和主类 export { DicomMetadataAnalyzer as default }; ``` ## 5. 在项目中的使用方式 ### 导入方式 ```typescript // 在 StackViewer 中使用 import DicomMetadataAnalyzer, { DicomAnalysisResult } from '@/utils/dicomMetadataAnalyzer'; // 或者使用命名导入 import { DicomMetadataAnalyzer, DicomAnalysisResult } from '@/utils/dicomMetadataAnalyzer'; ``` ### 使用示例 ```typescript // 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 的关系 ```typescript // 可以复用现有的DICOM标签格式化功能 import { formatDicomTag } from '@/utils/dicomTagFormatter'; export class DicomMetadataAnalyzer { private static formatAnalysisResult(metadata: any): DicomAnalysisResult { // 复用现有的标签格式化逻辑 const formattedData = formatDicomTag(metadata); // ... 进一步处理 } } ``` ### 与 measurementToolManager.ts 的协作 ```typescript // 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` 中确认路径映射: ```json { "compilerOptions": { "baseUrl": "./src", "paths": { "@/*": ["*"], "@/utils/*": ["utils/*"] } } } ``` ### 导入别名示例 ```typescript // 使用别名导入 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`,这样既符合现有项目结构,又便于后续维护和扩展。