copper3d 3.0.0 → 3.0.1

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 (45) hide show
  1. package/dist/Utils/segmentation/CommToolsData.d.ts +9 -10
  2. package/dist/Utils/segmentation/CommToolsData.js +4 -13
  3. package/dist/Utils/segmentation/CommToolsData.js.map +1 -1
  4. package/dist/Utils/segmentation/DragOperator.js +4 -4
  5. package/dist/Utils/segmentation/DragOperator.js.map +1 -1
  6. package/dist/Utils/segmentation/DrawToolCore.d.ts +5 -6
  7. package/dist/Utils/segmentation/DrawToolCore.js +57 -55
  8. package/dist/Utils/segmentation/DrawToolCore.js.map +1 -1
  9. package/dist/Utils/segmentation/NrrdTools.js +6 -2
  10. package/dist/Utils/segmentation/NrrdTools.js.map +1 -1
  11. package/dist/Utils/segmentation/core/MaskVolume.d.ts +0 -33
  12. package/dist/Utils/segmentation/core/MaskVolume.js +0 -121
  13. package/dist/Utils/segmentation/core/MaskVolume.js.map +1 -1
  14. package/dist/Utils/segmentation/coreTools/coreType.d.ts +0 -3
  15. package/dist/Utils/segmentation/coreTools/coreType.js.map +1 -1
  16. package/dist/Utils/segmentation/coreTools/gui.d.ts +6 -3
  17. package/dist/Utils/segmentation/coreTools/gui.js.map +1 -1
  18. package/dist/Utils/segmentation/eventRouter/EventRouter.d.ts +1 -0
  19. package/dist/Utils/segmentation/eventRouter/EventRouter.js +9 -3
  20. package/dist/Utils/segmentation/eventRouter/EventRouter.js.map +1 -1
  21. package/dist/Utils/segmentation/tools/BaseTool.d.ts +3 -0
  22. package/dist/Utils/segmentation/tools/BaseTool.js.map +1 -1
  23. package/dist/Utils/segmentation/tools/ImageStoreHelper.d.ts +10 -13
  24. package/dist/Utils/segmentation/tools/ImageStoreHelper.js +13 -27
  25. package/dist/Utils/segmentation/tools/ImageStoreHelper.js.map +1 -1
  26. package/dist/Utils/segmentation/tools/SphereTool.d.ts +1 -3
  27. package/dist/Utils/segmentation/tools/SphereTool.js +1 -1
  28. package/dist/Utils/segmentation/tools/SphereTool.js.map +1 -1
  29. package/dist/Utils/segmentation/tools/ZoomTool.js +2 -1
  30. package/dist/Utils/segmentation/tools/ZoomTool.js.map +1 -1
  31. package/dist/bundle.esm.js +97 -228
  32. package/dist/bundle.umd.js +97 -228
  33. package/dist/index.d.ts +1 -1
  34. package/dist/index.js +1 -1
  35. package/dist/types/Utils/segmentation/CommToolsData.d.ts +9 -10
  36. package/dist/types/Utils/segmentation/DrawToolCore.d.ts +5 -6
  37. package/dist/types/Utils/segmentation/core/MaskVolume.d.ts +0 -33
  38. package/dist/types/Utils/segmentation/coreTools/coreType.d.ts +0 -3
  39. package/dist/types/Utils/segmentation/coreTools/gui.d.ts +6 -3
  40. package/dist/types/Utils/segmentation/eventRouter/EventRouter.d.ts +1 -0
  41. package/dist/types/Utils/segmentation/tools/BaseTool.d.ts +3 -0
  42. package/dist/types/Utils/segmentation/tools/ImageStoreHelper.d.ts +10 -13
  43. package/dist/types/Utils/segmentation/tools/SphereTool.d.ts +1 -3
  44. package/dist/types/index.d.ts +1 -1
  45. package/package.json +1 -1
