copper3d 3.0.1 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +197 -875
- package/dist/Utils/segmentation/CanvasState.d.ts +31 -0
- package/dist/Utils/segmentation/CanvasState.js +167 -0
- package/dist/Utils/segmentation/CanvasState.js.map +1 -0
- package/dist/Utils/segmentation/DragOperator.d.ts +10 -2
- package/dist/Utils/segmentation/DragOperator.js +16 -8
- package/dist/Utils/segmentation/DragOperator.js.map +1 -1
- package/dist/Utils/segmentation/DrawToolCore.d.ts +64 -35
- package/dist/Utils/segmentation/DrawToolCore.js +332 -584
- package/dist/Utils/segmentation/DrawToolCore.js.map +1 -1
- package/dist/Utils/segmentation/NrrdTools.d.ts +117 -353
- package/dist/Utils/segmentation/NrrdTools.js +622 -1081
- package/dist/Utils/segmentation/NrrdTools.js.map +1 -1
- package/dist/Utils/segmentation/RenderingUtils.d.ts +73 -0
- package/dist/Utils/segmentation/RenderingUtils.js +180 -0
- package/dist/Utils/segmentation/RenderingUtils.js.map +1 -0
- package/dist/Utils/segmentation/core/MaskVolume.js +23 -2
- package/dist/Utils/segmentation/core/MaskVolume.js.map +1 -1
- package/dist/Utils/segmentation/core/UndoManager.d.ts +1 -1
- package/dist/Utils/segmentation/core/UndoManager.js +1 -1
- package/dist/Utils/segmentation/core/index.d.ts +1 -3
- package/dist/Utils/segmentation/core/index.js +0 -1
- package/dist/Utils/segmentation/core/index.js.map +1 -1
- package/dist/Utils/segmentation/core/types.d.ts +384 -0
- package/dist/Utils/segmentation/core/types.js +25 -24
- package/dist/Utils/segmentation/core/types.js.map +1 -1
- package/dist/Utils/segmentation/coreTools/GuiState.d.ts +22 -0
- package/dist/Utils/segmentation/coreTools/GuiState.js +48 -0
- package/dist/Utils/segmentation/coreTools/GuiState.js.map +1 -0
- package/dist/Utils/segmentation/coreTools/NrrdState.d.ts +25 -0
- package/dist/Utils/segmentation/coreTools/NrrdState.js +85 -0
- package/dist/Utils/segmentation/coreTools/NrrdState.js.map +1 -0
- package/dist/Utils/segmentation/coreTools/divControlTools.d.ts +1 -1
- package/dist/Utils/segmentation/coreTools/divControlTools.js +1 -1
- package/dist/Utils/segmentation/coreTools/divControlTools.js.map +1 -1
- package/dist/Utils/segmentation/coreTools/gui.d.ts +12 -12
- package/dist/Utils/segmentation/coreTools/gui.js +81 -107
- package/dist/Utils/segmentation/coreTools/gui.js.map +1 -1
- package/dist/Utils/segmentation/eventRouter/EventRouter.d.ts +2 -1
- package/dist/Utils/segmentation/eventRouter/EventRouter.js +15 -10
- package/dist/Utils/segmentation/eventRouter/EventRouter.js.map +1 -1
- package/dist/Utils/segmentation/eventRouter/types.d.ts +3 -3
- package/dist/Utils/segmentation/tools/BaseTool.d.ts +8 -5
- package/dist/Utils/segmentation/tools/BaseTool.js +1 -2
- package/dist/Utils/segmentation/tools/BaseTool.js.map +1 -1
- package/dist/Utils/segmentation/tools/ContrastTool.d.ts +3 -6
- package/dist/Utils/segmentation/tools/ContrastTool.js.map +1 -1
- package/dist/Utils/segmentation/tools/CrosshairTool.d.ts +11 -1
- package/dist/Utils/segmentation/tools/CrosshairTool.js +50 -25
- package/dist/Utils/segmentation/tools/CrosshairTool.js.map +1 -1
- package/dist/Utils/segmentation/tools/DataLoader.d.ts +33 -0
- package/dist/Utils/segmentation/tools/DataLoader.js +159 -0
- package/dist/Utils/segmentation/tools/DataLoader.js.map +1 -0
- package/dist/Utils/segmentation/tools/DragSliceTool.d.ts +3 -10
- package/dist/Utils/segmentation/tools/DragSliceTool.js +63 -53
- package/dist/Utils/segmentation/tools/DragSliceTool.js.map +1 -1
- package/dist/Utils/segmentation/tools/DrawingTool.d.ts +85 -0
- package/dist/Utils/segmentation/tools/DrawingTool.js +270 -0
- package/dist/Utils/segmentation/tools/DrawingTool.js.map +1 -0
- package/dist/Utils/segmentation/tools/EraserTool.js +8 -8
- package/dist/Utils/segmentation/tools/EraserTool.js.map +1 -1
- package/dist/Utils/segmentation/tools/ImageStoreHelper.d.ts +13 -33
- package/dist/Utils/segmentation/tools/ImageStoreHelper.js +39 -82
- package/dist/Utils/segmentation/tools/ImageStoreHelper.js.map +1 -1
- package/dist/Utils/segmentation/tools/LayerChannelManager.d.ts +52 -0
- package/dist/Utils/segmentation/tools/LayerChannelManager.js +175 -0
- package/dist/Utils/segmentation/tools/LayerChannelManager.js.map +1 -0
- package/dist/Utils/segmentation/tools/PanTool.d.ts +47 -0
- package/dist/Utils/segmentation/tools/PanTool.js +90 -0
- package/dist/Utils/segmentation/tools/PanTool.js.map +1 -0
- package/dist/Utils/segmentation/tools/SliceRenderPipeline.d.ts +80 -0
- package/dist/Utils/segmentation/tools/SliceRenderPipeline.js +355 -0
- package/dist/Utils/segmentation/tools/SliceRenderPipeline.js.map +1 -0
- package/dist/Utils/segmentation/tools/SphereTool.d.ts +223 -10
- package/dist/Utils/segmentation/tools/SphereTool.js +512 -47
- package/dist/Utils/segmentation/tools/SphereTool.js.map +1 -1
- package/dist/Utils/segmentation/tools/ToolHost.d.ts +74 -0
- package/dist/Utils/segmentation/tools/ToolHost.js +10 -0
- package/dist/Utils/segmentation/tools/ToolHost.js.map +1 -0
- package/dist/Utils/segmentation/tools/ZoomTool.d.ts +2 -6
- package/dist/Utils/segmentation/tools/ZoomTool.js +3 -3
- package/dist/Utils/segmentation/tools/ZoomTool.js.map +1 -1
- package/dist/Utils/segmentation/tools/index.d.ts +8 -6
- package/dist/Utils/segmentation/tools/index.js +10 -1
- package/dist/Utils/segmentation/tools/index.js.map +1 -1
- package/dist/Utils/workers/reformatSaveDataWorker.d.ts +1 -1
- package/dist/bundle.esm.js +3729 -3017
- package/dist/bundle.umd.js +3729 -3017
- package/dist/index.d.ts +6 -3
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/types/Utils/segmentation/CanvasState.d.ts +31 -0
- package/dist/types/Utils/segmentation/DragOperator.d.ts +10 -2
- package/dist/types/Utils/segmentation/DrawToolCore.d.ts +64 -35
- package/dist/types/Utils/segmentation/NrrdTools.d.ts +117 -353
- package/dist/types/Utils/segmentation/RenderingUtils.d.ts +73 -0
- package/dist/types/Utils/segmentation/core/UndoManager.d.ts +1 -1
- package/dist/types/Utils/segmentation/core/index.d.ts +1 -3
- package/dist/types/Utils/segmentation/core/types.d.ts +384 -0
- package/dist/types/Utils/segmentation/coreTools/GuiState.d.ts +22 -0
- package/dist/types/Utils/segmentation/coreTools/NrrdState.d.ts +25 -0
- package/dist/types/Utils/segmentation/coreTools/divControlTools.d.ts +1 -1
- package/dist/types/Utils/segmentation/coreTools/gui.d.ts +12 -12
- package/dist/types/Utils/segmentation/eventRouter/EventRouter.d.ts +2 -1
- package/dist/types/Utils/segmentation/eventRouter/types.d.ts +3 -3
- package/dist/types/Utils/segmentation/tools/BaseTool.d.ts +8 -5
- package/dist/types/Utils/segmentation/tools/ContrastTool.d.ts +3 -6
- package/dist/types/Utils/segmentation/tools/CrosshairTool.d.ts +11 -1
- package/dist/types/Utils/segmentation/tools/DataLoader.d.ts +33 -0
- package/dist/types/Utils/segmentation/tools/DragSliceTool.d.ts +3 -10
- package/dist/types/Utils/segmentation/tools/DrawingTool.d.ts +85 -0
- package/dist/types/Utils/segmentation/tools/ImageStoreHelper.d.ts +13 -33
- package/dist/types/Utils/segmentation/tools/LayerChannelManager.d.ts +52 -0
- package/dist/types/Utils/segmentation/tools/PanTool.d.ts +47 -0
- package/dist/types/Utils/segmentation/tools/SliceRenderPipeline.d.ts +80 -0
- package/dist/types/Utils/segmentation/tools/SphereTool.d.ts +223 -10
- package/dist/types/Utils/segmentation/tools/ToolHost.d.ts +74 -0
- package/dist/types/Utils/segmentation/tools/ZoomTool.d.ts +2 -6
- package/dist/types/Utils/segmentation/tools/index.d.ts +8 -6
- package/dist/types/Utils/workers/reformatSaveDataWorker.d.ts +1 -1
- package/dist/types/index.d.ts +6 -3
- package/package.json +1 -1
- package/dist/Utils/segmentation/CommToolsData.d.ts +0 -177
- package/dist/Utils/segmentation/CommToolsData.js +0 -548
- package/dist/Utils/segmentation/CommToolsData.js.map +0 -1
- package/dist/Utils/segmentation/core/MigrationUtils.d.ts +0 -97
- package/dist/Utils/segmentation/core/MigrationUtils.js +0 -163
- package/dist/Utils/segmentation/core/MigrationUtils.js.map +0 -1
- package/dist/Utils/segmentation/coreTools/coreType.d.ts +0 -363
- package/dist/Utils/segmentation/coreTools/coreType.js +0 -3
- package/dist/Utils/segmentation/coreTools/coreType.js.map +0 -1
- package/dist/types/Utils/segmentation/CommToolsData.d.ts +0 -177
- package/dist/types/Utils/segmentation/core/MigrationUtils.d.ts +0 -97
- package/dist/types/Utils/segmentation/coreTools/coreType.d.ts +0 -363
|
@@ -104,3 +104,387 @@ export declare function rgbaToHex(color: RGBAColor): string;
|
|
|
104
104
|
* Convert an RGBAColor to a CSS rgba() string, e.g. 'rgba(255,0,0,1.00)'.
|
|
105
105
|
*/
|
|
106
106
|
export declare function rgbaToCss(color: RGBAColor): string;
|
|
107
|
+
import type { MaskVolume } from './MaskVolume';
|
|
108
|
+
export interface ICommXYZ {
|
|
109
|
+
x: any;
|
|
110
|
+
y: any;
|
|
111
|
+
z: any;
|
|
112
|
+
}
|
|
113
|
+
export interface ICommXY {
|
|
114
|
+
x: any;
|
|
115
|
+
y: any;
|
|
116
|
+
}
|
|
117
|
+
export interface ISkipSlicesDictType {
|
|
118
|
+
[key: string]: any;
|
|
119
|
+
}
|
|
120
|
+
/** Tool mode types for segmentation tools */
|
|
121
|
+
export type ToolMode = "pencil" | "brush" | "eraser" | "sphere" | "calculator";
|
|
122
|
+
export interface IDragPrameters {
|
|
123
|
+
move: number;
|
|
124
|
+
y: number;
|
|
125
|
+
h: number;
|
|
126
|
+
sensivity: number;
|
|
127
|
+
handleOnDragMouseUp: (ev: MouseEvent) => void;
|
|
128
|
+
handleOnDragMouseDown: (ev: MouseEvent) => void;
|
|
129
|
+
handleOnDragMouseMove: (ev: MouseEvent) => void;
|
|
130
|
+
}
|
|
131
|
+
export interface IDrawingEvents {
|
|
132
|
+
handleOnDrawingMouseDown: (ev: MouseEvent) => void;
|
|
133
|
+
handleOnDrawingMouseMove: (ev: MouseEvent) => void;
|
|
134
|
+
handleOnPanMouseMove: (ev: MouseEvent) => void;
|
|
135
|
+
handleOnDrawingMouseUp: (ev: MouseEvent) => void;
|
|
136
|
+
handleOnDrawingMouseLeave: (ev: MouseEvent) => void;
|
|
137
|
+
handleOnDrawingBrushCricleMove: (ev: MouseEvent) => void;
|
|
138
|
+
handleMouseZoomSliceWheel: (e: WheelEvent) => void;
|
|
139
|
+
handleSphereWheel: (e: WheelEvent) => void;
|
|
140
|
+
}
|
|
141
|
+
export interface IContrastEvents {
|
|
142
|
+
move_x: number;
|
|
143
|
+
move_y: number;
|
|
144
|
+
x: number;
|
|
145
|
+
y: number;
|
|
146
|
+
w: number;
|
|
147
|
+
h: number;
|
|
148
|
+
handleOnContrastMouseDown: (ev: MouseEvent) => void;
|
|
149
|
+
handleOnContrastMouseMove: (ev: MouseEvent) => void;
|
|
150
|
+
handleOnContrastMouseUp: (ev: MouseEvent) => void;
|
|
151
|
+
handleOnContrastMouseLeave: (ev: MouseEvent) => void;
|
|
152
|
+
}
|
|
153
|
+
export interface IPaintImages {
|
|
154
|
+
x: Array<IPaintImage>;
|
|
155
|
+
y: Array<IPaintImage>;
|
|
156
|
+
z: Array<IPaintImage>;
|
|
157
|
+
}
|
|
158
|
+
export interface IPaintImage {
|
|
159
|
+
index: number;
|
|
160
|
+
image: ImageData;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* A paired canvas + 2D context for a single annotation layer.
|
|
164
|
+
* Stored atomically in IProtected.layerTargets to prevent canvas/ctx desync.
|
|
165
|
+
*/
|
|
166
|
+
export interface ILayerRenderTarget {
|
|
167
|
+
canvas: HTMLCanvasElement;
|
|
168
|
+
ctx: CanvasRenderingContext2D;
|
|
169
|
+
}
|
|
170
|
+
export interface IDownloadImageConfig {
|
|
171
|
+
axis: "x" | "y" | "z";
|
|
172
|
+
currentSliceIndex: number;
|
|
173
|
+
drawingCanvas: HTMLCanvasElement;
|
|
174
|
+
originWidth: number;
|
|
175
|
+
originHeight: number;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* New mask data structure using MaskVolume for true 3D storage.
|
|
179
|
+
* Dynamic N-layer support: keyed by layer id (e.g. 'layer1', 'layer2', ...).
|
|
180
|
+
*/
|
|
181
|
+
export type INewMaskData = Record<string, MaskVolume>;
|
|
182
|
+
/**
|
|
183
|
+
* Mask data storage using volumetric MaskVolume (Phase 3)
|
|
184
|
+
*
|
|
185
|
+
* Phase 2 legacy ImageData storage has been removed.
|
|
186
|
+
* All mask data now stored in 3D volumes for memory efficiency.
|
|
187
|
+
*/
|
|
188
|
+
export type IMaskData = {
|
|
189
|
+
volumes: INewMaskData;
|
|
190
|
+
};
|
|
191
|
+
export interface IProtected {
|
|
192
|
+
container: HTMLElement;
|
|
193
|
+
mainAreaContainer: HTMLElement;
|
|
194
|
+
allSlicesArray: Array<ICommXYZ>;
|
|
195
|
+
displaySlices: Array<any>;
|
|
196
|
+
backUpDisplaySlices: Array<any>;
|
|
197
|
+
skipSlicesDic: ISkipSlicesDictType;
|
|
198
|
+
currentShowingSlice: any;
|
|
199
|
+
mainPreSlices: any;
|
|
200
|
+
isDrawing: boolean;
|
|
201
|
+
axis: "x" | "y" | "z";
|
|
202
|
+
maskData: IMaskData;
|
|
203
|
+
/** Dynamic per-layer canvas+ctx pairs. Replaces hardcoded LayerOne/Two/Three fields. */
|
|
204
|
+
layerTargets: Map<string, ILayerRenderTarget>;
|
|
205
|
+
canvases: {
|
|
206
|
+
originCanvas: HTMLCanvasElement | any;
|
|
207
|
+
drawingCanvas: HTMLCanvasElement;
|
|
208
|
+
displayCanvas: HTMLCanvasElement;
|
|
209
|
+
drawingCanvasLayerMaster: HTMLCanvasElement;
|
|
210
|
+
drawingSphereCanvas: HTMLCanvasElement;
|
|
211
|
+
emptyCanvas: HTMLCanvasElement;
|
|
212
|
+
};
|
|
213
|
+
ctxes: {
|
|
214
|
+
displayCtx: CanvasRenderingContext2D;
|
|
215
|
+
drawingCtx: CanvasRenderingContext2D;
|
|
216
|
+
emptyCtx: CanvasRenderingContext2D;
|
|
217
|
+
drawingSphereCtx: CanvasRenderingContext2D;
|
|
218
|
+
drawingLayerMasterCtx: CanvasRenderingContext2D;
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
/** Tool mode flags — which tool is currently active */
|
|
222
|
+
export interface IToolModeState {
|
|
223
|
+
pencil: boolean;
|
|
224
|
+
eraser: boolean;
|
|
225
|
+
sphere: boolean;
|
|
226
|
+
activeSphereType: "tumour" | "skin" | "nipple" | "ribcage";
|
|
227
|
+
}
|
|
228
|
+
/** Drawing configuration — brush/pencil appearance and behavior */
|
|
229
|
+
export interface IDrawingConfig {
|
|
230
|
+
globalAlpha: number;
|
|
231
|
+
lineWidth: number;
|
|
232
|
+
color: string;
|
|
233
|
+
fillColor: string;
|
|
234
|
+
brushColor: string;
|
|
235
|
+
brushAndEraserSize: number;
|
|
236
|
+
}
|
|
237
|
+
/** View configuration — UI layout and interaction parameters */
|
|
238
|
+
export interface IViewConfig {
|
|
239
|
+
mainAreaSize: number;
|
|
240
|
+
dragSensitivity: number;
|
|
241
|
+
cursor: string;
|
|
242
|
+
defaultPaintCursor: string;
|
|
243
|
+
max_sensitive: number;
|
|
244
|
+
readyToUpdate: boolean;
|
|
245
|
+
}
|
|
246
|
+
/** Layer/channel state — active layer, channel, and visibility */
|
|
247
|
+
export interface ILayerChannelState {
|
|
248
|
+
layer: string;
|
|
249
|
+
/** Currently active channel (1-8). Channel 0 is transparent/erased. */
|
|
250
|
+
activeChannel: number;
|
|
251
|
+
/** Layer visibility state: { layer1: true, layer2: true, layer3: true } */
|
|
252
|
+
layerVisibility: Record<string, boolean>;
|
|
253
|
+
/** Per-layer channel visibility: { layer1: { 1: true, ..., 8: true }, ... } */
|
|
254
|
+
channelVisibility: Record<string, Record<number, boolean>>;
|
|
255
|
+
}
|
|
256
|
+
export interface IGUIStates extends IToolModeState, IDrawingConfig, IViewConfig, ILayerChannelState {
|
|
257
|
+
}
|
|
258
|
+
/** Metadata for a GUI slider/control — used by Vue components to configure slider UI */
|
|
259
|
+
export interface IGuiMeta {
|
|
260
|
+
min: number;
|
|
261
|
+
max: number;
|
|
262
|
+
step: number;
|
|
263
|
+
value: number;
|
|
264
|
+
}
|
|
265
|
+
export interface IGuiParameterSettings {
|
|
266
|
+
globalAlpha: {
|
|
267
|
+
name: "Opacity";
|
|
268
|
+
min: number;
|
|
269
|
+
max: number;
|
|
270
|
+
step: number;
|
|
271
|
+
};
|
|
272
|
+
pencil: {
|
|
273
|
+
name: "Pencil";
|
|
274
|
+
onChange: () => void;
|
|
275
|
+
};
|
|
276
|
+
sphere: {
|
|
277
|
+
name: "Sphere";
|
|
278
|
+
onChange: () => void;
|
|
279
|
+
};
|
|
280
|
+
brushAndEraserSize: {
|
|
281
|
+
name: "BrushAndEraserSize";
|
|
282
|
+
min: number;
|
|
283
|
+
max: number;
|
|
284
|
+
step: number;
|
|
285
|
+
onChange: () => void;
|
|
286
|
+
};
|
|
287
|
+
eraser: {
|
|
288
|
+
name: "Eraser";
|
|
289
|
+
onChange: () => void;
|
|
290
|
+
};
|
|
291
|
+
activeSphereType: {
|
|
292
|
+
name: "CalculatorDistance";
|
|
293
|
+
onChange: (val: "tumour" | "skin" | "ribcage" | "nipple") => void;
|
|
294
|
+
};
|
|
295
|
+
clear: {
|
|
296
|
+
name: "Clear";
|
|
297
|
+
};
|
|
298
|
+
clearAll: {
|
|
299
|
+
name: "ClearAll";
|
|
300
|
+
};
|
|
301
|
+
undo: {
|
|
302
|
+
name: "Undo";
|
|
303
|
+
};
|
|
304
|
+
redo: {
|
|
305
|
+
name: "Redo";
|
|
306
|
+
};
|
|
307
|
+
resetZoom: {
|
|
308
|
+
name: "ResetZoom";
|
|
309
|
+
};
|
|
310
|
+
windowHigh: {
|
|
311
|
+
name: "ImageContrast";
|
|
312
|
+
value: null;
|
|
313
|
+
min: number;
|
|
314
|
+
max: number;
|
|
315
|
+
step: number;
|
|
316
|
+
onChange: (value: number) => void;
|
|
317
|
+
onFinished: () => void;
|
|
318
|
+
};
|
|
319
|
+
windowLow: {
|
|
320
|
+
name: "WindowLow";
|
|
321
|
+
value: null;
|
|
322
|
+
min: number;
|
|
323
|
+
max: number;
|
|
324
|
+
step: number;
|
|
325
|
+
onChange: (value: number) => void;
|
|
326
|
+
onFinished: () => void;
|
|
327
|
+
};
|
|
328
|
+
advance: {
|
|
329
|
+
layer: {
|
|
330
|
+
name: "Layer";
|
|
331
|
+
value: string[];
|
|
332
|
+
};
|
|
333
|
+
cursor: {
|
|
334
|
+
name: "CursorIcon";
|
|
335
|
+
value: ["crosshair", "pencil", "dot"];
|
|
336
|
+
};
|
|
337
|
+
mainAreaSize: {
|
|
338
|
+
name: "Zoom";
|
|
339
|
+
min: number;
|
|
340
|
+
max: number;
|
|
341
|
+
step: number;
|
|
342
|
+
onFinished: null;
|
|
343
|
+
};
|
|
344
|
+
dragSensitivity: {
|
|
345
|
+
name: "DragSensitivity";
|
|
346
|
+
min: number;
|
|
347
|
+
max: number;
|
|
348
|
+
step: number;
|
|
349
|
+
};
|
|
350
|
+
pencilSettings: {
|
|
351
|
+
lineWidth: {
|
|
352
|
+
name: "OuterLineWidth";
|
|
353
|
+
min: number;
|
|
354
|
+
max: number;
|
|
355
|
+
step: number;
|
|
356
|
+
};
|
|
357
|
+
color: {
|
|
358
|
+
name: "Color";
|
|
359
|
+
};
|
|
360
|
+
fillColor: {
|
|
361
|
+
name: "FillColor";
|
|
362
|
+
};
|
|
363
|
+
};
|
|
364
|
+
BrushSettings: {
|
|
365
|
+
brushColor: {
|
|
366
|
+
name: "BrushColor";
|
|
367
|
+
};
|
|
368
|
+
};
|
|
369
|
+
};
|
|
370
|
+
}
|
|
371
|
+
/** Image metadata — set once during NRRD loading, read-only at runtime */
|
|
372
|
+
export interface IImageMetadata {
|
|
373
|
+
originWidth: number;
|
|
374
|
+
originHeight: number;
|
|
375
|
+
nrrd_x_mm: number;
|
|
376
|
+
nrrd_y_mm: number;
|
|
377
|
+
nrrd_z_mm: number;
|
|
378
|
+
nrrd_x_pixel: number;
|
|
379
|
+
nrrd_y_pixel: number;
|
|
380
|
+
nrrd_z_pixel: number;
|
|
381
|
+
dimensions: number[];
|
|
382
|
+
voxelSpacing: number[];
|
|
383
|
+
spaceOrigin: number[];
|
|
384
|
+
RSARatio: number;
|
|
385
|
+
ratios: ICommXYZ;
|
|
386
|
+
layers: string[];
|
|
387
|
+
}
|
|
388
|
+
/** View state — runtime display/navigation state */
|
|
389
|
+
export interface IViewState {
|
|
390
|
+
changedWidth: number;
|
|
391
|
+
changedHeight: number;
|
|
392
|
+
currentSliceIndex: number;
|
|
393
|
+
preSliceIndex: number;
|
|
394
|
+
maxIndex: number;
|
|
395
|
+
minIndex: number;
|
|
396
|
+
contrastNum: number;
|
|
397
|
+
sizeFactor: number;
|
|
398
|
+
showContrast: boolean;
|
|
399
|
+
switchSliceFlag: boolean;
|
|
400
|
+
previousPanelL: number;
|
|
401
|
+
previousPanelT: number;
|
|
402
|
+
}
|
|
403
|
+
/** Interaction state — mouse/cursor tracking */
|
|
404
|
+
export interface IInteractionState {
|
|
405
|
+
mouseOverX: number;
|
|
406
|
+
mouseOverY: number;
|
|
407
|
+
mouseOver: boolean;
|
|
408
|
+
cursorPageX: number;
|
|
409
|
+
cursorPageY: number;
|
|
410
|
+
isCursorSelect: boolean;
|
|
411
|
+
drawStartPos: ICommXY;
|
|
412
|
+
}
|
|
413
|
+
/** Sphere state — SphereTool-specific data */
|
|
414
|
+
export interface ISphereState {
|
|
415
|
+
sphereOrigin: ICommXYZ;
|
|
416
|
+
tumourSphereOrigin: ICommXYZ | null;
|
|
417
|
+
skinSphereOrigin: ICommXYZ | null;
|
|
418
|
+
ribSphereOrigin: ICommXYZ | null;
|
|
419
|
+
nippleSphereOrigin: ICommXYZ | null;
|
|
420
|
+
/** Dedicated MaskVolume for SphereTool 3D sphere data. Type is `any` to avoid circular deps. */
|
|
421
|
+
sphereMaskVolume: any;
|
|
422
|
+
sphereRadius: number;
|
|
423
|
+
}
|
|
424
|
+
/** Internal flags — transient operational flags */
|
|
425
|
+
export interface IInternalFlags {
|
|
426
|
+
stepClear: number;
|
|
427
|
+
clearAllFlag: boolean;
|
|
428
|
+
loadingMaskData: boolean;
|
|
429
|
+
}
|
|
430
|
+
/** Legacy flat interface — kept for backward compatibility during migration */
|
|
431
|
+
export interface INrrdStates extends IImageMetadata, IViewState, IInteractionState, ISphereState, IInternalFlags {
|
|
432
|
+
}
|
|
433
|
+
/** Callbacks for external notification of annotation data changes */
|
|
434
|
+
export interface IAnnotationCallbacks {
|
|
435
|
+
onMaskChanged(sliceData: Uint8Array, layerId: string, channelId: number, sliceIndex: number, axis: "x" | "y" | "z", width: number, height: number, clearFlag: boolean): void;
|
|
436
|
+
onSphereChanged(sphereOrigin: number[], sphereRadius: number): void;
|
|
437
|
+
onCalculatorPositionsChanged(tumour: ICommXYZ | null, skin: ICommXYZ | null, rib: ICommXYZ | null, nipple: ICommXYZ | null, axis: "x" | "y" | "z"): void;
|
|
438
|
+
onLayerVolumeCleared(layerId: string): void;
|
|
439
|
+
onChannelColorChanged(layerId: string, channel: number, color: {
|
|
440
|
+
r: number;
|
|
441
|
+
g: number;
|
|
442
|
+
b: number;
|
|
443
|
+
a: number;
|
|
444
|
+
}): void;
|
|
445
|
+
}
|
|
446
|
+
export interface IConvertObjType {
|
|
447
|
+
currentNewSliceIndex: number;
|
|
448
|
+
preSliceIndex: number;
|
|
449
|
+
convertCursorNumX: number;
|
|
450
|
+
convertCursorNumY: number;
|
|
451
|
+
}
|
|
452
|
+
export interface ICursorPage {
|
|
453
|
+
x: {
|
|
454
|
+
cursorPageX: number;
|
|
455
|
+
cursorPageY: number;
|
|
456
|
+
index: number;
|
|
457
|
+
updated: boolean;
|
|
458
|
+
};
|
|
459
|
+
y: {
|
|
460
|
+
cursorPageX: number;
|
|
461
|
+
cursorPageY: number;
|
|
462
|
+
index: number;
|
|
463
|
+
updated: boolean;
|
|
464
|
+
};
|
|
465
|
+
z: {
|
|
466
|
+
cursorPageX: number;
|
|
467
|
+
cursorPageY: number;
|
|
468
|
+
index: number;
|
|
469
|
+
updated: boolean;
|
|
470
|
+
};
|
|
471
|
+
}
|
|
472
|
+
export interface IDragOpts {
|
|
473
|
+
showNumber?: boolean;
|
|
474
|
+
getSliceNum?: (index: number, contrastNum: number) => void;
|
|
475
|
+
}
|
|
476
|
+
export interface IDrawOpts {
|
|
477
|
+
getMaskData?: (sliceData: Uint8Array, layerId: string, channelId: number, sliceIndex: number, axis: "x" | "y" | "z", width: number, height: number, clearFlag?: boolean) => void;
|
|
478
|
+
onClearLayerVolume?: (layerId: string) => void;
|
|
479
|
+
getSphereData?: (sphereOrigin: number[], sphereRadius: number) => void;
|
|
480
|
+
getCalculateSpherePositionsData?: (tumourSphereOrigin: ICommXYZ | null, skinSphereOrigin: ICommXYZ | null, ribSphereOrigin: ICommXYZ | null, nippleSphereOrigin: ICommXYZ | null, aixs: "x" | "y" | "z") => void;
|
|
481
|
+
}
|
|
482
|
+
export interface IKeyBoardSettings {
|
|
483
|
+
draw: string;
|
|
484
|
+
undo: string;
|
|
485
|
+
redo: string;
|
|
486
|
+
contrast: string[];
|
|
487
|
+
crosshair: string;
|
|
488
|
+
sphere: string;
|
|
489
|
+
mouseWheel: "Scroll:Zoom" | "Scroll:Slice";
|
|
490
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GuiState — Grouped state management for GUI configuration.
|
|
3
|
+
*
|
|
4
|
+
* Replaces the flat IGUIStates object with 4 semantic sub-groups:
|
|
5
|
+
* - mode: Tool mode flags (pencil/eraser/sphere)
|
|
6
|
+
* - drawing: Brush/pencil appearance and behavior
|
|
7
|
+
* - viewConfig: UI layout and interaction parameters
|
|
8
|
+
* - layerChannel: Active layer, channel, and visibility
|
|
9
|
+
*/
|
|
10
|
+
import type { IToolModeState, IDrawingConfig, IViewConfig, ILayerChannelState } from "../core/types";
|
|
11
|
+
export declare class GuiState {
|
|
12
|
+
readonly mode: IToolModeState;
|
|
13
|
+
readonly drawing: IDrawingConfig;
|
|
14
|
+
readonly viewConfig: IViewConfig;
|
|
15
|
+
readonly layerChannel: ILayerChannelState;
|
|
16
|
+
constructor(options?: {
|
|
17
|
+
defaultPaintCursor?: string;
|
|
18
|
+
defaultFillColor?: string;
|
|
19
|
+
defaultBrushColor?: string;
|
|
20
|
+
layers?: string[];
|
|
21
|
+
});
|
|
22
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NrrdState — Grouped state management for NRRD annotation data.
|
|
3
|
+
*
|
|
4
|
+
* Replaces the flat INrrdStates object with 5 semantic sub-groups:
|
|
5
|
+
* - image: Read-mostly metadata set during NRRD loading
|
|
6
|
+
* - view: Runtime display/navigation state
|
|
7
|
+
* - interaction: Mouse/cursor tracking
|
|
8
|
+
* - sphere: SphereTool-specific data
|
|
9
|
+
* - flags: Internal operational flags
|
|
10
|
+
*
|
|
11
|
+
* Phase 4 of the State Management Refactor.
|
|
12
|
+
*/
|
|
13
|
+
import type { IImageMetadata, IViewState, IInteractionState, ISphereState, IInternalFlags } from "../core/types";
|
|
14
|
+
export declare class NrrdState {
|
|
15
|
+
readonly image: IImageMetadata;
|
|
16
|
+
readonly view: IViewState;
|
|
17
|
+
readonly interaction: IInteractionState;
|
|
18
|
+
readonly sphere: ISphereState;
|
|
19
|
+
readonly flags: IInternalFlags;
|
|
20
|
+
constructor(baseCanvasesSize?: number, layers?: string[]);
|
|
21
|
+
/** Set zoom factor with clamping [1, 8] */
|
|
22
|
+
setZoomFactor(factor: number): void;
|
|
23
|
+
/** Reset all sphere state to defaults */
|
|
24
|
+
resetSphereState(): void;
|
|
25
|
+
}
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import { GUI } from "dat.gui";
|
|
2
|
-
import { IDrawingEvents,
|
|
2
|
+
import { IDrawingEvents, IProtected, IGuiParameterSettings } from "../core/types";
|
|
3
|
+
import type { GuiState } from "./GuiState";
|
|
4
|
+
import { NrrdState } from "./NrrdState";
|
|
3
5
|
import { DragOperator } from "../DragOperator";
|
|
4
6
|
interface IConfigGUI {
|
|
5
7
|
modeFolder: GUI;
|
|
6
8
|
dragOperator: DragOperator;
|
|
7
|
-
nrrd_states:
|
|
8
|
-
gui_states:
|
|
9
|
+
nrrd_states: NrrdState;
|
|
10
|
+
gui_states: GuiState;
|
|
9
11
|
drawingCanvas: HTMLCanvasElement;
|
|
10
12
|
drawingPrameters: IDrawingEvents;
|
|
11
13
|
protectedData: IProtected;
|
|
@@ -15,8 +17,8 @@ interface IConfigGUI {
|
|
|
15
17
|
mainPreSlices: any;
|
|
16
18
|
removeDragMode: () => void;
|
|
17
19
|
configDragMode: () => void;
|
|
18
|
-
|
|
19
|
-
|
|
20
|
+
clearActiveSlice: () => void;
|
|
21
|
+
clearActiveLayer: () => void;
|
|
20
22
|
updateSlicesContrast: (value: number, flag: string) => void;
|
|
21
23
|
setMainAreaSize: (factor: number) => void;
|
|
22
24
|
resetPaintAreaUIPosition: () => void;
|
|
@@ -26,17 +28,15 @@ interface IConfigGUI {
|
|
|
26
28
|
resetLayerCanvas: () => void;
|
|
27
29
|
redrawDisplayCanvas: () => void;
|
|
28
30
|
flipDisplayImageByAxis: () => void;
|
|
29
|
-
filterDrawedImage: (axis: "x" | "y" | "z", sliceIndex: number) => {
|
|
30
|
-
index: number;
|
|
31
|
-
image: ImageData;
|
|
32
|
-
} | undefined;
|
|
33
31
|
setEmptyCanvasSize: (axis?: "x" | "y" | "z") => void;
|
|
34
|
-
|
|
32
|
+
syncLayerSliceData: (index: number, layer: string) => void;
|
|
35
33
|
drawImageOnEmptyImage: (canvas: HTMLCanvasElement) => void;
|
|
36
|
-
storeEachLayerImage: (index: number, layer: string) => void;
|
|
37
|
-
storeImageToLayer: (index: number, canvas: HTMLCanvasElement) => ImageData;
|
|
38
34
|
getRestLayer: () => string[];
|
|
39
35
|
setIsDrawFalse: (target: number) => void;
|
|
36
|
+
undoLastPainting: () => void;
|
|
37
|
+
redoLastPainting: () => void;
|
|
38
|
+
resetZoom: () => void;
|
|
39
|
+
downloadCurrentMask: () => void;
|
|
40
40
|
}
|
|
41
41
|
declare function setupGui(configs: IConfigGUI): IGuiParameterSettings;
|
|
42
42
|
declare function removeGuiFolderChilden(modeFolder: GUI): void;
|
|
@@ -72,7 +72,8 @@ export declare class EventRouter {
|
|
|
72
72
|
setGuiTool(tool: GuiTool): void;
|
|
73
73
|
/**
|
|
74
74
|
* Toggle crosshair mode.
|
|
75
|
-
*
|
|
75
|
+
* Allowed in drawing tools AND sphere mode.
|
|
76
|
+
* Blocked when draw or contrast mode is active, or left button is held (mutual exclusion).
|
|
76
77
|
*/
|
|
77
78
|
toggleCrosshair(): void;
|
|
78
79
|
/**
|
|
@@ -12,14 +12,13 @@
|
|
|
12
12
|
* - `contrast`: Ctrl held, left-drag adjusts window/level
|
|
13
13
|
* - `crosshair`: Crosshair mode enabled (C key toggle)
|
|
14
14
|
* - `sphere`: Sphere placement tool active
|
|
15
|
-
* - `calculator`: Distance calculator tool active
|
|
16
15
|
* - `pan`: Right-drag panning the canvas
|
|
17
16
|
*/
|
|
18
|
-
export type InteractionMode = 'idle' | 'draw' | 'drag' | 'contrast' | 'crosshair' | 'sphere' | '
|
|
17
|
+
export type InteractionMode = 'idle' | 'draw' | 'drag' | 'contrast' | 'crosshair' | 'sphere' | 'pan';
|
|
19
18
|
/**
|
|
20
19
|
* GUI tool selection (set from UI buttons)
|
|
21
20
|
*/
|
|
22
|
-
export type GuiTool = 'pencil' | 'brush' | 'eraser' | 'sphere'
|
|
21
|
+
export type GuiTool = 'pencil' | 'brush' | 'eraser' | 'sphere';
|
|
23
22
|
/**
|
|
24
23
|
* Keyboard event handler type
|
|
25
24
|
*/
|
|
@@ -56,6 +55,7 @@ export interface KeyboardSettings {
|
|
|
56
55
|
redo: string;
|
|
57
56
|
contrast: string[];
|
|
58
57
|
crosshair: string;
|
|
58
|
+
sphere: string;
|
|
59
59
|
mouseWheel: 'Scroll:Zoom' | 'Scroll:Slice';
|
|
60
60
|
}
|
|
61
61
|
/**
|
|
@@ -1,23 +1,26 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* BaseTool - Abstract base for extracted DrawToolCore tools
|
|
3
3
|
*
|
|
4
|
-
* Provides shared access to
|
|
5
|
-
* gui_states, protectedData) via a ToolContext interface.
|
|
4
|
+
* Provides shared access to state objects via a ToolContext interface.
|
|
6
5
|
*
|
|
7
6
|
* NOTE: This is for the OLD DrawToolCore system.
|
|
8
7
|
* The new SegmentationManager system has its own tools in manager/tools/.
|
|
9
8
|
*/
|
|
10
|
-
import type {
|
|
9
|
+
import type { IProtected, ICursorPage, IAnnotationCallbacks } from "../core/types";
|
|
10
|
+
import type { NrrdState } from "../coreTools/NrrdState";
|
|
11
|
+
import type { GuiState } from "../coreTools/GuiState";
|
|
11
12
|
import type { EventRouter } from "../eventRouter/EventRouter";
|
|
12
13
|
/**
|
|
13
14
|
* Shared context injected into every legacy tool.
|
|
14
15
|
* References are shared (not copied), so tools see the same state.
|
|
15
16
|
*/
|
|
16
17
|
export interface ToolContext {
|
|
17
|
-
nrrd_states:
|
|
18
|
-
gui_states:
|
|
18
|
+
nrrd_states: NrrdState;
|
|
19
|
+
gui_states: GuiState;
|
|
19
20
|
protectedData: IProtected;
|
|
20
21
|
cursorPage: ICursorPage;
|
|
22
|
+
/** External annotation callbacks (Phase 2) */
|
|
23
|
+
callbacks: IAnnotationCallbacks;
|
|
21
24
|
/** EventRouter reference for mode/state queries. Set after initDrawToolCore(). */
|
|
22
25
|
eventRouter?: EventRouter;
|
|
23
26
|
}
|
|
@@ -8,16 +8,13 @@
|
|
|
8
8
|
*/
|
|
9
9
|
import { BaseTool } from "./BaseTool";
|
|
10
10
|
import type { ToolContext } from "./BaseTool";
|
|
11
|
-
import type { IContrastEvents } from "../
|
|
12
|
-
|
|
13
|
-
setIsDrawFalse: (target: number) => void;
|
|
14
|
-
setSyncsliceNum: () => void;
|
|
15
|
-
}
|
|
11
|
+
import type { IContrastEvents } from "../core/types";
|
|
12
|
+
import type { ContrastHostDeps } from "./ToolHost";
|
|
16
13
|
export declare class ContrastTool extends BaseTool {
|
|
17
14
|
private contrastEventPrameters;
|
|
18
15
|
private container;
|
|
19
16
|
private callbacks;
|
|
20
|
-
constructor(ctx: ToolContext, container: HTMLElement, contrastEventPrameters: IContrastEvents, callbacks:
|
|
17
|
+
constructor(ctx: ToolContext, container: HTMLElement, contrastEventPrameters: IContrastEvents, callbacks: ContrastHostDeps);
|
|
21
18
|
setupConrastEvents(callback: (step: number, towards: "horizental" | "vertical") => void): void;
|
|
22
19
|
configContrastDragMode(): void;
|
|
23
20
|
removeContrastDragMode(): void;
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* - setUpSphereOrigins
|
|
8
8
|
*/
|
|
9
9
|
import { BaseTool } from "./BaseTool";
|
|
10
|
-
import type { IConvertObjType } from "../
|
|
10
|
+
import type { IConvertObjType } from "../core/types";
|
|
11
11
|
export declare class CrosshairTool extends BaseTool {
|
|
12
12
|
enableCrosshair(): void;
|
|
13
13
|
/**
|
|
@@ -26,5 +26,15 @@ export declare class CrosshairTool extends BaseTool {
|
|
|
26
26
|
* @param currentSliceIndex Current slice depth (mm distance)
|
|
27
27
|
*/
|
|
28
28
|
convertCursorPoint(from: "x" | "y" | "z", to: "x" | "y" | "z", cursorNumX: number, cursorNumY: number, currentSliceIndex: number): IConvertObjType | undefined;
|
|
29
|
+
/**
|
|
30
|
+
* Render crosshair lines on the drawing context.
|
|
31
|
+
* Called from the start() render loop when crosshair mode is active.
|
|
32
|
+
*
|
|
33
|
+
* @param ctx - The drawing canvas 2D context
|
|
34
|
+
* @param width - Canvas width (changedWidth)
|
|
35
|
+
* @param height - Canvas height (changedHeight)
|
|
36
|
+
*/
|
|
37
|
+
renderCrosshair(ctx: CanvasRenderingContext2D, width: number, height: number): void;
|
|
38
|
+
private drawLine;
|
|
29
39
|
setUpSphereOrigins(mouseX: number, mouseY: number, sliceIndex: number): void;
|
|
30
40
|
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { BaseTool } from "./BaseTool";
|
|
2
|
+
import type { ToolContext } from "./BaseTool";
|
|
3
|
+
import type { nrrdSliceType, storeExportPaintImageType, loadingBarType } from "../../../types/types";
|
|
4
|
+
import type { DataLoaderHostDeps } from "./ToolHost";
|
|
5
|
+
/**
|
|
6
|
+
* Handles data loading for NRRD slices and mask volumes.
|
|
7
|
+
*
|
|
8
|
+
* Extracted from NrrdTools.ts to reduce its size.
|
|
9
|
+
* Follows the same BaseTool + ToolContext + Callbacks pattern as other tools.
|
|
10
|
+
*/
|
|
11
|
+
export declare class DataLoader extends BaseTool {
|
|
12
|
+
private callbacks;
|
|
13
|
+
constructor(ctx: ToolContext, callbacks: DataLoaderHostDeps);
|
|
14
|
+
/****************************Slice Loading****************************************************/
|
|
15
|
+
/**
|
|
16
|
+
* Load all NRRD contrast slices and initialize MaskVolumes with real dimensions.
|
|
17
|
+
*/
|
|
18
|
+
setAllSlices(allSlices: Array<nrrdSliceType>): void;
|
|
19
|
+
/****************************Legacy Mask Loading****************************************************/
|
|
20
|
+
private loadingMaskByLayer;
|
|
21
|
+
setMasksData(masksData: storeExportPaintImageType, loadingBar?: loadingBarType): void;
|
|
22
|
+
/****************************NIfTI Mask Loading****************************************************/
|
|
23
|
+
/**
|
|
24
|
+
* Load raw voxel data into MaskVolume layers.
|
|
25
|
+
*
|
|
26
|
+
* Expects pre-extracted voxel bytes (e.g. from useNiftiVoxelData).
|
|
27
|
+
*
|
|
28
|
+
* @param layerVoxels Map of layer ID to raw voxel Uint8Array
|
|
29
|
+
* Keys should be 'layer1', 'layer2', 'layer3'
|
|
30
|
+
* @param loadingBar Optional loading bar UI
|
|
31
|
+
*/
|
|
32
|
+
setMasksFromNIfTI(layerVoxels: Map<string, Uint8Array>, loadingBar?: loadingBarType): void;
|
|
33
|
+
}
|
|
@@ -10,15 +10,8 @@
|
|
|
10
10
|
*/
|
|
11
11
|
import { BaseTool } from "./BaseTool";
|
|
12
12
|
import type { ToolContext } from "./BaseTool";
|
|
13
|
-
import type { ILayerRenderTarget } from "../
|
|
14
|
-
|
|
15
|
-
setSyncsliceNum: () => void;
|
|
16
|
-
setIsDrawFalse: (target: number) => void;
|
|
17
|
-
flipDisplayImageByAxis: () => void;
|
|
18
|
-
setEmptyCanvasSize: (axis?: "x" | "y" | "z") => void;
|
|
19
|
-
getOrCreateSliceBuffer: (axis: "x" | "y" | "z") => ImageData | null;
|
|
20
|
-
renderSliceToCanvas: (layer: string, axis: "x" | "y" | "z", sliceIndex: number, buffer: ImageData, targetCtx: CanvasRenderingContext2D, scaledWidth: number, scaledHeight: number) => void;
|
|
21
|
-
}
|
|
13
|
+
import type { ILayerRenderTarget } from "../core/types";
|
|
14
|
+
import type { DragSliceHostDeps } from "./ToolHost";
|
|
22
15
|
interface IDragEffectCanvases {
|
|
23
16
|
drawingCanvasLayerMaster: HTMLCanvasElement;
|
|
24
17
|
displayCanvas: HTMLCanvasElement;
|
|
@@ -29,7 +22,7 @@ export declare class DragSliceTool extends BaseTool {
|
|
|
29
22
|
private callbacks;
|
|
30
23
|
private showDragNumberDiv;
|
|
31
24
|
private dragEffectCanvases;
|
|
32
|
-
constructor(ctx: ToolContext, callbacks:
|
|
25
|
+
constructor(ctx: ToolContext, callbacks: DragSliceHostDeps, showDragNumberDiv: HTMLDivElement, dragEffectCanvases: IDragEffectCanvases);
|
|
33
26
|
setShowDragNumberDiv(div: HTMLDivElement): void;
|
|
34
27
|
updateIndex(move: number): void;
|
|
35
28
|
private drawDragSlice;
|