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
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { IProtected, ICursorPage, IKeyBoardSettings, IAnnotationCallbacks } from "./core/types";
|
|
2
|
+
import { NrrdState } from "./coreTools/NrrdState";
|
|
3
|
+
import { GuiState } from "./coreTools/GuiState";
|
|
4
|
+
/**
|
|
5
|
+
* CanvasState — Pure state container.
|
|
6
|
+
*
|
|
7
|
+
* Holds all shared mutable state that was previously scattered across the
|
|
8
|
+
* CommToolsData base class. No rendering logic lives here; rendering is
|
|
9
|
+
* handled by {@link RenderingUtils}.
|
|
10
|
+
*
|
|
11
|
+
* Created once by NrrdTools and shared (by reference) with DrawToolCore,
|
|
12
|
+
* RenderingUtils, DragOperator, and all legacy Tool instances.
|
|
13
|
+
*/
|
|
14
|
+
export declare class CanvasState {
|
|
15
|
+
baseCanvasesSize: number;
|
|
16
|
+
/** External annotation callbacks — set via draw() options */
|
|
17
|
+
annotationCallbacks: IAnnotationCallbacks;
|
|
18
|
+
/** Whether the keyboard-config dialog is open (suppresses all shortcuts). */
|
|
19
|
+
configKeyBoard: boolean;
|
|
20
|
+
/** Active keyboard shortcut bindings. */
|
|
21
|
+
keyboardSettings: IKeyBoardSettings;
|
|
22
|
+
nrrd_states: NrrdState;
|
|
23
|
+
gui_states: GuiState;
|
|
24
|
+
protectedData: IProtected;
|
|
25
|
+
cursorPage: ICursorPage;
|
|
26
|
+
constructor(container: HTMLElement, mainAreaContainer: HTMLElement, options?: {
|
|
27
|
+
layers?: string[];
|
|
28
|
+
});
|
|
29
|
+
private generateSystemCanvases;
|
|
30
|
+
private generateLayerTargets;
|
|
31
|
+
}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import { NrrdState } from "./coreTools/NrrdState";
|
|
2
|
+
import { GuiState } from "./coreTools/GuiState";
|
|
3
|
+
import { MaskVolume } from "./core/index";
|
|
4
|
+
import { switchPencilIcon } from "../utils";
|
|
5
|
+
import { CHANNEL_HEX_COLORS } from "./core/types";
|
|
6
|
+
/**
|
|
7
|
+
* CanvasState — Pure state container.
|
|
8
|
+
*
|
|
9
|
+
* Holds all shared mutable state that was previously scattered across the
|
|
10
|
+
* CommToolsData base class. No rendering logic lives here; rendering is
|
|
11
|
+
* handled by {@link RenderingUtils}.
|
|
12
|
+
*
|
|
13
|
+
* Created once by NrrdTools and shared (by reference) with DrawToolCore,
|
|
14
|
+
* RenderingUtils, DragOperator, and all legacy Tool instances.
|
|
15
|
+
*/
|
|
16
|
+
export class CanvasState {
|
|
17
|
+
constructor(container, mainAreaContainer, options) {
|
|
18
|
+
var _a;
|
|
19
|
+
this.baseCanvasesSize = 1;
|
|
20
|
+
/** External annotation callbacks — set via draw() options */
|
|
21
|
+
this.annotationCallbacks = {
|
|
22
|
+
onMaskChanged: () => { },
|
|
23
|
+
onSphereChanged: () => { },
|
|
24
|
+
onCalculatorPositionsChanged: () => { },
|
|
25
|
+
onLayerVolumeCleared: () => { },
|
|
26
|
+
onChannelColorChanged: () => { },
|
|
27
|
+
};
|
|
28
|
+
/** Whether the keyboard-config dialog is open (suppresses all shortcuts). */
|
|
29
|
+
this.configKeyBoard = false;
|
|
30
|
+
/** Active keyboard shortcut bindings. */
|
|
31
|
+
this.keyboardSettings = {
|
|
32
|
+
draw: "Shift",
|
|
33
|
+
undo: "z",
|
|
34
|
+
redo: "y",
|
|
35
|
+
contrast: ["Control", "Meta"],
|
|
36
|
+
crosshair: "s",
|
|
37
|
+
sphere: "q",
|
|
38
|
+
mouseWheel: "Scroll:Zoom",
|
|
39
|
+
};
|
|
40
|
+
this.cursorPage = {
|
|
41
|
+
x: {
|
|
42
|
+
cursorPageX: 0,
|
|
43
|
+
cursorPageY: 0,
|
|
44
|
+
index: 0,
|
|
45
|
+
updated: false,
|
|
46
|
+
},
|
|
47
|
+
y: {
|
|
48
|
+
cursorPageX: 0,
|
|
49
|
+
cursorPageY: 0,
|
|
50
|
+
index: 0,
|
|
51
|
+
updated: false,
|
|
52
|
+
},
|
|
53
|
+
z: {
|
|
54
|
+
cursorPageX: 0,
|
|
55
|
+
cursorPageY: 0,
|
|
56
|
+
index: 0,
|
|
57
|
+
updated: false,
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
const layers = (_a = options === null || options === void 0 ? void 0 : options.layers) !== null && _a !== void 0 ? _a : ["layer1", "layer2", "layer3"];
|
|
61
|
+
if (layers.length > 10) {
|
|
62
|
+
console.warn(`CanvasState: ${layers.length} layers requested; recommended maximum is 10.`);
|
|
63
|
+
}
|
|
64
|
+
this.nrrd_states = new NrrdState(this.baseCanvasesSize);
|
|
65
|
+
this.gui_states = new GuiState({
|
|
66
|
+
defaultPaintCursor: switchPencilIcon("dot"),
|
|
67
|
+
defaultFillColor: CHANNEL_HEX_COLORS[1],
|
|
68
|
+
defaultBrushColor: CHANNEL_HEX_COLORS[1],
|
|
69
|
+
});
|
|
70
|
+
// Override the default states with the actual layer list
|
|
71
|
+
this.nrrd_states.image.layers = layers;
|
|
72
|
+
this.gui_states.layerChannel.layerVisibility = Object.fromEntries(layers.map((id) => [id, true]));
|
|
73
|
+
this.gui_states.layerChannel.channelVisibility = Object.fromEntries(layers.map((id) => [
|
|
74
|
+
id,
|
|
75
|
+
{ 1: true, 2: true, 3: true, 4: true, 5: true, 6: true, 7: true, 8: true },
|
|
76
|
+
]));
|
|
77
|
+
const systemCanvases = this.generateSystemCanvases();
|
|
78
|
+
const layerTargets = this.generateLayerTargets(layers);
|
|
79
|
+
// Get NRRD dimensions (will be set later when NRRD loads)
|
|
80
|
+
// Default to 1x1x1 for now, will be re-initialized in NrrdTools when dimensions are known
|
|
81
|
+
const dims = this.nrrd_states.image.dimensions;
|
|
82
|
+
const [width, height, depth] = dims.length === 3 ? dims : [1, 1, 1];
|
|
83
|
+
this.protectedData = {
|
|
84
|
+
container,
|
|
85
|
+
mainAreaContainer,
|
|
86
|
+
allSlicesArray: [],
|
|
87
|
+
displaySlices: [],
|
|
88
|
+
backUpDisplaySlices: [],
|
|
89
|
+
skipSlicesDic: {},
|
|
90
|
+
currentShowingSlice: undefined,
|
|
91
|
+
mainPreSlices: undefined,
|
|
92
|
+
isDrawing: false,
|
|
93
|
+
axis: "z",
|
|
94
|
+
maskData: {
|
|
95
|
+
// Volumetric storage (Phase 3 — only storage mechanism)
|
|
96
|
+
volumes: layers.reduce((acc, id) => {
|
|
97
|
+
acc[id] = new MaskVolume(width, height, depth, 1);
|
|
98
|
+
return acc;
|
|
99
|
+
}, {}),
|
|
100
|
+
},
|
|
101
|
+
layerTargets,
|
|
102
|
+
canvases: {
|
|
103
|
+
/**
|
|
104
|
+
* Caches raw image data from the current slice.
|
|
105
|
+
* Used as a source for zoom/pan operations to avoid repeated decoding.
|
|
106
|
+
* Initialized as null, set in NrrdTools.ts.
|
|
107
|
+
*/
|
|
108
|
+
originCanvas: null,
|
|
109
|
+
/**
|
|
110
|
+
* Top-most interaction layer.
|
|
111
|
+
* Captures mouse/pen events and displays real-time drawing strokes
|
|
112
|
+
* before they are committed to a specific layer.
|
|
113
|
+
*/
|
|
114
|
+
drawingCanvas: systemCanvases.drawingCanvas,
|
|
115
|
+
/**
|
|
116
|
+
* Background layer displaying the actual medical image slice (CT/MRI).
|
|
117
|
+
* This is the "base" image the user sees.
|
|
118
|
+
*/
|
|
119
|
+
displayCanvas: systemCanvases.displayCanvas,
|
|
120
|
+
/**
|
|
121
|
+
* Composite display layer.
|
|
122
|
+
* Merges all segmentation layers for unified visualization
|
|
123
|
+
* on top of the medical image.
|
|
124
|
+
*/
|
|
125
|
+
drawingCanvasLayerMaster: systemCanvases.drawingCanvasLayerMaster,
|
|
126
|
+
/**
|
|
127
|
+
* Dedicated layer for 3D Sphere tool visualization.
|
|
128
|
+
* Kept separate to allow independent rendering of sphere UI elements.
|
|
129
|
+
*/
|
|
130
|
+
drawingSphereCanvas: systemCanvases.drawingSphereCanvas,
|
|
131
|
+
/**
|
|
132
|
+
* Off-screen scratchpad canvas.
|
|
133
|
+
* Used for internal image processing, scaling, and format conversion.
|
|
134
|
+
*/
|
|
135
|
+
emptyCanvas: systemCanvases.emptyCanvas,
|
|
136
|
+
},
|
|
137
|
+
ctxes: {
|
|
138
|
+
drawingCtx: systemCanvases.drawingCanvas.getContext("2d"),
|
|
139
|
+
displayCtx: systemCanvases.displayCanvas.getContext("2d"),
|
|
140
|
+
drawingLayerMasterCtx: systemCanvases.drawingCanvasLayerMaster.getContext("2d"),
|
|
141
|
+
drawingSphereCtx: systemCanvases.drawingSphereCanvas.getContext("2d"),
|
|
142
|
+
emptyCtx: systemCanvases.emptyCanvas.getContext("2d", {
|
|
143
|
+
willReadFrequently: true,
|
|
144
|
+
}),
|
|
145
|
+
},
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
generateSystemCanvases() {
|
|
149
|
+
return {
|
|
150
|
+
drawingCanvas: document.createElement("canvas"),
|
|
151
|
+
displayCanvas: document.createElement("canvas"),
|
|
152
|
+
drawingCanvasLayerMaster: document.createElement("canvas"),
|
|
153
|
+
drawingSphereCanvas: document.createElement("canvas"),
|
|
154
|
+
emptyCanvas: document.createElement("canvas"),
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
generateLayerTargets(layerIds) {
|
|
158
|
+
const map = new Map();
|
|
159
|
+
for (const id of layerIds) {
|
|
160
|
+
const canvas = document.createElement("canvas");
|
|
161
|
+
const ctx = canvas.getContext("2d");
|
|
162
|
+
map.set(id, { canvas, ctx });
|
|
163
|
+
}
|
|
164
|
+
return map;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=CanvasState.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CanvasState.js","sourceRoot":"","sources":["../../../src/Utils/segmentation/CanvasState.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import { IDragOpts, IDrawingEvents, IProtected
|
|
1
|
+
import { IDragOpts, IDrawingEvents, IProtected } from "./core/types";
|
|
2
|
+
import { NrrdState } from "./coreTools/NrrdState";
|
|
3
|
+
import { GuiState } from "./coreTools/GuiState";
|
|
2
4
|
import type { EventRouter } from "./eventRouter";
|
|
3
5
|
export declare class DragOperator {
|
|
4
6
|
container: HTMLElement;
|
|
@@ -16,10 +18,16 @@ export declare class DragOperator {
|
|
|
16
18
|
private setEmptyCanvasSize;
|
|
17
19
|
private getOrCreateSliceBuffer;
|
|
18
20
|
private renderSliceToCanvas;
|
|
21
|
+
private refreshSphereOverlayCb;
|
|
19
22
|
private eventRouter;
|
|
20
|
-
constructor(container: HTMLElement, nrrd_sates:
|
|
23
|
+
constructor(container: HTMLElement, nrrd_sates: NrrdState, gui_states: GuiState, protectedData: IProtected, drawingPrameters: IDrawingEvents, setSyncsliceNum: () => void, setIsDrawFalse: (target: number) => void, flipDisplayImageByAxis: () => void, setEmptyCanvasSize: (axis?: "x" | "y" | "z") => void, getOrCreateSliceBuffer: (axis: "x" | "y" | "z") => ImageData | null, renderSliceToCanvas: (layer: string, axis: "x" | "y" | "z", sliceIndex: number, buffer: ImageData, targetCtx: CanvasRenderingContext2D, scaledWidth: number, scaledHeight: number) => void);
|
|
21
24
|
private init;
|
|
22
25
|
setShowDragNumberDiv(sliceIndexContainer: HTMLDivElement): void;
|
|
26
|
+
/**
|
|
27
|
+
* Set the sphere overlay refresh callback.
|
|
28
|
+
* Called by NrrdTools after DrawToolCore is initialized.
|
|
29
|
+
*/
|
|
30
|
+
setRefreshSphereOverlay(cb: () => void): void;
|
|
23
31
|
/**
|
|
24
32
|
* Set the EventRouter reference for centralized event handling.
|
|
25
33
|
* Called by NrrdTools/DrawToolCore after EventRouter is initialized.
|
|
@@ -13,6 +13,7 @@ export class DragOperator {
|
|
|
13
13
|
handleOnDragMouseMove: (ev) => { },
|
|
14
14
|
};
|
|
15
15
|
this.sensitiveArray = [];
|
|
16
|
+
this.refreshSphereOverlayCb = null;
|
|
16
17
|
// EventRouter for centralized event handling
|
|
17
18
|
this.eventRouter = null;
|
|
18
19
|
this.configDragMode = () => {
|
|
@@ -41,7 +42,7 @@ export class DragOperator {
|
|
|
41
42
|
this.init();
|
|
42
43
|
}
|
|
43
44
|
init() {
|
|
44
|
-
for (let i = 0; i < this.gui_states.max_sensitive; i++) {
|
|
45
|
+
for (let i = 0; i < this.gui_states.viewConfig.max_sensitive; i++) {
|
|
45
46
|
this.sensitiveArray.push((i + 1) / 20);
|
|
46
47
|
}
|
|
47
48
|
const dragEffectCanvases = {
|
|
@@ -62,12 +63,20 @@ export class DragOperator {
|
|
|
62
63
|
setEmptyCanvasSize: (axis) => this.setEmptyCanvasSize(axis),
|
|
63
64
|
getOrCreateSliceBuffer: (axis) => this.getOrCreateSliceBuffer(axis),
|
|
64
65
|
renderSliceToCanvas: (layer, axis, sliceIndex, buffer, targetCtx, w, h) => this.renderSliceToCanvas(layer, axis, sliceIndex, buffer, targetCtx, w, h),
|
|
66
|
+
refreshSphereOverlay: () => { var _a; return (_a = this.refreshSphereOverlayCb) === null || _a === void 0 ? void 0 : _a.call(this); },
|
|
65
67
|
}, this.showDragNumberDiv, dragEffectCanvases);
|
|
66
68
|
}
|
|
67
69
|
setShowDragNumberDiv(sliceIndexContainer) {
|
|
68
70
|
this.showDragNumberDiv = sliceIndexContainer;
|
|
69
71
|
this.dragSliceTool.setShowDragNumberDiv(sliceIndexContainer);
|
|
70
72
|
}
|
|
73
|
+
/**
|
|
74
|
+
* Set the sphere overlay refresh callback.
|
|
75
|
+
* Called by NrrdTools after DrawToolCore is initialized.
|
|
76
|
+
*/
|
|
77
|
+
setRefreshSphereOverlay(cb) {
|
|
78
|
+
this.refreshSphereOverlayCb = cb;
|
|
79
|
+
}
|
|
71
80
|
/**
|
|
72
81
|
* Set the EventRouter reference for centralized event handling.
|
|
73
82
|
* Called by NrrdTools/DrawToolCore after EventRouter is initialized.
|
|
@@ -84,8 +93,9 @@ export class DragOperator {
|
|
|
84
93
|
this.removeDragMode();
|
|
85
94
|
}
|
|
86
95
|
// When leaving draw, contrast, or crosshair mode (returning to idle), restore drag mode
|
|
96
|
+
// Do NOT restore if sphere mode is active
|
|
87
97
|
if ((prev === 'draw' || prev === 'contrast' || prev === 'crosshair') && next === 'idle') {
|
|
88
|
-
if (!this.gui_states.sphere) {
|
|
98
|
+
if (!this.gui_states.mode.sphere) {
|
|
89
99
|
this.configDragMode();
|
|
90
100
|
}
|
|
91
101
|
}
|
|
@@ -98,13 +108,12 @@ export class DragOperator {
|
|
|
98
108
|
this.container.appendChild(this.showDragNumberDiv);
|
|
99
109
|
}
|
|
100
110
|
this.dragPrameters.handleOnDragMouseDown = (ev) => {
|
|
101
|
-
//
|
|
102
|
-
this.protectedData.canvases.drawingCanvas.removeEventListener("wheel", this.drawingPrameters.handleMouseZoomSliceWheel);
|
|
111
|
+
// Wheel is now managed by EventRouter's wheel dispatcher (no manual remove needed)
|
|
103
112
|
if (ev.button === 0) {
|
|
104
113
|
this.dragPrameters.y = ev.offsetY / this.dragPrameters.h;
|
|
105
114
|
this.container.addEventListener("pointermove", this.dragPrameters.handleOnDragMouseMove, false);
|
|
106
115
|
this.dragPrameters.sensivity =
|
|
107
|
-
this.sensitiveArray[this.gui_states.dragSensitivity - 1];
|
|
116
|
+
this.sensitiveArray[this.gui_states.viewConfig.dragSensitivity - 1];
|
|
108
117
|
}
|
|
109
118
|
};
|
|
110
119
|
this.dragPrameters.handleOnDragMouseMove = throttle((ev) => {
|
|
@@ -118,12 +127,11 @@ export class DragOperator {
|
|
|
118
127
|
}
|
|
119
128
|
this.updateIndex(this.dragPrameters.move);
|
|
120
129
|
(opts === null || opts === void 0 ? void 0 : opts.getSliceNum) &&
|
|
121
|
-
opts.getSliceNum(this.nrrd_states.
|
|
130
|
+
opts.getSliceNum(this.nrrd_states.view.currentSliceIndex, this.nrrd_states.view.contrastNum);
|
|
122
131
|
this.dragPrameters.y = ev.offsetY / this.dragPrameters.h;
|
|
123
132
|
}, this.dragPrameters.sensivity * 200);
|
|
124
133
|
this.dragPrameters.handleOnDragMouseUp = (ev) => {
|
|
125
|
-
//
|
|
126
|
-
this.protectedData.canvases.drawingCanvas.addEventListener("wheel", this.drawingPrameters.handleMouseZoomSliceWheel);
|
|
134
|
+
// Wheel is now managed by EventRouter's wheel dispatcher (no manual add needed)
|
|
127
135
|
this.setSyncsliceNum();
|
|
128
136
|
this.container.removeEventListener("pointermove", this.dragPrameters.handleOnDragMouseMove, false);
|
|
129
137
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DragOperator.js","sourceRoot":"","sources":["../../../src/Utils/segmentation/DragOperator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AASpC,OAAO,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AAEvE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAGtD,MAAM,OAAO,YAAY;
|
|
1
|
+
{"version":3,"file":"DragOperator.js","sourceRoot":"","sources":["../../../src/Utils/segmentation/DragOperator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,51 +1,66 @@
|
|
|
1
|
-
import { IConvertObjType, IDrawingEvents, IContrastEvents, IDrawOpts } from "./
|
|
2
|
-
import {
|
|
1
|
+
import { IConvertObjType, IDrawingEvents, IContrastEvents, IDrawOpts } from "./core/types";
|
|
2
|
+
import { CanvasState } from "./CanvasState";
|
|
3
|
+
import { RenderingUtils } from "./RenderingUtils";
|
|
3
4
|
import { EventRouter } from "./eventRouter";
|
|
4
5
|
import { SphereTool } from "./tools/SphereTool";
|
|
5
6
|
import { CrosshairTool } from "./tools/CrosshairTool";
|
|
6
7
|
import { ContrastTool } from "./tools/ContrastTool";
|
|
7
8
|
import { ZoomTool } from "./tools/ZoomTool";
|
|
8
9
|
import { EraserTool } from "./tools/EraserTool";
|
|
10
|
+
import { PanTool } from "./tools/PanTool";
|
|
11
|
+
import { DrawingTool } from "./tools/DrawingTool";
|
|
9
12
|
import { ImageStoreHelper } from "./tools/ImageStoreHelper";
|
|
10
13
|
import { UndoManager } from "./core";
|
|
11
|
-
|
|
14
|
+
/**
|
|
15
|
+
* DrawToolCore — Tool orchestration and event routing.
|
|
16
|
+
*
|
|
17
|
+
* Previously extended CommToolsData; now uses composition:
|
|
18
|
+
* - `state: CanvasState` — pure state container
|
|
19
|
+
* - `renderer: RenderingUtils` — rendering / slice-buffer helpers
|
|
20
|
+
*
|
|
21
|
+
* Created by NrrdTools which passes in a shared CanvasState.
|
|
22
|
+
*/
|
|
23
|
+
export declare class DrawToolCore {
|
|
12
24
|
container: HTMLElement;
|
|
13
25
|
mainAreaContainer: HTMLDivElement;
|
|
26
|
+
/** Shared state container (created by NrrdTools, passed in). */
|
|
27
|
+
readonly state: CanvasState;
|
|
28
|
+
/** Rendering utilities (created here, uses shared state). */
|
|
29
|
+
readonly renderer: RenderingUtils;
|
|
14
30
|
drawingPrameters: IDrawingEvents;
|
|
15
31
|
contrastEventPrameters: IContrastEvents;
|
|
16
32
|
eraserUrls: string[];
|
|
17
33
|
pencilUrls: string[];
|
|
18
34
|
undoManager: UndoManager;
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
private preDrawSliceIndex;
|
|
23
|
-
protected eventRouter: EventRouter | null;
|
|
24
|
-
protected sphereTool: SphereTool;
|
|
25
|
-
protected crosshairTool: CrosshairTool;
|
|
35
|
+
eventRouter: EventRouter;
|
|
36
|
+
sphereTool: SphereTool;
|
|
37
|
+
crosshairTool: CrosshairTool;
|
|
26
38
|
protected contrastTool: ContrastTool;
|
|
27
39
|
protected zoomTool: ZoomTool;
|
|
28
40
|
protected eraserTool: EraserTool;
|
|
41
|
+
protected panTool: PanTool;
|
|
42
|
+
protected drawingTool: DrawingTool;
|
|
29
43
|
protected imageStoreHelper: ImageStoreHelper;
|
|
44
|
+
/** Slice index recorded when paintOnCanvas() starts, guards stale-click */
|
|
45
|
+
private paintSliceIndex;
|
|
46
|
+
/** Wheel event dispatch mode — replaces manual wheel add/remove (Phase 2) */
|
|
47
|
+
private activeWheelMode;
|
|
30
48
|
start: () => void;
|
|
31
|
-
constructor(container: HTMLElement,
|
|
32
|
-
layers?: string[];
|
|
33
|
-
});
|
|
49
|
+
constructor(container: HTMLElement, state: CanvasState);
|
|
34
50
|
private initTools;
|
|
35
51
|
private initDrawToolCore;
|
|
36
52
|
setEraserUrls(urls: string[]): void;
|
|
37
53
|
setPencilIconUrls(urls: string[]): void;
|
|
38
54
|
private setCurrentLayer;
|
|
39
55
|
draw(opts?: IDrawOpts): void;
|
|
40
|
-
drawCalSphereDown(x: number, y: number, sliceIndex: number, cal_position: "tumour" | "skin" | "nipple" | "ribcage"): void;
|
|
41
|
-
drawCalSphereUp(): void;
|
|
42
56
|
private zoomActionAfterDrawSphere;
|
|
43
|
-
private clearSpherePrintStoreImages;
|
|
44
57
|
private paintOnCanvas;
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
private
|
|
58
|
+
/**
|
|
59
|
+
* Extracted from paintOnCanvas() pointerleave handler.
|
|
60
|
+
*/
|
|
61
|
+
private handlePointerLeave;
|
|
62
|
+
/** Extracted from paintOnCanvas() — handles sphere placement on left-click */
|
|
63
|
+
private handleSphereClick;
|
|
49
64
|
private initAllCanvas;
|
|
50
65
|
private useEraser;
|
|
51
66
|
configMouseZoomWheel(): (e: WheelEvent) => void;
|
|
@@ -54,10 +69,13 @@ export declare class DrawToolCore extends CommToolsData {
|
|
|
54
69
|
drawImageOnEmptyImage(canvas: HTMLCanvasElement): void;
|
|
55
70
|
/****************************Sphere functions (delegated to SphereTool)****************************************************/
|
|
56
71
|
drawCalculatorSphereOnEachViews(axis: "x" | "y" | "z"): void;
|
|
57
|
-
private drawSphereOnEachViews;
|
|
58
72
|
private configMouseSphereWheel;
|
|
59
73
|
drawCalculatorSphere(radius: number): void;
|
|
60
74
|
drawSphere(mouseX: number, mouseY: number, radius: number): void;
|
|
75
|
+
/**
|
|
76
|
+
* Refresh sphere canvas from sphereMaskVolume for the current slice/axis.
|
|
77
|
+
*/
|
|
78
|
+
refreshSphereOverlay(): void;
|
|
61
79
|
/**
|
|
62
80
|
* Convert cursor point between axis views.
|
|
63
81
|
* Delegated to CrosshairTool.
|
|
@@ -68,38 +86,49 @@ export declare class DrawToolCore extends CommToolsData {
|
|
|
68
86
|
getRestLayer(): string[];
|
|
69
87
|
/**************************** Undo/Redo functions (Phase 6 — Delta-based) ****************************/
|
|
70
88
|
/**
|
|
71
|
-
* Clear mask on current slice canvas.
|
|
72
|
-
*
|
|
73
|
-
* Only clears the active layer's MaskVolume slice data.
|
|
74
|
-
* Other layers are left untouched. After clearing, all layer canvases
|
|
75
|
-
* are re-rendered from MaskVolume to keep visuals in sync.
|
|
89
|
+
* Clear the mask on the current slice canvas for the active layer ONLY.
|
|
76
90
|
*/
|
|
77
|
-
|
|
91
|
+
clearActiveSlice(): void;
|
|
78
92
|
/**
|
|
79
93
|
* Undo the last drawing operation on the active layer.
|
|
80
|
-
* Restores the MaskVolume slice to its pre-draw state, re-renders
|
|
81
|
-
* the canvas, and notifies the backend.
|
|
82
94
|
*/
|
|
83
95
|
undoLastPainting(): void;
|
|
84
96
|
/**
|
|
85
97
|
* Redo the last undone operation on the active layer.
|
|
86
|
-
* Reapplies the MaskVolume slice to its post-draw state, re-renders
|
|
87
|
-
* the canvas, and notifies the backend.
|
|
88
98
|
*/
|
|
89
99
|
redoLastPainting(): void;
|
|
90
100
|
/**
|
|
91
101
|
* Re-render a layer canvas from MaskVolume and composite to master.
|
|
92
|
-
* Called after writing oldSlice/newSlice back to the volume during undo/redo.
|
|
93
102
|
*/
|
|
94
103
|
private applyUndoRedoToCanvas;
|
|
95
104
|
/****************************Store images (delegated to ImageStoreHelper)****************************************************/
|
|
96
|
-
|
|
97
|
-
storeImageToLayer(index: number, canvas: HTMLCanvasElement): ImageData;
|
|
98
|
-
storeEachLayerImage(index: number, layer: string): void;
|
|
105
|
+
syncLayerSliceData(index: number, layer: string): void;
|
|
99
106
|
/******************************** Utils gui related functions (delegated to ContrastTool) ***************************************/
|
|
100
107
|
setupConrastEvents(callback: (step: number, towards: "horizental" | "vertical") => void): void;
|
|
101
108
|
configContrastDragMode: () => void;
|
|
102
109
|
removeContrastDragMode: () => void;
|
|
103
110
|
updateSlicesContrast: (value: number, flag: string) => void;
|
|
104
111
|
repraintCurrentContrastSlice: () => void;
|
|
112
|
+
/** Override in NrrdTools */
|
|
113
|
+
setIsDrawFalse(target: number): void;
|
|
114
|
+
/** Override in NrrdTools */
|
|
115
|
+
setSyncsliceNum(): void;
|
|
116
|
+
/** Override in NrrdTools */
|
|
117
|
+
resetPaintAreaUIPosition(l?: number, t?: number): void;
|
|
118
|
+
/** Override in NrrdTools */
|
|
119
|
+
resizePaintArea(factor: number): void;
|
|
120
|
+
/** Override in NrrdTools */
|
|
121
|
+
setEmptyCanvasSize(axis?: "x" | "y" | "z"): void;
|
|
122
|
+
/** Override in NrrdTools */
|
|
123
|
+
flipDisplayImageByAxis(): void;
|
|
124
|
+
/** Override in NrrdTools */
|
|
125
|
+
updateOriginAndChangedWH(): void;
|
|
126
|
+
/** Override in NrrdTools */
|
|
127
|
+
resetLayerCanvas(): void;
|
|
128
|
+
/** Override in NrrdTools */
|
|
129
|
+
redrawDisplayCanvas(): void;
|
|
130
|
+
/** Override in NrrdTools */
|
|
131
|
+
enterSphereMode(): void;
|
|
132
|
+
/** Override in NrrdTools */
|
|
133
|
+
exitSphereMode(): void;
|
|
105
134
|
}
|