package/dist/index.d.ts CHANGED
@@ -21,6 +21,6 @@ import { IPaintImage, ICommXYZ, IGUIStates, IGuiParameterSettings, INrrdStates }
21
21
  import { CHANNEL_COLORS, CHANNEL_HEX_COLORS, rgbaToHex, rgbaToCss } from "./Utils/segmentation/core/index";
22
22
  import type { LayerId, ChannelValue } from "./Utils/segmentation/core/index";
23
23
  import "./css/style.css";
24
- export declare const REVISION = "v3.0.0-beta";
24
+ export declare const REVISION = "v3.0.1-beta";
25
25
  export { copperRenderer, copperRendererOnDemond, copperMSceneRenderer, setHDRFilePath, addLabelToScene, convert3DPostoScreenPos, convertScreenPosto3DPos, addBoxHelper, fullScreenListenner, configKiwriousHeart, copperScene, copperSceneOnDemond, copperMScene, CameraViewPoint, kiwrious, NrrdTools, loading, Copper3dTrackballControls, createTexture2D_NRRD, MeshNodeTool, throttle, removeGuiFolderChilden, CHANNEL_COLORS, CHANNEL_HEX_COLORS, rgbaToHex, rgbaToCss, };
26
26
  export type { positionType, screenPosType, optsType, nrrdMeshesType, nrrdSliceType, SensorDecodedValue_kiwrious, SensorReadResult_kiwrious, HeartRateResult_kiwrious, loadingBarType, IPaintImage, exportPaintImageType, IOptVTKLoader, ICommXYZ, IGUIStates, IGuiParameterSettings, INrrdStates, LayerId, ChannelValue, };
package/dist/index.js CHANGED
@@ -20,7 +20,7 @@ import { MeshNodeTool } from "./Utils/MeshNodeTool";
20
20
  import { removeGuiFolderChilden } from "./Utils/segmentation/coreTools/gui";
21
21
  import { CHANNEL_COLORS, CHANNEL_HEX_COLORS, rgbaToHex, rgbaToCss } from "./Utils/segmentation/core/index";
22
22
  import "./css/style.css";
23
- export const REVISION = "v3.0.0-beta";
23
+ export const REVISION = "v3.0.1-beta";
24
24
  console.log(`%cCopper3D Visualisation %cBeta:${REVISION}`, "padding: 3px;color:white; background:#023047", "padding: 3px;color:white; background:#f50a25");
25
25
  export { copperRenderer, copperRendererOnDemond, copperMSceneRenderer, setHDRFilePath, addLabelToScene, convert3DPostoScreenPos, convertScreenPosto3DPos, addBoxHelper, fullScreenListenner, configKiwriousHeart, copperScene, copperSceneOnDemond, copperMScene, CameraViewPoint, kiwrious, NrrdTools, loading, Copper3dTrackballControls, createTexture2D_NRRD, MeshNodeTool, throttle, removeGuiFolderChilden, CHANNEL_COLORS, CHANNEL_HEX_COLORS, rgbaToHex, rgbaToCss, };
26
26
  //# sourceMappingURL=index.js.map
@@ -1,4 +1,4 @@
1
- import { IProtected, IGUIStates, INrrdStates, ICursorPage, IPaintImage, IPaintImages, IConvertObjType, INewMaskData, IKeyBoardSettings } from "./coreTools/coreType";
1
+ import { IProtected, IGUIStates, INrrdStates, ICursorPage, IConvertObjType, INewMaskData, IKeyBoardSettings } from "./coreTools/coreType";
2
2
  import { MaskVolume } from "./core/index";
