@cornerstonejs/tools 5.0.0-beta.1 → 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 (285) 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/index.d.ts +2 -2
  18. package/dist/esm/index.js +2 -2
  19. package/dist/esm/init.js +2 -0
  20. package/dist/esm/stateManagement/annotation/FrameOfReferenceSpecificAnnotationManager.js +10 -4
  21. package/dist/esm/stateManagement/segmentation/SegmentationRenderingEngine.js +23 -20
  22. package/dist/esm/stateManagement/segmentation/SegmentationRepresentationDisplayRegistry.d.ts +12 -0
  23. package/dist/esm/stateManagement/segmentation/SegmentationRepresentationDisplayRegistry.js +7 -0
  24. package/dist/esm/stateManagement/segmentation/SegmentationStateManager.d.ts +1 -10
  25. package/dist/esm/stateManagement/segmentation/SegmentationStateManager.js +28 -149
  26. package/dist/esm/stateManagement/segmentation/addColorLUT.js +7 -1
  27. package/dist/esm/stateManagement/segmentation/getCurrentLabelmapImageIdForViewport.js +16 -1
  28. package/dist/esm/stateManagement/segmentation/helpers/clearSegmentValue.js +9 -7
  29. package/dist/esm/stateManagement/segmentation/helpers/getSegmentationActor.d.ts +1 -1
  30. package/dist/esm/stateManagement/segmentation/helpers/getSegmentationActor.js +3 -2
  31. package/dist/esm/stateManagement/segmentation/helpers/getViewportLabelmapRenderMode.d.ts +5 -0
  32. package/dist/esm/stateManagement/segmentation/helpers/getViewportLabelmapRenderMode.js +58 -0
  33. package/dist/esm/stateManagement/segmentation/helpers/labelmapImageMapperSupport.d.ts +52 -0
  34. package/dist/esm/stateManagement/segmentation/helpers/labelmapImageMapperSupport.js +246 -0
  35. package/dist/esm/stateManagement/segmentation/helpers/labelmapSegmentationState.d.ts +1 -0
  36. package/dist/esm/stateManagement/segmentation/helpers/labelmapSegmentationState.js +1 -0
  37. package/dist/esm/stateManagement/segmentation/helpers/normalizeSegmentationInput.js +12 -1
  38. package/dist/esm/stateManagement/segmentation/internalAddSegmentationRepresentation.js +3 -3
  39. package/dist/esm/stateManagement/segmentation/labelmapModel/index.d.ts +9 -0
  40. package/dist/esm/stateManagement/segmentation/labelmapModel/index.js +7 -0
  41. package/dist/esm/stateManagement/segmentation/labelmapModel/labelmapEditTransaction.d.ts +54 -0
  42. package/dist/esm/stateManagement/segmentation/labelmapModel/labelmapEditTransaction.js +224 -0
  43. package/dist/esm/stateManagement/segmentation/labelmapModel/labelmapImageIdMapping.d.ts +6 -0
  44. package/dist/esm/stateManagement/segmentation/labelmapModel/labelmapImageIdMapping.js +39 -0
  45. package/dist/esm/stateManagement/segmentation/labelmapModel/labelmapImageReferenceResolver.d.ts +23 -0
  46. package/dist/esm/stateManagement/segmentation/labelmapModel/labelmapImageReferenceResolver.js +269 -0
  47. package/dist/esm/stateManagement/segmentation/labelmapModel/labelmapLayerStore.d.ts +15 -0
  48. package/dist/esm/stateManagement/segmentation/labelmapModel/labelmapLayerStore.js +160 -0
  49. package/dist/esm/stateManagement/segmentation/labelmapModel/labelmapLegacyAdapter.d.ts +4 -0
  50. package/dist/esm/stateManagement/segmentation/labelmapModel/labelmapLegacyAdapter.js +42 -0
  51. package/dist/esm/stateManagement/segmentation/labelmapModel/labelmapSegmentBindings.d.ts +11 -0
  52. package/dist/esm/stateManagement/segmentation/labelmapModel/labelmapSegmentBindings.js +73 -0
  53. package/dist/esm/stateManagement/segmentation/labelmapModel/normalizeLabelmapSegmentationData.d.ts +17 -0
  54. package/dist/esm/stateManagement/segmentation/labelmapModel/normalizeLabelmapSegmentationData.js +75 -0
  55. package/dist/esm/stateManagement/segmentation/labelmapModel/privateLabelmap.d.ts +5 -0
  56. package/dist/esm/stateManagement/segmentation/labelmapModel/privateLabelmap.js +106 -0
  57. package/dist/esm/stateManagement/segmentation/models/SegmentModel.d.ts +11 -0
  58. package/dist/esm/stateManagement/segmentation/models/SegmentModel.js +19 -0
  59. package/dist/esm/stateManagement/segmentation/models/SegmentationModel.d.ts +12 -0
  60. package/dist/esm/stateManagement/segmentation/models/SegmentationModel.js +23 -0
  61. package/dist/esm/stateManagement/segmentation/removeSegmentationRepresentations.js +6 -10
  62. package/dist/esm/stateManagement/segmentation/segmentIndex.js +24 -0
  63. package/dist/esm/stateManagement/segmentation/segmentationEventManager.js +2 -9
  64. package/dist/esm/stateManagement/segmentation/segmentationState.d.ts +2 -1
  65. package/dist/esm/stateManagement/segmentation/segmentationState.js +4 -1
  66. package/dist/esm/store/SynchronizerManager/Synchronizer.d.ts +3 -1
  67. package/dist/esm/store/state.js +2 -1
  68. package/dist/esm/synchronizers/callbacks/imageSliceSyncCallback.js +12 -3
  69. package/dist/esm/synchronizers/callbacks/presentationViewSyncCallback.js +5 -2
  70. package/dist/esm/synchronizers/callbacks/zoomPanSyncCallback.js +51 -3
  71. package/dist/esm/synchronizers/synchronizers/createPresentationViewSynchronizer.d.ts +1 -1
  72. package/dist/esm/tools/AdvancedMagnifyTool.js +4 -1
  73. package/dist/esm/tools/CrosshairsTool.d.ts +4 -0
  74. package/dist/esm/tools/CrosshairsTool.js +95 -41
  75. package/dist/esm/tools/MagnifyTool.js +3 -1
  76. package/dist/esm/tools/OrientationControllerTool.d.ts +45 -0
  77. package/dist/esm/tools/OrientationControllerTool.js +454 -0
  78. package/dist/esm/tools/OrientationMarkerTool.js +4 -4
  79. package/dist/esm/tools/PanTool.js +26 -3
  80. package/dist/esm/tools/PlanarRotateTool.js +19 -4
  81. package/dist/esm/tools/ReferenceCursors.js +7 -1
  82. package/dist/esm/tools/SculptorTool/CircleSculptCursor.js +1 -1
  83. package/dist/esm/tools/TrackballRotateTool.js +3 -2
  84. package/dist/esm/tools/VolumeCroppingControlTool.d.ts +10 -35
  85. package/dist/esm/tools/VolumeCroppingControlTool.js +179 -699
  86. package/dist/esm/tools/VolumeCroppingTool.d.ts +34 -32
  87. package/dist/esm/tools/VolumeCroppingTool.js +813 -532
  88. package/dist/esm/tools/WindowLevelTool.d.ts +2 -1
  89. package/dist/esm/tools/WindowLevelTool.js +48 -4
  90. package/dist/esm/tools/ZoomTool.d.ts +8 -0
  91. package/dist/esm/tools/ZoomTool.js +92 -11
  92. package/dist/esm/tools/annotation/AngleTool.js +38 -32
  93. package/dist/esm/tools/annotation/ArrowAnnotateTool.js +30 -28
  94. package/dist/esm/tools/annotation/BidirectionalTool.js +51 -49
  95. package/dist/esm/tools/annotation/CircleROITool.d.ts +1 -0
  96. package/dist/esm/tools/annotation/CircleROITool.js +89 -51
  97. package/dist/esm/tools/annotation/CobbAngleTool.js +1 -1
  98. package/dist/esm/tools/annotation/DragProbeTool.js +1 -1
  99. package/dist/esm/tools/annotation/ETDRSGridTool.js +1 -1
  100. package/dist/esm/tools/annotation/EllipticalROITool.js +46 -39
  101. package/dist/esm/tools/annotation/HeightTool.js +1 -1
  102. package/dist/esm/tools/annotation/KeyImageTool.js +11 -11
  103. package/dist/esm/tools/annotation/LabelTool.js +37 -35
  104. package/dist/esm/tools/annotation/LengthTool.js +35 -33
  105. package/dist/esm/tools/annotation/LivewireContourSegmentationTool.js +6 -4
  106. package/dist/esm/tools/annotation/LivewireContourTool.js +4 -8
  107. package/dist/esm/tools/annotation/PlanarFreehandContourSegmentationTool.js +6 -4
  108. package/dist/esm/tools/annotation/PlanarFreehandROITool.js +3 -4
  109. package/dist/esm/tools/annotation/ProbeTool.js +66 -56
  110. package/dist/esm/tools/annotation/RectangleROITool.js +48 -37
  111. package/dist/esm/tools/annotation/RegionSegmentPlusTool.js +1 -1
  112. package/dist/esm/tools/annotation/RegionSegmentTool.js +1 -1
  113. package/dist/esm/tools/annotation/SplineContourSegmentationTool.js +1 -1
  114. package/dist/esm/tools/annotation/SplineROITool.js +60 -56
  115. package/dist/esm/tools/annotation/UltrasoundDirectionalTool.js +1 -1
  116. package/dist/esm/tools/annotation/UltrasoundPleuraBLineTool/UltrasoundPleuraBLineTool.js +57 -55
  117. package/dist/esm/tools/annotation/VideoRedactionTool.js +1 -1
  118. package/dist/esm/tools/base/AnnotationDisplayTool.js +9 -6
  119. package/dist/esm/tools/base/AnnotationTool.js +2 -1
  120. package/dist/esm/tools/base/BaseTool.js +16 -10
  121. package/dist/esm/tools/base/ContourSegmentationBaseTool.js +1 -1
  122. package/dist/esm/tools/base/GrowCutBaseTool.js +2 -2
  123. package/dist/esm/tools/displayTools/Labelmap/addLabelmapToElement.d.ts +2 -4
  124. package/dist/esm/tools/displayTools/Labelmap/addLabelmapToElement.js +15 -85
  125. package/dist/esm/tools/displayTools/Labelmap/labelmapActorStyle.d.ts +5 -0
  126. package/dist/esm/tools/displayTools/Labelmap/labelmapActorStyle.js +191 -0
  127. package/dist/esm/tools/displayTools/Labelmap/labelmapDisplay.d.ts +4 -3
  128. package/dist/esm/tools/displayTools/Labelmap/labelmapDisplay.js +48 -209
  129. package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/createLabelmapRenderPlan.d.ts +3 -0
  130. package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/createLabelmapRenderPlan.js +51 -0
  131. package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/index.d.ts +4 -0
  132. package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/index.js +3 -0
  133. package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/legacyVolumePlan.d.ts +14 -0
  134. package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/legacyVolumePlan.js +143 -0
  135. package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/planarGenericVolumeLabelmap.d.ts +40 -0
  136. package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/planarGenericVolumeLabelmap.js +79 -0
  137. package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/removeLabelmapRepresentationFromViewport.d.ts +3 -0
  138. package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/removeLabelmapRepresentationFromViewport.js +18 -0
  139. package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/resolveLabelmapRenderPlan.d.ts +9 -0
  140. package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/resolveLabelmapRenderPlan.js +56 -0
  141. package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/stackImagePlan.d.ts +11 -0
  142. package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/stackImagePlan.js +35 -0
  143. package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/types.d.ts +48 -0
  144. package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/types.js +0 -0
  145. package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/volumeSliceImageMapperPlan.d.ts +13 -0
  146. package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/volumeSliceImageMapperPlan.js +34 -0
  147. package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan.d.ts +2 -0
  148. package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan.js +1 -0
  149. package/dist/esm/tools/displayTools/Labelmap/labelmapRepresentationUID.d.ts +8 -0
  150. package/dist/esm/tools/displayTools/Labelmap/labelmapRepresentationUID.js +18 -0
  151. package/dist/esm/tools/displayTools/Labelmap/removeLabelmapFromElement.js +2 -2
  152. package/dist/esm/tools/displayTools/Labelmap/removeLabelmapRepresentationData.d.ts +3 -0
  153. package/dist/esm/tools/displayTools/Labelmap/removeLabelmapRepresentationData.js +16 -0
  154. package/dist/esm/tools/displayTools/Labelmap/syncStackLabelmapActors.d.ts +2 -0
  155. package/dist/esm/tools/displayTools/Labelmap/syncStackLabelmapActors.js +135 -0
  156. package/dist/esm/tools/displayTools/Labelmap/volumeLabelmapImageMapper.d.ts +16 -0
  157. package/dist/esm/tools/displayTools/Labelmap/volumeLabelmapImageMapper.js +267 -0
  158. package/dist/esm/tools/displayTools/Labelmap/volumeLabelmapSliceData.d.ts +27 -0
  159. package/dist/esm/tools/displayTools/Labelmap/volumeLabelmapSliceData.js +185 -0
  160. package/dist/esm/tools/displayTools/registerBuiltInSegmentationRepresentationDisplays.d.ts +1 -0
  161. package/dist/esm/tools/displayTools/registerBuiltInSegmentationRepresentationDisplays.js +16 -0
  162. package/dist/esm/tools/index.d.ts +2 -1
  163. package/dist/esm/tools/index.js +2 -1
  164. package/dist/esm/tools/segmentation/BrushTool.d.ts +9 -2
  165. package/dist/esm/tools/segmentation/BrushTool.js +123 -26
  166. package/dist/esm/tools/segmentation/CircleScissorsTool.js +19 -36
  167. package/dist/esm/tools/segmentation/LabelmapBaseTool.d.ts +2 -3
  168. package/dist/esm/tools/segmentation/LabelmapBaseTool.js +77 -46
  169. package/dist/esm/tools/segmentation/LabelmapEditWithContour.js +3 -3
  170. package/dist/esm/tools/segmentation/PaintFillTool.js +11 -4
  171. package/dist/esm/tools/segmentation/RectangleROIStartEndThresholdTool.d.ts +2 -0
  172. package/dist/esm/tools/segmentation/RectangleROIStartEndThresholdTool.js +16 -8
  173. package/dist/esm/tools/segmentation/RectangleScissorsTool.js +13 -6
  174. package/dist/esm/tools/segmentation/SegmentBidirectionalTool.js +63 -61
  175. package/dist/esm/tools/segmentation/SegmentSelectTool.js +4 -4
  176. package/dist/esm/tools/segmentation/SphereScissorsTool.js +11 -31
  177. package/dist/esm/tools/segmentation/strategies/BrushStrategy.d.ts +7 -0
  178. package/dist/esm/tools/segmentation/strategies/BrushStrategy.js +47 -24
  179. package/dist/esm/tools/segmentation/strategies/compositions/circularCursor.js +49 -21
  180. package/dist/esm/tools/segmentation/strategies/compositions/determineSegmentIndex.js +2 -2
  181. package/dist/esm/tools/segmentation/strategies/compositions/dynamicThreshold.js +5 -1
  182. package/dist/esm/tools/segmentation/strategies/compositions/islandRemovalComposition.js +2 -2
  183. package/dist/esm/tools/segmentation/strategies/compositions/preview.js +2 -2
  184. package/dist/esm/tools/segmentation/strategies/compositions/setValue.js +14 -6
  185. package/dist/esm/tools/segmentation/strategies/fillCircle.d.ts +3 -1
  186. package/dist/esm/tools/segmentation/strategies/fillCircle.js +38 -31
  187. package/dist/esm/tools/segmentation/strategies/fillSphere.js +11 -3
  188. package/dist/esm/tools/segmentation/strategies/utils/crossLayerErase.d.ts +4 -0
  189. package/dist/esm/tools/segmentation/strategies/utils/crossLayerErase.js +23 -0
  190. package/dist/esm/tools/segmentation/strategies/utils/getStrategyData.js +1 -1
  191. package/dist/esm/tools/segmentation/strategies/utils/handleUseSegmentCenterIndex.js +12 -11
  192. package/dist/esm/tools/segmentation/strategies/utils/labelmapOverlap.d.ts +4 -0
  193. package/dist/esm/tools/segmentation/strategies/utils/labelmapOverlap.js +41 -0
  194. package/dist/esm/tools/segmentation/strategies/utils/overwritePolicy.d.ts +3 -0
  195. package/dist/esm/tools/segmentation/strategies/utils/overwritePolicy.js +31 -0
  196. package/dist/esm/tools/segmentation/strategies/utils/segmentSeparation.d.ts +3 -0
  197. package/dist/esm/tools/segmentation/strategies/utils/segmentSeparation.js +38 -0
  198. package/dist/esm/tools/segmentation/utils/LazyBrushEditController.d.ts +19 -0
  199. package/dist/esm/tools/segmentation/utils/LazyBrushEditController.js +55 -0
  200. package/dist/esm/tools/segmentation/utils/lazyBrushPreview.d.ts +3 -0
  201. package/dist/esm/tools/segmentation/utils/lazyBrushPreview.js +34 -0
  202. package/dist/esm/tools/segmentation/utils/shouldUseLazyLabelmapEditing.d.ts +3 -0
  203. package/dist/esm/tools/segmentation/utils/shouldUseLazyLabelmapEditing.js +42 -0
  204. package/dist/esm/types/ISynchronizerEventHandler.d.ts +2 -1
  205. package/dist/esm/types/LabelmapToolOperationData.d.ts +5 -0
  206. package/dist/esm/types/LabelmapTypes.d.ts +29 -6
  207. package/dist/esm/types/SegmentationStateTypes.d.ts +6 -0
  208. package/dist/esm/utilities/calibrateImageSpacing.js +17 -2
  209. package/dist/esm/utilities/contours/AnnotationToPointData.js +1 -1
  210. package/dist/esm/utilities/draw3D/addLine3DBetweenPoints.d.ts +7 -0
  211. package/dist/esm/utilities/draw3D/addLine3DBetweenPoints.js +34 -0
  212. package/dist/esm/utilities/draw3D/calculateAdaptiveSphereRadius.d.ts +6 -0
  213. package/dist/esm/utilities/draw3D/calculateAdaptiveSphereRadius.js +7 -0
  214. package/dist/esm/utilities/draw3D/index.d.ts +2 -0
  215. package/dist/esm/utilities/draw3D/index.js +2 -0
  216. package/dist/esm/utilities/drawing/getTextBoxCoordsCanvas.js +22 -14
  217. package/dist/esm/utilities/getCenterAndRadiusInCanvas.d.ts +6 -0
  218. package/dist/esm/utilities/getCenterAndRadiusInCanvas.js +26 -0
  219. package/dist/esm/utilities/getEllipseWorldCoordinates.d.ts +2 -0
  220. package/dist/esm/utilities/getEllipseWorldCoordinates.js +26 -0
  221. package/dist/esm/utilities/getSphereBoundsInfo.js +5 -1
  222. package/dist/esm/utilities/getViewportICamera.d.ts +4 -0
  223. package/dist/esm/utilities/getViewportICamera.js +23 -0
  224. package/dist/esm/utilities/getViewportsForAnnotation.js +5 -1
  225. package/dist/esm/utilities/index.d.ts +2 -1
  226. package/dist/esm/utilities/index.js +2 -1
  227. package/dist/esm/utilities/interactionDragCoordinator.d.ts +5 -0
  228. package/dist/esm/utilities/interactionDragCoordinator.js +16 -0
  229. package/dist/esm/utilities/math/basic/BasicStatsCalculator.js +9 -7
  230. package/dist/esm/utilities/pointInSurroundingSphereCallback.js +8 -1
  231. package/dist/esm/utilities/segmentation/InterpolationManager/InterpolationManager.js +121 -118
  232. package/dist/esm/utilities/segmentation/SegmentStatsCalculator.js +5 -4
  233. package/dist/esm/utilities/segmentation/VolumetricCalculator.js +1 -1
  234. package/dist/esm/utilities/segmentation/createLabelmapVolumeForViewport.js +1 -1
  235. package/dist/esm/utilities/segmentation/getReferenceVolumeForSegmentation.js +1 -1
  236. package/dist/esm/utilities/segmentation/getReferenceVolumeForSegmentationVolume.js +11 -2
  237. package/dist/esm/utilities/segmentation/getSegmentIndexAtLabelmapBorder.js +36 -17
  238. package/dist/esm/utilities/segmentation/getSegmentIndexAtWorldPoint.js +42 -25
  239. package/dist/esm/utilities/segmentation/getUniqueSegmentIndices.js +3 -30
  240. package/dist/esm/utilities/segmentation/index.d.ts +2 -1
  241. package/dist/esm/utilities/segmentation/index.js +2 -1
  242. package/dist/esm/utilities/segmentation/utilsForWorker.js +6 -2
  243. package/dist/esm/utilities/segmentation/validateLabelmap.js +1 -1
  244. package/dist/esm/utilities/stackPrefetch/stackPrefetch.js +0 -1
  245. package/dist/esm/utilities/touch/index.js +3 -2
  246. package/dist/esm/utilities/viewportCapabilities.d.ts +16 -0
  247. package/dist/esm/utilities/viewportCapabilities.js +18 -0
  248. package/dist/esm/utilities/viewportFilters/filterViewportsWithParallelNormals.d.ts +1 -1
  249. package/dist/esm/utilities/viewportFilters/filterViewportsWithParallelNormals.js +12 -4
  250. package/dist/esm/utilities/viewportFilters/filterViewportsWithSameOrientation.d.ts +1 -1
  251. package/dist/esm/utilities/viewportFilters/filterViewportsWithSameOrientation.js +11 -4
  252. package/dist/esm/utilities/viewportFilters/getViewportIdsWithToolToRender.js +1 -1
  253. package/dist/esm/utilities/viewportPresentation.d.ts +3 -0
  254. package/dist/esm/utilities/viewportPresentation.js +26 -0
  255. package/dist/esm/utilities/volumeCropping/computePlanePlaneIntersection.d.ts +6 -0
  256. package/dist/esm/utilities/volumeCropping/computePlanePlaneIntersection.js +37 -0
  257. package/dist/esm/utilities/volumeCropping/constants.d.ts +31 -0
  258. package/dist/esm/utilities/volumeCropping/constants.js +31 -0
  259. package/dist/esm/utilities/volumeCropping/copyClippingPlanes.d.ts +2 -0
  260. package/dist/esm/utilities/volumeCropping/copyClippingPlanes.js +6 -0
  261. package/dist/esm/utilities/volumeCropping/extractVolumeDirectionVectors.d.ts +9 -0
  262. package/dist/esm/utilities/volumeCropping/extractVolumeDirectionVectors.js +9 -0
  263. package/dist/esm/utilities/volumeCropping/findLineBoundsIntersection.d.ts +5 -0
  264. package/dist/esm/utilities/volumeCropping/findLineBoundsIntersection.js +50 -0
  265. package/dist/esm/utilities/volumeCropping/getColorKeyForPlaneIndex.d.ts +1 -0
  266. package/dist/esm/utilities/volumeCropping/getColorKeyForPlaneIndex.js +13 -0
  267. package/dist/esm/utilities/volumeCropping/getOrientationFromNormal.d.ts +2 -0
  268. package/dist/esm/utilities/volumeCropping/getOrientationFromNormal.js +19 -0
  269. package/dist/esm/utilities/volumeCropping/index.d.ts +9 -0
  270. package/dist/esm/utilities/volumeCropping/index.js +9 -0
  271. package/dist/esm/utilities/volumeCropping/parseCornerKey.d.ts +8 -0
  272. package/dist/esm/utilities/volumeCropping/parseCornerKey.js +11 -0
  273. package/dist/esm/utilities/volumeCropping/types.d.ts +5 -0
  274. package/dist/esm/utilities/volumeCropping/types.js +0 -0
  275. package/dist/esm/utilities/vtkjs/AnnotatedRhombicuboctahedronActor/index.d.ts +31 -0
  276. package/dist/esm/utilities/vtkjs/AnnotatedRhombicuboctahedronActor/index.js +391 -0
  277. package/dist/esm/utilities/vtkjs/OrientationControllerWidget/index.d.ts +69 -0
  278. package/dist/esm/utilities/vtkjs/OrientationControllerWidget/index.js +804 -0
  279. package/dist/esm/utilities/vtkjs/RhombicuboctahedronSource/index.d.ts +7 -0
  280. package/dist/esm/utilities/vtkjs/RhombicuboctahedronSource/index.js +144 -0
  281. package/dist/esm/utilities/vtkjs/index.d.ts +3 -0
  282. package/dist/esm/utilities/vtkjs/index.js +3 -0
  283. package/dist/esm/version.d.ts +1 -1
  284. package/dist/esm/version.js +1 -1
  285. package/package.json +10 -9
