@cornerstonejs/tools 2.15.5 → 2.16.1

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.
@@ -5,6 +5,7 @@ declare enum ChangeTypes {
5
5
  InitialSetup = "InitialSetup",
6
6
  Completed = "Completed",
7
7
  InterpolationUpdated = "InterpolationUpdated",
8
- History = "History"
8
+ History = "History",
9
+ MetadataReferenceModified = "MetadataReferenceModified"
9
10
  }
10
11
  export default ChangeTypes;
@@ -7,5 +7,6 @@ var ChangeTypes;
7
7
  ChangeTypes["Completed"] = "Completed";
8
8
  ChangeTypes["InterpolationUpdated"] = "InterpolationUpdated";
9
9
  ChangeTypes["History"] = "History";
10
+ ChangeTypes["MetadataReferenceModified"] = "MetadataReferenceModified";
10
11
  })(ChangeTypes || (ChangeTypes = {}));
11
12
  export default ChangeTypes;
@@ -21,16 +21,10 @@ class KeyImageTool extends AnnotationTool {
21
21
  super(toolProps, defaultToolProps);
22
22
  this.addNewAnnotation = (evt) => {
23
23
  const eventDetail = evt.detail;
24
- const { currentPoints, element } = eventDetail;
25
- const worldPos = currentPoints.world;
24
+ const { element } = eventDetail;
26
25
  const enabledElement = getEnabledElement(element);
27
26
  const { viewport } = enabledElement;
28
- const camera = viewport.getCamera();
29
- const { viewPlaneNormal, viewUp } = camera;
30
- const referencedImageId = this.getReferencedImageId(viewport, worldPos, viewPlaneNormal, viewUp);
31
- const annotation = KeyImageTool.createAnnotation({
32
- metadata: { ...viewport.getViewReference(), referencedImageId },
33
- });
27
+ const annotation = KeyImageTool.createAnnotationForViewport(viewport);
34
28
  addAnnotation(annotation, element);
35
29
  const viewportIdsToRender = getViewportIdsWithToolToRender(element, this.getToolName());
36
30
  evt.preventDefault();
@@ -32,26 +32,11 @@ class ProbeTool extends AnnotationTool {
32
32
  const enabledElement = getEnabledElement(element);
33
33
  const { viewport } = enabledElement;
34
34
  this.isDrawing = true;
35
- const camera = viewport.getCamera();
36
- const { viewPlaneNormal, viewUp } = camera;
37
- const referencedImageId = this.getReferencedImageId(viewport, worldPos, viewPlaneNormal);
38
- const FrameOfReferenceUID = viewport.getFrameOfReferenceUID();
39
- const annotation = {
40
- invalidated: true,
41
- highlighted: true,
42
- metadata: {
43
- toolName: this.getToolName(),
44
- viewPlaneNormal: [...viewPlaneNormal],
45
- viewUp: [...viewUp],
46
- FrameOfReferenceUID,
47
- referencedImageId,
48
- },
35
+ const annotation = ProbeTool.createAnnotationForViewport(viewport, {
49
36
  data: {
50
- label: '',
51
37
  handles: { points: [[...worldPos]] },
52
- cachedStats: {},
53
38
  },
54
- };
39
+ });
55
40
  addAnnotation(annotation, element);
56
41
  const viewportIdsToRender = getViewportIdsWithToolToRender(element, this.getToolName());
57
42
  this.editData = {
@@ -36,25 +36,10 @@ class RectangleROITool extends AnnotationTool {
36
36
  const { currentPoints, element } = eventDetail;
37
37
  const worldPos = currentPoints.world;
38
38
  const enabledElement = getEnabledElement(element);
39
- const { viewport, renderingEngine } = enabledElement;
39
+ const { viewport } = enabledElement;
40
40
  this.isDrawing = true;
41
- const camera = viewport.getCamera();
42
- const { viewPlaneNormal, viewUp } = camera;
43
- const referencedImageId = this.getReferencedImageId(viewport, worldPos, viewPlaneNormal, viewUp);
44
- const FrameOfReferenceUID = viewport.getFrameOfReferenceUID();
45
- const annotation = {
46
- invalidated: true,
47
- highlighted: true,
48
- metadata: {
49
- toolName: this.getToolName(),
50
- viewPlaneNormal: [...viewPlaneNormal],
51
- viewUp: [...viewUp],
52
- FrameOfReferenceUID,
53
- referencedImageId,
54
- ...viewport.getViewReference({ points: [worldPos] }),
55
- },
41
+ const annotation = RectangleROITool.createAnnotationForViewport(viewport, {
56
42
  data: {
57
- label: '',
58
43
  handles: {
59
44
  points: [
60
45
  [...worldPos],
@@ -72,11 +57,9 @@ class RectangleROITool extends AnnotationTool {
72
57
  bottomRight: [0, 0, 0],
73
58
  },
74
59
  },
75
- activeHandleIndex: null,
76
60
  },
77
- cachedStats: {},
78
61
  },
79
- };
62
+ });
80
63
  addAnnotation(annotation, element);
81
64
  const viewportIdsToRender = getViewportIdsWithToolToRender(element, this.getToolName());
82
65
  this.editData = {
@@ -22,21 +22,10 @@ class VideoRedactionTool extends AnnotationTool {
22
22
  const { currentPoints, element } = eventData;
23
23
  const worldPos = currentPoints.world;
24
24
  const enabledElement = getEnabledElement(element);
25
- const { viewport, renderingEngine } = enabledElement;
25
+ const { viewport } = enabledElement;
26
26
  this.isDrawing = true;
27
- const camera = viewport.getCamera();
28
- const { viewPlaneNormal, viewUp } = camera;
29
- const referencedImageId = this.getReferencedImageId(viewport, worldPos, viewPlaneNormal, viewUp);
30
- const annotation = {
31
- metadata: {
32
- viewPlaneNormal: [0, 0, 1],
33
- viewUp: [0, 1, 0],
34
- FrameOfReferenceUID: viewport.getFrameOfReferenceUID(),
35
- referencedImageId,
36
- toolName: this.getToolName(),
37
- },
27
+ const annotation = VideoRedactionTool.createAnnotationForViewport(viewport, {
38
28
  data: {
39
- invalidated: true,
40
29
  handles: {
41
30
  points: [
42
31
  [...worldPos],
@@ -44,12 +33,9 @@ class VideoRedactionTool extends AnnotationTool {
44
33
  [...worldPos],
45
34
  [...worldPos],
46
35
  ],
47
- activeHandleIndex: null,
48
36
  },
49
- cachedStats: {},
50
- active: true,
51
37
  },
52
- };
38
+ });
53
39
  addAnnotation(annotation, element);
54
40
  const viewportUIDsToRender = getViewportIdsWithToolToRender(element, this.getToolName(), false);
55
41
  this.editData = {
@@ -4,7 +4,7 @@ import type { Annotation, Annotations, EventTypes, ToolHandle, InteractionTypes,
4
4
  import type { AnnotationStyle, StyleSpecifier } from '../../types/AnnotationStyle';
5
5
  declare abstract class AnnotationTool extends AnnotationDisplayTool {
6
6
  static createAnnotation(...annotationBaseData: any[]): Annotation;
7
- static createAnnotationForViewport(viewport: any, ...annotationBaseData: any[]): Annotation;
7
+ static createAnnotationForViewport<T extends Annotation>(viewport: any, ...annotationBaseData: any[]): T;
8
8
  static createAndAddAnnotation(viewport: any, ...annotationBaseData: any[]): void;
9
9
  static toolName: any;
10
10
  constructor(toolProps: PublicToolProps, defaultToolProps: ToolProps);
@@ -0,0 +1,11 @@
1
+ import type { Annotation } from '../types';
2
+ export type FramesRange = [number, number] | number;
3
+ export default class AnnotationMultiSlice {
4
+ static setStartRange(viewport: any, annotation: any, startRange?: any): void;
5
+ static setEndRange(viewport: any, annotation: any, endRange?: any): void;
6
+ static setRange(viewport: any, annotation: any, startRange?: number, endRange?: number): void;
7
+ static setSingle(viewport: any, annotation: any, current?: any): void;
8
+ static getFrameRange(annotation: Annotation): number | [number, number];
9
+ static getFrameRangeStr(annotation: Annotation): string;
10
+ static setViewportFrameRange(viewport: any, specifier: any): void;
11
+ }
@@ -0,0 +1,68 @@
1
+ import { triggerEvent, eventTarget } from '@cornerstonejs/core';
2
+ import Events from '../enums/Events';
3
+ import { ChangeTypes } from '../enums';
4
+ export default class AnnotationMultiSlice {
5
+ static setStartRange(viewport, annotation, startRange = viewport.getCurrentImageIdIndex()) {
6
+ this.setRange(viewport, annotation, startRange);
7
+ }
8
+ static setEndRange(viewport, annotation, endRange = viewport.getCurrentImageIdIndex()) {
9
+ this.setRange(viewport, annotation, undefined, endRange);
10
+ }
11
+ static setRange(viewport, annotation, startRange, endRange) {
12
+ const { metadata } = annotation;
13
+ if (startRange === undefined) {
14
+ startRange = metadata.sliceIndex < endRange ? metadata.sliceIndex : 0;
15
+ if (endRange === undefined) {
16
+ endRange = viewport.getNumberOfSlices() - 1;
17
+ }
18
+ }
19
+ const rangeEndSliceIndex = viewport.getSliceIndexForImage(metadata.multiSliceReference);
20
+ if (endRange === undefined) {
21
+ endRange =
22
+ rangeEndSliceIndex >= startRange
23
+ ? rangeEndSliceIndex
24
+ : viewport.getNumberOfSlices() - 1;
25
+ }
26
+ endRange = Math.max(startRange, endRange);
27
+ metadata.sliceIndex = Math.min(startRange, endRange);
28
+ metadata.referencedImageId = viewport.getCurrentImageId(metadata.sliceIndex);
29
+ metadata.referencedImageURI = undefined;
30
+ if (endRange === metadata.sliceIndex) {
31
+ metadata.multiSliceReference = undefined;
32
+ }
33
+ else if (endRange !== metadata.multiSliceReference?.sliceIndex) {
34
+ metadata.multiSliceReference = {
35
+ referencedImageId: viewport.getCurrentImageId(endRange),
36
+ sliceIndex: endRange,
37
+ };
38
+ }
39
+ const eventDetail = {
40
+ viewportId: viewport.id,
41
+ renderingEngineId: viewport.renderingEngineId,
42
+ changeType: ChangeTypes.MetadataReferenceModified,
43
+ annotation,
44
+ };
45
+ triggerEvent(eventTarget, Events.ANNOTATION_MODIFIED, eventDetail);
46
+ this.setViewportFrameRange(viewport, metadata);
47
+ }
48
+ static setSingle(viewport, annotation, current = viewport.getCurrentImageIdIndex()) {
49
+ this.setRange(viewport, annotation, current, current);
50
+ }
51
+ static getFrameRange(annotation) {
52
+ const { metadata } = annotation;
53
+ const { sliceIndex, multiSliceReference } = metadata;
54
+ const rangeEndSliceIndex = multiSliceReference?.sliceIndex;
55
+ return rangeEndSliceIndex
56
+ ? [sliceIndex + 1, rangeEndSliceIndex + 1]
57
+ : sliceIndex + 1;
58
+ }
59
+ static getFrameRangeStr(annotation) {
60
+ const range = this.getFrameRange(annotation);
61
+ return Array.isArray(range) ? `${range[0]}-${range[1]}` : String(range);
62
+ }
63
+ static setViewportFrameRange(viewport, specifier) {
64
+ if (viewport.setFrameRange && specifier.multiSliceReference?.sliceIndex) {
65
+ viewport.setFrameRange(specifier.sliceIndex + 1, specifier.multiSliceReference.sliceIndex + 1);
66
+ }
67
+ }
68
+ }
@@ -10,7 +10,7 @@ import triggerAnnotationRenderForToolGroupIds from './triggerAnnotationRenderFor
10
10
  import triggerAnnotationRender from './triggerAnnotationRender';
11
11
  import { getSphereBoundsInfo } from './getSphereBoundsInfo';
12
12
  import { pointToString } from './pointToString';
13
- import annotationFrameRange from './annotationFrameRange';
13
+ import AnnotationMultiSlice from './AnnotationMultiSlice';
14
14
  import getViewportForAnnotation from './getViewportForAnnotation';
15
15
  import { annotationHydration, getClosestImageIdForStackViewport } from './annotationHydration';
16
16
  import * as contours from './contours';
@@ -36,4 +36,4 @@ declare const roundNumber: typeof utilities.roundNumber;
36
36
  import normalizeViewportPlane from './normalizeViewportPlane';
37
37
  import IslandRemoval from './segmentation/islandRemoval';
38
38
  import { getPixelValueUnits } from './getPixelValueUnits';
39
- export { math, planar, viewportFilters, drawing, debounce, dynamicVolume, throttle, orientation, isObject, touch, triggerEvent, calibrateImageSpacing, getCalibratedLengthUnitsAndScale, getCalibratedProbeUnitsAndValue, getCalibratedAspect, getPixelValueUnits, segmentation, contours, triggerAnnotationRenderForViewportIds, triggerAnnotationRenderForToolGroupIds, triggerAnnotationRender, getSphereBoundsInfo, getAnnotationNearPoint, getViewportForAnnotation, getAnnotationNearPointOnEnabledElement, viewport, cine, boundingBox, rectangleROITool, planarFreehandROITool, stackPrefetch, stackContextPrefetch, roundNumber, pointToString, polyDataUtils, voi, annotationFrameRange, contourSegmentation, annotationHydration, getClosestImageIdForStackViewport, pointInSurroundingSphereCallback, normalizeViewportPlane, IslandRemoval, };
39
+ export { math, planar, viewportFilters, drawing, debounce, dynamicVolume, throttle, orientation, isObject, touch, triggerEvent, calibrateImageSpacing, getCalibratedLengthUnitsAndScale, getCalibratedProbeUnitsAndValue, getCalibratedAspect, getPixelValueUnits, segmentation, contours, triggerAnnotationRenderForViewportIds, triggerAnnotationRenderForToolGroupIds, triggerAnnotationRender, getSphereBoundsInfo, getAnnotationNearPoint, getViewportForAnnotation, getAnnotationNearPointOnEnabledElement, viewport, cine, boundingBox, rectangleROITool, planarFreehandROITool, stackPrefetch, stackContextPrefetch, roundNumber, pointToString, polyDataUtils, voi, AnnotationMultiSlice, contourSegmentation, annotationHydration, getClosestImageIdForStackViewport, pointInSurroundingSphereCallback, normalizeViewportPlane, IslandRemoval, };
@@ -10,7 +10,7 @@ import triggerAnnotationRenderForToolGroupIds from './triggerAnnotationRenderFor
10
10
  import triggerAnnotationRender from './triggerAnnotationRender';
11
11
  import { getSphereBoundsInfo } from './getSphereBoundsInfo';
12
12
  import { pointToString } from './pointToString';
13
- import annotationFrameRange from './annotationFrameRange';
13
+ import AnnotationMultiSlice from './AnnotationMultiSlice';
14
14
  import getViewportForAnnotation from './getViewportForAnnotation';
15
15
  import { annotationHydration, getClosestImageIdForStackViewport, } from './annotationHydration';
16
16
  import * as contours from './contours';
@@ -36,4 +36,4 @@ const roundNumber = utilities.roundNumber;
36
36
  import normalizeViewportPlane from './normalizeViewportPlane';
37
37
  import IslandRemoval from './segmentation/islandRemoval';
38
38
  import { getPixelValueUnits } from './getPixelValueUnits';
39
- export { math, planar, viewportFilters, drawing, debounce, dynamicVolume, throttle, orientation, isObject, touch, triggerEvent, calibrateImageSpacing, getCalibratedLengthUnitsAndScale, getCalibratedProbeUnitsAndValue, getCalibratedAspect, getPixelValueUnits, segmentation, contours, triggerAnnotationRenderForViewportIds, triggerAnnotationRenderForToolGroupIds, triggerAnnotationRender, getSphereBoundsInfo, getAnnotationNearPoint, getViewportForAnnotation, getAnnotationNearPointOnEnabledElement, viewport, cine, boundingBox, rectangleROITool, planarFreehandROITool, stackPrefetch, stackContextPrefetch, roundNumber, pointToString, polyDataUtils, voi, annotationFrameRange, contourSegmentation, annotationHydration, getClosestImageIdForStackViewport, pointInSurroundingSphereCallback, normalizeViewportPlane, IslandRemoval, };
39
+ export { math, planar, viewportFilters, drawing, debounce, dynamicVolume, throttle, orientation, isObject, touch, triggerEvent, calibrateImageSpacing, getCalibratedLengthUnitsAndScale, getCalibratedProbeUnitsAndValue, getCalibratedAspect, getPixelValueUnits, segmentation, contours, triggerAnnotationRenderForViewportIds, triggerAnnotationRenderForToolGroupIds, triggerAnnotationRender, getSphereBoundsInfo, getAnnotationNearPoint, getViewportForAnnotation, getAnnotationNearPointOnEnabledElement, viewport, cine, boundingBox, rectangleROITool, planarFreehandROITool, stackPrefetch, stackContextPrefetch, roundNumber, pointToString, polyDataUtils, voi, AnnotationMultiSlice, contourSegmentation, annotationHydration, getClosestImageIdForStackViewport, pointInSurroundingSphereCallback, normalizeViewportPlane, IslandRemoval, };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cornerstonejs/tools",
3
- "version": "2.15.5",
3
+ "version": "2.16.1",
4
4
  "description": "Cornerstone3D Tools",
5
5
  "types": "./dist/esm/index.d.ts",
6
6
  "module": "./dist/esm/index.js",
@@ -104,7 +104,7 @@
104
104
  "canvas": "^2.11.2"
105
105
  },
106
106
  "peerDependencies": {
107
- "@cornerstonejs/core": "^2.15.5",
107
+ "@cornerstonejs/core": "^2.16.1",
108
108
  "@kitware/vtk.js": "32.9.0",
109
109
  "@types/d3-array": "^3.0.4",
110
110
  "@types/d3-interpolate": "^3.0.1",
@@ -123,5 +123,5 @@
123
123
  "type": "individual",
124
124
  "url": "https://ohif.org/donate"
125
125
  },
126
- "gitHead": "382df4deb7311b011fed61935d1cccf28a27c4b8"
126
+ "gitHead": "bbe715cbc6c3e791783196b5016a1bdec47f46be"
127
127
  }
@@ -1,13 +0,0 @@
1
- import type { Annotation } from '../types';
2
- export type FramesRange = [number, number] | number;
3
- export default class AnnotationFrameRange {
4
- protected static frameRangeExtractor: RegExp;
5
- protected static imageIdToFrames(imageId: string): FramesRange;
6
- static framesToString(range: any): string;
7
- protected static framesToImageId(imageId: string, range: FramesRange | string): string;
8
- static setFrameRange(annotation: Annotation, range: FramesRange | string, eventBase?: {
9
- viewportId: any;
10
- renderingEngineId: any;
11
- }): void;
12
- static getFrameRange(annotation: Annotation): number | [number, number];
13
- }
@@ -1,42 +0,0 @@
1
- import { triggerEvent, eventTarget } from '@cornerstonejs/core';
2
- import Events from '../enums/Events';
3
- export default class AnnotationFrameRange {
4
- static { this.frameRangeExtractor = /(\/frames\/|[&?]frameNumber=)([^/&?]*)/i; }
5
- static imageIdToFrames(imageId) {
6
- const match = imageId.match(this.frameRangeExtractor);
7
- if (!match || !match[2]) {
8
- return null;
9
- }
10
- const range = match[2].split('-').map((it) => Number(it));
11
- if (range.length === 1) {
12
- return range[0];
13
- }
14
- return range;
15
- }
16
- static framesToString(range) {
17
- if (Array.isArray(range)) {
18
- return `${range[0]}-${range[1]}`;
19
- }
20
- return String(range);
21
- }
22
- static framesToImageId(imageId, range) {
23
- const match = imageId.match(this.frameRangeExtractor);
24
- if (!match || !match[2]) {
25
- return null;
26
- }
27
- const newRangeString = this.framesToString(range);
28
- return imageId.replace(this.frameRangeExtractor, `${match[1]}${newRangeString}`);
29
- }
30
- static setFrameRange(annotation, range, eventBase) {
31
- const { referencedImageId } = annotation.metadata;
32
- annotation.metadata.referencedImageId = this.framesToImageId(referencedImageId, range);
33
- const eventDetail = {
34
- ...eventBase,
35
- annotation,
36
- };
37
- triggerEvent(eventTarget, Events.ANNOTATION_MODIFIED, eventDetail);
38
- }
39
- static getFrameRange(annotation) {
40
- return this.imageIdToFrames(annotation.metadata.referencedImageId);
41
- }
42
- }