copper3d 2.2.3 → 3.0.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.
Files changed (111) hide show
  1. package/README.md +1056 -5
  2. package/dist/Scene/copperScene.d.ts +3 -0
  3. package/dist/Scene/copperScene.js +13 -0
  4. package/dist/Scene/copperScene.js.map +1 -1
  5. package/dist/Utils/segmentation/CommToolsData.d.ts +109 -6
  6. package/dist/Utils/segmentation/CommToolsData.js +314 -50
  7. package/dist/Utils/segmentation/CommToolsData.js.map +1 -1
  8. package/dist/Utils/segmentation/DragOperator.d.ts +13 -7
  9. package/dist/Utils/segmentation/DragOperator.js +51 -165
  10. package/dist/Utils/segmentation/DragOperator.js.map +1 -1
  11. package/dist/Utils/segmentation/DrawToolCore.d.ts +57 -76
  12. package/dist/Utils/segmentation/DrawToolCore.js +368 -878
  13. package/dist/Utils/segmentation/DrawToolCore.js.map +1 -1
  14. package/dist/Utils/segmentation/NrrdTools.d.ts +277 -15
  15. package/dist/Utils/segmentation/NrrdTools.js +594 -232
  16. package/dist/Utils/segmentation/NrrdTools.js.map +1 -1
  17. package/dist/Utils/segmentation/core/MaskVolume.d.ts +477 -0
  18. package/dist/Utils/segmentation/core/MaskVolume.js +1238 -0
  19. package/dist/Utils/segmentation/core/MaskVolume.js.map +1 -0
  20. package/dist/Utils/segmentation/core/MigrationUtils.d.ts +97 -0
  21. package/dist/Utils/segmentation/core/MigrationUtils.js +163 -0
  22. package/dist/Utils/segmentation/core/MigrationUtils.js.map +1 -0
  23. package/dist/Utils/segmentation/core/UndoManager.d.ts +47 -0
  24. package/dist/Utils/segmentation/core/UndoManager.js +86 -0
  25. package/dist/Utils/segmentation/core/UndoManager.js.map +1 -0
  26. package/dist/Utils/segmentation/core/index.d.ts +76 -0
  27. package/dist/Utils/segmentation/core/index.js +75 -0
  28. package/dist/Utils/segmentation/core/index.js.map +1 -0
  29. package/dist/Utils/segmentation/core/types.d.ts +106 -0
  30. package/dist/Utils/segmentation/core/types.js +98 -0
  31. package/dist/Utils/segmentation/core/types.js.map +1 -0
  32. package/dist/Utils/segmentation/coreTools/coreType.d.ts +55 -36
  33. package/dist/Utils/segmentation/coreTools/coreType.js.map +1 -1
  34. package/dist/Utils/segmentation/coreTools/gui.d.ts +6 -16
  35. package/dist/Utils/segmentation/coreTools/gui.js +23 -27
  36. package/dist/Utils/segmentation/coreTools/gui.js.map +1 -1
  37. package/dist/Utils/segmentation/eventRouter/EventRouter.d.ts +144 -0
  38. package/dist/Utils/segmentation/eventRouter/EventRouter.js +369 -0
  39. package/dist/Utils/segmentation/eventRouter/EventRouter.js.map +1 -0
  40. package/dist/Utils/segmentation/eventRouter/index.d.ts +7 -0
  41. package/dist/Utils/segmentation/eventRouter/index.js +7 -0
  42. package/dist/Utils/segmentation/eventRouter/index.js.map +1 -0
  43. package/dist/Utils/segmentation/eventRouter/types.d.ts +70 -0
  44. package/dist/Utils/segmentation/eventRouter/types.js +7 -0
  45. package/dist/Utils/segmentation/eventRouter/types.js.map +1 -0
  46. package/dist/Utils/segmentation/tools/BaseTool.d.ts +25 -0
  47. package/dist/Utils/segmentation/tools/BaseTool.js +18 -0
  48. package/dist/Utils/segmentation/tools/BaseTool.js.map +1 -0
  49. package/dist/Utils/segmentation/tools/ContrastTool.d.ts +26 -0
  50. package/dist/Utils/segmentation/tools/ContrastTool.js +118 -0
  51. package/dist/Utils/segmentation/tools/ContrastTool.js.map +1 -0
  52. package/dist/Utils/segmentation/tools/CrosshairTool.d.ts +30 -0
  53. package/dist/Utils/segmentation/tools/CrosshairTool.js +157 -0
  54. package/dist/Utils/segmentation/tools/CrosshairTool.js.map +1 -0
  55. package/dist/Utils/segmentation/tools/DragSliceTool.d.ts +44 -0
  56. package/dist/Utils/segmentation/tools/DragSliceTool.js +170 -0
  57. package/dist/Utils/segmentation/tools/DragSliceTool.js.map +1 -0
  58. package/dist/Utils/segmentation/tools/EraserTool.d.ts +16 -0
  59. package/dist/Utils/segmentation/tools/EraserTool.js +92 -0
  60. package/dist/Utils/segmentation/tools/EraserTool.js.map +1 -0
  61. package/dist/Utils/segmentation/tools/ImageStoreHelper.d.ts +65 -0
  62. package/dist/Utils/segmentation/tools/ImageStoreHelper.js +174 -0
  63. package/dist/Utils/segmentation/tools/ImageStoreHelper.js.map +1 -0
  64. package/dist/Utils/segmentation/tools/SphereTool.d.ts +38 -0
  65. package/dist/Utils/segmentation/tools/SphereTool.js +193 -0
  66. package/dist/Utils/segmentation/tools/SphereTool.js.map +1 -0
  67. package/dist/Utils/segmentation/tools/ZoomTool.d.ts +20 -0
  68. package/dist/Utils/segmentation/tools/ZoomTool.js +59 -0
  69. package/dist/Utils/segmentation/tools/ZoomTool.js.map +1 -0
  70. package/dist/Utils/segmentation/tools/index.d.ts +22 -0
  71. package/dist/Utils/segmentation/tools/index.js +23 -0
  72. package/dist/Utils/segmentation/tools/index.js.map +1 -0
  73. package/dist/bundle.esm.js +4740 -1979
  74. package/dist/bundle.umd.js +4743 -1978
  75. package/dist/index.d.ts +5 -3
  76. package/dist/index.js +4 -2
  77. package/dist/index.js.map +1 -1
  78. package/dist/types/Renderer/copperRenderer.d.ts +1 -1
  79. package/dist/types/Renderer/copperRendererOnDemond.d.ts +1 -1
  80. package/dist/types/Scene/copperScene.d.ts +3 -0
  81. package/dist/types/Utils/segmentation/CommToolsData.d.ts +109 -6
  82. package/dist/types/Utils/segmentation/DragOperator.d.ts +13 -7
  83. package/dist/types/Utils/segmentation/DrawToolCore.d.ts +57 -76
  84. package/dist/types/Utils/segmentation/NrrdTools.d.ts +277 -15
  85. package/dist/types/Utils/segmentation/core/MaskVolume.d.ts +477 -0
  86. package/dist/types/Utils/segmentation/core/MigrationUtils.d.ts +97 -0
  87. package/dist/types/Utils/segmentation/core/UndoManager.d.ts +47 -0
  88. package/dist/types/Utils/segmentation/core/index.d.ts +76 -0
  89. package/dist/types/Utils/segmentation/core/types.d.ts +106 -0
  90. package/dist/types/Utils/segmentation/coreTools/coreType.d.ts +55 -36
  91. package/dist/types/Utils/segmentation/coreTools/gui.d.ts +6 -16
  92. package/dist/types/Utils/segmentation/eventRouter/EventRouter.d.ts +144 -0
  93. package/dist/types/Utils/segmentation/eventRouter/index.d.ts +7 -0
  94. package/dist/types/Utils/segmentation/eventRouter/types.d.ts +70 -0
  95. package/dist/types/Utils/segmentation/tools/BaseTool.d.ts +25 -0
  96. package/dist/types/Utils/segmentation/tools/ContrastTool.d.ts +26 -0
  97. package/dist/types/Utils/segmentation/tools/CrosshairTool.d.ts +30 -0
  98. package/dist/types/Utils/segmentation/tools/DragSliceTool.d.ts +44 -0
  99. package/dist/types/Utils/segmentation/tools/EraserTool.d.ts +16 -0
  100. package/dist/types/Utils/segmentation/tools/ImageStoreHelper.d.ts +65 -0
  101. package/dist/types/Utils/segmentation/tools/SphereTool.d.ts +38 -0
  102. package/dist/types/Utils/segmentation/tools/ZoomTool.d.ts +20 -0
  103. package/dist/types/Utils/segmentation/tools/index.d.ts +22 -0
  104. package/dist/types/index.d.ts +5 -3
  105. package/dist/types/types/types.d.ts +3 -3
  106. package/dist/types/types.d.ts +3 -3
  107. package/package.json +1 -1
  108. package/dist/Utils/segmentation/coreTools/archive.d.ts +0 -1
  109. package/dist/Utils/segmentation/coreTools/archive.js +0 -23
  110. package/dist/Utils/segmentation/coreTools/archive.js.map +0 -1
  111. package/dist/types/Utils/segmentation/coreTools/archive.d.ts +0 -1