@@ -0,0 +1,454 @@
1
+ import { BaseTool } from './base';
2
+ import { getEnabledElementByIds, Enums, eventTarget, } from '@cornerstonejs/core';
3
+ import { getToolGroup } from '../store/ToolGroupManager';
4
+ import * as ToolsEnums from '../enums';
5
+ import { vec3, mat4, quat } from 'gl-matrix';
6
+ import { vtkOrientationControllerWidget } from '../utilities/vtkjs/OrientationControllerWidget';
7
+ const ADD_MARKER_DELAY_MS = 500;
8
+ const POSITION_RETRY_DELAY_MS = 1000;
9
+ const FACE_COLOR_SCHEMES = {
10
+ marker: {
11
+ topBottom: [0, 0, 255],
12
+ frontBack: [0, 255, 255],
13
+ leftRight: [255, 255, 0],
14
+ },
15
+ gray: {
16
+ topBottom: [180, 180, 180],
17
+ frontBack: [180, 180, 180],
18
+ leftRight: [180, 180, 180],
19
+ },
20
+ rgy: {
21
+ topBottom: [255, 0, 0],
22
+ frontBack: [0, 255, 0],
23
+ leftRight: [255, 255, 0],
24
+ },
25
+ };
26
+ const LETTER_COLOR_SCHEMES = {
27
+ mixed: {
28
+ zMinus: [255, 255, 255],
29
+ zPlus: [255, 255, 255],
30
+ yMinus: [255, 255, 255],
31
+ yPlus: [255, 255, 255],
32
+ xMinus: [0, 0, 0],
33
+ xPlus: [0, 0, 0],
34
+ },
35
+ rgy: {
36
+ zMinus: [255, 255, 255],
37
+ zPlus: [255, 255, 255],
38
+ yMinus: [255, 255, 255],
39
+ yPlus: [255, 255, 255],
40
+ xMinus: [0, 0, 0],
41
+ xPlus: [0, 0, 0],
42
+ },
43
+ white: {
44
+ zMinus: [255, 255, 255],
45
+ zPlus: [255, 255, 255],
46
+ yMinus: [255, 255, 255],
47
+ yPlus: [255, 255, 255],
48
+ xMinus: [255, 255, 255],
49
+ xPlus: [255, 255, 255],
50
+ },
51
+ black: {
52
+ zMinus: [0, 0, 0],
53
+ zPlus: [0, 0, 0],
54
+ yMinus: [0, 0, 0],
55
+ yPlus: [0, 0, 0],
56
+ xMinus: [0, 0, 0],
57
+ xPlus: [0, 0, 0],
58
+ },
59
+ };
60
+ const DEFAULT_FACE_COLOR_SCHEME = 'rgy';
61
+ const DEFAULT_LETTER_COLOR_SCHEME = 'mixed';
62
+ const ANIMATE_RESET_CAMERA_OPTIONS = {
63
+ resetZoom: false,
64
+ resetPan: true,
65
+ resetToCenter: true,
66
+ };
67
+ class OrientationControllerTool extends BaseTool {
68
+ constructor(toolProps = {}, defaultToolProps = {
69
+ supportedInteractionTypes: ['Mouse'],
70
+ configuration: {
71
+ enabled: true,
72
+ opacity: 1.0,
73
+ size: 0.04,
74
+ position: 'bottom-right',
75
+ colorScheme: 'rgy',
76
+ letterColorScheme: 'mixed',
77
+ showEdgeFaces: true,
78
+ showCornerFaces: true,
79
+ keepOrientationUp: true,
80
+ highlightColor: [255, 255, 255],
81
+ edgeColor: [200, 200, 200],
82
+ cornerColor: [150, 150, 150],
83
+ restingAmbient: 1.0,
84
+ hoverAmbient: 1.0,
85
+ },
86
+ }) {
87
+ super(toolProps, defaultToolProps);
88
+ this.widget = new vtkOrientationControllerWidget();
89
+ this.resizeObservers = new Map();
90
+ this.cameraHandlers = new Map();
91
+ this.animationFrameHandles = new Map();
92
+ this.animationTokens = new Map();
93
+ this._getViewportsInfo = () => {
94
+ const viewports = getToolGroup(this.toolGroupId)?.viewportsInfo;
95
+ return viewports || [];
96
+ };
97
+ this.onSetToolConfiguration = () => {
98
+ const viewportsInfo = this._getViewportsInfo();
99
+ const hasActiveMarkers = viewportsInfo.some(({ viewportId }) => {
100
+ return this.widget.getActors(viewportId) !== null;
101
+ });
102
+ if (hasActiveMarkers) {
103
+ this.removeMarkers();
104
+ this.addMarkers();
105
+ }
106
+ };
107
+ this.onViewportAdded = (evt) => {
108
+ const { viewportId, renderingEngineId, toolGroupId } = evt.detail;
109
+ if (toolGroupId !== this.toolGroupId) {
110
+ return;
111
+ }
112
+ if (this.widget.getActors(viewportId)) {
113
+ return;
114
+ }
115
+ setTimeout(() => {
116
+ this.addMarkerToViewport(viewportId, renderingEngineId);
117
+ }, ADD_MARKER_DELAY_MS);
118
+ };
119
+ this.onViewportRemoved = (evt) => {
120
+ const { viewportId, renderingEngineId, toolGroupId } = evt.detail;
121
+ if (toolGroupId !== this.toolGroupId) {
122
+ return;
123
+ }
124
+ const enabledElement = getEnabledElementByIds(viewportId, renderingEngineId);
125
+ if (enabledElement) {
126
+ const { viewport } = enabledElement;
127
+ if (viewport.isOrientationChangeable()) {
128
+ this.widget.removeActorsFromViewport(viewportId, viewport);
129
+ }
130
+ const cameraHandler = this.cameraHandlers.get(viewportId);
131
+ if (cameraHandler) {
132
+ viewport.element.removeEventListener(Enums.Events.CAMERA_MODIFIED, cameraHandler);
133
+ this.cameraHandlers.delete(viewportId);
134
+ }
135
+ }
136
+ this.widget.cleanup(viewportId);
137
+ const resizeObserver = this.resizeObservers.get(viewportId);
138
+ if (resizeObserver) {
139
+ resizeObserver.disconnect();
140
+ this.resizeObservers.delete(viewportId);
141
+ }
142
+ };
143
+ this.addMarkers = () => {
144
+ const viewportsInfo = this._getViewportsInfo();
145
+ viewportsInfo.forEach(({ viewportId, renderingEngineId }) => {
146
+ const enabledElement = getEnabledElementByIds(viewportId, renderingEngineId);
147
+ if (!enabledElement) {
148
+ return;
149
+ }
150
+ const { viewport } = enabledElement;
151
+ if (!viewport.isOrientationChangeable()) {
152
+ return;
153
+ }
154
+ if (this.widget.getActors(viewportId)) {
155
+ return;
156
+ }
157
+ setTimeout(() => {
158
+ this.addMarkerToViewport(viewportId, renderingEngineId);
159
+ }, ADD_MARKER_DELAY_MS);
160
+ });
161
+ };
162
+ this.onCameraModified = (evt) => {
163
+ const { viewportId } = evt.detail;
164
+ if (!viewportId) {
165
+ return;
166
+ }
167
+ const actors = this.widget.getActors(viewportId);
168
+ if (!actors) {
169
+ return;
170
+ }
171
+ const viewportsInfo = this._getViewportsInfo();
172
+ const viewportInfo = viewportsInfo.find((vp) => vp.viewportId === viewportId);
173
+ if (!viewportInfo) {
174
+ return;
175
+ }
176
+ const enabledElement = getEnabledElementByIds(viewportId, viewportInfo.renderingEngineId);
177
+ if (!enabledElement) {
178
+ return;
179
+ }
180
+ const { viewport } = enabledElement;
181
+ if (!viewport.isOrientationChangeable()) {
182
+ return;
183
+ }
184
+ const volumeViewport = viewport;
185
+ this.widget.positionActors(volumeViewport, actors, this.getPositionConfig());
186
+ this.widget.syncOverlayViewport(viewportId, volumeViewport);
187
+ viewport.render();
188
+ };
189
+ }
190
+ getPositionConfig() {
191
+ return {
192
+ position: this.configuration.position || 'bottom-right',
193
+ size: this.configuration.size || 0.04,
194
+ };
195
+ }
196
+ getFaceColors() {
197
+ const colorScheme = this.configuration.colorScheme || 'rgy';
198
+ if (this.configuration.faceColors) {
199
+ const provided = this.configuration.faceColors;
200
+ if (provided.topBottom && provided.frontBack && provided.leftRight) {
201
+ return {
202
+ topBottom: provided.topBottom,
203
+ frontBack: provided.frontBack,
204
+ leftRight: provided.leftRight,
205
+ };
206
+ }
207
+ }
208
+ return (FACE_COLOR_SCHEMES[colorScheme] ??
209
+ FACE_COLOR_SCHEMES[DEFAULT_FACE_COLOR_SCHEME]);
210
+ }
211
+ getLetterColors() {
212
+ const letterColorScheme = this.configuration.letterColorScheme || 'mixed';
213
+ return (LETTER_COLOR_SCHEMES[letterColorScheme] ??
214
+ LETTER_COLOR_SCHEMES[DEFAULT_LETTER_COLOR_SCHEME]);
215
+ }
216
+ onSetToolEnabled() {
217
+ this.removeMarkers();
218
+ this.addMarkers();
219
+ eventTarget.addEventListener(ToolsEnums.Events.TOOLGROUP_VIEWPORT_ADDED, this.onViewportAdded);
220
+ eventTarget.addEventListener(ToolsEnums.Events.TOOLGROUP_VIEWPORT_REMOVED, this.onViewportRemoved);
221
+ }
222
+ onSetToolDisabled() {
223
+ this.removeMarkers();
224
+ eventTarget.removeEventListener(ToolsEnums.Events.TOOLGROUP_VIEWPORT_ADDED, this.onViewportAdded);
225
+ eventTarget.removeEventListener(ToolsEnums.Events.TOOLGROUP_VIEWPORT_REMOVED, this.onViewportRemoved);
226
+ }
227
+ removeMarkers() {
228
+ const viewportsInfo = this._getViewportsInfo();
229
+ viewportsInfo.forEach(({ viewportId, renderingEngineId }) => {
230
+ const enabledElement = getEnabledElementByIds(viewportId, renderingEngineId);
231
+ if (enabledElement) {
232
+ const { viewport } = enabledElement;
233
+ if (viewport.isOrientationChangeable()) {
234
+ this.widget.removeActorsFromViewport(viewportId, viewport);
235
+ }
236
+ const cameraHandler = this.cameraHandlers.get(viewportId);
237
+ if (cameraHandler) {
238
+ viewport.element.removeEventListener(Enums.Events.CAMERA_MODIFIED, cameraHandler);
239
+ this.cameraHandlers.delete(viewportId);
240
+ }
241
+ }
242
+ const resizeObserver = this.resizeObservers.get(viewportId);
243
+ if (resizeObserver) {
244
+ resizeObserver.disconnect();
245
+ this.resizeObservers.delete(viewportId);
246
+ }
247
+ });
248
+ this.widget.cleanup();
249
+ this.resizeObservers.forEach((observer) => observer.disconnect());
250
+ this.resizeObservers.clear();
251
+ this.cameraHandlers.clear();
252
+ this.animationFrameHandles.forEach((handle) => cancelAnimationFrame(handle));
253
+ this.animationFrameHandles.clear();
254
+ this.animationTokens.clear();
255
+ }
256
+ createAnnotatedRhombActor() {
257
+ const faceColors = this.getFaceColors();
258
+ const letterColors = this.getLetterColors();
259
+ return this.widget.createActors({
260
+ faceColors,
261
+ letterColors,
262
+ opacity: this.configuration.opacity ?? 1.0,
263
+ showEdgeFaces: this.configuration.showEdgeFaces !== false,
264
+ showCornerFaces: this.configuration.showCornerFaces !== false,
265
+ highlightColor: this.configuration.highlightColor ?? [255, 255, 255],
266
+ edgeColor: this.configuration.edgeColor ?? [200, 200, 200],
267
+ cornerColor: this.configuration.cornerColor ?? [150, 150, 150],
268
+ restingAmbient: this.configuration.restingAmbient ?? 1.0,
269
+ hoverAmbient: this.configuration.hoverAmbient ?? 1.0,
270
+ });
271
+ }
272
+ addMarkerToViewport(viewportId, renderingEngineId) {
273
+ if (this.widget.getActors(viewportId)) {
274
+ return;
275
+ }
276
+ const enabledElement = getEnabledElementByIds(viewportId, renderingEngineId);
277
+ if (!enabledElement) {
278
+ console.warn('OrientationControllerTool: No enabled element found');
279
+ return;
280
+ }
281
+ const { viewport } = enabledElement;
282
+ if (!viewport.isOrientationChangeable()) {
283
+ console.warn('OrientationControllerTool: Viewport does not support orientation changes');
284
+ return;
285
+ }
286
+ const element = viewport.element;
287
+ const volumeViewport = viewport;
288
+ const actors = this.createAnnotatedRhombActor();
289
+ this.widget.addActorsToViewport(viewportId, volumeViewport, actors);
290
+ const positioned = this.widget.positionActors(volumeViewport, actors, this.getPositionConfig());
291
+ if (!positioned) {
292
+ console.warn('OrientationControllerTool: Initial positioning failed, retrying...');
293
+ setTimeout(() => {
294
+ const repositioned = this.widget.positionActors(volumeViewport, actors, this.getPositionConfig());
295
+ if (repositioned) {
296
+ viewport.render();
297
+ }
298
+ else {
299
+ console.error('OrientationControllerTool: Retry positioning also failed');
300
+ }
301
+ }, POSITION_RETRY_DELAY_MS);
302
+ }
303
+ else {
304
+ viewport.render();
305
+ }
306
+ this.widget.syncOverlayViewport(viewportId, volumeViewport);
307
+ this.widget.setupPicker(viewportId, actors);
308
+ this.widget.setupMouseHandlers(viewportId, element, volumeViewport, actors, {
309
+ onFacePicked: (result) => {
310
+ const orientation = this.widget.getOrientationForFace(result.cellId);
311
+ if (orientation) {
312
+ this.animateCameraToOrientation(volumeViewport, orientation.viewPlaneNormal, orientation.viewUp);
313
+ }
314
+ },
315
+ onFaceHover: (result) => {
316
+ if (result) {
317
+ this.widget.highlightFace(result.pickedActor, result.cellId, volumeViewport, result.actorIndex === 0);
318
+ }
319
+ else {
320
+ this.widget.clearHighlight();
321
+ }
322
+ },
323
+ });
324
+ const resizeObserver = new ResizeObserver(() => {
325
+ this.updateMarkerPosition(viewportId, renderingEngineId);
326
+ });
327
+ resizeObserver.observe(element);
328
+ this.resizeObservers.set(viewportId, resizeObserver);
329
+ const cameraHandler = (evt) => {
330
+ const detail = evt.detail;
331
+ if (detail.viewportId === viewportId) {
332
+ this.onCameraModified(evt);
333
+ }
334
+ };
335
+ element.addEventListener(Enums.Events.CAMERA_MODIFIED, cameraHandler);
336
+ this.cameraHandlers.set(viewportId, cameraHandler);
337
+ }
338
+ updateMarkerPosition(viewportId, renderingEngineId) {
339
+ const enabledElement = getEnabledElementByIds(viewportId, renderingEngineId);
340
+ if (!enabledElement) {
341
+ return;
342
+ }
343
+ const actors = this.widget.getActors(viewportId);
344
+ if (!actors) {
345
+ return;
346
+ }
347
+ const { viewport } = enabledElement;
348
+ if (!viewport.isOrientationChangeable()) {
349
+ return;
350
+ }
351
+ this.widget.positionActors(viewport, actors, this.getPositionConfig());
352
+ this.widget.syncOverlayViewport(viewportId, viewport);
353
+ viewport.render();
354
+ }
355
+ animateCameraToOrientation(viewport, targetViewPlaneNormal, targetViewUp) {
356
+ const viewportId = viewport.id;
357
+ const existingHandle = this.animationFrameHandles.get(viewportId);
358
+ if (existingHandle !== undefined) {
359
+ cancelAnimationFrame(existingHandle);
360
+ this.animationFrameHandles.delete(viewportId);
361
+ }
362
+ const nextToken = (this.animationTokens.get(viewportId) ?? 0) + 1;
363
+ this.animationTokens.set(viewportId, nextToken);
364
+ const keepOrientationUp = this.configuration.keepOrientationUp !== false;
365
+ const renderer = viewport.getRenderer();
366
+ const camera = renderer.getActiveCamera();
367
+ const directionOfProjection = camera.getDirectionOfProjection();
368
+ const startViewUpArray = camera.getViewUp();
369
+ const startForward = vec3.fromValues(-directionOfProjection[0], -directionOfProjection[1], -directionOfProjection[2]);
370
+ const startUp = vec3.fromValues(startViewUpArray[0], startViewUpArray[1], startViewUpArray[2]);
371
+ const startRight = vec3.create();
372
+ vec3.cross(startRight, startUp, startForward);
373
+ vec3.normalize(startRight, startRight);
374
+ const startMatrix = mat4.fromValues(startRight[0], startRight[1], startRight[2], 0, startUp[0], startUp[1], startUp[2], 0, startForward[0], startForward[1], startForward[2], 0, 0, 0, 0, 1);
375
+ const targetForward = vec3.normalize(vec3.create(), targetViewPlaneNormal);
376
+ let targetUp;
377
+ if (keepOrientationUp) {
378
+ targetUp = vec3.fromValues(targetViewUp[0], targetViewUp[1], targetViewUp[2]);
379
+ }
380
+ else {
381
+ const currentFwd = vec3.normalize(vec3.create(), startForward);
382
+ const rotQuat = quat.create();
383
+ quat.rotationTo(rotQuat, currentFwd, targetForward);
384
+ targetUp = vec3.create();
385
+ vec3.transformQuat(targetUp, startUp, rotQuat);
386
+ vec3.normalize(targetUp, targetUp);
387
+ }
388
+ const upDotForward = vec3.dot(targetUp, targetForward);
389
+ vec3.scaleAndAdd(targetUp, targetUp, targetForward, -upDotForward);
390
+ if (vec3.length(targetUp) < 0.0001) {
391
+ targetUp = vec3.clone(startUp);
392
+ const fallbackDot = vec3.dot(targetUp, targetForward);
393
+ vec3.scaleAndAdd(targetUp, targetUp, targetForward, -fallbackDot);
394
+ }
395
+ vec3.normalize(targetUp, targetUp);
396
+ const targetRight = vec3.create();
397
+ vec3.cross(targetRight, targetUp, targetForward);
398
+ vec3.normalize(targetRight, targetRight);
399
+ vec3.cross(targetUp, targetForward, targetRight);
400
+ vec3.normalize(targetUp, targetUp);
401
+ const targetMatrix = mat4.fromValues(targetRight[0], targetRight[1], targetRight[2], 0, targetUp[0], targetUp[1], targetUp[2], 0, targetForward[0], targetForward[1], targetForward[2], 0, 0, 0, 0, 1);
402
+ const startQuat = mat4.getRotation(quat.create(), startMatrix);
403
+ const targetQuat = mat4.getRotation(quat.create(), targetMatrix);
404
+ let dotProduct = quat.dot(startQuat, targetQuat);
405
+ if (dotProduct < 0) {
406
+ quat.scale(targetQuat, targetQuat, -1);
407
+ dotProduct = -dotProduct;
408
+ }
409
+ const threshold = 0.99996;
410
+ if (dotProduct > threshold) {
411
+ return;
412
+ }
413
+ const duration = 150;
414
+ const animationStart = performance.now();
415
+ const finalNormal = [
416
+ targetForward[0],
417
+ targetForward[1],
418
+ targetForward[2],
419
+ ];
420
+ const finalUp = [targetUp[0], targetUp[1], targetUp[2]];
421
+ const animate = (now) => {
422
+ if (this.animationTokens.get(viewportId) !== nextToken) {
423
+ return;
424
+ }
425
+ const elapsed = now - animationStart;
426
+ const t = Math.min(1, elapsed / duration);
427
+ const isLastStep = t >= 1;
428
+ const easedT = t < 0.5 ? 2 * t * t : 1 - Math.pow(-2 * t + 2, 2) / 2;
429
+ const interpolatedQuat = quat.create();
430
+ quat.slerp(interpolatedQuat, startQuat, targetQuat, easedT);
431
+ const interpolatedMatrix = mat4.create();
432
+ mat4.fromQuat(interpolatedMatrix, interpolatedQuat);
433
+ const interpolatedForward = interpolatedMatrix.slice(8, 11);
434
+ const interpolatedUp = interpolatedMatrix.slice(4, 7);
435
+ viewport.setCamera({
436
+ viewPlaneNormal: isLastStep ? finalNormal : interpolatedForward,
437
+ viewUp: isLastStep ? finalUp : interpolatedUp,
438
+ });
439
+ viewport.resetCamera(ANIMATE_RESET_CAMERA_OPTIONS);
440
+ viewport.render();
441
+ if (!isLastStep) {
442
+ const handle = requestAnimationFrame(animate);
443
+ this.animationFrameHandles.set(viewportId, handle);
444
+ }
445
+ else {
446
+ this.animationFrameHandles.delete(viewportId);
447
+ }
448
+ };
449
+ const handle = requestAnimationFrame(animate);
450
+ this.animationFrameHandles.set(viewportId, handle);
451
+ }
452
+ }
453
+ OrientationControllerTool.toolName = 'OrientationControllerTool';
454
+ export default OrientationControllerTool;
@@ -17,10 +17,6 @@ var OverlayMarkerType;
17
17
  OverlayMarkerType[OverlayMarkerType["CUSTOM"] = 3] = "CUSTOM";
