fix(wsi): mount WSI/SM viewports via setDisplaySets (#6107)
This commit is contained in:
parent
cb6cdafd24
commit
38214f26de
@ -41,8 +41,8 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/runtime": "7.29.7",
|
"@babel/runtime": "7.29.7",
|
||||||
"@cornerstonejs/adapters": "5.0.2",
|
"@cornerstonejs/adapters": "5.1.3",
|
||||||
"@cornerstonejs/core": "5.0.2",
|
"@cornerstonejs/core": "5.1.3",
|
||||||
"@kitware/vtk.js": "35.5.3"
|
"@kitware/vtk.js": "35.5.3"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
|||||||
@ -41,8 +41,8 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/runtime": "7.29.7",
|
"@babel/runtime": "7.29.7",
|
||||||
"@cornerstonejs/adapters": "5.0.2",
|
"@cornerstonejs/adapters": "5.1.3",
|
||||||
"@cornerstonejs/core": "5.0.2",
|
"@cornerstonejs/core": "5.1.3",
|
||||||
"@kitware/vtk.js": "35.5.3"
|
"@kitware/vtk.js": "35.5.3"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
|||||||
@ -40,9 +40,9 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/runtime": "7.29.7",
|
"@babel/runtime": "7.29.7",
|
||||||
"@cornerstonejs/adapters": "5.0.2",
|
"@cornerstonejs/adapters": "5.1.3",
|
||||||
"@cornerstonejs/core": "5.0.2",
|
"@cornerstonejs/core": "5.1.3",
|
||||||
"@cornerstonejs/tools": "5.0.2",
|
"@cornerstonejs/tools": "5.1.3",
|
||||||
"classnames": "2.5.1"
|
"classnames": "2.5.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
|||||||
@ -45,8 +45,8 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/runtime": "7.29.7",
|
"@babel/runtime": "7.29.7",
|
||||||
"@cornerstonejs/core": "5.0.2",
|
"@cornerstonejs/core": "5.1.3",
|
||||||
"@cornerstonejs/tools": "5.0.2",
|
"@cornerstonejs/tools": "5.1.3",
|
||||||
"classnames": "2.5.1"
|
"classnames": "2.5.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
|||||||
@ -38,7 +38,7 @@
|
|||||||
"@cornerstonejs/codec-libjpeg-turbo-8bit": "1.2.2",
|
"@cornerstonejs/codec-libjpeg-turbo-8bit": "1.2.2",
|
||||||
"@cornerstonejs/codec-openjpeg": "1.3.0",
|
"@cornerstonejs/codec-openjpeg": "1.3.0",
|
||||||
"@cornerstonejs/codec-openjph": "2.4.7",
|
"@cornerstonejs/codec-openjph": "2.4.7",
|
||||||
"@cornerstonejs/dicom-image-loader": "5.0.2",
|
"@cornerstonejs/dicom-image-loader": "5.1.3",
|
||||||
"@ohif/core": "workspace:*",
|
"@ohif/core": "workspace:*",
|
||||||
"@ohif/extension-default": "workspace:*",
|
"@ohif/extension-default": "workspace:*",
|
||||||
"@ohif/ui": "workspace:*",
|
"@ohif/ui": "workspace:*",
|
||||||
@ -52,13 +52,13 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/runtime": "7.29.7",
|
"@babel/runtime": "7.29.7",
|
||||||
"@cornerstonejs/adapters": "5.0.2",
|
"@cornerstonejs/adapters": "5.1.3",
|
||||||
"@cornerstonejs/ai": "5.0.2",
|
"@cornerstonejs/ai": "5.1.3",
|
||||||
"@cornerstonejs/core": "5.0.2",
|
"@cornerstonejs/core": "5.1.3",
|
||||||
"@cornerstonejs/labelmap-interpolation": "5.0.2",
|
"@cornerstonejs/labelmap-interpolation": "5.1.3",
|
||||||
"@cornerstonejs/metadata": "5.0.2",
|
"@cornerstonejs/metadata": "5.1.3",
|
||||||
"@cornerstonejs/polymorphic-segmentation": "5.0.2",
|
"@cornerstonejs/polymorphic-segmentation": "5.1.3",
|
||||||
"@cornerstonejs/tools": "5.0.2",
|
"@cornerstonejs/tools": "5.1.3",
|
||||||
"@icr/polyseg-wasm": "0.4.0",
|
"@icr/polyseg-wasm": "0.4.0",
|
||||||
"@itk-wasm/morphological-contour-interpolation": "1.1.0",
|
"@itk-wasm/morphological-contour-interpolation": "1.1.0",
|
||||||
"@kitware/vtk.js": "35.5.3",
|
"@kitware/vtk.js": "35.5.3",
|
||||||
|
|||||||
@ -8,6 +8,7 @@ import {
|
|||||||
utilities as csUtils,
|
utilities as csUtils,
|
||||||
cache,
|
cache,
|
||||||
Enums as csEnums,
|
Enums as csEnums,
|
||||||
|
metaData,
|
||||||
} from '@cornerstonejs/core';
|
} from '@cornerstonejs/core';
|
||||||
|
|
||||||
import { utilities as csToolsUtils, Enums as csToolsEnums } from '@cornerstonejs/tools';
|
import { utilities as csToolsUtils, Enums as csToolsEnums } from '@cornerstonejs/tools';
|
||||||
@ -849,10 +850,21 @@ class CornerstoneViewportService extends PubSubService implements IViewportServi
|
|||||||
_presentations: Presentations = {}
|
_presentations: Presentations = {}
|
||||||
): Promise<void> {
|
): Promise<void> {
|
||||||
const [displaySet] = viewportData.data;
|
const [displaySet] = viewportData.data;
|
||||||
// CS3D's "redo viewports" replaced setDataIds with the generic
|
const displaySetId = displaySet.imageIds[0];
|
||||||
// setDisplaySets({ displaySetId }) API; the legacy adapters key off
|
// Register the WSI dataset so the viewport can resolve its imageIds +
|
||||||
// imageIds[0] as the displaySetId, so do the same here.
|
// webClient by display-set id, then mount via setDisplaySets. The webClient
|
||||||
await viewport.setDisplaySets({ displaySetId: displaySet.imageIds[0] });
|
// was registered under the WADO_WEB_CLIENT module (keyed by imageIds[0]) by
|
||||||
|
// the SM SOP class handler. CS3D's "redo viewports" reads this same registry
|
||||||
|
// (genericViewportDisplaySetMetadataProvider) from its WSI data provider;
|
||||||
|
// without this entry setDisplaySets throws "No registered WSI dataset" and
|
||||||
|
// the viewport renders gray.
|
||||||
|
const webClient = metaData.get(csEnums.MetadataModules.WADO_WEB_CLIENT, displaySetId);
|
||||||
|
csUtils.genericViewportDisplaySetMetadataProvider.add(displaySetId, {
|
||||||
|
imageIds: displaySet.imageIds,
|
||||||
|
kind: 'wsi',
|
||||||
|
options: { webClient },
|
||||||
|
});
|
||||||
|
await viewport.setDisplaySets({ displaySetId });
|
||||||
const viewReference = viewportInfo.getViewReference();
|
const viewReference = viewportInfo.getViewReference();
|
||||||
if (viewReference) {
|
if (viewReference) {
|
||||||
viewport.setViewReference(viewReference);
|
viewport.setViewReference(viewReference);
|
||||||
|
|||||||
@ -27,8 +27,8 @@
|
|||||||
"start": "pnpm run dev"
|
"start": "pnpm run dev"
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"@cornerstonejs/core": "5.0.2",
|
"@cornerstonejs/core": "5.1.3",
|
||||||
"@cornerstonejs/tools": "5.0.2",
|
"@cornerstonejs/tools": "5.1.3",
|
||||||
"@ohif/core": "workspace:*",
|
"@ohif/core": "workspace:*",
|
||||||
"@ohif/extension-cornerstone-dicom-sr": "workspace:*",
|
"@ohif/extension-cornerstone-dicom-sr": "workspace:*",
|
||||||
"@ohif/extension-default": "workspace:*",
|
"@ohif/extension-default": "workspace:*",
|
||||||
|
|||||||
@ -36,8 +36,8 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/runtime": "7.29.7",
|
"@babel/runtime": "7.29.7",
|
||||||
"@cornerstonejs/core": "5.0.2",
|
"@cornerstonejs/core": "5.1.3",
|
||||||
"@cornerstonejs/tools": "5.0.2",
|
"@cornerstonejs/tools": "5.1.3",
|
||||||
"@ohif/core": "workspace:*",
|
"@ohif/core": "workspace:*",
|
||||||
"@ohif/extension-cornerstone": "workspace:*",
|
"@ohif/extension-cornerstone": "workspace:*",
|
||||||
"@ohif/extension-default": "workspace:*",
|
"@ohif/extension-default": "workspace:*",
|
||||||
|
|||||||
@ -29,8 +29,8 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/runtime": "7.29.7",
|
"@babel/runtime": "7.29.7",
|
||||||
"@cornerstonejs/core": "5.0.2",
|
"@cornerstonejs/core": "5.1.3",
|
||||||
"@cornerstonejs/tools": "5.0.2",
|
"@cornerstonejs/tools": "5.1.3",
|
||||||
"@ohif/core": "workspace:*",
|
"@ohif/core": "workspace:*",
|
||||||
"@ohif/extension-cornerstone-dicom-sr": "workspace:*",
|
"@ohif/extension-cornerstone-dicom-sr": "workspace:*",
|
||||||
"@ohif/extension-ultrasound-pleura-bline": "workspace:*",
|
"@ohif/extension-ultrasound-pleura-bline": "workspace:*",
|
||||||
|
|||||||
@ -51,7 +51,7 @@
|
|||||||
"@cornerstonejs/codec-libjpeg-turbo-8bit": "1.2.2",
|
"@cornerstonejs/codec-libjpeg-turbo-8bit": "1.2.2",
|
||||||
"@cornerstonejs/codec-openjpeg": "1.3.0",
|
"@cornerstonejs/codec-openjpeg": "1.3.0",
|
||||||
"@cornerstonejs/codec-openjph": "2.4.7",
|
"@cornerstonejs/codec-openjph": "2.4.7",
|
||||||
"@cornerstonejs/dicom-image-loader": "5.0.2",
|
"@cornerstonejs/dicom-image-loader": "5.1.3",
|
||||||
"@emotion/serialize": "1.3.3",
|
"@emotion/serialize": "1.3.3",
|
||||||
"@ohif/core": "workspace:*",
|
"@ohif/core": "workspace:*",
|
||||||
"@ohif/i18n": "workspace:*",
|
"@ohif/i18n": "workspace:*",
|
||||||
|
|||||||
@ -35,9 +35,9 @@
|
|||||||
"@cornerstonejs/codec-libjpeg-turbo-8bit": "1.2.2",
|
"@cornerstonejs/codec-libjpeg-turbo-8bit": "1.2.2",
|
||||||
"@cornerstonejs/codec-openjpeg": "1.3.0",
|
"@cornerstonejs/codec-openjpeg": "1.3.0",
|
||||||
"@cornerstonejs/codec-openjph": "2.4.7",
|
"@cornerstonejs/codec-openjph": "2.4.7",
|
||||||
"@cornerstonejs/core": "5.0.2",
|
"@cornerstonejs/core": "5.1.3",
|
||||||
"@cornerstonejs/dicom-image-loader": "5.0.2",
|
"@cornerstonejs/dicom-image-loader": "5.1.3",
|
||||||
"@cornerstonejs/metadata": "5.0.2",
|
"@cornerstonejs/metadata": "5.1.3",
|
||||||
"@ohif/ui": "workspace:*",
|
"@ohif/ui": "workspace:*",
|
||||||
"cornerstone-math": "0.1.10",
|
"cornerstone-math": "0.1.10",
|
||||||
"dicom-parser": "1.8.21"
|
"dicom-parser": "1.8.21"
|
||||||
|
|||||||
1138
pnpm-lock.yaml
generated
1138
pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
23
tests/WSI.spec.ts
Normal file
23
tests/WSI.spec.ts
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
import { test, visitStudy, checkForScreenshot, screenShotPaths } from './utils';
|
||||||
|
|
||||||
|
// A DICOM VL Whole Slide Microscopy (SM) study. Opened in `viewer` mode it is
|
||||||
|
// routed to the cornerstone3D WHOLE_SLIDE viewport (mode-basic registers
|
||||||
|
// `ohif.wsiSopClassHandler`), which is the render path that previously
|
||||||
|
// regressed to a gray canvas. This screenshot comparison is a
|
||||||
|
// simple safeguard: if the WSI viewport fails to mount and renders gray again,
|
||||||
|
// the baseline no longer matches and the test fails.
|
||||||
|
test.beforeEach(async ({ page }) => {
|
||||||
|
const studyInstanceUID = '1.2.276.0.7230010.3.1.2.296485376.1.1665793212.499772';
|
||||||
|
const mode = 'viewer';
|
||||||
|
await visitStudy(page, studyInstanceUID, mode, 5000);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('should render the WSI viewport', async ({ page, viewportPageObject }) => {
|
||||||
|
// WSI tiles load progressively; checkForScreenshot's built-in retry loop
|
||||||
|
// gives the viewport time to paint before comparing against the baseline.
|
||||||
|
await checkForScreenshot({
|
||||||
|
page,
|
||||||
|
locator: viewportPageObject.grid,
|
||||||
|
screenshotPath: screenShotPaths.wsi.wsiDisplayedCorrectly,
|
||||||
|
});
|
||||||
|
});
|
||||||
BIN
tests/screenshots/chromium/WSI.spec.ts/wsiDisplayedCorrectly.png
Normal file
BIN
tests/screenshots/chromium/WSI.spec.ts/wsiDisplayedCorrectly.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 288 KiB |
@ -224,6 +224,9 @@ const screenShotPaths = {
|
|||||||
workList: {
|
workList: {
|
||||||
scrollBarRenderedProperly: 'scrollBarRenderedProperly.png',
|
scrollBarRenderedProperly: 'scrollBarRenderedProperly.png',
|
||||||
},
|
},
|
||||||
|
wsi: {
|
||||||
|
wsiDisplayedCorrectly: 'wsiDisplayedCorrectly.png',
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
export { screenShotPaths };
|
export { screenShotPaths };
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user