copper3d 3.0.1 → 3.0.2
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 +195 -28
- package/dist/Utils/segmentation/CommToolsData.d.ts +24 -9
- package/dist/Utils/segmentation/CommToolsData.js +65 -139
- package/dist/Utils/segmentation/CommToolsData.js.map +1 -1
- package/dist/Utils/segmentation/DragOperator.d.ts +10 -2
- package/dist/Utils/segmentation/DragOperator.js +14 -4
- package/dist/Utils/segmentation/DragOperator.js.map +1 -1
- package/dist/Utils/segmentation/DrawToolCore.d.ts +23 -16
- package/dist/Utils/segmentation/DrawToolCore.js +218 -401
- package/dist/Utils/segmentation/DrawToolCore.js.map +1 -1
- package/dist/Utils/segmentation/NrrdTools.d.ts +152 -10
- package/dist/Utils/segmentation/NrrdTools.js +599 -202
- package/dist/Utils/segmentation/NrrdTools.js.map +1 -1
- package/dist/Utils/segmentation/core/MaskVolume.d.ts +1 -1
- package/dist/Utils/segmentation/core/MaskVolume.js +24 -3
- 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 +0 -2
- 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.js +24 -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/coreType.d.ts +88 -62
- package/dist/Utils/segmentation/coreTools/coreType.js.map +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/CrosshairTool.js +25 -25
- package/dist/Utils/segmentation/tools/CrosshairTool.js.map +1 -1
- package/dist/Utils/segmentation/tools/DragSliceTool.d.ts +2 -0
- 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 +93 -0
- package/dist/Utils/segmentation/tools/DrawingTool.js +222 -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 +11 -28
- package/dist/Utils/segmentation/tools/ImageStoreHelper.js +39 -82
- package/dist/Utils/segmentation/tools/ImageStoreHelper.js.map +1 -1
- package/dist/Utils/segmentation/tools/PanTool.d.ts +53 -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/SphereTool.d.ts +208 -1
- package/dist/Utils/segmentation/tools/SphereTool.js +456 -45
- package/dist/Utils/segmentation/tools/SphereTool.js.map +1 -1
- 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 +6 -2
- package/dist/Utils/segmentation/tools/index.js +4 -1
- package/dist/Utils/segmentation/tools/index.js.map +1 -1
- package/dist/bundle.esm.js +2452 -1492
- package/dist/bundle.umd.js +2452 -1492
- 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/CommToolsData.d.ts +24 -9
- package/dist/types/Utils/segmentation/DragOperator.d.ts +10 -2
- package/dist/types/Utils/segmentation/DrawToolCore.d.ts +23 -16
- package/dist/types/Utils/segmentation/NrrdTools.d.ts +152 -10
- package/dist/types/Utils/segmentation/core/MaskVolume.d.ts +1 -1
- package/dist/types/Utils/segmentation/core/UndoManager.d.ts +1 -1
- package/dist/types/Utils/segmentation/core/index.d.ts +0 -2
- 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/coreType.d.ts +88 -62
- 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/DragSliceTool.d.ts +2 -0
- package/dist/types/Utils/segmentation/tools/DrawingTool.d.ts +93 -0
- package/dist/types/Utils/segmentation/tools/ImageStoreHelper.d.ts +11 -28
- package/dist/types/Utils/segmentation/tools/PanTool.d.ts +53 -0
- package/dist/types/Utils/segmentation/tools/SphereTool.d.ts +208 -1
- package/dist/types/Utils/segmentation/tools/index.d.ts +6 -2
- package/dist/types/index.d.ts +6 -3
- package/package.json +1 -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/types/Utils/segmentation/core/MigrationUtils.d.ts +0 -97
|
@@ -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 "./coreType";
|
|
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
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
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
|
+
export class NrrdState {
|
|
14
|
+
constructor(baseCanvasesSize = 1, layers = ["layer1", "layer2", "layer3"]) {
|
|
15
|
+
this.image = {
|
|
16
|
+
originWidth: 0,
|
|
17
|
+
originHeight: 0,
|
|
18
|
+
nrrd_x_mm: 0,
|
|
19
|
+
nrrd_y_mm: 0,
|
|
20
|
+
nrrd_z_mm: 0,
|
|
21
|
+
nrrd_x_pixel: 0,
|
|
22
|
+
nrrd_y_pixel: 0,
|
|
23
|
+
nrrd_z_pixel: 0,
|
|
24
|
+
dimensions: [],
|
|
25
|
+
voxelSpacing: [],
|
|
26
|
+
spaceOrigin: [],
|
|
27
|
+
RSARatio: 0,
|
|
28
|
+
ratios: { x: 1, y: 1, z: 1 },
|
|
29
|
+
layers,
|
|
30
|
+
};
|
|
31
|
+
this.view = {
|
|
32
|
+
changedWidth: 0,
|
|
33
|
+
changedHeight: 0,
|
|
34
|
+
currentSliceIndex: 0,
|
|
35
|
+
preSliceIndex: 0,
|
|
36
|
+
maxIndex: 0,
|
|
37
|
+
minIndex: 0,
|
|
38
|
+
contrastNum: 0,
|
|
39
|
+
sizeFactor: baseCanvasesSize,
|
|
40
|
+
showContrast: false,
|
|
41
|
+
switchSliceFlag: false,
|
|
42
|
+
previousPanelL: -99999,
|
|
43
|
+
previousPanelT: -99999,
|
|
44
|
+
};
|
|
45
|
+
this.interaction = {
|
|
46
|
+
mouseOverX: 0,
|
|
47
|
+
mouseOverY: 0,
|
|
48
|
+
mouseOver: false,
|
|
49
|
+
cursorPageX: 0,
|
|
50
|
+
cursorPageY: 0,
|
|
51
|
+
isCursorSelect: false,
|
|
52
|
+
drawStartPos: { x: 1, y: 1 },
|
|
53
|
+
};
|
|
54
|
+
this.sphere = {
|
|
55
|
+
sphereOrigin: { x: [0, 0, 0], y: [0, 0, 0], z: [0, 0, 0] },
|
|
56
|
+
tumourSphereOrigin: null,
|
|
57
|
+
skinSphereOrigin: null,
|
|
58
|
+
ribSphereOrigin: null,
|
|
59
|
+
nippleSphereOrigin: null,
|
|
60
|
+
sphereMaskVolume: null,
|
|
61
|
+
sphereRadius: 5,
|
|
62
|
+
};
|
|
63
|
+
this.flags = {
|
|
64
|
+
stepClear: 1,
|
|
65
|
+
clearAllFlag: false,
|
|
66
|
+
loadingMaskData: false,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
// ── Validated Setters ────────────────────────────────────────────────────
|
|
70
|
+
/** Set zoom factor with clamping [1, 8] */
|
|
71
|
+
setZoomFactor(factor) {
|
|
72
|
+
this.view.sizeFactor = Math.max(1, Math.min(8, factor));
|
|
73
|
+
}
|
|
74
|
+
/** Reset all sphere state to defaults */
|
|
75
|
+
resetSphereState() {
|
|
76
|
+
this.sphere.sphereOrigin = { x: [0, 0, 0], y: [0, 0, 0], z: [0, 0, 0] };
|
|
77
|
+
this.sphere.tumourSphereOrigin = null;
|
|
78
|
+
this.sphere.skinSphereOrigin = null;
|
|
79
|
+
this.sphere.ribSphereOrigin = null;
|
|
80
|
+
this.sphere.nippleSphereOrigin = null;
|
|
81
|
+
this.sphere.sphereMaskVolume = null;
|
|
82
|
+
this.sphere.sphereRadius = 5;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=NrrdState.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NrrdState.js","sourceRoot":"","sources":["../../../../src/Utils/segmentation/coreTools/NrrdState.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,25 @@
|
|
|
1
|
+
/** Tool mode types for segmentation tools */
|
|
2
|
+
type ToolMode = "pencil" | "brush" | "eraser" | "sphere" | "calculator";
|
|
3
|
+
/** Metadata for a GUI slider/control — used by Vue components to configure slider UI */
|
|
4
|
+
interface IGuiMeta {
|
|
5
|
+
min: number;
|
|
6
|
+
max: number;
|
|
7
|
+
step: number;
|
|
8
|
+
value: number;
|
|
9
|
+
}
|
|
10
|
+
/** Callbacks for external notification of annotation data changes */
|
|
11
|
+
interface IAnnotationCallbacks {
|
|
12
|
+
onMaskChanged(sliceData: Uint8Array, layerId: string, channelId: number, sliceIndex: number, axis: "x" | "y" | "z", width: number, height: number, clearFlag: boolean): void;
|
|
13
|
+
onSphereChanged(sphereOrigin: number[], sphereRadius: number): void;
|
|
14
|
+
onCalculatorPositionsChanged(tumour: ICommXYZ | null, skin: ICommXYZ | null, rib: ICommXYZ | null, nipple: ICommXYZ | null, axis: "x" | "y" | "z"): void;
|
|
15
|
+
onLayerVolumeCleared(layerId: string): void;
|
|
16
|
+
onChannelColorChanged(layerId: string, channel: number, color: {
|
|
17
|
+
r: number;
|
|
18
|
+
g: number;
|
|
19
|
+
b: number;
|
|
20
|
+
a: number;
|
|
21
|
+
}): void;
|
|
22
|
+
}
|
|
1
23
|
interface ICommXYZ {
|
|
2
24
|
x: any;
|
|
3
25
|
y: any;
|
|
@@ -12,14 +34,14 @@ interface ISkipSlicesDictType {
|
|
|
12
34
|
}
|
|
13
35
|
interface IDownloadImageConfig {
|
|
14
36
|
axis: "x" | "y" | "z";
|
|
15
|
-
|
|
37
|
+
currentSliceIndex: number;
|
|
16
38
|
drawingCanvas: HTMLCanvasElement;
|
|
17
39
|
originWidth: number;
|
|
18
40
|
originHeight: number;
|
|
19
41
|
}
|
|
20
42
|
interface IConvertObjType {
|
|
21
|
-
|
|
22
|
-
|
|
43
|
+
currentNewSliceIndex: number;
|
|
44
|
+
preSliceIndex: number;
|
|
23
45
|
convertCursorNumX: number;
|
|
24
46
|
convertCursorNumY: number;
|
|
25
47
|
}
|
|
@@ -99,10 +121,9 @@ interface IProtected {
|
|
|
99
121
|
skipSlicesDic: ISkipSlicesDictType;
|
|
100
122
|
currentShowingSlice: any;
|
|
101
123
|
mainPreSlices: any;
|
|
102
|
-
|
|
124
|
+
isDrawing: boolean;
|
|
103
125
|
axis: "x" | "y" | "z";
|
|
104
126
|
maskData: IMaskData;
|
|
105
|
-
previousDrawingImage?: ImageData;
|
|
106
127
|
/** Dynamic per-layer canvas+ctx pairs. Replaces hardcoded LayerOne/Two/Three fields. */
|
|
107
128
|
layerTargets: Map<string, ILayerRenderTarget>;
|
|
108
129
|
canvases: {
|
|
@@ -121,31 +142,34 @@ interface IProtected {
|
|
|
121
142
|
drawingLayerMasterCtx: CanvasRenderingContext2D;
|
|
122
143
|
};
|
|
123
144
|
}
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
145
|
+
/** Tool mode flags — which tool is currently active */
|
|
146
|
+
interface IToolModeState {
|
|
147
|
+
pencil: boolean;
|
|
148
|
+
eraser: boolean;
|
|
149
|
+
sphere: boolean;
|
|
150
|
+
activeSphereType: "tumour" | "skin" | "nipple" | "ribcage";
|
|
151
|
+
}
|
|
152
|
+
/** Drawing configuration — brush/pencil appearance and behavior */
|
|
153
|
+
interface IDrawingConfig {
|
|
128
154
|
globalAlpha: number;
|
|
129
155
|
lineWidth: number;
|
|
130
156
|
color: string;
|
|
131
|
-
pencil: boolean;
|
|
132
157
|
fillColor: string;
|
|
133
158
|
brushColor: string;
|
|
134
159
|
brushAndEraserSize: number;
|
|
160
|
+
}
|
|
161
|
+
/** View configuration — UI layout and interaction parameters */
|
|
162
|
+
interface IViewConfig {
|
|
163
|
+
mainAreaSize: number;
|
|
164
|
+
dragSensitivity: number;
|
|
135
165
|
cursor: string;
|
|
136
|
-
layer: string;
|
|
137
|
-
cal_distance: "tumour" | "skin" | "nipple" | "ribcage";
|
|
138
|
-
sphere: boolean;
|
|
139
|
-
calculator: boolean;
|
|
140
|
-
readyToUpdate: boolean;
|
|
141
166
|
defaultPaintCursor: string;
|
|
142
167
|
max_sensitive: number;
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
resetZoom: () => void;
|
|
168
|
+
readyToUpdate: boolean;
|
|
169
|
+
}
|
|
170
|
+
/** Layer/channel state — active layer, channel, and visibility */
|
|
171
|
+
interface ILayerChannelState {
|
|
172
|
+
layer: string;
|
|
149
173
|
/** Currently active channel (1-8). Channel 0 is transparent/erased. */
|
|
150
174
|
activeChannel: number;
|
|
151
175
|
/** Layer visibility state: { layer1: true, layer2: true, layer3: true } */
|
|
@@ -153,15 +177,19 @@ interface IGUIStates {
|
|
|
153
177
|
/** Per-layer channel visibility: { layer1: { 1: true, ..., 8: true }, ... } */
|
|
154
178
|
channelVisibility: Record<string, Record<number, boolean>>;
|
|
155
179
|
}
|
|
180
|
+
interface IGUIStates extends IToolModeState, IDrawingConfig, IViewConfig, ILayerChannelState {
|
|
181
|
+
}
|
|
156
182
|
interface IKeyBoardSettings {
|
|
157
183
|
draw: string;
|
|
158
184
|
undo: string;
|
|
159
185
|
redo: string;
|
|
160
186
|
contrast: string[];
|
|
161
187
|
crosshair: string;
|
|
188
|
+
sphere: string;
|
|
162
189
|
mouseWheel: "Scroll:Zoom" | "Scroll:Slice";
|
|
163
190
|
}
|
|
164
|
-
|
|
191
|
+
/** Image metadata — set once during NRRD loading, read-only at runtime */
|
|
192
|
+
interface IImageMetadata {
|
|
165
193
|
originWidth: number;
|
|
166
194
|
originHeight: number;
|
|
167
195
|
nrrd_x_mm: number;
|
|
@@ -170,55 +198,57 @@ interface INrrdStates {
|
|
|
170
198
|
nrrd_x_pixel: number;
|
|
171
199
|
nrrd_y_pixel: number;
|
|
172
200
|
nrrd_z_pixel: number;
|
|
201
|
+
dimensions: number[];
|
|
202
|
+
voxelSpacing: number[];
|
|
203
|
+
spaceOrigin: number[];
|
|
204
|
+
RSARatio: number;
|
|
205
|
+
ratios: ICommXYZ;
|
|
206
|
+
layers: string[];
|
|
207
|
+
}
|
|
208
|
+
/** View state — runtime display/navigation state */
|
|
209
|
+
interface IViewState {
|
|
173
210
|
changedWidth: number;
|
|
174
211
|
changedHeight: number;
|
|
175
|
-
|
|
176
|
-
|
|
212
|
+
currentSliceIndex: number;
|
|
213
|
+
preSliceIndex: number;
|
|
177
214
|
maxIndex: number;
|
|
178
215
|
minIndex: number;
|
|
179
|
-
RSARatio: number;
|
|
180
|
-
voxelSpacing: number[];
|
|
181
|
-
spaceOrigin: number[];
|
|
182
|
-
dimensions: number[];
|
|
183
|
-
loadMaskJson: boolean;
|
|
184
|
-
ratios: ICommXYZ;
|
|
185
216
|
contrastNum: number;
|
|
217
|
+
sizeFactor: number;
|
|
186
218
|
showContrast: boolean;
|
|
187
|
-
|
|
219
|
+
switchSliceFlag: boolean;
|
|
220
|
+
previousPanelL: number;
|
|
221
|
+
previousPanelT: number;
|
|
222
|
+
}
|
|
223
|
+
/** Interaction state — mouse/cursor tracking */
|
|
224
|
+
interface IInteractionState {
|
|
225
|
+
mouseOverX: number;
|
|
226
|
+
mouseOverY: number;
|
|
227
|
+
mouseOver: boolean;
|
|
188
228
|
cursorPageX: number;
|
|
189
229
|
cursorPageY: number;
|
|
230
|
+
isCursorSelect: boolean;
|
|
231
|
+
drawStartPos: ICommXY;
|
|
232
|
+
}
|
|
233
|
+
/** Sphere state — SphereTool-specific data */
|
|
234
|
+
interface ISphereState {
|
|
190
235
|
sphereOrigin: ICommXYZ;
|
|
191
236
|
tumourSphereOrigin: ICommXYZ | null;
|
|
192
237
|
skinSphereOrigin: ICommXYZ | null;
|
|
193
238
|
ribSphereOrigin: ICommXYZ | null;
|
|
194
239
|
nippleSphereOrigin: ICommXYZ | null;
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
ribcageColor: "#2196F3";
|
|
198
|
-
nippleColor: "#E91E63";
|
|
199
|
-
spherePlanB: boolean;
|
|
240
|
+
/** Dedicated MaskVolume for SphereTool 3D sphere data. Type is `any` to avoid circular deps. */
|
|
241
|
+
sphereMaskVolume: any;
|
|
200
242
|
sphereRadius: number;
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
243
|
+
}
|
|
244
|
+
/** Internal flags — transient operational flags */
|
|
245
|
+
interface IInternalFlags {
|
|
204
246
|
stepClear: number;
|
|
205
|
-
sizeFoctor: number;
|
|
206
247
|
clearAllFlag: boolean;
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
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;
|
|
219
|
-
getSphere: (sphereOrigin: number[], sphereRadius: number) => void;
|
|
220
|
-
getCalculateSpherePositions: (tumourSphereOrigin: ICommXYZ | null, skinSphereOrigin: ICommXYZ | null, ribSphereOrigin: ICommXYZ | null, nippleSphereOrigin: ICommXYZ | null, aixs: "x" | "y" | "z") => void;
|
|
221
|
-
drawStartPos: ICommXY;
|
|
248
|
+
loadingMaskData: boolean;
|
|
249
|
+
}
|
|
250
|
+
/** Legacy flat interface — kept for backward compatibility during migration */
|
|
251
|
+
interface INrrdStates extends IImageMetadata, IViewState, IInteractionState, ISphereState, IInternalFlags {
|
|
222
252
|
}
|
|
223
253
|
interface IDragOpts {
|
|
224
254
|
showNumber?: boolean;
|
|
@@ -272,15 +302,11 @@ interface IGuiParameterSettings {
|
|
|
272
302
|
step: number;
|
|
273
303
|
onChange: () => void;
|
|
274
304
|
};
|
|
275
|
-
|
|
305
|
+
eraser: {
|
|
276
306
|
name: "Eraser";
|
|
277
307
|
onChange: () => void;
|
|
278
308
|
};
|
|
279
|
-
|
|
280
|
-
name: "Calculator";
|
|
281
|
-
onChange: () => void;
|
|
282
|
-
};
|
|
283
|
-
cal_distance: {
|
|
309
|
+
activeSphereType: {
|
|
284
310
|
name: "CalculatorDistance";
|
|
285
311
|
onChange: (val: "tumour" | "skin" | "ribcage" | "nipple") => void;
|
|
286
312
|
};
|
|
@@ -360,4 +386,4 @@ interface IGuiParameterSettings {
|
|
|
360
386
|
};
|
|
361
387
|
};
|
|
362
388
|
}
|
|
363
|
-
export { ICommXYZ, ICommXY, IDownloadImageConfig, IConvertObjType, IDragPrameters, IDrawingEvents, IContrastEvents, IProtected, IGUIStates, IDragOpts, IDrawOpts, INrrdStates, IPaintImage, IPaintImages, ISkipSlicesDictType, IMaskData, INewMaskData, ILayerRenderTarget, ICursorPage, IGuiParameterSettings, IKeyBoardSettings };
|
|
389
|
+
export { ToolMode, IGuiMeta, IAnnotationCallbacks, ICommXYZ, ICommXY, IDownloadImageConfig, IConvertObjType, IDragPrameters, IDrawingEvents, IContrastEvents, IProtected, IGUIStates, IToolModeState, IDrawingConfig, IViewConfig, ILayerChannelState, IDragOpts, IDrawOpts, INrrdStates, IImageMetadata, IViewState, IInteractionState, ISphereState, IInternalFlags, IPaintImage, IPaintImages, ISkipSlicesDictType, IMaskData, INewMaskData, ILayerRenderTarget, ICursorPage, IGuiParameterSettings, IKeyBoardSettings };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"coreType.js","sourceRoot":"","sources":["../../../../src/Utils/segmentation/coreTools/coreType.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"coreType.js","sourceRoot":"","sources":["../../../../src/Utils/segmentation/coreTools/coreType.ts"],"names":[],"mappings":"AA2aC,CAAC"}
|
|
@@ -33,7 +33,7 @@ function enableDownload(config) {
|
|
|
33
33
|
let downloadImage = document.createElement("a");
|
|
34
34
|
downloadImage.href = "";
|
|
35
35
|
downloadImage.target = "_blank";
|
|
36
|
-
downloadImage.download = `slice_${config.axis}_#${config.
|
|
36
|
+
downloadImage.download = `slice_${config.axis}_#${config.currentSliceIndex}`;
|
|
37
37
|
const downloadCtx = downloadCanvas.getContext("2d");
|
|
38
38
|
downloadCanvas.width = config.originWidth;
|
|
39
39
|
downloadCanvas.height = config.originHeight;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"divControlTools.js","sourceRoot":"","sources":["../../../../src/Utils/segmentation/coreTools/divControlTools.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,SAAS,wBAAwB;IAC/B,MAAM,cAAc,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACrD,cAAc,CAAC,SAAS,GAAG,sBAAsB,CAAC;IAClD,cAAc,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU,CAAC;IAC3C,cAAc,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC;IACpC,cAAc,CAAC,KAAK,CAAC,GAAG,GAAG,MAAM,CAAC;IAClC,cAAc,CAAC,KAAK,CAAC,IAAI,GAAG,OAAO,CAAC;IAEpC,OAAO,cAAc,CAAC;AACxB,CAAC;AAED;;;GAGG;AACH,SAAS,YAAY,CAAC,SAAyB;IAC7C,SAAS,CAAC,QAAQ,GAAG,EAAE,CAAC;IACxB,SAAS,CAAC,gBAAgB,CAAC,WAAW,EAAE,GAAG,EAAE;QAC3C,SAAS,CAAC,KAAK,EAAE,CAAC;IACpB,CAAC,CAAC,CAAC;IACH,SAAS,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AACnC,CAAC;AAED;;;GAGG;AACH,SAAS,cAAc,CAAC,MAA4B;IAClD,IAAI,cAAc,GAChB,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IACnC,IAAI,aAAa,GAA6B,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IAC1E,aAAa,CAAC,IAAI,GAAG,EAAE,CAAC;IACxB,aAAa,CAAC,MAAM,GAAG,QAAQ,CAAC;IAChC,aAAa,CAAC,QAAQ,GAAG,SAAS,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"divControlTools.js","sourceRoot":"","sources":["../../../../src/Utils/segmentation/coreTools/divControlTools.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,SAAS,wBAAwB;IAC/B,MAAM,cAAc,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACrD,cAAc,CAAC,SAAS,GAAG,sBAAsB,CAAC;IAClD,cAAc,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU,CAAC;IAC3C,cAAc,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC;IACpC,cAAc,CAAC,KAAK,CAAC,GAAG,GAAG,MAAM,CAAC;IAClC,cAAc,CAAC,KAAK,CAAC,IAAI,GAAG,OAAO,CAAC;IAEpC,OAAO,cAAc,CAAC;AACxB,CAAC;AAED;;;GAGG;AACH,SAAS,YAAY,CAAC,SAAyB;IAC7C,SAAS,CAAC,QAAQ,GAAG,EAAE,CAAC;IACxB,SAAS,CAAC,gBAAgB,CAAC,WAAW,EAAE,GAAG,EAAE;QAC3C,SAAS,CAAC,KAAK,EAAE,CAAC;IACpB,CAAC,CAAC,CAAC;IACH,SAAS,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AACnC,CAAC;AAED;;;GAGG;AACH,SAAS,cAAc,CAAC,MAA4B;IAClD,IAAI,cAAc,GAChB,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IACnC,IAAI,aAAa,GAA6B,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IAC1E,aAAa,CAAC,IAAI,GAAG,EAAE,CAAC;IACxB,aAAa,CAAC,MAAM,GAAG,QAAQ,CAAC;IAChC,aAAa,CAAC,QAAQ,GAAG,SAAS,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,iBAAiB,EAAE,CAAC;IAC7E,MAAM,WAAW,GAAG,cAAc,CAAC,UAAU,CAC3C,IAAI,CACuB,CAAC;IAC9B,cAAc,CAAC,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC;IAC1C,cAAc,CAAC,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC;IAE5C,WAAW,CAAC,SAAS,CACnB,MAAM,CAAC,aAAa,EACpB,CAAC,EACD,CAAC,EACD,MAAM,CAAC,WAAW,EAClB,MAAM,CAAC,YAAY,CACpB,CAAC;IACF,aAAa,CAAC,IAAI,GAAG,cAAc,CAAC,SAAS,EAAE,CAAC;IAChD,aAAa,CAAC,KAAK,EAAE,CAAC;IAEtB,qCAAqC;IACrC,cAAc,GAAG,IAAI,CAAC;IACtB,aAAa,GAAG,IAAI,CAAC;AACvB,CAAC;AAED,OAAO,EAAE,wBAAwB,EAAE,YAAY,EAAE,cAAc,EAAE,CAAC"}
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import { GUI } from "dat.gui";
|
|
2
|
-
import { IDrawingEvents,
|
|
2
|
+
import { IDrawingEvents, IProtected, IGuiParameterSettings } from "./coreType";
|
|
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;
|