diff --git a/extensions/cornerstone-dicom-rt/src/utils/promptHydrateRT.ts b/extensions/cornerstone-dicom-rt/src/utils/promptHydrateRT.ts index 3894c12bd..972f62f25 100644 --- a/extensions/cornerstone-dicom-rt/src/utils/promptHydrateRT.ts +++ b/extensions/cornerstone-dicom-rt/src/utils/promptHydrateRT.ts @@ -46,11 +46,13 @@ function _askHydrate(uiViewportDialogService: AppTypes.UIViewportDialogService, const message = 'Do you want to open this Segmentation?'; const actions = [ { + id: 'no-hydrate', type: ButtonEnums.type.secondary, text: 'No', value: RESPONSE.CANCEL, }, { + id: 'yes-hydrate', type: ButtonEnums.type.primary, text: 'Yes', value: RESPONSE.HYDRATE_SEG, diff --git a/extensions/cornerstone-dicom-seg/src/utils/promptHydrateSEG.ts b/extensions/cornerstone-dicom-seg/src/utils/promptHydrateSEG.ts index ef5f738d9..d29a066b7 100644 --- a/extensions/cornerstone-dicom-seg/src/utils/promptHydrateSEG.ts +++ b/extensions/cornerstone-dicom-seg/src/utils/promptHydrateSEG.ts @@ -44,11 +44,13 @@ function _askHydrate(uiViewportDialogService, viewportId) { const message = 'Do you want to open this Segmentation?'; const actions = [ { + id: 'no-hydrate', type: ButtonEnums.type.secondary, text: 'No', value: RESPONSE.CANCEL, }, { + id: 'yes-hydrate', type: ButtonEnums.type.primary, text: 'Yes', value: RESPONSE.HYDRATE_SEG, diff --git a/extensions/cornerstone/src/hps/frameView.ts b/extensions/cornerstone/src/hps/frameView.ts index de93fc602..cf80aa2a1 100644 --- a/extensions/cornerstone/src/hps/frameView.ts +++ b/extensions/cornerstone/src/hps/frameView.ts @@ -7,6 +7,7 @@ const frameView: Types.HangingProtocol.Protocol = { icon: 'tool-stack-scroll', isPreset: true, toolGroupIds: ['default'], + protocolMatchingRules: [], displaySetSelectors: { defaultDisplaySetId: { seriesMatchingRules: [ diff --git a/extensions/cornerstone/src/services/SegmentationService/SegmentationService.ts b/extensions/cornerstone/src/services/SegmentationService/SegmentationService.ts index d0e8b1752..af98398ff 100644 --- a/extensions/cornerstone/src/services/SegmentationService/SegmentationService.ts +++ b/extensions/cornerstone/src/services/SegmentationService/SegmentationService.ts @@ -7,6 +7,7 @@ import { getEnabledElementByIds, utilities as csUtils, volumeLoader, + StackViewport, } from '@cornerstonejs/core'; import { Enums as csToolsEnums, @@ -770,8 +771,8 @@ class SegmentationService extends PubSubService { const segmentIndices = segmentIndex ? [segmentIndex] : segmentation.segments - .filter(segment => segment?.segmentIndex) - .map(segment => segment.segmentIndex); + .filter(segment => segment?.segmentIndex) + .map(segment => segment.segmentIndex); const segmentIndicesSet = new Set(segmentIndices); @@ -884,7 +885,13 @@ class SegmentationService extends PubSubService { // @ts-ignore for (const { viewportId, renderingEngineId } of viewportsInfo) { const { viewport } = getEnabledElementByIds(viewportId, renderingEngineId); - cstUtils.viewport.jumpToWorld(viewport, world); + if (viewport instanceof StackViewport) { + const { element } = viewport; + const index = csUtils.getClosestStackImageIndexForPoint(world, viewport) + cstUtils.viewport.jumpToSlice(element, { imageIndex: index }) + } else { + cstUtils.viewport.jumpToWorld(viewport, world); + } } if (highlightSegment) { @@ -1250,6 +1257,7 @@ class SegmentationService extends PubSubService { { [segmentIndex]: { CONTOUR: { + outlineOpacity: reversedProgress, fillAlpha: reversedProgress, }, }, diff --git a/extensions/measurement-tracking/src/contexts/TrackedMeasurementsContext/promptHydrateStructuredReport.js b/extensions/measurement-tracking/src/contexts/TrackedMeasurementsContext/promptHydrateStructuredReport.js index c12135a4d..2f2697016 100644 --- a/extensions/measurement-tracking/src/contexts/TrackedMeasurementsContext/promptHydrateStructuredReport.js +++ b/extensions/measurement-tracking/src/contexts/TrackedMeasurementsContext/promptHydrateStructuredReport.js @@ -50,11 +50,13 @@ function _askTrackMeasurements(uiViewportDialogService, viewportId) { const message = 'Do you want to continue tracking measurements for this study?'; const actions = [ { + id: 'no-hydrate', type: ButtonEnums.type.secondary, text: 'No', value: RESPONSE.CANCEL, }, { + id: 'yes-hydrate', type: ButtonEnums.type.primary, text: 'Yes', value: RESPONSE.HYDRATE_REPORT, diff --git a/tests/RTHydration.spec.ts b/tests/RTHydration.spec.ts new file mode 100644 index 000000000..b3638e28d --- /dev/null +++ b/tests/RTHydration.spec.ts @@ -0,0 +1,18 @@ +import { test } from '@playwright/test'; +import { visitStudy, checkForScreenshot, screenShotPaths } from './utils'; + +test.beforeEach(async ({ page }) => { + const studyInstanceUID = '1.2.840.113619.2.290.3.3767434740.226.1600859119.501'; + const mode = 'Basic Viewer'; + await visitStudy(page, studyInstanceUID, mode, 2000); +}); + +test('should hydrate RT reports correctly', async ({ page }) => { + await page.getByTestId('side-panel-header-right').click(); + await page.getByTestId('study-browser-thumbnail-no-image').dblclick(); + await checkForScreenshot(page, page, screenShotPaths.rtHydration.rtPreHydration); + await page.getByTestId('yes-hydrate-btn').click(); + await checkForScreenshot(page, page, screenShotPaths.rtHydration.rtPostHydration); + await page.getByText('Small Sphere').click(); + await checkForScreenshot(page, page, screenShotPaths.rtHydration.rtJumpToStructure); +}); diff --git a/tests/SEGHydration.spec.ts b/tests/SEGHydration.spec.ts new file mode 100644 index 000000000..2077d99fc --- /dev/null +++ b/tests/SEGHydration.spec.ts @@ -0,0 +1,18 @@ +import { test } from '@playwright/test'; +import { visitStudy, checkForScreenshot, screenShotPaths } from './utils'; + +test.beforeEach(async ({ page }) => { + const studyInstanceUID = '1.3.6.1.4.1.14519.5.2.1.256467663913010332776401703474716742458'; + const mode = 'Basic Viewer'; + await visitStudy(page, studyInstanceUID, mode, 2000); +}); + +test('should hydrate SEG reports correctly', async ({ page }) => { + await page.getByTestId('side-panel-header-right').click(); + await page.getByTestId('study-browser-thumbnail-no-image').dblclick(); + await checkForScreenshot(page, page, screenShotPaths.segHydration.segPreHydration); + await page.getByTestId('yes-hydrate-btn').click(); + await checkForScreenshot(page, page, screenShotPaths.segHydration.segPostHydration); + await page.getByText('Esophagus').click(); + await checkForScreenshot(page, page, screenShotPaths.segHydration.segJumpToSegment); +}); diff --git a/tests/SRHydration.spec.ts b/tests/SRHydration.spec.ts new file mode 100644 index 000000000..844f1908d --- /dev/null +++ b/tests/SRHydration.spec.ts @@ -0,0 +1,19 @@ +import { test } from '@playwright/test'; +import { visitStudy, checkForScreenshot, screenShotPaths } from './utils'; + +test.beforeEach(async ({ page }) => { + const studyInstanceUID = '1.3.6.1.4.1.14519.5.2.1.7695.4007.324475281161490036195179843543'; + const mode = 'Basic Viewer'; + await visitStudy(page, studyInstanceUID, mode, 2000); +}); + +test('should hydrate SR reports correctly', async ({ page }) => { + await page.getByTestId('side-panel-header-right').click(); + await page.getByTestId('trackedMeasurements-btn').click(); + await page.getByTestId('study-browser-thumbnail-no-image').dblclick(); + await checkForScreenshot(page, page, screenShotPaths.srHydration.srPreHydration); + await page.getByTestId('yes-hydrate-btn').click(); + await checkForScreenshot(page, page, screenShotPaths.srHydration.srPostHydration); + await page.getByTestId('measurement-item').first().click(); + await checkForScreenshot(page, page, screenShotPaths.srHydration.srJumpToMeasurement); +}); diff --git a/tests/screenshots/chromium/RTHydration.spec.ts/rtJumpToStructure.png b/tests/screenshots/chromium/RTHydration.spec.ts/rtJumpToStructure.png new file mode 100644 index 000000000..6b2feb1df Binary files /dev/null and b/tests/screenshots/chromium/RTHydration.spec.ts/rtJumpToStructure.png differ diff --git a/tests/screenshots/chromium/RTHydration.spec.ts/rtPostHydration.png b/tests/screenshots/chromium/RTHydration.spec.ts/rtPostHydration.png new file mode 100644 index 000000000..df604fa89 Binary files /dev/null and b/tests/screenshots/chromium/RTHydration.spec.ts/rtPostHydration.png differ diff --git a/tests/screenshots/chromium/RTHydration.spec.ts/rtPreHydration.png b/tests/screenshots/chromium/RTHydration.spec.ts/rtPreHydration.png new file mode 100644 index 000000000..cf72ffed1 Binary files /dev/null and b/tests/screenshots/chromium/RTHydration.spec.ts/rtPreHydration.png differ diff --git a/tests/screenshots/chromium/SEGHydration.spec.ts/segJumpToSegment.png b/tests/screenshots/chromium/SEGHydration.spec.ts/segJumpToSegment.png new file mode 100644 index 000000000..fce62577a Binary files /dev/null and b/tests/screenshots/chromium/SEGHydration.spec.ts/segJumpToSegment.png differ diff --git a/tests/screenshots/chromium/SEGHydration.spec.ts/segPostHydration.png b/tests/screenshots/chromium/SEGHydration.spec.ts/segPostHydration.png new file mode 100644 index 000000000..f15ce0f2c Binary files /dev/null and b/tests/screenshots/chromium/SEGHydration.spec.ts/segPostHydration.png differ diff --git a/tests/screenshots/chromium/SEGHydration.spec.ts/segPreHydration.png b/tests/screenshots/chromium/SEGHydration.spec.ts/segPreHydration.png new file mode 100644 index 000000000..5a0aa6802 Binary files /dev/null and b/tests/screenshots/chromium/SEGHydration.spec.ts/segPreHydration.png differ diff --git a/tests/screenshots/chromium/SRHydration.spec.ts/srJumpToMeasurement.png b/tests/screenshots/chromium/SRHydration.spec.ts/srJumpToMeasurement.png new file mode 100644 index 000000000..df610f255 Binary files /dev/null and b/tests/screenshots/chromium/SRHydration.spec.ts/srJumpToMeasurement.png differ diff --git a/tests/screenshots/chromium/SRHydration.spec.ts/srPostHydration.png b/tests/screenshots/chromium/SRHydration.spec.ts/srPostHydration.png new file mode 100644 index 000000000..b3533f96e Binary files /dev/null and b/tests/screenshots/chromium/SRHydration.spec.ts/srPostHydration.png differ diff --git a/tests/screenshots/chromium/SRHydration.spec.ts/srPreHydration.png b/tests/screenshots/chromium/SRHydration.spec.ts/srPreHydration.png new file mode 100644 index 000000000..37cbb6d45 Binary files /dev/null and b/tests/screenshots/chromium/SRHydration.spec.ts/srPreHydration.png differ diff --git a/tests/utils/screenShotPaths.ts b/tests/utils/screenShotPaths.ts index 64017e2d7..d759d9ada 100644 --- a/tests/utils/screenShotPaths.ts +++ b/tests/utils/screenShotPaths.ts @@ -65,6 +65,21 @@ const screenShotPaths = { reset: { resetDisplayedCorrectly: 'resetDisplayedCorrectly.png', }, + srHydration: { + srPostHydration: 'srPostHydration.png', + srPreHydration: 'srPreHydration.png', + srJumpToMeasurement: 'srJumpToMeasurement.png', + }, + segHydration: { + segPostHydration: 'segPostHydration.png', + segPreHydration: 'segPreHydration.png', + segJumpToSegment: 'segJumpToSegment.png', + }, + rtHydration: { + rtPostHydration: 'rtPostHydration.png', + rtPreHydration: 'rtPreHydration.png', + rtJumpToStructure: 'rtJumpToStructure.png', + } }; export { screenShotPaths };