larvitar 3.8.10 → 3.8.12

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.
@@ -0,0 +1,48 @@
1
+ import cornerstone from "cornerstone-core";
2
+ import { Coords, EventData, HandlePosition, HandleTextBox, MeasurementData } from "../types";
3
+ declare const BaseAnnotationTool: any;
4
+ interface CobbAngleHandles {
5
+ point0: HandlePosition;
6
+ point1: HandlePosition;
7
+ point2?: HandlePosition;
8
+ point3?: HandlePosition;
9
+ textBox: HandleTextBox;
10
+ }
11
+ type CobbAngleMeasurementData = MeasurementData & {
12
+ complete: boolean;
13
+ value?: number;
14
+ handles: CobbAngleHandles;
15
+ };
16
+ type DrawPhase = "idle" | "seg1Move" | "seg2Wait" | "seg2Move";
17
+ export default class CobbAngleTool extends BaseAnnotationTool {
18
+ _phase: DrawPhase;
19
+ constructor(props?: any);
20
+ createNewMeasurement(eventData: EventData): CobbAngleMeasurementData | undefined;
21
+ addNewMeasurement(evt: {
22
+ detail: EventData;
23
+ }, _interactionType?: string): void;
24
+ pointNearTool(element: HTMLElement, data: CobbAngleMeasurementData, coords: Coords, interactionType?: string): boolean;
25
+ distanceFromPoint(element: HTMLElement, data: CobbAngleMeasurementData, coords: Coords): number;
26
+ renderToolData(evt: {
27
+ detail: EventData;
28
+ }): void;
29
+ _activateDraw(element: HTMLElement): void;
30
+ _deactivateDraw(element: HTMLElement): void;
31
+ _onMouseMove: (evt: {
32
+ detail: EventData;
33
+ }) => void;
34
+ _onMouseClick: (evt: {
35
+ detail: EventData;
36
+ }) => void;
37
+ handleSelectedCallback(evt: {
38
+ detail: EventData;
39
+ }, data: CobbAngleMeasurementData, handle: HandlePosition, interactionType?: string): void;
40
+ toolSelectedCallback(evt: {
41
+ detail: EventData;
42
+ }, annotation: CobbAngleMeasurementData, interactionType?: string): void;
43
+ updateCachedStats(image: cornerstone.Image, element: HTMLElement, data: CobbAngleMeasurementData): void;
44
+ _updateStats(_image: cornerstone.Image | undefined, _element: HTMLElement, data: CobbAngleMeasurementData): void;
45
+ _segDistCanvas(element: HTMLElement, p1: Coords, p2: Coords, canvasCoords: Coords): number;
46
+ _segDistPixel(element: HTMLElement, p1: Coords, p2: Coords, pixelCoords: Coords): number;
47
+ }
48
+ export {};
@@ -0,0 +1,135 @@
1
+ import { Coords, EventData, HandlePosition, MeasurementMouseEvent, TPAAnnotation, TPAMeasurementState } from "../types";
2
+ declare const BaseAnnotationTool: any;
3
+ export default class TPAAnnotationTool extends BaseAnnotationTool {
4
+ private currentState;
5
+ private currentAnnotation;
6
+ private isDragging;
7
+ constructor(props?: any);
8
+ createNewMeasurement(eventData: EventData): {
9
+ visible: boolean;
10
+ active: boolean;
11
+ color: undefined;
12
+ invalidated: boolean;
13
+ handles: {
14
+ ftaStart: {
15
+ x: number;
16
+ y: number;
17
+ highlight: boolean;
18
+ active: boolean;
19
+ };
20
+ ftaEnd: {
21
+ x: number;
22
+ y: number;
23
+ highlight: boolean;
24
+ active: boolean;
25
+ };
26
+ mtpStart: {
27
+ x: number;
28
+ y: number;
29
+ highlight: boolean;
30
+ active: boolean;
31
+ };
32
+ mtpEnd: {
33
+ x: number;
34
+ y: number;
35
+ highlight: boolean;
36
+ active: boolean;
37
+ };
38
+ refStart: {
39
+ x: number;
40
+ y: number;
41
+ highlight: boolean;
42
+ active: boolean;
43
+ };
44
+ refEnd: {
45
+ x: number;
46
+ y: number;
47
+ highlight: boolean;
48
+ active: boolean;
49
+ };
50
+ intersectionPoint: {
51
+ x: number;
52
+ y: number;
53
+ };
54
+ ftaTextBox: {
55
+ active: boolean;
56
+ hasMoved: boolean;
57
+ movesIndependently: boolean;
58
+ drawnIndependently: boolean;
59
+ allowedOutsideImage: boolean;
60
+ hasBoundingBox: boolean;
61
+ x: number;
62
+ y: number;
63
+ };
64
+ mtpTextBox: {
65
+ active: boolean;
66
+ hasMoved: boolean;
67
+ movesIndependently: boolean;
68
+ drawnIndependently: boolean;
69
+ allowedOutsideImage: boolean;
70
+ hasBoundingBox: boolean;
71
+ x: number;
72
+ y: number;
73
+ };
74
+ refTextBox: {
75
+ active: boolean;
76
+ hasMoved: boolean;
77
+ movesIndependently: boolean;
78
+ drawnIndependently: boolean;
79
+ allowedOutsideImage: boolean;
80
+ hasBoundingBox: boolean;
81
+ x: number;
82
+ y: number;
83
+ };
84
+ tpaTextBox: {
85
+ active: boolean;
86
+ hasMoved: boolean;
87
+ movesIndependently: boolean;
88
+ drawnIndependently: boolean;
89
+ allowedOutsideImage: boolean;
90
+ hasBoundingBox: boolean;
91
+ x: number;
92
+ y: number;
93
+ };
94
+ };
95
+ cachedStats: {
96
+ tpaAngle: number;
97
+ ftaLength: number;
98
+ mtpLength: number;
99
+ };
100
+ measurementState: TPAMeasurementState;
101
+ } | null;
102
+ addNewMeasurement(evt: MeasurementMouseEvent): TPAAnnotation | null;
103
+ mouseMoveCallback(evt: MeasurementMouseEvent): void;
104
+ mouseDragCallback(evt: MeasurementMouseEvent): void;
105
+ /**
106
+ * Extracted logic to finalize the Functional Tibial Axis (Step 1)
107
+ */
108
+ private _finishFTA;
109
+ /**
110
+ * Extracted logic to finalize the Medial Tibial Plateau (Step 2)
111
+ */
112
+ private _finishMTP;
113
+ preMouseDownCallback(evt: MeasurementMouseEvent): void;
114
+ mouseUpCallback(evt: MeasurementMouseEvent): void;
115
+ /**
116
+ * Computes the intersection point of the infinite MTP line with the
117
+ * infinite FTA line using parametric line-line intersection.
118
+ *
119
+ */
120
+ computeLineLineIntersection(p1: Coords, d1: Coords, // FTA: point + direction
121
+ p2: Coords, d2: Coords): Coords | null;
122
+ computeReferenceLineAndAngle(data: any): void;
123
+ updateCachedStats(image: any, element: HTMLElement, data: any): any;
124
+ renderToolData(evt: MeasurementMouseEvent): void;
125
+ /**
126
+ * The arc sweeps from the Reference Line direction to the MTP direction
127
+ */
128
+ drawAngleArc(context: CanvasRenderingContext2D, element: HTMLElement, handles: any, cachedStats: any, color: string): void;
129
+ pointNearTool(element: HTMLElement, data: any, coords: Coords, interactionType: string): boolean;
130
+ isPointNearHandle(element: HTMLElement, handle: HandlePosition, coords: Coords, PROXIMITY_DISTANCE: number): boolean;
131
+ isPointNearLine(element: HTMLElement, startHandle: HandlePosition, endHandle: HandlePosition, coords: Coords, PROXIMITY_DISTANCE: number): boolean;
132
+ PROXIMITY_DISTANCEToLineSegment(point: Coords, lineStart: Coords, lineEnd: Coords): number;
133
+ getHandleNearImagePoint(element: HTMLElement, data: any, coords: Coords, interactionType: string): any;
134
+ }
135
+ export {};
@@ -0,0 +1,31 @@
1
+ import { Coords, EventData, HandlePosition, Handles, MeasurementMouseEvent, VHSAnnotationData, VHSCachedStats } from "../types";
2
+ declare const BaseAnnotationTool: any;
3
+ export default class VHSAnnotationTool extends BaseAnnotationTool {
4
+ private currentState;
5
+ private currentAnnotation;
6
+ private isDragging;
7
+ private _throttledMouseMove;
8
+ private _throttledMouseDrag;
9
+ constructor(props?: Record<string, unknown>);
10
+ createNewMeasurement(eventData: EventData): VHSAnnotationData | null;
11
+ calculateDistance(point1: Coords, point2: Coords): number;
12
+ addNewMeasurement(evt: MeasurementMouseEvent): VHSAnnotationData | null;
13
+ mouseMoveCallback(evt: MeasurementMouseEvent): void;
14
+ private _mouseMoveImpl;
15
+ mouseDragCallback(evt: MeasurementMouseEvent): void;
16
+ private _mouseDragImpl;
17
+ private _completeSegment;
18
+ mouseUpCallback(evt: MeasurementMouseEvent): void;
19
+ preMouseDownCallback(evt: MeasurementMouseEvent): void;
20
+ private _autoPositionTextBox;
21
+ renderToolData(evt: MeasurementMouseEvent): void;
22
+ drawProjectionVisualization(context: CanvasRenderingContext2D, element: HTMLElement, handles: Handles, label: string, color: string, offset: number, cachedStats: VHSCachedStats): void;
23
+ drawTick(context: CanvasRenderingContext2D, element: HTMLElement, point: Coords, angle: number, color: string): void;
24
+ updateCachedStats(image: unknown, element: HTMLElement, data: VHSAnnotationData): VHSCachedStats;
25
+ pointNearTool(element: HTMLElement, data: VHSAnnotationData, coords: Coords, interactionType: string): boolean;
26
+ isPointNearHandle(element: HTMLElement, handle: HandlePosition, coords: Coords, distance: number): boolean;
27
+ isPointNearLine(element: HTMLElement, startHandle: HandlePosition, endHandle: HandlePosition, coords: Coords, distance: number): boolean;
28
+ distanceToLineSegment(point: Coords, lineStart: Coords, lineEnd: Coords): number;
29
+ getHandleNearImagePoint(element: HTMLElement, data: VHSAnnotationData, coords: Coords, interactionType: string): HandlePosition | null;
30
+ }
31
+ export {};
@@ -0,0 +1,88 @@
1
+ import { EnabledElement, Image } from "cornerstone-core";
2
+ declare const BaseTool: any;
3
+ import { Coords, MeasurementMouseEvent } from "../types";
4
+ /**
5
+ * @public
6
+ * @class GridTool
7
+ * @memberof Tools.Base
8
+ * @classdesc Tool for drawing a grid with customizable parameters on image,
9
+ * such as grid dimension and center position
10
+ * @extends Tools.Base
11
+ */
12
+ export declare class GridTool extends BaseTool {
13
+ center: Coords | null;
14
+ constructor(props?: {});
15
+ /**
16
+ * function triggered when tool is set to active
17
+ *
18
+ * @private
19
+ * @param {HTMLElement} element - The viewport element to add event listeners to.
20
+ * @modifies {element}
21
+ * @returns {Promise<void>}
22
+ */
23
+ activeCallback(element: HTMLElement): Promise<void>;
24
+ triggerInputGridDimensionChange(event: any): void;
25
+ /**
26
+ * function triggered when tool is set to disabled
27
+ *
28
+ * @private
29
+ * @param {HTMLElement} element - The viewport element to add remove listeners to.
30
+ * @modifies {element}
31
+ * @returns {void}
32
+ */
33
+ disabledCallback(element: HTMLElement): void;
34
+ /**
35
+ * function triggered when tool is set to passive
36
+ *
37
+ * @private
38
+ * @param {HTMLElement} element - The viewport element to add remove listeners to.
39
+ * @modifies {element}
40
+ * @returns {void}
41
+ */
42
+ passiveCallback(element: HTMLElement): void;
43
+ /**
44
+ * function to change center of the grid position on user click
45
+ *
46
+ * @private
47
+ * @param {MeasurementMouseEvent} evt - The click event
48
+ * @returns {void}
49
+ */
50
+ handleMouseClick(evt: MeasurementMouseEvent): void;
51
+ /**
52
+ * @private
53
+ * @param {MeasurementMouseEvent} evt - The click event
54
+ * @returns {void}
55
+ */
56
+ renderToolData(evt: MeasurementMouseEvent): void;
57
+ /**
58
+ * function to trigger the draw grid
59
+ * @private
60
+ * @param {EnabledElement} enabledElement
61
+ * @returns {void}
62
+ */
63
+ triggerDrawGrid(enabledElement: EnabledElement): void;
64
+ /**
65
+ * function to draw the grid
66
+ * @private
67
+ * @param {CanvasRenderingContext2D} context
68
+ * @param {number} xCenter
69
+ * @param {number} yCenter
70
+ * @param {Coords} start
71
+ * @param {Coords} end
72
+ * @param {number} patternWidth
73
+ * @param {number} patternHeight
74
+ * @param {number} dashWidth
75
+ * @param {number} dashHeight
76
+ * @param {string} lightGray
77
+ * @param {string} darkGray
78
+ * @returns {void}
79
+ */
80
+ drawDashedGrid(context: CanvasRenderingContext2D, xCenter: number, yCenter: number, start: Coords, end: Coords, patternWidth: number, patternHeight: number, dashWidth: number, dashHeight: number, imageDashHeight: number, imageDashWidth: number, lightGray: string, darkGray: string, image: Image, element: HTMLElement): void;
81
+ /**
82
+ * returns grid's pixelArray
83
+ * @private
84
+ * @returns {number[]}
85
+ */
86
+ getGridPixelArray(): any;
87
+ }
88
+ export {};
@@ -0,0 +1,27 @@
1
+ import { Image, CanvasCoordinate } from "cornerstone-core";
2
+ import { Coords } from "../../../types";
3
+ export type GridData = {
4
+ from: Coords;
5
+ to: Coords;
6
+ color: string;
7
+ };
8
+ export declare function handleElement(element: HTMLElement): Promise<any>;
9
+ export declare function validatePixelSpacing(spacingX: number, spacingY: number, minPixelSpacing: number): void;
10
+ export declare function mmToPixels(mm: number, pixelSpacing: any): number;
11
+ export declare function findImageCoords(element: HTMLElement, image: Image): {
12
+ start: CanvasCoordinate;
13
+ end: CanvasCoordinate;
14
+ };
15
+ export declare function convertDimensionsToCanvas(element: HTMLElement, width: number, height: number): {
16
+ width: number;
17
+ height: number;
18
+ };
19
+ export declare function getColors(bitDepth: number, colorFractionLight: number, colorFractionDark: number): {
20
+ lightGray: string;
21
+ darkGray: string;
22
+ lightColorCode: number;
23
+ darkColorCode: number;
24
+ };
25
+ export declare function drawDashedLine(context: CanvasRenderingContext2D, from: Coords, to: Coords, color: string): void;
26
+ export declare function drawVerticalLines(context: CanvasRenderingContext2D, xCenter: number, start: Coords, end: Coords, patternWidth: number, dashWidth: number, dashHeight: number, imageDashHeight: number, imageDashWidth: number, lightGray: string, darkGray: string, gridPixelArray: number[], image: Image, element: HTMLElement): void;
27
+ export declare function drawHorizontalLines(context: CanvasRenderingContext2D, yCenter: number, start: Coords, end: Coords, patternHeight: number, dashWidth: number, dashHeight: number, imageDashHeight: number, imageDashWidth: number, lightGray: string, darkGray: string, gridPixelArray: number[], image: Image, element: HTMLElement): void;
@@ -466,6 +466,12 @@ export type Rectangle = {
466
466
  height: number;
467
467
  };
