feat: tools注册顺序导致的viewportInfo找不到

This commit is contained in:
mozzie 2024-09-19 14:29:59 +08:00
parent ba516af2f7
commit d09d852207
3 changed files with 38 additions and 50 deletions

View File

@ -38,9 +38,9 @@ const themeTitleBarStyles = {
export const platform = process.platform === "darwin" ? "macos" : "windows"; export const platform = process.platform === "darwin" ? "macos" : "windows";
app.commandLine.appendSwitch('disable-web-security'); app.commandLine.appendSwitch("disable-web-security");
app.commandLine.appendSwitch('ignore-gpu-blocklist'); app.commandLine.appendSwitch("ignore-gpu-blocklist");
app.commandLine.appendSwitch('use-angle', 'gl'); app.commandLine.appendSwitch("use-angle", "gl");
// app.disableHardwareAcceleration() // app.disableHardwareAcceleration()
@ -55,7 +55,7 @@ function createWindow() {
titleBarOverlay: { height: 36, ...themeTitleBarStyles[theme] }, // 渲染进程发消息动态改变这个 titleBarOverlay: { height: 36, ...themeTitleBarStyles[theme] }, // 渲染进程发消息动态改变这个
webPreferences: { webPreferences: {
preload: path.join(__dirname, "preload.mjs"), preload: path.join(__dirname, "preload.mjs"),
nodeIntegration: true nodeIntegration: true,
}, },
}); });

View File

@ -18,8 +18,6 @@ export const initCornerstoneDICOMImageLoader = () => {
isMobile: false, isMobile: false,
enableCacheOptimization: false, enableCacheOptimization: false,
}); });
console.log("preferSizeOverAccuracy", preferSizeOverAccuracy);
console.log("useNorm16Texture", useNorm16Texture);
cornerstoneDICOMImageLoader.external.cornerstone = cornerstone; cornerstoneDICOMImageLoader.external.cornerstone = cornerstone;
cornerstoneDICOMImageLoader.external.dicomParser = dicomParser; cornerstoneDICOMImageLoader.external.dicomParser = dicomParser;

View File

