feat(stereo): A3 — параллели/перпендикуляры + общий undo/redo построений
Фаза A3 раунда «Конструктор». Построения через точку, опираясь на объект: - lpar: прямая ∥ выбранной прямой; - lperp: прямая ⟂ выбранной плоскости (вдоль нормали); - ppar: плоскость ∥ выбранной плоскости; - pperp: плоскость ⟂ выбранной прямой (= плоскость по точке+нормали, через _createPlaneFromPointNormal — мост к Фазе C). Поток: кнопка op → выбор опоры в дереве → клик точки. Общий undo/redo конструкторного слоя: JSON-снапшоты _undoStack/_redoStack (кап 60), хуки _pushHistory в create/remove/clear; Ctrl+Z / Ctrl+Shift+Z / Ctrl+Y + кнопки «Отменить»/«Вернуть». Видимость объекта — не шаг истории. - StereoSim: setRelMode/_pickRelRef/_onRelClick/_createPlaneFromPointNormal; _snapshot/_pushHistory/_restoreSnapshot/undo/redo/canUndo/canRedo; pickConstructObject диспатчит rel/intersect; getConstructions отдаёт relMode + selected по опоре; _lastConstructMsg → flash в подсказку. Сброс rel/истории в setFigure, очистка в clearConstructions. - Панель: 4 кнопки (∥/⟂ прямая/плоск.) + «Отменить»/«Вернуть»; интеграция в _stereoDeactivateTools; glue stereoRelMode/HistUndo/HistRedo; дерево — строки выбираемы и в rel-режиме. Верификация: node --check OK; headless-смоук 30/30 (4 rel-операции с проверкой параллельности направлений/нормалей, гард типа опоры, undo/redo одиночный/многошаговый/redo-сброс/clear-undoable/vis-не-шаг/кап, setFigure- сброс истории, dispose); эмодзи/eval/new Function — 0. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -3685,6 +3685,24 @@
|
||||
<svg viewBox="0 0 24 24"><line x1="3" y1="7" x2="21" y2="17"/><line x1="3" y1="17" x2="21" y2="7"/><circle cx="12" cy="12" r="2.4" fill="currentColor"/></svg>Пересечение
|
||||
</button>
|
||||
</div>
|
||||
<div class="st-tool-grid" style="margin-top:3px">
|
||||
<button class="st-tool-btn" id="stereo-rel-lpar-btn" onclick="stereoRelMode('lpar',this)" title="Прямая, параллельная выбранной прямой, через точку">
|
||||
<svg viewBox="0 0 24 24"><line x1="4" y1="8" x2="20" y2="6"/><line x1="4" y1="18" x2="20" y2="16"/></svg>∥ прямая
|
||||
</button>
|
||||
<button class="st-tool-btn" id="stereo-rel-lperp-btn" onclick="stereoRelMode('lperp',this)" title="Прямая, перпендикулярная выбранной плоскости, через точку">
|
||||
<svg viewBox="0 0 24 24"><ellipse cx="12" cy="17" rx="9" ry="3" fill="none"/><line x1="12" y1="3" x2="12" y2="17"/><path d="M12 14 L15 14 L15 17" fill="none"/></svg>⟂ прямая
|
||||
</button>
|
||||
<button class="st-tool-btn" id="stereo-rel-ppar-btn" onclick="stereoRelMode('ppar',this)" title="Плоскость, параллельная выбранной плоскости, через точку">
|
||||
<svg viewBox="0 0 24 24"><polygon points="3,11 12,14 21,6 12,3" fill="none"/><polygon points="3,18 12,21 21,13 12,10" fill="none"/></svg>∥ плоск.
|
||||
</button>
|
||||
<button class="st-tool-btn" id="stereo-rel-pperp-btn" onclick="stereoRelMode('pperp',this)" title="Плоскость, перпендикулярная выбранной прямой, через точку">
|
||||
<svg viewBox="0 0 24 24"><polygon points="3,14 12,17 21,9 12,6" fill="none"/><line x1="12" y1="2" x2="12" y2="21"/></svg>⟂ плоск.
|
||||
</button>
|
||||
</div>
|
||||
<div class="st-action-grid" style="margin-top:3px">
|
||||
<button class="st-action-btn" onclick="stereoConstructHistUndo()" title="Отменить (Ctrl+Z)">Отменить</button>
|
||||
<button class="st-action-btn" onclick="stereoConstructHistRedo()" title="Вернуть (Ctrl+Shift+Z)">Вернуть</button>
|
||||
</div>
|
||||
<div class="st-action-grid" style="margin-top:3px">
|
||||
<button class="st-action-btn" onclick="stereoConstructUndo()">Удалить последнее</button>
|
||||
<button class="st-action-btn" onclick="stereoConstructClear()">Очистить</button>
|
||||
|
||||
Reference in New Issue
Block a user