468
468
  export interface Handles {
469
+ vertebralStart?: HandlePosition;
470
+ vertebralEnd?: HandlePosition;
471
+ longAxisEnd?: HandlePosition;
472
+ longAxisStart?: HandlePosition;
473
+ shortAxisStart?: HandlePosition;
474
+ shortAxisEnd?: HandlePosition;
469
475
  start?: HandlePosition;
470
476
  end?: HandlePosition;
471
477
  offset?: number;
@@ -553,4 +559,98 @@ export type ThresholdsBrushProp = {
553
559
  };
554
560
  mixins: string[];
555
561
  };
562
+ export interface VHSCachedStats {
563
+ vertebralLength: number;
564
+ longAxisLength: number;
565
+ shortAxisLength: number;
566
+ longAxisProjection: number;
567
+ shortAxisProjection: number;
568
+ longAxisAngle: number;
569
+ shortAxisAngle: number;
570
+ longAxisVHS: number;
571
+ shortAxisVHS: number;
572
+ totalVHS: number;
573
+ }
574
+ export interface VHSAnnotationData {
575
+ visible: boolean;
576
+ active: boolean;
577
+ color: string | undefined;
578
+ invalidated: boolean;
579
+ handles: {
580
+ vertebralStart: HandlePosition;
581
+ vertebralEnd: HandlePosition;
582
+ longAxisStart: HandlePosition;
583
+ longAxisEnd: HandlePosition;
584
+ shortAxisStart: HandlePosition;
585
+ shortAxisEnd: HandlePosition;
586
+ vertebralTextBox: HandleTextBox;
587
+ longAxisTextBox: HandleTextBox;
588
+ shortAxisTextBox: HandleTextBox;
589
+ vhsTextBox: HandleTextBox;
590
+ };
591
+ cachedStats: VHSCachedStats;
592
+ measurementState: VHSMeasurementState;
593
+ }
594
+ export declare enum VHSMeasurementState {
595
+ IDLE = 0,
596
+ VERTEBRAL_START = 1,
597
+ VERTEBRAL_END = 2,
598
+ LONG_AXIS_START = 3,
599
+ LONG_AXIS_END = 4,
600
+ SHORT_AXIS_START = 5,
601
+ SHORT_AXIS_END = 6,
602
+ COMPLETE = 7
603
+ }
604
+ export declare enum TPAMeasurementState {
605
+ IDLE = 0,
606
+ FUNCTIONAL_AXIS_START = 1,// Dragging FTA line
607
+ FUNCTIONAL_AXIS_END = 2,// FTA complete, waiting for MTP start click
608
+ MEDIAL_PLATEAU_START = 3,// Dragging MTP line
609
+ MEDIAL_PLATEAU_END = 4,// MTP complete → compute REF + angle
610
+ COMPLETE = 5
611
+ }
612
+ export interface TPACachedStats {
613
+ tpaAngle: number;
614
+ ftaLength: number;
615
+ mtpLength: number;
616
+ mtpNx?: number;
617
+ mtpNy?: number;
618
+ perpNx?: number;
619
+ perpNy?: number;
620
+ }
621
+ export interface TPAAnnotation {
622
+ visible: boolean;
623
+ active: boolean;
624
+ color?: string;
625
+ invalidated: boolean;
626
+ measurementState: TPAMeasurementState;
627
+ handles: {
628
+ ftaStart: HandlePosition;
629
+ ftaEnd: HandlePosition;
630
+ ftaTextBox: HandleTextBox;
631
+ mtpStart: HandlePosition;
632
+ mtpEnd: HandlePosition;
633
+ mtpTextBox: HandleTextBox;
634
+ refStart: HandlePosition;
635
+ refEnd: HandlePosition;
636
+ intersectionPoint: Coords;
637
+ refTextBox: HandleTextBox;
638
+ tpaTextBox: HandleTextBox;
639
+ };
640
+ cachedStats: TPACachedStats;
641
+ }
642
+ export type GridConfig = {
643
+ setup: GridSettings;
644
+ gridPixelArray: number[];
645
+ };
646
+ export type GridSettings = {
647
+ minRows: number;
648
+ minColumns: number;
649
+ dashHeightMM: number;
650
+ dashWidthMM: number;
651
+ colorFractionLight: number;
652
+ colorFractionDark: number;
653
+ minPixelSpacing: number;
654
+ gridDimensionMM: number;
655
+ };
556
656
  export {};