diff --git a/extensions/cornerstone-dicom-seg/src/getSopClassHandlerModule.ts b/extensions/cornerstone-dicom-seg/src/getSopClassHandlerModule.ts index 88cd7a166b6..9be25cece96 100644 --- a/extensions/cornerstone-dicom-seg/src/getSopClassHandlerModule.ts +++ b/extensions/cornerstone-dicom-seg/src/getSopClassHandlerModule.ts @@ -3,6 +3,7 @@ import i18n from '@ohif/i18n'; import { metaData, eventTarget, utilities as csUtils } from '@cornerstonejs/core'; import { CONSTANTS, segmentation as cstSegmentation } from '@cornerstonejs/tools'; import { adaptersSEG, Enums } from '@cornerstonejs/adapters'; +import { dicomLoaderService } from '@ohif/extension-cornerstone'; import { SOPClassHandlerId } from './id'; import { dicomlabToRGB } from './utils/dicomlabToRGB'; @@ -404,7 +405,8 @@ async function _loadSegments({ extensionManager, servicesManager, segDisplaySet, -}: withAppTypes<{ segDisplaySet: AppTypes.DisplaySet }>) { + headers, +}: withAppTypes<{ segDisplaySet: AppTypes.DisplaySet; headers?: Record }>) { const { segmentationService, uiNotificationService, customizationService } = servicesManager.services; const instance = segDisplaySet.instance as Record; @@ -495,37 +497,81 @@ async function _loadSegments({ ) as boolean | undefined) ?? true; + /** + * Check if the metadata has PerFrameFunctionalGroupsSequence. + * Some DICOMweb servers (like IDC's static WADO) omit this sequence from JSON metadata + * for large SEGs to save space. When missing, we need to fetch the full DICOM file + * and use the buffer-based loader which parses the complete metadata from the file. + */ + const hasPerFrameFunctionalGroups = + Array.isArray(instance.PerFrameFunctionalGroupsSequence) && + instance.PerFrameFunctionalGroupsSequence.length > 0; + + let results; let prefetch; - if (loadMultiframeAsPart10) { - prefetch = dataSource.retrieve?.prefetchInstanceFrames?.({ - instance, - imageId: segImageIdForMetadata, - }); - if (prefetch?.done) { - await prefetch.done; + if (!hasPerFrameFunctionalGroups) { + /** + * Fallback: PerFrameFunctionalGroupsSequence is missing from metadata. + * Fetch the full DICOM file and use createFromDICOMSegBuffer which parses + * the complete metadata directly from the DICOM binary. + * This was the loading method used in OHIF 3.12 and earlier. + */ + log.info( + SEG_LOAD_LOG_PREFIX, + 'PerFrameFunctionalGroupsSequence missing from metadata, using buffer-based loader' + ); + + try { + const arrayBuffer = await dicomLoaderService.findDicomDataPromise( + segDisplaySet, + null, + headers + ); + + results = await adaptersSEG.Cornerstone3D.Segmentation.createFromDICOMSegBuffer( + imageIds, + arrayBuffer, + { metadataProvider: metaData, tolerance } + ); + } finally { + eventTarget.removeEventListener(Enums.Events.SEGMENTATION_LOAD_PROGRESS, onProgress); } - } + } else { + /** + * Normal path: PerFrameFunctionalGroupsSequence is present in metadata. + * Use the imageId-based loader which is more efficient for large SEGs. + */ + if (loadMultiframeAsPart10) { + prefetch = dataSource.retrieve?.prefetchInstanceFrames?.({ + instance, + imageId: segImageIdForMetadata, + }); - let results; - try { - results = await adaptersSEG.Cornerstone3D.Segmentation.createFromDicomSegImageId( - imageIds, - segImageIdForMetadata, - { - metadataProvider: metaData, - tolerance, - parserType: getSegmentationParserType( - segDisplaySet.SOPClassUID, - customizationService - ), - frameImageIds, - concurrency: SEG_FRAME_DECODE_CONCURRENCY, + if (prefetch?.done) { + await prefetch.done; } - ); - } finally { - eventTarget.removeEventListener(Enums.Events.SEGMENTATION_LOAD_PROGRESS, onProgress); - prefetch?.cancel?.(); + } + + try { + results = await adaptersSEG.Cornerstone3D.Segmentation.createFromDicomSegImageId( + imageIds, + segImageIdForMetadata, + { + metadataProvider: metaData, + tolerance, + parserType: getSegmentationParserType( + segDisplaySet.SOPClassUID, + customizationService + ), + frameImageIds, + concurrency: SEG_FRAME_DECODE_CONCURRENCY, + } + ); + } finally { + eventTarget.removeEventListener(Enums.Events.SEGMENTATION_LOAD_PROGRESS, onProgress); + prefetch?.cancel?.(); + } } let usedRecommendedDisplayCIELabValue = true; diff --git a/patches/@cornerstonejs__adapters.patch b/patches/@cornerstonejs__adapters.patch index d950ae88ff4..412dbd36218 100644 --- a/patches/@cornerstonejs__adapters.patch +++ b/patches/@cornerstonejs__adapters.patch @@ -1,87 +1,31 @@ -diff --git a/dist/esm/adapters/Cornerstone3D/Segmentation/labelmapImagesFromBuffer.js b/dist/esm/adapters/Cornerstone3D/Segmentation/labelmapImagesFromBuffer.js -index db4972221ea40cd1eaad450e9a6334c8eef4ef72..120316e2ac6929810b1da4b5cc4cfb083f0f8ce0 100644 ---- a/dist/esm/adapters/Cornerstone3D/Segmentation/labelmapImagesFromBuffer.js -+++ b/dist/esm/adapters/Cornerstone3D/Segmentation/labelmapImagesFromBuffer.js -@@ -552,10 +552,11 @@ function insertPixelDataPlanar(_ref0) { - PerFrameFunctionalGroupsSequence = multiframe.PerFrameFunctionalGroupsSequence, - Rows = multiframe.Rows, - Columns = multiframe.Columns; -- const sharedImageOrientationPatient = SharedFunctionalGroupsSequence.PlaneOrientationSequence ? SharedFunctionalGroupsSequence.PlaneOrientationSequence.ImageOrientationPatient : undefined; -+ const sharedImageOrientationPatient = SharedFunctionalGroupsSequence?.PlaneOrientationSequence ? SharedFunctionalGroupsSequence.PlaneOrientationSequence.ImageOrientationPatient : undefined; - const sliceLength = Columns * Rows; -- const metadataFrameCount = Number(multiframe.NumberOfFrames) || PerFrameFunctionalGroupsSequence.length; -- const groupsLenFromMetadata = PerFrameFunctionalGroupsSequence.length || metadataFrameCount; -+ const perFrameLength = PerFrameFunctionalGroupsSequence?.length || 0; -+ const metadataFrameCount = Number(multiframe.NumberOfFrames) || perFrameLength; -+ const groupsLenFromMetadata = perFrameLength || metadataFrameCount; - const groupsLen = typeof decodedFrameCount === 'number' ? Math.min(groupsLenFromMetadata, decodedFrameCount) : groupsLenFromMetadata; - let overlapping = false; - return new Promise(resolve => { -@@ -564,7 +565,7 @@ function insertPixelDataPlanar(_ref0) { - const processChunk = firstIndex => { - for (let i = firstIndex; i < firstIndex + imagesPerChunk && i < groupsLen; i++) { - var _PerFrameFunctionalGr; -- const PerFrameFunctionalGroups = PerFrameFunctionalGroupsSequence[i]; -+ const PerFrameFunctionalGroups = PerFrameFunctionalGroupsSequence?.[i]; - const ImageOrientationPatientI = sharedImageOrientationPatient || (PerFrameFunctionalGroups === null || PerFrameFunctionalGroups === void 0 || (_PerFrameFunctionalGr = PerFrameFunctionalGroups.PlaneOrientationSequence) === null || _PerFrameFunctionalGr === void 0 ? void 0 : _PerFrameFunctionalGr.ImageOrientationPatient); - if (!ImageOrientationPatientI) { - throw new Error("SEG frame ".concat(i + 1, " is missing ImageOrientationPatient in per-frame and shared functional groups.")); -@@ -817,7 +818,7 @@ function insertOverlappingPixelDataPlanar(_ref12) { - PerFrameFunctionalGroupsSequence = multiframe.PerFrameFunctionalGroupsSequence, - Rows = multiframe.Rows, - Columns = multiframe.Columns; -- const sharedImageOrientationPatient = SharedFunctionalGroupsSequence.PlaneOrientationSequence ? SharedFunctionalGroupsSequence.PlaneOrientationSequence.ImageOrientationPatient : undefined; -+ const sharedImageOrientationPatient = SharedFunctionalGroupsSequence?.PlaneOrientationSequence ? SharedFunctionalGroupsSequence.PlaneOrientationSequence.ImageOrientationPatient : undefined; - const sliceLength = Columns * Rows; - const arrayOfSegmentData = getArrayOfSegmentData({ - sliceLength, -@@ -910,7 +911,7 @@ const getSegmentData = _ref14 => { - for (let currentLabelMapImageIndex = 0; currentLabelMapImageIndex < labelMapImages.length; currentLabelMapImageIndex++) { - const currentLabelMapImage = labelMapImages[currentLabelMapImageIndex]; - const referencedImageId = currentLabelMapImage.referencedImageId; -- const PerFrameFunctionalGroupsIndex = PerFrameFunctionalGroupsSequence.findIndex((PerFrameFunctionalGroups, currentSequenceIndex) => { -+ const PerFrameFunctionalGroupsIndex = PerFrameFunctionalGroupsSequence?.findIndex((PerFrameFunctionalGroups, currentSequenceIndex) => { - const _extractInfoFromPerFr = extractInfoFromPerFrameFunctionalGroups({ - PerFrameFunctionalGroups, - sequenceIndex: currentSequenceIndex, -@@ -922,10 +923,10 @@ const getSegmentData = _ref14 => { - const isCorrectPerFrameFunctionalGroup = groupsSegmentIndex === segmentIndex && groupsReferenceImageId === currentLabelMapImage.referencedImageId; - return isCorrectPerFrameFunctionalGroup; - }); -- if (PerFrameFunctionalGroupsIndex === -1) { -+ if (PerFrameFunctionalGroupsIndex === -1 || PerFrameFunctionalGroupsIndex === undefined) { - continue; - } -- const PerFrameFunctionalGroups = PerFrameFunctionalGroupsSequence[PerFrameFunctionalGroupsIndex]; -+ const PerFrameFunctionalGroups = PerFrameFunctionalGroupsSequence?.[PerFrameFunctionalGroupsIndex]; - const alignedPixelDataI = getAlignedPixelData({ - sharedImageOrientationPatient, - PerFrameFunctionalGroups, -diff --git a/dist/esm/adapters/helpers/checkOrientation.js b/dist/esm/adapters/helpers/checkOrientation.js -index f147ce19972dfe2f30ed820509943bb2ab2f34d0..47868b5ae063ee61e4061aa46ef5ccf49692fb34 100644 ---- a/dist/esm/adapters/helpers/checkOrientation.js -+++ b/dist/esm/adapters/helpers/checkOrientation.js -@@ -4,9 +4,20 @@ import { utilities } from '@cornerstonejs/core'; - function checkOrientation(multiframe, validOrientations, sourceDataDimensions, tolerance) { - const SharedFunctionalGroupsSequence = multiframe.SharedFunctionalGroupsSequence, - PerFrameFunctionalGroupsSequence = multiframe.PerFrameFunctionalGroupsSequence; -- const sharedImageOrientationPatient = SharedFunctionalGroupsSequence.PlaneOrientationSequence ? SharedFunctionalGroupsSequence.PlaneOrientationSequence.ImageOrientationPatient : undefined; -- const PerFrameFunctionalGroups = PerFrameFunctionalGroupsSequence[0]; -- const iopRaw = sharedImageOrientationPatient || PerFrameFunctionalGroups.PlaneOrientationSequence.ImageOrientationPatient; -+ const sharedImageOrientationPatient = SharedFunctionalGroupsSequence?.PlaneOrientationSequence ? SharedFunctionalGroupsSequence.PlaneOrientationSequence.ImageOrientationPatient : undefined; -+ -+ /** Get orientation from per-frame if shared doesn't have it and per-frame exists */ -+ let iopRaw = sharedImageOrientationPatient; -+ if (!iopRaw && PerFrameFunctionalGroupsSequence && PerFrameFunctionalGroupsSequence.length > 0) { -+ const PerFrameFunctionalGroups = PerFrameFunctionalGroupsSequence[0]; -+ iopRaw = PerFrameFunctionalGroups?.PlaneOrientationSequence?.ImageOrientationPatient; -+ } -+ -+ if (!iopRaw) { -+ /** No orientation found, default to Planar to avoid throwing */ -+ return 'Planar'; -+ } -+ - const iop = Array.isArray(iopRaw) ? iopRaw.map(Number) : iopRaw; - const inPlane = validOrientations.some(operation => utilities.isEqual(iop, operation, tolerance)); - if (inPlane) { +diff --git a/dist/esm/adapters/Cornerstone/Segmentation_4X.js b/dist/esm/adapters/Cornerstone/Segmentation_4X.js +index f40a914216e4d403fb6f49a880a1329482b5219f..62bec9ef69359bab5f9bf8a18f9ff6803efb7553 100644 +--- a/dist/esm/adapters/Cornerstone/Segmentation_4X.js ++++ b/dist/esm/adapters/Cornerstone/Segmentation_4X.js +@@ -1169,12 +1169,20 @@ function alignPixelDataWithSourceData(pixelData2D, iop, orientations, tolerance) + } + function getSegmentMetadata(multiframe, seriesInstanceUid) { + const segmentSequence = multiframe.SegmentSequence; +- let data = []; +- if (Array.isArray(segmentSequence)) { +- data = [undefined, ...segmentSequence]; +- } else { +- // Only one segment, will be stored as an object. +- data = [undefined, segmentSequence]; ++ const data = []; ++ /** ++ * Index segments by their SegmentNumber rather than array position. ++ * This is required for LABELMAP segmentations where SegmentNumber may ++ * start at 0 (for background) or have gaps. The DICOM standard only ++ * requires SegmentNumber >= 1 for BINARY/FRACTIONAL types, but LABELMAP ++ * allows more flexibility (see DICOM Part 3, Section C.8.20.2.4). ++ * Backported from: https://github.com/cornerstonejs/cornerstone3D/pull/2882 ++ */ ++ const segments = Array.isArray(segmentSequence) ? segmentSequence : [segmentSequence]; ++ for (const segment of segments) { ++ if (segment?.SegmentNumber >= 0) { ++ data[segment.SegmentNumber] = segment; ++ } + } + return { + seriesInstanceUid, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1e24bf79f7f..e49517a1382 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -246,7 +246,7 @@ overrides: image-size@>=0.6.3 <2.0.4: 2.0.4 patchedDependencies: - '@cornerstonejs/adapters': 9ec6f243febe5c8358a1aaae2127e0e59d71548573a110eb33be51cf7dbc9a9c + '@cornerstonejs/adapters': 9e687c8dbaf5e5785cca8152b3fb78916d9a93efdc686876ab60e230df56c348 '@cornerstonejs/core': a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5 importers: @@ -407,7 +407,7 @@ importers: version: 7.29.7 '@cornerstonejs/adapters': specifier: 5.6.8 - version: 5.6.8(patch_hash=9ec6f243febe5c8358a1aaae2127e0e59d71548573a110eb33be51cf7dbc9a9c)(@cornerstonejs/core@5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@cornerstonejs/tools@5.6.8(@cornerstonejs/core@5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@kitware/vtk.js@36.4.1(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@types/d3-array@3.2.1)(@types/d3-interpolate@3.0.4)(d3-array@3.2.4)(d3-interpolate@3.0.1)(gl-matrix@3.4.3)) + version: 5.6.8(patch_hash=9e687c8dbaf5e5785cca8152b3fb78916d9a93efdc686876ab60e230df56c348)(@cornerstonejs/core@5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@cornerstonejs/tools@5.6.8(@cornerstonejs/core@5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@kitware/vtk.js@36.4.1(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@types/d3-array@3.2.1)(@types/d3-interpolate@3.0.4)(d3-array@3.2.4)(d3-interpolate@3.0.1)(gl-matrix@3.4.3)) '@cornerstonejs/ai': specifier: 5.6.8 version: 5.6.8(@cornerstonejs/core@5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@cornerstonejs/tools@5.6.8(@cornerstonejs/core@5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@kitware/vtk.js@36.4.1(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@types/d3-array@3.2.1)(@types/d3-interpolate@3.0.4)(d3-array@3.2.4)(d3-interpolate@3.0.1)(gl-matrix@3.4.3)) @@ -516,7 +516,7 @@ importers: version: 7.29.7 '@cornerstonejs/adapters': specifier: 5.6.8 - version: 5.6.8(patch_hash=9ec6f243febe5c8358a1aaae2127e0e59d71548573a110eb33be51cf7dbc9a9c)(@cornerstonejs/core@5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@cornerstonejs/tools@5.6.8(@cornerstonejs/core@5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@kitware/vtk.js@36.4.1(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@types/d3-array@3.2.1)(@types/d3-interpolate@3.0.4)(d3-array@3.2.4)(d3-interpolate@3.0.1)(gl-matrix@3.4.3)) + version: 5.6.8(patch_hash=9e687c8dbaf5e5785cca8152b3fb78916d9a93efdc686876ab60e230df56c348)(@cornerstonejs/core@5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@cornerstonejs/tools@5.6.8(@cornerstonejs/core@5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@kitware/vtk.js@36.4.1(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@types/d3-array@3.2.1)(@types/d3-interpolate@3.0.4)(d3-array@3.2.4)(d3-interpolate@3.0.1)(gl-matrix@3.4.3)) '@cornerstonejs/core': specifier: 5.6.8 version: 5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0) @@ -605,7 +605,7 @@ importers: version: 7.29.7 '@cornerstonejs/adapters': specifier: 5.6.8 - version: 5.6.8(patch_hash=9ec6f243febe5c8358a1aaae2127e0e59d71548573a110eb33be51cf7dbc9a9c)(@cornerstonejs/core@5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@cornerstonejs/tools@5.6.8(@cornerstonejs/core@5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@kitware/vtk.js@36.4.1(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@types/d3-array@3.2.1)(@types/d3-interpolate@3.0.4)(d3-array@3.2.4)(d3-interpolate@3.0.1)(gl-matrix@3.4.3)) + version: 5.6.8(patch_hash=9e687c8dbaf5e5785cca8152b3fb78916d9a93efdc686876ab60e230df56c348)(@cornerstonejs/core@5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@cornerstonejs/tools@5.6.8(@cornerstonejs/core@5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@kitware/vtk.js@36.4.1(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@types/d3-array@3.2.1)(@types/d3-interpolate@3.0.4)(d3-array@3.2.4)(d3-interpolate@3.0.1)(gl-matrix@3.4.3)) '@cornerstonejs/core': specifier: 5.6.8 version: 5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0) @@ -654,7 +654,7 @@ importers: version: 7.29.7 '@cornerstonejs/adapters': specifier: 5.6.8 - version: 5.6.8(patch_hash=9ec6f243febe5c8358a1aaae2127e0e59d71548573a110eb33be51cf7dbc9a9c)(@cornerstonejs/core@5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@cornerstonejs/tools@5.6.8(@cornerstonejs/core@5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@kitware/vtk.js@36.4.1(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@types/d3-array@3.2.1)(@types/d3-interpolate@3.0.4)(d3-array@3.2.4)(d3-interpolate@3.0.1)(gl-matrix@3.4.3)) + version: 5.6.8(patch_hash=9e687c8dbaf5e5785cca8152b3fb78916d9a93efdc686876ab60e230df56c348)(@cornerstonejs/core@5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@cornerstonejs/tools@5.6.8(@cornerstonejs/core@5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@kitware/vtk.js@36.4.1(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@types/d3-array@3.2.1)(@types/d3-interpolate@3.0.4)(d3-array@3.2.4)(d3-interpolate@3.0.1)(gl-matrix@3.4.3)) '@cornerstonejs/core': specifier: 5.6.8 version: 5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0) @@ -14739,7 +14739,7 @@ snapshots: '@colors/colors@1.5.0': optional: true - '@cornerstonejs/adapters@5.6.8(patch_hash=9ec6f243febe5c8358a1aaae2127e0e59d71548573a110eb33be51cf7dbc9a9c)(@cornerstonejs/core@5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@cornerstonejs/tools@5.6.8(@cornerstonejs/core@5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@kitware/vtk.js@36.4.1(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@types/d3-array@3.2.1)(@types/d3-interpolate@3.0.4)(d3-array@3.2.4)(d3-interpolate@3.0.1)(gl-matrix@3.4.3))': + '@cornerstonejs/adapters@5.6.8(patch_hash=9e687c8dbaf5e5785cca8152b3fb78916d9a93efdc686876ab60e230df56c348)(@cornerstonejs/core@5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@cornerstonejs/tools@5.6.8(@cornerstonejs/core@5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@kitware/vtk.js@36.4.1(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0))(@types/d3-array@3.2.1)(@types/d3-interpolate@3.0.4)(d3-array@3.2.4)(d3-interpolate@3.0.1)(gl-matrix@3.4.3))': dependencies: '@babel/runtime-corejs2': 7.26.10 '@cornerstonejs/core': 5.6.8(patch_hash=a80dc1a8df5e9e7fbfe0ad7ab6eff21acfca717ebb4cbb8a751cd61d51ab4da5)(@cornerstonejs/metadata@5.6.8)(@cornerstonejs/utils@5.6.8)(autoprefixer@10.6.1(postcss@8.5.26))(wslink@2.5.0) diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 3ed3e143501..8409168c3ac 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -3,8 +3,6 @@ packages: - extensions/* - modes/* -# IDC patches for Cornerstone3D packages are configured at end of file (patchedDependencies) -# - @cornerstonejs/core: Fix VOI LUT function validation (toLowHighRange throws for unknown values) # Mirror the cornerstone3D pnpm setup (libs/@cornerstonejs) which is known-good. nodeLinker: hoisted @@ -116,6 +114,10 @@ overrides: # browserslist-stats.json). 'browserslist@<4.28.7': 4.28.8 'image-size@>=0.6.3 <2.0.4': 2.0.4 + +# IDC patches for Cornerstone3D packages +# - @cornerstonejs/core: Fix VOI LUT function validation (PR #2856) +# - @cornerstonejs/adapters: Index segments by SegmentNumber for LABELMAP support (PR #2882) patchedDependencies: '@cornerstonejs/adapters': patches/@cornerstonejs__adapters.patch '@cornerstonejs/core': patches/@cornerstonejs__core.patch