@cornerstonejs/tools 5.2.2 → 5.4.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/eventListeners/segmentation/renderingPipelineChangedListener.d.ts +2 -0
- package/dist/esm/eventListeners/segmentation/renderingPipelineChangedListener.js +14 -0
- package/dist/esm/init.js +3 -0
- package/dist/esm/tools/annotation/SplineROITool.js +9 -3
- package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/createLabelmapRenderPlan.d.ts +4 -2
- package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/createLabelmapRenderPlan.js +7 -3
- package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/legacyVolumePlan.js +8 -2
- package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/types.d.ts +1 -0
- package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/volumeSliceImageMapperPlan.d.ts +1 -1
- package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/volumeSliceImageMapperPlan.js +9 -1
- package/dist/esm/version.d.ts +1 -1
- package/dist/esm/version.js +1 -1
- package/package.json +4 -4
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { triggerSegmentationRender } from '../../stateManagement/segmentation/SegmentationRenderingEngine.js';
|
|
2
|
+
import { getSegmentationRepresentations } from '../../stateManagement/segmentation/getSegmentationRepresentation.js';
|
|
3
|
+
const renderingPipelineChangedListener = function (evt) {
|
|
4
|
+
const viewportId = evt.detail?.viewportId;
|
|
5
|
+
if (!viewportId) {
|
|
6
|
+
return;
|
|
7
|
+
}
|
|
8
|
+
const representations = getSegmentationRepresentations(viewportId);
|
|
9
|
+
if (!representations?.length) {
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
triggerSegmentationRender(viewportId);
|
|
13
|
+
};
|
|
14
|
+
export default renderingPipelineChangedListener;
|
package/dist/esm/init.js
CHANGED
|
@@ -10,6 +10,7 @@ import { defaultSegmentationStateManager } from './stateManagement/segmentation/
|
|
|
10
10
|
import segmentationRepresentationModifiedListener from './eventListeners/segmentation/segmentationRepresentationModifiedListener.js';
|
|
11
11
|
import { setConfig } from './config.js';
|
|
12
12
|
import segmentationRemovedListener from './eventListeners/segmentation/segmentationRemovedEventListener.js';
|
|
13
|
+
import renderingPipelineChangedListener from './eventListeners/segmentation/renderingPipelineChangedListener.js';
|
|
13
14
|
import { registerBuiltInSegmentationRepresentationDisplays } from './tools/displayTools/registerBuiltInSegmentationRepresentationDisplays.js';
|
|
14
15
|
let csToolsInitialized = false;
|
|
15
16
|
export function init(defaultConfiguration = {}) {
|
|
@@ -39,6 +40,7 @@ function _addCornerstoneEventListeners() {
|
|
|
39
40
|
const elementDisabledEvent = Enums.Events.ELEMENT_DISABLED;
|
|
40
41
|
eventTarget.addEventListener(elementEnabledEvent, addEnabledElement);
|
|
41
42
|
eventTarget.addEventListener(elementDisabledEvent, removeEnabledElement);
|
|
43
|
+
eventTarget.addEventListener(Enums.Events.RENDERING_PIPELINE_CHANGED, renderingPipelineChangedListener);
|
|
42
44
|
annotationInterpolationEventDispatcher.enable();
|
|
43
45
|
}
|
|
44
46
|
function _removeCornerstoneEventListeners() {
|
|
@@ -46,6 +48,7 @@ function _removeCornerstoneEventListeners() {
|
|
|
46
48
|
const elementDisabledEvent = Enums.Events.ELEMENT_DISABLED;
|
|
47
49
|
eventTarget.removeEventListener(elementEnabledEvent, addEnabledElement);
|
|
48
50
|
eventTarget.removeEventListener(elementDisabledEvent, removeEnabledElement);
|
|
51
|
+
eventTarget.removeEventListener(Enums.Events.RENDERING_PIPELINE_CHANGED, renderingPipelineChangedListener);
|
|
49
52
|
annotationInterpolationEventDispatcher.disable();
|
|
50
53
|
}
|
|
51
54
|
function _addCornerstoneToolsEventListeners() {
|
|
@@ -52,6 +52,7 @@ class SplineROITool extends ContourSegmentationBaseTool {
|
|
|
52
52
|
configuration: {
|
|
53
53
|
preventHandleOutsideImage: false,
|
|
54
54
|
calculateStats: true,
|
|
55
|
+
allowOpenSplines: false,
|
|
55
56
|
simplifiedSpline: false,
|
|
56
57
|
getTextLines: defaultGetTextLines,
|
|
57
58
|
contourHoleAdditionModifierKey: KeyboardBindings.Shift,
|
|
@@ -242,7 +243,9 @@ class SplineROITool extends ContourSegmentationBaseTool {
|
|
|
242
243
|
const eventDetail = evt.detail;
|
|
243
244
|
const { currentPoints, element } = eventDetail;
|
|
244
245
|
const { canvas: canvasPoint, world: worldPoint } = currentPoints;
|
|
245
|
-
let closeContour = data.handles.points.length >= 2 &&
|
|
246
|
+
let closeContour = data.handles.points.length >= 2 &&
|
|
247
|
+
doubleClick &&
|
|
248
|
+
!this.configuration.allowOpenSplines;
|
|
246
249
|
let addNewPoint = true;
|
|
247
250
|
if (data.handles.points.length) {
|
|
248
251
|
this.createMemo(element, annotation, {
|
|
@@ -255,7 +258,7 @@ class SplineROITool extends ContourSegmentationBaseTool {
|
|
|
255
258
|
const closestControlPoint = spline.getClosestControlPointWithinDistance(canvasPoint, SPLINE_CLICK_CLOSE_CURVE_DIST);
|
|
256
259
|
if (closestControlPoint?.index === 0) {
|
|
257
260
|
addNewPoint = false;
|
|
258
|
-
closeContour =
|
|
261
|
+
closeContour = !this.configuration.allowOpenSplines;
|
|
259
262
|
}
|
|
260
263
|
}
|
|
261
264
|
if (addNewPoint) {
|
|
@@ -264,7 +267,10 @@ class SplineROITool extends ContourSegmentationBaseTool {
|
|
|
264
267
|
data.contour.closed = data.contour.closed || closeContour;
|
|
265
268
|
annotation.invalidated = true;
|
|
266
269
|
triggerAnnotationRenderForViewportIds(viewportIdsToRender);
|
|
267
|
-
|
|
270
|
+
const allowOpenSplines = doubleClick &&
|
|
271
|
+
this.configuration.allowOpenSplines &&
|
|
272
|
+
data.handles.points.length >= 3;
|
|
273
|
+
if (data.contour.closed || allowOpenSplines) {
|
|
268
274
|
this._endCallback(evt);
|
|
269
275
|
}
|
|
270
276
|
evt.preventDefault();
|
package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/createLabelmapRenderPlan.d.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import type { Types } from '@cornerstonejs/core';
|
|
1
2
|
import type { CreateLabelmapRenderPlanArgs, LabelmapRenderPlan } from './types.js';
|
|
2
|
-
declare function createLabelmapRenderPlan({ isVolumeImageMapper, kind, renderMode, segmentationId, unsupportedStateKey, updateAfterMount, useSliceRendering, viewport, canRenderCurrentViewport, getExpectedRepresentationUIDs, mount, update, }: CreateLabelmapRenderPlanArgs): LabelmapRenderPlan;
|
|
3
|
-
|
|
3
|
+
declare function createLabelmapRenderPlan({ isVolumeImageMapper, kind, renderMode, segmentationId, unsupportedStateKey, updateAfterMount, useSliceRendering, viewport, canRenderCurrentViewport, getExpectedRepresentationUIDs, isActorEntryCompatible, mount, update, }: CreateLabelmapRenderPlanArgs): LabelmapRenderPlan;
|
|
4
|
+
declare function getActorEntryRenderMode(actorEntry: Types.ActorEntry): Types.ActorRenderMode | undefined;
|
|
5
|
+
export { createLabelmapRenderPlan, getActorEntryRenderMode };
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { getLabelmapActorEntries } from '../../../../stateManagement/segmentation/helpers/getSegmentationActor.js';
|
|
2
2
|
import { removeLabelmapRepresentationFromViewport } from './removeLabelmapRepresentationFromViewport.js';
|
|
3
|
-
function createLabelmapRenderPlan({ isVolumeImageMapper, kind, renderMode, segmentationId, unsupportedStateKey, updateAfterMount = true, useSliceRendering, viewport, canRenderCurrentViewport = () => kind !== 'unsupported', getExpectedRepresentationUIDs = () => [], mount = async () => undefined, update = () => undefined, }) {
|
|
3
|
+
function createLabelmapRenderPlan({ isVolumeImageMapper, kind, renderMode, segmentationId, unsupportedStateKey, updateAfterMount = true, useSliceRendering, viewport, canRenderCurrentViewport = () => kind !== 'unsupported', getExpectedRepresentationUIDs = () => [], isActorEntryCompatible = () => true, mount = async () => undefined, update = () => undefined, }) {
|
|
4
4
|
const remove = () => removeLabelmapRepresentationFromViewport(viewport, segmentationId);
|
|
5
|
-
const needsRemount = (actorEntries) => haveActorUIDsChanged(actorEntries, getExpectedRepresentationUIDs())
|
|
5
|
+
const needsRemount = (actorEntries) => haveActorUIDsChanged(actorEntries, getExpectedRepresentationUIDs()) ||
|
|
6
|
+
(actorEntries ?? []).some((actorEntry) => !isActorEntryCompatible(actorEntry));
|
|
6
7
|
return {
|
|
7
8
|
kind,
|
|
8
9
|
renderMode,
|
|
@@ -35,6 +36,9 @@ function createLabelmapRenderPlan({ isVolumeImageMapper, kind, renderMode, segme
|
|
|
35
36
|
},
|
|
36
37
|
};
|
|
37
38
|
}
|
|
39
|
+
function getActorEntryRenderMode(actorEntry) {
|
|
40
|
+
return actorEntry.actorMapper?.renderMode;
|
|
41
|
+
}
|
|
38
42
|
function haveActorUIDsChanged(actorEntries, expectedRepresentationUIDs) {
|
|
39
43
|
const actualUIDs = new Set((actorEntries ?? []).map((entry) => entry.representationUID));
|
|
40
44
|
const expectedUIDs = new Set(expectedRepresentationUIDs);
|
|
@@ -48,4 +52,4 @@ function haveActorUIDsChanged(actorEntries, expectedRepresentationUIDs) {
|
|
|
48
52
|
}
|
|
49
53
|
return false;
|
|
50
54
|
}
|
|
51
|
-
export { createLabelmapRenderPlan };
|
|
55
|
+
export { createLabelmapRenderPlan, getActorEntryRenderMode };
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { addVolumesToViewports, Enums, cache, volumeLoader, utilities, } from '@cornerstonejs/core';
|
|
1
|
+
import { ActorRenderMode, addVolumesToViewports, Enums, cache, volumeLoader, utilities, } from '@cornerstonejs/core';
|
|
2
2
|
import { triggerSegmentationDataModified, triggerSegmentationModified, } from '../../../../stateManagement/segmentation/triggerSegmentationEvents.js';
|
|
3
3
|
import { getLabelmaps, getOrCreateLabelmapVolume, } from '../../../../stateManagement/segmentation/helpers/labelmapSegmentationState.js';
|
|
4
4
|
import { addVolumesAsIndependentComponents } from '../addVolumesAsIndependentComponents.js';
|
|
5
5
|
import { createLabelmapRepresentationUID } from '../labelmapRepresentationUID.js';
|
|
6
|
-
import { createLabelmapRenderPlan } from './createLabelmapRenderPlan.js';
|
|
6
|
+
import { createLabelmapRenderPlan, getActorEntryRenderMode, } from './createLabelmapRenderPlan.js';
|
|
7
7
|
import { addLabelmapToPlanarGenericViewport, isPlanarNextVolumeViewport, } from './planarGenericVolumeLabelmap.js';
|
|
8
8
|
const { uuidv4 } = utilities;
|
|
9
9
|
function createLegacyVolumeLabelmapPlan({ config, isVolumeImageMapper, renderMode, segmentation, segmentationId, useSliceRendering, viewport, }) {
|
|
@@ -15,6 +15,7 @@ function createLegacyVolumeLabelmapPlan({ config, isVolumeImageMapper, renderMod
|
|
|
15
15
|
useSliceRendering,
|
|
16
16
|
viewport,
|
|
17
17
|
getExpectedRepresentationUIDs: () => getExpectedVolumeLabelmapRepresentationUIDs(segmentation, segmentationId),
|
|
18
|
+
isActorEntryCompatible: (actorEntry) => !isImageMountedActorEntry(actorEntry),
|
|
18
19
|
mount: ({ labelMapData }) => mountLegacyVolumeLabelmap({
|
|
19
20
|
config,
|
|
20
21
|
labelMapData,
|
|
@@ -24,6 +25,11 @@ function createLegacyVolumeLabelmapPlan({ config, isVolumeImageMapper, renderMod
|
|
|
24
25
|
}),
|
|
25
26
|
});
|
|
26
27
|
}
|
|
28
|
+
function isImageMountedActorEntry(actorEntry) {
|
|
29
|
+
const renderMode = getActorEntryRenderMode(actorEntry);
|
|
30
|
+
return (renderMode === ActorRenderMode.VTK_IMAGE ||
|
|
31
|
+
renderMode === ActorRenderMode.CPU_IMAGE);
|
|
32
|
+
}
|
|
27
33
|
function getExpectedVolumeLabelmapRepresentationUIDs(segmentation, segmentationId) {
|
|
28
34
|
return getLabelmaps(segmentation)
|
|
29
35
|
.filter(canResolveLayerAsVolume)
|
|
@@ -42,6 +42,7 @@ type CreateLabelmapRenderPlanArgs = {
|
|
|
42
42
|
viewport: Types.IViewport;
|
|
43
43
|
canRenderCurrentViewport?: () => boolean;
|
|
44
44
|
getExpectedRepresentationUIDs?: () => string[];
|
|
45
|
+
isActorEntryCompatible?: (actorEntry: Types.ActorEntry) => boolean;
|
|
45
46
|
mount?: (args: LabelmapRenderPlanMountArgs) => Promise<LabelmapRenderPlanMountResult>;
|
|
46
47
|
update?: (args: LabelmapRenderPlanUpdateArgs) => void;
|
|
47
48
|
};
|
package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/volumeSliceImageMapperPlan.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type Types } from '@cornerstonejs/core';
|
|
2
2
|
import type { ViewportLabelmapRenderMode } from '../../../../stateManagement/segmentation/helpers/getViewportLabelmapRenderMode.js';
|
|
3
3
|
import type { Segmentation } from '../../../../types/SegmentationStateTypes.js';
|
|
4
4
|
import type { LabelmapRenderPlan } from './types.js';
|
package/dist/esm/tools/displayTools/Labelmap/labelmapRenderPlan/volumeSliceImageMapperPlan.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
import { ActorRenderMode } from '@cornerstonejs/core';
|
|
1
2
|
import { triggerSegmentationDataModified } from '../../../../stateManagement/segmentation/triggerSegmentationEvents.js';
|
|
2
3
|
import { addVolumeLabelmapImageMapperActors, getVolumeLabelmapImageMapperRepresentationUIDs, updateVolumeLabelmapImageMapperActors, } from '../volumeLabelmapImageMapper.js';
|
|
3
|
-
import { createLabelmapRenderPlan } from './createLabelmapRenderPlan.js';
|
|
4
|
+
import { createLabelmapRenderPlan, getActorEntryRenderMode, } from './createLabelmapRenderPlan.js';
|
|
4
5
|
function createVolumeSliceImageMapperPlan({ isVolumeImageMapper, renderMode, segmentation, segmentationId, useSliceRendering, viewport, }) {
|
|
5
6
|
return createLabelmapRenderPlan({
|
|
6
7
|
isVolumeImageMapper,
|
|
@@ -10,6 +11,7 @@ function createVolumeSliceImageMapperPlan({ isVolumeImageMapper, renderMode, seg
|
|
|
10
11
|
useSliceRendering,
|
|
11
12
|
viewport,
|
|
12
13
|
getExpectedRepresentationUIDs: () => getVolumeLabelmapImageMapperRepresentationUIDs(viewport, segmentationId, segmentation),
|
|
14
|
+
isActorEntryCompatible: (actorEntry) => !isVolumeMountedActorEntry(actorEntry),
|
|
13
15
|
mount: () => mountVolumeLabelmapImageMapper({
|
|
14
16
|
viewport,
|
|
15
17
|
segmentation,
|
|
@@ -23,6 +25,12 @@ function createVolumeSliceImageMapperPlan({ isVolumeImageMapper, renderMode, seg
|
|
|
23
25
|
}),
|
|
24
26
|
});
|
|
25
27
|
}
|
|
28
|
+
function isVolumeMountedActorEntry(actorEntry) {
|
|
29
|
+
const renderMode = getActorEntryRenderMode(actorEntry);
|
|
30
|
+
return (renderMode === ActorRenderMode.VTK_VOLUME ||
|
|
31
|
+
renderMode === ActorRenderMode.VTK_VOLUME_SLICE ||
|
|
32
|
+
renderMode === ActorRenderMode.CPU_VOLUME);
|
|
33
|
+
}
|
|
26
34
|
async function mountVolumeLabelmapImageMapper({ viewport, segmentation, segmentationId, }) {
|
|
27
35
|
await addVolumeLabelmapImageMapperActors({
|
|
28
36
|
viewport,
|
package/dist/esm/version.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const version = "5.
|
|
1
|
+
export declare const version = "5.4.0";
|
package/dist/esm/version.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const version = '5.
|
|
1
|
+
export const version = '5.4.0';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cornerstonejs/tools",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.4.0",
|
|
4
4
|
"description": "Cornerstone3D Tools",
|
|
5
5
|
"types": "./dist/esm/index.d.ts",
|
|
6
6
|
"module": "./dist/esm/index.js",
|
|
@@ -126,11 +126,11 @@
|
|
|
126
126
|
"lodash.get": "4.4.2"
|
|
127
127
|
},
|
|
128
128
|
"devDependencies": {
|
|
129
|
-
"@cornerstonejs/core": "5.
|
|
129
|
+
"@cornerstonejs/core": "5.4.0",
|
|
130
130
|
"canvas": "3.2.0"
|
|
131
131
|
},
|
|
132
132
|
"peerDependencies": {
|
|
133
|
-
"@cornerstonejs/core": "5.
|
|
133
|
+
"@cornerstonejs/core": "5.4.0",
|
|
134
134
|
"@kitware/vtk.js": "35.5.3",
|
|
135
135
|
"@types/d3-array": "3.2.1",
|
|
136
136
|
"@types/d3-interpolate": "3.0.4",
|
|
@@ -149,5 +149,5 @@
|
|
|
149
149
|
"type": "individual",
|
|
150
150
|
"url": "https://ohif.org/donate"
|
|
151
151
|
},
|
|
152
|
-
"gitHead": "
|
|
152
|
+
"gitHead": "66acfc1d1cacf70845a9eb52a7b7a770a6b1fd3d"
|
|
153
153
|
}
|