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.
@@ -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
- const verts = this.activeGeo.buildVertices(false);
91
- if (!this.activeGeoLine) {
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.006;
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;IAI1B,YAAoB,KAAgB,EAAU,IAAgB;QAA1C,UAAK,GAAL,KAAK,CAAW;QAAU,SAAI,GAAJ,IAAI,CAAY;QAHtD,YAAO,GAAa,EAAE,CAAC,CAAC,OAAO;QAC/B,aAAQ,GAAe,EAAE,CAAC,CAAC,eAAe;IAEe,CAAC;IAElE,wCAAwC;IACxC,SAAS,CAAC,aAA4B;QACpC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;QAClD,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;YAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACnD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;SACtD;QACD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;IAC7B,CAAC;IAED,+CAA+C;IAC/C,aAAa,CAAC,MAAe;QAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACnC,IAAI,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;YACrC,IAAI,CAAC,IAAI,CACP,IAAI,CAAC,KAAK,CAAC,YAAY,CACrB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,EACrC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAChB,CACF,CAAC;SACH;QACD,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE;YACrB,MAAM,KAAK,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY;YAC5C,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE;gBAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;QACH,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;YACrD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;SAC/B;QACD,6CAA6C;QAC7C,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IACvD,CAAC;CACF"}
1
+ {"version":3,"file":"geodesicContour.js","sourceRoot":"","sources":["../../../src/Utils/surfaceAnnotation/geodesicContour.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,MAAM,OAAO,eAAe;IAK1B,YAAoB,KAAgB,EAAU,IAAgB;QAA1C,UAAK,GAAL,KAAK,CAAW;QAAU,SAAI,GAAJ,IAAI,CAAY;QAJtD,YAAO,GAAa,EAAE,CAAC,CAAC,OAAO;QAC/B,aAAQ,GAAe,EAAE,CAAC,CAAC,eAAe;QAC1C,YAAO,GAAe,EAAE,CAAC,CAAC,kBAAkB;IAEa,CAAC;IAElE,uCAAuC;IAC/B,QAAQ;QACd,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED,wCAAwC;IACxC,SAAS,CAAC,aAA4B;QACpC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;QAClD,IAAI,CAAC,QAAQ,EAAE,CAAC;QAChB,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;YAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACnD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;SACtD;QACD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC;IAED,mCAAmC;IACnC,cAAc,CAAC,KAAa;QAC1B,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM;YAAE,OAAO;QACtD,IAAI,CAAC,QAAQ,EAAE,CAAC;QAChB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAC9B,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IAED,yBAAyB;IACzB,OAAO;QACL,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;IACjC,CAAC;IAED,+CAA+C;IAC/C,QAAQ;QACN,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;QAChC,IAAI,CAAC,IAAI;YAAE,OAAO,KAAK,CAAC;QACxB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,0BAA0B;IAClB,eAAe;QACrB,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;QACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAC5C,IAAI,CAAC,QAAQ,CAAC,IAAI,CAChB,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAC9D,CAAC;SACH;IACH,CAAC;IAED,kCAAkC;IAClC,eAAe;QACb,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5D,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;IAC7B,CAAC;IAED,+CAA+C;IAC/C,aAAa,CAAC,MAAe;QAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACnC,IAAI,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;YACrC,IAAI,CAAC,IAAI,CACP,IAAI,CAAC,KAAK,CAAC,YAAY,CACrB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,EACrC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAChB,CACF,CAAC;SACH;QACD,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE;YACrB,MAAM,KAAK,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY;YAC5C,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE;gBAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;QACH,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;YACrD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;SAC/B;QACD,6CAA6C;QAC7C,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IACvD,CAAC;CACF"}
@@ -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
- const verts = this.activeGeo.buildVertices(false);
61382
- if (!this.activeGeoLine) {
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.006;
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.1-beta";
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 };
@@ -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
- const verts = this.activeGeo.buildVertices(false);
61390
- if (!this.activeGeoLine) {
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.006;
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.1-beta";
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.1-beta";
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.1-beta";
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[];
@@ -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.1-beta";
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.1",
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",