From 5e6effa8cdf5c717397aa6272a443db0944bea2e Mon Sep 17 00:00:00 2001 From: Maxim Dolgolyov Date: Wed, 17 Jun 2026 17:52:26 +0300 Subject: [PATCH] =?UTF-8?q?feat(stereo):=20=D1=82=D1=83=D0=BC=D0=B1=D0=BB?= =?UTF-8?q?=D0=B5=D1=80=20=D0=BF=D0=BE=D0=BA=D0=B0=D0=B7=D0=B0=20=D0=B4?= =?UTF-8?q?=D0=BB=D0=B8=D0=BD=20=D1=81=D0=BE=D0=B5=D0=B4=D0=B8=D0=BD=D1=91?= =?UTF-8?q?=D0=BD=D0=BD=D1=8B=D1=85=20=D0=BE=D1=82=D1=80=D0=B5=D0=B7=D0=BA?= =?UTF-8?q?=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit В инструменте «Соединить» подпись длины у каждого отрезка рисовалась всегда. Добавил переключатель «Длины отрезков» (секция «Инструменты»): прячет только подписи длин, сами отрезки и точки остаются. - StereoSim: флаг showConnectionLengths (деф. true), гард в _rebuildPointVisuals, метод toggleConnectionLengths(on). Предпочтение переживает смену фигуры (не сбрасывается в setFigure). - Панель: st-toggle-row #stg-connlen + glue stereoToggleConnLen. Верификация: node --check OK; headless-смоук 8/8 (деф. вкл, подпись гейтится флагом, линия/маркеры сохраняются, предпочтение переживает setFigure); эмодзи/eval/new Function — 0. Co-Authored-By: Claude Opus 4.8 (1M context) --- frontend/js/labs/stereo.js | 29 ++++++++++++++++++++++------- frontend/labs-bodies.html | 4 ++++ 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/frontend/js/labs/stereo.js b/frontend/js/labs/stereo.js index d3fd2f1..01a3e2e 100644 --- a/frontend/js/labs/stereo.js +++ b/frontend/js/labs/stereo.js @@ -289,6 +289,7 @@ class StereoSim { this._customPoints = []; // [{pos: Vector3, edgeIdx: number, t: number, label: string}] this._connections = []; // [{from: idx, to: idx}] this._connectPicks = []; // temp picks for connecting + this.showConnectionLengths = true; // show length labels on connected segments this._pointGroup = new THREE.Group(); this.scene.add(this._pointGroup); this._nextPointId = 1; @@ -557,6 +558,12 @@ class StereoSim { this.renderer.domElement.style.cursor = on ? 'pointer' : 'grab'; } + toggleConnectionLengths(on) { + this.showConnectionLengths = on; + this._rebuildPointVisuals(); + this._invalidate(); + } + clearCustomPoints() { this._customPoints = []; this._connections = []; @@ -2794,13 +2801,15 @@ class StereoSim { line.computeLineDistances(); this._pointGroup.add(line); - // Distance label - const dist = posA.distanceTo(posB); - const mid = new THREE.Vector3().addVectors(posA, posB).multiplyScalar(0.5); - const lbl = this._makeTextSprite(dist.toFixed(2), '#F59E0B', 36); - lbl.position.copy(mid).add(new THREE.Vector3(0, 0.25, 0)); - lbl.scale.set(0.8, 0.4, 1); - this._pointGroup.add(lbl); + // Distance label (optional — toggle "Длины отрезков") + if (this.showConnectionLengths) { + const dist = posA.distanceTo(posB); + const mid = new THREE.Vector3().addVectors(posA, posB).multiplyScalar(0.5); + const lbl = this._makeTextSprite(dist.toFixed(2), '#F59E0B', 36); + lbl.position.copy(mid).add(new THREE.Vector3(0, 0.25, 0)); + lbl.scale.set(0.8, 0.4, 1); + this._pointGroup.add(lbl); + } } } @@ -5059,6 +5068,12 @@ class StereoSim { _stereoUpdatePointsInfo(); } + function stereoToggleConnLen(toggle) { + const on = !toggle.classList.contains('on'); + toggle.classList.toggle('on', on); + if (stereoSim) stereoSim.toggleConnectionLengths(on); + } + /* ── Constructions: lines & planes (Phase A) ── */ function stereoLineMode(btn) { const on = !btn.classList.contains('active'); diff --git a/frontend/labs-bodies.html b/frontend/labs-bodies.html index 530044e..2597d52 100644 --- a/frontend/labs-bodies.html +++ b/frontend/labs-bodies.html @@ -3670,6 +3670,10 @@ +
+ Длины отрезков +
+