copper3d 3.0.2 → 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 +183 -1028
- 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 +1 -1
- package/dist/Utils/segmentation/DragOperator.js +2 -4
- package/dist/Utils/segmentation/DragOperator.js.map +1 -1
- package/dist/Utils/segmentation/DrawToolCore.d.ts +49 -27
- package/dist/Utils/segmentation/DrawToolCore.js +275 -344
- package/dist/Utils/segmentation/DrawToolCore.js.map +1 -1
- package/dist/Utils/segmentation/NrrdTools.d.ts +89 -467
- package/dist/Utils/segmentation/NrrdTools.js +479 -1335
- 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.d.ts +1 -1
- package/dist/Utils/segmentation/core/MaskVolume.js +1 -1
- package/dist/Utils/segmentation/core/index.d.ts +1 -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 +1 -0
- package/dist/Utils/segmentation/core/types.js.map +1 -1
- package/dist/Utils/segmentation/coreTools/GuiState.d.ts +1 -1
- package/dist/Utils/segmentation/coreTools/NrrdState.d.ts +1 -1
- package/dist/Utils/segmentation/coreTools/divControlTools.d.ts +1 -1
- package/dist/Utils/segmentation/coreTools/gui.d.ts +1 -1
- package/dist/Utils/segmentation/tools/BaseTool.d.ts +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 +25 -0
- 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 -12
- package/dist/Utils/segmentation/tools/DragSliceTool.js.map +1 -1
- package/dist/Utils/segmentation/tools/DrawingTool.d.ts +18 -26
- package/dist/Utils/segmentation/tools/DrawingTool.js +48 -0
- package/dist/Utils/segmentation/tools/DrawingTool.js.map +1 -1
- package/dist/Utils/segmentation/tools/ImageStoreHelper.d.ts +2 -5
- 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 +2 -8
- package/dist/Utils/segmentation/tools/PanTool.js.map +1 -1
- 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 +25 -19
- package/dist/Utils/segmentation/tools/SphereTool.js +61 -7
- 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.map +1 -1
- package/dist/Utils/segmentation/tools/index.d.ts +5 -7
- package/dist/Utils/segmentation/tools/index.js +6 -0
- package/dist/Utils/segmentation/tools/index.js.map +1 -1
- package/dist/Utils/workers/reformatSaveDataWorker.d.ts +1 -1
- package/dist/bundle.esm.js +2109 -2357
- package/dist/bundle.umd.js +2109 -2357
- package/dist/index.d.ts +3 -3
- package/dist/index.js +1 -1
- package/dist/types/Utils/segmentation/CanvasState.d.ts +31 -0
- package/dist/types/Utils/segmentation/DragOperator.d.ts +1 -1
- package/dist/types/Utils/segmentation/DrawToolCore.d.ts +49 -27
- package/dist/types/Utils/segmentation/NrrdTools.d.ts +89 -467
- package/dist/types/Utils/segmentation/RenderingUtils.d.ts +73 -0
- package/dist/types/Utils/segmentation/core/MaskVolume.d.ts +1 -1
- package/dist/types/Utils/segmentation/core/index.d.ts +1 -1
- package/dist/types/Utils/segmentation/core/types.d.ts +384 -0
- package/dist/types/Utils/segmentation/coreTools/GuiState.d.ts +1 -1
- package/dist/types/Utils/segmentation/coreTools/NrrdState.d.ts +1 -1
- package/dist/types/Utils/segmentation/coreTools/divControlTools.d.ts +1 -1
- package/dist/types/Utils/segmentation/coreTools/gui.d.ts +1 -1
- package/dist/types/Utils/segmentation/tools/BaseTool.d.ts +1 -1
- 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 -12
- package/dist/types/Utils/segmentation/tools/DrawingTool.d.ts +18 -26
- package/dist/types/Utils/segmentation/tools/ImageStoreHelper.d.ts +2 -5
- package/dist/types/Utils/segmentation/tools/LayerChannelManager.d.ts +52 -0
- package/dist/types/Utils/segmentation/tools/PanTool.d.ts +2 -8
- package/dist/types/Utils/segmentation/tools/SliceRenderPipeline.d.ts +80 -0
- package/dist/types/Utils/segmentation/tools/SphereTool.d.ts +25 -19
- 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 +5 -7
- package/dist/types/Utils/workers/reformatSaveDataWorker.d.ts +1 -1
- package/dist/types/index.d.ts +3 -3
- package/package.json +1 -1
- package/dist/Utils/segmentation/CommToolsData.d.ts +0 -192
- package/dist/Utils/segmentation/CommToolsData.js +0 -474
- package/dist/Utils/segmentation/CommToolsData.js.map +0 -1
- package/dist/Utils/segmentation/coreTools/coreType.d.ts +0 -389
- 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 -192
- package/dist/types/Utils/segmentation/coreTools/coreType.d.ts +0 -389
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import type { INewMaskData } from "./core/types";
|
|
2
|
+
import type { MaskVolume } from "./core/index";
|
|
3
|
+
import type { CanvasState } from "./CanvasState";
|
|
4
|
+
/**
|
|
5
|
+
* RenderingUtils — Rendering / slice-buffer helper methods.
|
|
6
|
+
*
|
|
7
|
+
* Extracted from CommToolsData. All methods operate on the shared
|
|
8
|
+
* {@link CanvasState} reference — no independent state is held here
|
|
9
|
+
* except the reusable ImageData slice buffer.
|
|
10
|
+
*
|
|
11
|
+
* The `setEmptyCanvasSize` callback is injected by the owner (DrawToolCore
|
|
12
|
+
* or NrrdTools) because it lives in SliceRenderPipeline, not here.
|
|
13
|
+
*/
|
|
14
|
+
export declare class RenderingUtils {
|
|
15
|
+
private state;
|
|
16
|
+
/** Injected callback — set by owner after construction. */
|
|
17
|
+
setEmptyCanvasSize: (axis?: "x" | "y" | "z") => void;
|
|
18
|
+
private _reusableSliceBuffer;
|
|
19
|
+
private _reusableBufferWidth;
|
|
20
|
+
private _reusableBufferHeight;
|
|
21
|
+
constructor(state: CanvasState);
|
|
22
|
+
/**
|
|
23
|
+
* Get MaskVolume for a specific layer
|
|
24
|
+
*
|
|
25
|
+
* @param layer - Layer name: "layer1", "layer2", or "layer3"
|
|
26
|
+
* @returns MaskVolume instance for the specified layer
|
|
27
|
+
*/
|
|
28
|
+
getVolumeForLayer(layer: string): MaskVolume;
|
|
29
|
+
/**
|
|
30
|
+
* Get MaskVolume for the currently active layer
|
|
31
|
+
*/
|
|
32
|
+
getCurrentVolume(): MaskVolume;
|
|
33
|
+
/**
|
|
34
|
+
* Get all MaskVolume instances
|
|
35
|
+
*/
|
|
36
|
+
getAllVolumes(): INewMaskData;
|
|
37
|
+
/**
|
|
38
|
+
* Get a painted mask image based on current axis and input slice index.
|
|
39
|
+
*
|
|
40
|
+
* Reads directly from MaskVolume.
|
|
41
|
+
*/
|
|
42
|
+
filterDrawedImage(axis: "x" | "y" | "z", sliceIndex: number): {
|
|
43
|
+
index: number;
|
|
44
|
+
image: ImageData;
|
|
45
|
+
} | undefined;
|
|
46
|
+
/**
|
|
47
|
+
* Get or create a reusable ImageData buffer for the given axis.
|
|
48
|
+
*
|
|
49
|
+
* Reuses the same buffer across multiple slice renders to avoid
|
|
50
|
+
* allocating a new ImageData per layer per slice switch.
|
|
51
|
+
*/
|
|
52
|
+
getOrCreateSliceBuffer(axis: "x" | "y" | "z"): ImageData | null;
|
|
53
|
+
/**
|
|
54
|
+
* Render a layer's slice into a reusable buffer and draw to the target canvas.
|
|
55
|
+
*
|
|
56
|
+
* Uses MaskVolume.renderLabelSliceInto() for zero-allocation rendering.
|
|
57
|
+
*/
|
|
58
|
+
renderSliceToCanvas(layer: string, axis: "x" | "y" | "z", sliceIndex: number, buffer: ImageData, targetCtx: CanvasRenderingContext2D, scaledWidth: number, scaledHeight: number): void;
|
|
59
|
+
/**
|
|
60
|
+
* Invalidate the reusable buffer (e.g. when switching datasets).
|
|
61
|
+
*/
|
|
62
|
+
invalidateSliceBuffer(): void;
|
|
63
|
+
/**
|
|
64
|
+
* Apply the same flip transform used by flipDisplayImageByAxis() to any
|
|
65
|
+
* canvas context.
|
|
66
|
+
*/
|
|
67
|
+
applyMaskFlipForAxis(ctx: CanvasRenderingContext2D, width: number, height: number, axis: "x" | "y" | "z"): void;
|
|
68
|
+
/**
|
|
69
|
+
* Composite all layer canvases to the master display canvas.
|
|
70
|
+
* Only draws layers whose visibility is enabled.
|
|
71
|
+
*/
|
|
72
|
+
compositeAllLayers(): void;
|
|
73
|
+
}
|
|
@@ -67,7 +67,7 @@
|
|
|
67
67
|
* const legacy = convertVolumeToIPaintImages(volume);
|
|
68
68
|
* ```
|
|
69
69
|
*/
|
|
70
|
-
export type { Dimensions, RGBAColor, ChannelColorMap, SliceRenderOptions, LayerId, ChannelValue, } from './types';
|
|
70
|
+
export type { Dimensions, RGBAColor, ChannelColorMap, SliceRenderOptions, LayerId, ChannelValue, ICommXYZ, ICommXY, ISkipSlicesDictType, ToolMode, IDragPrameters, IDrawingEvents, IContrastEvents, IPaintImages, IPaintImage, ILayerRenderTarget, IDownloadImageConfig, INewMaskData, IMaskData, IProtected, IToolModeState, IDrawingConfig, IViewConfig, ILayerChannelState, IGUIStates, IGuiMeta, IGuiParameterSettings, IImageMetadata, IViewState, IInteractionState, ISphereState, IInternalFlags, INrrdStates, IAnnotationCallbacks, IConvertObjType, ICursorPage, IDragOpts, IDrawOpts, IKeyBoardSettings, } from './types';
|
|
71
71
|
export { RenderMode, MASK_CHANNEL_COLORS, MASK_CHANNEL_CSS_COLORS, CHANNEL_COLORS, CHANNEL_HEX_COLORS, rgbaToHex, rgbaToCss, } from './types';
|
|
72
72
|
export { MaskVolume } from './MaskVolume';
|
|
73
73
|
export type { MaskDelta } from './UndoManager';
|
|
@@ -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
|
+
}
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* - viewConfig: UI layout and interaction parameters
|
|
8
8
|
* - layerChannel: Active layer, channel, and visibility
|
|
9
9
|
*/
|
|
10
|
-
import type { IToolModeState, IDrawingConfig, IViewConfig, ILayerChannelState } from "
|
|
10
|
+
import type { IToolModeState, IDrawingConfig, IViewConfig, ILayerChannelState } from "../core/types";
|
|
11
11
|
export declare class GuiState {
|
|
12
12
|
readonly mode: IToolModeState;
|
|
13
13
|
readonly drawing: IDrawingConfig;
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
*
|
|
11
11
|
* Phase 4 of the State Management Refactor.
|
|
12
12
|
*/
|
|
13
|
-
import type { IImageMetadata, IViewState, IInteractionState, ISphereState, IInternalFlags } from "
|
|
13
|
+
import type { IImageMetadata, IViewState, IInteractionState, ISphereState, IInternalFlags } from "../core/types";
|
|
14
14
|
export declare class NrrdState {
|
|
15
15
|
readonly image: IImageMetadata;
|
|
16
16
|
readonly view: IViewState;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { GUI } from "dat.gui";
|
|
2
|
-
import { IDrawingEvents, IProtected, IGuiParameterSettings } from "
|
|
2
|
+
import { IDrawingEvents, IProtected, IGuiParameterSettings } from "../core/types";
|
|
3
3
|
import type { GuiState } from "./GuiState";
|
|
4
4
|
import { NrrdState } from "./NrrdState";
|
|
5
5
|
import { DragOperator } from "../DragOperator";
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* NOTE: This is for the OLD DrawToolCore system.
|
|
7
7
|
* The new SegmentationManager system has its own tools in manager/tools/.
|
|
8
8
|
*/
|
|
9
|
-
import type { IProtected, ICursorPage, IAnnotationCallbacks } from "../
|
|
9
|
+
import type { IProtected, ICursorPage, IAnnotationCallbacks } from "../core/types";
|
|
10
10
|
import type { NrrdState } from "../coreTools/NrrdState";
|
|
11
11
|
import type { GuiState } from "../coreTools/GuiState";
|
|
12
12
|
import type { EventRouter } from "../eventRouter/EventRouter";
|
|
@@ -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,17 +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
|
-
/** Refresh sphere overlay from sphereMaskVolume after slice change. */
|
|
22
|
-
refreshSphereOverlay?: () => void;
|
|
23
|
-
}
|
|
13
|
+
import type { ILayerRenderTarget } from "../core/types";
|
|
14
|
+
import type { DragSliceHostDeps } from "./ToolHost";
|
|
24
15
|
interface IDragEffectCanvases {
|
|
25
16
|
drawingCanvasLayerMaster: HTMLCanvasElement;
|
|
26
17
|
displayCanvas: HTMLCanvasElement;
|
|
@@ -31,7 +22,7 @@ export declare class DragSliceTool extends BaseTool {
|
|
|
31
22
|
private callbacks;
|
|
32
23
|
private showDragNumberDiv;
|
|
33
24
|
private dragEffectCanvases;
|
|
34
|
-
constructor(ctx: ToolContext, callbacks:
|
|
25
|
+
constructor(ctx: ToolContext, callbacks: DragSliceHostDeps, showDragNumberDiv: HTMLDivElement, dragEffectCanvases: IDragEffectCanvases);
|
|
35
26
|
setShowDragNumberDiv(div: HTMLDivElement): void;
|
|
36
27
|
updateIndex(move: number): void;
|
|
37
28
|
private drawDragSlice;
|