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
|
@@ -10,7 +10,7 @@ import { BaseTool } from "./BaseTool";
|
|
|
10
10
|
export class CrosshairTool extends BaseTool {
|
|
11
11
|
// ===== Crosshair Enable =====
|
|
12
12
|
enableCrosshair() {
|
|
13
|
-
this.ctx.nrrd_states.isCursorSelect = true;
|
|
13
|
+
this.ctx.nrrd_states.interaction.isCursorSelect = true;
|
|
14
14
|
switch (this.ctx.protectedData.axis) {
|
|
15
15
|
case "x":
|
|
16
16
|
this.ctx.cursorPage.x.updated = true;
|
|
@@ -46,12 +46,12 @@ export class CrosshairTool extends BaseTool {
|
|
|
46
46
|
* @param currentSliceIndex Current slice depth (mm distance)
|
|
47
47
|
*/
|
|
48
48
|
convertCursorPoint(from, to, cursorNumX, cursorNumY, currentSliceIndex) {
|
|
49
|
-
const
|
|
50
|
-
const dimensions =
|
|
51
|
-
const ratios =
|
|
52
|
-
const { nrrd_x_mm, nrrd_y_mm, nrrd_z_mm } =
|
|
53
|
-
let
|
|
54
|
-
let
|
|
49
|
+
const image = this.ctx.nrrd_states.image;
|
|
50
|
+
const dimensions = image.dimensions;
|
|
51
|
+
const ratios = image.ratios;
|
|
52
|
+
const { nrrd_x_mm, nrrd_y_mm, nrrd_z_mm } = image;
|
|
53
|
+
let currentNewSliceIndex = 0;
|
|
54
|
+
let preSliceIndex = 0;
|
|
55
55
|
let convertCursorNumX = 0;
|
|
56
56
|
let convertCursorNumY = 0;
|
|
57
57
|
const convertIndex = {
|
|
@@ -86,45 +86,45 @@ export class CrosshairTool extends BaseTool {
|
|
|
86
86
|
return;
|
|
87
87
|
}
|
|
88
88
|
if (from === "z" && to === "x") {
|
|
89
|
-
|
|
90
|
-
|
|
89
|
+
currentNewSliceIndex = convertIndex[from][to](cursorNumX);
|
|
90
|
+
preSliceIndex = currentNewSliceIndex * ratios[to];
|
|
91
91
|
convertCursorNumX = convertCursor[from][to](currentSliceIndex);
|
|
92
92
|
convertCursorNumY = cursorNumY;
|
|
93
93
|
}
|
|
94
94
|
else if (from === "y" && to === "x") {
|
|
95
|
-
|
|
96
|
-
|
|
95
|
+
currentNewSliceIndex = convertIndex[from][to](cursorNumX);
|
|
96
|
+
preSliceIndex = currentNewSliceIndex * ratios.x;
|
|
97
97
|
convertCursorNumY = convertCursor[from][to](currentSliceIndex);
|
|
98
98
|
convertCursorNumX = dimensions[2] * ratios.z - cursorNumY;
|
|
99
99
|
}
|
|
100
100
|
else if (from === "z" && to === "y") {
|
|
101
|
-
|
|
102
|
-
|
|
101
|
+
currentNewSliceIndex = convertIndex[from][to](cursorNumY);
|
|
102
|
+
preSliceIndex = currentNewSliceIndex * ratios[to];
|
|
103
103
|
convertCursorNumY = convertCursor[from][to](currentSliceIndex);
|
|
104
104
|
convertCursorNumX = cursorNumX;
|
|
105
105
|
}
|
|
106
106
|
else if (from === "x" && to === "y") {
|
|
107
|
-
|
|
108
|
-
|
|
107
|
+
currentNewSliceIndex = convertIndex[from][to](cursorNumY);
|
|
108
|
+
preSliceIndex = currentNewSliceIndex * ratios[to];
|
|
109
109
|
convertCursorNumX = convertCursor[from][to](currentSliceIndex);
|
|
110
110
|
convertCursorNumY = dimensions[2] * ratios.z - cursorNumX;
|
|
111
111
|
}
|
|
112
112
|
else if (from === "x" && to === "z") {
|
|
113
|
-
|
|
114
|
-
|
|
113
|
+
currentNewSliceIndex = convertIndex[from][to](cursorNumX);
|
|
114
|
+
preSliceIndex = currentNewSliceIndex * ratios[to];
|
|
115
115
|
convertCursorNumX = convertCursor[from][to](currentSliceIndex);
|
|
116
116
|
convertCursorNumY = cursorNumY;
|
|
117
117
|
}
|
|
118
118
|
else if (from === "y" && to === "z") {
|
|
119
|
-
|
|
120
|
-
|
|
119
|
+
currentNewSliceIndex = convertIndex[from][to](cursorNumY);
|
|
120
|
+
preSliceIndex = currentNewSliceIndex * ratios.z;
|
|
121
121
|
convertCursorNumY = convertCursor[from][to](currentSliceIndex);
|
|
122
122
|
convertCursorNumX = cursorNumX;
|
|
123
123
|
}
|
|
124
124
|
else {
|
|
125
125
|
return;
|
|
126
126
|
}
|
|
127
|
-
return {
|
|
127
|
+
return { currentNewSliceIndex, preSliceIndex, convertCursorNumX, convertCursorNumY };
|
|
128
128
|
}
|
|
129
129
|
// ===== Sphere Origins Setup =====
|
|
130
130
|
setUpSphereOrigins(mouseX, mouseY, sliceIndex) {
|
|
@@ -133,7 +133,7 @@ export class CrosshairTool extends BaseTool {
|
|
|
133
133
|
return {
|
|
134
134
|
convertCursorNumX: convertObj === null || convertObj === void 0 ? void 0 : convertObj.convertCursorNumX,
|
|
135
135
|
convertCursorNumY: convertObj === null || convertObj === void 0 ? void 0 : convertObj.convertCursorNumY,
|
|
136
|
-
|
|
136
|
+
currentNewSliceIndex: convertObj === null || convertObj === void 0 ? void 0 : convertObj.currentNewSliceIndex,
|
|
137
137
|
};
|
|
138
138
|
};
|
|
139
139
|
const axisConversions = {
|
|
@@ -142,15 +142,15 @@ export class CrosshairTool extends BaseTool {
|
|
|
142
142
|
z: { axisTo1: "x", axisTo2: "y" },
|
|
143
143
|
};
|
|
144
144
|
const { axisTo1, axisTo2 } = axisConversions[this.ctx.protectedData.axis];
|
|
145
|
-
this.ctx.nrrd_states.sphereOrigin[axisTo1] = [
|
|
145
|
+
this.ctx.nrrd_states.sphere.sphereOrigin[axisTo1] = [
|
|
146
146
|
convertCursor(this.ctx.protectedData.axis, axisTo1).convertCursorNumX,
|
|
147
147
|
convertCursor(this.ctx.protectedData.axis, axisTo1).convertCursorNumY,
|
|
148
|
-
convertCursor(this.ctx.protectedData.axis, axisTo1).
|
|
148
|
+
convertCursor(this.ctx.protectedData.axis, axisTo1).currentNewSliceIndex,
|
|
149
149
|
];
|
|
150
|
-
this.ctx.nrrd_states.sphereOrigin[axisTo2] = [
|
|
150
|
+
this.ctx.nrrd_states.sphere.sphereOrigin[axisTo2] = [
|
|
151
151
|
convertCursor(this.ctx.protectedData.axis, axisTo2).convertCursorNumX,
|
|
152
152
|
convertCursor(this.ctx.protectedData.axis, axisTo2).convertCursorNumY,
|
|
153
|
-
convertCursor(this.ctx.protectedData.axis, axisTo2).
|
|
153
|
+
convertCursor(this.ctx.protectedData.axis, axisTo2).currentNewSliceIndex,
|
|
154
154
|
];
|
|
155
155
|
}
|
|
156
156
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CrosshairTool.js","sourceRoot":"","sources":["../../../../src/Utils/segmentation/tools/CrosshairTool.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAGtC,MAAM,OAAO,aAAc,SAAQ,QAAQ;IAEzC,+BAA+B;IAE/B,eAAe;QACb,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,cAAc,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"CrosshairTool.js","sourceRoot":"","sources":["../../../../src/Utils/segmentation/tools/CrosshairTool.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,6 +18,8 @@ export interface DragSliceCallbacks {
|
|
|
18
18
|
setEmptyCanvasSize: (axis?: "x" | "y" | "z") => void;
|
|
19
19
|
getOrCreateSliceBuffer: (axis: "x" | "y" | "z") => ImageData | null;
|
|
20
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;
|
|
21
23
|
}
|
|
22
24
|
interface IDragEffectCanvases {
|
|
23
25
|
drawingCanvasLayerMaster: HTMLCanvasElement;
|
|
@@ -23,16 +23,17 @@ export class DragSliceTool extends BaseTool {
|
|
|
23
23
|
updateIndex(move) {
|
|
24
24
|
let sliceModifyNum = 0;
|
|
25
25
|
let contrastModifyNum = 0;
|
|
26
|
-
const
|
|
27
|
-
|
|
26
|
+
const view = this.ctx.nrrd_states.view;
|
|
27
|
+
const image = this.ctx.nrrd_states.image;
|
|
28
|
+
if (view.showContrast) {
|
|
28
29
|
contrastModifyNum = move % this.ctx.protectedData.displaySlices.length;
|
|
29
|
-
|
|
30
|
+
view.contrastNum += contrastModifyNum;
|
|
30
31
|
if (move > 0) {
|
|
31
|
-
if (
|
|
32
|
+
if (view.currentSliceIndex <= view.maxIndex) {
|
|
32
33
|
sliceModifyNum = Math.floor(move / this.ctx.protectedData.displaySlices.length);
|
|
33
|
-
if (
|
|
34
|
+
if (view.contrastNum > this.ctx.protectedData.displaySlices.length - 1) {
|
|
34
35
|
sliceModifyNum += 1;
|
|
35
|
-
|
|
36
|
+
view.contrastNum -= this.ctx.protectedData.displaySlices.length;
|
|
36
37
|
}
|
|
37
38
|
}
|
|
38
39
|
else {
|
|
@@ -41,8 +42,8 @@ export class DragSliceTool extends BaseTool {
|
|
|
41
42
|
}
|
|
42
43
|
else {
|
|
43
44
|
sliceModifyNum = Math.ceil(move / this.ctx.protectedData.displaySlices.length);
|
|
44
|
-
if (
|
|
45
|
-
|
|
45
|
+
if (view.contrastNum < 0) {
|
|
46
|
+
view.contrastNum += this.ctx.protectedData.displaySlices.length;
|
|
46
47
|
sliceModifyNum -= 1;
|
|
47
48
|
}
|
|
48
49
|
}
|
|
@@ -50,65 +51,74 @@ export class DragSliceTool extends BaseTool {
|
|
|
50
51
|
else {
|
|
51
52
|
sliceModifyNum = move;
|
|
52
53
|
}
|
|
53
|
-
let newIndex =
|
|
54
|
-
if (newIndex !=
|
|
55
|
-
if (newIndex >
|
|
56
|
-
newIndex =
|
|
57
|
-
|
|
54
|
+
let newIndex = view.currentSliceIndex + sliceModifyNum;
|
|
55
|
+
if (newIndex != view.currentSliceIndex || view.showContrast) {
|
|
56
|
+
if (newIndex > view.maxIndex) {
|
|
57
|
+
newIndex = view.maxIndex;
|
|
58
|
+
view.contrastNum = this.ctx.protectedData.displaySlices.length - 1;
|
|
58
59
|
}
|
|
59
|
-
else if (newIndex <
|
|
60
|
-
newIndex =
|
|
61
|
-
|
|
60
|
+
else if (newIndex < view.minIndex) {
|
|
61
|
+
newIndex = view.minIndex;
|
|
62
|
+
view.contrastNum = 0;
|
|
62
63
|
}
|
|
63
64
|
else {
|
|
64
|
-
this.ctx.protectedData.mainPreSlices.index = newIndex *
|
|
65
|
+
this.ctx.protectedData.mainPreSlices.index = newIndex * image.RSARatio;
|
|
65
66
|
this.callbacks.setSyncsliceNum();
|
|
66
67
|
let isSameIndex = true;
|
|
67
|
-
if (newIndex !=
|
|
68
|
-
|
|
68
|
+
if (newIndex != view.currentSliceIndex) {
|
|
69
|
+
view.switchSliceFlag = true;
|
|
69
70
|
isSameIndex = false;
|
|
70
71
|
}
|
|
71
72
|
this.cleanCanvases(isSameIndex);
|
|
72
|
-
if (
|
|
73
|
-
|
|
74
|
-
|
|
73
|
+
if (view.changedWidth === 0) {
|
|
74
|
+
view.changedWidth = image.originWidth;
|
|
75
|
+
view.changedHeight = image.originHeight;
|
|
75
76
|
}
|
|
76
77
|
const needToUpdateSlice = this.updateCurrentContrastSlice();
|
|
77
78
|
needToUpdateSlice.repaint.call(needToUpdateSlice);
|
|
78
|
-
|
|
79
|
+
view.currentSliceIndex = newIndex;
|
|
79
80
|
this.drawDragSlice(needToUpdateSlice.canvas);
|
|
80
81
|
}
|
|
81
|
-
|
|
82
|
-
this.updateShowNumDiv(
|
|
82
|
+
view.preSliceIndex = newIndex * image.RSARatio;
|
|
83
|
+
this.updateShowNumDiv(view.contrastNum);
|
|
83
84
|
}
|
|
84
85
|
}
|
|
85
86
|
// ===== Draw Drag Slice =====
|
|
86
87
|
drawDragSlice(canvas) {
|
|
87
|
-
|
|
88
|
+
var _a, _b;
|
|
89
|
+
const view = this.ctx.nrrd_states.view;
|
|
88
90
|
// Draw base image (CT/MRI scan)
|
|
89
91
|
this.ctx.protectedData.ctxes.displayCtx.save();
|
|
90
92
|
this.callbacks.flipDisplayImageByAxis();
|
|
91
|
-
this.ctx.protectedData.ctxes.displayCtx.drawImage(canvas, 0, 0,
|
|
93
|
+
this.ctx.protectedData.ctxes.displayCtx.drawImage(canvas, 0, 0, view.changedWidth, view.changedHeight);
|
|
92
94
|
this.ctx.protectedData.ctxes.displayCtx.restore();
|
|
93
95
|
// Phase 3: Draw ALL layers from MaskVolume (multi-layer compositing)
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
const
|
|
102
|
-
|
|
103
|
-
const
|
|
104
|
-
|
|
105
|
-
|
|
96
|
+
// Skip layer mask rendering when sphere mode is active —
|
|
97
|
+
// layer masks should remain hidden until the user exits sphere mode.
|
|
98
|
+
if (view.switchSliceFlag) {
|
|
99
|
+
if (!this.ctx.gui_states.mode.sphere) {
|
|
100
|
+
const axis = this.ctx.protectedData.axis;
|
|
101
|
+
const sliceIndex = view.currentSliceIndex;
|
|
102
|
+
// Get a single reusable buffer — shared across all layer renders
|
|
103
|
+
const buffer = this.callbacks.getOrCreateSliceBuffer(axis);
|
|
104
|
+
if (buffer) {
|
|
105
|
+
const w = view.changedWidth;
|
|
106
|
+
const h = view.changedHeight;
|
|
107
|
+
for (const layerId of this.ctx.nrrd_states.image.layers) {
|
|
108
|
+
const target = this.ctx.protectedData.layerTargets.get(layerId);
|
|
109
|
+
if (target) {
|
|
110
|
+
this.callbacks.renderSliceToCanvas(layerId, axis, sliceIndex, buffer, target.ctx, w, h);
|
|
111
|
+
}
|
|
106
112
|
}
|
|
107
113
|
}
|
|
114
|
+
// Composite all layers to master canvas
|
|
115
|
+
this.compositeAllLayers();
|
|
108
116
|
}
|
|
109
|
-
//
|
|
110
|
-
this.
|
|
111
|
-
|
|
117
|
+
// Refresh sphere overlay from volume for the new slice
|
|
118
|
+
if (this.ctx.gui_states.mode.sphere) {
|
|
119
|
+
(_b = (_a = this.callbacks).refreshSphereOverlay) === null || _b === void 0 ? void 0 : _b.call(_a);
|
|
120
|
+
}
|
|
121
|
+
view.switchSliceFlag = false;
|
|
112
122
|
}
|
|
113
123
|
}
|
|
114
124
|
/**
|
|
@@ -116,12 +126,12 @@ export class DragSliceTool extends BaseTool {
|
|
|
116
126
|
*/
|
|
117
127
|
compositeAllLayers() {
|
|
118
128
|
const masterCtx = this.ctx.protectedData.ctxes.drawingLayerMasterCtx;
|
|
119
|
-
const width = this.ctx.nrrd_states.changedWidth;
|
|
120
|
-
const height = this.ctx.nrrd_states.changedHeight;
|
|
129
|
+
const width = this.ctx.nrrd_states.view.changedWidth;
|
|
130
|
+
const height = this.ctx.nrrd_states.view.changedHeight;
|
|
121
131
|
masterCtx.clearRect(0, 0, width, height);
|
|
122
132
|
// Master stores full-alpha composite; globalAlpha applied in start() render loop.
|
|
123
|
-
for (const layerId of this.ctx.nrrd_states.layers) {
|
|
124
|
-
if (!this.ctx.gui_states.layerVisibility[layerId])
|
|
133
|
+
for (const layerId of this.ctx.nrrd_states.image.layers) {
|
|
134
|
+
if (!this.ctx.gui_states.layerChannel.layerVisibility[layerId])
|
|
125
135
|
continue;
|
|
126
136
|
const target = this.ctx.protectedData.layerTargets.get(layerId);
|
|
127
137
|
if (target)
|
|
@@ -149,21 +159,21 @@ export class DragSliceTool extends BaseTool {
|
|
|
149
159
|
// ===== UI Updates =====
|
|
150
160
|
updateShowNumDiv(contrastNum) {
|
|
151
161
|
if (this.ctx.protectedData.mainPreSlices) {
|
|
152
|
-
const
|
|
153
|
-
if (
|
|
154
|
-
|
|
162
|
+
const view = this.ctx.nrrd_states.view;
|
|
163
|
+
if (view.currentSliceIndex > view.maxIndex) {
|
|
164
|
+
view.currentSliceIndex = view.maxIndex;
|
|
155
165
|
}
|
|
156
|
-
if (
|
|
157
|
-
this.showDragNumberDiv.innerHTML = `ContrastNum: ${contrastNum}/${this.ctx.protectedData.displaySlices.length - 1} SliceNum: ${
|
|
166
|
+
if (view.showContrast) {
|
|
167
|
+
this.showDragNumberDiv.innerHTML = `ContrastNum: ${contrastNum}/${this.ctx.protectedData.displaySlices.length - 1} SliceNum: ${view.currentSliceIndex}/${view.maxIndex}`;
|
|
158
168
|
}
|
|
159
169
|
else {
|
|
160
|
-
this.showDragNumberDiv.innerHTML = `SliceNum: ${
|
|
170
|
+
this.showDragNumberDiv.innerHTML = `SliceNum: ${view.currentSliceIndex}/${view.maxIndex}`;
|
|
161
171
|
}
|
|
162
172
|
}
|
|
163
173
|
}
|
|
164
174
|
updateCurrentContrastSlice() {
|
|
165
175
|
this.ctx.protectedData.currentShowingSlice =
|
|
166
|
-
this.ctx.protectedData.displaySlices[this.ctx.nrrd_states.contrastNum];
|
|
176
|
+
this.ctx.protectedData.displaySlices[this.ctx.nrrd_states.view.contrastNum];
|
|
167
177
|
return this.ctx.protectedData.currentShowingSlice;
|
|
168
178
|
}
|
|
169
179
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DragSliceTool.js","sourceRoot":"","sources":["../../../../src/Utils/segmentation/tools/DragSliceTool.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"DragSliceTool.js","sourceRoot":"","sources":["../../../../src/Utils/segmentation/tools/DragSliceTool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DrawingTool - Pencil/Brush/Eraser drawing on canvas layers
|
|
3
|
+
*
|
|
4
|
+
* Extracted from DrawToolCore.paintOnCanvas() closure (Phase 3).
|
|
5
|
+
* Handles left-click drawing operations: pencil stroke + fill, brush strokes,
|
|
6
|
+
* eraser, and undo snapshot capture/push.
|
|
7
|
+
*/
|
|
8
|
+
import { BaseTool } from "./BaseTool";
|
|
9
|
+
import type { ToolContext } from "./BaseTool";
|
|
10
|
+
import type { MaskDelta } from "../core";
|
|
11
|
+
/**
|
|
12
|
+
* Callbacks DrawingTool needs from its host (DrawToolCore).
|
|
13
|
+
*/
|
|
14
|
+
export interface DrawingCallbacks {
|
|
15
|
+
/** Get current layer's canvas and 2D context */
|
|
16
|
+
setCurrentLayer: () => {
|
|
17
|
+
ctx: CanvasRenderingContext2D;
|
|
18
|
+
canvas: HTMLCanvasElement;
|
|
19
|
+
};
|
|
20
|
+
/** Composite all layers to master canvas */
|
|
21
|
+
compositeAllLayers: () => void;
|
|
22
|
+
/** Sync layer slice data to MaskVolume */
|
|
23
|
+
syncLayerSliceData: (index: number, layer: string) => void;
|
|
24
|
+
/** Get stored image data for previous image redraw */
|
|
25
|
+
filterDrawedImage: (axis: "x" | "y" | "z", index: number) => {
|
|
26
|
+
image: ImageData;
|
|
27
|
+
} | undefined;
|
|
28
|
+
/** Get MaskVolume for a layer (undo snapshots) */
|
|
29
|
+
getVolumeForLayer: (layer: string) => any;
|
|
30
|
+
/** Push delta to UndoManager */
|
|
31
|
+
pushUndoDelta: (delta: MaskDelta) => void;
|
|
32
|
+
/** Get eraser icon URLs */
|
|
33
|
+
getEraserUrls: () => string[];
|
|
34
|
+
}
|
|
35
|
+
export declare class DrawingTool extends BaseTool {
|
|
36
|
+
/** Left mouse button currently held (draw mode) */
|
|
37
|
+
private leftClicked;
|
|
38
|
+
/** True while actively painting (between pointerdown and pointerup) */
|
|
39
|
+
private isPainting;
|
|
40
|
+
/** Accumulated pencil stroke points for fill-on-release */
|
|
41
|
+
private drawingLines;
|
|
42
|
+
/** Eraser arc function, assigned once per paintOnCanvas() call */
|
|
43
|
+
private clearArcFn;
|
|
44
|
+
/** Snapshot of the active layer's slice captured on mouse-down (before drawing) */
|
|
45
|
+
private preDrawSlice;
|
|
46
|
+
private preDrawAxis;
|
|
47
|
+
private preDrawSliceIndex;
|
|
48
|
+
private callbacks;
|
|
49
|
+
constructor(ctx: ToolContext, callbacks: DrawingCallbacks);
|
|
50
|
+
/** Whether a draw operation is currently active */
|
|
51
|
+
get isActive(): boolean;
|
|
52
|
+
/** Whether paint strokes are being recorded */
|
|
53
|
+
get painting(): boolean;
|
|
54
|
+
/**
|
|
55
|
+
* Reset drawing state. Called at start of each paintOnCanvas() cycle.
|
|
56
|
+
* @param clearArcFn - Eraser function for this paint cycle
|
|
57
|
+
*/
|
|
58
|
+
reset(clearArcFn: (x: number, y: number, size: number) => void): void;
|
|
59
|
+
/**
|
|
60
|
+
* Called on left-click pointerdown in draw mode.
|
|
61
|
+
* Sets up drawing state, cursor, undo snapshot, and start position.
|
|
62
|
+
*/
|
|
63
|
+
onPointerDown(e: MouseEvent): void;
|
|
64
|
+
/**
|
|
65
|
+
* Called on pointermove during an active drawing operation.
|
|
66
|
+
* Handles eraser clearing or brush/pencil stroke accumulation.
|
|
67
|
+
*/
|
|
68
|
+
onPointerMove(e: MouseEvent): void;
|
|
69
|
+
/**
|
|
70
|
+
* Called on pointerup in draw mode.
|
|
71
|
+
* Completes stroke, fills pencil path, syncs volume, pushes undo delta.
|
|
72
|
+
*/
|
|
73
|
+
onPointerUp(_e: MouseEvent): void;
|
|
74
|
+
/**
|
|
75
|
+
* Called on pointerleave during drawing.
|
|
76
|
+
* Resets painting state and cleans up leftClicked.
|
|
77
|
+
* @returns true if drawing was in progress when leave occurred
|
|
78
|
+
*/
|
|
79
|
+
onPointerLeave(): boolean;
|
|
80
|
+
/** Capture pre-draw slice snapshot for undo */
|
|
81
|
+
private capturePreDrawSnapshot;
|
|
82
|
+
/** Push delta to UndoManager after drawing completes */
|
|
83
|
+
private pushUndoDelta;
|
|
84
|
+
/**
|
|
85
|
+
* Redraws persisted layer data onto ctx before new pencil fill.
|
|
86
|
+
* Extracted from DrawToolCore.
|
|
87
|
+
*/
|
|
88
|
+
private redrawPreviousImageToLayerCtx;
|
|
89
|
+
/** Draw a line segment on a layer canvas */
|
|
90
|
+
private drawLinesOnLayer;
|
|
91
|
+
/** Paint a segment on the current layer canvas and composite to master */
|
|
92
|
+
private paintOnCanvasLayer;
|
|
93
|
+
}
|