@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.
- package/dist/esm/config.d.ts +4 -0
- package/dist/esm/drawingSvg/drawPath.d.ts +3 -0
- package/dist/esm/drawingSvg/drawPath.js +4 -1
- package/dist/esm/eventListeners/keyboard/keyDownListener.js +2 -2
- package/dist/esm/eventListeners/mouse/getMouseEventPoints.d.ts +1 -1
- package/dist/esm/eventListeners/mouse/getMouseEventPoints.js +19 -1
- package/dist/esm/eventListeners/mouse/mouseDoubleClickListener.js +8 -1
- package/dist/esm/eventListeners/mouse/mouseDownListener.js +37 -5
- package/dist/esm/eventListeners/mouse/mouseMoveListener.js +3 -0
- package/dist/esm/eventListeners/segmentation/imageChangeEventListener.js +60 -92
- package/dist/esm/eventListeners/segmentation/labelmap/onLabelmapSegmentationDataModified.js +49 -21
- package/dist/esm/eventListeners/segmentation/labelmap/performStackLabelmapUpdate.js +7 -13
- package/dist/esm/eventListeners/segmentation/labelmap/performVolumeLabelmapUpdate.js +44 -18
- package/dist/esm/eventListeners/touch/getTouchEventPoints.js +27 -4
- package/dist/esm/eventListeners/touch/touchStartListener.js +27 -9
- package/dist/esm/eventListeners/wheel/wheelListener.js +5 -1
- package/dist/esm/init.js +2 -0
- package/dist/esm/stateManagement/annotation/FrameOfReferenceSpecificAnnotationManager.js +10 -4
- package/dist/esm/stateManagement/segmentation/SegmentationRenderingEngine.js +23 -20
- package/dist/esm/stateManagement/segmentation/SegmentationRepresentationDisplayRegistry.d.ts +12 -0
- package/dist/esm/stateManagement/segmentation/SegmentationRepresentationDisplayRegistry.js +7 -0
- package/dist/esm/stateManagement/segmentation/SegmentationStateManager.d.ts +1 -11
- package/dist/esm/stateManagement/segmentation/SegmentationStateManager.js +28 -166
- package/dist/esm/stateManagement/segmentation/addColorLUT.js +7 -1
- package/dist/esm/stateManagement/segmentation/getCurrentLabelmapImageIdForViewport.js +16 -1
- package/dist/esm/stateManagement/segmentation/helpers/clearSegmentValue.js +9 -7
- package/dist/esm/stateManagement/segmentation/helpers/getSegmentationActor.d.ts +1 -1
- package/dist/esm/stateManagement/segmentation/helpers/getSegmentationActor.js +3 -2
- package/dist/esm/stateManagement/segmentation/helpers/getViewportLabelmapRenderMode.d.ts +5 -0
- package/dist/esm/stateManagement/segmentation/helpers/getViewportLabelmapRenderMode.js +58 -0
- package/dist/esm/stateManagement/segmentation/helpers/labelmapImageMapperSupport.d.ts +52 -0
- package/dist/esm/stateManagement/segmentation/helpers/labelmapImageMapperSupport.js +246 -0
- package/dist/esm/stateManagement/segmentation/helpers/labelmapSegmentationState.d.ts +1 -0
- package/dist/esm/stateManagement/segmentation/helpers/labelmapSegmentationState.js +1 -0
- package/dist/esm/stateManagement/segmentation/helpers/normalizeSegmentationInput.js +11 -1
- package/dist/esm/stateManagement/segmentation/internalAddSegmentationRepresentation.js +3 -3
- package/dist/esm/stateManagement/segmentation/labelmapModel/index.d.ts +9 -0
- package/dist/esm/stateManagement/segmentation/labelmapModel/index.js +7 -0
- package/dist/esm/stateManagement/segmentation/labelmapModel/labelmapEditTransaction.d.ts +54 -0
- package/dist/esm/stateManagement/segmentation/labelmapModel/labelmapEditTransaction.js +224 -0
- package/dist/esm/stateManagement/segmentation/labelmapModel/labelmapImageIdMapping.d.ts +6 -0
- package/dist/esm/stateManagement/segmentation/labelmapModel/labelmapImageIdMapping.js +39 -0
- package/dist/esm/stateManagement/segmentation/labelmapModel/labelmapImageReferenceResolver.d.ts +23 -0
- package/dist/esm/stateManagement/segmentation/labelmapModel/labelmapImageReferenceResolver.js +269 -0
- package/dist/esm/stateManagement/segmentation/labelmapModel/labelmapLayerStore.d.ts +15 -0
- package/dist/esm/stateManagement/segmentation/labelmapModel/labelmapLayerStore.js +160 -0
- package/dist/esm/stateManagement/segmentation/labelmapModel/labelmapLegacyAdapter.d.ts +4 -0
- package/dist/esm/stateManagement/segmentation/labelmapModel/labelmapLegacyAdapter.js +42 -0
- package/dist/esm/stateManagement/segmentation/labelmapModel/labelmapSegmentBindings.d.ts +11 -0
- package/dist/esm/stateManagement/segmentation/labelmapModel/labelmapSegmentBindings.js +73 -0
- package/dist/esm/stateManagement/segmentation/labelmapModel/normalizeLabelmapSegmentationData.d.ts +17 -0
- package/dist/esm/stateManagement/segmentation/labelmapModel/normalizeLabelmapSegmentationData.js +75 -0
- package/dist/esm/stateManagement/segmentation/labelmapModel/privateLabelmap.d.ts +5 -0
- package/dist/esm/stateManagement/segmentation/labelmapModel/privateLabelmap.js +106 -0
- package/dist/esm/stateManagement/segmentation/models/SegmentModel.d.ts +11 -0
- package/dist/esm/stateManagement/segmentation/models/SegmentModel.js +19 -0
- package/dist/esm/stateManagement/segmentation/models/SegmentationModel.d.ts +12 -0
- package/dist/esm/stateManagement/segmentation/models/SegmentationModel.js +23 -0
- package/dist/esm/stateManagement/segmentation/removeSegmentationRepresentations.js +6 -10
- package/dist/esm/stateManagement/segmentation/segmentIndex.js +24 -0
- package/dist/esm/stateManagement/segmentation/segmentationEventManager.js +2 -9
- package/dist/esm/stateManagement/segmentation/segmentationState.d.ts +2 -1
- package/dist/esm/stateManagement/segmentation/segmentationState.js +4 -1
- package/dist/esm/store/state.js +2 -1
- package/dist/esm/synchronizers/callbacks/imageSliceSyncCallback.js +12 -3
- package/dist/esm/synchronizers/callbacks/presentationViewSyncCallback.js +5 -2
- package/dist/esm/synchronizers/callbacks/zoomPanSyncCallback.js +51 -3
- package/dist/esm/tools/AdvancedMagnifyTool.js +1 -1
- package/dist/esm/tools/CrosshairsTool.js +5 -5
- package/dist/esm/tools/OrientationControllerTool.js +1 -1
- package/dist/esm/tools/OrientationMarkerTool.js +4 -4
- package/dist/esm/tools/PanTool.js +26 -3
- package/dist/esm/tools/PlanarRotateTool.js +19 -4
- package/dist/esm/tools/ReferenceCursors.js +7 -1
- package/dist/esm/tools/SculptorTool/CircleSculptCursor.js +1 -1
- package/dist/esm/tools/TrackballRotateTool.js +3 -2
- package/dist/esm/tools/VolumeCroppingTool.js +3 -2
- package/dist/esm/tools/WindowLevelTool.d.ts +2 -1
- package/dist/esm/tools/WindowLevelTool.js +48 -4
- package/dist/esm/tools/ZoomTool.d.ts +8 -0
- package/dist/esm/tools/ZoomTool.js +92 -11
- package/dist/esm/tools/annotation/AngleTool.js +33 -31
- package/dist/esm/tools/annotation/ArrowAnnotateTool.js +30 -28
- package/dist/esm/tools/annotation/BidirectionalTool.js +51 -49
- package/dist/esm/tools/annotation/CircleROITool.js +49 -44
- package/dist/esm/tools/annotation/CobbAngleTool.js +1 -1
- package/dist/esm/tools/annotation/DragProbeTool.js +1 -1
- package/dist/esm/tools/annotation/ETDRSGridTool.js +1 -1
- package/dist/esm/tools/annotation/EllipticalROITool.js +42 -37
- package/dist/esm/tools/annotation/HeightTool.js +1 -1
- package/dist/esm/tools/annotation/KeyImageTool.js +11 -11
- package/dist/esm/tools/annotation/LabelTool.js +37 -35
- package/dist/esm/tools/annotation/LengthTool.js +35 -33
- package/dist/esm/tools/annotation/LivewireContourSegmentationTool.js +6 -4
- package/dist/esm/tools/annotation/LivewireContourTool.js +1 -1
- package/dist/esm/tools/annotation/PlanarFreehandContourSegmentationTool.js +6 -4
- package/dist/esm/tools/annotation/PlanarFreehandROITool.js +1 -1
- package/dist/esm/tools/annotation/ProbeTool.js +51 -46
- package/dist/esm/tools/annotation/RectangleROITool.js +42 -37
- package/dist/esm/tools/annotation/RegionSegmentPlusTool.js +1 -1
- package/dist/esm/tools/annotation/RegionSegmentTool.js +1 -1
- package/dist/esm/tools/annotation/SplineContourSegmentationTool.js +1 -1
- package/dist/esm/tools/annotation/SplineROITool.js +51 -49
- package/dist/esm/tools/annotation/UltrasoundDirectionalTool.js +1 -1
- package/dist/esm/tools/annotation/UltrasoundPleuraBLineTool/UltrasoundPleuraBLineTool.js +57 -55
- package/dist/esm/tools/annotation/VideoRedactionTool.js +1 -1
- package/dist/esm/tools/base/AnnotationDisplayTool.js +9 -6
- package/dist/esm/tools/base/AnnotationTool.js +2 -1
- package/dist/esm/tools/base/BaseTool.js +16 -10
- package/dist/esm/tools/base/ContourSegmentationBaseTool.js +1 -1
- package/dist/esm/tools/base/GrowCutBaseTool.js +2 -2
- package/dist/esm/tools/displayTools/Labelmap/addLabelmapToElement.d.ts +2 -4
- package/dist/esm/tools/displayTools/Labelmap/addLabelmapToElement.js +15 -85
- package/dist/esm/tools/displayTools/Labelmap/labelmapActorStyle.d.ts +5 -0
- package/dist/esm/tools/displayTools/Labelmap/labelmapActorStyle.js +191 -0
- package/dist/esm/tools/displayTools/Labelmap/labelmapDisplay.d.ts +4 -3
- package/dist/esm/tools/displayTools/Labelmap/labelmapDisplay.js +48 -209
- package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/createLabelmapRenderPlan.d.ts +3 -0
- package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/createLabelmapRenderPlan.js +51 -0
- package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/index.d.ts +4 -0
- package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/index.js +3 -0
- package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/legacyVolumePlan.d.ts +14 -0
- package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/legacyVolumePlan.js +143 -0
- package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/planarGenericVolumeLabelmap.d.ts +40 -0
- package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/planarGenericVolumeLabelmap.js +79 -0
- package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/removeLabelmapRepresentationFromViewport.d.ts +3 -0
- package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/removeLabelmapRepresentationFromViewport.js +18 -0
- package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/resolveLabelmapRenderPlan.d.ts +9 -0
- package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/resolveLabelmapRenderPlan.js +56 -0
- package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/stackImagePlan.d.ts +11 -0
- package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/stackImagePlan.js +35 -0
- package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/types.d.ts +48 -0
- package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/types.js +0 -0
- package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/volumeSliceImageMapperPlan.d.ts +13 -0
- package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/volumeSliceImageMapperPlan.js +34 -0
- package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan.d.ts +2 -0
- package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan.js +1 -0
- package/dist/esm/tools/displayTools/Labelmap/labelmapRepresentationUID.d.ts +8 -0
- package/dist/esm/tools/displayTools/Labelmap/labelmapRepresentationUID.js +18 -0
- package/dist/esm/tools/displayTools/Labelmap/removeLabelmapFromElement.js +2 -5
- package/dist/esm/tools/displayTools/Labelmap/removeLabelmapRepresentationData.d.ts +3 -0
- package/dist/esm/tools/displayTools/Labelmap/removeLabelmapRepresentationData.js +16 -0
- package/dist/esm/tools/displayTools/Labelmap/syncStackLabelmapActors.d.ts +2 -0
- package/dist/esm/tools/displayTools/Labelmap/syncStackLabelmapActors.js +135 -0
- package/dist/esm/tools/displayTools/Labelmap/volumeLabelmapImageMapper.d.ts +16 -0
- package/dist/esm/tools/displayTools/Labelmap/volumeLabelmapImageMapper.js +267 -0
- package/dist/esm/tools/displayTools/Labelmap/volumeLabelmapSliceData.d.ts +27 -0
- package/dist/esm/tools/displayTools/Labelmap/volumeLabelmapSliceData.js +185 -0
- package/dist/esm/tools/displayTools/registerBuiltInSegmentationRepresentationDisplays.d.ts +1 -0
- package/dist/esm/tools/displayTools/registerBuiltInSegmentationRepresentationDisplays.js +16 -0
- package/dist/esm/tools/segmentation/BrushTool.d.ts +9 -2
- package/dist/esm/tools/segmentation/BrushTool.js +109 -25
- package/dist/esm/tools/segmentation/CircleScissorsTool.js +13 -6
- package/dist/esm/tools/segmentation/LabelmapBaseTool.d.ts +2 -3
- package/dist/esm/tools/segmentation/LabelmapBaseTool.js +77 -38
- package/dist/esm/tools/segmentation/LabelmapEditWithContour.js +3 -3
- package/dist/esm/tools/segmentation/PaintFillTool.js +11 -4
- package/dist/esm/tools/segmentation/RectangleROIStartEndThresholdTool.d.ts +2 -0
- package/dist/esm/tools/segmentation/RectangleROIStartEndThresholdTool.js +16 -8
- package/dist/esm/tools/segmentation/RectangleScissorsTool.js +13 -6
- package/dist/esm/tools/segmentation/SegmentBidirectionalTool.js +63 -61
- package/dist/esm/tools/segmentation/SegmentSelectTool.js +4 -4
- package/dist/esm/tools/segmentation/SphereScissorsTool.js +5 -1
- package/dist/esm/tools/segmentation/strategies/BrushStrategy.d.ts +7 -0
- package/dist/esm/tools/segmentation/strategies/BrushStrategy.js +47 -24
- package/dist/esm/tools/segmentation/strategies/compositions/circularCursor.js +49 -15
- package/dist/esm/tools/segmentation/strategies/compositions/determineSegmentIndex.js +2 -2
- package/dist/esm/tools/segmentation/strategies/compositions/dynamicThreshold.js +5 -1
- package/dist/esm/tools/segmentation/strategies/compositions/islandRemovalComposition.js +2 -2
- package/dist/esm/tools/segmentation/strategies/compositions/preview.js +2 -2
- package/dist/esm/tools/segmentation/strategies/compositions/setValue.js +14 -6
- package/dist/esm/tools/segmentation/strategies/utils/crossLayerErase.d.ts +4 -0
- package/dist/esm/tools/segmentation/strategies/utils/crossLayerErase.js +23 -0
- package/dist/esm/tools/segmentation/strategies/utils/getStrategyData.js +1 -1
- package/dist/esm/tools/segmentation/strategies/utils/handleUseSegmentCenterIndex.js +12 -11
- package/dist/esm/tools/segmentation/strategies/utils/labelmapOverlap.d.ts +4 -0
- package/dist/esm/tools/segmentation/strategies/utils/labelmapOverlap.js +41 -0
- package/dist/esm/tools/segmentation/strategies/utils/overwritePolicy.d.ts +3 -0
- package/dist/esm/tools/segmentation/strategies/utils/overwritePolicy.js +31 -0
- package/dist/esm/tools/segmentation/strategies/utils/segmentSeparation.d.ts +3 -0
- package/dist/esm/tools/segmentation/strategies/utils/segmentSeparation.js +38 -0
- package/dist/esm/tools/segmentation/utils/LazyBrushEditController.d.ts +19 -0
- package/dist/esm/tools/segmentation/utils/LazyBrushEditController.js +55 -0
- package/dist/esm/tools/segmentation/utils/lazyBrushPreview.d.ts +3 -0
- package/dist/esm/tools/segmentation/utils/lazyBrushPreview.js +34 -0
- package/dist/esm/tools/segmentation/utils/shouldUseLazyLabelmapEditing.d.ts +3 -0
- package/dist/esm/tools/segmentation/utils/shouldUseLazyLabelmapEditing.js +42 -0
- package/dist/esm/types/LabelmapToolOperationData.d.ts +5 -0
- package/dist/esm/types/LabelmapTypes.d.ts +29 -6
- package/dist/esm/types/SegmentationStateTypes.d.ts +4 -0
- package/dist/esm/utilities/calibrateImageSpacing.js +17 -2
- package/dist/esm/utilities/contours/AnnotationToPointData.js +1 -1
- package/dist/esm/utilities/getSphereBoundsInfo.js +5 -1
- package/dist/esm/utilities/getViewportICamera.d.ts +4 -0
- package/dist/esm/utilities/getViewportICamera.js +23 -0
- package/dist/esm/utilities/getViewportsForAnnotation.js +5 -1
- package/dist/esm/utilities/math/basic/BasicStatsCalculator.js +9 -7
- package/dist/esm/utilities/pointInSurroundingSphereCallback.js +8 -1
- package/dist/esm/utilities/segmentation/InterpolationManager/InterpolationManager.js +121 -118
- package/dist/esm/utilities/segmentation/SegmentStatsCalculator.js +5 -4
- package/dist/esm/utilities/segmentation/VolumetricCalculator.js +1 -1
- package/dist/esm/utilities/segmentation/createLabelmapVolumeForViewport.js +1 -1
- package/dist/esm/utilities/segmentation/getReferenceVolumeForSegmentation.js +1 -1
- package/dist/esm/utilities/segmentation/getReferenceVolumeForSegmentationVolume.js +11 -2
- package/dist/esm/utilities/segmentation/getSegmentIndexAtLabelmapBorder.js +36 -17
- package/dist/esm/utilities/segmentation/getSegmentIndexAtWorldPoint.js +42 -25
- package/dist/esm/utilities/segmentation/getUniqueSegmentIndices.js +3 -30
- package/dist/esm/utilities/segmentation/index.d.ts +2 -1
- package/dist/esm/utilities/segmentation/index.js +2 -1
- package/dist/esm/utilities/segmentation/utilsForWorker.js +2 -2
- package/dist/esm/utilities/segmentation/validateLabelmap.js +1 -1
- package/dist/esm/utilities/stackPrefetch/stackPrefetch.js +0 -1
- package/dist/esm/utilities/touch/index.js +3 -2
- package/dist/esm/utilities/viewportCapabilities.d.ts +16 -0
- package/dist/esm/utilities/viewportCapabilities.js +18 -0
- package/dist/esm/utilities/viewportFilters/filterViewportsWithParallelNormals.d.ts +1 -1
- package/dist/esm/utilities/viewportFilters/filterViewportsWithParallelNormals.js +12 -4
- package/dist/esm/utilities/viewportFilters/filterViewportsWithSameOrientation.d.ts +1 -1
- package/dist/esm/utilities/viewportFilters/filterViewportsWithSameOrientation.js +11 -4
- package/dist/esm/utilities/viewportFilters/getViewportIdsWithToolToRender.js +1 -1
- package/dist/esm/utilities/viewportPresentation.d.ts +3 -0
- package/dist/esm/utilities/viewportPresentation.js +26 -0
- package/dist/esm/version.d.ts +1 -1
- package/dist/esm/version.js +1 -1
- 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:
|
|
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
|
-
|
|
4
|
-
|
|
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
|
|
2
|
-
import { getCurrentLabelmapImageIdsForViewport } from '../../../stateManagement/segmentation/getCurrentLabelmapImageIdForViewport';
|
|
1
|
+
import { getEnabledElement } from '@cornerstonejs/core';
|
|
3
2
|
import { getSegmentation } from '../../../stateManagement/segmentation/getSegmentation';
|
|
4
|
-
import {
|
|
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 {
|
|
11
|
-
const
|
|
12
|
-
|
|
13
|
-
|
|
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
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
}
|
|
66
|
-
|
|
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
|
-
|
|
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.
|
|
6
|
-
declare function getUpdateFunction(
|
|
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;
|