copper3d 3.6.1 → 3.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Utils/surfaceAnnotation/SurfaceAnnotator.d.ts +28 -1
- package/dist/Utils/surfaceAnnotation/SurfaceAnnotator.js +196 -12
- package/dist/Utils/surfaceAnnotation/SurfaceAnnotator.js.map +1 -1
- package/dist/Utils/surfaceAnnotation/geodesicContour.d.ts +13 -0
- package/dist/Utils/surfaceAnnotation/geodesicContour.js +38 -0
- package/dist/Utils/surfaceAnnotation/geodesicContour.js.map +1 -1
- package/dist/bundle.esm.js +235 -13
- package/dist/bundle.umd.js +235 -13
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/types/Utils/surfaceAnnotation/SurfaceAnnotator.d.ts +28 -1
- package/dist/types/Utils/surfaceAnnotation/geodesicContour.d.ts +13 -0
- package/dist/types/index.d.ts +1 -1
- package/package.json +1 -1
|
@@ -49,6 +49,12 @@ export declare class SurfaceAnnotator {
|
|
|
49
49
|
private lastFreehand?;
|
|
50
50
|
private activeGeo?;
|
|
51
51
|
private activeGeoLine?;
|
|
52
|
+
private activeGeoMarkers;
|
|
53
|
+
private geoRay;
|
|
54
|
+
private geoNdc;
|
|
55
|
+
private geoHoverBadge?;
|
|
56
|
+
private hoveredGeoMarker;
|
|
57
|
+
private _projV;
|
|
52
58
|
constructor(opts: SurfaceAnnotatorOptions);
|
|
53
59
|
/** 窗口尺寸变化时更新所有 fat line 的像素分辨率,否则线宽会失真。 */
|
|
54
60
|
private onResize;
|
|
@@ -87,9 +93,30 @@ export declare class SurfaceAnnotator {
|
|
|
87
93
|
private disposeObject;
|
|
88
94
|
private nextId;
|
|
89
95
|
private hit;
|
|
90
|
-
/**
|
|
96
|
+
/**
|
|
97
|
+
* 事件目标是否是容器内的 WebGL canvas。
|
|
98
|
+
* 仅认 canvas:面板(GUIDE / 控制面板 / 标注列表的 ✕ 按钮)都是 container 的子元素,
|
|
99
|
+
* 若只判断 contains 会把面板上的点击也当成在模型上作画 —— 这会"穿透"删除按钮、
|
|
100
|
+
* 让 ✕ 难以点中。只响应 canvas 上的指针事件即可彻底隔离 UI 与画布。
|
|
101
|
+
*/
|
|
91
102
|
private insideContainer;
|
|
92
103
|
private onPointerDown;
|
|
104
|
+
/** 射线拾取进行中的锚点小球,返回锚点下标;未命中返回 -1。 */
|
|
105
|
+
private pickGeoMarker;
|
|
106
|
+
/** 设置当前悬停的锚点(-1 = 无):更新高亮缩放、光标与"✕(可取消)"悬浮标。 */
|
|
107
|
+
private setGeoHover;
|
|
108
|
+
/** 懒创建悬浮 ✕ 标(挂在 container 内,pointer-events:none 不挡点击)。 */
|
|
109
|
+
private ensureGeoBadge;
|
|
110
|
+
/** 把 ✕ 标定位到锚点投影到屏幕的位置(正中心,即光标悬停处,避免歧义)。 */
|
|
111
|
+
private positionGeoBadge;
|
|
112
|
+
/** 据当前锚点重建可见的锚点小球(锚点比放点稍大,便于看见与点中取消)。 */
|
|
113
|
+
private rebuildGeoMarkers;
|
|
114
|
+
/** 据当前锚点重画进行中的测地线(不闭合);不足两点时移除线。 */
|
|
115
|
+
private redrawGeoLine;
|
|
116
|
+
/** 丢弃进行中的测地线:移除并 dispose 线与全部锚点。 */
|
|
117
|
+
private clearActiveGeo;
|
|
118
|
+
/** 移除进行中测地线的全部锚点小球(落定后调用:只留下线)。 */
|
|
119
|
+
private removeGeoMarkers;
|
|
93
120
|
private onPointerMove;
|
|
94
121
|
private onPointerUp;
|
|
95
122
|
private closeLastContour;
|
|
@@ -25,6 +25,11 @@ export class SurfaceAnnotator {
|
|
|
25
25
|
this.managed = new Set();
|
|
26
26
|
this.seq = 0;
|
|
27
27
|
this.selectedId = null;
|
|
28
|
+
this.activeGeoMarkers = []; // 进行中测地线的可见锚点
|
|
29
|
+
this.geoRay = new THREE.Raycaster();
|
|
30
|
+
this.geoNdc = new THREE.Vector2();
|
|
31
|
+
this.hoveredGeoMarker = -1;
|
|
32
|
+
this._projV = new THREE.Vector3();
|
|
28
33
|
/** 窗口尺寸变化时更新所有 fat line 的像素分辨率,否则线宽会失真。 */
|
|
29
34
|
this.onResize = () => {
|
|
30
35
|
const w = this.o.container.clientWidth;
|
|
@@ -79,6 +84,19 @@ export class SurfaceAnnotator {
|
|
|
79
84
|
return;
|
|
80
85
|
}
|
|
81
86
|
if (this.mode === "geodesic") {
|
|
87
|
+
// 先判断是否点中了一个已有锚点 → 取消该点(支持取消其中任意一点)。
|
|
88
|
+
const pick = this.pickGeoMarker(e);
|
|
89
|
+
if (pick >= 0 && this.activeGeo) {
|
|
90
|
+
this.activeGeo.removeAnchorAt(pick);
|
|
91
|
+
if (this.activeGeo.anchorCount === 0)
|
|
92
|
+
this.clearActiveGeo();
|
|
93
|
+
else {
|
|
94
|
+
this.rebuildGeoMarkers();
|
|
95
|
+
this.redrawGeoLine();
|
|
96
|
+
}
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
// 否则在表面落一个新锚点。
|
|
82
100
|
const h = this.hit(e);
|
|
83
101
|
if (!h)
|
|
84
102
|
return;
|
|
@@ -87,19 +105,19 @@ export class SurfaceAnnotator {
|
|
|
87
105
|
}
|
|
88
106
|
const local = this.o.mesh.worldToLocal(h.point.clone());
|
|
89
107
|
this.activeGeo.addAnchor(local);
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
this.activeGeoLine = makeContourLine(verts, this.geodesicColor, false, this.o.container, this.epsilon, this.o.mesh);
|
|
93
|
-
this.o.scene.add(this.activeGeoLine);
|
|
94
|
-
}
|
|
95
|
-
else {
|
|
96
|
-
updateContourLine(this.activeGeoLine, verts, false, this.epsilon, this.o.mesh);
|
|
97
|
-
}
|
|
108
|
+
this.rebuildGeoMarkers();
|
|
109
|
+
this.redrawGeoLine();
|
|
98
110
|
}
|
|
99
111
|
};
|
|
100
112
|
this.onPointerMove = (e) => {
|
|
101
|
-
if (this.spaceHeld)
|
|
113
|
+
if (this.spaceHeld) {
|
|
114
|
+
this.setGeoHover(-1);
|
|
102
115
|
return;
|
|
116
|
+
}
|
|
117
|
+
// 测地线模式下,悬停到锚点小球时显示"✕"提示(该点可被点击取消)。
|
|
118
|
+
if (this.mode === "geodesic" && !this.pointerDown) {
|
|
119
|
+
this.setGeoHover(this.insideContainer(e) ? this.pickGeoMarker(e) : -1);
|
|
120
|
+
}
|
|
103
121
|
if (this.mode === "freehand" &&
|
|
104
122
|
this.pointerDown &&
|
|
105
123
|
this.activeStroke &&
|
|
@@ -189,7 +207,7 @@ export class SurfaceAnnotator {
|
|
|
189
207
|
meshGeo.computeVertexNormals(); // 渲染需要法线
|
|
190
208
|
meshGeo.computeBoundingBox();
|
|
191
209
|
const diag = (_a = opts.bboxDiagonal) !== null && _a !== void 0 ? _a : meshGeo.boundingBox.getSize(new THREE.Vector3()).length();
|
|
192
|
-
this.markerRadius = (_b = opts.markerRadius) !== null && _b !== void 0 ? _b : diag * 0.
|
|
210
|
+
this.markerRadius = (_b = opts.markerRadius) !== null && _b !== void 0 ? _b : diag * 0.0032;
|
|
193
211
|
this.epsilon = diag * 0.002;
|
|
194
212
|
this.minGap = diag * 0.004;
|
|
195
213
|
this.maxJump = diag * 0.05;
|
|
@@ -230,6 +248,9 @@ export class SurfaceAnnotator {
|
|
|
230
248
|
}
|
|
231
249
|
setMode(m) {
|
|
232
250
|
var _a, _b;
|
|
251
|
+
// 离开测地线模式时丢弃尚未 Enter 落定的进行中测地线(清掉残留的锚点与线)。
|
|
252
|
+
if (m !== "geodesic" && this.activeGeo)
|
|
253
|
+
this.clearActiveGeo();
|
|
233
254
|
this.mode = m;
|
|
234
255
|
this.applyCameraGating();
|
|
235
256
|
(_b = (_a = this.o).onModeChange) === null || _b === void 0 ? void 0 : _b.call(_a, m);
|
|
@@ -242,6 +263,18 @@ export class SurfaceAnnotator {
|
|
|
242
263
|
return this.store.list();
|
|
243
264
|
}
|
|
244
265
|
undo() {
|
|
266
|
+
// 测地线进行中 → 撤销最近一次锚点编辑(加点 / 取消点都能回退);
|
|
267
|
+
// 否则撤销最近一条已落定的标注。
|
|
268
|
+
if (this.activeGeo && this.activeGeo.canUndo()) {
|
|
269
|
+
this.activeGeo.undoEdit();
|
|
270
|
+
if (this.activeGeo.anchorCount === 0)
|
|
271
|
+
this.clearActiveGeo();
|
|
272
|
+
else {
|
|
273
|
+
this.rebuildGeoMarkers();
|
|
274
|
+
this.redrawGeoLine();
|
|
275
|
+
}
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
245
278
|
this.store.undo();
|
|
246
279
|
}
|
|
247
280
|
clearAll() {
|
|
@@ -254,6 +287,7 @@ export class SurfaceAnnotator {
|
|
|
254
287
|
});
|
|
255
288
|
this.managed.clear();
|
|
256
289
|
this.selectedId = null;
|
|
290
|
+
this.clearActiveGeo();
|
|
257
291
|
}
|
|
258
292
|
deleteAnnotation(id) {
|
|
259
293
|
if (this.selectedId === id)
|
|
@@ -334,10 +368,153 @@ export class SurfaceAnnotator {
|
|
|
334
368
|
hit(e) {
|
|
335
369
|
return raycastSurface(this.o.camera, this.o.container, this.o.mesh, e.clientX, e.clientY);
|
|
336
370
|
}
|
|
337
|
-
/**
|
|
371
|
+
/**
|
|
372
|
+
* 事件目标是否是容器内的 WebGL canvas。
|
|
373
|
+
* 仅认 canvas:面板(GUIDE / 控制面板 / 标注列表的 ✕ 按钮)都是 container 的子元素,
|
|
374
|
+
* 若只判断 contains 会把面板上的点击也当成在模型上作画 —— 这会"穿透"删除按钮、
|
|
375
|
+
* 让 ✕ 难以点中。只响应 canvas 上的指针事件即可彻底隔离 UI 与画布。
|
|
376
|
+
*/
|
|
338
377
|
insideContainer(e) {
|
|
339
378
|
const t = e.target;
|
|
340
|
-
return !!t && this.o.container.contains(t);
|
|
379
|
+
return !!t && t.tagName === "CANVAS" && this.o.container.contains(t);
|
|
380
|
+
}
|
|
381
|
+
/** 射线拾取进行中的锚点小球,返回锚点下标;未命中返回 -1。 */
|
|
382
|
+
pickGeoMarker(e) {
|
|
383
|
+
if (!this.activeGeoMarkers.length)
|
|
384
|
+
return -1;
|
|
385
|
+
const rect = this.o.container.getBoundingClientRect();
|
|
386
|
+
this.geoNdc.x = ((e.clientX - rect.left) / rect.width) * 2 - 1;
|
|
387
|
+
this.geoNdc.y = -((e.clientY - rect.top) / rect.height) * 2 + 1;
|
|
388
|
+
this.geoRay.setFromCamera(this.geoNdc, this.o.camera);
|
|
389
|
+
const hits = this.geoRay.intersectObjects(this.activeGeoMarkers, false);
|
|
390
|
+
if (!hits.length)
|
|
391
|
+
return -1;
|
|
392
|
+
return this.activeGeoMarkers.indexOf(hits[0].object);
|
|
393
|
+
}
|
|
394
|
+
/** 设置当前悬停的锚点(-1 = 无):更新高亮缩放、光标与"✕(可取消)"悬浮标。 */
|
|
395
|
+
setGeoHover(idx) {
|
|
396
|
+
if (idx === this.hoveredGeoMarker) {
|
|
397
|
+
if (idx >= 0)
|
|
398
|
+
this.positionGeoBadge(this.activeGeoMarkers[idx]);
|
|
399
|
+
return;
|
|
400
|
+
}
|
|
401
|
+
const prev = this.activeGeoMarkers[this.hoveredGeoMarker];
|
|
402
|
+
if (prev)
|
|
403
|
+
prev.scale.setScalar(1);
|
|
404
|
+
this.hoveredGeoMarker = idx;
|
|
405
|
+
const cur = this.activeGeoMarkers[idx];
|
|
406
|
+
if (cur) {
|
|
407
|
+
cur.scale.setScalar(1.3);
|
|
408
|
+
this.ensureGeoBadge().style.display = "flex";
|
|
409
|
+
this.positionGeoBadge(cur);
|
|
410
|
+
this.o.container.style.cursor = "pointer";
|
|
411
|
+
}
|
|
412
|
+
else {
|
|
413
|
+
if (this.geoHoverBadge)
|
|
414
|
+
this.geoHoverBadge.style.display = "none";
|
|
415
|
+
this.o.container.style.cursor = "";
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
/** 懒创建悬浮 ✕ 标(挂在 container 内,pointer-events:none 不挡点击)。 */
|
|
419
|
+
ensureGeoBadge() {
|
|
420
|
+
if (this.geoHoverBadge)
|
|
421
|
+
return this.geoHoverBadge;
|
|
422
|
+
const b = document.createElement("div");
|
|
423
|
+
b.textContent = "✕";
|
|
424
|
+
Object.assign(b.style, {
|
|
425
|
+
position: "absolute",
|
|
426
|
+
width: "16px",
|
|
427
|
+
height: "16px",
|
|
428
|
+
borderRadius: "50%",
|
|
429
|
+
background: "#ff5d6c",
|
|
430
|
+
color: "#fff",
|
|
431
|
+
font: "700 10px/1 system-ui, sans-serif",
|
|
432
|
+
display: "none",
|
|
433
|
+
alignItems: "center",
|
|
434
|
+
justifyContent: "center",
|
|
435
|
+
pointerEvents: "none",
|
|
436
|
+
zIndex: "15",
|
|
437
|
+
boxShadow: "0 2px 6px rgba(0,0,0,.45)",
|
|
438
|
+
transform: "translate(-50%, -50%)",
|
|
439
|
+
left: "0px",
|
|
440
|
+
top: "0px",
|
|
441
|
+
});
|
|
442
|
+
this.o.container.appendChild(b);
|
|
443
|
+
this.geoHoverBadge = b;
|
|
444
|
+
return b;
|
|
445
|
+
}
|
|
446
|
+
/** 把 ✕ 标定位到锚点投影到屏幕的位置(正中心,即光标悬停处,避免歧义)。 */
|
|
447
|
+
positionGeoBadge(marker) {
|
|
448
|
+
if (!marker)
|
|
449
|
+
return;
|
|
450
|
+
const b = this.ensureGeoBadge();
|
|
451
|
+
this._projV.copy(marker.position).project(this.o.camera);
|
|
452
|
+
const rect = this.o.container.getBoundingClientRect();
|
|
453
|
+
const x = (this._projV.x * 0.5 + 0.5) * rect.width;
|
|
454
|
+
const y = (-this._projV.y * 0.5 + 0.5) * rect.height;
|
|
455
|
+
b.style.left = `${x}px`;
|
|
456
|
+
b.style.top = `${y}px`;
|
|
457
|
+
}
|
|
458
|
+
/** 据当前锚点重建可见的锚点小球(锚点比放点稍大,便于看见与点中取消)。 */
|
|
459
|
+
rebuildGeoMarkers() {
|
|
460
|
+
this.setGeoHover(-1);
|
|
461
|
+
for (const m of this.activeGeoMarkers) {
|
|
462
|
+
this.o.scene.remove(m);
|
|
463
|
+
this.disposeObject(m);
|
|
464
|
+
}
|
|
465
|
+
this.activeGeoMarkers = [];
|
|
466
|
+
if (!this.activeGeo)
|
|
467
|
+
return;
|
|
468
|
+
for (const v of this.activeGeo.getAnchorLocals()) {
|
|
469
|
+
const marker = makePointMarker(v, this.o.mesh, this.geodesicColor, this.markerRadius * 1.15);
|
|
470
|
+
this.o.scene.add(marker);
|
|
471
|
+
this.activeGeoMarkers.push(marker);
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
/** 据当前锚点重画进行中的测地线(不闭合);不足两点时移除线。 */
|
|
475
|
+
redrawGeoLine() {
|
|
476
|
+
if (!this.activeGeo)
|
|
477
|
+
return;
|
|
478
|
+
const verts = this.activeGeo.buildVertices(false);
|
|
479
|
+
if (verts.length < 2) {
|
|
480
|
+
if (this.activeGeoLine) {
|
|
481
|
+
this.o.scene.remove(this.activeGeoLine);
|
|
482
|
+
this.disposeObject(this.activeGeoLine);
|
|
483
|
+
this.activeGeoLine = undefined;
|
|
484
|
+
}
|
|
485
|
+
return;
|
|
486
|
+
}
|
|
487
|
+
if (!this.activeGeoLine) {
|
|
488
|
+
this.activeGeoLine = makeContourLine(verts, this.geodesicColor, false, this.o.container, this.epsilon, this.o.mesh);
|
|
489
|
+
this.o.scene.add(this.activeGeoLine);
|
|
490
|
+
}
|
|
491
|
+
else {
|
|
492
|
+
updateContourLine(this.activeGeoLine, verts, false, this.epsilon, this.o.mesh);
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
/** 丢弃进行中的测地线:移除并 dispose 线与全部锚点。 */
|
|
496
|
+
clearActiveGeo() {
|
|
497
|
+
this.setGeoHover(-1);
|
|
498
|
+
if (this.activeGeoLine) {
|
|
499
|
+
this.o.scene.remove(this.activeGeoLine);
|
|
500
|
+
this.disposeObject(this.activeGeoLine);
|
|
501
|
+
this.activeGeoLine = undefined;
|
|
502
|
+
}
|
|
503
|
+
for (const m of this.activeGeoMarkers) {
|
|
504
|
+
this.o.scene.remove(m);
|
|
505
|
+
this.disposeObject(m);
|
|
506
|
+
}
|
|
507
|
+
this.activeGeoMarkers = [];
|
|
508
|
+
this.activeGeo = undefined;
|
|
509
|
+
}
|
|
510
|
+
/** 移除进行中测地线的全部锚点小球(落定后调用:只留下线)。 */
|
|
511
|
+
removeGeoMarkers() {
|
|
512
|
+
this.setGeoHover(-1);
|
|
513
|
+
for (const m of this.activeGeoMarkers) {
|
|
514
|
+
this.o.scene.remove(m);
|
|
515
|
+
this.disposeObject(m);
|
|
516
|
+
}
|
|
517
|
+
this.activeGeoMarkers = [];
|
|
341
518
|
}
|
|
342
519
|
closeLastContour() {
|
|
343
520
|
const last = this.lastFreehand;
|
|
@@ -380,7 +557,10 @@ export class SurfaceAnnotator {
|
|
|
380
557
|
}
|
|
381
558
|
else {
|
|
382
559
|
this.o.scene.remove(this.activeGeoLine);
|
|
560
|
+
this.disposeObject(this.activeGeoLine);
|
|
383
561
|
}
|
|
562
|
+
// 落定后清掉可见锚点,只留下贴合表面的线。
|
|
563
|
+
this.removeGeoMarkers();
|
|
384
564
|
this.activeGeo = undefined;
|
|
385
565
|
this.activeGeoLine = undefined;
|
|
386
566
|
}
|
|
@@ -392,6 +572,10 @@ export class SurfaceAnnotator {
|
|
|
392
572
|
return tag === "INPUT" || tag === "TEXTAREA" || t.isContentEditable;
|
|
393
573
|
}
|
|
394
574
|
dispose() {
|
|
575
|
+
var _a;
|
|
576
|
+
this.clearActiveGeo();
|
|
577
|
+
(_a = this.geoHoverBadge) === null || _a === void 0 ? void 0 : _a.remove();
|
|
578
|
+
this.geoHoverBadge = undefined;
|
|
395
579
|
window.removeEventListener("pointerdown", this.onPointerDown, true);
|
|
396
580
|
window.removeEventListener("pointermove", this.onPointerMove, true);
|
|
397
581
|
window.removeEventListener("pointerup", this.onPointerUp, true);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SurfaceAnnotator.js","sourceRoot":"","sources":["../../../src/Utils/surfaceAnnotation/SurfaceAnnotator.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SurfaceAnnotator.js","sourceRoot":"","sources":["../../../src/Utils/surfaceAnnotation/SurfaceAnnotator.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,9 +10,22 @@ export declare class GeodesicContour {
|
|
|
10
10
|
private mesh;
|
|
11
11
|
private anchors;
|
|
12
12
|
private segments;
|
|
13
|
+
private history;
|
|
13
14
|
constructor(graph: MeshGraph, mesh: THREE.Mesh);
|
|
15
|
+
/** 任何改动锚点前先存一份快照(顶点索引数组很小,快照成本可忽略)。 */
|
|
16
|
+
private snapshot;
|
|
14
17
|
/** 传入 local 命中点,snap 到最近顶点并对上一锚点求路径。 */
|
|
15
18
|
addAnchor(localHitPoint: THREE.Vector3): void;
|
|
19
|
+
/** 删除指定下标的锚点,重算相邻段(支持取消中间任意一点)。 */
|
|
20
|
+
removeAnchorAt(index: number): void;
|
|
21
|
+
/** 是否还有可撤销的编辑(加点/删点)。 */
|
|
22
|
+
canUndo(): boolean;
|
|
23
|
+
/** 撤销上一次锚点编辑(加点 → 删回去;删点 → 恢复)。无历史返回 false。 */
|
|
24
|
+
undoEdit(): boolean;
|
|
25
|
+
/** 据当前锚点序列整体重算所有相邻段路径。 */
|
|
26
|
+
private rebuildSegments;
|
|
27
|
+
/** 各锚点的 local 顶点(用于绘制可见的锚点标记)。 */
|
|
28
|
+
getAnchorLocals(): AnnotationVertex[];
|
|
16
29
|
get anchorCount(): number;
|
|
17
30
|
/** 把所有路径顶点(world)+ 法线 拼成折线;closed 时补一段首尾路径。 */
|
|
18
31
|
buildVertices(closed: boolean): AnnotationVertex[];
|
|
@@ -8,16 +8,54 @@ export class GeodesicContour {
|
|
|
8
8
|
this.mesh = mesh;
|
|
9
9
|
this.anchors = []; // 顶点索引
|
|
10
10
|
this.segments = []; // 相邻锚点间路径(含端点)
|
|
11
|
+
this.history = []; // 每次增删前的锚点快照,用于撤销
|
|
12
|
+
}
|
|
13
|
+
/** 任何改动锚点前先存一份快照(顶点索引数组很小,快照成本可忽略)。 */
|
|
14
|
+
snapshot() {
|
|
15
|
+
this.history.push(this.anchors.slice());
|
|
11
16
|
}
|
|
12
17
|
/** 传入 local 命中点,snap 到最近顶点并对上一锚点求路径。 */
|
|
13
18
|
addAnchor(localHitPoint) {
|
|
14
19
|
const v = this.graph.nearestVertex(localHitPoint);
|
|
20
|
+
this.snapshot();
|
|
15
21
|
if (this.anchors.length > 0) {
|
|
16
22
|
const prev = this.anchors[this.anchors.length - 1];
|
|
17
23
|
this.segments.push(this.graph.shortestPath(prev, v));
|
|
18
24
|
}
|
|
19
25
|
this.anchors.push(v);
|
|
20
26
|
}
|
|
27
|
+
/** 删除指定下标的锚点,重算相邻段(支持取消中间任意一点)。 */
|
|
28
|
+
removeAnchorAt(index) {
|
|
29
|
+
if (index < 0 || index >= this.anchors.length)
|
|
30
|
+
return;
|
|
31
|
+
this.snapshot();
|
|
32
|
+
this.anchors.splice(index, 1);
|
|
33
|
+
this.rebuildSegments();
|
|
34
|
+
}
|
|
35
|
+
/** 是否还有可撤销的编辑(加点/删点)。 */
|
|
36
|
+
canUndo() {
|
|
37
|
+
return this.history.length > 0;
|
|
38
|
+
}
|
|
39
|
+
/** 撤销上一次锚点编辑(加点 → 删回去;删点 → 恢复)。无历史返回 false。 */
|
|
40
|
+
undoEdit() {
|
|
41
|
+
const prev = this.history.pop();
|
|
42
|
+
if (!prev)
|
|
43
|
+
return false;
|
|
44
|
+
this.anchors = prev;
|
|
45
|
+
this.rebuildSegments();
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
/** 据当前锚点序列整体重算所有相邻段路径。 */
|
|
49
|
+
rebuildSegments() {
|
|
50
|
+
this.segments = [];
|
|
51
|
+
for (let i = 1; i < this.anchors.length; i++) {
|
|
52
|
+
this.segments.push(this.graph.shortestPath(this.anchors[i - 1], this.anchors[i]));
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/** 各锚点的 local 顶点(用于绘制可见的锚点标记)。 */
|
|
56
|
+
getAnchorLocals() {
|
|
57
|
+
return this.anchors.map((i) => this.graph.vertexLocal(i));
|
|
58
|
+
}
|
|
21
59
|
get anchorCount() {
|
|
22
60
|
return this.anchors.length;
|
|
23
61
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"geodesicContour.js","sourceRoot":"","sources":["../../../src/Utils/surfaceAnnotation/geodesicContour.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,MAAM,OAAO,eAAe;
|
|
1
|
+
{"version":3,"file":"geodesicContour.js","sourceRoot":"","sources":["../../../src/Utils/surfaceAnnotation/geodesicContour.ts"],"names":[],"mappings":"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"}
|
package/dist/bundle.esm.js
CHANGED
|
@@ -61162,16 +61162,54 @@ class GeodesicContour {
|
|
|
61162
61162
|
this.mesh = mesh;
|
|
61163
61163
|
this.anchors = []; // 顶点索引
|
|
61164
61164
|
this.segments = []; // 相邻锚点间路径(含端点)
|
|
61165
|
+
this.history = []; // 每次增删前的锚点快照,用于撤销
|
|
61166
|
+
}
|
|
61167
|
+
/** 任何改动锚点前先存一份快照(顶点索引数组很小,快照成本可忽略)。 */
|
|
61168
|
+
snapshot() {
|
|
61169
|
+
this.history.push(this.anchors.slice());
|
|
61165
61170
|
}
|
|
61166
61171
|
/** 传入 local 命中点,snap 到最近顶点并对上一锚点求路径。 */
|
|
61167
61172
|
addAnchor(localHitPoint) {
|
|
61168
61173
|
const v = this.graph.nearestVertex(localHitPoint);
|
|
61174
|
+
this.snapshot();
|
|
61169
61175
|
if (this.anchors.length > 0) {
|
|
61170
61176
|
const prev = this.anchors[this.anchors.length - 1];
|
|
61171
61177
|
this.segments.push(this.graph.shortestPath(prev, v));
|
|
61172
61178
|
}
|
|
61173
61179
|
this.anchors.push(v);
|
|
61174
61180
|
}
|
|
61181
|
+
/** 删除指定下标的锚点,重算相邻段(支持取消中间任意一点)。 */
|
|
61182
|
+
removeAnchorAt(index) {
|
|
61183
|
+
if (index < 0 || index >= this.anchors.length)
|
|
61184
|
+
return;
|
|
61185
|
+
this.snapshot();
|
|
61186
|
+
this.anchors.splice(index, 1);
|
|
61187
|
+
this.rebuildSegments();
|
|
61188
|
+
}
|
|
61189
|
+
/** 是否还有可撤销的编辑(加点/删点)。 */
|
|
61190
|
+
canUndo() {
|
|
61191
|
+
return this.history.length > 0;
|
|
61192
|
+
}
|
|
61193
|
+
/** 撤销上一次锚点编辑(加点 → 删回去;删点 → 恢复)。无历史返回 false。 */
|
|
61194
|
+
undoEdit() {
|
|
61195
|
+
const prev = this.history.pop();
|
|
61196
|
+
if (!prev)
|
|
61197
|
+
return false;
|
|
61198
|
+
this.anchors = prev;
|
|
61199
|
+
this.rebuildSegments();
|
|
61200
|
+
return true;
|
|
61201
|
+
}
|
|
61202
|
+
/** 据当前锚点序列整体重算所有相邻段路径。 */
|
|
61203
|
+
rebuildSegments() {
|
|
61204
|
+
this.segments = [];
|
|
61205
|
+
for (let i = 1; i < this.anchors.length; i++) {
|
|
61206
|
+
this.segments.push(this.graph.shortestPath(this.anchors[i - 1], this.anchors[i]));
|
|
61207
|
+
}
|
|
61208
|
+
}
|
|
61209
|
+
/** 各锚点的 local 顶点(用于绘制可见的锚点标记)。 */
|
|
61210
|
+
getAnchorLocals() {
|
|
61211
|
+
return this.anchors.map((i) => this.graph.vertexLocal(i));
|
|
61212
|
+
}
|
|
61175
61213
|
get anchorCount() {
|
|
61176
61214
|
return this.anchors.length;
|
|
61177
61215
|
}
|
|
@@ -61316,6 +61354,11 @@ class SurfaceAnnotator {
|
|
|
61316
61354
|
this.managed = new Set();
|
|
61317
61355
|
this.seq = 0;
|
|
61318
61356
|
this.selectedId = null;
|
|
61357
|
+
this.activeGeoMarkers = []; // 进行中测地线的可见锚点
|
|
61358
|
+
this.geoRay = new Raycaster();
|
|
61359
|
+
this.geoNdc = new Vector2();
|
|
61360
|
+
this.hoveredGeoMarker = -1;
|
|
61361
|
+
this._projV = new Vector3();
|
|
61319
61362
|
/** 窗口尺寸变化时更新所有 fat line 的像素分辨率,否则线宽会失真。 */
|
|
61320
61363
|
this.onResize = () => {
|
|
61321
61364
|
const w = this.o.container.clientWidth;
|
|
@@ -61370,6 +61413,19 @@ class SurfaceAnnotator {
|
|
|
61370
61413
|
return;
|
|
61371
61414
|
}
|
|
61372
61415
|
if (this.mode === "geodesic") {
|
|
61416
|
+
// 先判断是否点中了一个已有锚点 → 取消该点(支持取消其中任意一点)。
|
|
61417
|
+
const pick = this.pickGeoMarker(e);
|
|
61418
|
+
if (pick >= 0 && this.activeGeo) {
|
|
61419
|
+
this.activeGeo.removeAnchorAt(pick);
|
|
61420
|
+
if (this.activeGeo.anchorCount === 0)
|
|
61421
|
+
this.clearActiveGeo();
|
|
61422
|
+
else {
|
|
61423
|
+
this.rebuildGeoMarkers();
|
|
61424
|
+
this.redrawGeoLine();
|
|
61425
|
+
}
|
|
61426
|
+
return;
|
|
61427
|
+
}
|
|
61428
|
+
// 否则在表面落一个新锚点。
|
|
61373
61429
|
const h = this.hit(e);
|
|
61374
61430
|
if (!h)
|
|
61375
61431
|
return;
|
|
@@ -61378,19 +61434,19 @@ class SurfaceAnnotator {
|
|
|
61378
61434
|
}
|
|
61379
61435
|
const local = this.o.mesh.worldToLocal(h.point.clone());
|
|
61380
61436
|
this.activeGeo.addAnchor(local);
|
|
61381
|
-
|
|
61382
|
-
|
|
61383
|
-
this.activeGeoLine = makeContourLine(verts, this.geodesicColor, false, this.o.container, this.epsilon, this.o.mesh);
|
|
61384
|
-
this.o.scene.add(this.activeGeoLine);
|
|
61385
|
-
}
|
|
61386
|
-
else {
|
|
61387
|
-
updateContourLine(this.activeGeoLine, verts, false, this.epsilon, this.o.mesh);
|
|
61388
|
-
}
|
|
61437
|
+
this.rebuildGeoMarkers();
|
|
61438
|
+
this.redrawGeoLine();
|
|
61389
61439
|
}
|
|
61390
61440
|
};
|
|
61391
61441
|
this.onPointerMove = (e) => {
|
|
61392
|
-
if (this.spaceHeld)
|
|
61442
|
+
if (this.spaceHeld) {
|
|
61443
|
+
this.setGeoHover(-1);
|
|
61393
61444
|
return;
|
|
61445
|
+
}
|
|
61446
|
+
// 测地线模式下,悬停到锚点小球时显示"✕"提示(该点可被点击取消)。
|
|
61447
|
+
if (this.mode === "geodesic" && !this.pointerDown) {
|
|
61448
|
+
this.setGeoHover(this.insideContainer(e) ? this.pickGeoMarker(e) : -1);
|
|
61449
|
+
}
|
|
61394
61450
|
if (this.mode === "freehand" &&
|
|
61395
61451
|
this.pointerDown &&
|
|
61396
61452
|
this.activeStroke &&
|
|
@@ -61480,7 +61536,7 @@ class SurfaceAnnotator {
|
|
|
61480
61536
|
meshGeo.computeVertexNormals(); // 渲染需要法线
|
|
61481
61537
|
meshGeo.computeBoundingBox();
|
|
61482
61538
|
const diag = (_a = opts.bboxDiagonal) !== null && _a !== void 0 ? _a : meshGeo.boundingBox.getSize(new Vector3()).length();
|
|
61483
|
-
this.markerRadius = (_b = opts.markerRadius) !== null && _b !== void 0 ? _b : diag * 0.
|
|
61539
|
+
this.markerRadius = (_b = opts.markerRadius) !== null && _b !== void 0 ? _b : diag * 0.0032;
|
|
61484
61540
|
this.epsilon = diag * 0.002;
|
|
61485
61541
|
this.minGap = diag * 0.004;
|
|
61486
61542
|
this.maxJump = diag * 0.05;
|
|
@@ -61521,6 +61577,9 @@ class SurfaceAnnotator {
|
|
|
61521
61577
|
}
|
|
61522
61578
|
setMode(m) {
|
|
61523
61579
|
var _a, _b;
|
|
61580
|
+
// 离开测地线模式时丢弃尚未 Enter 落定的进行中测地线(清掉残留的锚点与线)。
|
|
61581
|
+
if (m !== "geodesic" && this.activeGeo)
|
|
61582
|
+
this.clearActiveGeo();
|
|
61524
61583
|
this.mode = m;
|
|
61525
61584
|
this.applyCameraGating();
|
|
61526
61585
|
(_b = (_a = this.o).onModeChange) === null || _b === void 0 ? void 0 : _b.call(_a, m);
|
|
@@ -61533,6 +61592,18 @@ class SurfaceAnnotator {
|
|
|
61533
61592
|
return this.store.list();
|
|
61534
61593
|
}
|
|
61535
61594
|
undo() {
|
|
61595
|
+
// 测地线进行中 → 撤销最近一次锚点编辑(加点 / 取消点都能回退);
|
|
61596
|
+
// 否则撤销最近一条已落定的标注。
|
|
61597
|
+
if (this.activeGeo && this.activeGeo.canUndo()) {
|
|
61598
|
+
this.activeGeo.undoEdit();
|
|
61599
|
+
if (this.activeGeo.anchorCount === 0)
|
|
61600
|
+
this.clearActiveGeo();
|
|
61601
|
+
else {
|
|
61602
|
+
this.rebuildGeoMarkers();
|
|
61603
|
+
this.redrawGeoLine();
|
|
61604
|
+
}
|
|
61605
|
+
return;
|
|
61606
|
+
}
|
|
61536
61607
|
this.store.undo();
|
|
61537
61608
|
}
|
|
61538
61609
|
clearAll() {
|
|
@@ -61545,6 +61616,7 @@ class SurfaceAnnotator {
|
|
|
61545
61616
|
});
|
|
61546
61617
|
this.managed.clear();
|
|
61547
61618
|
this.selectedId = null;
|
|
61619
|
+
this.clearActiveGeo();
|
|
61548
61620
|
}
|
|
61549
61621
|
deleteAnnotation(id) {
|
|
61550
61622
|
if (this.selectedId === id)
|
|
@@ -61625,10 +61697,153 @@ class SurfaceAnnotator {
|
|
|
61625
61697
|
hit(e) {
|
|
61626
61698
|
return raycastSurface(this.o.camera, this.o.container, this.o.mesh, e.clientX, e.clientY);
|
|
61627
61699
|
}
|
|
61628
|
-
/**
|
|
61700
|
+
/**
|
|
61701
|
+
* 事件目标是否是容器内的 WebGL canvas。
|
|
61702
|
+
* 仅认 canvas:面板(GUIDE / 控制面板 / 标注列表的 ✕ 按钮)都是 container 的子元素,
|
|
61703
|
+
* 若只判断 contains 会把面板上的点击也当成在模型上作画 —— 这会"穿透"删除按钮、
|
|
61704
|
+
* 让 ✕ 难以点中。只响应 canvas 上的指针事件即可彻底隔离 UI 与画布。
|
|
61705
|
+
*/
|
|
61629
61706
|
insideContainer(e) {
|
|
61630
61707
|
const t = e.target;
|
|
61631
|
-
return !!t && this.o.container.contains(t);
|
|
61708
|
+
return !!t && t.tagName === "CANVAS" && this.o.container.contains(t);
|
|
61709
|
+
}
|
|
61710
|
+
/** 射线拾取进行中的锚点小球,返回锚点下标;未命中返回 -1。 */
|
|
61711
|
+
pickGeoMarker(e) {
|
|
61712
|
+
if (!this.activeGeoMarkers.length)
|
|
61713
|
+
return -1;
|
|
61714
|
+
const rect = this.o.container.getBoundingClientRect();
|
|
61715
|
+
this.geoNdc.x = ((e.clientX - rect.left) / rect.width) * 2 - 1;
|
|
61716
|
+
this.geoNdc.y = -((e.clientY - rect.top) / rect.height) * 2 + 1;
|
|
61717
|
+
this.geoRay.setFromCamera(this.geoNdc, this.o.camera);
|
|
61718
|
+
const hits = this.geoRay.intersectObjects(this.activeGeoMarkers, false);
|
|
61719
|
+
if (!hits.length)
|
|
61720
|
+
return -1;
|
|
61721
|
+
return this.activeGeoMarkers.indexOf(hits[0].object);
|
|
61722
|
+
}
|
|
61723
|
+
/** 设置当前悬停的锚点(-1 = 无):更新高亮缩放、光标与"✕(可取消)"悬浮标。 */
|
|
61724
|
+
setGeoHover(idx) {
|
|
61725
|
+
if (idx === this.hoveredGeoMarker) {
|
|
61726
|
+
if (idx >= 0)
|
|
61727
|
+
this.positionGeoBadge(this.activeGeoMarkers[idx]);
|
|
61728
|
+
return;
|
|
61729
|
+
}
|
|
61730
|
+
const prev = this.activeGeoMarkers[this.hoveredGeoMarker];
|
|
61731
|
+
if (prev)
|
|
61732
|
+
prev.scale.setScalar(1);
|
|
61733
|
+
this.hoveredGeoMarker = idx;
|
|
61734
|
+
const cur = this.activeGeoMarkers[idx];
|
|
61735
|
+
if (cur) {
|
|
61736
|
+
cur.scale.setScalar(1.3);
|
|
61737
|
+
this.ensureGeoBadge().style.display = "flex";
|
|
61738
|
+
this.positionGeoBadge(cur);
|
|
61739
|
+
this.o.container.style.cursor = "pointer";
|
|
61740
|
+
}
|
|
61741
|
+
else {
|
|
61742
|
+
if (this.geoHoverBadge)
|
|
61743
|
+
this.geoHoverBadge.style.display = "none";
|
|
61744
|
+
this.o.container.style.cursor = "";
|
|
61745
|
+
}
|
|
61746
|
+
}
|
|
61747
|
+
/** 懒创建悬浮 ✕ 标(挂在 container 内,pointer-events:none 不挡点击)。 */
|
|
61748
|
+
ensureGeoBadge() {
|
|
61749
|
+
if (this.geoHoverBadge)
|
|
61750
|
+
return this.geoHoverBadge;
|
|
61751
|
+
const b = document.createElement("div");
|
|
61752
|
+
b.textContent = "✕";
|
|
61753
|
+
Object.assign(b.style, {
|
|
61754
|
+
position: "absolute",
|
|
61755
|
+
width: "16px",
|
|
61756
|
+
height: "16px",
|
|
61757
|
+
borderRadius: "50%",
|
|
61758
|
+
background: "#ff5d6c",
|
|
61759
|
+
color: "#fff",
|
|
61760
|
+
font: "700 10px/1 system-ui, sans-serif",
|
|
61761
|
+
display: "none",
|
|
61762
|
+
alignItems: "center",
|
|
61763
|
+
justifyContent: "center",
|
|
61764
|
+
pointerEvents: "none",
|
|
61765
|
+
zIndex: "15",
|
|
61766
|
+
boxShadow: "0 2px 6px rgba(0,0,0,.45)",
|
|
61767
|
+
transform: "translate(-50%, -50%)",
|
|
61768
|
+
left: "0px",
|
|
61769
|
+
top: "0px",
|
|
61770
|
+
});
|
|
61771
|
+
this.o.container.appendChild(b);
|
|
61772
|
+
this.geoHoverBadge = b;
|
|
61773
|
+
return b;
|
|
61774
|
+
}
|
|
61775
|
+
/** 把 ✕ 标定位到锚点投影到屏幕的位置(正中心,即光标悬停处,避免歧义)。 */
|
|
61776
|
+
positionGeoBadge(marker) {
|
|
61777
|
+
if (!marker)
|
|
61778
|
+
return;
|
|
61779
|
+
const b = this.ensureGeoBadge();
|
|
61780
|
+
this._projV.copy(marker.position).project(this.o.camera);
|
|
61781
|
+
const rect = this.o.container.getBoundingClientRect();
|
|
61782
|
+
const x = (this._projV.x * 0.5 + 0.5) * rect.width;
|
|
61783
|
+
const y = (-this._projV.y * 0.5 + 0.5) * rect.height;
|
|
61784
|
+
b.style.left = `${x}px`;
|
|
61785
|
+
b.style.top = `${y}px`;
|
|
61786
|
+
}
|
|
61787
|
+
/** 据当前锚点重建可见的锚点小球(锚点比放点稍大,便于看见与点中取消)。 */
|
|
61788
|
+
rebuildGeoMarkers() {
|
|
61789
|
+
this.setGeoHover(-1);
|
|
61790
|
+
for (const m of this.activeGeoMarkers) {
|
|
61791
|
+
this.o.scene.remove(m);
|
|
61792
|
+
this.disposeObject(m);
|
|
61793
|
+
}
|
|
61794
|
+
this.activeGeoMarkers = [];
|
|
61795
|
+
if (!this.activeGeo)
|
|
61796
|
+
return;
|
|
61797
|
+
for (const v of this.activeGeo.getAnchorLocals()) {
|
|
61798
|
+
const marker = makePointMarker(v, this.o.mesh, this.geodesicColor, this.markerRadius * 1.15);
|
|
61799
|
+
this.o.scene.add(marker);
|
|
61800
|
+
this.activeGeoMarkers.push(marker);
|
|
61801
|
+
}
|
|
61802
|
+
}
|
|
61803
|
+
/** 据当前锚点重画进行中的测地线(不闭合);不足两点时移除线。 */
|
|
61804
|
+
redrawGeoLine() {
|
|
61805
|
+
if (!this.activeGeo)
|
|
61806
|
+
return;
|
|
61807
|
+
const verts = this.activeGeo.buildVertices(false);
|
|
61808
|
+
if (verts.length < 2) {
|
|
61809
|
+
if (this.activeGeoLine) {
|
|
61810
|
+
this.o.scene.remove(this.activeGeoLine);
|
|
61811
|
+
this.disposeObject(this.activeGeoLine);
|
|
61812
|
+
this.activeGeoLine = undefined;
|
|
61813
|
+
}
|
|
61814
|
+
return;
|
|
61815
|
+
}
|
|
61816
|
+
if (!this.activeGeoLine) {
|
|
61817
|
+
this.activeGeoLine = makeContourLine(verts, this.geodesicColor, false, this.o.container, this.epsilon, this.o.mesh);
|
|
61818
|
+
this.o.scene.add(this.activeGeoLine);
|
|
61819
|
+
}
|
|
61820
|
+
else {
|
|
61821
|
+
updateContourLine(this.activeGeoLine, verts, false, this.epsilon, this.o.mesh);
|
|
61822
|
+
}
|
|
61823
|
+
}
|
|
61824
|
+
/** 丢弃进行中的测地线:移除并 dispose 线与全部锚点。 */
|
|
61825
|
+
clearActiveGeo() {
|
|
61826
|
+
this.setGeoHover(-1);
|
|
61827
|
+
if (this.activeGeoLine) {
|
|
61828
|
+
this.o.scene.remove(this.activeGeoLine);
|
|
61829
|
+
this.disposeObject(this.activeGeoLine);
|
|
61830
|
+
this.activeGeoLine = undefined;
|
|
61831
|
+
}
|
|
61832
|
+
for (const m of this.activeGeoMarkers) {
|
|
61833
|
+
this.o.scene.remove(m);
|
|
61834
|
+
this.disposeObject(m);
|
|
61835
|
+
}
|
|
61836
|
+
this.activeGeoMarkers = [];
|
|
61837
|
+
this.activeGeo = undefined;
|
|
61838
|
+
}
|
|
61839
|
+
/** 移除进行中测地线的全部锚点小球(落定后调用:只留下线)。 */
|
|
61840
|
+
removeGeoMarkers() {
|
|
61841
|
+
this.setGeoHover(-1);
|
|
61842
|
+
for (const m of this.activeGeoMarkers) {
|
|
61843
|
+
this.o.scene.remove(m);
|
|
61844
|
+
this.disposeObject(m);
|
|
61845
|
+
}
|
|
61846
|
+
this.activeGeoMarkers = [];
|
|
61632
61847
|
}
|
|
61633
61848
|
closeLastContour() {
|
|
61634
61849
|
const last = this.lastFreehand;
|
|
@@ -61671,7 +61886,10 @@ class SurfaceAnnotator {
|
|
|
61671
61886
|
}
|
|
61672
61887
|
else {
|
|
61673
61888
|
this.o.scene.remove(this.activeGeoLine);
|
|
61889
|
+
this.disposeObject(this.activeGeoLine);
|
|
61674
61890
|
}
|
|
61891
|
+
// 落定后清掉可见锚点,只留下贴合表面的线。
|
|
61892
|
+
this.removeGeoMarkers();
|
|
61675
61893
|
this.activeGeo = undefined;
|
|
61676
61894
|
this.activeGeoLine = undefined;
|
|
61677
61895
|
}
|
|
@@ -61683,6 +61901,10 @@ class SurfaceAnnotator {
|
|
|
61683
61901
|
return tag === "INPUT" || tag === "TEXTAREA" || t.isContentEditable;
|
|
61684
61902
|
}
|
|
61685
61903
|
dispose() {
|
|
61904
|
+
var _a;
|
|
61905
|
+
this.clearActiveGeo();
|
|
61906
|
+
(_a = this.geoHoverBadge) === null || _a === void 0 ? void 0 : _a.remove();
|
|
61907
|
+
this.geoHoverBadge = undefined;
|
|
61686
61908
|
window.removeEventListener("pointerdown", this.onPointerDown, true);
|
|
61687
61909
|
window.removeEventListener("pointermove", this.onPointerMove, true);
|
|
61688
61910
|
window.removeEventListener("pointerup", this.onPointerUp, true);
|
|
@@ -82670,7 +82892,7 @@ function evaluateElement(element, weights) {
|
|
|
82670
82892
|
}
|
|
82671
82893
|
|
|
82672
82894
|
// import * as kiwrious from "copper3d_plugin_heart_k";
|
|
82673
|
-
const REVISION = "v3.6.
|
|
82895
|
+
const REVISION = "v3.6.2-beta";
|
|
82674
82896
|
console.log(`%cCopper3D Visualisation %cBeta:${REVISION}`, "padding: 3px;color:white; background:#023047", "padding: 3px;color:white; background:#f50a25");
|
|
82675
82897
|
|
|
82676
82898
|
export { AI_CHANNEL_HEX_COLORS, AI_MASK_CHANNEL_COLORS, CHANNEL_COLORS, CHANNEL_HEX_COLORS, CameraViewPoint, Copper3dTrackballControls, GaussianSmoother, MeshNodeTool, NrrdTools, REVISION, SurfaceAnnotator, addBoxHelper, addLabelToScene, configKiwriousHeart, convert3DPostoScreenPos, convertScreenPosto3DPos, copperMScene, copperMSceneRenderer, copperRenderer, copperRendererOnDemond, copperScene, copperSceneOnDemond, createTexture2D_NRRD, fullScreenListenner, kiwrious, loading, removeGuiFolderChilden, rgbaToCss, rgbaToHex, setHDRFilePath, throttle };
|
package/dist/bundle.umd.js
CHANGED
|
@@ -61170,16 +61170,54 @@ void main() {
|
|
|
61170
61170
|
this.mesh = mesh;
|
|
61171
61171
|
this.anchors = []; // 顶点索引
|
|
61172
61172
|
this.segments = []; // 相邻锚点间路径(含端点)
|
|
61173
|
+
this.history = []; // 每次增删前的锚点快照,用于撤销
|
|
61174
|
+
}
|
|
61175
|
+
/** 任何改动锚点前先存一份快照(顶点索引数组很小,快照成本可忽略)。 */
|
|
61176
|
+
snapshot() {
|
|
61177
|
+
this.history.push(this.anchors.slice());
|
|
61173
61178
|
}
|
|
61174
61179
|
/** 传入 local 命中点,snap 到最近顶点并对上一锚点求路径。 */
|
|
61175
61180
|
addAnchor(localHitPoint) {
|
|
61176
61181
|
const v = this.graph.nearestVertex(localHitPoint);
|
|
61182
|
+
this.snapshot();
|
|
61177
61183
|
if (this.anchors.length > 0) {
|
|
61178
61184
|
const prev = this.anchors[this.anchors.length - 1];
|
|
61179
61185
|
this.segments.push(this.graph.shortestPath(prev, v));
|
|
61180
61186
|
}
|
|
61181
61187
|
this.anchors.push(v);
|
|
61182
61188
|
}
|
|
61189
|
+
/** 删除指定下标的锚点,重算相邻段(支持取消中间任意一点)。 */
|
|
61190
|
+
removeAnchorAt(index) {
|
|
61191
|
+
if (index < 0 || index >= this.anchors.length)
|
|
61192
|
+
return;
|
|
61193
|
+
this.snapshot();
|
|
61194
|
+
this.anchors.splice(index, 1);
|
|
61195
|
+
this.rebuildSegments();
|
|
61196
|
+
}
|
|
61197
|
+
/** 是否还有可撤销的编辑(加点/删点)。 */
|
|
61198
|
+
canUndo() {
|
|
61199
|
+
return this.history.length > 0;
|
|
61200
|
+
}
|
|
61201
|
+
/** 撤销上一次锚点编辑(加点 → 删回去;删点 → 恢复)。无历史返回 false。 */
|
|
61202
|
+
undoEdit() {
|
|
61203
|
+
const prev = this.history.pop();
|
|
61204
|
+
if (!prev)
|
|
61205
|
+
return false;
|
|
61206
|
+
this.anchors = prev;
|
|
61207
|
+
this.rebuildSegments();
|
|
61208
|
+
return true;
|
|
61209
|
+
}
|
|
61210
|
+
/** 据当前锚点序列整体重算所有相邻段路径。 */
|
|
61211
|
+
rebuildSegments() {
|
|
61212
|
+
this.segments = [];
|
|
61213
|
+
for (let i = 1; i < this.anchors.length; i++) {
|
|
61214
|
+
this.segments.push(this.graph.shortestPath(this.anchors[i - 1], this.anchors[i]));
|
|
61215
|
+
}
|
|
61216
|
+
}
|
|
61217
|
+
/** 各锚点的 local 顶点(用于绘制可见的锚点标记)。 */
|
|
61218
|
+
getAnchorLocals() {
|
|
61219
|
+
return this.anchors.map((i) => this.graph.vertexLocal(i));
|
|
61220
|
+
}
|
|
61183
61221
|
get anchorCount() {
|
|
61184
61222
|
return this.anchors.length;
|
|
61185
61223
|
}
|
|
@@ -61324,6 +61362,11 @@ void main() {
|
|
|
61324
61362
|
this.managed = new Set();
|
|
61325
61363
|
this.seq = 0;
|
|
61326
61364
|
this.selectedId = null;
|
|
61365
|
+
this.activeGeoMarkers = []; // 进行中测地线的可见锚点
|
|
61366
|
+
this.geoRay = new Raycaster();
|
|
61367
|
+
this.geoNdc = new Vector2();
|
|
61368
|
+
this.hoveredGeoMarker = -1;
|
|
61369
|
+
this._projV = new Vector3();
|
|
61327
61370
|
/** 窗口尺寸变化时更新所有 fat line 的像素分辨率,否则线宽会失真。 */
|
|
61328
61371
|
this.onResize = () => {
|
|
61329
61372
|
const w = this.o.container.clientWidth;
|
|
@@ -61378,6 +61421,19 @@ void main() {
|
|
|
61378
61421
|
return;
|
|
61379
61422
|
}
|
|
61380
61423
|
if (this.mode === "geodesic") {
|
|
61424
|
+
// 先判断是否点中了一个已有锚点 → 取消该点(支持取消其中任意一点)。
|
|
61425
|
+
const pick = this.pickGeoMarker(e);
|
|
61426
|
+
if (pick >= 0 && this.activeGeo) {
|
|
61427
|
+
this.activeGeo.removeAnchorAt(pick);
|
|
61428
|
+
if (this.activeGeo.anchorCount === 0)
|
|
61429
|
+
this.clearActiveGeo();
|
|
61430
|
+
else {
|
|
61431
|
+
this.rebuildGeoMarkers();
|
|
61432
|
+
this.redrawGeoLine();
|
|
61433
|
+
}
|
|
61434
|
+
return;
|
|
61435
|
+
}
|
|
61436
|
+
// 否则在表面落一个新锚点。
|
|
61381
61437
|
const h = this.hit(e);
|
|
61382
61438
|
if (!h)
|
|
61383
61439
|
return;
|
|
@@ -61386,19 +61442,19 @@ void main() {
|
|
|
61386
61442
|
}
|
|
61387
61443
|
const local = this.o.mesh.worldToLocal(h.point.clone());
|
|
61388
61444
|
this.activeGeo.addAnchor(local);
|
|
61389
|
-
|
|
61390
|
-
|
|
61391
|
-
this.activeGeoLine = makeContourLine(verts, this.geodesicColor, false, this.o.container, this.epsilon, this.o.mesh);
|
|
61392
|
-
this.o.scene.add(this.activeGeoLine);
|
|
61393
|
-
}
|
|
61394
|
-
else {
|
|
61395
|
-
updateContourLine(this.activeGeoLine, verts, false, this.epsilon, this.o.mesh);
|
|
61396
|
-
}
|
|
61445
|
+
this.rebuildGeoMarkers();
|
|
61446
|
+
this.redrawGeoLine();
|
|
61397
61447
|
}
|
|
61398
61448
|
};
|
|
61399
61449
|
this.onPointerMove = (e) => {
|
|
61400
|
-
if (this.spaceHeld)
|
|
61450
|
+
if (this.spaceHeld) {
|
|
61451
|
+
this.setGeoHover(-1);
|
|
61401
61452
|
return;
|
|
61453
|
+
}
|
|
61454
|
+
// 测地线模式下,悬停到锚点小球时显示"✕"提示(该点可被点击取消)。
|
|
61455
|
+
if (this.mode === "geodesic" && !this.pointerDown) {
|
|
61456
|
+
this.setGeoHover(this.insideContainer(e) ? this.pickGeoMarker(e) : -1);
|
|
61457
|
+
}
|
|
61402
61458
|
if (this.mode === "freehand" &&
|
|
61403
61459
|
this.pointerDown &&
|
|
61404
61460
|
this.activeStroke &&
|
|
@@ -61488,7 +61544,7 @@ void main() {
|
|
|
61488
61544
|
meshGeo.computeVertexNormals(); // 渲染需要法线
|
|
61489
61545
|
meshGeo.computeBoundingBox();
|
|
61490
61546
|
const diag = (_a = opts.bboxDiagonal) !== null && _a !== void 0 ? _a : meshGeo.boundingBox.getSize(new Vector3()).length();
|
|
61491
|
-
this.markerRadius = (_b = opts.markerRadius) !== null && _b !== void 0 ? _b : diag * 0.
|
|
61547
|
+
this.markerRadius = (_b = opts.markerRadius) !== null && _b !== void 0 ? _b : diag * 0.0032;
|
|
61492
61548
|
this.epsilon = diag * 0.002;
|
|
61493
61549
|
this.minGap = diag * 0.004;
|
|
61494
61550
|
this.maxJump = diag * 0.05;
|
|
@@ -61529,6 +61585,9 @@ void main() {
|
|
|
61529
61585
|
}
|
|
61530
61586
|
setMode(m) {
|
|
61531
61587
|
var _a, _b;
|
|
61588
|
+
// 离开测地线模式时丢弃尚未 Enter 落定的进行中测地线(清掉残留的锚点与线)。
|
|
61589
|
+
if (m !== "geodesic" && this.activeGeo)
|
|
61590
|
+
this.clearActiveGeo();
|
|
61532
61591
|
this.mode = m;
|
|
61533
61592
|
this.applyCameraGating();
|
|
61534
61593
|
(_b = (_a = this.o).onModeChange) === null || _b === void 0 ? void 0 : _b.call(_a, m);
|
|
@@ -61541,6 +61600,18 @@ void main() {
|
|
|
61541
61600
|
return this.store.list();
|
|
61542
61601
|
}
|
|
61543
61602
|
undo() {
|
|
61603
|
+
// 测地线进行中 → 撤销最近一次锚点编辑(加点 / 取消点都能回退);
|
|
61604
|
+
// 否则撤销最近一条已落定的标注。
|
|
61605
|
+
if (this.activeGeo && this.activeGeo.canUndo()) {
|
|
61606
|
+
this.activeGeo.undoEdit();
|
|
61607
|
+
if (this.activeGeo.anchorCount === 0)
|
|
61608
|
+
this.clearActiveGeo();
|
|
61609
|
+
else {
|
|
61610
|
+
this.rebuildGeoMarkers();
|
|
61611
|
+
this.redrawGeoLine();
|
|
61612
|
+
}
|
|
61613
|
+
return;
|
|
61614
|
+
}
|
|
61544
61615
|
this.store.undo();
|
|
61545
61616
|
}
|
|
61546
61617
|
clearAll() {
|
|
@@ -61553,6 +61624,7 @@ void main() {
|
|
|
61553
61624
|
});
|
|
61554
61625
|
this.managed.clear();
|
|
61555
61626
|
this.selectedId = null;
|
|
61627
|
+
this.clearActiveGeo();
|
|
61556
61628
|
}
|
|
61557
61629
|
deleteAnnotation(id) {
|
|
61558
61630
|
if (this.selectedId === id)
|
|
@@ -61633,10 +61705,153 @@ void main() {
|
|
|
61633
61705
|
hit(e) {
|
|
61634
61706
|
return raycastSurface(this.o.camera, this.o.container, this.o.mesh, e.clientX, e.clientY);
|
|
61635
61707
|
}
|
|
61636
|
-
/**
|
|
61708
|
+
/**
|
|
61709
|
+
* 事件目标是否是容器内的 WebGL canvas。
|
|
61710
|
+
* 仅认 canvas:面板(GUIDE / 控制面板 / 标注列表的 ✕ 按钮)都是 container 的子元素,
|
|
61711
|
+
* 若只判断 contains 会把面板上的点击也当成在模型上作画 —— 这会"穿透"删除按钮、
|
|
61712
|
+
* 让 ✕ 难以点中。只响应 canvas 上的指针事件即可彻底隔离 UI 与画布。
|
|
61713
|
+
*/
|
|
61637
61714
|
insideContainer(e) {
|
|
61638
61715
|
const t = e.target;
|
|
61639
|
-
return !!t && this.o.container.contains(t);
|
|
61716
|
+
return !!t && t.tagName === "CANVAS" && this.o.container.contains(t);
|
|
61717
|
+
}
|
|
61718
|
+
/** 射线拾取进行中的锚点小球,返回锚点下标;未命中返回 -1。 */
|
|
61719
|
+
pickGeoMarker(e) {
|
|
61720
|
+
if (!this.activeGeoMarkers.length)
|
|
61721
|
+
return -1;
|
|
61722
|
+
const rect = this.o.container.getBoundingClientRect();
|
|
61723
|
+
this.geoNdc.x = ((e.clientX - rect.left) / rect.width) * 2 - 1;
|
|
61724
|
+
this.geoNdc.y = -((e.clientY - rect.top) / rect.height) * 2 + 1;
|
|
61725
|
+
this.geoRay.setFromCamera(this.geoNdc, this.o.camera);
|
|
61726
|
+
const hits = this.geoRay.intersectObjects(this.activeGeoMarkers, false);
|
|
61727
|
+
if (!hits.length)
|
|
61728
|
+
return -1;
|
|
61729
|
+
return this.activeGeoMarkers.indexOf(hits[0].object);
|
|
61730
|
+
}
|
|
61731
|
+
/** 设置当前悬停的锚点(-1 = 无):更新高亮缩放、光标与"✕(可取消)"悬浮标。 */
|
|
61732
|
+
setGeoHover(idx) {
|
|
61733
|
+
if (idx === this.hoveredGeoMarker) {
|
|
61734
|
+
if (idx >= 0)
|
|
61735
|
+
this.positionGeoBadge(this.activeGeoMarkers[idx]);
|
|
61736
|
+
return;
|
|
61737
|
+
}
|
|
61738
|
+
const prev = this.activeGeoMarkers[this.hoveredGeoMarker];
|
|
61739
|
+
if (prev)
|
|
61740
|
+
prev.scale.setScalar(1);
|
|
61741
|
+
this.hoveredGeoMarker = idx;
|
|
61742
|
+
const cur = this.activeGeoMarkers[idx];
|
|
61743
|
+
if (cur) {
|
|
61744
|
+
cur.scale.setScalar(1.3);
|
|
61745
|
+
this.ensureGeoBadge().style.display = "flex";
|
|
61746
|
+
this.positionGeoBadge(cur);
|
|
61747
|
+
this.o.container.style.cursor = "pointer";
|
|
61748
|
+
}
|
|
61749
|
+
else {
|
|
61750
|
+
if (this.geoHoverBadge)
|
|
61751
|
+
this.geoHoverBadge.style.display = "none";
|
|
61752
|
+
this.o.container.style.cursor = "";
|
|
61753
|
+
}
|
|
61754
|
+
}
|
|
61755
|
+
/** 懒创建悬浮 ✕ 标(挂在 container 内,pointer-events:none 不挡点击)。 */
|
|
61756
|
+
ensureGeoBadge() {
|
|
61757
|
+
if (this.geoHoverBadge)
|
|
61758
|
+
return this.geoHoverBadge;
|
|
61759
|
+
const b = document.createElement("div");
|
|
61760
|
+
b.textContent = "✕";
|
|
61761
|
+
Object.assign(b.style, {
|
|
61762
|
+
position: "absolute",
|
|
61763
|
+
width: "16px",
|
|
61764
|
+
height: "16px",
|
|
61765
|
+
borderRadius: "50%",
|
|
61766
|
+
background: "#ff5d6c",
|
|
61767
|
+
color: "#fff",
|
|
61768
|
+
font: "700 10px/1 system-ui, sans-serif",
|
|
61769
|
+
display: "none",
|
|
61770
|
+
alignItems: "center",
|
|
61771
|
+
justifyContent: "center",
|
|
61772
|
+
pointerEvents: "none",
|
|
61773
|
+
zIndex: "15",
|
|
61774
|
+
boxShadow: "0 2px 6px rgba(0,0,0,.45)",
|
|
61775
|
+
transform: "translate(-50%, -50%)",
|
|
61776
|
+
left: "0px",
|
|
61777
|
+
top: "0px",
|
|
61778
|
+
});
|
|
61779
|
+
this.o.container.appendChild(b);
|
|
61780
|
+
this.geoHoverBadge = b;
|
|
61781
|
+
return b;
|
|
61782
|
+
}
|
|
61783
|
+
/** 把 ✕ 标定位到锚点投影到屏幕的位置(正中心,即光标悬停处,避免歧义)。 */
|
|
61784
|
+
positionGeoBadge(marker) {
|
|
61785
|
+
if (!marker)
|
|
61786
|
+
return;
|
|
61787
|
+
const b = this.ensureGeoBadge();
|
|
61788
|
+
this._projV.copy(marker.position).project(this.o.camera);
|
|
61789
|
+
const rect = this.o.container.getBoundingClientRect();
|
|
61790
|
+
const x = (this._projV.x * 0.5 + 0.5) * rect.width;
|
|
61791
|
+
const y = (-this._projV.y * 0.5 + 0.5) * rect.height;
|
|
61792
|
+
b.style.left = `${x}px`;
|
|
61793
|
+
b.style.top = `${y}px`;
|
|
61794
|
+
}
|
|
61795
|
+
/** 据当前锚点重建可见的锚点小球(锚点比放点稍大,便于看见与点中取消)。 */
|
|
61796
|
+
rebuildGeoMarkers() {
|
|
61797
|
+
this.setGeoHover(-1);
|
|
61798
|
+
for (const m of this.activeGeoMarkers) {
|
|
61799
|
+
this.o.scene.remove(m);
|
|
61800
|
+
this.disposeObject(m);
|
|
61801
|
+
}
|
|
61802
|
+
this.activeGeoMarkers = [];
|
|
61803
|
+
if (!this.activeGeo)
|
|
61804
|
+
return;
|
|
61805
|
+
for (const v of this.activeGeo.getAnchorLocals()) {
|
|
61806
|
+
const marker = makePointMarker(v, this.o.mesh, this.geodesicColor, this.markerRadius * 1.15);
|
|
61807
|
+
this.o.scene.add(marker);
|
|
61808
|
+
this.activeGeoMarkers.push(marker);
|
|
61809
|
+
}
|
|
61810
|
+
}
|
|
61811
|
+
/** 据当前锚点重画进行中的测地线(不闭合);不足两点时移除线。 */
|
|
61812
|
+
redrawGeoLine() {
|
|
61813
|
+
if (!this.activeGeo)
|
|
61814
|
+
return;
|
|
61815
|
+
const verts = this.activeGeo.buildVertices(false);
|
|
61816
|
+
if (verts.length < 2) {
|
|
61817
|
+
if (this.activeGeoLine) {
|
|
61818
|
+
this.o.scene.remove(this.activeGeoLine);
|
|
61819
|
+
this.disposeObject(this.activeGeoLine);
|
|
61820
|
+
this.activeGeoLine = undefined;
|
|
61821
|
+
}
|
|
61822
|
+
return;
|
|
61823
|
+
}
|
|
61824
|
+
if (!this.activeGeoLine) {
|
|
61825
|
+
this.activeGeoLine = makeContourLine(verts, this.geodesicColor, false, this.o.container, this.epsilon, this.o.mesh);
|
|
61826
|
+
this.o.scene.add(this.activeGeoLine);
|
|
61827
|
+
}
|
|
61828
|
+
else {
|
|
61829
|
+
updateContourLine(this.activeGeoLine, verts, false, this.epsilon, this.o.mesh);
|
|
61830
|
+
}
|
|
61831
|
+
}
|
|
61832
|
+
/** 丢弃进行中的测地线:移除并 dispose 线与全部锚点。 */
|
|
61833
|
+
clearActiveGeo() {
|
|
61834
|
+
this.setGeoHover(-1);
|
|
61835
|
+
if (this.activeGeoLine) {
|
|
61836
|
+
this.o.scene.remove(this.activeGeoLine);
|
|
61837
|
+
this.disposeObject(this.activeGeoLine);
|
|
61838
|
+
this.activeGeoLine = undefined;
|
|
61839
|
+
}
|
|
61840
|
+
for (const m of this.activeGeoMarkers) {
|
|
61841
|
+
this.o.scene.remove(m);
|
|
61842
|
+
this.disposeObject(m);
|
|
61843
|
+
}
|
|
61844
|
+
this.activeGeoMarkers = [];
|
|
61845
|
+
this.activeGeo = undefined;
|
|
61846
|
+
}
|
|
61847
|
+
/** 移除进行中测地线的全部锚点小球(落定后调用:只留下线)。 */
|
|
61848
|
+
removeGeoMarkers() {
|
|
61849
|
+
this.setGeoHover(-1);
|
|
61850
|
+
for (const m of this.activeGeoMarkers) {
|
|
61851
|
+
this.o.scene.remove(m);
|
|
61852
|
+
this.disposeObject(m);
|
|
61853
|
+
}
|
|
61854
|
+
this.activeGeoMarkers = [];
|
|
61640
61855
|
}
|
|
61641
61856
|
closeLastContour() {
|
|
61642
61857
|
const last = this.lastFreehand;
|
|
@@ -61679,7 +61894,10 @@ void main() {
|
|
|
61679
61894
|
}
|
|
61680
61895
|
else {
|
|
61681
61896
|
this.o.scene.remove(this.activeGeoLine);
|
|
61897
|
+
this.disposeObject(this.activeGeoLine);
|
|
61682
61898
|
}
|
|
61899
|
+
// 落定后清掉可见锚点,只留下贴合表面的线。
|
|
61900
|
+
this.removeGeoMarkers();
|
|
61683
61901
|
this.activeGeo = undefined;
|
|
61684
61902
|
this.activeGeoLine = undefined;
|
|
61685
61903
|
}
|
|
@@ -61691,6 +61909,10 @@ void main() {
|
|
|
61691
61909
|
return tag === "INPUT" || tag === "TEXTAREA" || t.isContentEditable;
|
|
61692
61910
|
}
|
|
61693
61911
|
dispose() {
|
|
61912
|
+
var _a;
|
|
61913
|
+
this.clearActiveGeo();
|
|
61914
|
+
(_a = this.geoHoverBadge) === null || _a === void 0 ? void 0 : _a.remove();
|
|
61915
|
+
this.geoHoverBadge = undefined;
|
|
61694
61916
|
window.removeEventListener("pointerdown", this.onPointerDown, true);
|
|
61695
61917
|
window.removeEventListener("pointermove", this.onPointerMove, true);
|
|
61696
61918
|
window.removeEventListener("pointerup", this.onPointerUp, true);
|
|
@@ -82678,7 +82900,7 @@ void main() {
|
|
|
82678
82900
|
}
|
|
82679
82901
|
|
|
82680
82902
|
// import * as kiwrious from "copper3d_plugin_heart_k";
|
|
82681
|
-
const REVISION = "v3.6.
|
|
82903
|
+
const REVISION = "v3.6.2-beta";
|
|
82682
82904
|
console.log(`%cCopper3D Visualisation %cBeta:${REVISION}`, "padding: 3px;color:white; background:#023047", "padding: 3px;color:white; background:#f50a25");
|
|
82683
82905
|
|
|
82684
82906
|
exports.AI_CHANNEL_HEX_COLORS = AI_CHANNEL_HEX_COLORS;
|
package/dist/index.d.ts
CHANGED
|
@@ -28,6 +28,6 @@ import { CHANNEL_COLORS, CHANNEL_HEX_COLORS, AI_MASK_CHANNEL_COLORS, AI_CHANNEL_
|
|
|
28
28
|
import type { LayerId, ChannelValue } from "./Utils/segmentation/core/index";
|
|
29
29
|
import type { AiPromptTool, AiPromptPoint, AiPromptPayload, AiMaskResult } from "./Utils/segmentation/tools/AiAssistTool";
|
|
30
30
|
import "./css/style.css";
|
|
31
|
-
export declare const REVISION = "v3.6.
|
|
31
|
+
export declare const REVISION = "v3.6.2-beta";
|
|
32
32
|
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, AI_MASK_CHANNEL_COLORS, AI_CHANNEL_HEX_COLORS, rgbaToHex, rgbaToCss, GaussianSmoother, SurfaceAnnotator, };
|
|
33
33
|
export type { positionType, screenPosType, optsType, nrrdMeshesType, nrrdSliceType, SensorDecodedValue_kiwrious, SensorReadResult_kiwrious, HeartRateResult_kiwrious, loadingBarType, IPaintImage, exportPaintImageType, IOptVTKLoader, aligned4DSurfaceType, aligned4DOptsType, Aligned4DController, ICommXYZ, IGUIStates, IGuiParameterSettings, INrrdStates, NrrdState, GuiState, IGuiMeta, ToolMode, IAnnotationCallbacks, LayerId, ChannelValue, AiPromptTool, AiPromptPoint, AiPromptPayload, AiMaskResult, SurfaceAnnotatorOptions, Annotation, AnnotationMode, ExportOptions, };
|
package/dist/index.js
CHANGED
|
@@ -22,7 +22,7 @@ import { removeGuiFolderChilden } from "./Utils/segmentation/coreTools/gui";
|
|
|
22
22
|
import { SurfaceAnnotator } from "./Utils/surfaceAnnotation";
|
|
23
23
|
import { CHANNEL_COLORS, CHANNEL_HEX_COLORS, AI_MASK_CHANNEL_COLORS, AI_CHANNEL_HEX_COLORS, rgbaToHex, rgbaToCss } from "./Utils/segmentation/core/index";
|
|
24
24
|
import "./css/style.css";
|
|
25
|
-
export const REVISION = "v3.6.
|
|
25
|
+
export const REVISION = "v3.6.2-beta";
|
|
26
26
|
console.log(`%cCopper3D Visualisation %cBeta:${REVISION}`, "padding: 3px;color:white; background:#023047", "padding: 3px;color:white; background:#f50a25");
|
|
27
27
|
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, AI_MASK_CHANNEL_COLORS, AI_CHANNEL_HEX_COLORS, rgbaToHex, rgbaToCss, GaussianSmoother, SurfaceAnnotator, };
|
|
28
28
|
//# sourceMappingURL=index.js.map
|
|
@@ -49,6 +49,12 @@ export declare class SurfaceAnnotator {
|
|
|
49
49
|
private lastFreehand?;
|
|
50
50
|
private activeGeo?;
|
|
51
51
|
private activeGeoLine?;
|
|
52
|
+
private activeGeoMarkers;
|
|
53
|
+
private geoRay;
|
|
54
|
+
private geoNdc;
|
|
55
|
+
private geoHoverBadge?;
|
|
56
|
+
private hoveredGeoMarker;
|
|
57
|
+
private _projV;
|
|
52
58
|
constructor(opts: SurfaceAnnotatorOptions);
|
|
53
59
|
/** 窗口尺寸变化时更新所有 fat line 的像素分辨率,否则线宽会失真。 */
|
|
54
60
|
private onResize;
|
|
@@ -87,9 +93,30 @@ export declare class SurfaceAnnotator {
|
|
|
87
93
|
private disposeObject;
|
|
88
94
|
private nextId;
|
|
89
95
|
private hit;
|
|
90
|
-
/**
|
|
96
|
+
/**
|
|
97
|
+
* 事件目标是否是容器内的 WebGL canvas。
|
|
98
|
+
* 仅认 canvas:面板(GUIDE / 控制面板 / 标注列表的 ✕ 按钮)都是 container 的子元素,
|
|
99
|
+
* 若只判断 contains 会把面板上的点击也当成在模型上作画 —— 这会"穿透"删除按钮、
|
|
100
|
+
* 让 ✕ 难以点中。只响应 canvas 上的指针事件即可彻底隔离 UI 与画布。
|
|
101
|
+
*/
|
|
91
102
|
private insideContainer;
|
|
92
103
|
private onPointerDown;
|
|
104
|
+
/** 射线拾取进行中的锚点小球,返回锚点下标;未命中返回 -1。 */
|
|
105
|
+
private pickGeoMarker;
|
|
106
|
+
/** 设置当前悬停的锚点(-1 = 无):更新高亮缩放、光标与"✕(可取消)"悬浮标。 */
|
|
107
|
+
private setGeoHover;
|
|
108
|
+
/** 懒创建悬浮 ✕ 标(挂在 container 内,pointer-events:none 不挡点击)。 */
|
|
109
|
+
private ensureGeoBadge;
|
|
110
|
+
/** 把 ✕ 标定位到锚点投影到屏幕的位置(正中心,即光标悬停处,避免歧义)。 */
|
|
111
|
+
private positionGeoBadge;
|
|
112
|
+
/** 据当前锚点重建可见的锚点小球(锚点比放点稍大,便于看见与点中取消)。 */
|
|
113
|
+
private rebuildGeoMarkers;
|
|
114
|
+
/** 据当前锚点重画进行中的测地线(不闭合);不足两点时移除线。 */
|
|
115
|
+
private redrawGeoLine;
|
|
116
|
+
/** 丢弃进行中的测地线:移除并 dispose 线与全部锚点。 */
|
|
117
|
+
private clearActiveGeo;
|
|
118
|
+
/** 移除进行中测地线的全部锚点小球(落定后调用:只留下线)。 */
|
|
119
|
+
private removeGeoMarkers;
|
|
93
120
|
private onPointerMove;
|
|
94
121
|
private onPointerUp;
|
|
95
122
|
private closeLastContour;
|
|
@@ -10,9 +10,22 @@ export declare class GeodesicContour {
|
|
|
10
10
|
private mesh;
|
|
11
11
|
private anchors;
|
|
12
12
|
private segments;
|
|
13
|
+
private history;
|
|
13
14
|
constructor(graph: MeshGraph, mesh: THREE.Mesh);
|
|
15
|
+
/** 任何改动锚点前先存一份快照(顶点索引数组很小,快照成本可忽略)。 */
|
|
16
|
+
private snapshot;
|
|
14
17
|
/** 传入 local 命中点,snap 到最近顶点并对上一锚点求路径。 */
|
|
15
18
|
addAnchor(localHitPoint: THREE.Vector3): void;
|
|
19
|
+
/** 删除指定下标的锚点,重算相邻段(支持取消中间任意一点)。 */
|
|
20
|
+
removeAnchorAt(index: number): void;
|
|
21
|
+
/** 是否还有可撤销的编辑(加点/删点)。 */
|
|
22
|
+
canUndo(): boolean;
|
|
23
|
+
/** 撤销上一次锚点编辑(加点 → 删回去;删点 → 恢复)。无历史返回 false。 */
|
|
24
|
+
undoEdit(): boolean;
|
|
25
|
+
/** 据当前锚点序列整体重算所有相邻段路径。 */
|
|
26
|
+
private rebuildSegments;
|
|
27
|
+
/** 各锚点的 local 顶点(用于绘制可见的锚点标记)。 */
|
|
28
|
+
getAnchorLocals(): AnnotationVertex[];
|
|
16
29
|
get anchorCount(): number;
|
|
17
30
|
/** 把所有路径顶点(world)+ 法线 拼成折线;closed 时补一段首尾路径。 */
|
|
18
31
|
buildVertices(closed: boolean): AnnotationVertex[];
|
package/dist/types/index.d.ts
CHANGED
|
@@ -28,6 +28,6 @@ import { CHANNEL_COLORS, CHANNEL_HEX_COLORS, AI_MASK_CHANNEL_COLORS, AI_CHANNEL_
|
|
|
28
28
|
import type { LayerId, ChannelValue } from "./Utils/segmentation/core/index";
|
|
29
29
|
import type { AiPromptTool, AiPromptPoint, AiPromptPayload, AiMaskResult } from "./Utils/segmentation/tools/AiAssistTool";
|
|
30
30
|
import "./css/style.css";
|
|
31
|
-
export declare const REVISION = "v3.6.
|
|
31
|
+
export declare const REVISION = "v3.6.2-beta";
|
|
32
32
|
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, AI_MASK_CHANNEL_COLORS, AI_CHANNEL_HEX_COLORS, rgbaToHex, rgbaToCss, GaussianSmoother, SurfaceAnnotator, };
|
|
33
33
|
export type { positionType, screenPosType, optsType, nrrdMeshesType, nrrdSliceType, SensorDecodedValue_kiwrious, SensorReadResult_kiwrious, HeartRateResult_kiwrious, loadingBarType, IPaintImage, exportPaintImageType, IOptVTKLoader, aligned4DSurfaceType, aligned4DOptsType, Aligned4DController, ICommXYZ, IGUIStates, IGuiParameterSettings, INrrdStates, NrrdState, GuiState, IGuiMeta, ToolMode, IAnnotationCallbacks, LayerId, ChannelValue, AiPromptTool, AiPromptPoint, AiPromptPayload, AiMaskResult, SurfaceAnnotatorOptions, Annotation, AnnotationMode, ExportOptions, };
|
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.6.
|
|
4
|
+
"version": "3.6.2",
|
|
5
5
|
"main": "dist/bundle.umd.js",
|
|
6
6
|
"moudle": "dist/bundle.esm.js",
|
|
7
7
|
"types": "dist/types/index.d.ts",
|