@cornerstonejs/tools 4.22.13 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (225) hide show
  1. package/dist/esm/config.d.ts +4 -0
  2. package/dist/esm/drawingSvg/drawPath.d.ts +3 -0
  3. package/dist/esm/drawingSvg/drawPath.js +4 -1
  4. package/dist/esm/eventListeners/keyboard/keyDownListener.js +2 -2
  5. package/dist/esm/eventListeners/mouse/getMouseEventPoints.d.ts +1 -1
  6. package/dist/esm/eventListeners/mouse/getMouseEventPoints.js +19 -1
  7. package/dist/esm/eventListeners/mouse/mouseDoubleClickListener.js +8 -1
  8. package/dist/esm/eventListeners/mouse/mouseDownListener.js +37 -5
  9. package/dist/esm/eventListeners/mouse/mouseMoveListener.js +3 -0
  10. package/dist/esm/eventListeners/segmentation/imageChangeEventListener.js +60 -92
  11. package/dist/esm/eventListeners/segmentation/labelmap/onLabelmapSegmentationDataModified.js +49 -21
  12. package/dist/esm/eventListeners/segmentation/labelmap/performStackLabelmapUpdate.js +7 -13
  13. package/dist/esm/eventListeners/segmentation/labelmap/performVolumeLabelmapUpdate.js +44 -18
  14. package/dist/esm/eventListeners/touch/getTouchEventPoints.js +27 -4
  15. package/dist/esm/eventListeners/touch/touchStartListener.js +27 -9
  16. package/dist/esm/eventListeners/wheel/wheelListener.js +5 -1
  17. package/dist/esm/init.js +2 -0
  18. package/dist/esm/stateManagement/annotation/FrameOfReferenceSpecificAnnotationManager.js +10 -4
  19. package/dist/esm/stateManagement/segmentation/SegmentationRenderingEngine.js +23 -20
  20. package/dist/esm/stateManagement/segmentation/SegmentationRepresentationDisplayRegistry.d.ts +12 -0
  21. package/dist/esm/stateManagement/segmentation/SegmentationRepresentationDisplayRegistry.js +7 -0
  22. package/dist/esm/stateManagement/segmentation/SegmentationStateManager.d.ts +1 -11
  23. package/dist/esm/stateManagement/segmentation/SegmentationStateManager.js +28 -166
  24. package/dist/esm/stateManagement/segmentation/addColorLUT.js +7 -1
  25. package/dist/esm/stateManagement/segmentation/getCurrentLabelmapImageIdForViewport.js +16 -1
  26. package/dist/esm/stateManagement/segmentation/helpers/clearSegmentValue.js +9 -7
  27. package/dist/esm/stateManagement/segmentation/helpers/getSegmentationActor.d.ts +1 -1
  28. package/dist/esm/stateManagement/segmentation/helpers/getSegmentationActor.js +3 -2
  29. package/dist/esm/stateManagement/segmentation/helpers/getViewportLabelmapRenderMode.d.ts +5 -0
  30. package/dist/esm/stateManagement/segmentation/helpers/getViewportLabelmapRenderMode.js +58 -0
  31. package/dist/esm/stateManagement/segmentation/helpers/labelmapImageMapperSupport.d.ts +52 -0
  32. package/dist/esm/stateManagement/segmentation/helpers/labelmapImageMapperSupport.js +246 -0
  33. package/dist/esm/stateManagement/segmentation/helpers/labelmapSegmentationState.d.ts +1 -0
  34. package/dist/esm/stateManagement/segmentation/helpers/labelmapSegmentationState.js +1 -0
  35. package/dist/esm/stateManagement/segmentation/helpers/normalizeSegmentationInput.js +11 -1
  36. package/dist/esm/stateManagement/segmentation/internalAddSegmentationRepresentation.js +3 -3
  37. package/dist/esm/stateManagement/segmentation/labelmapModel/index.d.ts +9 -0
  38. package/dist/esm/stateManagement/segmentation/labelmapModel/index.js +7 -0
  39. package/dist/esm/stateManagement/segmentation/labelmapModel/labelmapEditTransaction.d.ts +54 -0
  40. package/dist/esm/stateManagement/segmentation/labelmapModel/labelmapEditTransaction.js +224 -0
  41. package/dist/esm/stateManagement/segmentation/labelmapModel/labelmapImageIdMapping.d.ts +6 -0
  42. package/dist/esm/stateManagement/segmentation/labelmapModel/labelmapImageIdMapping.js +39 -0
  43. package/dist/esm/stateManagement/segmentation/labelmapModel/labelmapImageReferenceResolver.d.ts +23 -0
  44. package/dist/esm/stateManagement/segmentation/labelmapModel/labelmapImageReferenceResolver.js +269 -0
  45. package/dist/esm/stateManagement/segmentation/labelmapModel/labelmapLayerStore.d.ts +15 -0
  46. package/dist/esm/stateManagement/segmentation/labelmapModel/labelmapLayerStore.js +160 -0
  47. package/dist/esm/stateManagement/segmentation/labelmapModel/labelmapLegacyAdapter.d.ts +4 -0
  48. package/dist/esm/stateManagement/segmentation/labelmapModel/labelmapLegacyAdapter.js +42 -0
  49. package/dist/esm/stateManagement/segmentation/labelmapModel/labelmapSegmentBindings.d.ts +11 -0
  50. package/dist/esm/stateManagement/segmentation/labelmapModel/labelmapSegmentBindings.js +73 -0
  51. package/dist/esm/stateManagement/segmentation/labelmapModel/normalizeLabelmapSegmentationData.d.ts +17 -0
  52. package/dist/esm/stateManagement/segmentation/labelmapModel/normalizeLabelmapSegmentationData.js +75 -0
  53. package/dist/esm/stateManagement/segmentation/labelmapModel/privateLabelmap.d.ts +5 -0
  54. package/dist/esm/stateManagement/segmentation/labelmapModel/privateLabelmap.js +106 -0
  55. package/dist/esm/stateManagement/segmentation/models/SegmentModel.d.ts +11 -0
  56. package/dist/esm/stateManagement/segmentation/models/SegmentModel.js +19 -0
  57. package/dist/esm/stateManagement/segmentation/models/SegmentationModel.d.ts +12 -0
  58. package/dist/esm/stateManagement/segmentation/models/SegmentationModel.js +23 -0
  59. package/dist/esm/stateManagement/segmentation/removeSegmentationRepresentations.js +6 -10
  60. package/dist/esm/stateManagement/segmentation/segmentIndex.js +24 -0
  61. package/dist/esm/stateManagement/segmentation/segmentationEventManager.js +2 -9
  62. package/dist/esm/stateManagement/segmentation/segmentationState.d.ts +2 -1
  63. package/dist/esm/stateManagement/segmentation/segmentationState.js +4 -1
  64. package/dist/esm/store/state.js +2 -1
  65. package/dist/esm/synchronizers/callbacks/imageSliceSyncCallback.js +12 -3
  66. package/dist/esm/synchronizers/callbacks/presentationViewSyncCallback.js +5 -2
  67. package/dist/esm/synchronizers/callbacks/zoomPanSyncCallback.js +51 -3
  68. package/dist/esm/tools/AdvancedMagnifyTool.js +1 -1
  69. package/dist/esm/tools/CrosshairsTool.js +5 -5
  70. package/dist/esm/tools/OrientationControllerTool.js +1 -1
  71. package/dist/esm/tools/OrientationMarkerTool.js +4 -4
  72. package/dist/esm/tools/PanTool.js +26 -3
  73. package/dist/esm/tools/PlanarRotateTool.js +19 -4
  74. package/dist/esm/tools/ReferenceCursors.js +7 -1
  75. package/dist/esm/tools/SculptorTool/CircleSculptCursor.js +1 -1
  76. package/dist/esm/tools/TrackballRotateTool.js +3 -2
  77. package/dist/esm/tools/VolumeCroppingTool.js +3 -2
  78. package/dist/esm/tools/WindowLevelTool.d.ts +2 -1
  79. package/dist/esm/tools/WindowLevelTool.js +48 -4
  80. package/dist/esm/tools/ZoomTool.d.ts +8 -0
  81. package/dist/esm/tools/ZoomTool.js +92 -11
  82. package/dist/esm/tools/annotation/AngleTool.js +33 -31
  83. package/dist/esm/tools/annotation/ArrowAnnotateTool.js +30 -28
  84. package/dist/esm/tools/annotation/BidirectionalTool.js +51 -49
  85. package/dist/esm/tools/annotation/CircleROITool.js +49 -44
  86. package/dist/esm/tools/annotation/CobbAngleTool.js +1 -1
  87. package/dist/esm/tools/annotation/DragProbeTool.js +1 -1
  88. package/dist/esm/tools/annotation/ETDRSGridTool.js +1 -1
  89. package/dist/esm/tools/annotation/EllipticalROITool.js +42 -37
  90. package/dist/esm/tools/annotation/HeightTool.js +1 -1
  91. package/dist/esm/tools/annotation/KeyImageTool.js +11 -11
  92. package/dist/esm/tools/annotation/LabelTool.js +37 -35
  93. package/dist/esm/tools/annotation/LengthTool.js +35 -33
  94. package/dist/esm/tools/annotation/LivewireContourSegmentationTool.js +6 -4
  95. package/dist/esm/tools/annotation/LivewireContourTool.js +1 -1
  96. package/dist/esm/tools/annotation/PlanarFreehandContourSegmentationTool.js +6 -4
  97. package/dist/esm/tools/annotation/PlanarFreehandROITool.js +1 -1
  98. package/dist/esm/tools/annotation/ProbeTool.js +51 -46
  99. package/dist/esm/tools/annotation/RectangleROITool.js +42 -37
  100. package/dist/esm/tools/annotation/RegionSegmentPlusTool.js +1 -1
  101. package/dist/esm/tools/annotation/RegionSegmentTool.js +1 -1
  102. package/dist/esm/tools/annotation/SplineContourSegmentationTool.js +1 -1
  103. package/dist/esm/tools/annotation/SplineROITool.js +51 -49
  104. package/dist/esm/tools/annotation/UltrasoundDirectionalTool.js +1 -1
  105. package/dist/esm/tools/annotation/UltrasoundPleuraBLineTool/UltrasoundPleuraBLineTool.js +57 -55
  106. package/dist/esm/tools/annotation/VideoRedactionTool.js +1 -1
  107. package/dist/esm/tools/base/AnnotationDisplayTool.js +9 -6
  108. package/dist/esm/tools/base/AnnotationTool.js +2 -1
  109. package/dist/esm/tools/base/BaseTool.js +16 -10
  110. package/dist/esm/tools/base/ContourSegmentationBaseTool.js +1 -1
  111. package/dist/esm/tools/base/GrowCutBaseTool.js +2 -2
  112. package/dist/esm/tools/displayTools/Labelmap/addLabelmapToElement.d.ts +2 -4
  113. package/dist/esm/tools/displayTools/Labelmap/addLabelmapToElement.js +15 -85
  114. package/dist/esm/tools/displayTools/Labelmap/labelmapActorStyle.d.ts +5 -0
  115. package/dist/esm/tools/displayTools/Labelmap/labelmapActorStyle.js +191 -0
  116. package/dist/esm/tools/displayTools/Labelmap/labelmapDisplay.d.ts +4 -3
  117. package/dist/esm/tools/displayTools/Labelmap/labelmapDisplay.js +48 -209
  118. package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/createLabelmapRenderPlan.d.ts +3 -0
  119. package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/createLabelmapRenderPlan.js +51 -0
  120. package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/index.d.ts +4 -0
  121. package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/index.js +3 -0
  122. package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/legacyVolumePlan.d.ts +14 -0
  123. package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/legacyVolumePlan.js +143 -0
  124. package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/planarGenericVolumeLabelmap.d.ts +40 -0
  125. package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/planarGenericVolumeLabelmap.js +79 -0
  126. package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/removeLabelmapRepresentationFromViewport.d.ts +3 -0
  127. package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/removeLabelmapRepresentationFromViewport.js +18 -0
  128. package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/resolveLabelmapRenderPlan.d.ts +9 -0
  129. package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/resolveLabelmapRenderPlan.js +56 -0
  130. package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/stackImagePlan.d.ts +11 -0
  131. package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/stackImagePlan.js +35 -0
  132. package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/types.d.ts +48 -0
  133. package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/types.js +0 -0
  134. package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/volumeSliceImageMapperPlan.d.ts +13 -0
  135. package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/volumeSliceImageMapperPlan.js +34 -0
  136. package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan.d.ts +2 -0
  137. package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan.js +1 -0
  138. package/dist/esm/tools/displayTools/Labelmap/labelmapRepresentationUID.d.ts +8 -0
  139. package/dist/esm/tools/displayTools/Labelmap/labelmapRepresentationUID.js +18 -0
  140. package/dist/esm/tools/displayTools/Labelmap/removeLabelmapFromElement.js +2 -5
  141. package/dist/esm/tools/displayTools/Labelmap/removeLabelmapRepresentationData.d.ts +3 -0
  142. package/dist/esm/tools/displayTools/Labelmap/removeLabelmapRepresentationData.js +16 -0
  143. package/dist/esm/tools/displayTools/Labelmap/syncStackLabelmapActors.d.ts +2 -0
  144. package/dist/esm/tools/displayTools/Labelmap/syncStackLabelmapActors.js +135 -0
  145. package/dist/esm/tools/displayTools/Labelmap/volumeLabelmapImageMapper.d.ts +16 -0
  146. package/dist/esm/tools/displayTools/Labelmap/volumeLabelmapImageMapper.js +267 -0
  147. package/dist/esm/tools/displayTools/Labelmap/volumeLabelmapSliceData.d.ts +27 -0
  148. package/dist/esm/tools/displayTools/Labelmap/volumeLabelmapSliceData.js +185 -0
  149. package/dist/esm/tools/displayTools/registerBuiltInSegmentationRepresentationDisplays.d.ts +1 -0
  150. package/dist/esm/tools/displayTools/registerBuiltInSegmentationRepresentationDisplays.js +16 -0
  151. package/dist/esm/tools/segmentation/BrushTool.d.ts +9 -2
  152. package/dist/esm/tools/segmentation/BrushTool.js +109 -25
  153. package/dist/esm/tools/segmentation/CircleScissorsTool.js +13 -6
  154. package/dist/esm/tools/segmentation/LabelmapBaseTool.d.ts +2 -3
  155. package/dist/esm/tools/segmentation/LabelmapBaseTool.js +77 -38
  156. package/dist/esm/tools/segmentation/LabelmapEditWithContour.js +3 -3
  157. package/dist/esm/tools/segmentation/PaintFillTool.js +11 -4
  158. package/dist/esm/tools/segmentation/RectangleROIStartEndThresholdTool.d.ts +2 -0
  159. package/dist/esm/tools/segmentation/RectangleROIStartEndThresholdTool.js +16 -8
  160. package/dist/esm/tools/segmentation/RectangleScissorsTool.js +13 -6
  161. package/dist/esm/tools/segmentation/SegmentBidirectionalTool.js +63 -61
  162. package/dist/esm/tools/segmentation/SegmentSelectTool.js +4 -4
  163. package/dist/esm/tools/segmentation/SphereScissorsTool.js +5 -1
  164. package/dist/esm/tools/segmentation/strategies/BrushStrategy.d.ts +7 -0
  165. package/dist/esm/tools/segmentation/strategies/BrushStrategy.js +47 -24
  166. package/dist/esm/tools/segmentation/strategies/compositions/circularCursor.js +49 -15
  167. package/dist/esm/tools/segmentation/strategies/compositions/determineSegmentIndex.js +2 -2
  168. package/dist/esm/tools/segmentation/strategies/compositions/dynamicThreshold.js +5 -1
  169. package/dist/esm/tools/segmentation/strategies/compositions/islandRemovalComposition.js +2 -2
  170. package/dist/esm/tools/segmentation/strategies/compositions/preview.js +2 -2
  171. package/dist/esm/tools/segmentation/strategies/compositions/setValue.js +14 -6
  172. package/dist/esm/tools/segmentation/strategies/utils/crossLayerErase.d.ts +4 -0
  173. package/dist/esm/tools/segmentation/strategies/utils/crossLayerErase.js +23 -0
  174. package/dist/esm/tools/segmentation/strategies/utils/getStrategyData.js +1 -1
  175. package/dist/esm/tools/segmentation/strategies/utils/handleUseSegmentCenterIndex.js +12 -11
  176. package/dist/esm/tools/segmentation/strategies/utils/labelmapOverlap.d.ts +4 -0
  177. package/dist/esm/tools/segmentation/strategies/utils/labelmapOverlap.js +41 -0
  178. package/dist/esm/tools/segmentation/strategies/utils/overwritePolicy.d.ts +3 -0
  179. package/dist/esm/tools/segmentation/strategies/utils/overwritePolicy.js +31 -0
  180. package/dist/esm/tools/segmentation/strategies/utils/segmentSeparation.d.ts +3 -0
  181. package/dist/esm/tools/segmentation/strategies/utils/segmentSeparation.js +38 -0
  182. package/dist/esm/tools/segmentation/utils/LazyBrushEditController.d.ts +19 -0
  183. package/dist/esm/tools/segmentation/utils/LazyBrushEditController.js +55 -0
  184. package/dist/esm/tools/segmentation/utils/lazyBrushPreview.d.ts +3 -0
  185. package/dist/esm/tools/segmentation/utils/lazyBrushPreview.js +34 -0
  186. package/dist/esm/tools/segmentation/utils/shouldUseLazyLabelmapEditing.d.ts +3 -0
  187. package/dist/esm/tools/segmentation/utils/shouldUseLazyLabelmapEditing.js +42 -0
  188. package/dist/esm/types/LabelmapToolOperationData.d.ts +5 -0
  189. package/dist/esm/types/LabelmapTypes.d.ts +29 -6
  190. package/dist/esm/types/SegmentationStateTypes.d.ts +4 -0
  191. package/dist/esm/utilities/calibrateImageSpacing.js +17 -2
  192. package/dist/esm/utilities/contours/AnnotationToPointData.js +1 -1
  193. package/dist/esm/utilities/getSphereBoundsInfo.js +5 -1
  194. package/dist/esm/utilities/getViewportICamera.d.ts +4 -0
  195. package/dist/esm/utilities/getViewportICamera.js +23 -0
  196. package/dist/esm/utilities/getViewportsForAnnotation.js +5 -1
  197. package/dist/esm/utilities/math/basic/BasicStatsCalculator.js +9 -7
  198. package/dist/esm/utilities/pointInSurroundingSphereCallback.js +8 -1
  199. package/dist/esm/utilities/segmentation/InterpolationManager/InterpolationManager.js +121 -118
  200. package/dist/esm/utilities/segmentation/SegmentStatsCalculator.js +5 -4
  201. package/dist/esm/utilities/segmentation/VolumetricCalculator.js +1 -1
  202. package/dist/esm/utilities/segmentation/createLabelmapVolumeForViewport.js +1 -1
  203. package/dist/esm/utilities/segmentation/getReferenceVolumeForSegmentation.js +1 -1
  204. package/dist/esm/utilities/segmentation/getReferenceVolumeForSegmentationVolume.js +11 -2
  205. package/dist/esm/utilities/segmentation/getSegmentIndexAtLabelmapBorder.js +36 -17
  206. package/dist/esm/utilities/segmentation/getSegmentIndexAtWorldPoint.js +42 -25
  207. package/dist/esm/utilities/segmentation/getUniqueSegmentIndices.js +3 -30
  208. package/dist/esm/utilities/segmentation/index.d.ts +2 -1
  209. package/dist/esm/utilities/segmentation/index.js +2 -1
  210. package/dist/esm/utilities/segmentation/utilsForWorker.js +2 -2
  211. package/dist/esm/utilities/segmentation/validateLabelmap.js +1 -1
  212. package/dist/esm/utilities/stackPrefetch/stackPrefetch.js +0 -1
  213. package/dist/esm/utilities/touch/index.js +3 -2
  214. package/dist/esm/utilities/viewportCapabilities.d.ts +16 -0
  215. package/dist/esm/utilities/viewportCapabilities.js +18 -0
  216. package/dist/esm/utilities/viewportFilters/filterViewportsWithParallelNormals.d.ts +1 -1
  217. package/dist/esm/utilities/viewportFilters/filterViewportsWithParallelNormals.js +12 -4
  218. package/dist/esm/utilities/viewportFilters/filterViewportsWithSameOrientation.d.ts +1 -1
  219. package/dist/esm/utilities/viewportFilters/filterViewportsWithSameOrientation.js +11 -4
  220. package/dist/esm/utilities/viewportFilters/getViewportIdsWithToolToRender.js +1 -1
  221. package/dist/esm/utilities/viewportPresentation.d.ts +3 -0
  222. package/dist/esm/utilities/viewportPresentation.js +26 -0
  223. package/dist/esm/version.d.ts +1 -1
  224. package/dist/esm/version.js +1 -1
  225. package/package.json +10 -10
