@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
@@ -14,7 +14,6 @@ import { getLockedSegmentIndices } from '../../stateManagement/segmentation/segm
14
14
  import { getSVGStyleForSegment } from '../../utilities/segmentation/getSVGStyleForSegment';
15
15
  import { defaultSegmentationStateManager } from '../../stateManagement/segmentation/SegmentationStateManager';
16
16
  class ContourSegmentationBaseTool extends ContourBaseTool {
17
- static { this.PreviewSegmentIndex = 255; }
18
17
  constructor(toolProps, defaultToolProps) {
19
18
  super(toolProps, defaultToolProps);
20
19
  if (this.configuration.interpolation?.enabled) {
@@ -163,4 +162,5 @@ class ContourSegmentationBaseTool extends ContourBaseTool {
163
162
  };
164
163
  }
165
164
  }
165
+ ContourSegmentationBaseTool.PreviewSegmentIndex = 255;
166
166
  export { ContourSegmentationBaseTool as default, ContourSegmentationBaseTool };
@@ -10,7 +10,6 @@ import { getOrCreateSegmentationVolume } from '../../utilities/segmentation';
10
10
  import { getCurrentLabelmapImageIdForViewport } from '../../stateManagement/segmentation/getCurrentLabelmapImageIdForViewport';
11
11
  const { transformWorldToIndex, transformIndexToWorld } = csUtils;
12
12
  class GrowCutBaseTool extends BaseTool {
13
- static { this.lastGrowCutCommand = null; }
14
13
  constructor(toolProps, defaultToolProps) {
15
14
  const baseToolProps = csUtils.deepMerge({
16
15
  configuration: {
@@ -209,7 +208,7 @@ class GrowCutBaseTool extends BaseTool {
209
208
  const derivedVolume = new ImageVolume({
210
209
  volumeId,
211
210
  dataType: volumeProps.dataType,
212
- metadata: structuredClone(volumeProps.metadata),
211
+ metadata: csUtils.deepClone(volumeProps.metadata),
213
212
  dimensions: volumeProps.dimensions,
214
213
  spacing: volumeProps.spacing,
215
214
  origin: volumeProps.origin,
@@ -276,5 +275,6 @@ class GrowCutBaseTool extends BaseTool {
276
275
  });
277
276
  }
278
277
  }
278
+ GrowCutBaseTool.lastGrowCutCommand = null;
279
279
  GrowCutBaseTool.toolName = 'GrowCutBaseTool';
280
280
  export default GrowCutBaseTool;
@@ -1,7 +1,5 @@
1
1
  import type { LabelmapSegmentationData } from '../../../types/LabelmapTypes';
2
2
  import type { LabelmapRenderingConfig } from '../../../types/SegmentationStateTypes';
3
- declare function addLabelmapToElement(element: HTMLDivElement, labelMapData: LabelmapSegmentationData, segmentationId: string, config: LabelmapRenderingConfig): Promise<void | {
4
- uid: string;
5
- actor: any;
6
- }>;
3
+ import { type LabelmapRenderPlanMountResult } from './labelmapRenderPlan';
4
+ declare function addLabelmapToElement(element: HTMLDivElement, labelMapData: LabelmapSegmentationData, segmentationId: string, config: LabelmapRenderingConfig): Promise<LabelmapRenderPlanMountResult>;
7
5
  export default addLabelmapToElement;
@@ -1,91 +1,21 @@
1
- import { getEnabledElement, addVolumesToViewports, addImageSlicesToViewports, Enums, cache, BaseVolumeViewport, volumeLoader, utilities, } from '@cornerstonejs/core';
2
- import { getCurrentLabelmapImageIdsForViewport } from '../../../stateManagement/segmentation/getCurrentLabelmapImageIdForViewport';
1
+ import { getEnabledElement } from '@cornerstonejs/core';
3
2
  import { getSegmentation } from '../../../stateManagement/segmentation/getSegmentation';
4
- import { triggerSegmentationDataModified, triggerSegmentationModified, } from '../../../stateManagement/segmentation/triggerSegmentationEvents';
5
- import { SegmentationRepresentations } from '../../../enums';
6
- import { addVolumesAsIndependentComponents } from './addVolumesAsIndependentComponents';
7
- const { uuidv4 } = utilities;
3
+ import { resolveLabelmapRenderPlan, } from './labelmapRenderPlan';
8
4
  async function addLabelmapToElement(element, labelMapData, segmentationId, config) {
9
5
  const enabledElement = getEnabledElement(element);
10
- const { renderingEngine, viewport } = enabledElement;
11
- const { id: viewportId } = viewport;
12
- const visibility = true;
13
- const immediateRender = false;
14
- const suppressEvents = true;
15
- if (viewport instanceof BaseVolumeViewport) {
16
- const volumeLabelMapData = labelMapData;
17
- const volumeId = _ensureVolumeHasVolumeId(volumeLabelMapData, segmentationId);
18
- if (!cache.getVolume(volumeId)) {
19
- await _handleMissingVolume(labelMapData);
20
- }
21
- let blendMode = config?.blendMode ?? Enums.BlendModes.MAXIMUM_INTENSITY_BLEND;
22
- let useIndependentComponents = blendMode === Enums.BlendModes.LABELMAP_EDGE_PROJECTION_BLEND;
23
- if (useIndependentComponents) {
24
- const referenceVolumeId = viewport.getVolumeId();
25
- const baseVolume = cache.getVolume(referenceVolumeId);
26
- const segVolume = cache.getVolume(volumeId);
27
- const segDims = segVolume.dimensions;
28
- const refDims = baseVolume.dimensions;
29
- if (segDims[0] !== refDims[0] ||
30
- segDims[1] !== refDims[1] ||
31
- segDims[2] !== refDims[2]) {
32
- useIndependentComponents = false;
33
- blendMode = Enums.BlendModes.MAXIMUM_INTENSITY_BLEND;
34
- console.debug('Dimensions mismatch - falling back to regular volume addition');
35
- }
36
- }
37
- const volumeInputs = [
38
- {
39
- volumeId,
40
- visibility,
41
- representationUID: `${segmentationId}-${SegmentationRepresentations.Labelmap}`,
42
- useIndependentComponents,
43
- blendMode,
44
- },
45
- ];
46
- if (!volumeInputs[0].useIndependentComponents) {
47
- await addVolumesToViewports(renderingEngine, volumeInputs, [viewportId], immediateRender, suppressEvents);
48
- }
49
- else {
50
- const result = await addVolumesAsIndependentComponents({
51
- viewport,
52
- volumeInputs,
53
- segmentationId,
54
- });
55
- return result;
56
- }
6
+ const { viewport } = enabledElement;
7
+ const segmentation = getSegmentation(segmentationId);
8
+ if (!segmentation) {
9
+ return;
57
10
  }
58
- else {
59
- const segmentationImageIds = getCurrentLabelmapImageIdsForViewport(viewport.id, segmentationId);
60
- const stackInputs = segmentationImageIds.map((imageId) => ({
61
- imageId,
62
- representationUID: `${segmentationId}-${SegmentationRepresentations.Labelmap}-${imageId}`,
63
- }));
64
- addImageSlicesToViewports(renderingEngine, stackInputs, [viewportId]);
65
- }
66
- triggerSegmentationDataModified(segmentationId);
67
- }
68
- function _ensureVolumeHasVolumeId(labelMapData, segmentationId) {
69
- let { volumeId } = labelMapData;
70
- if (!volumeId) {
71
- volumeId = uuidv4();
72
- const segmentation = getSegmentation(segmentationId);
73
- segmentation.representationData.Labelmap = {
74
- ...segmentation.representationData.Labelmap,
75
- volumeId,
76
- };
77
- labelMapData.volumeId = volumeId;
78
- triggerSegmentationModified(segmentationId);
79
- }
80
- return volumeId;
81
- }
82
- async function _handleMissingVolume(labelMapData) {
83
- const stackData = labelMapData;
84
- const hasImageIds = stackData.imageIds.length > 0;
85
- if (!hasImageIds) {
86
- throw new Error('cannot create labelmap, no imageIds found for the volume labelmap');
87
- }
88
- const volume = await volumeLoader.createAndCacheVolumeFromImages(labelMapData.volumeId || uuidv4(), stackData.imageIds);
89
- return volume;
11
+ const renderPlan = resolveLabelmapRenderPlan({
12
+ viewport,
13
+ segmentation,
14
+ representation: {
15
+ segmentationId,
16
+ config,
17
+ },
18
+ });
19
+ return renderPlan.mount({ labelMapData });
90
20
  }
91
21
  export default addLabelmapToElement;
@@ -0,0 +1,5 @@
1
+ import { type Types } from '@cornerstonejs/core';
2
+ import type { LabelmapRepresentation } from '../../../types/SegmentationStateTypes';
3
+ declare const MAX_NUMBER_COLORS = 255;
4
+ declare function setLabelmapColorAndOpacity(viewportId: string, labelmapActorEntry: Types.ActorEntry, segmentationRepresentation: LabelmapRepresentation): void;
5
+ export { MAX_NUMBER_COLORS, setLabelmapColorAndOpacity };
@@ -0,0 +1,191 @@
1
+ import { ActorRenderMode } from '@cornerstonejs/core';
2
+ import vtkPiecewiseFunction from '@kitware/vtk.js/Common/DataModel/PiecewiseFunction';
3
+ import vtkColorTransferFunction from '@kitware/vtk.js/Rendering/Core/ColorTransferFunction';
4
+ import SegmentationRepresentations from '../../../enums/SegmentationRepresentations';
5
+ import { getActiveSegmentation } from '../../../stateManagement/segmentation/activeSegmentation';
6
+ import { getActiveSegmentIndex } from '../../../stateManagement/segmentation/getActiveSegmentIndex';
7
+ import { getColorLUT } from '../../../stateManagement/segmentation/getColorLUT';
8
+ import { getSegmentation } from '../../../stateManagement/segmentation/getSegmentation';
9
+ import { internalGetHiddenSegmentIndices } from '../../../stateManagement/segmentation/helpers/internalGetHiddenSegmentIndices';
10
+ import { getSegmentBinding } from '../../../stateManagement/segmentation/helpers/labelmapSegmentationState';
11
+ import { segmentationStyle } from '../../../stateManagement/segmentation/SegmentationStyle';
12
+ import { getLabelmapForActorReference } from './volumeLabelmapImageMapper';
13
+ const actorTransferFunctions = new WeakMap();
14
+ const MAX_NUMBER_COLORS = 255;
15
+ function setLabelmapColorAndOpacity(viewportId, labelmapActorEntry, segmentationRepresentation) {
16
+ const { segmentationId } = segmentationRepresentation;
17
+ const { colorLUTIndex } = segmentationRepresentation;
18
+ const activeSegmentation = getActiveSegmentation(viewportId);
19
+ const isActiveLabelmap = activeSegmentation?.segmentationId === segmentationId;
20
+ const labelmapStyle = segmentationStyle.getStyle({
21
+ viewportId,
22
+ type: SegmentationRepresentations.Labelmap,
23
+ segmentationId,
24
+ });
25
+ const renderInactiveSegmentations = segmentationStyle.getRenderInactiveSegmentations(viewportId);
26
+ const colorLUT = getColorLUT(colorLUTIndex);
27
+ const segmentation = getSegmentation(segmentationId);
28
+ const layer = getLabelmapForActorReference(segmentation, labelmapActorEntry.referencedId);
29
+ const layerBindings = Object.keys(segmentation.segments)
30
+ .map(Number)
31
+ .map((segmentIndex) => ({
32
+ segmentIndex,
33
+ binding: getSegmentBinding(segmentation, segmentIndex),
34
+ }))
35
+ .filter((entry) => !layer || entry.binding?.labelmapId === layer.labelmapId);
36
+ const maxLabelValue = Math.max(1, ...layerBindings.map((entry) => entry.binding?.labelValue ?? entry.segmentIndex));
37
+ const numColors = Math.max(colorLUT.length, maxLabelValue + 1);
38
+ const labelValueEntries = Array.from({ length: numColors - 1 }, (_, index) => {
39
+ const labelValue = index + 1;
40
+ const segmentIndex = layer?.labelToSegmentIndex?.[labelValue] ?? labelValue;
41
+ return {
42
+ labelValue,
43
+ segmentIndex,
44
+ };
45
+ });
46
+ const { outlineWidth, renderOutline, outlineOpacity, activeSegmentOutlineWidthDelta, } = getLabelmapConfig(labelmapStyle, isActiveLabelmap);
47
+ const segmentsHidden = internalGetHiddenSegmentIndices(viewportId, {
48
+ segmentationId,
49
+ type: SegmentationRepresentations.Labelmap,
50
+ });
51
+ const labelmapActor = labelmapActorEntry.actor;
52
+ const { cfun, ofun } = getOrCreateTransferFunctions(labelmapActor);
53
+ cfun.removeAllPoints();
54
+ ofun.removeAllPoints();
55
+ const colorNodes = [
56
+ { x: 0, r: 0, g: 0, b: 0, midpoint: 0.5, sharpness: 1.0 },
57
+ ];
58
+ const opacityNodes = [{ x: 0, y: 0, midpoint: 0.5, sharpness: 1.0 }];
59
+ labelValueEntries.forEach(({ labelValue, segmentIndex }) => {
60
+ const segmentColor = colorLUT[segmentIndex];
61
+ if (!segmentColor) {
62
+ return;
63
+ }
64
+ const perSegmentStyle = segmentationStyle.getStyle({
65
+ viewportId,
66
+ type: SegmentationRepresentations.Labelmap,
67
+ segmentationId,
68
+ segmentIndex,
69
+ });
70
+ const { fillAlpha, renderFill } = getLabelmapConfig(labelmapStyle, isActiveLabelmap, perSegmentStyle);
71
+ colorNodes.push({
72
+ x: labelValue,
73
+ r: segmentColor[0] / MAX_NUMBER_COLORS,
74
+ g: segmentColor[1] / MAX_NUMBER_COLORS,
75
+ b: segmentColor[2] / MAX_NUMBER_COLORS,
76
+ midpoint: 0.5,
77
+ sharpness: 1.0,
78
+ });
79
+ if (renderFill) {
80
+ const segmentOpacity = segmentsHidden.has(segmentIndex)
81
+ ? 0
82
+ : (segmentColor[3] / 255) * fillAlpha;
83
+ opacityNodes.push({
84
+ x: labelValue,
85
+ y: segmentOpacity,
86
+ midpoint: 0.5,
87
+ sharpness: 1.0,
88
+ });
89
+ }
90
+ else {
91
+ opacityNodes.push({
92
+ x: labelValue,
93
+ y: 0.01,
94
+ midpoint: 0.5,
95
+ sharpness: 1.0,
96
+ });
97
+ }
98
+ });
99
+ cfun.setNodes(colorNodes);
100
+ ofun.setNodes(opacityNodes);
101
+ ofun.setClamping(false);
102
+ const actorMapper = labelmapActorEntry.actorMapper;
103
+ const labelmapMapper = actorMapper?.mapper
104
+ ? actorMapper.mapper
105
+ : labelmapActor.getMapper();
106
+ const { preLoad } = labelmapActor.get?.('preLoad') || { preLoad: null };
107
+ if (preLoad) {
108
+ preLoad({ cfun, ofun, actor: labelmapActor });
109
+ }
110
+ else {
111
+ labelmapActor.getProperty().setRGBTransferFunction(0, cfun);
112
+ labelmapActor.getProperty().setScalarOpacity(0, ofun);
113
+ labelmapActor.getProperty().setInterpolationTypeToNearest();
114
+ }
115
+ if (labelmapActorEntry.actorMapper?.renderMode === ActorRenderMode.VTK_IMAGE ||
116
+ labelmapActorEntry.actorMapper?.renderMode ===
117
+ ActorRenderMode.VTK_VOLUME_SLICE) {
118
+ const imageSlice = labelmapActor;
119
+ imageSlice.setForceTranslucent(true);
120
+ imageSlice.setForceOpaque(false);
121
+ imageSlice.getProperty().setUseLookupTableScalarRange(true);
122
+ }
123
+ if (renderOutline) {
124
+ labelmapActor.getProperty().setUseLabelOutline(renderOutline);
125
+ labelmapActor.getProperty().setLabelOutlineOpacity(outlineOpacity);
126
+ const activeSegmentIndex = getActiveSegmentIndex(segmentationRepresentation.segmentationId);
127
+ const outlineWidths = new Array(numColors - 1).fill(0);
128
+ labelValueEntries.forEach(({ labelValue, segmentIndex }) => {
129
+ const isHidden = segmentsHidden.has(segmentIndex);
130
+ if (isHidden) {
131
+ return;
132
+ }
133
+ outlineWidths[labelValue - 1] =
134
+ segmentIndex === activeSegmentIndex
135
+ ? outlineWidth + activeSegmentOutlineWidthDelta
136
+ : outlineWidth;
137
+ });
138
+ labelmapActor.getProperty().setLabelOutlineThickness(outlineWidths);
139
+ labelmapActor.modified();
140
+ labelmapActor.getProperty().modified();
141
+ labelmapMapper?.modified?.();
142
+ }
143
+ else {
144
+ labelmapActor
145
+ .getProperty()
146
+ .setLabelOutlineThickness(new Array(numColors - 1).fill(0));
147
+ }
148
+ const visible = isActiveLabelmap || renderInactiveSegmentations;
149
+ labelmapActor.setVisibility(visible);
150
+ labelmapActor.modified();
151
+ labelmapActor.getProperty().modified();
152
+ labelmapMapper?.modified?.();
153
+ }
154
+ function getOrCreateTransferFunctions(actor) {
155
+ const existing = actorTransferFunctions.get(actor);
156
+ if (existing) {
157
+ return existing;
158
+ }
159
+ const cfun = vtkColorTransferFunction.newInstance();
160
+ const ofun = vtkPiecewiseFunction.newInstance();
161
+ ofun.addPoint(0, 0);
162
+ const created = { cfun, ofun };
163
+ actorTransferFunctions.set(actor, created);
164
+ return created;
165
+ }
166
+ function getLabelmapConfig(labelmapConfig, isActiveLabelmap, segmentsLabelmapConfig) {
167
+ const segmentLabelmapConfig = segmentsLabelmapConfig || {};
168
+ const configToUse = {
169
+ ...labelmapConfig,
170
+ ...segmentLabelmapConfig,
171
+ };
172
+ return {
173
+ fillAlpha: isActiveLabelmap
174
+ ? configToUse.fillAlpha
175
+ : configToUse.fillAlphaInactive,
176
+ outlineWidth: isActiveLabelmap
177
+ ? configToUse.outlineWidth
178
+ : configToUse.outlineWidthInactive,
179
+ renderFill: isActiveLabelmap
180
+ ? configToUse.renderFill
181
+ : configToUse.renderFillInactive,
182
+ renderOutline: isActiveLabelmap
183
+ ? configToUse.renderOutline
184
+ : configToUse.renderOutlineInactive,
185
+ outlineOpacity: isActiveLabelmap
186
+ ? configToUse.outlineOpacity
187
+ : configToUse.outlineOpacityInactive,
188
+ activeSegmentOutlineWidthDelta: configToUse.activeSegmentOutlineWidthDelta,
189
+ };
190
+ }
191
+ export { MAX_NUMBER_COLORS, setLabelmapColorAndOpacity };
@@ -1,9 +1,10 @@
1
1
  import type { Types } from '@cornerstonejs/core';
2
2
  import type { LabelmapRepresentation } from '../../../types/SegmentationStateTypes';
3
- export declare const MAX_NUMBER_COLORS = 255;
3
+ import { MAX_NUMBER_COLORS } from './labelmapActorStyle';
4
+ export { MAX_NUMBER_COLORS };
4
5
  declare function removeRepresentation(viewportId: string, segmentationId: string, renderImmediate?: boolean): void;
5
- declare function render(viewport: Types.IStackViewport | Types.IVolumeViewport, representation: LabelmapRepresentation): Promise<void>;
6
- declare function getUpdateFunction(viewport: Types.IVolumeViewport | Types.IStackViewport): (segmentationId: string) => Promise<void> | null;
6
+ declare function render(viewport: Types.IViewport, representation: LabelmapRepresentation): Promise<void>;
7
+ declare function getUpdateFunction(_viewport: Types.IViewport): (segmentationId: string) => Promise<void> | null;
7
8
  declare const _default: {
8
9
  getUpdateFunction: typeof getUpdateFunction;
9
10
  render: typeof render;