@ -15,6 +15,7 @@ import {
Enums as CoreEnums, Enums as CoreEnums,
cache, cache,
} from "@cornerstonejs/core"; } from "@cornerstonejs/core";
import { import {
IStackViewport, IStackViewport,
PublicViewportInput, PublicViewportInput,
@ -31,7 +32,7 @@ import {
} from "./MprViewer/index.config"; } from "./MprViewer/index.config";
import setCtTransferFunctionForVolumeActor from "./MprViewer/CornerstoneDicomLoader/setCtTransferFunctionForVolumeActor"; import setCtTransferFunctionForVolumeActor from "./MprViewer/CornerstoneDicomLoader/setCtTransferFunctionForVolumeActor";
import { Slider } from "@/components/ui/slider"; import { Slider } from "@/components/ui/slider";
import { stackViewportId, toolGroupStackId } from "./StackViewer/index.config"; import { stackViewportId } from "./StackViewer/index.config";
import { ToolBarMenu } from "./ToolBarMenu"; import { ToolBarMenu } from "./ToolBarMenu";
import { Model3DViewer } from "./ModelViewer"; import { Model3DViewer } from "./ModelViewer";
@ -50,7 +51,6 @@ const wadoRsRoot = "http://localhost:8042/dicom-web";
const renderingEngineId = "renderEngineNo1"; const renderingEngineId = "renderEngineNo1";
const { ViewportType, OrientationAxis } = CoreEnums; const { ViewportType, OrientationAxis } = CoreEnums;
const wwwl = { windowCenter: 50, windowWidth: 850 };
export const Viewer = () => { export const Viewer = () => {
const volumeViewport1Ref = useRef<HTMLDivElement | null>(null); const volumeViewport1Ref = useRef<HTMLDivElement | null>(null);
@ -69,6 +69,7 @@ export const Viewer = () => {
const [imageIds, setImageIds] = useState<string[]>(); const [imageIds, setImageIds] = useState<string[]>();
const renderingEngineRef = useRef<RenderingEngine>(); const renderingEngineRef = useRef<RenderingEngine>();
const volumeId = SeriesInstanceUID; const volumeId = SeriesInstanceUID;
const toolGroupStackId = "STACK_TOOL_GROUP:" + SeriesInstanceUID;
useEffect(() => { useEffect(() => {
cornerstoneTools.addTool(StackScrollMouseWheelTool); cornerstoneTools.addTool(StackScrollMouseWheelTool);
@ -89,6 +90,7 @@ export const Viewer = () => {
SeriesInstanceUID, SeriesInstanceUID,
wadoRsRoot, wadoRsRoot,
}); });
// 这一步会对imageIds进行排序如果不排序imageIds会错误乱,stackViewport顺序会错误 // 这一步会对imageIds进行排序如果不排序imageIds会错误乱,stackViewport顺序会错误
const volume = await volumeLoader.createAndCacheVolume( const volume = await volumeLoader.createAndCacheVolume(
SeriesInstanceUID, SeriesInstanceUID,
@ -140,7 +142,6 @@ export const Viewer = () => {
...volumeViewportInput, ...volumeViewportInput,
stackViewportInput, stackViewportInput,
]); ]);
renderingEngineRef.current.enableElement(stackViewportInput);
const stackViewport = renderingEngineRef.current.getViewport( const stackViewport = renderingEngineRef.current.getViewport(
stackViewportId stackViewportId
) as IStackViewport; ) as IStackViewport;
@ -148,22 +149,6 @@ export const Viewer = () => {
stackViewport.setStack(volume.imageIds); stackViewport.setStack(volume.imageIds);
setImageIds(volume.imageIds); setImageIds(volume.imageIds);
await setVolumesForViewports(
renderingEngineRef.current,
[
{
volumeId: SeriesInstanceUID,
callback: ({ volumeActor }) =>
setCtTransferFunctionForVolumeActor({
volumeActor,
defaultWindowCenter: wwwl.windowCenter,
defaultWindowWidth: wwwl.windowWidth,
}),
},
],
[viewportId1, viewportId2, viewportId3]
);
const toolGroupMpr = ToolGroupManager.createToolGroup(toolGroupMprId); const toolGroupMpr = ToolGroupManager.createToolGroup(toolGroupMprId);
if (toolGroupMpr) { if (toolGroupMpr) {
toolGroupMpr.addViewport(viewportId1, renderingEngineId); toolGroupMpr.addViewport(viewportId1, renderingEngineId);
@ -204,6 +189,15 @@ export const Viewer = () => {
}); });
} }
/**
* toolGroupviewportInfo
*/
await setVolumesForViewports(
renderingEngineRef.current,
[{ volumeId: SeriesInstanceUID }],
[viewportId1, viewportId2, viewportId3]
);
// 默认windowWidtth // 默认windowWidtth
// const { windowCenter, windowWidth } = // const { windowCenter, windowWidth } =
// volumeRef.current.cornerstoneImageMetaData; // volumeRef.current.cornerstoneImageMetaData;
@ -214,34 +208,22 @@ export const Viewer = () => {
}); });
return () => { return () => {
renderingEngineRef.current?.disableElement(stackViewportId); // renderingEngineRef.current?.disableElement(stackViewportId);
renderingEngineRef.current?.disableElement(viewportId1); // renderingEngineRef.current?.disableElement(viewportId1);
renderingEngineRef.current?.disableElement(viewportId2); // renderingEngineRef.current?.disableElement(viewportId2);
renderingEngineRef.current?.disableElement(viewportId3); // renderingEngineRef.current?.disableElement(viewportId3);
cache.purgeCache();
ToolGroupManager.destroy();
renderingEngineRef.current?.destroy(); renderingEngineRef.current?.destroy();
ToolGroupManager.destroyToolGroup(toolGroupMprId);
ToolGroupManager.destroyToolGroup(toolGroupStackId);
cache.purgeCache();
console.log(cache.getVolume(volumeId!));
cornerstoneTools.removeTool(StackScrollMouseWheelTool); cornerstoneTools.removeTool(StackScrollMouseWheelTool);
1;
cornerstoneTools.removeTool(CrosshairsTool); cornerstoneTools.removeTool(CrosshairsTool);
cornerstoneTools.removeTool(WindowLevelTool); cornerstoneTools.removeTool(WindowLevelTool);
cornerstoneTools.removeTool(ZoomTool); cornerstoneTools.removeTool(ZoomTool);
}; };
}, [SeriesInstanceUID, StudyInstanceUID, volumeId]); }, [SeriesInstanceUID, StudyInstanceUID, toolGroupStackId, volumeId]);
const onChangeIndex = (value: number[]) => { const onChangeIndex = (value: number[]) => setIndex(value[0]);
setIndex(value[0]);
};
useEffect(
() => setIndex(imageIds ? Math.floor(imageIds.length / 2) : 0),
[imageIds]
);
/** /**
* *
@ -262,10 +244,12 @@ export const Viewer = () => {
}; };
}, [imageIds, index]); }, [imageIds, index]);
// stack换图
useEffect(() => { useEffect(() => {
if (renderingEngineRef.current) { const engine = renderingEngineRef.current;
const viewport = renderingEngineRef.current.getViewport(stackViewportId); if (engine) {
(viewport as IStackViewport)?.setImageIdIndex(index); const viewport = engine.getViewport(stackViewportId) as IStackViewport;
viewport?.setImageIdIndex(index);
} }
}, [index]); }, [index]);
@ -331,8 +315,14 @@ export const Viewer = () => {
</ResizablePanel> </ResizablePanel>
<ResizableHandle withHandle /> <ResizableHandle withHandle />
<ResizablePanel defaultSize={50}> <ResizablePanel defaultSize={50}>
<div className="w-full h-1/3 border-b border-1 border-secondary" ref={volumeViewport1Ref} /> <div
<div className="w-full h-1/3 border-b border-1 border-secondary" ref={volumeViewport2Ref} /> className="w-full h-1/3 border-b border-1 border-secondary"
ref={volumeViewport1Ref}
/>
<div
className="w-full h-1/3 border-b border-1 border-secondary"
ref={volumeViewport2Ref}
/>
<div className="w-full h-1/3" ref={volumeViewport3Ref} /> <div className="w-full h-1/3" ref={volumeViewport3Ref} />
</ResizablePanel> </ResizablePanel>
</ResizablePanelGroup> </ResizablePanelGroup>