@@ -0,0 +1,224 @@
1
+ import { BaseVolumeViewport, cache } from '@cornerstonejs/core';
2
+ import { getLabelmap, getOrCreateLabelmapVolume } from './labelmapLayerStore';
3
+ import { getSegmentBinding, getSegmentIndexForLabelValue, getSegmentsOnLabelmap, } from './labelmapSegmentBindings';
4
+ import { moveSegmentToPrivateLabelmap as defaultMoveSegmentToPrivateLabelmap } from './privateLabelmap';
5
+ function getProtectedSegmentIndicesForLayer(segmentation, labelmapId, segmentIndex, overwriteSegmentIndices = []) {
6
+ return getSegmentsOnLabelmap(segmentation, labelmapId).filter((candidateSegmentIndex) => candidateSegmentIndex !== segmentIndex &&
7
+ !overwriteSegmentIndices.includes(candidateSegmentIndex));
8
+ }
9
+ function hasProtectedSegmentOverwrite(segmentation, labelmapId, protectedSegmentIndices, voxelManager, options = {}) {
10
+ if (!voxelManager || !protectedSegmentIndices.length) {
11
+ return false;
12
+ }
13
+ const protectedSet = new Set(protectedSegmentIndices);
14
+ let hasConflict = false;
15
+ voxelManager.forEach(({ value }) => {
16
+ if (!value || hasConflict) {
17
+ return;
18
+ }
19
+ const candidateSegmentIndex = getSegmentIndexForLabelValue(segmentation, labelmapId, Number(value));
20
+ if (candidateSegmentIndex && protectedSet.has(candidateSegmentIndex)) {
21
+ hasConflict = true;
22
+ }
23
+ }, {
24
+ imageData: options.segmentationImageData,
25
+ isInObject: options.isInObject,
26
+ boundsIJK: options.isInObjectBoundsIJK,
27
+ });
28
+ return hasConflict;
29
+ }
30
+ function collectCrossLayerEraseBindings(segmentation, labelmapId, overwriteSegmentIndices = []) {
31
+ if (!labelmapId || !overwriteSegmentIndices.length) {
32
+ return [];
33
+ }
34
+ return overwriteSegmentIndices
35
+ .map((overwriteSegmentIndex) => getSegmentBinding(segmentation, overwriteSegmentIndex))
36
+ .filter((binding) => !!binding && binding.labelmapId !== labelmapId);
37
+ }
38
+ function beginLabelmapEditTransaction(segmentation, options) {
39
+ const { segmentIndex } = options;
40
+ const overwriteSegmentIndices = options.overwriteSegmentIndices ?? [];
41
+ if (!segmentIndex) {
42
+ return {
43
+ segmentIndex,
44
+ labelValue: 0,
45
+ overwriteSegmentIndices,
46
+ protectedSegmentIndices: [],
47
+ crossLayerEraseBindings: [],
48
+ movedSegment: false,
49
+ };
50
+ }
51
+ const binding = getSegmentBinding(segmentation, segmentIndex);
52
+ const sourceLayer = binding
53
+ ? getLabelmap(segmentation, binding.labelmapId)
54
+ : undefined;
55
+ if (!binding || !sourceLayer) {
56
+ return {
57
+ segmentIndex,
58
+ labelValue: segmentIndex,
59
+ overwriteSegmentIndices,
60
+ protectedSegmentIndices: [],
61
+ crossLayerEraseBindings: [],
62
+ movedSegment: false,
63
+ };
64
+ }
65
+ let activeLayer = sourceLayer;
66
+ let labelmapId = binding.labelmapId;
67
+ let labelValue = binding.labelValue;
68
+ let movedSegment = false;
69
+ const protectedSegmentIndices = getProtectedSegmentIndicesForLayer(segmentation, labelmapId, segmentIndex, overwriteSegmentIndices);
70
+ const shouldMoveSegment = hasProtectedSegmentOverwrite(segmentation, labelmapId, protectedSegmentIndices, options.segmentationVoxelManager, {
71
+ segmentationImageData: options.segmentationImageData,
72
+ isInObject: options.isInObject,
73
+ isInObjectBoundsIJK: options.isInObjectBoundsIJK,
74
+ });
75
+ if (shouldMoveSegment) {
76
+ const moveSegmentToPrivateLabelmap = options.moveSegmentToPrivateLabelmap ??
77
+ defaultMoveSegmentToPrivateLabelmap;
78
+ const privateLayer = moveSegmentToPrivateLabelmap(segmentation, segmentIndex);
79
+ const privateBinding = getSegmentBinding(segmentation, segmentIndex);
80
+ if (privateLayer && privateBinding) {
81
+ activeLayer = privateLayer;
82
+ labelmapId = privateBinding.labelmapId;
83
+ labelValue = privateBinding.labelValue;
84
+ movedSegment = privateLayer.labelmapId !== sourceLayer.labelmapId;
85
+ }
86
+ else if (privateLayer) {
87
+ activeLayer = privateLayer;
88
+ labelmapId = privateLayer.labelmapId;
89
+ labelValue = 1;
90
+ movedSegment = privateLayer.labelmapId !== sourceLayer.labelmapId;
91
+ }
92
+ }
93
+ return {
94
+ segmentIndex,
95
+ labelmapId,
96
+ labelValue,
97
+ sourceLayer,
98
+ activeLayer,
99
+ overwriteSegmentIndices,
100
+ protectedSegmentIndices,
101
+ crossLayerEraseBindings: collectCrossLayerEraseBindings(segmentation, labelmapId, overwriteSegmentIndices),
102
+ movedSegment,
103
+ };
104
+ }
105
+ function getViewportImageIds(viewport) {
106
+ const stackViewport = viewport;
107
+ return typeof stackViewport?.getImageIds === 'function'
108
+ ? stackViewport.getImageIds()
109
+ : [];
110
+ }
111
+ function getCurrentViewportImageId(viewport) {
112
+ const stackViewport = viewport;
113
+ return typeof stackViewport?.getCurrentImageId === 'function'
114
+ ? stackViewport.getCurrentImageId()
115
+ : undefined;
116
+ }
117
+ function getLayerImageIndex(layer, options) {
118
+ const currentImageId = options.imageId ?? getCurrentViewportImageId(options.viewport);
119
+ if (!currentImageId) {
120
+ return -1;
121
+ }
122
+ const sourceImageIndex = options.sourceLayer?.imageIds?.indexOf(currentImageId) ?? -1;
123
+ if (sourceImageIndex >= 0) {
124
+ return sourceImageIndex;
125
+ }
126
+ const layerImageIndex = layer.imageIds?.indexOf(currentImageId) ?? -1;
127
+ if (layerImageIndex >= 0) {
128
+ return layerImageIndex;
129
+ }
130
+ return getViewportImageIds(options.viewport).indexOf(currentImageId);
131
+ }
132
+ function getLabelmapLayerImageId(layer, options = {}) {
133
+ const targetIndex = getLayerImageIndex(layer, options);
134
+ return targetIndex >= 0 ? layer.imageIds?.[targetIndex] : layer.imageIds?.[0];
135
+ }
136
+ function resolveLabelmapLayerEditTarget(layer, options = {}) {
137
+ const imageId = getLabelmapLayerImageId(layer, options);
138
+ if (options.preferVolume ||
139
+ layer.volumeId ||
140
+ options.viewport instanceof BaseVolumeViewport) {
141
+ const volume = getOrCreateLabelmapVolume(layer);
142
+ return {
143
+ imageId,
144
+ imageData: volume?.imageData,
145
+ voxelManager: volume?.voxelManager,
146
+ volume,
147
+ };
148
+ }
149
+ const image = imageId ? cache.getImage(imageId) : undefined;
150
+ return {
151
+ imageId,
152
+ voxelManager: image?.voxelManager,
153
+ image,
154
+ };
155
+ }
156
+ function eraseVolumeLayer(layer, binding, options, modifiedSlices) {
157
+ const volume = getOrCreateLabelmapVolume(layer);
158
+ if (!volume) {
159
+ return;
160
+ }
161
+ volume.voxelManager.forEach(({ value, index, pointIJK }) => {
162
+ if (value !== binding.labelValue) {
163
+ return;
164
+ }
165
+ const worldPoint = volume.imageData.indexToWorld(pointIJK);
166
+ if (!options.isInObject(worldPoint)) {
167
+ return;
168
+ }
169
+ volume.voxelManager.setAtIndex(index, 0);
170
+ }, {
171
+ imageData: volume.imageData,
172
+ boundsIJK: options.isInObjectBoundsIJK,
173
+ });
174
+ volume.voxelManager
175
+ ?.getArrayOfModifiedSlices?.()
176
+ ?.forEach((sliceIndex) => modifiedSlices.add(sliceIndex));
177
+ }
178
+ function eraseStackLayer(layer, binding, options, modifiedSlices) {
179
+ const stackViewport = options.viewport;
180
+ const currentImageId = getCurrentViewportImageId(options.viewport) ?? options.imageId;
181
+ const { image, voxelManager } = resolveLabelmapLayerEditTarget(layer, {
182
+ viewport: options.viewport,
183
+ imageId: currentImageId,
184
+ });
185
+ if (!image || !voxelManager) {
186
+ return;
187
+ }
188
+ voxelManager.forEach(({ value, index, pointIJK }) => {
189
+ if (value !== binding.labelValue) {
190
+ return;
191
+ }
192
+ const worldPoint = options.referenceImageData.indexToWorld(pointIJK);
193
+ if (!options.isInObject(worldPoint)) {
194
+ return;
195
+ }
196
+ voxelManager.setAtIndex(index, 0);
197
+ }, {
198
+ imageData: options.referenceImageData,
199
+ boundsIJK: options.isInObjectBoundsIJK,
200
+ });
201
+ const currentSlice = stackViewport.getCurrentImageIdIndex?.();
202
+ if (typeof currentSlice === 'number') {
203
+ modifiedSlices.add(currentSlice);
204
+ }
205
+ }
206
+ function eraseLabelmapEditTransactionOverwrites(segmentation, transaction, options) {
207
+ if (!transaction?.crossLayerEraseBindings?.length) {
208
+ return [];
209
+ }
210
+ const modifiedSlices = new Set();
211
+ transaction.crossLayerEraseBindings.forEach((binding) => {
212
+ const layer = getLabelmap(segmentation, binding.labelmapId);
213
+ if (!layer) {
214
+ return;
215
+ }
216
+ if (options.viewport instanceof BaseVolumeViewport || layer.volumeId) {
217
+ eraseVolumeLayer(layer, binding, options, modifiedSlices);
218
+ return;
219
+ }
220
+ eraseStackLayer(layer, binding, options, modifiedSlices);
221
+ });
222
+ return Array.from(modifiedSlices);
223
+ }
224
+ export { beginLabelmapEditTransaction, collectCrossLayerEraseBindings, eraseLabelmapEditTransactionOverwrites, getLabelmapLayerImageId, getProtectedSegmentIndicesForLayer, hasProtectedSegmentOverwrite, resolveLabelmapLayerEditTarget, };
@@ -0,0 +1,6 @@
1
+ import type { LabelmapLayer } from '../../../types/LabelmapTypes';
2
+ declare function getReferencedImageIdForImageIndex(layer: LabelmapLayer, imageIndex: number): string | undefined;
3
+ declare function forEachLabelmapImageReference(layer: LabelmapLayer, callback: (referencedImageId: string, labelmapImageId: string, imageIndex: number) => void): void;
4
+ declare function getLabelmapImageIdsForReferencedImageId(layer: LabelmapLayer, referencedImageId: string): string[];
5
+ declare function hasMultipleLabelmapImagesPerReferencedImageId(layer: LabelmapLayer): boolean;
6
+ export { forEachLabelmapImageReference, getLabelmapImageIdsForReferencedImageId, getReferencedImageIdForImageIndex, hasMultipleLabelmapImagesPerReferencedImageId, };
@@ -0,0 +1,39 @@
1
+ function getReferencedImageIdForImageIndex(layer, imageIndex) {
2
+ const imageIds = layer.imageIds ?? [];
3
+ const referencedImageIds = layer.referencedImageIds ?? imageIds;
4
+ if (!referencedImageIds.length) {
5
+ return;
6
+ }
7
+ if (layer.referencedImageIds?.length &&
8
+ imageIds.length > referencedImageIds.length &&
9
+ imageIds.length % referencedImageIds.length === 0) {
10
+ return referencedImageIds[imageIndex % referencedImageIds.length];
11
+ }
12
+ return referencedImageIds[imageIndex];
13
+ }
14
+ function forEachLabelmapImageReference(layer, callback) {
15
+ layer.imageIds?.forEach((labelmapImageId, imageIndex) => {
16
+ const referencedImageId = getReferencedImageIdForImageIndex(layer, imageIndex);
17
+ if (!referencedImageId || !labelmapImageId) {
18
+ return;
19
+ }
20
+ callback(referencedImageId, labelmapImageId, imageIndex);
21
+ });
22
+ }
23
+ function getLabelmapImageIdsForReferencedImageId(layer, referencedImageId) {
24
+ const imageIds = [];
25
+ forEachLabelmapImageReference(layer, (candidateReference, imageId) => {
26
+ if (candidateReference === referencedImageId) {
27
+ imageIds.push(imageId);
28
+ }
29
+ });
30
+ return imageIds;
31
+ }
32
+ function hasMultipleLabelmapImagesPerReferencedImageId(layer) {
33
+ const imageIdsByReference = new Map();
34
+ forEachLabelmapImageReference(layer, (referencedImageId) => {
35
+ imageIdsByReference.set(referencedImageId, (imageIdsByReference.get(referencedImageId) ?? 0) + 1);
36
+ });
37
+ return Array.from(imageIdsByReference.values()).some((count) => count > 1);
38
+ }
39
+ export { forEachLabelmapImageReference, getLabelmapImageIdsForReferencedImageId, getReferencedImageIdForImageIndex, hasMultipleLabelmapImagesPerReferencedImageId, };
@@ -0,0 +1,23 @@
1
+ import type { RepresentationsData, Segmentation } from '../../../types/SegmentationStateTypes';
2
+ type GetSegmentation = (segmentationId: string) => Segmentation | undefined;
3
+ declare class LabelmapImageReferenceResolver {
4
+ private readonly getSegmentation;
5
+ private readonly stackLabelmapImageIdReferenceMap;
6
+ private readonly labelmapImageIdReferenceMap;
7
+ private readonly keysBySegmentationId;
8
+ constructor(getSegmentation: GetSegmentation);
9
+ reset(): void;
10
+ removeSegmentation(segmentationId: string): void;
11
+ private setLabelmapImageIds;
12
+ getLabelmapImageIds(representationData: RepresentationsData): any;
13
+ getLabelmapImageIdsForImageId(imageId: string, segmentationId: string): string[];
14
+ updateLabelmapSegmentationImageReferences(viewportId: string, segmentationId: string): string | undefined;
15
+ getCurrentLabelmapImageIdsForViewport(viewportId: string, segmentationId: string): string[] | undefined;
16
+ getCurrentLabelmapImageIdForViewport(viewportId: string, segmentationId: string): string | undefined;
17
+ getStackSegmentationImageIdsForViewport(viewportId: string, segmentationId: string): string[];
18
+ private updateLabelmapSegmentationReferences;
19
+ private updateAllLabelmapSegmentationImageReferences;
20
+ private updateLabelmapImageIdReferenceMap;
21
+ private generateMapKey;
22
+ }
23
+ export default LabelmapImageReferenceResolver;
@@ -0,0 +1,269 @@
1
+ import { cache, getEnabledElementByViewportId, } from '@cornerstonejs/core';
2
+ import getViewportLabelmapRenderMode from '../helpers/getViewportLabelmapRenderMode';
3
+ import { ensureLabelmapState } from './normalizeLabelmapSegmentationData';
4
+ import { getLabelmaps } from './labelmapLayerStore';
5
+ import { getLabelmapForSegment } from './labelmapSegmentBindings';
6
+ import { getReferencedImageIdToCurrentImageIdMap } from './labelmapLegacyAdapter';
7
+ import { getLabelmapImageIdsForReferencedImageId } from './labelmapImageIdMapping';
8
+ class LabelmapImageReferenceResolver {
9
+ constructor(getSegmentation) {
10
+ this.stackLabelmapImageIdReferenceMap = new Map();
11
+ this.labelmapImageIdReferenceMap = new Map();
12
+ this.keysBySegmentationId = new Map();
13
+ this.getSegmentation = getSegmentation;
14
+ }
15
+ reset() {
16
+ this.stackLabelmapImageIdReferenceMap.clear();
17
+ this.labelmapImageIdReferenceMap.clear();
18
+ this.keysBySegmentationId.clear();
19
+ }
20
+ removeSegmentation(segmentationId) {
21
+ this.stackLabelmapImageIdReferenceMap.delete(segmentationId);
22
+ const keys = this.keysBySegmentationId.get(segmentationId);
23
+ if (keys) {
24
+ for (const key of keys) {
25
+ this.labelmapImageIdReferenceMap.delete(key);
26
+ }
27
+ this.keysBySegmentationId.delete(segmentationId);
28
+ }
29
+ }
30
+ setLabelmapImageIds(segmentationId, key, labelmapImageIds) {
31
+ this.labelmapImageIdReferenceMap.set(key, labelmapImageIds);
32
+ let keys = this.keysBySegmentationId.get(segmentationId);
33
+ if (!keys) {
34
+ keys = new Set();
35
+ this.keysBySegmentationId.set(segmentationId, keys);
36
+ }
37
+ keys.add(key);
38
+ }
39
+ getLabelmapImageIds(representationData) {
40
+ const labelmapData = representationData.Labelmap;
41
+ let labelmapImageIds;
42
+ if (!labelmapData) {
43
+ return;
44
+ }
45
+ if (labelmapData?.labelmaps) {
46
+ const imageIds = Object.values(labelmapData.labelmaps).flatMap((layer) => {
47
+ if (layer.imageIds?.length) {
48
+ return layer.imageIds;
49
+ }
50
+ if (layer.volumeId) {
51
+ return cache.getVolume(layer.volumeId)
52
+ ?.imageIds;
53
+ }
54
+ return [];
55
+ });
56
+ return Array.from(new Set(imageIds.filter(Boolean)));
57
+ }
58
+ if (labelmapData.imageIds) {
59
+ labelmapImageIds = labelmapData
60
+ .imageIds;
61
+ }
62
+ else if (labelmapData.volumeId) {
63
+ const volumeId = labelmapData
64
+ .volumeId;
65
+ const volume = cache.getVolume(volumeId);
66
+ labelmapImageIds = volume.imageIds;
67
+ }
68
+ return labelmapImageIds;
69
+ }
70
+ getLabelmapImageIdsForImageId(imageId, segmentationId) {
71
+ const segmentation = this.getSegmentation(segmentationId);
72
+ if (!segmentation?.representationData?.Labelmap) {
73
+ return;
74
+ }
75
+ ensureLabelmapState(segmentation);
76
+ return getReferencedImageIdToCurrentImageIdMap(segmentation).get(imageId);
77
+ }
78
+ updateLabelmapSegmentationImageReferences(viewportId, segmentationId) {
79
+ const segmentation = this.getSegmentation(segmentationId);
80
+ if (!segmentation) {
81
+ return;
82
+ }
83
+ if (!this.stackLabelmapImageIdReferenceMap.has(segmentationId)) {
84
+ this.stackLabelmapImageIdReferenceMap.set(segmentationId, new Map());
85
+ }
86
+ const { representationData } = segmentation;
87
+ if (!representationData.Labelmap) {
88
+ return;
89
+ }
90
+ const labelmapImageIds = this.getLabelmapImageIds(representationData);
91
+ const enabledElement = getEnabledElementByViewportId(viewportId);
92
+ if (!enabledElement || !labelmapImageIds?.length) {
93
+ return;
94
+ }
95
+ return this.updateLabelmapSegmentationReferences(segmentationId, enabledElement.viewport, labelmapImageIds);
96
+ }
97
+ getCurrentLabelmapImageIdsForViewport(viewportId, segmentationId) {
98
+ const enabledElement = getEnabledElementByViewportId(viewportId);
99
+ if (!enabledElement) {
100
+ return;
101
+ }
102
+ const { viewport } = enabledElement;
103
+ const viewportRenderMode = getViewportLabelmapRenderMode(viewport);
104
+ if (viewportRenderMode !== 'image' ||
105
+ typeof viewport.getCurrentImageId !== 'function') {
106
+ return;
107
+ }
108
+ const referenceImageId = viewport.getCurrentImageId();
109
+ const segmentation = this.getSegmentation(segmentationId);
110
+ if (!segmentation) {
111
+ return;
112
+ }
113
+ ensureLabelmapState(segmentation);
114
+ const viewportImageIds = viewport.getImageIds();
115
+ const currentIndex = viewportImageIds.indexOf(referenceImageId);
116
+ const labelmapImageIds = [];
117
+ getLabelmaps(segmentation).forEach((layer) => {
118
+ const referencedLabelmapImageIds = getLabelmapImageIdsForReferencedImageId(layer, referenceImageId);
119
+ if (referencedLabelmapImageIds.length) {
120
+ labelmapImageIds.push(...referencedLabelmapImageIds);
121
+ return;
122
+ }
123
+ if (currentIndex !== -1 && layer.imageIds?.[currentIndex]) {
124
+ labelmapImageIds.push(layer.imageIds[currentIndex]);
125
+ return;
126
+ }
127
+ layer.imageIds?.some((candidateImageId) => {
128
+ const viewableImageId = viewport.isReferenceViewable({ referencedImageId: candidateImageId }, { asOverlay: true });
129
+ if (viewableImageId) {
130
+ labelmapImageIds.push(candidateImageId);
131
+ }
132
+ return !!viewableImageId;
133
+ });
134
+ });
135
+ const resolvedImageIds = Array.from(new Set(labelmapImageIds));
136
+ const key = this.generateMapKey({
137
+ segmentationId,
138
+ referenceImageId,
139
+ });
140
+ this.setLabelmapImageIds(segmentationId, key, resolvedImageIds);
141
+ if (!this.stackLabelmapImageIdReferenceMap.has(segmentationId)) {
142
+ this.stackLabelmapImageIdReferenceMap.set(segmentationId, new Map());
143
+ }
144
+ const activeSegmentIndex = Object.keys(segmentation.segments).find((segmentIndex) => segmentation.segments[segmentIndex].active);
145
+ const activeImageId = activeSegmentIndex
146
+ ? getLabelmapForSegment(segmentation, Number(activeSegmentIndex))
147
+ ?.imageIds?.[currentIndex]
148
+ : undefined;
149
+ this.stackLabelmapImageIdReferenceMap
150
+ .get(segmentationId)
151
+ .set(referenceImageId, activeImageId ?? resolvedImageIds[0]);
152
+ return resolvedImageIds;
153
+ }
154
+ getCurrentLabelmapImageIdForViewport(viewportId, segmentationId) {
155
+ const enabledElement = getEnabledElementByViewportId(viewportId);
156
+ if (!enabledElement) {
157
+ return;
158
+ }
159
+ const { viewport } = enabledElement;
160
+ const viewportRenderMode = getViewportLabelmapRenderMode(viewport);
161
+ if (viewportRenderMode !== 'image' ||
162
+ typeof viewport.getCurrentImageId !== 'function') {
163
+ return;
164
+ }
165
+ const currentImageId = viewport.getCurrentImageId();
166
+ const currentImageIds = this.getCurrentLabelmapImageIdsForViewport(viewportId, segmentationId);
167
+ if (!currentImageIds?.length) {
168
+ return;
169
+ }
170
+ const segmentation = this.getSegmentation(segmentationId);
171
+ const currentIndex = viewport
172
+ .getImageIds()
173
+ .indexOf(currentImageId);
174
+ const activeSegmentIndex = segmentation
175
+ ? Object.keys(segmentation.segments).find((segmentIndex) => segmentation.segments[segmentIndex].active)
176
+ : undefined;
177
+ const activeImageId = segmentation && activeSegmentIndex
178
+ ? getLabelmapForSegment(segmentation, Number(activeSegmentIndex))
179
+ ?.imageIds?.[currentIndex]
180
+ : undefined;
181
+ return activeImageId ?? currentImageIds[0];
182
+ }
183
+ getStackSegmentationImageIdsForViewport(viewportId, segmentationId) {
184
+ const segmentation = this.getSegmentation(segmentationId);
185
+ if (!segmentation) {
186
+ return [];
187
+ }
188
+ this.updateAllLabelmapSegmentationImageReferences(viewportId, segmentationId);
189
+ const enabledElement = getEnabledElementByViewportId(viewportId);
190
+ const imageIds = enabledElement?.viewport.getImageIds?.() ?? [];
191
+ const imageIdMap = getReferencedImageIdToCurrentImageIdMap(segmentation);
192
+ return imageIds.flatMap((imageId) => imageIdMap.get(imageId) ?? []);
193
+ }
194
+ updateLabelmapSegmentationReferences(segmentationId, viewport, labelmapImageIds, updateCallback) {
195
+ const referenceImageId = viewport.getCurrentImageId();
196
+ let viewableLabelmapImageIdFound = false;
197
+ for (const labelmapImageId of labelmapImageIds) {
198
+ const viewableImageId = viewport.isReferenceViewable({ referencedImageId: labelmapImageId }, { asOverlay: true });
199
+ if (viewableImageId) {
200
+ viewableLabelmapImageIdFound = true;
201
+ this.stackLabelmapImageIdReferenceMap
202
+ .get(segmentationId)
203
+ .set(referenceImageId, labelmapImageId);
204
+ this.updateLabelmapImageIdReferenceMap({
205
+ segmentationId,
206
+ referenceImageId,
207
+ labelmapImageId,
208
+ });
209
+ }
210
+ }
211
+ updateCallback?.(viewport, segmentationId, labelmapImageIds);
212
+ return viewableLabelmapImageIdFound
213
+ ? this.stackLabelmapImageIdReferenceMap
214
+ .get(segmentationId)
215
+ .get(referenceImageId)
216
+ : undefined;
217
+ }
218
+ updateAllLabelmapSegmentationImageReferences(viewportId, segmentationId) {
219
+ const segmentation = this.getSegmentation(segmentationId);
220
+ if (!segmentation) {
221
+ return;
222
+ }
223
+ if (!this.stackLabelmapImageIdReferenceMap.has(segmentationId)) {
224
+ this.stackLabelmapImageIdReferenceMap.set(segmentationId, new Map());
225
+ }
226
+ const { representationData } = segmentation;
227
+ if (!representationData.Labelmap) {
228
+ return;
229
+ }
230
+ const labelmapImageIds = this.getLabelmapImageIds(representationData);
231
+ const enabledElement = getEnabledElementByViewportId(viewportId);
232
+ if (!enabledElement || !labelmapImageIds?.length) {
233
+ return;
234
+ }
235
+ const stackViewport = enabledElement.viewport;
236
+ this.updateLabelmapSegmentationReferences(segmentationId, stackViewport, labelmapImageIds, (stackViewport, segmentationId, labelmapImageIds) => {
237
+ const imageIds = stackViewport.getImageIds();
238
+ imageIds.forEach((referenceImageId, index) => {
239
+ for (const labelmapImageId of labelmapImageIds) {
240
+ const viewableImageId = stackViewport.isReferenceViewable({ referencedImageId: labelmapImageId, sliceIndex: index }, { asOverlay: true, withNavigation: true });
241
+ if (viewableImageId) {
242
+ this.stackLabelmapImageIdReferenceMap
243
+ .get(segmentationId)
244
+ .set(referenceImageId, labelmapImageId);
245
+ this.updateLabelmapImageIdReferenceMap({
246
+ segmentationId,
247
+ referenceImageId,
248
+ labelmapImageId,
249
+ });
250
+ }
251
+ }
252
+ });
253
+ });
254
+ }
255
+ updateLabelmapImageIdReferenceMap({ segmentationId, referenceImageId, labelmapImageId, }) {
256
+ const key = this.generateMapKey({ segmentationId, referenceImageId });
257
+ if (!this.labelmapImageIdReferenceMap.has(key)) {
258
+ this.setLabelmapImageIds(segmentationId, key, [labelmapImageId]);
259
+ return;
260
+ }
261
+ const currentValues = this.labelmapImageIdReferenceMap.get(key) ?? [];
262
+ const newValues = Array.from(new Set([...currentValues, labelmapImageId]));
263
+ this.setLabelmapImageIds(segmentationId, key, newValues);
264
+ }
265
+ generateMapKey({ segmentationId, referenceImageId }) {
266
+ return `${segmentationId}-${referenceImageId}`;
267
+ }
268
+ }
269
+ export default LabelmapImageReferenceResolver;
@@ -0,0 +1,15 @@
1
+ import type { Types } from '@cornerstonejs/core';
2
+ import type { Segmentation } from '../../../types/SegmentationStateTypes';
3
+ import type { LabelmapSegmentationData, LabelmapLayer } from '../../../types/LabelmapTypes';
4
+ declare function getLabelmap(segmentation: Segmentation, labelmapId: string): LabelmapLayer | undefined;
5
+ declare function getLabelmaps(segmentation: Segmentation): LabelmapLayer[];
6
+ declare function registerLabelmap(segmentation: Segmentation, layer: LabelmapLayer): void;
7
+ declare function removeLabelmap(segmentation: Segmentation, labelmapId: string): void;
8
+ declare function getOrCreateLabelmapVolume(layer: LabelmapLayer): Types.IImageVolume | undefined;
9
+ declare function getLabelmapIds(segmentation: Segmentation): string[];
10
+ declare function getLabelmapDataById(segmentation: Segmentation, labelmapId: string): LabelmapSegmentationData | undefined;
11
+ declare function getScalarArrayLengthFromLabelmap(layer: LabelmapLayer): number;
12
+ declare function getConstructorNameForLabelmap(layer: LabelmapLayer): string;
13
+ declare function getLabelmapForImageId(segmentation: Segmentation, imageId: string): LabelmapLayer | undefined;
14
+ declare function getLabelmapForVolumeId(segmentation: Segmentation, volumeId: string): LabelmapLayer | undefined;
15
+ export { getConstructorNameForLabelmap, getLabelmap, getLabelmapDataById, getLabelmapForImageId, getLabelmapForVolumeId, getLabelmapIds, getLabelmaps, getOrCreateLabelmapVolume, getScalarArrayLengthFromLabelmap, registerLabelmap, removeLabelmap, };