cloudmr-ux 4.8.7 → 4.8.8
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.
|
@@ -849,7 +849,15 @@ Niivue.prototype.groupLabelsFromSelection = function (sourceLabels = [], targetL
|
|
|
849
849
|
};
|
|
850
850
|
|
|
851
851
|
Niivue.prototype.resetScene = function () {
|
|
852
|
-
|
|
852
|
+
// Reset 2D pan + zoom
|
|
853
|
+
this.scene.pan2Dxyzmm = [0, 0, 0, 1];
|
|
854
|
+
// Reset 3D camera to Niivue defaults (azimuth=110, elevation=10, scale=1)
|
|
855
|
+
if (typeof this.setRenderAzimuthElevation === "function") {
|
|
856
|
+
this.setRenderAzimuthElevation(110, 10);
|
|
857
|
+
}
|
|
858
|
+
if (typeof this.setScale === "function") {
|
|
859
|
+
this.setScale(1.0);
|
|
860
|
+
}
|
|
853
861
|
this.drawScene();
|
|
854
862
|
}
|
|
855
863
|
|
|
@@ -871,19 +879,19 @@ Niivue.prototype.recenter = function () {
|
|
|
871
879
|
|
|
872
880
|
|
|
873
881
|
Niivue.prototype.resetZoom = function () {
|
|
874
|
-
//
|
|
875
|
-
// this.scene.pan2Dxyzmm[1] = 0;
|
|
876
|
-
// this.scene.pan2Dxyzmm[2] = 0;
|
|
877
|
-
|
|
882
|
+
// Reset 2D zoom (pan stays, only zoom component adjusted)
|
|
878
883
|
const zoom = 1;
|
|
879
|
-
|
|
880
|
-
const zoomChange = this.scene.pan2Dxyzmm[3] - zoom
|
|
884
|
+
const zoomChange = this.scene.pan2Dxyzmm[3] - zoom;
|
|
881
885
|
this.scene.pan2Dxyzmm[3] = zoom;
|
|
882
|
-
const mm = this.frac2mm(this.scene.crosshairPos)
|
|
883
|
-
this.scene.pan2Dxyzmm[0] += zoomChange * mm[0]
|
|
884
|
-
this.scene.pan2Dxyzmm[1] += zoomChange * mm[1]
|
|
885
|
-
this.scene.pan2Dxyzmm[2] += zoomChange * mm[2]
|
|
886
|
-
|
|
886
|
+
const mm = this.frac2mm(this.scene.crosshairPos);
|
|
887
|
+
this.scene.pan2Dxyzmm[0] += zoomChange * mm[0];
|
|
888
|
+
this.scene.pan2Dxyzmm[1] += zoomChange * mm[1];
|
|
889
|
+
this.scene.pan2Dxyzmm[2] += zoomChange * mm[2];
|
|
890
|
+
// Reset 3D zoom to default scale
|
|
891
|
+
if (typeof this.setScale === "function") {
|
|
892
|
+
this.setScale(1.0);
|
|
893
|
+
}
|
|
894
|
+
this.drawScene();
|
|
887
895
|
}
|
|
888
896
|
|
|
889
897
|
Niivue.prototype.setCenteredZoom = function (zoom) {
|
|
@@ -1528,6 +1536,10 @@ function clickedVoxelToolKind(nv) {
|
|
|
1528
1536
|
function cloudMrTryReopenDraftOnClick(nv) {
|
|
1529
1537
|
if (nv._cloudMrShapeDraftActive || nv._cloudMrPenDraftActive) return;
|
|
1530
1538
|
if (!isClickWithoutDrag(nv.uiData)) return;
|
|
1539
|
+
// Never reopen a draft when the eraser is the active tool — the user is
|
|
1540
|
+
// trying to erase, not re-select. The eraser sets penValue to 0 with
|
|
1541
|
+
// drawing enabled; that combination uniquely identifies the eraser here.
|
|
1542
|
+
if (nv.opts.drawingEnabled && nv.opts.penValue === 0) return;
|
|
1531
1543
|
|
|
1532
1544
|
const kind = clickedVoxelToolKind(nv);
|
|
1533
1545
|
if (kind === 1) {
|
|
@@ -440,11 +440,18 @@ export function capturePolylineDraftFromClick(nv) {
|
|
|
440
440
|
return null;
|
|
441
441
|
var dx = nv.back.dims[1];
|
|
442
442
|
var dy = nv.back.dims[2];
|
|
443
|
-
// Decode stored linear indices back to [x, y, z] triples
|
|
443
|
+
// Decode stored linear indices back to [x, y, z] triples, but only include
|
|
444
|
+
// voxels that are still present in the current bitmap. Registered indices
|
|
445
|
+
// that were cleared by the eraser must not be restored — otherwise re-opening
|
|
446
|
+
// the draft would silently undo the user's erasure.
|
|
444
447
|
var strokeVoxels = [];
|
|
448
|
+
var presentIndices = new Set();
|
|
445
449
|
var x1 = Infinity, y1 = Infinity, z1 = Infinity;
|
|
446
450
|
var x2 = -Infinity, y2 = -Infinity, z2 = -Infinity;
|
|
447
451
|
entry.voxelIndices.forEach(function (idx) {
|
|
452
|
+
if (nv.drawBitmap[idx] === 0)
|
|
453
|
+
return; // already erased — skip
|
|
454
|
+
presentIndices.add(idx);
|
|
448
455
|
var z = Math.floor(idx / (dx * dy));
|
|
449
456
|
var rem = idx - z * dx * dy;
|
|
450
457
|
var y = Math.floor(rem / dx);
|
|
@@ -463,7 +470,9 @@ export function capturePolylineDraftFromClick(nv) {
|
|
|
463
470
|
if (z > z2)
|
|
464
471
|
z2 = z;
|
|
465
472
|
});
|
|
466
|
-
|
|
473
|
+
if (strokeVoxels.length === 0)
|
|
474
|
+
return null;
|
|
475
|
+
var baseBitmap = eraseClusterFromBitmap(nv.drawBitmap, presentIndices);
|
|
467
476
|
return {
|
|
468
477
|
kind: "freehand",
|
|
469
478
|
baseBitmap: baseBitmap,
|
|
@@ -44,6 +44,7 @@ export function notifyPolylineChange(nv, count) {
|
|
|
44
44
|
export function resetPolylineState(nv) {
|
|
45
45
|
nv._cloudMrPolylineVertices = [];
|
|
46
46
|
nv._cloudMrPolylineBaseBitmap = null;
|
|
47
|
+
nv._cloudMrPolylinePrevBaseBitmap = null;
|
|
47
48
|
nv._cloudMrPolylineSessionStartBitmap = null;
|
|
48
49
|
nv._cloudMrPolylineAxCorSag = -1;
|
|
49
50
|
nv._cloudMrLastPolylineClickMs = null;
|
|
@@ -90,12 +91,20 @@ export function addPolylineVertex(nv) {
|
|
|
90
91
|
now - nv._cloudMrLastPolylineClickMs <= DOUBLE_CLICK_MS;
|
|
91
92
|
nv._cloudMrLastPolylineClickMs = now;
|
|
92
93
|
if (isDoubleClick) {
|
|
93
|
-
//
|
|
94
|
+
// The first click of the double-click already placed an extra vertex.
|
|
95
|
+
// Roll it back using the snapshot saved before that click, then close.
|
|
96
|
+
if (nv._cloudMrPolylinePrevBaseBitmap) {
|
|
97
|
+
verts.pop();
|
|
98
|
+
nv._cloudMrPolylineBaseBitmap = nv._cloudMrPolylinePrevBaseBitmap;
|
|
99
|
+
nv.drawBitmap.set(nv._cloudMrPolylinePrevBaseBitmap);
|
|
100
|
+
nv.refreshDrawing(false, false);
|
|
101
|
+
}
|
|
94
102
|
return POLYLINE_CLOSE;
|
|
95
103
|
}
|
|
96
104
|
if (verts.length === 0) {
|
|
97
105
|
nv._cloudMrPolylineSessionStartBitmap = nv.drawBitmap.slice();
|
|
98
106
|
nv._cloudMrPolylineBaseBitmap = nv._cloudMrPolylineSessionStartBitmap.slice();
|
|
107
|
+
nv._cloudMrPolylinePrevBaseBitmap = null;
|
|
99
108
|
nv._cloudMrPolylineAxCorSag = axCorSagFromMouse(nv);
|
|
100
109
|
nv.drawPenAxCorSag = nv._cloudMrPolylineAxCorSag;
|
|
101
110
|
verts.push(pt);
|
|
@@ -108,6 +117,8 @@ export function addPolylineVertex(nv) {
|
|
|
108
117
|
return false;
|
|
109
118
|
}
|
|
110
119
|
nv.drawPenAxCorSag = nv._cloudMrPolylineAxCorSag;
|
|
120
|
+
// Save the pre-segment bitmap so a subsequent double-click can roll back.
|
|
121
|
+
nv._cloudMrPolylinePrevBaseBitmap = nv._cloudMrPolylineBaseBitmap;
|
|
111
122
|
nv.drawPenLine(pt, prev, penValue);
|
|
112
123
|
verts.push(pt);
|
|
113
124
|
nv._cloudMrPolylineBaseBitmap = nv.drawBitmap.slice();
|
|
@@ -1469,7 +1469,15 @@ Niivue.prototype.groupLabelsFromSelection = function (
|
|
|
1469
1469
|
};
|
|
1470
1470
|
|
|
1471
1471
|
Niivue.prototype.resetScene = function () {
|
|
1472
|
+
// Reset 2D pan + zoom
|
|
1472
1473
|
this.scene.pan2Dxyzmm = [0, 0, 0, 1];
|
|
1474
|
+
// Reset 3D camera to Niivue defaults (azimuth=110, elevation=10, scale=1)
|
|
1475
|
+
if (typeof this.setRenderAzimuthElevation === "function") {
|
|
1476
|
+
this.setRenderAzimuthElevation(110, 10);
|
|
1477
|
+
}
|
|
1478
|
+
if (typeof this.setScale === "function") {
|
|
1479
|
+
this.setScale(1.0);
|
|
1480
|
+
}
|
|
1473
1481
|
this.drawScene();
|
|
1474
1482
|
};
|
|
1475
1483
|
|
|
@@ -1490,18 +1498,18 @@ Niivue.prototype.recenter = function () {
|
|
|
1490
1498
|
};
|
|
1491
1499
|
|
|
1492
1500
|
Niivue.prototype.resetZoom = function () {
|
|
1493
|
-
//
|
|
1494
|
-
// this.scene.pan2Dxyzmm[1] = 0;
|
|
1495
|
-
// this.scene.pan2Dxyzmm[2] = 0;
|
|
1496
|
-
|
|
1501
|
+
// Reset 2D zoom (pan stays, only zoom component adjusted)
|
|
1497
1502
|
const zoom = 1;
|
|
1498
|
-
|
|
1499
1503
|
const zoomChange = this.scene.pan2Dxyzmm[3] - zoom;
|
|
1500
1504
|
this.scene.pan2Dxyzmm[3] = zoom;
|
|
1501
1505
|
const mm = this.frac2mm(this.scene.crosshairPos);
|
|
1502
1506
|
this.scene.pan2Dxyzmm[0] += zoomChange * mm[0];
|
|
1503
1507
|
this.scene.pan2Dxyzmm[1] += zoomChange * mm[1];
|
|
1504
1508
|
this.scene.pan2Dxyzmm[2] += zoomChange * mm[2];
|
|
1509
|
+
// Reset 3D zoom to default scale
|
|
1510
|
+
if (typeof this.setScale === "function") {
|
|
1511
|
+
this.setScale(1.0);
|
|
1512
|
+
}
|
|
1505
1513
|
this.drawScene();
|
|
1506
1514
|
};
|
|
1507
1515
|
|