@cornerstonejs/tools 0.55.2 → 0.56.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 (61) hide show
  1. package/dist/cjs/drawingSvg/drawCircle.d.ts +1 -1
  2. package/dist/cjs/drawingSvg/drawCircle.js +4 -1
  3. package/dist/cjs/drawingSvg/drawCircle.js.map +1 -1
  4. package/dist/cjs/index.d.ts +2 -2
  5. package/dist/cjs/index.js +3 -2
  6. package/dist/cjs/index.js.map +1 -1
  7. package/dist/cjs/tools/annotation/CircleROITool.d.ts +39 -0
  8. package/dist/cjs/tools/annotation/CircleROITool.js +593 -0
  9. package/dist/cjs/tools/annotation/CircleROITool.js.map +1 -0
  10. package/dist/cjs/tools/annotation/EllipticalROITool.js +2 -2
  11. package/dist/cjs/tools/annotation/EllipticalROITool.js.map +1 -1
  12. package/dist/cjs/tools/annotation/RectangleROITool.js +1 -1
  13. package/dist/cjs/tools/annotation/RectangleROITool.js.map +1 -1
  14. package/dist/cjs/tools/index.d.ts +2 -1
  15. package/dist/cjs/tools/index.js +3 -1
  16. package/dist/cjs/tools/index.js.map +1 -1
  17. package/dist/cjs/types/ToolSpecificAnnotationTypes.d.ts +26 -0
  18. package/dist/cjs/utilities/math/circle/_types.d.ts +5 -0
  19. package/dist/cjs/utilities/math/circle/_types.js +3 -0
  20. package/dist/cjs/utilities/math/circle/_types.js.map +1 -0
  21. package/dist/cjs/utilities/math/circle/getCanvasCircleCorners.d.ts +3 -0
  22. package/dist/cjs/utilities/math/circle/getCanvasCircleCorners.js +12 -0
  23. package/dist/cjs/utilities/math/circle/getCanvasCircleCorners.js.map +1 -0
  24. package/dist/cjs/utilities/math/circle/getCanvasCircleRadius.d.ts +2 -0
  25. package/dist/cjs/utilities/math/circle/getCanvasCircleRadius.js +9 -0
  26. package/dist/cjs/utilities/math/circle/getCanvasCircleRadius.js.map +1 -0
  27. package/dist/cjs/utilities/math/circle/index.d.ts +3 -0
  28. package/dist/cjs/utilities/math/circle/index.js +11 -0
  29. package/dist/cjs/utilities/math/circle/index.js.map +1 -0
  30. package/dist/esm/drawingSvg/drawCircle.d.ts +1 -1
  31. package/dist/esm/drawingSvg/drawCircle.js +4 -1
  32. package/dist/esm/drawingSvg/drawCircle.js.map +1 -1
  33. package/dist/esm/index.d.ts +2 -2
  34. package/dist/esm/index.js +2 -2
  35. package/dist/esm/index.js.map +1 -1
  36. package/dist/esm/tools/annotation/CircleROITool.d.ts +39 -0
  37. package/dist/esm/tools/annotation/CircleROITool.js +588 -0
  38. package/dist/esm/tools/annotation/CircleROITool.js.map +1 -0
  39. package/dist/esm/tools/annotation/EllipticalROITool.js +2 -2
  40. package/dist/esm/tools/annotation/EllipticalROITool.js.map +1 -1
  41. package/dist/esm/tools/annotation/RectangleROITool.js +1 -1
  42. package/dist/esm/tools/annotation/RectangleROITool.js.map +1 -1
  43. package/dist/esm/tools/index.d.ts +2 -1
  44. package/dist/esm/tools/index.js +2 -1
  45. package/dist/esm/tools/index.js.map +1 -1
  46. package/dist/esm/types/ToolSpecificAnnotationTypes.d.ts +26 -0
  47. package/dist/esm/utilities/math/circle/_types.d.ts +5 -0
  48. package/dist/esm/utilities/math/circle/_types.js +2 -0
  49. package/dist/esm/utilities/math/circle/_types.js.map +1 -0
  50. package/dist/esm/utilities/math/circle/getCanvasCircleCorners.d.ts +3 -0
  51. package/dist/esm/utilities/math/circle/getCanvasCircleCorners.js +9 -0
  52. package/dist/esm/utilities/math/circle/getCanvasCircleCorners.js.map +1 -0
  53. package/dist/esm/utilities/math/circle/getCanvasCircleRadius.d.ts +2 -0
  54. package/dist/esm/utilities/math/circle/getCanvasCircleRadius.js +6 -0
  55. package/dist/esm/utilities/math/circle/getCanvasCircleRadius.js.map +1 -0
  56. package/dist/esm/utilities/math/circle/index.d.ts +3 -0
  57. package/dist/esm/utilities/math/circle/index.js +4 -0
  58. package/dist/esm/utilities/math/circle/index.js.map +1 -0
  59. package/dist/umd/index.js +1 -1
  60. package/dist/umd/index.js.map +1 -1
  61. package/package.json +2 -2
