diff --git a/README.md b/README.md index 52cd97e..aa27683 100644 --- a/README.md +++ b/README.md @@ -19,4 +19,23 @@ pnpm config set virtual-store-dir-max-length 70 - 脱敏后总结metadata -- 影像关键位置标签文字总结到滚层 \ No newline at end of file +- 影像关键位置标签文字总结到滚层 + +- 不同结构的窗宽窗位快速选择,需要考虑不同身体结构的dicom image + +## 窗宽创维相关的一些小问题 + +- 心脏软组织窗 +窗宽 (Window Width, WW):350 到 700 HU (Hounsfield Units) +窗位 (Window Level, WL):40 到 100 HU +这个范围适合评估心脏的软组织结构,包括心肌和血管周围的软组织。 + +- 冠状动脉窗 +窗宽:800 HU +窗位:200 HU +这种设置特别适用于观察冠状动脉,有助于清晰地显示冠状动脉的钙化和非钙化斑块。 + +- 心脏结构窗 +窗宽:500 HU +窗位:50 HU +适用于查看整体心脏结构,包括心室腔、心包和大血管。 \ No newline at end of file diff --git a/apps/desktop/src/pages/Viewer/MprViewer/CornerstoneDicomLoader/setCtTransferFunctionForVolumeActor.ts b/apps/desktop/src/pages/Viewer/MprViewer/CornerstoneDicomLoader/setCtTransferFunctionForVolumeActor.ts index acc9ab9..e3c5510 100644 --- a/apps/desktop/src/pages/Viewer/MprViewer/CornerstoneDicomLoader/setCtTransferFunctionForVolumeActor.ts +++ b/apps/desktop/src/pages/Viewer/MprViewer/CornerstoneDicomLoader/setCtTransferFunctionForVolumeActor.ts @@ -1,12 +1,19 @@ -const windowWidth = 400; -const windowCenter = 40; -const lower = windowCenter - windowWidth / 2.0; -const upper = windowCenter + windowWidth / 2.0; +let ctVoiRange; -const ctVoiRange = { lower, upper }; +export interface CtTransferFunction { + volumeActor: any + defaultWindowCenter: number + defaultWindowWidth: number +} + +export default function setCtTransferFunctionForVolumeActor(p: CtTransferFunction) { + const { volumeActor, defaultWindowCenter, defaultWindowWidth } = p + console.log(defaultWindowCenter, defaultWindowWidth) + const lower = defaultWindowCenter - defaultWindowWidth / 2.0; + const upper = defaultWindowCenter + defaultWindowWidth / 2.0; + ctVoiRange = { lower, upper }; -export default function setCtTransferFunctionForVolumeActor({ volumeActor }) { volumeActor .getProperty() .getRGBTransferFunction(0) diff --git a/apps/desktop/src/pages/Viewer/MprViewer/Crosshair.tsx b/apps/desktop/src/pages/Viewer/MprViewer/Crosshair.tsx index e9291d9..b2be293 100644 --- a/apps/desktop/src/pages/Viewer/MprViewer/Crosshair.tsx +++ b/apps/desktop/src/pages/Viewer/MprViewer/Crosshair.tsx @@ -17,15 +17,13 @@ import { viewportId1, viewportId2, viewportId3, - toolGroupId, - volumeId, - renderingEngineId, } from "./Crosshair.config"; -import { initCornerstone } from "./CornerstoneDicomLoader/init"; -const { ToolGroupManager, CrosshairsTool, StackScrollMouseWheelTool } = +const { ToolGroupManager, CrosshairsTool, StackScrollMouseWheelTool, WindowLevelTool, Enums: csToolsEnums } = cornerstoneTools; +const { MouseBindings } = csToolsEnums; + const { ViewportType } = CoreEnums; interface CrosshairMprProps { @@ -65,6 +63,11 @@ export const CrosshairMpr = (props: CrosshairMprProps) => { const imageIds = useRef(); useEffect(() => { + + cornerstoneTools.addTool(StackScrollMouseWheelTool); + cornerstoneTools.addTool(CrosshairsTool); + cornerstoneTools.addTool(WindowLevelTool); + const run = async () => { imageIds.current = await createImageIdsAndCacheMetaData({ StudyInstanceUID: props.StudyInstanceUID, @@ -82,6 +85,12 @@ export const CrosshairMpr = (props: CrosshairMprProps) => { } ); + // 默认windowWidtth + const { windowCenter, windowWidth } = volume.cornerstoneImageMetaData + const defaultWindowCenter = 50 + const defaultWindowWidth = 850 + console.log(2, windowCenter, windowWidth) + // Create the viewports const viewportInputArray: PublicViewportInput[] = [ { @@ -124,7 +133,7 @@ export const CrosshairMpr = (props: CrosshairMprProps) => { [ { volumeId: props.SeriesInstanceUID, - callback: setCtTransferFunctionForVolumeActor, + callback: ({ volumeActor }) => setCtTransferFunctionForVolumeActor({ volumeActor, defaultWindowCenter, defaultWindowWidth }), }, ], [viewportId1, viewportId2, viewportId3] @@ -160,6 +169,15 @@ export const CrosshairMpr = (props: CrosshairMprProps) => { // As the Stack Scroll mouse wheel is a tool using the `mouseWheelCallback` // hook instead of mouse buttons, it does not need to assign any mouse button. toolGroup.setToolActive(StackScrollMouseWheelTool.toolName); + + toolGroup.addTool(WindowLevelTool.toolName); + toolGroup.setToolActive(WindowLevelTool.toolName, { + bindings: [ + { + mouseButton: MouseBindings.Secondary, + }, + ], + }); } renderingEngine.current.renderViewports([ @@ -171,12 +189,12 @@ export const CrosshairMpr = (props: CrosshairMprProps) => { if (!props.SeriesInstanceUID && !props.StudyInstanceUID) return; run(); - cornerstoneTools.addTool(StackScrollMouseWheelTool); - cornerstoneTools.addTool(CrosshairsTool); + return () => { cornerstoneTools.removeTool(StackScrollMouseWheelTool); cornerstoneTools.removeTool(CrosshairsTool); + cornerstoneTools.removeTool(WindowLevelTool) ToolGroupManager.destroyToolGroup(props.SeriesInstanceUID); }; }, [props.StudyInstanceUID, props.SeriesInstanceUID]); @@ -190,10 +208,10 @@ export const CrosshairMpr = (props: CrosshairMprProps) => { }, []); return ( -
-
-
-
+
+
+
+
); };