feat(labs): Фаза2 — измерительные инструменты (линейка + угломер)

LabMeasure (_measure.js): SVG-оверлей поверх сцены с pointer-events:none
(симуляция остаётся интерактивной), перетаскиваемые ручки. Линейка — длина
px + ≈ метры (PX_PER_M) + угол; угломер — угол при вершине с дугой.
Кнопка-тумблер в топбаре лаборатории. Самодостаточно, симуляции не трогает.
Этим Фаза 2 закрыта.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Maxim Dolgolyov
2026-06-13 11:13:41 +03:00
parent 51fcb6e4b7
commit eca68e1a28
3 changed files with 132 additions and 1 deletions
+6
View File
@@ -357,6 +357,11 @@
<svg class="ic" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/><polyline points="7 10 12 15 17 10"/><line x1="12" y1="15" x2="12" y2="3"/></svg>
</button>
<!-- measurement tools (ruler / angle) -->
<button class="zoom-btn" id="lab-measure-btn" onclick="window.LabMeasure&&LabMeasure.toggle()" title="Измерения: линейка и угломер">
<svg class="ic" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21.3 8.7 8.7 21.3a1 1 0 0 1-1.4 0l-4.6-4.6a1 1 0 0 1 0-1.4L15.3 2.7a1 1 0 0 1 1.4 0l4.6 4.6a1 1 0 0 1 0 1.4Z"/><path d="m7.5 10.5 2 2M10.5 7.5l2 2M13.5 4.5l2 2M4.5 13.5l2 2"/></svg>
</button>
<!-- sound toggle -->
<button class="zoom-btn" id="labfx-sound-btn" onclick="(function(){var e=window.LabFX&&window.LabFX.sound;if(!e)return;e.setEnabled(!e.isEnabled());document.getElementById('labfx-sound-btn').setAttribute('aria-pressed',e.isEnabled());document.getElementById('labfx-sound-icon-on').style.display=e.isEnabled()?'':'none';document.getElementById('labfx-sound-icon-off').style.display=e.isEnabled()?'none':'';})()" title="Звук симуляций" style="position:relative" aria-pressed="true">
<!-- speaker on -->
@@ -449,6 +454,7 @@
<script src="/js/labs/_sim_engine.js"></script>
<script src="/js/labs/_sim_adapter.js"></script>
<script src="/js/labs/_tasks.js"></script>
<script src="/js/labs/_measure.js"></script>
<script src="/js/labs/_phys_visuals.js"></script>
<script src="/js/labs/_chem_visuals.js"></script>
<script src="/js/labs/graph.js"></script>