/src/utils/ 目录结构src/utils/
├── buttonAvailabilityConfig.ts
├── cornerstoneToolsSetup.ts
├── dicomTagFormatter.ts // 👈 已有DICOM相关工具
├── eventEmitter.ts
├── measurementToolManager.ts // 👈 测量工具管理器
├── notificationHelper.ts
├── overlayPositionCalculator.ts
├── throttle.ts
└── useButtonAvailability.ts
utils/ 目录下dicomTagFormatter.tsmeasurementToolManager.tssrc/utils/
├── ... (现有文件)
└── dicomMetadataAnalyzer.ts // 🆕 新增分析器
优点:
适用场景:
src/utils/
├── ... (现有文件)
└── dicom/ // 🆕 DICOM专用模块
├── DicomMetadataAnalyzer.ts // 主分析器
├── DicomCacheManager.ts // 缓存管理器
├── types.ts // 类型定义
└── index.ts // 统一导出
优点:
适用场景:
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 };
// 在 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]);
// ... 组件渲染逻辑
};
// 可以复用现有的DICOM标签格式化功能
import { formatDicomTag } from '@/utils/dicomTagFormatter';
export class DicomMetadataAnalyzer {
private static formatAnalysisResult(metadata: any): DicomAnalysisResult {
// 复用现有的标签格式化逻辑
const formattedData = formatDicomTag(metadata);
// ... 进一步处理
}
}
// 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) {
// 配置多帧相关的测量工具
}
}
}
在 tsconfig.json 中确认路径映射:
{
"compilerOptions": {
"baseUrl": "./src",
"paths": {
"@/*": ["*"],
"@/utils/*": ["utils/*"]
}
}
}
// 使用别名导入
import { DicomMetadataAnalyzer } from '@/utils/dicomMetadataAnalyzer';
// 或相对路径导入
import { DicomMetadataAnalyzer } from '../../../utils/dicomMetadataAnalyzer';
src/
├── utils/
│ └── dicomMetadataAnalyzer.ts
└── __tests__/
└── utils/
└── dicomMetadataAnalyzer.test.ts
或者与源文件同目录:
src/utils/
├── dicomMetadataAnalyzer.ts
└── dicomMetadataAnalyzer.test.ts
src/utils/dicomMetadataAnalyzer.ts基于现有项目的命名模式:
dicomMetadataAnalyzer.tsDicomMetadataAnalyzer这样的命名方式与现有的 measurementToolManager.ts 保持一致。
总结:推荐采用方案A(单文件方案),将 DicomMetadataAnalyzer 直接放在 src/utils/dicomMetadataAnalyzer.ts,这样既符合现有项目结构,又便于后续维护和扩展。