From ce99c158951017cff0527d6706953a833c106f7b Mon Sep 17 00:00:00 2001 From: Maxim Dolgolyov Date: Wed, 17 Jun 2026 18:14:53 +0300 Subject: [PATCH] =?UTF-8?q?feat(stereo):=20=D0=BC=D0=B0=D1=81=D1=82=D0=B5?= =?UTF-8?q?=D1=80-=D1=82=D1=83=D0=BC=D0=B1=D0=BB=D0=B5=D1=80=20=C2=AB?= =?UTF-8?q?=D0=A4=D0=B8=D0=B3=D1=83=D1=80=D0=B0=C2=BB=20=E2=80=94=20=D1=81?= =?UTF-8?q?=D0=BA=D1=80=D1=8B=D1=82=D1=8C=20=D1=82=D0=B5=D0=BB=D0=BE=20?= =?UTF-8?q?=D1=81=20=D0=BF=D0=BE=D0=BB=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Не было способа убрать само тело со сцены. Добавил тумблер «Фигура» в начале секции «Отображение»: скрывает грани, рёбра, вершины и подписи тела, оставляя сетку/оси и ВСЕ построения, точки, сечения и выделения — удобно работать с конструкциями на «пустом» поле. - StereoSim: флаг showFigure (деф. true) + toggleFigure(v) — переключает _figGroup.visible/_labelGroup.visible (флаг переживает _clearGroup, поэтому фигура остаётся скрытой и после перестроения при смене параметров). При смене типа фигуры (setFigure) тело снова показывается. - Панель: st-toggle-row #stg-figure; диспетчер stereoToggleSt('figure'); setStereoFigure возвращает тумблер в «вкл» для новой фигуры. Верификация: node --check OK; headless-смоук 13/13 (деф. видна; скрытие прячет fig+labels, но grid/construct/poly/point-группы остаются; перестроение сохраняет скрытие; обратное включение; setFigure ре-показывает; dispose); эмодзи/eval/new Function — 0. Co-Authored-By: Claude Opus 4.8 (1M context) --- frontend/js/labs/stereo.js | 5 +++++ frontend/labs-bodies.html | 4 ++++ 2 files changed, 9 insertions(+) diff --git a/frontend/js/labs/stereo.js b/frontend/js/labs/stereo.js index bca4249..0c7f9ba 100644 --- a/frontend/js/labs/stereo.js +++ b/frontend/js/labs/stereo.js @@ -247,6 +247,7 @@ class StereoSim { /* state */ this.figureType = 'cube'; this.params = { a: 4, b: 3, c: 5, h: 5, r: 2, R: 3, n: 4 }; + this.showFigure = true; // master: show/hide the solid itself (faces+edges+vertices+labels) this.showEdges = true; this.showVertices = true; this.showLabels = true; @@ -369,6 +370,7 @@ class StereoSim { setFigure(type) { this.figureType = type; + this.showFigure = true; this._figGroup.visible = true; this._labelGroup.visible = true; this._unfold = false; this._unfoldProgress = 0; this._unfoldTarget = 0; this.showSection = false; this.showInscribed = false; this.showCircumscribed = false; @@ -423,6 +425,7 @@ class StereoSim { this._buildFigure(); } + toggleFigure(v) { this.showFigure = v; this._figGroup.visible = v; this._labelGroup.visible = v; this._invalidate(); } toggleEdges(v) { this.showEdges = v; this._buildFigure(); } toggleVertices(v) { this.showVertices = v; this._buildFigure(); } toggleLabels(v) { this.showLabels = v; this._buildFigure(); this._rebuildConstructions(); } @@ -4895,6 +4898,7 @@ class StereoSim { ['stg-height','stg-apothem','stg-diagonals','stg-midpoints','stg-inscribed','stg-circumscribed','stg-edgelengths'].forEach(id => { document.getElementById(id)?.classList.remove('on'); }); + document.getElementById('stg-figure')?.classList.add('on'); // new figure → visible _stereoDeactivateTools(); } } @@ -4978,6 +4982,7 @@ class StereoSim { const on = !toggle.classList.contains('on'); toggle.classList.toggle('on', on); if (!stereoSim) return; + if (layer === 'figure') stereoSim.toggleFigure(on); if (layer === 'edges') stereoSim.toggleEdges(on); if (layer === 'vertices') stereoSim.toggleVertices(on); if (layer === 'labels') stereoSim.toggleLabels(on); diff --git a/frontend/labs-bodies.html b/frontend/labs-bodies.html index 1a8de15..dcf3bea 100644 --- a/frontend/labs-bodies.html +++ b/frontend/labs-bodies.html @@ -3569,6 +3569,10 @@
Отображение
+
+ Фигура +
+
Рёбра