/
docNemo
/
clothes-graph
Обзор
Документация
Войти
/
docNemo
/
clothes-graph
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
main
src/ClothesGraph.Rendering/DraftScene.cs
80 строк
3 KB
docNemo
Фундамент продукта: параметрическое построение выкроек, печать, установщик
08 авг 2026, 22:17
08 авг 2026, 22:17
cd47cce
Код
Авторство
О чём код?
using System.Collections.Generic; using ClothesGraph.Geometry; namespace ClothesGraph.Rendering; /// <summary>Назначение линии на чертеже; определяет её вид.</summary> public enum LineRole { /// <summary>Основная линия построения.</summary> Construction, /// <summary>Вспомогательное построение: оси, засечки.</summary> Auxiliary, /// <summary>Линия выделенного построения.</summary> Selected, /// <summary>Линия построения, на которое наведён курсор.</summary> Highlighted, /// <summary>Линия другого размера в наложенном просмотре ряда.</summary> OtherSize } /// <summary> /// Линия, подлежащая выводу. /// </summary> /// <remarks> /// Несёт идентификатор построения: по нему выбор курсором находит не просто /// линию на экране, а породившее её построение. /// </remarks> public readonly record struct SceneLine(object Id, ICurve Curve, LineRole Role, WorldBounds Bounds) { public static SceneLine For(object id, ICurve curve, LineRole role) { var start = curve.Start; var end = curve.End; var bounds = new WorldBounds( System.Math.Min(start.X.Units, end.X.Units), System.Math.Min(start.Y.Units, end.Y.Units), System.Math.Max(start.X.Units, end.X.Units), System.Math.Max(start.Y.Units, end.Y.Units)); // Кривая может выходить за пределы прямоугольника, натянутого на её // концы, поэтому область расширяется на запас в четверть её длины. if (curve is CubicCurve) bounds = bounds.Expand(curve.Length.Units * 0.25); return new SceneLine(id, curve, role, bounds); } } /// <summary> /// Набор линий для вывода. Пересобирается при пересчёте чертежа. /// </summary> /// <remarks> /// Точки, подписи и значки ошибок сюда не входят: их выводит слой Avalonia /// поверх поверхности, потому что текст и мелкие значки дешевле и качественнее /// рисуются средствами интерфейса, чем шейдерами. /// </remarks> public sealed class DraftScene { private readonly List<SceneLine> _lines = []; public IReadOnlyList<SceneLine> Lines => _lines; public int Version { get; private set; } public void Clear() { _lines.Clear(); Version++; } public void Add(object id, ICurve curve, LineRole role) => _lines.Add(SceneLine.For(id, curve, role)); public void CommitChanges() => Version++; }