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,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PanTool - Right-click pan/drag navigation
|
|
3
|
+
*
|
|
4
|
+
* Extracted from DrawToolCore.paintOnCanvas() closure.
|
|
5
|
+
* Handles right-click drag to reposition the canvas view.
|
|
6
|
+
*/
|
|
7
|
+
import { BaseTool } from "./BaseTool";
|
|
8
|
+
export class PanTool extends BaseTool {
|
|
9
|
+
constructor(ctx, callbacks) {
|
|
10
|
+
super(ctx);
|
|
11
|
+
/** Right mouse button currently held */
|
|
12
|
+
this.rightClicked = false;
|
|
13
|
+
/** Pan drag offset X (clientX − canvas.offsetLeft at drag start) */
|
|
14
|
+
this.panMoveInnerX = 0;
|
|
15
|
+
/** Pan drag offset Y (clientY − canvas.offsetTop at drag start) */
|
|
16
|
+
this.panMoveInnerY = 0;
|
|
17
|
+
/**
|
|
18
|
+
* Bound handler reference for pointermove so we can add/remove it.
|
|
19
|
+
* Arrow function preserves `this` binding.
|
|
20
|
+
*/
|
|
21
|
+
this.boundPointerMove = (e) => {
|
|
22
|
+
this.handlePointerMove(e);
|
|
23
|
+
};
|
|
24
|
+
this.callbacks = callbacks;
|
|
25
|
+
}
|
|
26
|
+
/** Whether a pan drag is currently active */
|
|
27
|
+
get isActive() {
|
|
28
|
+
return this.rightClicked;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Called on right-click pointerdown.
|
|
32
|
+
* Captures initial offsets and registers pointermove listener.
|
|
33
|
+
*/
|
|
34
|
+
onPointerDown(e) {
|
|
35
|
+
this.rightClicked = true;
|
|
36
|
+
const offsetX = this.ctx.protectedData.canvases.drawingCanvas.offsetLeft;
|
|
37
|
+
const offsetY = this.ctx.protectedData.canvases.drawingCanvas.offsetTop;
|
|
38
|
+
this.panMoveInnerX = e.clientX - offsetX;
|
|
39
|
+
this.panMoveInnerY = e.clientY - offsetY;
|
|
40
|
+
this.ctx.protectedData.canvases.drawingCanvas.style.cursor = "grab";
|
|
41
|
+
this.ctx.protectedData.canvases.drawingCanvas.addEventListener("pointermove", this.boundPointerMove);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Called on pointerup (button === 2).
|
|
45
|
+
* Cleans up listeners and restores cursor.
|
|
46
|
+
*/
|
|
47
|
+
onPointerUp(e, defaultCursor) {
|
|
48
|
+
this.rightClicked = false;
|
|
49
|
+
this.ctx.protectedData.canvases.drawingCanvas.style.cursor = "grab";
|
|
50
|
+
setTimeout(() => {
|
|
51
|
+
this.ctx.protectedData.canvases.drawingCanvas.style.cursor = defaultCursor;
|
|
52
|
+
}, 2000);
|
|
53
|
+
this.ctx.protectedData.canvases.drawingCanvas.removeEventListener("pointermove", this.boundPointerMove);
|
|
54
|
+
if (this.ctx.gui_states.mode.sphere) {
|
|
55
|
+
this.callbacks.zoomActionAfterDrawSphere();
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Called on pointerleave while pan is active.
|
|
60
|
+
* Resets state and removes listener.
|
|
61
|
+
*/
|
|
62
|
+
onPointerLeave() {
|
|
63
|
+
if (!this.rightClicked)
|
|
64
|
+
return;
|
|
65
|
+
this.rightClicked = false;
|
|
66
|
+
this.ctx.protectedData.canvases.drawingCanvas.style.cursor = "grab";
|
|
67
|
+
this.ctx.protectedData.canvases.drawingCanvas.removeEventListener("pointermove", this.boundPointerMove);
|
|
68
|
+
}
|
|
69
|
+
/** Reset pan state (called when paintOnCanvas re-initializes) */
|
|
70
|
+
reset() {
|
|
71
|
+
this.rightClicked = false;
|
|
72
|
+
this.panMoveInnerX = 0;
|
|
73
|
+
this.panMoveInnerY = 0;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Pointermove handler — updates canvas position during drag.
|
|
77
|
+
*/
|
|
78
|
+
handlePointerMove(e) {
|
|
79
|
+
this.ctx.protectedData.canvases.drawingCanvas.style.cursor = "grabbing";
|
|
80
|
+
this.ctx.nrrd_states.view.previousPanelL = e.clientX - this.panMoveInnerX;
|
|
81
|
+
this.ctx.nrrd_states.view.previousPanelT = e.clientY - this.panMoveInnerY;
|
|
82
|
+
this.ctx.protectedData.canvases.displayCanvas.style.left =
|
|
83
|
+
this.ctx.protectedData.canvases.drawingCanvas.style.left =
|
|
84
|
+
this.ctx.nrrd_states.view.previousPanelL + "px";
|
|
85
|
+
this.ctx.protectedData.canvases.displayCanvas.style.top =
|
|
86
|
+
this.ctx.protectedData.canvases.drawingCanvas.style.top =
|
|
87
|
+
this.ctx.nrrd_states.view.previousPanelT + "px";
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=PanTool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PanTool.js","sourceRoot":"","sources":["../../../../src/Utils/segmentation/tools/PanTool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { BaseTool } from "./BaseTool";
|
|
2
|
+
import type { ToolContext } from "./BaseTool";
|
|
3
|
+
import type { SliceRenderHostDeps } from "./ToolHost";
|
|
4
|
+
/**
|
|
5
|
+
* Manages slice rendering pipeline: slice setup, canvas rendering, and view helpers.
|
|
6
|
+
*
|
|
7
|
+
* Extracted from NrrdTools.ts to reduce its size.
|
|
8
|
+
* Follows the same BaseTool + ToolContext + Callbacks pattern as other tools.
|
|
9
|
+
*/
|
|
10
|
+
export declare class SliceRenderPipeline extends BaseTool {
|
|
11
|
+
private callbacks;
|
|
12
|
+
private initState;
|
|
13
|
+
constructor(ctx: ToolContext, callbacks: SliceRenderHostDeps);
|
|
14
|
+
/**
|
|
15
|
+
* Reset initState to true (called from NrrdTools.reset() when switching datasets).
|
|
16
|
+
*/
|
|
17
|
+
resetInitState(): void;
|
|
18
|
+
/****************************Slice Setup****************************************************/
|
|
19
|
+
setDisplaySlicesBaseOnAxis(): void;
|
|
20
|
+
private loadDisplaySlicesArray;
|
|
21
|
+
resetDisplaySlicesStatus(): void;
|
|
22
|
+
private setupConfigs;
|
|
23
|
+
private setMainPreSlice;
|
|
24
|
+
private setOriginCanvasAndPre;
|
|
25
|
+
afterLoadSlice(): void;
|
|
26
|
+
private updateMaxIndex;
|
|
27
|
+
/****************************Rendering****************************************************/
|
|
28
|
+
/**
|
|
29
|
+
* Phase 3: Reload all mask layers from MaskVolume using buffer reuse
|
|
30
|
+
* Replaces the old reloadMaskToLayer approach
|
|
31
|
+
*/
|
|
32
|
+
reloadMasksFromVolume(): void;
|
|
33
|
+
/******************************** redraw display canvas ***************************************/
|
|
34
|
+
/**
|
|
35
|
+
* Redraw current contrast image to display canvas.
|
|
36
|
+
* It is more related to change the contrast slice image's window width or center.
|
|
37
|
+
*/
|
|
38
|
+
redrawDisplayCanvas(): void;
|
|
39
|
+
redrawMianPreOnDisplayCanvas(): void;
|
|
40
|
+
/**
|
|
41
|
+
* flip the canvas to a correct position.
|
|
42
|
+
* This is because the slice canvas from threejs is not in a correct 2D postion.
|
|
43
|
+
* Thus, everytime when we redraw the display canvas, we need to flip to draw the origin canvas from threejs.
|
|
44
|
+
* Under different axis(sagittal, Axial, Coronal), the flip orientation is different.
|
|
45
|
+
*/
|
|
46
|
+
flipDisplayImageByAxis(): void;
|
|
47
|
+
/**
|
|
48
|
+
* Set the empty canvas width and height based on the axis (pixel distance not the mm), to reduce duplicate codes.
|
|
49
|
+
*
|
|
50
|
+
* @param axis
|
|
51
|
+
*/
|
|
52
|
+
setEmptyCanvasSize(axis?: "x" | "y" | "z"): void;
|
|
53
|
+
/**
|
|
54
|
+
* Clear masks on drawingCanvas layers.
|
|
55
|
+
*/
|
|
56
|
+
resetLayerCanvas(): void;
|
|
57
|
+
/****************************View/Canvas Helpers****************************************************/
|
|
58
|
+
/**
|
|
59
|
+
* Resize the draw and display canvas size based on the input size factor number.
|
|
60
|
+
* @param factor number
|
|
61
|
+
*/
|
|
62
|
+
resizePaintArea(factor: number): void;
|
|
63
|
+
/**
|
|
64
|
+
* Reset the draw and display canvases layout after mouse pan.
|
|
65
|
+
* If no params in, then center the draw and display canvases.
|
|
66
|
+
* @param l number, Offset to the left
|
|
67
|
+
* @param t number, Offset to the top
|
|
68
|
+
*/
|
|
69
|
+
resetPaintAreaUIPosition(l?: number, t?: number): void;
|
|
70
|
+
/**
|
|
71
|
+
* Update the original canvas size, allow set to threejs load one (pixel distance not the mm).
|
|
72
|
+
* Then update the changedWidth and changedHeight based on the sizeFactor.
|
|
73
|
+
*/
|
|
74
|
+
updateOriginAndChangedWH(): void;
|
|
75
|
+
/**
|
|
76
|
+
* Keep all contrast slice index to same.
|
|
77
|
+
* Synchronize the slice indexes of all the contrasts so that they are consistent with the main slice's index.
|
|
78
|
+
*/
|
|
79
|
+
setSyncsliceNum(): void;
|
|
80
|
+
}
|
|
@@ -0,0 +1,355 @@
|
|
|
1
|
+
import { BaseTool } from "./BaseTool";
|
|
2
|
+
/**
|
|
3
|
+
* Manages slice rendering pipeline: slice setup, canvas rendering, and view helpers.
|
|
4
|
+
*
|
|
5
|
+
* Extracted from NrrdTools.ts to reduce its size.
|
|
6
|
+
* Follows the same BaseTool + ToolContext + Callbacks pattern as other tools.
|
|
7
|
+
*/
|
|
8
|
+
export class SliceRenderPipeline extends BaseTool {
|
|
9
|
+
constructor(ctx, callbacks) {
|
|
10
|
+
super(ctx);
|
|
11
|
+
this.initState = true;
|
|
12
|
+
this.callbacks = callbacks;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Reset initState to true (called from NrrdTools.reset() when switching datasets).
|
|
16
|
+
*/
|
|
17
|
+
resetInitState() {
|
|
18
|
+
this.initState = true;
|
|
19
|
+
}
|
|
20
|
+
/****************************Slice Setup****************************************************/
|
|
21
|
+
setDisplaySlicesBaseOnAxis() {
|
|
22
|
+
this.ctx.protectedData.displaySlices.length = 0;
|
|
23
|
+
this.ctx.protectedData.backUpDisplaySlices.length = 0;
|
|
24
|
+
this.ctx.protectedData.allSlicesArray.forEach((slices) => {
|
|
25
|
+
this.ctx.protectedData.backUpDisplaySlices.push(slices[this.ctx.protectedData.axis]);
|
|
26
|
+
});
|
|
27
|
+
this.loadDisplaySlicesArray();
|
|
28
|
+
}
|
|
29
|
+
loadDisplaySlicesArray() {
|
|
30
|
+
const remainSlices = Object.values(this.ctx.protectedData.skipSlicesDic);
|
|
31
|
+
if (remainSlices.length === 0) {
|
|
32
|
+
// load all display slices
|
|
33
|
+
this.ctx.protectedData.backUpDisplaySlices.forEach((slice, index) => {
|
|
34
|
+
this.ctx.protectedData.skipSlicesDic[index] = slice;
|
|
35
|
+
this.ctx.protectedData.displaySlices.push(slice);
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
remainSlices.forEach((slice, index) => {
|
|
40
|
+
if (!!slice) {
|
|
41
|
+
this.ctx.protectedData.displaySlices.push(this.ctx.protectedData.backUpDisplaySlices[index]);
|
|
42
|
+
this.ctx.protectedData.skipSlicesDic[index] =
|
|
43
|
+
this.ctx.protectedData.backUpDisplaySlices[index];
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
resetDisplaySlicesStatus() {
|
|
49
|
+
// reload slice data
|
|
50
|
+
this.setDisplaySlicesBaseOnAxis();
|
|
51
|
+
// reset canvas attribute for drag and draw
|
|
52
|
+
this.setupConfigs();
|
|
53
|
+
}
|
|
54
|
+
setupConfigs() {
|
|
55
|
+
// reset main slice
|
|
56
|
+
this.setMainPreSlice();
|
|
57
|
+
// update the max index for drag and slider
|
|
58
|
+
this.updateMaxIndex();
|
|
59
|
+
// reset origin canvas and the nrrd_states origin Width/height
|
|
60
|
+
// reset the current index
|
|
61
|
+
// (also calls resizePaintArea → reloads masks, resizes canvases)
|
|
62
|
+
this.setOriginCanvasAndPre();
|
|
63
|
+
// update the show number div on top area
|
|
64
|
+
this.callbacks.updateShowNumDiv(this.ctx.nrrd_states.view.contrastNum);
|
|
65
|
+
// repaint all contrast images
|
|
66
|
+
this.callbacks.repraintCurrentContrastSlice();
|
|
67
|
+
// Refresh display after contrast repaint (no need for full resizePaintArea
|
|
68
|
+
// since canvases were already resized in setOriginCanvasAndPre above)
|
|
69
|
+
this.redrawDisplayCanvas();
|
|
70
|
+
this.callbacks.compositeAllLayers();
|
|
71
|
+
// Sync slider metadata with current volume (replaces old getGuiSettings() side-effect)
|
|
72
|
+
this.callbacks.syncGuiParameterSettings();
|
|
73
|
+
}
|
|
74
|
+
setMainPreSlice() {
|
|
75
|
+
this.ctx.protectedData.mainPreSlices = this.ctx.protectedData.displaySlices[0];
|
|
76
|
+
if (this.ctx.protectedData.mainPreSlices) {
|
|
77
|
+
this.ctx.nrrd_states.image.RSARatio = this.ctx.protectedData.mainPreSlices.RSARatio;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
setOriginCanvasAndPre() {
|
|
81
|
+
if (this.ctx.protectedData.mainPreSlices) {
|
|
82
|
+
if (this.ctx.nrrd_states.view.preSliceIndex > this.ctx.nrrd_states.view.maxIndex)
|
|
83
|
+
this.ctx.nrrd_states.view.preSliceIndex = this.ctx.nrrd_states.view.maxIndex;
|
|
84
|
+
if (this.initState) {
|
|
85
|
+
this.ctx.nrrd_states.view.preSliceIndex =
|
|
86
|
+
this.ctx.protectedData.mainPreSlices.initIndex *
|
|
87
|
+
this.ctx.nrrd_states.image.RSARatio;
|
|
88
|
+
this.ctx.nrrd_states.view.currentSliceIndex =
|
|
89
|
+
this.ctx.protectedData.mainPreSlices.initIndex;
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
// !need to change
|
|
93
|
+
// todo
|
|
94
|
+
this.ctx.protectedData.mainPreSlices.index = this.ctx.nrrd_states.view.preSliceIndex;
|
|
95
|
+
}
|
|
96
|
+
this.ctx.protectedData.canvases.originCanvas =
|
|
97
|
+
this.ctx.protectedData.mainPreSlices.canvas;
|
|
98
|
+
this.updateOriginAndChangedWH();
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
afterLoadSlice() {
|
|
102
|
+
this.setMainPreSlice();
|
|
103
|
+
this.setOriginCanvasAndPre();
|
|
104
|
+
this.ctx.protectedData.currentShowingSlice = this.ctx.protectedData.mainPreSlices;
|
|
105
|
+
this.ctx.nrrd_states.view.preSliceIndex =
|
|
106
|
+
this.ctx.protectedData.mainPreSlices.initIndex * this.ctx.nrrd_states.image.RSARatio;
|
|
107
|
+
this.ctx.nrrd_states.view.currentSliceIndex = this.ctx.protectedData.mainPreSlices.initIndex;
|
|
108
|
+
// Phase 6: Reset undo/redo stacks on new dataset load
|
|
109
|
+
this.callbacks.clearUndoHistory();
|
|
110
|
+
// compute max index
|
|
111
|
+
this.updateMaxIndex();
|
|
112
|
+
this.callbacks.updateShowNumDiv(this.ctx.nrrd_states.view.contrastNum);
|
|
113
|
+
this.callbacks.syncGuiParameterSettings();
|
|
114
|
+
this.initState = false;
|
|
115
|
+
}
|
|
116
|
+
updateMaxIndex() {
|
|
117
|
+
if (this.ctx.protectedData.mainPreSlices) {
|
|
118
|
+
this.ctx.nrrd_states.view.maxIndex = this.ctx.protectedData.mainPreSlices.MaxIndex;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/****************************Rendering****************************************************/
|
|
122
|
+
/**
|
|
123
|
+
* Phase 3: Reload all mask layers from MaskVolume using buffer reuse
|
|
124
|
+
* Replaces the old reloadMaskToLayer approach
|
|
125
|
+
*/
|
|
126
|
+
reloadMasksFromVolume() {
|
|
127
|
+
// When sphere mode is active, do NOT redraw layer masks.
|
|
128
|
+
// Layer mask data should remain hidden until the user exits sphere mode.
|
|
129
|
+
if (this.ctx.gui_states.mode.sphere) {
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
const axis = this.ctx.protectedData.axis;
|
|
133
|
+
let sliceIndex = this.ctx.nrrd_states.view.currentSliceIndex;
|
|
134
|
+
// Clamp sliceIndex to valid range for current axis
|
|
135
|
+
// (currentSliceIndex may not be updated yet when switching axes)
|
|
136
|
+
try {
|
|
137
|
+
const vol = this.callbacks.getVolumeForLayer(this.ctx.nrrd_states.image.layers[0]);
|
|
138
|
+
const dims = vol.getDimensions();
|
|
139
|
+
const maxSlice = axis === "x" ? dims.width : axis === "y" ? dims.height : dims.depth;
|
|
140
|
+
if (sliceIndex >= maxSlice)
|
|
141
|
+
sliceIndex = maxSlice - 1;
|
|
142
|
+
if (sliceIndex < 0)
|
|
143
|
+
sliceIndex = 0;
|
|
144
|
+
}
|
|
145
|
+
catch ( /* volume not ready */_a) { /* volume not ready */ }
|
|
146
|
+
// Get a single reusable buffer shared across all layer renders
|
|
147
|
+
const buffer = this.callbacks.getOrCreateSliceBuffer(axis);
|
|
148
|
+
if (!buffer)
|
|
149
|
+
return;
|
|
150
|
+
const w = this.ctx.nrrd_states.view.changedWidth;
|
|
151
|
+
const h = this.ctx.nrrd_states.view.changedHeight;
|
|
152
|
+
// Clear and render each layer using the shared buffer
|
|
153
|
+
for (const layerId of this.ctx.nrrd_states.image.layers) {
|
|
154
|
+
const target = this.ctx.protectedData.layerTargets.get(layerId);
|
|
155
|
+
if (!target)
|
|
156
|
+
continue;
|
|
157
|
+
target.ctx.clearRect(0, 0, w, h);
|
|
158
|
+
this.callbacks.renderSliceToCanvas(layerId, axis, sliceIndex, buffer, target.ctx, w, h);
|
|
159
|
+
}
|
|
160
|
+
// Composite all layers to master canvas
|
|
161
|
+
this.callbacks.compositeAllLayers();
|
|
162
|
+
}
|
|
163
|
+
/******************************** redraw display canvas ***************************************/
|
|
164
|
+
/**
|
|
165
|
+
* Redraw current contrast image to display canvas.
|
|
166
|
+
* It is more related to change the contrast slice image's window width or center.
|
|
167
|
+
*/
|
|
168
|
+
redrawDisplayCanvas() {
|
|
169
|
+
var _a, _b, _c;
|
|
170
|
+
this.callbacks.updateCurrentContrastSlice();
|
|
171
|
+
this.ctx.protectedData.canvases.displayCanvas.width =
|
|
172
|
+
this.ctx.protectedData.canvases.displayCanvas.width;
|
|
173
|
+
this.ctx.protectedData.canvases.displayCanvas.height =
|
|
174
|
+
this.ctx.protectedData.canvases.displayCanvas.height;
|
|
175
|
+
this.ctx.protectedData.canvases.originCanvas.width =
|
|
176
|
+
this.ctx.protectedData.canvases.originCanvas.width;
|
|
177
|
+
if (this.ctx.protectedData.currentShowingSlice) {
|
|
178
|
+
this.ctx.protectedData.currentShowingSlice.repaint.call(this.ctx.protectedData.currentShowingSlice);
|
|
179
|
+
(_a = this.ctx.protectedData.ctxes.displayCtx) === null || _a === void 0 ? void 0 : _a.save();
|
|
180
|
+
this.flipDisplayImageByAxis();
|
|
181
|
+
(_b = this.ctx.protectedData.ctxes.displayCtx) === null || _b === void 0 ? void 0 : _b.drawImage(this.ctx.protectedData.currentShowingSlice.canvas, 0, 0, this.ctx.nrrd_states.view.changedWidth, this.ctx.nrrd_states.view.changedHeight);
|
|
182
|
+
(_c = this.ctx.protectedData.ctxes.displayCtx) === null || _c === void 0 ? void 0 : _c.restore();
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
redrawMianPreOnDisplayCanvas() {
|
|
186
|
+
var _a;
|
|
187
|
+
this.ctx.protectedData.canvases.displayCanvas.width =
|
|
188
|
+
this.ctx.protectedData.canvases.displayCanvas.width;
|
|
189
|
+
this.ctx.protectedData.canvases.displayCanvas.height =
|
|
190
|
+
this.ctx.protectedData.canvases.displayCanvas.height;
|
|
191
|
+
this.ctx.protectedData.canvases.originCanvas.width =
|
|
192
|
+
this.ctx.protectedData.canvases.originCanvas.width;
|
|
193
|
+
if (this.ctx.protectedData.mainPreSlices) {
|
|
194
|
+
this.ctx.protectedData.mainPreSlices.repaint.call(this.ctx.protectedData.mainPreSlices);
|
|
195
|
+
this.flipDisplayImageByAxis();
|
|
196
|
+
(_a = this.ctx.protectedData.ctxes.displayCtx) === null || _a === void 0 ? void 0 : _a.drawImage(this.ctx.protectedData.canvases.originCanvas, 0, 0, this.ctx.nrrd_states.view.changedWidth, this.ctx.nrrd_states.view.changedHeight);
|
|
197
|
+
this.resizePaintArea(this.ctx.nrrd_states.view.sizeFactor);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* flip the canvas to a correct position.
|
|
202
|
+
* This is because the slice canvas from threejs is not in a correct 2D postion.
|
|
203
|
+
* Thus, everytime when we redraw the display canvas, we need to flip to draw the origin canvas from threejs.
|
|
204
|
+
* Under different axis(sagittal, Axial, Coronal), the flip orientation is different.
|
|
205
|
+
*/
|
|
206
|
+
flipDisplayImageByAxis() {
|
|
207
|
+
var _a, _b, _c, _d, _e, _f;
|
|
208
|
+
if (this.ctx.protectedData.axis === "x") {
|
|
209
|
+
(_a = this.ctx.protectedData.ctxes.displayCtx) === null || _a === void 0 ? void 0 : _a.scale(-1, -1);
|
|
210
|
+
(_b = this.ctx.protectedData.ctxes.displayCtx) === null || _b === void 0 ? void 0 : _b.translate(-this.ctx.nrrd_states.view.changedWidth, -this.ctx.nrrd_states.view.changedHeight);
|
|
211
|
+
}
|
|
212
|
+
else if (this.ctx.protectedData.axis === "z") {
|
|
213
|
+
(_c = this.ctx.protectedData.ctxes.displayCtx) === null || _c === void 0 ? void 0 : _c.scale(1, -1);
|
|
214
|
+
(_d = this.ctx.protectedData.ctxes.displayCtx) === null || _d === void 0 ? void 0 : _d.translate(0, -this.ctx.nrrd_states.view.changedHeight);
|
|
215
|
+
}
|
|
216
|
+
else if (this.ctx.protectedData.axis === "y") {
|
|
217
|
+
(_e = this.ctx.protectedData.ctxes.displayCtx) === null || _e === void 0 ? void 0 : _e.scale(1, -1);
|
|
218
|
+
(_f = this.ctx.protectedData.ctxes.displayCtx) === null || _f === void 0 ? void 0 : _f.translate(0, -this.ctx.nrrd_states.view.changedHeight);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Set the empty canvas width and height based on the axis (pixel distance not the mm), to reduce duplicate codes.
|
|
223
|
+
*
|
|
224
|
+
* @param axis
|
|
225
|
+
*/
|
|
226
|
+
setEmptyCanvasSize(axis) {
|
|
227
|
+
switch (!!axis ? axis : this.ctx.protectedData.axis) {
|
|
228
|
+
case "x":
|
|
229
|
+
this.ctx.protectedData.canvases.emptyCanvas.width =
|
|
230
|
+
this.ctx.nrrd_states.image.nrrd_z_pixel;
|
|
231
|
+
this.ctx.protectedData.canvases.emptyCanvas.height =
|
|
232
|
+
this.ctx.nrrd_states.image.nrrd_y_pixel;
|
|
233
|
+
break;
|
|
234
|
+
case "y":
|
|
235
|
+
this.ctx.protectedData.canvases.emptyCanvas.width =
|
|
236
|
+
this.ctx.nrrd_states.image.nrrd_x_pixel;
|
|
237
|
+
this.ctx.protectedData.canvases.emptyCanvas.height =
|
|
238
|
+
this.ctx.nrrd_states.image.nrrd_z_pixel;
|
|
239
|
+
break;
|
|
240
|
+
case "z":
|
|
241
|
+
this.ctx.protectedData.canvases.emptyCanvas.width =
|
|
242
|
+
this.ctx.nrrd_states.image.nrrd_x_pixel;
|
|
243
|
+
this.ctx.protectedData.canvases.emptyCanvas.height =
|
|
244
|
+
this.ctx.nrrd_states.image.nrrd_y_pixel;
|
|
245
|
+
break;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Clear masks on drawingCanvas layers.
|
|
250
|
+
*/
|
|
251
|
+
resetLayerCanvas() {
|
|
252
|
+
this.ctx.protectedData.canvases.drawingCanvasLayerMaster.width =
|
|
253
|
+
this.ctx.protectedData.canvases.drawingCanvasLayerMaster.width;
|
|
254
|
+
for (const [, target] of this.ctx.protectedData.layerTargets) {
|
|
255
|
+
target.canvas.width = target.canvas.width;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
/****************************View/Canvas Helpers****************************************************/
|
|
259
|
+
/**
|
|
260
|
+
* Resize the draw and display canvas size based on the input size factor number.
|
|
261
|
+
* @param factor number
|
|
262
|
+
*/
|
|
263
|
+
resizePaintArea(factor) {
|
|
264
|
+
const newWidth = Math.floor(this.ctx.nrrd_states.image.originWidth * factor);
|
|
265
|
+
const newHeight = Math.floor(this.ctx.nrrd_states.image.originHeight * factor);
|
|
266
|
+
const sizeChanged = newWidth !== this.ctx.nrrd_states.view.changedWidth ||
|
|
267
|
+
newHeight !== this.ctx.nrrd_states.view.changedHeight;
|
|
268
|
+
// Always clear display/drawing/origin canvases (needed for contrast updates)
|
|
269
|
+
this.ctx.protectedData.canvases.originCanvas.width =
|
|
270
|
+
this.ctx.protectedData.canvases.originCanvas.width;
|
|
271
|
+
this.ctx.protectedData.canvases.displayCanvas.width =
|
|
272
|
+
this.ctx.protectedData.canvases.displayCanvas.width;
|
|
273
|
+
this.ctx.protectedData.canvases.drawingCanvas.width =
|
|
274
|
+
this.ctx.protectedData.canvases.drawingCanvas.width;
|
|
275
|
+
if (sizeChanged) {
|
|
276
|
+
// Only clear and resize layer canvases when size actually changes.
|
|
277
|
+
// Skipping this avoids the expensive reloadMasksFromVolume() call
|
|
278
|
+
// during contrast toggle (where size stays the same).
|
|
279
|
+
this.resetLayerCanvas();
|
|
280
|
+
this.ctx.nrrd_states.view.changedWidth = newWidth;
|
|
281
|
+
this.ctx.nrrd_states.view.changedHeight = newHeight;
|
|
282
|
+
this.ctx.protectedData.canvases.displayCanvas.width = newWidth;
|
|
283
|
+
this.ctx.protectedData.canvases.displayCanvas.height = newHeight;
|
|
284
|
+
this.ctx.protectedData.canvases.drawingCanvas.width = newWidth;
|
|
285
|
+
this.ctx.protectedData.canvases.drawingCanvas.height = newHeight;
|
|
286
|
+
this.ctx.protectedData.canvases.drawingCanvasLayerMaster.width = newWidth;
|
|
287
|
+
this.ctx.protectedData.canvases.drawingCanvasLayerMaster.height = newHeight;
|
|
288
|
+
for (const [, target] of this.ctx.protectedData.layerTargets) {
|
|
289
|
+
target.canvas.width = newWidth;
|
|
290
|
+
target.canvas.height = newHeight;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
this.redrawDisplayCanvas();
|
|
294
|
+
if (sizeChanged) {
|
|
295
|
+
// Phase 3: Reload masks from MaskVolume only when canvas size changed
|
|
296
|
+
this.reloadMasksFromVolume();
|
|
297
|
+
}
|
|
298
|
+
else {
|
|
299
|
+
// Size unchanged (e.g. contrast toggle): layer canvases still have
|
|
300
|
+
// valid data, just recomposite to master for the start() render loop.
|
|
301
|
+
this.callbacks.compositeAllLayers();
|
|
302
|
+
}
|
|
303
|
+
// Refresh sphere overlay from volume after resize/contrast change
|
|
304
|
+
this.callbacks.refreshSphereOverlay();
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Reset the draw and display canvases layout after mouse pan.
|
|
308
|
+
* If no params in, then center the draw and display canvases.
|
|
309
|
+
* @param l number, Offset to the left
|
|
310
|
+
* @param t number, Offset to the top
|
|
311
|
+
*/
|
|
312
|
+
resetPaintAreaUIPosition(l, t) {
|
|
313
|
+
if (l && t) {
|
|
314
|
+
this.ctx.protectedData.canvases.displayCanvas.style.left =
|
|
315
|
+
this.ctx.protectedData.canvases.drawingCanvas.style.left = l + "px";
|
|
316
|
+
this.ctx.protectedData.canvases.displayCanvas.style.top =
|
|
317
|
+
this.ctx.protectedData.canvases.drawingCanvas.style.top = t + "px";
|
|
318
|
+
}
|
|
319
|
+
else {
|
|
320
|
+
this.ctx.protectedData.canvases.displayCanvas.style.left =
|
|
321
|
+
this.ctx.protectedData.canvases.drawingCanvas.style.left = "";
|
|
322
|
+
this.ctx.protectedData.canvases.displayCanvas.style.top =
|
|
323
|
+
this.ctx.protectedData.canvases.drawingCanvas.style.top = "";
|
|
324
|
+
this.ctx.protectedData.mainAreaContainer.style.justifyContent = "center";
|
|
325
|
+
this.ctx.protectedData.mainAreaContainer.style.alignItems = "center";
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* Update the original canvas size, allow set to threejs load one (pixel distance not the mm).
|
|
330
|
+
* Then update the changedWidth and changedHeight based on the sizeFactor.
|
|
331
|
+
*/
|
|
332
|
+
updateOriginAndChangedWH() {
|
|
333
|
+
this.ctx.nrrd_states.image.originWidth =
|
|
334
|
+
this.ctx.protectedData.canvases.originCanvas.width;
|
|
335
|
+
this.ctx.nrrd_states.image.originHeight =
|
|
336
|
+
this.ctx.protectedData.canvases.originCanvas.height;
|
|
337
|
+
// Let resizePaintArea be the sole setter of changedWidth/changedHeight.
|
|
338
|
+
// Setting them here would defeat the sizeChanged detection in resizePaintArea,
|
|
339
|
+
// causing canvas elements to keep stale dimensions after axis switches.
|
|
340
|
+
this.resizePaintArea(this.ctx.nrrd_states.view.sizeFactor);
|
|
341
|
+
this.resetPaintAreaUIPosition();
|
|
342
|
+
}
|
|
343
|
+
/**
|
|
344
|
+
* Keep all contrast slice index to same.
|
|
345
|
+
* Synchronize the slice indexes of all the contrasts so that they are consistent with the main slice's index.
|
|
346
|
+
*/
|
|
347
|
+
setSyncsliceNum() {
|
|
348
|
+
this.ctx.protectedData.displaySlices.forEach((slice, index) => {
|
|
349
|
+
if (index !== 0) {
|
|
350
|
+
slice.index = this.ctx.protectedData.mainPreSlices.index;
|
|
351
|
+
}
|
|
352
|
+
});
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
//# sourceMappingURL=SliceRenderPipeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SliceRenderPipeline.js","sourceRoot":"","sources":["../../../../src/Utils/segmentation/tools/SliceRenderPipeline.ts"],"names":[],"mappings":"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"}
|