3
3
  export declare class CommToolsData {
4
4
  baseCanvasesSize: number;
@@ -71,10 +71,6 @@ export declare class CommToolsData {
71
71
  * Rewrite this {clearStoreImages} function under NrrdTools
72
72
  */
73
73
  clearStoreImages(): void;
74
- /**
75
- * Rewrite this {createEmptyPaintImage} function under NrrdTools
76
- */
77
- createEmptyPaintImage(dimensions: Array<number>, paintImages: IPaintImages): void;
78
74
  /**
79
75
  * Rewrite this {resizePaintArea} function under NrrdTools
80
76
  */
@@ -116,15 +112,18 @@ export declare class CommToolsData {
116
112
  */
117
113
  redrawDisplayCanvas(): void;
118
114
  /**
119
- * Get a painted mask image (IPaintImage) based on current axis and input slice index.
115
+ * Get a painted mask image based on current axis and input slice index.
120
116
  *
121
- * Phase 3: Reads directly from MaskVolume (no caching needed — reads are fast).
117
+ * Phase 3: Reads directly from MaskVolume.
122
118
  *
123
119
  * @param axis "x" | "y" | "z"
124
120
  * @param sliceIndex number
125
- * @returns IPaintImage with the mask for the given slice, or undefined if not found
121
+ * @returns Object with index and image, or undefined
126
122
  */
127
- filterDrawedImage(axis: "x" | "y" | "z", sliceIndex: number): IPaintImage | undefined;
123
+ filterDrawedImage(axis: "x" | "y" | "z", sliceIndex: number): {
124
+ index: number;
125
+ image: ImageData;
126
+ } | undefined;
128
127
  /**
129
128
  * Get or create a reusable ImageData buffer for the given axis.
130
129
  *
@@ -139,7 +138,7 @@ export declare class CommToolsData {
139
138
  /**
140
139
  * Render a layer's slice into a reusable buffer and draw to the target canvas.
141
140
  *
142
- * Uses MaskVolume.getSliceRawImageDataInto() for zero-allocation rendering.
141
+ * Uses MaskVolume.renderLabelSliceInto() for zero-allocation rendering.
143
142
  * The caller should obtain the buffer via getOrCreateSliceBuffer() and reuse
144
143
  * it across multiple layer renders.
145
144
  *
@@ -1,4 +1,4 @@
1
- import { IConvertObjType, IDrawingEvents, IContrastEvents, IDrawOpts, IPaintImages } from "./coreTools/coreType";
1
+ import { IConvertObjType, IDrawingEvents, IContrastEvents, IDrawOpts } from "./coreTools/coreType";
2
2
  import { CommToolsData } from "./CommToolsData";
3
3
  import { EventRouter } from "./eventRouter";
4
4
  import { SphereTool } from "./tools/SphereTool";
@@ -70,9 +70,9 @@ export declare class DrawToolCore extends CommToolsData {
70
70
  /**
71
71
  * Clear mask on current slice canvas.
72
72
  *
73
- * Phase 2: Clears the MaskVolume slice for all three layers,
74
- * re-stores, and notifies external via getMask callback with clearFlag=true.
75
- * Phase 6: Also records a MaskDelta for undo support.
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.
76
76
  */
77
77
  clearPaint(): void;
78
78
  /**
@@ -93,9 +93,8 @@ export declare class DrawToolCore extends CommToolsData {
93
93
  */
94
94
  private applyUndoRedoToCanvas;
95
95
  /****************************Store images (delegated to ImageStoreHelper)****************************************************/
96
- storeImageToAxis(index: number, paintedImages: IPaintImages, imageData: ImageData, axis?: "x" | "y" | "z"): void;
97
96
  storeAllImages(index: number, layer: string): void;
98
- storeImageToLayer(index: number, canvas: HTMLCanvasElement, paintedImages: IPaintImages): ImageData;
97
+ storeImageToLayer(index: number, canvas: HTMLCanvasElement): ImageData;
99
98
  storeEachLayerImage(index: number, layer: string): void;
100
99
  /******************************** Utils gui related functions (delegated to ContrastTool) ***************************************/
101
100
  setupConrastEvents(callback: (step: number, towards: "horizental" | "vertical") => void): void;
@@ -197,39 +197,6 @@ export declare class MaskVolume {
197
197
  * ```
198
198
  */
199
199
  setSliceFromImageData(sliceIndex: number, imageData: ImageData, axis?: 'x' | 'y' | 'z', channel?: number): void;
200
- /**
201
- * Extract a 2D slice as raw RGBA ImageData (lossless round-trip).
202
- *
203
- * Requires the volume to have **≥ 4 channels** (ch0=R, ch1=G, ch2=B, ch3=A).
204
- * Returns the exact pixel data that was stored via `setSliceFromImageData`,
205
- * bypassing all render modes.
206
- *
207
- * @param sliceIndex Index along the specified axis.
208
- * @param axis `'x'`, `'y'`, or `'z'` (default `'z'`).
209
- * @returns ImageData with the stored RGBA values.
210
- *
211
- * @throws {RangeError} If sliceIndex is out of bounds.
212
- * @throws {Error} If the volume has fewer than 4 channels.
213
- */
214
- getSliceRawImageData(sliceIndex: number, axis?: 'x' | 'y' | 'z'): ImageData;
215
- /**
216
- * Write slice data into an existing ImageData buffer (zero-allocation).
217
- *
218
- * Same semantics as {@link getSliceRawImageData} but avoids creating a new
219
- * ImageData object on every call. The caller is responsible for providing
220
- * a buffer whose dimensions match the expected slice size.
221
- *
222
- * All pixels are fully overwritten — no clearing is needed beforehand.
223
- *
224
- * @param sliceIndex Index along the specified axis.
225
- * @param axis `'x'`, `'y'`, or `'z'` (default `'z'`).
226
- * @param target Pre-allocated ImageData to write into.
227
- *
228
- * @throws {Error} If the volume has fewer than 4 channels.
229
- * @throws {RangeError} If sliceIndex is out of bounds.
230
- * @throws {Error} If target dimensions don't match the slice.
231
- */
232
- getSliceRawImageDataInto(sliceIndex: number, axis: "z" | "y" | "x" | undefined, target: ImageData): void;
233
200
  /**
234
201
  /**
235
202
  * Store label data from canvas RGBA ImageData into a 1-channel volume.
@@ -99,8 +99,6 @@ interface IProtected {
99
99
  skipSlicesDic: ISkipSlicesDictType;
100
100
  currentShowingSlice: any;
101
101
  mainPreSlices: any;
102
- Is_Shift_Pressed: boolean;
103
- Is_Ctrl_Pressed: boolean;
104
102
  Is_Draw: boolean;
105
103
  axis: "x" | "y" | "z";
106
104
  maskData: IMaskData;
@@ -186,7 +184,6 @@ interface INrrdStates {
186
184
  ratios: ICommXYZ;
187
185
  contrastNum: number;
188
186
  showContrast: boolean;
189
- enableCursorChoose: boolean;
190
187
  isCursorSelect: boolean;
191
188
  cursorPageX: number;
192
189
  cursorPageY: number;
@@ -1,5 +1,5 @@
1
1
  import { GUI } from "dat.gui";
2
- import { IDrawingEvents, IGUIStates, IProtected, INrrdStates, IPaintImages, IPaintImage, IGuiParameterSettings } from "./coreType";
2
+ import { IDrawingEvents, IGUIStates, IProtected, INrrdStates, IGuiParameterSettings } from "./coreType";
3
3
  import { DragOperator } from "../DragOperator";
4
4
  interface IConfigGUI {
5
5
  modeFolder: GUI;
@@ -26,12 +26,15 @@ interface IConfigGUI {
26
26
  resetLayerCanvas: () => void;
27
27
  redrawDisplayCanvas: () => void;
28
28
  flipDisplayImageByAxis: () => void;
29
- filterDrawedImage: (axis: "x" | "y" | "z", sliceIndex: number) => IPaintImage | undefined;
29
+ filterDrawedImage: (axis: "x" | "y" | "z", sliceIndex: number) => {
30
+ index: number;
31
+ image: ImageData;
32
+ } | undefined;
30
33
  setEmptyCanvasSize: (axis?: "x" | "y" | "z") => void;
31
34
  storeAllImages: (index: number, layer: string) => void;
32
35
  drawImageOnEmptyImage: (canvas: HTMLCanvasElement) => void;
33
36
  storeEachLayerImage: (index: number, layer: string) => void;
34
- storeImageToLayer: (index: number, canvas: HTMLCanvasElement, paintedImages: IPaintImages) => ImageData;
37
+ storeImageToLayer: (index: number, canvas: HTMLCanvasElement) => ImageData;
35
38
  getRestLayer: () => string[];
36
39
  setIsDrawFalse: (target: number) => void;
37
40
  }
@@ -72,6 +72,7 @@ export declare class EventRouter {
72
72
  setGuiTool(tool: GuiTool): void;
73
73
  /**
74
74
  * Toggle crosshair mode.
75
+ * Blocked when draw or contrast mode is active (mutual exclusion).
75
76
  */
76
77
  toggleCrosshair(): void;
77
78
  /**
@@ -8,6 +8,7 @@
8
8
  * The new SegmentationManager system has its own tools in manager/tools/.
9
9
  */
10
10
  import type { INrrdStates, IGUIStates, IProtected, ICursorPage } from "../coreTools/coreType";
11
+ import type { EventRouter } from "../eventRouter/EventRouter";
11
12
  /**
12
13
  * Shared context injected into every legacy tool.
13
14
  * References are shared (not copied), so tools see the same state.
@@ -17,6 +18,8 @@ export interface ToolContext {
17
18
  gui_states: IGUIStates;
18
19
  protectedData: IProtected;
19
20
  cursorPage: ICursorPage;
21
+ /** EventRouter reference for mode/state queries. Set after initDrawToolCore(). */
22
+ eventRouter?: EventRouter;
20
23
  }
21
24
  export declare abstract class BaseTool {
22
25
  protected ctx: ToolContext;
@@ -4,12 +4,10 @@
4
4
  * Extracted from DrawToolCore.ts:
5
5
  * - storeAllImages / storeImageToAxis / storeImageToLayer / storeEachLayerImage
6
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.
7
+ * Phase 3: MaskVolume is the sole storage backend. All IPaintImages params removed.
9
8
  */
10
9
  import { BaseTool } from "./BaseTool";
11
10
  import type { ToolContext } from "./BaseTool";
12
- import type { IPaintImage, IPaintImages } from "../coreTools/coreType";
13
11
  export interface ImageStoreCallbacks {
14
12
  setEmptyCanvasSize: (axis?: "x" | "y" | "z") => void;
15
13
  drawImageOnEmptyImage: (canvas: HTMLCanvasElement) => void;
@@ -34,17 +32,18 @@ export declare class ImageStoreHelper extends BaseTool {
34
32
  */
35
33
  private getCanvasForLayer;
36
34
  /**
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.
35
+ * Phase 3: No-op MaskVolume storage happens in storeAllImages.
40
36
  */
41
- storeImageToAxis(_index: number, _paintedImages: IPaintImages, _imageData: ImageData, _axis?: "x" | "y" | "z"): void;
37
+ storeImageToAxis(_index: number, _imageData: ImageData, _axis?: "x" | "y" | "z"): void;
42
38
  /**
43
39
  * Retrieve the drawn image for a given axis and slice.
44
40
  *
45
- * Phase 3: Reads exclusively from MaskVolume (no legacy fallback).
41
+ * Phase 3: Reads exclusively from MaskVolume.
46
42
  */
47
- filterDrawedImage(axis: "x" | "y" | "z", sliceIndex: number, _paintedImages: IPaintImages): IPaintImage | undefined;
43
+ filterDrawedImage(axis: "x" | "y" | "z", sliceIndex: number): {
44
+ index: number;
45
+ image: ImageData;
46
+ } | undefined;
48
47
  /**
49
48
  * Store all layer images for the current slice (cross-axis sync).
50
49
  *
@@ -57,9 +56,7 @@ export declare class ImageStoreHelper extends BaseTool {
57
56
  */
58
57
  storeEachLayerImage(index: number, layer: string): void;
59
58
  /**
60
- * Phase 3: Simplified - extracts ImageData from canvas but no longer stores to paintImages.
61
- * Kept for backward compatibility with existing call sites.
59
+ * Extract ImageData from canvas (MaskVolume storage is handled in storeAllImages).
62
60
  */
63
- storeImageToLayer(_index: number, canvas: HTMLCanvasElement, _paintedImages: IPaintImages): ImageData;
64
- private hasNonZeroPixels;
61
+ storeImageToLayer(_index: number, canvas: HTMLCanvasElement): ImageData;
65
62
  }
@@ -10,15 +10,13 @@
10
10
  */
11
11
  import { BaseTool } from "./BaseTool";
12
12
  import type { ToolContext } from "./BaseTool";
13
- import type { IPaintImages } from "../coreTools/coreType";
14
13
  /**
15
14
  * Callbacks that DrawToolCore must provide for sphere operations.
16
15
  */
17
16
  export interface SphereCallbacks {
18
17
  setEmptyCanvasSize: (axis?: "x" | "y" | "z") => void;
19
18
  drawImageOnEmptyImage: (canvas: HTMLCanvasElement) => void;
20
- storeImageToAxis: (index: number, paintedImages: IPaintImages, imageData: ImageData, axis?: "x" | "y" | "z") => void;
21
- createEmptyPaintImage: (dimensions: number[], paintImages: IPaintImages) => void;
19
+ storeImageToAxis: (index: number, imageData: ImageData, axis?: "x" | "y" | "z") => void;
22
20
  }
23
21
  export declare class SphereTool extends BaseTool {
24
22
  private callbacks;
@@ -21,6 +21,6 @@ import { IPaintImage, ICommXYZ, IGUIStates, IGuiParameterSettings, INrrdStates }
21
21
  import { CHANNEL_COLORS, CHANNEL_HEX_COLORS, rgbaToHex, rgbaToCss } from "./Utils/segmentation/core/index";
22
22
  import type { LayerId, ChannelValue } from "./Utils/segmentation/core/index";
23
23
  import "./css/style.css";
24
- export declare const REVISION = "v3.0.0-beta";
24
+ export declare const REVISION = "v3.0.1-beta";
25
25
  export { copperRenderer, copperRendererOnDemond, copperMSceneRenderer, setHDRFilePath, addLabelToScene, convert3DPostoScreenPos, convertScreenPosto3DPos, addBoxHelper, fullScreenListenner, configKiwriousHeart, copperScene, copperSceneOnDemond, copperMScene, CameraViewPoint, kiwrious, NrrdTools, loading, Copper3dTrackballControls, createTexture2D_NRRD, MeshNodeTool, throttle, removeGuiFolderChilden, CHANNEL_COLORS, CHANNEL_HEX_COLORS, rgbaToHex, rgbaToCss, };
26
26
  export type { positionType, screenPosType, optsType, nrrdMeshesType, nrrdSliceType, SensorDecodedValue_kiwrious, SensorReadResult_kiwrious, HeartRateResult_kiwrious, loadingBarType, IPaintImage, exportPaintImageType, IOptVTKLoader, ICommXYZ, IGUIStates, IGuiParameterSettings, INrrdStates, LayerId, ChannelValue, };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "copper3d",
3
3
  "description": "A 3d visualisation package base on threejs provides multiple scenes and Nrrd image load funtion.",
4
- "version": "3.0.0",
4
+ "version": "3.0.1",
5
5
  "main": "dist/bundle.umd.js",
6
6
  "moudle": "dist/bundle.esm.js",
7
7
  "types": "dist/types/index.d.ts",