@@ -0,0 +1,588 @@
1
+ import { AnnotationTool } from '../base';
2
+ import { getEnabledElement, VolumeViewport, eventTarget, triggerEvent, utilities as csUtils, } from '@cornerstonejs/core';
3
+ import throttle from '../../utilities/throttle';
4
+ import { addAnnotation, getAnnotations, removeAnnotation, } from '../../stateManagement/annotation/annotationState';
5
+ import { isAnnotationLocked } from '../../stateManagement/annotation/annotationLocking';
6
+ import { isAnnotationVisible } from '../../stateManagement/annotation/annotationVisibility';
7
+ import { drawCircle as drawCircleSvg, drawHandles as drawHandlesSvg, drawLinkedTextBox as drawLinkedTextBoxSvg, } from '../../drawingSvg';
8
+ import { state } from '../../store';
9
+ import { Events } from '../../enums';
10
+ import { getViewportIdsWithToolToRender } from '../../utilities/viewportFilters';
11
+ import { getTextBoxCoordsCanvas } from '../../utilities/drawing';
12
+ import getWorldWidthAndHeightFromTwoPoints from '../../utilities/planar/getWorldWidthAndHeightFromTwoPoints';
13
+ import { resetElementCursor, hideElementCursor, } from '../../cursors/elementCursor';
14
+ import triggerAnnotationRenderForViewportIds from '../../utilities/triggerAnnotationRenderForViewportIds';
15
+ import { pointInShapeCallback } from '../../utilities';
16
+ import { getModalityUnit } from '../../utilities/getModalityUnit';
17
+ import { isViewportPreScaled } from '../../utilities/viewport/isViewportPreScaled';
18
+ import { getCanvasCircleCorners, getCanvasCircleRadius, } from '../../utilities/math/circle';
19
+ import { pointInEllipse } from '../../utilities/math/ellipse';
20
+ const { transformWorldToIndex } = csUtils;
21
+ class CircleROITool extends AnnotationTool {
22
+ constructor(toolProps = {}, defaultToolProps = {
23
+ supportedInteractionTypes: ['Mouse', 'Touch'],
24
+ configuration: {
25
+ shadow: true,
26
+ preventHandleOutsideImage: false,
27
+ centerPointRadius: 0,
28
+ },
29
+ }) {
30
+ super(toolProps, defaultToolProps);
31
+ this.isHandleOutsideImage = false;
32
+ this.addNewAnnotation = (evt) => {
33
+ const eventDetail = evt.detail;
34
+ const { currentPoints, element } = eventDetail;
35
+ const worldPos = currentPoints.world;
36
+ const canvasPos = currentPoints.canvas;
37
+ const enabledElement = getEnabledElement(element);
38
+ const { viewport, renderingEngine } = enabledElement;
39
+ this.isDrawing = true;
40
+ const camera = viewport.getCamera();
41
+ const { viewPlaneNormal, viewUp } = camera;
42
+ const referencedImageId = this.getReferencedImageId(viewport, worldPos, viewPlaneNormal, viewUp);
43
+ const FrameOfReferenceUID = viewport.getFrameOfReferenceUID();
44
+ const annotation = {
45
+ highlighted: true,
46
+ invalidated: true,
47
+ metadata: {
48
+ toolName: this.getToolName(),
49
+ viewPlaneNormal: [...viewPlaneNormal],
50
+ viewUp: [...viewUp],
51
+ FrameOfReferenceUID,
52
+ referencedImageId,
53
+ },
54
+ data: {
55
+ label: '',
56
+ handles: {
57
+ textBox: {
58
+ hasMoved: false,
59
+ worldPosition: [0, 0, 0],
60
+ worldBoundingBox: {
61
+ topLeft: [0, 0, 0],
62
+ topRight: [0, 0, 0],
63
+ bottomLeft: [0, 0, 0],
64
+ bottomRight: [0, 0, 0],
65
+ },
66
+ },
67
+ points: [[...worldPos], [...worldPos]],
68
+ activeHandleIndex: null,
69
+ },
70
+ cachedStats: {},
71
+ },
72
+ };
73
+ addAnnotation(annotation, element);
74
+ const viewportIdsToRender = getViewportIdsWithToolToRender(element, this.getToolName());
75
+ this.editData = {
76
+ annotation,
77
+ viewportIdsToRender,
78
+ newAnnotation: true,
79
+ hasMoved: false,
80
+ };
81
+ this._activateDraw(element);
82
+ hideElementCursor(element);
83
+ evt.preventDefault();
84
+ triggerAnnotationRenderForViewportIds(renderingEngine, viewportIdsToRender);
85
+ return annotation;
86
+ };
87
+ this.isPointNearTool = (element, annotation, canvasCoords, proximity) => {
88
+ const enabledElement = getEnabledElement(element);
89
+ const { viewport } = enabledElement;
90
+ const { data } = annotation;
91
+ const { points } = data.handles;
92
+ const canvasCoordinates = points.map((p) => viewport.worldToCanvas(p));
93
+ const radius = getCanvasCircleRadius(canvasCoordinates);
94
+ const radiusPoint = getCanvasCircleRadius([
95
+ canvasCoordinates[0],
96
+ canvasCoords,
97
+ ]);
98
+ if (Math.abs(radiusPoint - radius) < proximity / 2)
99
+ return true;
100
+ return false;
101
+ };
102
+ this.toolSelectedCallback = (evt, annotation) => {
103
+ const eventDetail = evt.detail;
104
+ const { element } = eventDetail;
105
+ annotation.highlighted = true;
106
+ const viewportIdsToRender = getViewportIdsWithToolToRender(element, this.getToolName());
107
+ this.editData = {
108
+ annotation,
109
+ viewportIdsToRender,
110
+ movingTextBox: false,
111
+ };
112
+ hideElementCursor(element);
113
+ this._activateModify(element);
114
+ const enabledElement = getEnabledElement(element);
115
+ const { renderingEngine } = enabledElement;
116
+ triggerAnnotationRenderForViewportIds(renderingEngine, viewportIdsToRender);
117
+ evt.preventDefault();
118
+ };
119
+ this.handleSelectedCallback = (evt, annotation, handle) => {
120
+ const eventDetail = evt.detail;
121
+ const { element } = eventDetail;
122
+ const { data } = annotation;
123
+ annotation.highlighted = true;
124
+ let movingTextBox = false;
125
+ let handleIndex;
126
+ if (handle.worldPosition) {
127
+ movingTextBox = true;
128
+ }
129
+ else {
130
+ const { points } = data.handles;
131
+ handleIndex = points.findIndex((p) => p === handle);
132
+ }
133
+ const viewportIdsToRender = getViewportIdsWithToolToRender(element, this.getToolName());
134
+ this.editData = {
135
+ annotation,
136
+ viewportIdsToRender,
137
+ handleIndex,
138
+ movingTextBox,
139
+ };
140
+ this._activateModify(element);
141
+ hideElementCursor(element);
142
+ const enabledElement = getEnabledElement(element);
143
+ const { renderingEngine } = enabledElement;
144
+ triggerAnnotationRenderForViewportIds(renderingEngine, viewportIdsToRender);
145
+ evt.preventDefault();
146
+ };
147
+ this._endCallback = (evt) => {
148
+ const eventDetail = evt.detail;
149
+ const { element } = eventDetail;
150
+ const { annotation, viewportIdsToRender, newAnnotation, hasMoved } = this.editData;
151
+ const { data } = annotation;
152
+ if (newAnnotation && !hasMoved) {
153
+ return;
154
+ }
155
+ annotation.highlighted = false;
156
+ data.handles.activeHandleIndex = null;
157
+ this._deactivateModify(element);
158
+ this._deactivateDraw(element);
159
+ resetElementCursor(element);
160
+ const enabledElement = getEnabledElement(element);
161
+ const { renderingEngine } = enabledElement;
162
+ this.editData = null;
163
+ this.isDrawing = false;
164
+ if (this.isHandleOutsideImage &&
165
+ this.configuration.preventHandleOutsideImage) {
166
+ removeAnnotation(annotation.annotationUID);
167
+ }
168
+ triggerAnnotationRenderForViewportIds(renderingEngine, viewportIdsToRender);
169
+ if (newAnnotation) {
170
+ const eventType = Events.ANNOTATION_COMPLETED;
171
+ const eventDetail = {
172
+ annotation,
173
+ };
174
+ triggerEvent(eventTarget, eventType, eventDetail);
175
+ }
176
+ };
177
+ this._dragDrawCallback = (evt) => {
178
+ this.isDrawing = true;
179
+ const eventDetail = evt.detail;
180
+ const { element } = eventDetail;
181
+ const { currentPoints } = eventDetail;
182
+ const currentCanvasPoints = currentPoints.canvas;
183
+ const enabledElement = getEnabledElement(element);
184
+ const { renderingEngine, viewport } = enabledElement;
185
+ const { canvasToWorld } = viewport;
186
+ const { annotation, viewportIdsToRender } = this.editData;
187
+ const { data } = annotation;
188
+ data.handles.points = [
189
+ data.handles.points[0],
190
+ canvasToWorld(currentCanvasPoints),
191
+ ];
192
+ annotation.invalidated = true;
193
+ this.editData.hasMoved = true;
194
+ triggerAnnotationRenderForViewportIds(renderingEngine, viewportIdsToRender);
195
+ };
196
+ this._dragModifyCallback = (evt) => {
197
+ this.isDrawing = true;
198
+ const eventDetail = evt.detail;
199
+ const { element } = eventDetail;
200
+ const { annotation, viewportIdsToRender, handleIndex, movingTextBox } = this.editData;
201
+ const { data } = annotation;
202
+ if (movingTextBox) {
203
+ const { deltaPoints } = eventDetail;
204
+ const worldPosDelta = deltaPoints.world;
205
+ const { textBox } = data.handles;
206
+ const { worldPosition } = textBox;
207
+ worldPosition[0] += worldPosDelta[0];
208
+ worldPosition[1] += worldPosDelta[1];
209
+ worldPosition[2] += worldPosDelta[2];
210
+ textBox.hasMoved = true;
211
+ }
212
+ else if (handleIndex === undefined) {
213
+ const { deltaPoints } = eventDetail;
214
+ const worldPosDelta = deltaPoints.world;
215
+ const points = data.handles.points;
216
+ points.forEach((point) => {
217
+ point[0] += worldPosDelta[0];
218
+ point[1] += worldPosDelta[1];
219
+ point[2] += worldPosDelta[2];
220
+ });
221
+ annotation.invalidated = true;
222
+ }
223
+ else {
224
+ this._dragHandle(evt);
225
+ annotation.invalidated = true;
226
+ }
227
+ const enabledElement = getEnabledElement(element);
228
+ const { renderingEngine } = enabledElement;
229
+ triggerAnnotationRenderForViewportIds(renderingEngine, viewportIdsToRender);
230
+ };
231
+ this._dragHandle = (evt) => {
232
+ const eventDetail = evt.detail;
233
+ const { element } = eventDetail;
234
+ const enabledElement = getEnabledElement(element);
235
+ const { canvasToWorld, worldToCanvas } = enabledElement.viewport;
236
+ const { annotation, handleIndex } = this.editData;
237
+ const { data } = annotation;
238
+ const { points } = data.handles;
239
+ const canvasCoordinates = points.map((p) => worldToCanvas(p));
240
+ const { currentPoints } = eventDetail;
241
+ const currentCanvasPoints = currentPoints.canvas;
242
+ if (handleIndex === 0) {
243
+ const dXCanvas = currentCanvasPoints[0] - canvasCoordinates[0][0];
244
+ const dYCanvas = currentCanvasPoints[1] - canvasCoordinates[0][1];
245
+ const canvasCenter = currentCanvasPoints;
246
+ const canvasEnd = [
247
+ canvasCoordinates[1][0] + dXCanvas,
248
+ canvasCoordinates[1][1] + dYCanvas,
249
+ ];
250
+ points[0] = canvasToWorld(canvasCenter);
251
+ points[1] = canvasToWorld(canvasEnd);
252
+ }
253
+ else {
254
+ points[1] = canvasToWorld(currentCanvasPoints);
255
+ }
256
+ };
257
+ this.cancel = (element) => {
258
+ if (this.isDrawing) {
259
+ this.isDrawing = false;
260
+ this._deactivateDraw(element);
261
+ this._deactivateModify(element);
262
+ resetElementCursor(element);
263
+ const { annotation, viewportIdsToRender, newAnnotation } = this.editData;
264
+ const { data } = annotation;
265
+ annotation.highlighted = false;
266
+ data.handles.activeHandleIndex = null;
267
+ const enabledElement = getEnabledElement(element);
268
+ const { renderingEngine } = enabledElement;
269
+ triggerAnnotationRenderForViewportIds(renderingEngine, viewportIdsToRender);
270
+ if (newAnnotation) {
271
+ const eventType = Events.ANNOTATION_COMPLETED;
272
+ const eventDetail = {
273
+ annotation,
274
+ };
275
+ triggerEvent(eventTarget, eventType, eventDetail);
276
+ }
277
+ this.editData = null;
278
+ return annotation.annotationUID;
279
+ }
280
+ };
281
+ this._activateModify = (element) => {
282
+ state.isInteractingWithTool = true;
283
+ element.addEventListener(Events.MOUSE_UP, this._endCallback);
284
+ element.addEventListener(Events.MOUSE_DRAG, this._dragModifyCallback);
285
+ element.addEventListener(Events.MOUSE_CLICK, this._endCallback);
286
+ element.addEventListener(Events.TOUCH_END, this._endCallback);
287
+ element.addEventListener(Events.TOUCH_DRAG, this._dragModifyCallback);
288
+ element.addEventListener(Events.TOUCH_TAP, this._endCallback);
289
+ };
290
+ this._deactivateModify = (element) => {
291
+ state.isInteractingWithTool = false;
292
+ element.removeEventListener(Events.MOUSE_UP, this._endCallback);
293
+ element.removeEventListener(Events.MOUSE_DRAG, this._dragModifyCallback);
294
+ element.removeEventListener(Events.MOUSE_CLICK, this._endCallback);
295
+ element.removeEventListener(Events.TOUCH_END, this._endCallback);
296
+ element.removeEventListener(Events.TOUCH_DRAG, this._dragModifyCallback);
297
+ element.removeEventListener(Events.TOUCH_TAP, this._endCallback);
298
+ };
299
+ this._activateDraw = (element) => {
300
+ state.isInteractingWithTool = true;
301
+ element.addEventListener(Events.MOUSE_UP, this._endCallback);
302
+ element.addEventListener(Events.MOUSE_DRAG, this._dragDrawCallback);
303
+ element.addEventListener(Events.MOUSE_MOVE, this._dragDrawCallback);
304
+ element.addEventListener(Events.MOUSE_CLICK, this._endCallback);
305
+ element.addEventListener(Events.TOUCH_END, this._endCallback);
306
+ element.addEventListener(Events.TOUCH_DRAG, this._dragDrawCallback);
307
+ element.addEventListener(Events.TOUCH_TAP, this._endCallback);
308
+ };
309
+ this._deactivateDraw = (element) => {
310
+ state.isInteractingWithTool = false;
311
+ element.removeEventListener(Events.MOUSE_UP, this._endCallback);
312
+ element.removeEventListener(Events.MOUSE_DRAG, this._dragDrawCallback);
313
+ element.removeEventListener(Events.MOUSE_MOVE, this._dragDrawCallback);
314
+ element.removeEventListener(Events.MOUSE_CLICK, this._endCallback);
315
+ element.removeEventListener(Events.TOUCH_END, this._endCallback);
316
+ element.removeEventListener(Events.TOUCH_DRAG, this._dragDrawCallback);
317
+ element.removeEventListener(Events.TOUCH_TAP, this._endCallback);
318
+ };
319
+ this.renderAnnotation = (enabledElement, svgDrawingHelper) => {
320
+ let renderStatus = false;
321
+ const { viewport } = enabledElement;
322
+ const { element } = viewport;
323
+ let annotations = getAnnotations(this.getToolName(), element);
324
+ if (!annotations?.length) {
325
+ return renderStatus;
326
+ }
327
+ annotations = this.filterInteractableAnnotationsForElement(element, annotations);
328
+ if (!annotations?.length) {
329
+ return renderStatus;
330
+ }
331
+ const targetId = this.getTargetId(viewport);
332
+ const renderingEngine = viewport.getRenderingEngine();
333
+ const styleSpecifier = {
334
+ toolGroupId: this.toolGroupId,
335
+ toolName: this.getToolName(),
336
+ viewportId: enabledElement.viewport.id,
337
+ };
338
+ for (let i = 0; i < annotations.length; i++) {
339
+ const annotation = annotations[i];
340
+ const { annotationUID, data } = annotation;
341
+ const { handles } = data;
342
+ const { points, activeHandleIndex } = handles;
343
+ styleSpecifier.annotationUID = annotationUID;
344
+ const lineWidth = this.getStyle('lineWidth', styleSpecifier, annotation);
345
+ const lineDash = this.getStyle('lineDash', styleSpecifier, annotation);
346
+ const color = this.getStyle('color', styleSpecifier, annotation);
347
+ const canvasCoordinates = points.map((p) => viewport.worldToCanvas(p));
348
+ const center = canvasCoordinates[0];
349
+ const radius = getCanvasCircleRadius(canvasCoordinates);
350
+ const canvasCorners = getCanvasCircleCorners(canvasCoordinates);
351
+ const { centerPointRadius } = this.configuration;
352
+ if (!data.cachedStats[targetId] ||
353
+ data.cachedStats[targetId].areaUnit === undefined) {
354
+ data.cachedStats[targetId] = {
355
+ Modality: null,
356
+ area: null,
357
+ max: null,
358
+ mean: null,
359
+ stdDev: null,
360
+ areaUnit: null,
361
+ radius: null,
362
+ radiusUnit: null,
363
+ perimeter: null,
364
+ };
365
+ this._calculateCachedStats(annotation, viewport, renderingEngine, enabledElement);
366
+ }
367
+ else if (annotation.invalidated) {
368
+ this._throttledCalculateCachedStats(annotation, viewport, renderingEngine, enabledElement);
369
+ if (viewport instanceof VolumeViewport) {
370
+ const { referencedImageId } = annotation.metadata;
371
+ for (const targetId in data.cachedStats) {
372
+ if (targetId.startsWith('imageId')) {
373
+ const viewports = renderingEngine.getStackViewports();
374
+ const invalidatedStack = viewports.find((vp) => {
375
+ const referencedImageURI = csUtils.imageIdToURI(referencedImageId);
376
+ const hasImageURI = vp.hasImageURI(referencedImageURI);
377
+ const currentImageURI = csUtils.imageIdToURI(vp.getCurrentImageId());
378
+ return hasImageURI && currentImageURI !== referencedImageURI;
379
+ });
380
+ if (invalidatedStack) {
381
+ delete data.cachedStats[targetId];
382
+ }
383
+ }
384
+ }
385
+ }
386
+ }
387
+ if (!viewport.getRenderingEngine()) {
388
+ console.warn('Rendering Engine has been destroyed');
389
+ return renderStatus;
390
+ }
391
+ let activeHandleCanvasCoords;
392
+ if (!isAnnotationVisible(annotationUID)) {
393
+ continue;
394
+ }
395
+ if (!isAnnotationLocked(annotation) &&
396
+ !this.editData &&
397
+ activeHandleIndex !== null) {
398
+ activeHandleCanvasCoords = [canvasCoordinates[activeHandleIndex]];
399
+ }
400
+ if (activeHandleCanvasCoords) {
401
+ const handleGroupUID = '0';
402
+ drawHandlesSvg(svgDrawingHelper, annotationUID, handleGroupUID, activeHandleCanvasCoords, {
403
+ color,
404
+ });
405
+ }
406
+ const dataId = `${annotationUID}-circle`;
407
+ const circleUID = '0';
408
+ drawCircleSvg(svgDrawingHelper, annotationUID, circleUID, center, radius, {
409
+ color,
410
+ lineDash,
411
+ lineWidth,
412
+ }, dataId);
413
+ if (centerPointRadius > 0) {
414
+ if (radius > 3 * centerPointRadius) {
415
+ drawCircleSvg(svgDrawingHelper, annotationUID, `${circleUID}-center`, center, centerPointRadius, {
416
+ color,
417
+ lineDash,
418
+ lineWidth,
419
+ });
420
+ }
421
+ }
422
+ renderStatus = true;
423
+ const isPreScaled = isViewportPreScaled(viewport, targetId);
424
+ const textLines = this._getTextLines(data, targetId, isPreScaled);
425
+ if (!textLines || textLines.length === 0) {
426
+ continue;
427
+ }
428
+ let canvasTextBoxCoords;
429
+ if (!data.handles.textBox.hasMoved) {
430
+ canvasTextBoxCoords = getTextBoxCoordsCanvas(canvasCorners);
431
+ data.handles.textBox.worldPosition =
432
+ viewport.canvasToWorld(canvasTextBoxCoords);
433
+ }
434
+ const textBoxPosition = viewport.worldToCanvas(data.handles.textBox.worldPosition);
435
+ const textBoxUID = '1';
436
+ const boundingBox = drawLinkedTextBoxSvg(svgDrawingHelper, annotationUID, textBoxUID, textLines, textBoxPosition, canvasCoordinates, {}, this.getLinkedTextBoxStyle(styleSpecifier, annotation));
437
+ const { x: left, y: top, width, height } = boundingBox;
438
+ data.handles.textBox.worldBoundingBox = {
439
+ topLeft: viewport.canvasToWorld([left, top]),
440
+ topRight: viewport.canvasToWorld([left + width, top]),
441
+ bottomLeft: viewport.canvasToWorld([left, top + height]),
442
+ bottomRight: viewport.canvasToWorld([left + width, top + height]),
443
+ };
444
+ }
445
+ return renderStatus;
446
+ };
447
+ this._getTextLines = (data, targetId, isPreScaled) => {
448
+ const cachedVolumeStats = data.cachedStats[targetId];
449
+ const { radius, radiusUnit, area, mean, stdDev, max, isEmptyArea, Modality, areaUnit, } = cachedVolumeStats;
450
+ const textLines = [];
451
+ const unit = getModalityUnit(Modality, isPreScaled);
452
+ if (radius) {
453
+ const radiusLine = isEmptyArea
454
+ ? `Radius: Oblique not supported`
455
+ : `Radius: ${radius.toFixed(2)} ${radiusUnit}`;
456
+ textLines.push(radiusLine);
457
+ }
458
+ if (area) {
459
+ const areaLine = isEmptyArea
460
+ ? `Area: Oblique not supported`
461
+ : `Area: ${area.toFixed(2)} ${areaUnit}\xb2`;
462
+ textLines.push(areaLine);
463
+ }
464
+ if (mean) {
465
+ textLines.push(`Mean: ${mean.toFixed(2)} ${unit}`);
466
+ }
467
+ if (max) {
468
+ textLines.push(`Max: ${max.toFixed(2)} ${unit}`);
469
+ }
470
+ if (stdDev) {
471
+ textLines.push(`Std Dev: ${stdDev.toFixed(2)} ${unit}`);
472
+ }
473
+ return textLines;
474
+ };
475
+ this._calculateCachedStats = (annotation, viewport, renderingEngine, enabledElement) => {
476
+ const data = annotation.data;
477
+ const { viewportId, renderingEngineId } = enabledElement;
478
+ const { points } = data.handles;
479
+ const canvasCoordinates = points.map((p) => viewport.worldToCanvas(p));
480
+ const { viewPlaneNormal, viewUp } = viewport.getCamera();
481
+ const [topLeftCanvas, bottomRightCanvas] = (getCanvasCircleCorners(canvasCoordinates));
482
+ const topLeftWorld = viewport.canvasToWorld(topLeftCanvas);
483
+ const bottomRightWorld = viewport.canvasToWorld(bottomRightCanvas);
484
+ const { cachedStats } = data;
485
+ const targetIds = Object.keys(cachedStats);
486
+ const worldPos1 = topLeftWorld;
487
+ const worldPos2 = bottomRightWorld;
488
+ for (let i = 0; i < targetIds.length; i++) {
489
+ const targetId = targetIds[i];
490
+ const image = this.getTargetIdImage(targetId, renderingEngine);
491
+ if (!image) {
492
+ continue;
493
+ }
494
+ const { dimensions, imageData, metadata, hasPixelSpacing } = image;
495
+ const worldPos1Index = transformWorldToIndex(imageData, worldPos1);
496
+ worldPos1Index[0] = Math.floor(worldPos1Index[0]);
497
+ worldPos1Index[1] = Math.floor(worldPos1Index[1]);
498
+ worldPos1Index[2] = Math.floor(worldPos1Index[2]);
499
+ const worldPos2Index = transformWorldToIndex(imageData, worldPos2);
500
+ worldPos2Index[0] = Math.floor(worldPos2Index[0]);
501
+ worldPos2Index[1] = Math.floor(worldPos2Index[1]);
502
+ worldPos2Index[2] = Math.floor(worldPos2Index[2]);
503
+ if (this._isInsideVolume(worldPos1Index, worldPos2Index, dimensions)) {
504
+ const iMin = Math.min(worldPos1Index[0], worldPos2Index[0]);
505
+ const iMax = Math.max(worldPos1Index[0], worldPos2Index[0]);
506
+ const jMin = Math.min(worldPos1Index[1], worldPos2Index[1]);
507
+ const jMax = Math.max(worldPos1Index[1], worldPos2Index[1]);
508
+ const kMin = Math.min(worldPos1Index[2], worldPos2Index[2]);
509
+ const kMax = Math.max(worldPos1Index[2], worldPos2Index[2]);
510
+ const boundsIJK = [
511
+ [iMin, iMax],
512
+ [jMin, jMax],
513
+ [kMin, kMax],
514
+ ];
515
+ const center = [
516
+ (topLeftWorld[0] + bottomRightWorld[0]) / 2,
517
+ (topLeftWorld[1] + bottomRightWorld[1]) / 2,
518
+ (topLeftWorld[2] + bottomRightWorld[2]) / 2,
519
+ ];
520
+ const ellipseObj = {
521
+ center,
522
+ xRadius: Math.abs(topLeftWorld[0] - bottomRightWorld[0]) / 2,
523
+ yRadius: Math.abs(topLeftWorld[1] - bottomRightWorld[1]) / 2,
524
+ zRadius: Math.abs(topLeftWorld[2] - bottomRightWorld[2]) / 2,
525
+ };
526
+ const { worldWidth, worldHeight } = getWorldWidthAndHeightFromTwoPoints(viewPlaneNormal, viewUp, worldPos1, worldPos2);
527
+ const isEmptyArea = worldWidth === 0 && worldHeight === 0;
528
+ const area = Math.abs(Math.PI * (worldWidth / 2) * (worldHeight / 2));
529
+ let count = 0;
530
+ let mean = 0;
531
+ let stdDev = 0;
532
+ let max = -Infinity;
533
+ const meanMaxCalculator = ({ value: newValue }) => {
534
+ if (newValue > max) {
535
+ max = newValue;
536
+ }
537
+ mean += newValue;
538
+ count += 1;
539
+ };
540
+ pointInShapeCallback(imageData, (pointLPS, pointIJK) => pointInEllipse(ellipseObj, pointLPS), meanMaxCalculator, boundsIJK);
541
+ mean /= count;
542
+ const stdCalculator = ({ value }) => {
543
+ const valueMinusMean = value - mean;
544
+ stdDev += valueMinusMean * valueMinusMean;
545
+ };
546
+ pointInShapeCallback(imageData, (pointLPS, pointIJK) => pointInEllipse(ellipseObj, pointLPS), stdCalculator, boundsIJK);
547
+ stdDev /= count;
548
+ stdDev = Math.sqrt(stdDev);
549
+ cachedStats[targetId] = {
550
+ Modality: metadata.Modality,
551
+ area,
552
+ mean,
553
+ max,
554
+ stdDev,
555
+ isEmptyArea,
556
+ areaUnit: hasPixelSpacing ? 'mm' : 'px',
557
+ radius: worldWidth / 2,
558
+ radiusUnit: hasPixelSpacing ? 'mm' : 'px',
559
+ perimeter: 2 * Math.PI * (worldWidth / 2),
560
+ };
561
+ }
562
+ else {
563
+ this.isHandleOutsideImage = true;
564
+ cachedStats[targetId] = {
565
+ Modality: metadata.Modality,
566
+ };
567
+ }
568
+ }
569
+ annotation.invalidated = false;
570
+ const eventType = Events.ANNOTATION_MODIFIED;
571
+ const eventDetail = {
572
+ annotation,
573
+ viewportId,
574
+ renderingEngineId,
575
+ };
576
+ triggerEvent(eventTarget, eventType, eventDetail);
577
+ return cachedStats;
578
+ };
579
+ this._isInsideVolume = (index1, index2, dimensions) => {
580
+ return (csUtils.indexWithinDimensions(index1, dimensions) &&
581
+ csUtils.indexWithinDimensions(index2, dimensions));
582
+ };
583
+ this._throttledCalculateCachedStats = throttle(this._calculateCachedStats, 100, { trailing: true });
584
+ }
585
+ }
586
+ CircleROITool.toolName = 'CircleROI';
587
+ export default CircleROITool;
588
+ //# sourceMappingURL=CircleROITool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CircleROITool.js","sourceRoot":"","sources":["../../../../src/tools/annotation/CircleROITool.ts"],"names":[],"mappings":"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"}
@@ -500,7 +500,7 @@ class EllipticalROITool extends AnnotationTool {
500
500
  const minRadius = Math.min(Math.abs(canvasCorners[0][0] - canvasCorners[1][0]) / 2, Math.abs(canvasCorners[0][1] - canvasCorners[1][1]) / 2);
501
501
  if (minRadius > 3 * centerPointRadius) {
502
502
  const centerPoint = this._getCanvasEllipseCenter(canvasCoordinates);
503
- drawCircleSvg(svgDrawingHelper, annotationUID, ellipseUID, centerPoint, centerPointRadius, {
503
+ drawCircleSvg(svgDrawingHelper, annotationUID, `${ellipseUID}-center`, centerPoint, centerPointRadius, {
504
504
  color,
505
505
  lineDash,
506
506
  lineWidth,
@@ -607,7 +607,7 @@ class EllipticalROITool extends AnnotationTool {
607
607
  };
608
608
  const { worldWidth, worldHeight } = getWorldWidthAndHeightFromTwoPoints(viewPlaneNormal, viewUp, worldPos1, worldPos2);
609
609
  const isEmptyArea = worldWidth === 0 && worldHeight === 0;
610
- const area = Math.PI * (worldWidth / 2) * (worldHeight / 2);
610
+ const area = Math.abs(Math.PI * (worldWidth / 2) * (worldHeight / 2));
611
611
  let count = 0;
612
612
  let mean = 0;
613
613
  let stdDev = 0;