copper3d 2.2.3 → 3.0.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.
- package/README.md +1056 -5
- package/dist/Scene/copperScene.d.ts +3 -0
- package/dist/Scene/copperScene.js +13 -0
- package/dist/Scene/copperScene.js.map +1 -1
- package/dist/Utils/segmentation/CommToolsData.d.ts +113 -11
- package/dist/Utils/segmentation/CommToolsData.js +314 -59
- package/dist/Utils/segmentation/CommToolsData.js.map +1 -1
- package/dist/Utils/segmentation/DragOperator.d.ts +13 -7
- package/dist/Utils/segmentation/DragOperator.js +51 -165
- package/dist/Utils/segmentation/DragOperator.js.map +1 -1
- package/dist/Utils/segmentation/DrawToolCore.d.ts +56 -76
- package/dist/Utils/segmentation/DrawToolCore.js +383 -891
- package/dist/Utils/segmentation/DrawToolCore.js.map +1 -1
- package/dist/Utils/segmentation/NrrdTools.d.ts +277 -15
- package/dist/Utils/segmentation/NrrdTools.js +600 -234
- package/dist/Utils/segmentation/NrrdTools.js.map +1 -1
- package/dist/Utils/segmentation/core/MaskVolume.d.ts +444 -0
- package/dist/Utils/segmentation/core/MaskVolume.js +1117 -0
- package/dist/Utils/segmentation/core/MaskVolume.js.map +1 -0
- package/dist/Utils/segmentation/core/MigrationUtils.d.ts +97 -0
- package/dist/Utils/segmentation/core/MigrationUtils.js +163 -0
- package/dist/Utils/segmentation/core/MigrationUtils.js.map +1 -0
- package/dist/Utils/segmentation/core/UndoManager.d.ts +47 -0
- package/dist/Utils/segmentation/core/UndoManager.js +86 -0
- package/dist/Utils/segmentation/core/UndoManager.js.map +1 -0
- package/dist/Utils/segmentation/core/index.d.ts +76 -0
- package/dist/Utils/segmentation/core/index.js +75 -0
- package/dist/Utils/segmentation/core/index.js.map +1 -0
- package/dist/Utils/segmentation/core/types.d.ts +106 -0
- package/dist/Utils/segmentation/core/types.js +98 -0
- package/dist/Utils/segmentation/core/types.js.map +1 -0
- package/dist/Utils/segmentation/coreTools/coreType.d.ts +55 -39
- package/dist/Utils/segmentation/coreTools/coreType.js.map +1 -1
- package/dist/Utils/segmentation/coreTools/gui.d.ts +10 -17
- package/dist/Utils/segmentation/coreTools/gui.js +23 -27
- package/dist/Utils/segmentation/coreTools/gui.js.map +1 -1
- package/dist/Utils/segmentation/eventRouter/EventRouter.d.ts +145 -0
- package/dist/Utils/segmentation/eventRouter/EventRouter.js +375 -0
- package/dist/Utils/segmentation/eventRouter/EventRouter.js.map +1 -0
- package/dist/Utils/segmentation/eventRouter/index.d.ts +7 -0
- package/dist/Utils/segmentation/eventRouter/index.js +7 -0
- package/dist/Utils/segmentation/eventRouter/index.js.map +1 -0
- package/dist/Utils/segmentation/eventRouter/types.d.ts +70 -0
- package/dist/Utils/segmentation/eventRouter/types.js +7 -0
- package/dist/Utils/segmentation/eventRouter/types.js.map +1 -0
- package/dist/Utils/segmentation/tools/BaseTool.d.ts +28 -0
- package/dist/Utils/segmentation/tools/BaseTool.js +18 -0
- package/dist/Utils/segmentation/tools/BaseTool.js.map +1 -0
- package/dist/Utils/segmentation/tools/ContrastTool.d.ts +26 -0
- package/dist/Utils/segmentation/tools/ContrastTool.js +118 -0
- package/dist/Utils/segmentation/tools/ContrastTool.js.map +1 -0
- package/dist/Utils/segmentation/tools/CrosshairTool.d.ts +30 -0
- package/dist/Utils/segmentation/tools/CrosshairTool.js +157 -0
- package/dist/Utils/segmentation/tools/CrosshairTool.js.map +1 -0
- package/dist/Utils/segmentation/tools/DragSliceTool.d.ts +44 -0
- package/dist/Utils/segmentation/tools/DragSliceTool.js +170 -0
- package/dist/Utils/segmentation/tools/DragSliceTool.js.map +1 -0
- package/dist/Utils/segmentation/tools/EraserTool.d.ts +16 -0
- package/dist/Utils/segmentation/tools/EraserTool.js +92 -0
- package/dist/Utils/segmentation/tools/EraserTool.js.map +1 -0
- package/dist/Utils/segmentation/tools/ImageStoreHelper.d.ts +62 -0
- package/dist/Utils/segmentation/tools/ImageStoreHelper.js +160 -0
- package/dist/Utils/segmentation/tools/ImageStoreHelper.js.map +1 -0
- package/dist/Utils/segmentation/tools/SphereTool.d.ts +36 -0
- package/dist/Utils/segmentation/tools/SphereTool.js +193 -0
- package/dist/Utils/segmentation/tools/SphereTool.js.map +1 -0
- package/dist/Utils/segmentation/tools/ZoomTool.d.ts +20 -0
- package/dist/Utils/segmentation/tools/ZoomTool.js +60 -0
- package/dist/Utils/segmentation/tools/ZoomTool.js.map +1 -0
- package/dist/Utils/segmentation/tools/index.d.ts +22 -0
- package/dist/Utils/segmentation/tools/index.js +23 -0
- package/dist/Utils/segmentation/tools/index.js.map +1 -0
- package/dist/bundle.esm.js +4627 -1997
- package/dist/bundle.umd.js +4630 -1996
- package/dist/index.d.ts +5 -3
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/types/Renderer/copperRenderer.d.ts +1 -1
- package/dist/types/Renderer/copperRendererOnDemond.d.ts +1 -1
- package/dist/types/Scene/copperScene.d.ts +3 -0
- package/dist/types/Utils/segmentation/CommToolsData.d.ts +113 -11
- package/dist/types/Utils/segmentation/DragOperator.d.ts +13 -7
- package/dist/types/Utils/segmentation/DrawToolCore.d.ts +56 -76
- package/dist/types/Utils/segmentation/NrrdTools.d.ts +277 -15
- package/dist/types/Utils/segmentation/core/MaskVolume.d.ts +444 -0
- package/dist/types/Utils/segmentation/core/MigrationUtils.d.ts +97 -0
- package/dist/types/Utils/segmentation/core/UndoManager.d.ts +47 -0
- package/dist/types/Utils/segmentation/core/index.d.ts +76 -0
- package/dist/types/Utils/segmentation/core/types.d.ts +106 -0
- package/dist/types/Utils/segmentation/coreTools/coreType.d.ts +55 -39
- package/dist/types/Utils/segmentation/coreTools/gui.d.ts +10 -17
- package/dist/types/Utils/segmentation/eventRouter/EventRouter.d.ts +145 -0
- package/dist/types/Utils/segmentation/eventRouter/index.d.ts +7 -0
- package/dist/types/Utils/segmentation/eventRouter/types.d.ts +70 -0
- package/dist/types/Utils/segmentation/tools/BaseTool.d.ts +28 -0
- package/dist/types/Utils/segmentation/tools/ContrastTool.d.ts +26 -0
- package/dist/types/Utils/segmentation/tools/CrosshairTool.d.ts +30 -0
- package/dist/types/Utils/segmentation/tools/DragSliceTool.d.ts +44 -0
- package/dist/types/Utils/segmentation/tools/EraserTool.d.ts +16 -0
- package/dist/types/Utils/segmentation/tools/ImageStoreHelper.d.ts +62 -0
- package/dist/types/Utils/segmentation/tools/SphereTool.d.ts +36 -0
- package/dist/types/Utils/segmentation/tools/ZoomTool.d.ts +20 -0
- package/dist/types/Utils/segmentation/tools/index.d.ts +22 -0
- package/dist/types/index.d.ts +5 -3
- package/dist/types/types/types.d.ts +3 -3
- package/dist/types/types.d.ts +3 -3
- package/package.json +1 -1
- package/dist/Utils/segmentation/coreTools/archive.d.ts +0 -1
- package/dist/Utils/segmentation/coreTools/archive.js +0 -23
- package/dist/Utils/segmentation/coreTools/archive.js.map +0 -1
- package/dist/types/Utils/segmentation/coreTools/archive.d.ts +0 -1
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core Type Definitions for MaskVolume
|
|
3
|
+
*
|
|
4
|
+
* Shared types for the 3D volumetric mask storage system.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* 3D volume dimensions in voxels.
|
|
8
|
+
*
|
|
9
|
+
* Coordinate convention:
|
|
10
|
+
* x = left-right (sagittal axis)
|
|
11
|
+
* y = front-back (coronal axis)
|
|
12
|
+
* z = bottom-top (axial axis / slice direction)
|
|
13
|
+
*/
|
|
14
|
+
export interface Dimensions {
|
|
15
|
+
width: number;
|
|
16
|
+
height: number;
|
|
17
|
+
depth: number;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* RGBA color with each component in the range [0, 255].
|
|
21
|
+
*/
|
|
22
|
+
export interface RGBAColor {
|
|
23
|
+
r: number;
|
|
24
|
+
g: number;
|
|
25
|
+
b: number;
|
|
26
|
+
a: number;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Maps channel indices to RGBA colors.
|
|
30
|
+
*/
|
|
31
|
+
export type ChannelColorMap = Record<number, RGBAColor>;
|
|
32
|
+
/**
|
|
33
|
+
* Rendering mode for slice extraction.
|
|
34
|
+
*/
|
|
35
|
+
export declare enum RenderMode {
|
|
36
|
+
/** Single channel as grayscale (original behavior). */
|
|
37
|
+
GRAYSCALE = "grayscale",
|
|
38
|
+
/** Single channel with predefined color. */
|
|
39
|
+
COLORED_SINGLE = "colored_single",
|
|
40
|
+
/** All channels composited with colors (last non-zero channel wins). */
|
|
41
|
+
COLORED_MULTI = "colored_multi",
|
|
42
|
+
/** All channels blended (additive). */
|
|
43
|
+
BLENDED = "blended"
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Options for slice rendering via `getSliceImageData()`.
|
|
47
|
+
*/
|
|
48
|
+
export interface SliceRenderOptions {
|
|
49
|
+
/** Rendering mode (default: GRAYSCALE). */
|
|
50
|
+
mode?: RenderMode;
|
|
51
|
+
/** Specific channel to render (for GRAYSCALE / COLORED_SINGLE modes, default 0). */
|
|
52
|
+
channel?: number;
|
|
53
|
+
/** Custom color map (overrides the volume's default). */
|
|
54
|
+
colorMap?: ChannelColorMap;
|
|
55
|
+
/** Channel visibility mask (for COLORED_MULTI / BLENDED modes). */
|
|
56
|
+
visibleChannels?: boolean[];
|
|
57
|
+
/** Opacity multiplier 0.0 – 1.0 (default 1.0). */
|
|
58
|
+
opacity?: number;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Predefined color palette for mask channels.
|
|
62
|
+
*
|
|
63
|
+
* Based on common medical imaging conventions:
|
|
64
|
+
*
|
|
65
|
+
* | Channel | Role | Color |
|
|
66
|
+
* |---------|---------------------------|----------|
|
|
67
|
+
* | 0 | Background | transparent |
|
|
68
|
+
* | 1 | Primary / Tumor | Green |
|
|
69
|
+
* | 2 | Secondary / Edema | Red |
|
|
70
|
+
* | 3 | Tertiary / Necrosis | Blue |
|
|
71
|
+
* | 4 | Enhancement | Yellow |
|
|
72
|
+
* | 5 | Vessel / Boundary | Magenta |
|
|
73
|
+
* | 6 | Additional region | Cyan |
|
|
74
|
+
* | 7 | Auxiliary annotation | Orange |
|
|
75
|
+
* | 8 | Extended annotation | Purple |
|
|
76
|
+
*/
|
|
77
|
+
export declare const MASK_CHANNEL_COLORS: Readonly<ChannelColorMap>;
|
|
78
|
+
/**
|
|
79
|
+
* CSS color strings for the default channel palette (for reference / UI).
|
|
80
|
+
*/
|
|
81
|
+
export declare const MASK_CHANNEL_CSS_COLORS: Readonly<Record<number, string>>;
|
|
82
|
+
/**
|
|
83
|
+
* Layer identifier. Any string key is valid — layers are dynamically defined.
|
|
84
|
+
*/
|
|
85
|
+
export type LayerId = string;
|
|
86
|
+
/**
|
|
87
|
+
* Channel value (0 = transparent/erased, 1-8 = annotation channels).
|
|
88
|
+
*/
|
|
89
|
+
export type ChannelValue = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8;
|
|
90
|
+
/**
|
|
91
|
+
* Convenience alias for MASK_CHANNEL_CSS_COLORS.
|
|
92
|
+
* Used by Vue components via `Copper.CHANNEL_COLORS[channel]`.
|
|
93
|
+
*/
|
|
94
|
+
export declare const CHANNEL_COLORS: Readonly<Record<number, string>>;
|
|
95
|
+
/**
|
|
96
|
+
* Hex color strings for each channel (no alpha), used for fillColor/brushColor.
|
|
97
|
+
*/
|
|
98
|
+
export declare const CHANNEL_HEX_COLORS: Readonly<Record<number, string>>;
|
|
99
|
+
/**
|
|
100
|
+
* Convert an RGBAColor to a hex string (no alpha), e.g. '#ff0000'.
|
|
101
|
+
*/
|
|
102
|
+
export declare function rgbaToHex(color: RGBAColor): string;
|
|
103
|
+
/**
|
|
104
|
+
* Convert an RGBAColor to a CSS rgba() string, e.g. 'rgba(255,0,0,1.00)'.
|
|
105
|
+
*/
|
|
106
|
+
export declare function rgbaToCss(color: RGBAColor): string;
|
|
@@ -63,16 +63,32 @@ interface IPaintImage {
|
|
|
63
63
|
index: number;
|
|
64
64
|
image: ImageData;
|
|
65
65
|
}
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
66
|
+
/**
|
|
67
|
+
* Import MaskVolume from core module
|
|
68
|
+
* (imported where needed, not here to avoid circular deps)
|
|
69
|
+
*/
|
|
70
|
+
type MaskVolume = any;
|
|
71
|
+
/**
|
|
72
|
+
* New mask data structure using MaskVolume for true 3D storage.
|
|
73
|
+
* Dynamic N-layer support: keyed by layer id (e.g. 'layer1', 'layer2', ...).
|
|
74
|
+
*/
|
|
75
|
+
type INewMaskData = Record<string, MaskVolume>;
|
|
76
|
+
/**
|
|
77
|
+
* A paired canvas + 2D context for a single annotation layer.
|
|
78
|
+
* Stored atomically in IProtected.layerTargets to prevent canvas/ctx desync.
|
|
79
|
+
*/
|
|
80
|
+
interface ILayerRenderTarget {
|
|
81
|
+
canvas: HTMLCanvasElement;
|
|
82
|
+
ctx: CanvasRenderingContext2D;
|
|
70
83
|
}
|
|
84
|
+
/**
|
|
85
|
+
* Mask data storage using volumetric MaskVolume (Phase 3)
|
|
86
|
+
*
|
|
87
|
+
* Phase 2 legacy ImageData storage has been removed.
|
|
88
|
+
* All mask data now stored in 3D volumes for memory efficiency.
|
|
89
|
+
*/
|
|
71
90
|
type IMaskData = {
|
|
72
|
-
|
|
73
|
-
paintImagesLabel2: IPaintImages;
|
|
74
|
-
paintImagesLabel3: IPaintImages;
|
|
75
|
-
paintImages: IPaintImages;
|
|
91
|
+
volumes: INewMaskData;
|
|
76
92
|
};
|
|
77
93
|
interface IProtected {
|
|
78
94
|
container: HTMLElement;
|
|
@@ -83,21 +99,18 @@ interface IProtected {
|
|
|
83
99
|
skipSlicesDic: ISkipSlicesDictType;
|
|
84
100
|
currentShowingSlice: any;
|
|
85
101
|
mainPreSlices: any;
|
|
86
|
-
Is_Shift_Pressed: boolean;
|
|
87
|
-
Is_Ctrl_Pressed: boolean;
|
|
88
102
|
Is_Draw: boolean;
|
|
89
103
|
axis: "x" | "y" | "z";
|
|
90
104
|
maskData: IMaskData;
|
|
91
105
|
previousDrawingImage?: ImageData;
|
|
106
|
+
/** Dynamic per-layer canvas+ctx pairs. Replaces hardcoded LayerOne/Two/Three fields. */
|
|
107
|
+
layerTargets: Map<string, ILayerRenderTarget>;
|
|
92
108
|
canvases: {
|
|
93
109
|
originCanvas: HTMLCanvasElement | any;
|
|
94
110
|
drawingCanvas: HTMLCanvasElement;
|
|
95
111
|
displayCanvas: HTMLCanvasElement;
|
|
96
112
|
drawingCanvasLayerMaster: HTMLCanvasElement;
|
|
97
|
-
drawingCanvasLayerOne: HTMLCanvasElement;
|
|
98
|
-
drawingCanvasLayerTwo: HTMLCanvasElement;
|
|
99
113
|
drawingSphereCanvas: HTMLCanvasElement;
|
|
100
|
-
drawingCanvasLayerThree: HTMLCanvasElement;
|
|
101
114
|
emptyCanvas: HTMLCanvasElement;
|
|
102
115
|
};
|
|
103
116
|
ctxes: {
|
|
@@ -106,9 +119,6 @@ interface IProtected {
|
|
|
106
119
|
emptyCtx: CanvasRenderingContext2D;
|
|
107
120
|
drawingSphereCtx: CanvasRenderingContext2D;
|
|
108
121
|
drawingLayerMasterCtx: CanvasRenderingContext2D;
|
|
109
|
-
drawingLayerOneCtx: CanvasRenderingContext2D;
|
|
110
|
-
drawingLayerTwoCtx: CanvasRenderingContext2D;
|
|
111
|
-
drawingLayerThreeCtx: CanvasRenderingContext2D;
|
|
112
122
|
};
|
|
113
123
|
}
|
|
114
124
|
interface IGUIStates {
|
|
@@ -118,12 +128,12 @@ interface IGUIStates {
|
|
|
118
128
|
globalAlpha: number;
|
|
119
129
|
lineWidth: number;
|
|
120
130
|
color: string;
|
|
121
|
-
|
|
131
|
+
pencil: boolean;
|
|
122
132
|
fillColor: string;
|
|
123
133
|
brushColor: string;
|
|
124
134
|
brushAndEraserSize: number;
|
|
125
135
|
cursor: string;
|
|
126
|
-
|
|
136
|
+
layer: string;
|
|
127
137
|
cal_distance: "tumour" | "skin" | "nipple" | "ribcage";
|
|
128
138
|
sphere: boolean;
|
|
129
139
|
calculator: boolean;
|
|
@@ -133,12 +143,20 @@ interface IGUIStates {
|
|
|
133
143
|
clear: () => void;
|
|
134
144
|
clearAll: () => void;
|
|
135
145
|
undo: () => void;
|
|
146
|
+
redo: () => void;
|
|
136
147
|
downloadCurrentMask: () => void;
|
|
137
148
|
resetZoom: () => void;
|
|
149
|
+
/** Currently active channel (1-8). Channel 0 is transparent/erased. */
|
|
150
|
+
activeChannel: number;
|
|
151
|
+
/** Layer visibility state: { layer1: true, layer2: true, layer3: true } */
|
|
152
|
+
layerVisibility: Record<string, boolean>;
|
|
153
|
+
/** Per-layer channel visibility: { layer1: { 1: true, ..., 8: true }, ... } */
|
|
154
|
+
channelVisibility: Record<string, Record<number, boolean>>;
|
|
138
155
|
}
|
|
139
156
|
interface IKeyBoardSettings {
|
|
140
157
|
draw: string;
|
|
141
158
|
undo: string;
|
|
159
|
+
redo: string;
|
|
142
160
|
contrast: string[];
|
|
143
161
|
crosshair: string;
|
|
144
162
|
mouseWheel: "Scroll:Zoom" | "Scroll:Slice";
|
|
@@ -164,10 +182,8 @@ interface INrrdStates {
|
|
|
164
182
|
dimensions: number[];
|
|
165
183
|
loadMaskJson: boolean;
|
|
166
184
|
ratios: ICommXYZ;
|
|
167
|
-
sharedPlace: ICommXYZ;
|
|
168
185
|
contrastNum: number;
|
|
169
186
|
showContrast: boolean;
|
|
170
|
-
enableCursorChoose: boolean;
|
|
171
187
|
isCursorSelect: boolean;
|
|
172
188
|
cursorPageX: number;
|
|
173
189
|
cursorPageY: number;
|
|
@@ -191,10 +207,15 @@ interface INrrdStates {
|
|
|
191
207
|
previousPanelL: number;
|
|
192
208
|
previousPanelT: number;
|
|
193
209
|
switchSliceFlag: boolean;
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
210
|
+
layers: string[];
|
|
211
|
+
getMask: (sliceData: Uint8Array, layerId: string, channelId: number, sliceIndex: number, axis: "x" | "y" | "z", width: number, height: number, clearFlag: boolean) => void;
|
|
212
|
+
onClearLayerVolume: (layerId: string) => void;
|
|
213
|
+
onChannelColorChanged: (layerId: string, channel: number, color: {
|
|
214
|
+
r: number;
|
|
215
|
+
g: number;
|
|
216
|
+
b: number;
|
|
217
|
+
a: number;
|
|
218
|
+
}) => void;
|
|
198
219
|
getSphere: (sphereOrigin: number[], sphereRadius: number) => void;
|
|
199
220
|
getCalculateSpherePositions: (tumourSphereOrigin: ICommXYZ | null, skinSphereOrigin: ICommXYZ | null, ribSphereOrigin: ICommXYZ | null, nippleSphereOrigin: ICommXYZ | null, aixs: "x" | "y" | "z") => void;
|
|
200
221
|
drawStartPos: ICommXY;
|
|
@@ -204,19 +225,11 @@ interface IDragOpts {
|
|
|
204
225
|
getSliceNum?: (index: number, contrastNum: number) => void;
|
|
205
226
|
}
|
|
206
227
|
interface IDrawOpts {
|
|
207
|
-
getMaskData?: (
|
|
228
|
+
getMaskData?: (sliceData: Uint8Array, layerId: string, channelId: number, sliceIndex: number, axis: "x" | "y" | "z", width: number, height: number, clearFlag?: boolean) => void;
|
|
229
|
+
onClearLayerVolume?: (layerId: string) => void;
|
|
208
230
|
getSphereData?: (sphereOrigin: number[], sphereRadius: number) => void;
|
|
209
231
|
getCalculateSpherePositionsData?: (tumourSphereOrigin: ICommXYZ | null, skinSphereOrigin: ICommXYZ | null, ribSphereOrigin: ICommXYZ | null, nippleSphereOrigin: ICommXYZ | null, aixs: "x" | "y" | "z") => void;
|
|
210
232
|
}
|
|
211
|
-
type UndoLayerType = {
|
|
212
|
-
label1: Array<HTMLImageElement>;
|
|
213
|
-
label2: Array<HTMLImageElement>;
|
|
214
|
-
label3: Array<HTMLImageElement>;
|
|
215
|
-
};
|
|
216
|
-
interface IUndoType {
|
|
217
|
-
sliceIndex: number;
|
|
218
|
-
layers: UndoLayerType;
|
|
219
|
-
}
|
|
220
233
|
interface ICursorPage {
|
|
221
234
|
x: {
|
|
222
235
|
cursorPageX: number;
|
|
@@ -244,7 +257,7 @@ interface IGuiParameterSettings {
|
|
|
244
257
|
max: number;
|
|
245
258
|
step: number;
|
|
246
259
|
};
|
|
247
|
-
|
|
260
|
+
pencil: {
|
|
248
261
|
name: "Pencil";
|
|
249
262
|
onChange: () => void;
|
|
250
263
|
};
|
|
@@ -280,6 +293,9 @@ interface IGuiParameterSettings {
|
|
|
280
293
|
undo: {
|
|
281
294
|
name: "Undo";
|
|
282
295
|
};
|
|
296
|
+
redo: {
|
|
297
|
+
name: "Redo";
|
|
298
|
+
};
|
|
283
299
|
resetZoom: {
|
|
284
300
|
name: "ResetZoom";
|
|
285
301
|
};
|
|
@@ -302,9 +318,9 @@ interface IGuiParameterSettings {
|
|
|
302
318
|
onFinished: () => void;
|
|
303
319
|
};
|
|
304
320
|
advance: {
|
|
305
|
-
|
|
306
|
-
name: "
|
|
307
|
-
value: [
|
|
321
|
+
layer: {
|
|
322
|
+
name: "Layer";
|
|
323
|
+
value: string[];
|
|
308
324
|
};
|
|
309
325
|
cursor: {
|
|
310
326
|
name: "CursorIcon";
|
|
@@ -344,4 +360,4 @@ interface IGuiParameterSettings {
|
|
|
344
360
|
};
|
|
345
361
|
};
|
|
346
362
|
}
|
|
347
|
-
export { ICommXYZ, ICommXY, IDownloadImageConfig, IConvertObjType, IDragPrameters, IDrawingEvents, IContrastEvents, IProtected, IGUIStates, IDragOpts, IDrawOpts, INrrdStates, IPaintImage, IPaintImages,
|
|
363
|
+
export { ICommXYZ, ICommXY, IDownloadImageConfig, IConvertObjType, IDragPrameters, IDrawingEvents, IContrastEvents, IProtected, IGUIStates, IDragOpts, IDrawOpts, INrrdStates, IPaintImage, IPaintImages, ISkipSlicesDictType, IMaskData, INewMaskData, ILayerRenderTarget, ICursorPage, IGuiParameterSettings, IKeyBoardSettings };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { GUI } from "dat.gui";
|
|
2
|
-
import { IDrawingEvents, IGUIStates, IProtected, INrrdStates,
|
|
2
|
+
import { IDrawingEvents, IGUIStates, IProtected, INrrdStates, IGuiParameterSettings } from "./coreType";
|
|
3
3
|
import { DragOperator } from "../DragOperator";
|
|
4
4
|
interface IConfigGUI {
|
|
5
5
|
modeFolder: GUI;
|
|
@@ -11,6 +11,7 @@ interface IConfigGUI {
|
|
|
11
11
|
protectedData: IProtected;
|
|
12
12
|
eraserUrls: string[];
|
|
13
13
|
pencilUrls: string[];
|
|
14
|
+
getVolumeForLayer: (layer: string) => any;
|
|
14
15
|
mainPreSlices: any;
|
|
15
16
|
removeDragMode: () => void;
|
|
16
17
|
configDragMode: () => void;
|
|
@@ -24,26 +25,18 @@ interface IConfigGUI {
|
|
|
24
25
|
setSyncsliceNum: () => void;
|
|
25
26
|
resetLayerCanvas: () => void;
|
|
26
27
|
redrawDisplayCanvas: () => void;
|
|
27
|
-
reloadMaskToLabel: (paintImages: IPaintImages, ctx: CanvasRenderingContext2D) => void;
|
|
28
28
|
flipDisplayImageByAxis: () => void;
|
|
29
|
-
filterDrawedImage: (axis: "x" | "y" | "z", sliceIndex: number
|
|
29
|
+
filterDrawedImage: (axis: "x" | "y" | "z", sliceIndex: number) => {
|
|
30
|
+
index: number;
|
|
31
|
+
image: ImageData;
|
|
32
|
+
} | undefined;
|
|
30
33
|
setEmptyCanvasSize: (axis?: "x" | "y" | "z") => void;
|
|
31
|
-
storeAllImages: (index: number,
|
|
34
|
+
storeAllImages: (index: number, layer: string) => void;
|
|
32
35
|
drawImageOnEmptyImage: (canvas: HTMLCanvasElement) => void;
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
sliceArrayH: (arr: Uint8ClampedArray, row: number, col: number) => Uint8ClampedArray[];
|
|
37
|
-
sliceArrayV: (arr: Uint8ClampedArray, row: number, col: number) => number[][];
|
|
38
|
-
storeImageToAxis: (index: number, paintedImages: IPaintImages, imageData: ImageData, axis?: "x" | "y" | "z") => void;
|
|
39
|
-
replaceVerticalColPixels: (paintImageArray: IPaintImage[], length: number, ratio: number, markedArr: number[][] | Uint8ClampedArray[], targetWidth: number, convertIndex: number) => void;
|
|
40
|
-
replaceHorizontalRowPixels: (paintImageArray: IPaintImage[], length: number, ratio: number, markedArr: number[][] | Uint8ClampedArray[], targetWidth: number, convertIndex: number) => void;
|
|
41
|
-
storeEachLayerImage: (index: number, label: string) => void;
|
|
42
|
-
storeImageToLabel: (index: number, canvas: HTMLCanvasElement, paintedImages: IPaintImages) => ImageData;
|
|
43
|
-
getRestLabel: () => ("label1" | "label2" | "label3")[];
|
|
36
|
+
storeEachLayerImage: (index: number, layer: string) => void;
|
|
37
|
+
storeImageToLayer: (index: number, canvas: HTMLCanvasElement) => ImageData;
|
|
38
|
+
getRestLayer: () => string[];
|
|
44
39
|
setIsDrawFalse: (target: number) => void;
|
|
45
|
-
initPaintImages: (dimensions: Array<number>) => void;
|
|
46
|
-
createEmptyPaintImage: (dimensions: Array<number>, paintImages: IPaintImages) => void;
|
|
47
40
|
}
|
|
48
41
|
declare function setupGui(configs: IConfigGUI): IGuiParameterSettings;
|
|
49
42
|
declare function removeGuiFolderChilden(modeFolder: GUI): void;
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EventRouter - Centralized Event Management
|
|
3
|
+
*
|
|
4
|
+
* Consolidates keyboard, pointer, and wheel event handling from
|
|
5
|
+
* DrawToolCore.ts and DragOperator.ts into a single unified system.
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - Single point of event registration/cleanup
|
|
9
|
+
* - Mode-based event routing (draw, drag, contrast, crosshair, etc.)
|
|
10
|
+
* - Prevents memory leaks through proper handler cleanup
|
|
11
|
+
* - Eliminates duplicate keyboard listeners between DrawToolCore and DragOperator
|
|
12
|
+
*/
|
|
13
|
+
import type { InteractionMode, GuiTool, KeyboardHandler, PointerHandler, WheelHandler, ModeChangeCallback, EventRouterConfig, KeyboardSettings, InteractionState } from './types';
|
|
14
|
+
export declare class EventRouter {
|
|
15
|
+
private container;
|
|
16
|
+
private canvas;
|
|
17
|
+
private mode;
|
|
18
|
+
private guiTool;
|
|
19
|
+
private state;
|
|
20
|
+
private keyboardSettings;
|
|
21
|
+
/** When false, contrast key (Ctrl/Meta) is ignored for mode switching. */
|
|
22
|
+
private contrastEnabled;
|
|
23
|
+
private onModeChange?;
|
|
24
|
+
private modeChangeSubscribers;
|
|
25
|
+
private keydownHandler?;
|
|
26
|
+
private keyupHandler?;
|
|
27
|
+
private pointerDownHandler?;
|
|
28
|
+
private pointerMoveHandler?;
|
|
29
|
+
private pointerUpHandler?;
|
|
30
|
+
private pointerLeaveHandler?;
|
|
31
|
+
private wheelHandler?;
|
|
32
|
+
private boundKeyDown;
|
|
33
|
+
private boundKeyUp;
|
|
34
|
+
private boundPointerDown;
|
|
35
|
+
private boundPointerMove;
|
|
36
|
+
private boundPointerUp;
|
|
37
|
+
private boundPointerLeave;
|
|
38
|
+
private boundWheel;
|
|
39
|
+
private boundContextMenu;
|
|
40
|
+
private isBound;
|
|
41
|
+
constructor(config: EventRouterConfig);
|
|
42
|
+
/**
|
|
43
|
+
* Bind all event listeners to DOM elements.
|
|
44
|
+
* Call this after setting handlers.
|
|
45
|
+
*/
|
|
46
|
+
bindAll(): void;
|
|
47
|
+
/**
|
|
48
|
+
* Remove all event listeners from DOM elements.
|
|
49
|
+
* Call this on cleanup to prevent memory leaks.
|
|
50
|
+
*/
|
|
51
|
+
unbindAll(): void;
|
|
52
|
+
/**
|
|
53
|
+
* Get the current interaction mode.
|
|
54
|
+
*/
|
|
55
|
+
getMode(): InteractionMode;
|
|
56
|
+
/**
|
|
57
|
+
* Set the interaction mode directly.
|
|
58
|
+
*/
|
|
59
|
+
setMode(mode: InteractionMode): void;
|
|
60
|
+
/**
|
|
61
|
+
* Subscribe to mode change events.
|
|
62
|
+
* Returns an unsubscribe function.
|
|
63
|
+
*/
|
|
64
|
+
subscribeModeChange(callback: ModeChangeCallback): () => void;
|
|
65
|
+
/**
|
|
66
|
+
* Get the current GUI tool selection.
|
|
67
|
+
*/
|
|
68
|
+
getGuiTool(): GuiTool;
|
|
69
|
+
/**
|
|
70
|
+
* Set the GUI tool (from UI buttons).
|
|
71
|
+
*/
|
|
72
|
+
setGuiTool(tool: GuiTool): void;
|
|
73
|
+
/**
|
|
74
|
+
* Toggle crosshair mode.
|
|
75
|
+
* Blocked when draw or contrast mode is active (mutual exclusion).
|
|
76
|
+
*/
|
|
77
|
+
toggleCrosshair(): void;
|
|
78
|
+
/**
|
|
79
|
+
* Check if crosshair mode is enabled.
|
|
80
|
+
*/
|
|
81
|
+
isCrosshairEnabled(): boolean;
|
|
82
|
+
/**
|
|
83
|
+
* Get current interaction state.
|
|
84
|
+
*/
|
|
85
|
+
getState(): Readonly<InteractionState>;
|
|
86
|
+
isShiftHeld(): boolean;
|
|
87
|
+
isCtrlHeld(): boolean;
|
|
88
|
+
isLeftButtonDown(): boolean;
|
|
89
|
+
isRightButtonDown(): boolean;
|
|
90
|
+
/**
|
|
91
|
+
* Update keyboard settings.
|
|
92
|
+
*/
|
|
93
|
+
setKeyboardSettings(settings: Partial<KeyboardSettings>): void;
|
|
94
|
+
getKeyboardSettings(): KeyboardSettings;
|
|
95
|
+
/**
|
|
96
|
+
* Enable or disable the contrast shortcut (Ctrl/Meta key).
|
|
97
|
+
*
|
|
98
|
+
* When disabled:
|
|
99
|
+
* - `ctrlHeld` state is never set to true
|
|
100
|
+
* - The mode will not be changed to `'contrast'` via key events
|
|
101
|
+
* - If the mode is currently `'contrast'` it is reset to `'idle'`
|
|
102
|
+
*
|
|
103
|
+
* The external keydown/keyup handlers are still called regardless
|
|
104
|
+
* of this flag so other Ctrl-based shortcuts (e.g. Ctrl+Z undo)
|
|
105
|
+
* continue to work normally.
|
|
106
|
+
*/
|
|
107
|
+
setContrastEnabled(enabled: boolean): void;
|
|
108
|
+
/** Whether the contrast shortcut is currently enabled. */
|
|
109
|
+
isContrastEnabled(): boolean;
|
|
110
|
+
/**
|
|
111
|
+
* Register the keydown handler (from DrawToolCore/DragOperator).
|
|
112
|
+
*/
|
|
113
|
+
setKeydownHandler(handler: KeyboardHandler): void;
|
|
114
|
+
/**
|
|
115
|
+
* Register the keyup handler.
|
|
116
|
+
*/
|
|
117
|
+
setKeyupHandler(handler: KeyboardHandler): void;
|
|
118
|
+
/**
|
|
119
|
+
* Register pointer down handler.
|
|
120
|
+
*/
|
|
121
|
+
setPointerDownHandler(handler: PointerHandler): void;
|
|
122
|
+
/**
|
|
123
|
+
* Register pointer move handler.
|
|
124
|
+
*/
|
|
125
|
+
setPointerMoveHandler(handler: PointerHandler): void;
|
|
126
|
+
/**
|
|
127
|
+
* Register pointer up handler.
|
|
128
|
+
*/
|
|
129
|
+
setPointerUpHandler(handler: PointerHandler): void;
|
|
130
|
+
/**
|
|
131
|
+
* Register pointer leave handler.
|
|
132
|
+
*/
|
|
133
|
+
setPointerLeaveHandler(handler: PointerHandler): void;
|
|
134
|
+
/**
|
|
135
|
+
* Register wheel handler.
|
|
136
|
+
*/
|
|
137
|
+
setWheelHandler(handler: WheelHandler): void;
|
|
138
|
+
private handleKeyDown;
|
|
139
|
+
private handleKeyUp;
|
|
140
|
+
private handlePointerDown;
|
|
141
|
+
private handlePointerMove;
|
|
142
|
+
private handlePointerUp;
|
|
143
|
+
private handlePointerLeave;
|
|
144
|
+
private handleWheel;
|
|
145
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Event Router Module
|
|
3
|
+
*
|
|
4
|
+
* Exports centralized event handling components for the segmentation module.
|
|
5
|
+
*/
|
|
6
|
+
export { EventRouter } from './EventRouter';
|
|
7
|
+
export type { InteractionMode, GuiTool, KeyboardHandler, PointerHandler, WheelHandler, ModeChangeCallback, EventRouterConfig, KeyboardSettings, InteractionState } from './types';
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Event Router Types
|
|
3
|
+
*
|
|
4
|
+
* Type definitions for centralized event handling in the segmentation module.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Interaction modes representing the current operational state.
|
|
8
|
+
*
|
|
9
|
+
* - `idle`: Default state, allows navigation (drag slice, wheel zoom)
|
|
10
|
+
* - `draw`: Shift held, left-drag paints (pencil/brush/eraser)
|
|
11
|
+
* - `drag`: Left-drag changes slices
|
|
12
|
+
* - `contrast`: Ctrl held, left-drag adjusts window/level
|
|
13
|
+
* - `crosshair`: Crosshair mode enabled (C key toggle)
|
|
14
|
+
* - `sphere`: Sphere placement tool active
|
|
15
|
+
* - `calculator`: Distance calculator tool active
|
|
16
|
+
* - `pan`: Right-drag panning the canvas
|
|
17
|
+
*/
|
|
18
|
+
export type InteractionMode = 'idle' | 'draw' | 'drag' | 'contrast' | 'crosshair' | 'sphere' | 'calculator' | 'pan';
|
|
19
|
+
/**
|
|
20
|
+
* GUI tool selection (set from UI buttons)
|
|
21
|
+
*/
|
|
22
|
+
export type GuiTool = 'pencil' | 'brush' | 'eraser' | 'sphere' | 'calculator';
|
|
23
|
+
/**
|
|
24
|
+
* Keyboard event handler type
|
|
25
|
+
*/
|
|
26
|
+
export type KeyboardHandler = (ev: KeyboardEvent) => void;
|
|
27
|
+
/**
|
|
28
|
+
* Pointer event handler type
|
|
29
|
+
*/
|
|
30
|
+
export type PointerHandler = (ev: PointerEvent) => void;
|
|
31
|
+
/**
|
|
32
|
+
* Wheel event handler type
|
|
33
|
+
*/
|
|
34
|
+
export type WheelHandler = (ev: WheelEvent) => void;
|
|
35
|
+
/**
|
|
36
|
+
* Mode change callback - called when interaction mode changes
|
|
37
|
+
*/
|
|
38
|
+
export type ModeChangeCallback = (prevMode: InteractionMode, newMode: InteractionMode) => void;
|
|
39
|
+
/**
|
|
40
|
+
* Configuration for EventRouter initialization
|
|
41
|
+
*/
|
|
42
|
+
export interface EventRouterConfig {
|
|
43
|
+
/** Container element to attach keyboard events */
|
|
44
|
+
container: HTMLElement;
|
|
45
|
+
/** Canvas element to attach pointer/wheel events */
|
|
46
|
+
canvas: HTMLCanvasElement;
|
|
47
|
+
/** Optional callback when mode changes */
|
|
48
|
+
onModeChange?: ModeChangeCallback;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Keyboard settings from nrrd_states
|
|
52
|
+
*/
|
|
53
|
+
export interface KeyboardSettings {
|
|
54
|
+
draw: string;
|
|
55
|
+
undo: string;
|
|
56
|
+
redo: string;
|
|
57
|
+
contrast: string[];
|
|
58
|
+
crosshair: string;
|
|
59
|
+
mouseWheel: 'Scroll:Zoom' | 'Scroll:Slice';
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* State flags tracked by EventRouter
|
|
63
|
+
*/
|
|
64
|
+
export interface InteractionState {
|
|
65
|
+
shiftHeld: boolean;
|
|
66
|
+
ctrlHeld: boolean;
|
|
67
|
+
leftButtonDown: boolean;
|
|
68
|
+
rightButtonDown: boolean;
|
|
69
|
+
crosshairEnabled: boolean;
|
|
70
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BaseTool - Abstract base for extracted DrawToolCore tools
|
|
3
|
+
*
|
|
4
|
+
* Provides shared access to the legacy state objects (nrrd_states,
|
|
5
|
+
* gui_states, protectedData) via a ToolContext interface.
|
|
6
|
+
*
|
|
7
|
+
* NOTE: This is for the OLD DrawToolCore system.
|
|
8
|
+
* The new SegmentationManager system has its own tools in manager/tools/.
|
|
9
|
+
*/
|
|
10
|
+
import type { INrrdStates, IGUIStates, IProtected, ICursorPage } from "../coreTools/coreType";
|
|
11
|
+
import type { EventRouter } from "../eventRouter/EventRouter";
|
|
12
|
+
/**
|
|
13
|
+
* Shared context injected into every legacy tool.
|
|
14
|
+
* References are shared (not copied), so tools see the same state.
|
|
15
|
+
*/
|
|
16
|
+
export interface ToolContext {
|
|
17
|
+
nrrd_states: INrrdStates;
|
|
18
|
+
gui_states: IGUIStates;
|
|
19
|
+
protectedData: IProtected;
|
|
20
|
+
cursorPage: ICursorPage;
|
|
21
|
+
/** EventRouter reference for mode/state queries. Set after initDrawToolCore(). */
|
|
22
|
+
eventRouter?: EventRouter;
|
|
23
|
+
}
|
|
24
|
+
export declare abstract class BaseTool {
|
|
25
|
+
protected ctx: ToolContext;
|
|
26
|
+
constructor(ctx: ToolContext);
|
|
27
|
+
setContext(ctx: ToolContext): void;
|
|
28
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ContrastTool - Contrast adjustment event handlers
|
|
3
|
+
*
|
|
4
|
+
* Extracted from DrawToolCore.ts:
|
|
5
|
+
* - setupConrastEvents
|
|
6
|
+
* - configContrastDragMode / removeContrastDragMode
|
|
7
|
+
* - updateSlicesContrast / repraintCurrentContrastSlice
|
|
8
|
+
*/
|
|
9
|
+
import { BaseTool } from "./BaseTool";
|
|
10
|
+
import type { ToolContext } from "./BaseTool";
|
|
11
|
+
import type { IContrastEvents } from "../coreTools/coreType";
|
|
12
|
+
export interface ContrastCallbacks {
|
|
13
|
+
setIsDrawFalse: (target: number) => void;
|
|
14
|
+
setSyncsliceNum: () => void;
|
|
15
|
+
}
|
|
16
|
+
export declare class ContrastTool extends BaseTool {
|
|
17
|
+
private contrastEventPrameters;
|
|
18
|
+
private container;
|
|
19
|
+
private callbacks;
|
|
20
|
+
constructor(ctx: ToolContext, container: HTMLElement, contrastEventPrameters: IContrastEvents, callbacks: ContrastCallbacks);
|
|
21
|
+
setupConrastEvents(callback: (step: number, towards: "horizental" | "vertical") => void): void;
|
|
22
|
+
configContrastDragMode(): void;
|
|
23
|
+
removeContrastDragMode(): void;
|
|
24
|
+
updateSlicesContrast(value: number, flag: string): void;
|
|
25
|
+
repraintCurrentContrastSlice(): void;
|
|
26
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CrosshairTool - Crosshair positioning and cursor point conversion
|
|
3
|
+
*
|
|
4
|
+
* Extracted from DrawToolCore.ts:
|
|
5
|
+
* - enableCrosshair
|
|
6
|
+
* - convertCursorPoint
|
|
7
|
+
* - setUpSphereOrigins
|
|
8
|
+
*/
|
|
9
|
+
import { BaseTool } from "./BaseTool";
|
|
10
|
+
import type { IConvertObjType } from "../coreTools/coreType";
|
|
11
|
+
export declare class CrosshairTool extends BaseTool {
|
|
12
|
+
enableCrosshair(): void;
|
|
13
|
+
/**
|
|
14
|
+
* Convert cursor point between axis views.
|
|
15
|
+
*
|
|
16
|
+
* MRI slices are generated from threejs based on mm, but displayed based on pixel distance.
|
|
17
|
+
* The index number on each axis is the slice's depth in mm distance.
|
|
18
|
+
* Width/height on screen is in pixel distance.
|
|
19
|
+
*
|
|
20
|
+
* When switching views, we convert depth to pixel distance and vice versa.
|
|
21
|
+
*
|
|
22
|
+
* @param from Current view axis
|
|
23
|
+
* @param to Target view axis
|
|
24
|
+
* @param cursorNumX Cursor X on current axis (pixel distance)
|
|
25
|
+
* @param cursorNumY Cursor Y on current axis (pixel distance)
|
|
26
|
+
* @param currentSliceIndex Current slice depth (mm distance)
|
|
27
|
+
*/
|
|
28
|
+
convertCursorPoint(from: "x" | "y" | "z", to: "x" | "y" | "z", cursorNumX: number, cursorNumY: number, currentSliceIndex: number): IConvertObjType | undefined;
|
|
29
|
+
setUpSphereOrigins(mouseX: number, mouseY: number, sliceIndex: number): void;
|
|
30
|
+
}
|