@@ -0,0 +1,92 @@
1
+ /**
2
+ * EraserTool - Channel-aware circular eraser implementation
3
+ *
4
+ * Phase 3.5: Updated to only erase pixels matching the active channel color
5
+ * on the current layer canvas. Other channels/layers are untouched.
6
+ */
7
+ import { BaseTool } from "./BaseTool";
8
+ import { MASK_CHANNEL_COLORS } from "../core";
9
+ export class EraserTool extends BaseTool {
10
+ /**
11
+ * Create the circular eraser function.
12
+ *
13
+ * Channel-aware: only erases pixels whose RGB matches the active channel's color.
14
+ * Only operates on the current layer canvas + master canvas.
15
+ */
16
+ createClearArc() {
17
+ const clearArc = (x, y, radius) => {
18
+ var _a;
19
+ const activeChannel = this.ctx.gui_states.activeChannel || 1;
20
+ // Get color from current layer's volume (respects custom per-layer colors)
21
+ const layer = this.ctx.gui_states.layer;
22
+ const volume = this.ctx.protectedData.maskData.volumes[layer];
23
+ const channelColor = volume
24
+ ? volume.getChannelColor(activeChannel)
25
+ : ((_a = MASK_CHANNEL_COLORS[activeChannel]) !== null && _a !== void 0 ? _a : MASK_CHANNEL_COLORS[1]);
26
+ // Determine current layer context via layerTargets Map
27
+ const target = this.ctx.protectedData.layerTargets.get(layer);
28
+ if (!target)
29
+ return; // Unknown layer, safe exit
30
+ const layerCtx = target.ctx;
31
+ // Calculate bounding box of the eraser circle
32
+ const x0 = Math.max(0, Math.floor(x - radius));
33
+ const y0 = Math.max(0, Math.floor(y - radius));
34
+ const x1 = Math.min(this.ctx.nrrd_states.changedWidth, Math.ceil(x + radius));
35
+ const y1 = Math.min(this.ctx.nrrd_states.changedHeight, Math.ceil(y + radius));
36
+ const w = x1 - x0;
37
+ const h = y1 - y0;
38
+ if (w <= 0 || h <= 0)
39
+ return;
40
+ // Read current layer pixels in the bounding box
41
+ const imageData = layerCtx.getImageData(x0, y0, w, h);
42
+ const pixels = imageData.data;
43
+ const r2 = radius * radius;
44
+ // Erase pixels matching the active channel color within the circle.
45
+ // Uses tolerance (±30) to handle anti-aliased edges from canvas path rendering.
46
+ const TOL = 30;
47
+ const cr = channelColor.r, cg = channelColor.g, cb = channelColor.b;
48
+ for (let py = 0; py < h; py++) {
49
+ for (let px = 0; px < w; px++) {
50
+ const dx = (x0 + px) - x;
51
+ const dy = (y0 + py) - y;
52
+ if (dx * dx + dy * dy > r2)
53
+ continue; // Outside circle
54
+ const idx = (py * w + px) * 4;
55
+ const pa = pixels[idx + 3];
56
+ // Skip transparent pixels
57
+ if (pa === 0)
58
+ continue;
59
+ // Match if RGB is within tolerance of the active channel color
60
+ const pr = pixels[idx];
61
+ const pg = pixels[idx + 1];
62
+ const pb = pixels[idx + 2];
63
+ if (Math.abs(pr - cr) <= TOL &&
64
+ Math.abs(pg - cg) <= TOL &&
65
+ Math.abs(pb - cb) <= TOL) {
66
+ pixels[idx] = 0;
67
+ pixels[idx + 1] = 0;
68
+ pixels[idx + 2] = 0;
69
+ pixels[idx + 3] = 0;
70
+ }
71
+ }
72
+ }
73
+ // Write modified pixels back to layer canvas
74
+ layerCtx.putImageData(imageData, x0, y0);
75
+ // Recomposite master from all layer canvases (full alpha;
76
+ // globalAlpha applied in start() render loop).
77
+ const masterCtx = this.ctx.protectedData.ctxes.drawingLayerMasterCtx;
78
+ const fullW = this.ctx.nrrd_states.changedWidth;
79
+ const fullH = this.ctx.nrrd_states.changedHeight;
80
+ masterCtx.clearRect(0, 0, fullW, fullH);
81
+ for (const layerId of this.ctx.nrrd_states.layers) {
82
+ if (!this.ctx.gui_states.layerVisibility[layerId])
83
+ continue;
84
+ const lt = this.ctx.protectedData.layerTargets.get(layerId);
85
+ if (lt)
86
+ masterCtx.drawImage(lt.canvas, 0, 0, fullW, fullH);
87
+ }
88
+ };
89
+ return clearArc;
90
+ }
91
+ }
92
+ //# sourceMappingURL=EraserTool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EraserTool.js","sourceRoot":"","sources":["../../../../src/Utils/segmentation/tools/EraserTool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * ImageStoreHelper - Cross-axis image storage
3
+ *
4
+ * Extracted from DrawToolCore.ts:
5
+ * - storeAllImages / storeImageToAxis / storeImageToLayer / storeEachLayerImage
6
+ *
7
+ * Phase 2 Day 7: Updated to write/read MaskVolume alongside legacy IPaintImages.
8
+ * Volume is the primary storage; IPaintImages kept for backward compatibility.
9
+ */
10
+ import { BaseTool } from "./BaseTool";
11
+ import type { ToolContext } from "./BaseTool";
12
+ import type { IPaintImage, IPaintImages } from "../coreTools/coreType";
13
+ export interface ImageStoreCallbacks {
14
+ setEmptyCanvasSize: (axis?: "x" | "y" | "z") => void;
15
+ drawImageOnEmptyImage: (canvas: HTMLCanvasElement) => void;
16
+ }
17
+ export declare class ImageStoreHelper extends BaseTool {
18
+ private callbacks;
19
+ constructor(ctx: ToolContext, callbacks: ImageStoreCallbacks);
20
+ /**
21
+ * Get MaskVolume for a specific layer.
22
+ * Delegates to the volumes stored in protectedData.maskData.
23
+ *
24
+ * @param layer - "layer1", "layer2", or "layer3"
25
+ * @returns MaskVolume for the given layer, or layer1 as fallback
26
+ */
27
+ private getVolumeForLayer;
28
+ /**
29
+ * Get MaskVolume for the currently active layer.
30
+ */
31
+ private getCurrentVolume;
32
+ /**
33
+ * Get the canvas element for a specific layer.
34
+ */
35
+ private getCanvasForLayer;
36
+ /**
37
+ * Phase 3: Simplified to be a no-op.
38
+ * MaskVolume storage happens in storeAllImages via setSliceFromImageData.
39
+ * This method kept for backward compatibility with existing call sites.
40
+ */
41
+ storeImageToAxis(_index: number, _paintedImages: IPaintImages, _imageData: ImageData, _axis?: "x" | "y" | "z"): void;
42
+ /**
43
+ * Retrieve the drawn image for a given axis and slice.
44
+ *
45
+ * Phase 3: Reads exclusively from MaskVolume (no legacy fallback).
46
+ */
47
+ filterDrawedImage(axis: "x" | "y" | "z", sliceIndex: number, _paintedImages: IPaintImages): IPaintImage | undefined;
48
+ /**
49
+ * Store all layer images for the current slice (cross-axis sync).
50
+ *
51
+ * Phase 2: Also writes into the current layer's MaskVolume.
52
+ */
53
+ storeAllImages(index: number, layer: string): void;
54
+ /**
55
+ * Store a single layer's canvas data to its MaskVolume.
56
+ * Reads from the individual layer canvas (not master) and uses RGB→channel reverse lookup.
57
+ */
58
+ storeEachLayerImage(index: number, layer: string): void;
59
+ /**
60
+ * Phase 3: Simplified - extracts ImageData from canvas but no longer stores to paintImages.
61
+ * Kept for backward compatibility with existing call sites.
62
+ */
63
+ storeImageToLayer(_index: number, canvas: HTMLCanvasElement, _paintedImages: IPaintImages): ImageData;
64
+ private hasNonZeroPixels;
65
+ }
@@ -0,0 +1,174 @@
1
+ /**
2
+ * ImageStoreHelper - Cross-axis image storage
3
+ *
4
+ * Extracted from DrawToolCore.ts:
5
+ * - storeAllImages / storeImageToAxis / storeImageToLayer / storeEachLayerImage
6
+ *
7
+ * Phase 2 Day 7: Updated to write/read MaskVolume alongside legacy IPaintImages.
8
+ * Volume is the primary storage; IPaintImages kept for backward compatibility.
9
+ */
10
+ import { BaseTool } from "./BaseTool";
11
+ export class ImageStoreHelper extends BaseTool {
12
+ constructor(ctx, callbacks) {
13
+ super(ctx);
14
+ this.callbacks = callbacks;
15
+ }
16
+ // ===== Volume Accessor Helpers (Phase 2) =====
17
+ /**
18
+ * Get MaskVolume for a specific layer.
19
+ * Delegates to the volumes stored in protectedData.maskData.
20
+ *
21
+ * @param layer - "layer1", "layer2", or "layer3"
22
+ * @returns MaskVolume for the given layer, or layer1 as fallback
23
+ */
24
+ getVolumeForLayer(layer) {
25
+ const { volumes } = this.ctx.protectedData.maskData;
26
+ switch (layer) {
27
+ case "layer1": return volumes.layer1;
28
+ case "layer2": return volumes.layer2;
29
+ case "layer3": return volumes.layer3;
30
+ default: return volumes.layer1;
31
+ }
32
+ }
33
+ /**
34
+ * Get MaskVolume for the currently active layer.
35
+ */
36
+ getCurrentVolume() {
37
+ return this.getVolumeForLayer(this.ctx.gui_states.layer);
38
+ }
39
+ /**
40
+ * Get the canvas element for a specific layer.
41
+ */
42
+ getCanvasForLayer(layer) {
43
+ const target = this.ctx.protectedData.layerTargets.get(layer);
44
+ if (target)
45
+ return target.canvas;
46
+ return this.ctx.protectedData.canvases.drawingCanvasLayerMaster;
47
+ }
48
+ // ===== Store Image To Axis =====
49
+ /**
50
+ * Phase 3: Simplified to be a no-op.
51
+ * MaskVolume storage happens in storeAllImages via setSliceFromImageData.
52
+ * This method kept for backward compatibility with existing call sites.
53
+ */
54
+ storeImageToAxis(_index, _paintedImages, _imageData, _axis) {
55
+ // No-op: MaskVolume is the primary storage, updated in storeAllImages
56
+ }
57
+ /**
58
+ * Retrieve the drawn image for a given axis and slice.
59
+ *
60
+ * Phase 3: Reads exclusively from MaskVolume (no legacy fallback).
61
+ */
62
+ filterDrawedImage(axis, sliceIndex, _paintedImages) {
63
+ try {
64
+ const volume = this.getCurrentVolume();
65
+ if (volume) {
66
+ const dims = volume.getDimensions();
67
+ const [w, h] = axis === 'z' ? [dims.width, dims.height]
68
+ : axis === 'y' ? [dims.width, dims.depth]
69
+ // Sagittal: width = depth (Z), height = height (Y)
70
+ : [dims.depth, dims.height];
71
+ const imageData = new ImageData(w, h);
72
+ const channelVis = this.ctx.gui_states.channelVisibility[this.ctx.gui_states.layer];
73
+ volume.renderLabelSliceInto(sliceIndex, axis, imageData, channelVis);
74
+ return { index: sliceIndex, image: imageData };
75
+ }
76
+ }
77
+ catch (err) {
78
+ console.warn(`filterDrawedImage: Failed to read slice ${sliceIndex} on ${axis}:`, err);
79
+ }
80
+ return undefined;
81
+ }
82
+ // ===== Store All Images (cross-axis sync) =====
83
+ /**
84
+ * Store all layer images for the current slice (cross-axis sync).
85
+ *
86
+ * Phase 2: Also writes into the current layer's MaskVolume.
87
+ */
88
+ storeAllImages(index, layer) {
89
+ const nrrd = this.ctx.nrrd_states;
90
+ // Read from the individual layer canvas (NOT master) to preserve layer isolation
91
+ const layerCanvas = this.getCanvasForLayer(layer);
92
+ if (!nrrd.loadMaskJson && !this.ctx.gui_states.sphere && !this.ctx.gui_states.calculator) {
93
+ this.callbacks.setEmptyCanvasSize();
94
+ this.callbacks.drawImageOnEmptyImage(layerCanvas);
95
+ }
96
+ const imageData = this.ctx.protectedData.ctxes.emptyCtx.getImageData(0, 0, this.ctx.protectedData.canvases.emptyCanvas.width, this.ctx.protectedData.canvases.emptyCanvas.height);
97
+ // Write label data into 1-channel MaskVolume with RGB→channel reverse lookup
98
+ try {
99
+ const volume = this.getVolumeForLayer(layer);
100
+ if (volume) {
101
+ const activeChannel = this.ctx.gui_states.activeChannel || 1;
102
+ // Phase 4 Fix: Pass channel visibility map to preserve hidden channels
103
+ const channelVis = this.ctx.gui_states.channelVisibility[layer];
104
+ volume.setSliceLabelsFromImageData(index, imageData, this.ctx.protectedData.axis, activeChannel, channelVis);
105
+ }
106
+ }
107
+ catch (err) {
108
+ // Volume not ready — skip
109
+ }
110
+ if (!nrrd.loadMaskJson && !this.ctx.gui_states.sphere && !this.ctx.gui_states.calculator) {
111
+ // Extract raw slice data from MaskVolume and notify parent
112
+ try {
113
+ const volume = this.getVolumeForLayer(layer);
114
+ if (volume) {
115
+ const axis = this.ctx.protectedData.axis;
116
+ const sliceIndex = this.ctx.nrrd_states.currentIndex;
117
+ const { data: sliceData, width, height } = volume.getSliceUint8(sliceIndex, axis);
118
+ const activeChannel = this.ctx.gui_states.activeChannel || 1;
119
+ this.ctx.nrrd_states.getMask(sliceData, layer, activeChannel, sliceIndex, axis, width, height, this.ctx.nrrd_states.clearAllFlag);
120
+ }
121
+ }
122
+ catch (_a) {
123
+ // Volume not ready — skip notification
124
+ }
125
+ }
126
+ }
127
+ // ===== Store Per-Layer Images =====
128
+ /**
129
+ * Store a single layer's canvas data to its MaskVolume.
130
+ * Reads from the individual layer canvas (not master) and uses RGB→channel reverse lookup.
131
+ */
132
+ storeEachLayerImage(index, layer) {
133
+ const layerCanvas = this.getCanvasForLayer(layer);
134
+ this.callbacks.setEmptyCanvasSize();
135
+ this.callbacks.drawImageOnEmptyImage(layerCanvas);
136
+ const imageData = this.ctx.protectedData.ctxes.emptyCtx.getImageData(0, 0, this.ctx.protectedData.canvases.emptyCanvas.width, this.ctx.protectedData.canvases.emptyCanvas.height);
137
+ try {
138
+ const volume = this.getVolumeForLayer(layer);
139
+ if (volume) {
140
+ const activeChannel = this.ctx.gui_states.activeChannel || 1;
141
+ // Phase 4 Fix: Pass channel visibility map to preserve hidden channels
142
+ const channelVis = this.ctx.gui_states.channelVisibility[layer];
143
+ volume.setSliceLabelsFromImageData(index, imageData, this.ctx.protectedData.axis, activeChannel, channelVis);
144
+ }
145
+ }
146
+ catch (_a) {
147
+ // Volume not ready — skip
148
+ }
149
+ }
150
+ /**
151
+ * Phase 3: Simplified - extracts ImageData from canvas but no longer stores to paintImages.
152
+ * Kept for backward compatibility with existing call sites.
153
+ */
154
+ storeImageToLayer(_index, canvas, _paintedImages) {
155
+ if (!this.ctx.nrrd_states.loadMaskJson) {
156
+ this.callbacks.setEmptyCanvasSize();
157
+ this.callbacks.drawImageOnEmptyImage(canvas);
158
+ }
159
+ const imageData = this.ctx.protectedData.ctxes.emptyCtx.getImageData(0, 0, this.ctx.protectedData.canvases.emptyCanvas.width, this.ctx.protectedData.canvases.emptyCanvas.height);
160
+ // No longer stores to paintedImages - MaskVolume is primary storage
161
+ return imageData;
162
+ }
163
+ // ===== Helper Methods =====
164
+ hasNonZeroPixels(imageData) {
165
+ const data = imageData.data;
166
+ for (let i = 0; i < data.length; i += 4) {
167
+ if (data[i] !== 0 || data[i + 1] !== 0 || data[i + 2] !== 0 || data[i + 3] !== 0) {
168
+ return true;
169
+ }
170
+ }
171
+ return false;
172
+ }
173
+ }
174
+ //# sourceMappingURL=ImageStoreHelper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ImageStoreHelper.js","sourceRoot":"","sources":["../../../../src/Utils/segmentation/tools/ImageStoreHelper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * SphereTool - Sphere drawing and calculator sphere operations
3
+ *
4
+ * Extracted from DrawToolCore.ts:
5
+ * - drawSphere / drawSphereCore / clearSphereCanvas
6
+ * - drawSphereOnEachViews / drawCalculatorSphereOnEachViews
7
+ * - storeSphereImages / setSphereCanvasSize
8
+ * - drawCalculatorSphere / configMouseSphereWheel
9
+ * - getSpherePosition / clearSpherePrintStoreImages
10
+ */
11
+ import { BaseTool } from "./BaseTool";
12
+ import type { ToolContext } from "./BaseTool";
13
+ import type { IPaintImages } from "../coreTools/coreType";
14
+ /**
15
+ * Callbacks that DrawToolCore must provide for sphere operations.
16
+ */
17
+ export interface SphereCallbacks {
18
+ setEmptyCanvasSize: (axis?: "x" | "y" | "z") => void;
19
+ drawImageOnEmptyImage: (canvas: HTMLCanvasElement) => void;
20
+ storeImageToAxis: (index: number, paintedImages: IPaintImages, imageData: ImageData, axis?: "x" | "y" | "z") => void;
21
+ createEmptyPaintImage: (dimensions: number[], paintImages: IPaintImages) => void;
22
+ }
23
+ export declare class SphereTool extends BaseTool {
24
+ private callbacks;
25
+ constructor(ctx: ToolContext, callbacks: SphereCallbacks);
26
+ setCallbacks(callbacks: SphereCallbacks): void;
27
+ setSphereCanvasSize(axis?: "x" | "y" | "z"): void;
28
+ drawSphereCore(ctx: CanvasRenderingContext2D, x: number, y: number, radius: number, color: string): void;
29
+ clearSphereCanvas(): [HTMLCanvasElement, CanvasRenderingContext2D];
30
+ drawSphere(mouseX: number, mouseY: number, radius: number): void;
31
+ configMouseSphereWheel(): (e: WheelEvent) => void;
32
+ private storeSphereImages;
33
+ drawSphereOnEachViews(decay: number, axis: "x" | "y" | "z"): void;
34
+ private getSpherePosition;
35
+ drawCalculatorSphereOnEachViews(axis: "x" | "y" | "z"): void;
36
+ drawCalculatorSphere(radius: number): void;
37
+ clearSpherePrintStoreImages(): void;
38
+ }
@@ -0,0 +1,193 @@
1
+ /**
2
+ * SphereTool - Sphere drawing and calculator sphere operations
3
+ *
4
+ * Extracted from DrawToolCore.ts:
5
+ * - drawSphere / drawSphereCore / clearSphereCanvas
6
+ * - drawSphereOnEachViews / drawCalculatorSphereOnEachViews
7
+ * - storeSphereImages / setSphereCanvasSize
8
+ * - drawCalculatorSphere / configMouseSphereWheel
9
+ * - getSpherePosition / clearSpherePrintStoreImages
10
+ */
11
+ import { BaseTool } from "./BaseTool";
12
+ export class SphereTool extends BaseTool {
13
+ constructor(ctx, callbacks) {
14
+ super(ctx);
15
+ this.callbacks = callbacks;
16
+ }
17
+ setCallbacks(callbacks) {
18
+ this.callbacks = callbacks;
19
+ }
20
+ // ===== Sphere Canvas Size =====
21
+ setSphereCanvasSize(axis) {
22
+ const nrrd = this.ctx.nrrd_states;
23
+ switch (axis !== null && axis !== void 0 ? axis : this.ctx.protectedData.axis) {
24
+ case "x":
25
+ this.ctx.protectedData.canvases.drawingSphereCanvas.width = nrrd.nrrd_z_mm;
26
+ this.ctx.protectedData.canvases.drawingSphereCanvas.height = nrrd.nrrd_y_mm;
27
+ break;
28
+ case "y":
29
+ this.ctx.protectedData.canvases.drawingSphereCanvas.width = nrrd.nrrd_x_mm;
30
+ this.ctx.protectedData.canvases.drawingSphereCanvas.height = nrrd.nrrd_z_mm;
31
+ break;
32
+ case "z":
33
+ this.ctx.protectedData.canvases.drawingSphereCanvas.width = nrrd.nrrd_x_mm;
34
+ this.ctx.protectedData.canvases.drawingSphereCanvas.height = nrrd.nrrd_y_mm;
35
+ break;
36
+ }
37
+ }
38
+ // ===== Core Sphere Drawing =====
39
+ drawSphereCore(ctx, x, y, radius, color) {
40
+ ctx.beginPath();
41
+ ctx.arc(x, y, radius, 0, 2 * Math.PI);
42
+ ctx.fillStyle = color;
43
+ ctx.fill();
44
+ ctx.closePath();
45
+ }
46
+ clearSphereCanvas() {
47
+ // clear drawingCanvasLayerMaster
48
+ this.ctx.protectedData.canvases.drawingCanvasLayerMaster.width =
49
+ this.ctx.protectedData.canvases.drawingCanvasLayerMaster.width;
50
+ // resize sphere canvas to original size
51
+ this.ctx.protectedData.canvases.drawingSphereCanvas.width =
52
+ this.ctx.protectedData.canvases.originCanvas.width;
53
+ this.ctx.protectedData.canvases.drawingSphereCanvas.height =
54
+ this.ctx.protectedData.canvases.originCanvas.height;
55
+ return [
56
+ this.ctx.protectedData.canvases.drawingSphereCanvas,
57
+ this.ctx.protectedData.ctxes.drawingSphereCtx,
58
+ ];
59
+ }
60
+ drawSphere(mouseX, mouseY, radius) {
61
+ const [canvas, ctx] = this.clearSphereCanvas();
62
+ this.drawSphereCore(ctx, mouseX, mouseY, radius, this.ctx.gui_states.fillColor);
63
+ this.ctx.protectedData.ctxes.drawingLayerMasterCtx.drawImage(canvas, 0, 0, this.ctx.nrrd_states.changedWidth, this.ctx.nrrd_states.changedHeight);
64
+ }
65
+ // ===== Sphere Wheel =====
66
+ configMouseSphereWheel() {
67
+ return (e) => {
68
+ e.preventDefault();
69
+ if (e.deltaY < 0) {
70
+ this.ctx.nrrd_states.sphereRadius += 1;
71
+ }
72
+ else {
73
+ this.ctx.nrrd_states.sphereRadius -= 1;
74
+ }
75
+ this.ctx.nrrd_states.sphereRadius = Math.max(1, Math.min(this.ctx.nrrd_states.sphereRadius, 50));
76
+ const mouseX = this.ctx.nrrd_states.sphereOrigin[this.ctx.protectedData.axis][0];
77
+ const mouseY = this.ctx.nrrd_states.sphereOrigin[this.ctx.protectedData.axis][1];
78
+ this.drawSphere(mouseX, mouseY, this.ctx.nrrd_states.sphereRadius);
79
+ };
80
+ }
81
+ // ===== Store Sphere Images =====
82
+ storeSphereImages(index, axis) {
83
+ this.callbacks.setEmptyCanvasSize(axis);
84
+ this.callbacks.drawImageOnEmptyImage(this.ctx.protectedData.canvases.drawingSphereCanvas);
85
+ const imageData = this.ctx.protectedData.ctxes.emptyCtx.getImageData(0, 0, this.ctx.protectedData.canvases.emptyCanvas.width, this.ctx.protectedData.canvases.emptyCanvas.height);
86
+ this.callbacks.storeImageToAxis(index, { x: [], y: [], z: [] }, imageData, axis);
87
+ }
88
+ // ===== Multi-View Sphere =====
89
+ drawSphereOnEachViews(decay, axis) {
90
+ this.setSphereCanvasSize(axis);
91
+ const mouseX = this.ctx.nrrd_states.sphereOrigin[axis][0];
92
+ const mouseY = this.ctx.nrrd_states.sphereOrigin[axis][1];
93
+ const originIndex = this.ctx.nrrd_states.sphereOrigin[axis][2];
94
+ const preIndex = originIndex - decay;
95
+ const nextIndex = originIndex + decay;
96
+ const ctx = this.ctx.protectedData.ctxes.drawingSphereCtx;
97
+ const canvas = this.ctx.protectedData.canvases.drawingSphereCanvas;
98
+ if (preIndex === nextIndex) {
99
+ this.drawSphereCore(ctx, mouseX, mouseY, this.ctx.nrrd_states.sphereRadius, this.ctx.gui_states.fillColor);
100
+ this.storeSphereImages(preIndex, axis);
101
+ }
102
+ else {
103
+ this.drawSphereCore(ctx, mouseX, mouseY, this.ctx.nrrd_states.sphereRadius - decay, this.ctx.gui_states.fillColor);
104
+ this.callbacks.drawImageOnEmptyImage(canvas);
105
+ this.storeSphereImages(preIndex, axis);
106
+ this.storeSphereImages(nextIndex, axis);
107
+ }
108
+ ctx.clearRect(0, 0, canvas.width, canvas.height);
109
+ }
110
+ // ===== Calculator Sphere =====
111
+ getSpherePosition(position, axis) {
112
+ return {
113
+ x: position[axis][0],
114
+ y: position[axis][1],
115
+ z: position[axis][2],
116
+ };
117
+ }
118
+ drawCalculatorSphereOnEachViews(axis) {
119
+ this.setSphereCanvasSize(axis);
120
+ const ctx = this.ctx.protectedData.ctxes.drawingSphereCtx;
121
+ const canvas = this.ctx.protectedData.canvases.drawingSphereCanvas;
122
+ const nrrd = this.ctx.nrrd_states;
123
+ const tumourPosition = nrrd.tumourSphereOrigin
124
+ ? Object.assign(this.getSpherePosition(nrrd.tumourSphereOrigin, axis), { color: nrrd.tumourColor })
125
+ : null;
126
+ const skinPosition = nrrd.skinSphereOrigin
127
+ ? Object.assign(this.getSpherePosition(nrrd.skinSphereOrigin, axis), { color: nrrd.skinColor })
128
+ : null;
129
+ const ribcagePosition = nrrd.ribSphereOrigin
130
+ ? Object.assign(this.getSpherePosition(nrrd.ribSphereOrigin, axis), { color: nrrd.ribcageColor })
131
+ : null;
132
+ const nipplePosition = nrrd.nippleSphereOrigin
133
+ ? Object.assign(this.getSpherePosition(nrrd.nippleSphereOrigin, axis), { color: nrrd.nippleColor })
134
+ : null;
135
+ const positionGroup = [];
136
+ if (tumourPosition)
137
+ positionGroup.push(tumourPosition);
138
+ if (skinPosition)
139
+ positionGroup.push(skinPosition);
140
+ if (ribcagePosition)
141
+ positionGroup.push(ribcagePosition);
142
+ if (nipplePosition)
143
+ positionGroup.push(nipplePosition);
144
+ const copyPosition = JSON.parse(JSON.stringify(positionGroup));
145
+ const rePositionGroup = [];
146
+ positionGroup.forEach((p) => {
147
+ const temp = [];
148
+ const sameIndex = [];
149
+ for (let i = 0; i < copyPosition.length; i++) {
150
+ if (p.z == copyPosition[i].z) {
151
+ temp.push(copyPosition[i]);
152
+ sameIndex.push(i);
153
+ }
154
+ }
155
+ sameIndex.reverse();
156
+ sameIndex.forEach((i) => copyPosition.splice(i, 1));
157
+ if (temp.length > 0)
158
+ rePositionGroup.push(temp);
159
+ if (copyPosition.length == 0) {
160
+ return;
161
+ }
162
+ });
163
+ rePositionGroup.forEach((group) => {
164
+ group.forEach((p) => {
165
+ this.drawSphereCore(ctx, p.x, p.y, nrrd.sphereRadius, p.color);
166
+ });
167
+ this.storeSphereImages(group[0].z, axis);
168
+ ctx.clearRect(0, 0, canvas.width, canvas.height);
169
+ });
170
+ }
171
+ drawCalculatorSphere(radius) {
172
+ const [canvas, ctx] = this.clearSphereCanvas();
173
+ const nrrd = this.ctx.nrrd_states;
174
+ const axis = this.ctx.protectedData.axis;
175
+ if (nrrd.tumourSphereOrigin && nrrd.tumourSphereOrigin[axis][2] === nrrd.currentIndex) {
176
+ this.drawSphereCore(ctx, nrrd.tumourSphereOrigin[axis][0], nrrd.tumourSphereOrigin[axis][1], radius, nrrd.tumourColor);
177
+ }
178
+ if (nrrd.skinSphereOrigin && nrrd.skinSphereOrigin[axis][2] === nrrd.currentIndex) {
179
+ this.drawSphereCore(ctx, nrrd.skinSphereOrigin[axis][0], nrrd.skinSphereOrigin[axis][1], radius, nrrd.skinColor);
180
+ }
181
+ if (nrrd.ribSphereOrigin && nrrd.ribSphereOrigin[axis][2] === nrrd.currentIndex) {
182
+ this.drawSphereCore(ctx, nrrd.ribSphereOrigin[axis][0], nrrd.ribSphereOrigin[axis][1], radius, nrrd.ribcageColor);
183
+ }
184
+ if (nrrd.nippleSphereOrigin && nrrd.nippleSphereOrigin[axis][2] === nrrd.currentIndex) {
185
+ this.drawSphereCore(ctx, nrrd.nippleSphereOrigin[axis][0], nrrd.nippleSphereOrigin[axis][1], radius, nrrd.nippleColor);
186
+ }
187
+ this.ctx.protectedData.ctxes.drawingLayerMasterCtx.drawImage(canvas, 0, 0, nrrd.changedWidth, nrrd.changedHeight);
188
+ }
189
+ clearSpherePrintStoreImages() {
190
+ // No-op: sphere images are no longer stored in Phase 3 volumetric model
191
+ }
192
+ }
193
+ //# sourceMappingURL=SphereTool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SphereTool.js","sourceRoot":"","sources":["../../../../src/Utils/segmentation/tools/SphereTool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * ZoomTool - Mouse wheel zoom configuration
3
+ *
4
+ * Extracted from DrawToolCore.ts:
5
+ * - configMouseZoomWheel
6
+ */
7
+ import { BaseTool } from "./BaseTool";
8
+ import type { ToolContext } from "./BaseTool";
9
+ export interface ZoomCallbacks {
10
+ resetPaintAreaUIPosition: (l?: number, t?: number) => void;
11
+ resizePaintArea: (moveDistance: number) => void;
12
+ setIsDrawFalse: (target: number) => void;
13
+ }
14
+ export declare class ZoomTool extends BaseTool {
15
+ private container;
16
+ private mainAreaContainer;
17
+ private callbacks;
18
+ constructor(ctx: ToolContext, container: HTMLElement, mainAreaContainer: HTMLDivElement, callbacks: ZoomCallbacks);
19
+ configMouseZoomWheel(): (e: WheelEvent) => void;
20
+ }