18
18
  })(OverlayMarkerType || (OverlayMarkerType = {}));
19
19
  class OrientationMarkerTool extends BaseTool {
20
- static { this.CUBE = 1; }
21
- static { this.AXIS = 2; }
22
- static { this.VTPFILE = 3; }
23
- static { this.OVERLAY_MARKER_TYPES = OverlayMarkerType; }
24
20
  constructor(toolProps = {}, defaultToolProps = {
25
21
  configuration: {
26
22
  orientationWidget: {
@@ -282,5 +278,9 @@ class OrientationMarkerTool extends BaseTool {
282
278
  return axes;
283
279
  }
284
280
  }
281
+ OrientationMarkerTool.CUBE = 1;
282
+ OrientationMarkerTool.AXIS = 2;
283
+ OrientationMarkerTool.VTPFILE = 3;
284
+ OrientationMarkerTool.OVERLAY_MARKER_TYPES = OverlayMarkerType;
285
285
  OrientationMarkerTool.toolName = 'OrientationMarker';
286
286
  export default OrientationMarkerTool;
@@ -1,5 +1,5 @@
1
1
  import { BaseTool } from './base';
2
- import { getEnabledElement, utilities as csUtils } from '@cornerstonejs/core';
2
+ import { getEnabledElement, utilities as csUtils, viewportHasPan, } from '@cornerstonejs/core';
3
3
  class PanTool extends BaseTool {
4
4
  constructor(toolProps = {}, defaultToolProps = {
5
5
  supportedInteractionTypes: ['Mouse', 'Touch'],
@@ -7,7 +7,7 @@ class PanTool extends BaseTool {
7
7
  limitToViewport: false,
8
8
  ignoreX: false,
9
9
  ignoreY: false,
10
- ignoreZ: false
10
+ ignoreZ: false,
11
11
  },
12
12
  }) {
13
13
  super(toolProps, defaultToolProps);
@@ -92,7 +92,19 @@ class PanTool extends BaseTool {
92
92
  deltaPointsWorld[2] = 0;
93
93
  }
94
94
  const viewport = enabledElement.viewport;
95
- const camera = viewport.getCamera();
95
+ const camera = getLegacyCamera(viewport);
96
+ if (!hasLegacyCameraPosition(camera)) {
97
+ if (!viewportHasPan(viewport)) {
98
+ return;
99
+ }
100
+ const pan = viewport.getPan();
101
+ viewport.setPan([
102
+ pan[0] + deltaPointsCanvas[0],
103
+ pan[1] + deltaPointsCanvas[1],
104
+ ]);
105
+ viewport.render();
106
+ return;
107
+ }
96
108
  const { focalPoint, position } = camera;
97
109
  if (this.configuration.limitToViewport &&
98
110
  !this._checkImageInViewport(viewport, deltaPointsCanvas)) {
@@ -115,5 +127,16 @@ class PanTool extends BaseTool {
115
127
  viewport.render();
116
128
  }
117
129
  }
130
+ function getLegacyCamera(viewport) {
131
+ const maybeViewport = viewport;
132
+ return typeof maybeViewport.getCamera === 'function'
133
+ ? maybeViewport.getCamera()
134
+ : undefined;
135
+ }
136
+ function hasLegacyCameraPosition(camera) {
137
+ return Boolean(camera &&
138
+ Array.isArray(camera.focalPoint) &&
139
+ Array.isArray(camera.position));
140
+ }
118
141
  PanTool.toolName = 'Pan';
119
142
  export default PanTool;
@@ -2,6 +2,8 @@ import { BaseVolumeViewport, getEnabledElement } from '@cornerstonejs/core';
2
2
  import { mat4, vec3 } from 'gl-matrix';
3
3
  import { BaseTool } from './base';
4
4
  import angleBetweenLines from '../utilities/math/angle/angleBetweenLines';
5
+ import getViewportICamera from '../utilities/getViewportICamera';
6
+ import { applyViewportPresentation, getViewportPresentation, } from '../utilities/viewportPresentation';
5
7
  class PlanarRotateTool extends BaseTool {
6
8
  constructor(toolProps = {}, defaultToolProps = {
7
9
  supportedInteractionTypes: ['Mouse', 'Touch'],
@@ -24,13 +26,16 @@ class PlanarRotateTool extends BaseTool {
24
26
  const startPointWorld = startPoints.world;
25
27
  const enabledElement = getEnabledElement(element);
26
28
  const { viewport } = enabledElement;
27
- const camera = viewport.getCamera();
29
+ const camera = getViewportICamera(viewport);
28
30
  const width = element.clientWidth;
29
31
  const height = element.clientHeight;
30
32
  const centerCanvas = [width * 0.5, height * 0.5];
31
33
  const centerWorld = viewport.canvasToWorld(centerCanvas);
32
34
  let angle = angleBetweenLines([startPointWorld, centerWorld], [centerWorld, currentPointWorld]);
33
35
  const { viewPlaneNormal } = camera;
36
+ if (!viewPlaneNormal) {
37
+ return;
38
+ }
34
39
  const v1 = vec3.sub(vec3.create(), centerWorld, startPointWorld);
35
40
  const v2 = vec3.sub(vec3.create(), centerWorld, currentPointWorld);
36
41
  const cross = vec3.cross(vec3.create(), v1, v2);
@@ -43,7 +48,10 @@ class PlanarRotateTool extends BaseTool {
43
48
  this.setAngle(viewport, angle);
44
49
  }
45
50
  setAngle(viewport, angle) {
46
- const { viewPlaneNormal, viewUp } = viewport.getCamera();
51
+ const { viewPlaneNormal, viewUp } = getViewportICamera(viewport);
52
+ if (!viewPlaneNormal || !viewUp) {
53
+ return;
54
+ }
47
55
  if (viewport instanceof BaseVolumeViewport) {
48
56
  const rotAngle = (((angle + 360) % 360) * Math.PI) / 180;
49
57
  const rotMat = mat4.identity(new Float32Array(16));
@@ -52,10 +60,17 @@ class PlanarRotateTool extends BaseTool {
52
60
  viewport.setCamera({ viewUp: rotatedViewUp });
53
61
  }
54
62
  else {
55
- const { rotation } = viewport.getViewPresentation();
56
- viewport.setViewPresentation({
63
+ const presentation = getViewportPresentation(viewport);
64
+ if (!presentation) {
65
+ return;
66
+ }
67
+ const { rotation = 0 } = presentation;
68
+ const didApply = applyViewportPresentation(viewport, {
57
69
  rotation: (rotation + angle + 360) % 360,
58
70
  });
71
+ if (!didApply) {
72
+ return;
73
+ }
59
74
  }
60
75
  viewport.render();
61
76
  }
@@ -96,7 +96,13 @@ class ReferenceCursors extends AnnotationDisplayTool {
96
96
  };
97
97
  this.onCameraModified = (evt) => {
98
98
  const eventDetail = evt.detail;
99
- const { element, previousCamera, camera } = eventDetail;
99
+ const { previousCamera, camera } = eventDetail;
100
+ const element = eventDetail.element ||
101
+ evt.currentTarget ||
102
+ evt.target;
103
+ if (!element || !previousCamera) {
104
+ return;
105
+ }
100
106
  const enabledElement = getEnabledElement(element);
101
107
  const viewport = enabledElement.viewport;
102
108
  if (element !== this._elementWithCursor) {
@@ -11,7 +11,6 @@ class CircleSculptCursor {
11
11
  maxToolSize: null,
12
12
  };
13
13
  }
14
- static { this.shapeName = 'Circle'; }
15
14
  renderShape(svgDrawingHelper, canvasLocation, options) {
16
15
  const circleUID = '0';
17
16
  drawCircleSvg(svgDrawingHelper, 'SculptorTool', circleUID, canvasLocation, this.toolInfo.toolSize, options);
@@ -74,4 +73,5 @@ class CircleSculptCursor {
74
73
  return vec3.distance(point, mousePoint) < this.toolInfo.radius;
75
74
  }
76
75
  }
76
+ CircleSculptCursor.shapeName = 'Circle';
77
77
  export default CircleSculptCursor;
@@ -4,6 +4,7 @@ import { eventTarget, getEnabledElement, getEnabledElementByIds, } from '@corner
4
4
  import { mat4, vec3 } from 'gl-matrix';
5
5
  import { BaseTool } from './base';
6
6
  import { getToolGroup } from '../store/ToolGroupManager';
7
+ import { applyViewportPresentation, getViewportPresentation, } from '../utilities/viewportPresentation';
7
8
  class TrackballRotateTool extends BaseTool {
8
9
  constructor(toolProps = {}, defaultToolProps = {
9
10
  supportedInteractionTypes: ['Mouse', 'Touch'],
@@ -64,9 +65,9 @@ class TrackballRotateTool extends BaseTool {
64
65
  return;
65
66
  }
66
67
  const { viewport } = element;
67
- const viewPresentation = viewport.getViewPresentation();
68
+ const viewPresentation = getViewportPresentation(viewport);
68
69
  viewport.resetCamera();
69
- viewport.setViewPresentation(viewPresentation);
70
+ applyViewportPresentation(viewport, viewPresentation);
70
71
  viewport.render();
71
72
  });
72
73
  resizeObserver.observe(element);