/
docNemo
/
clothes-graph
Обзор
Документация
Войти
/
docNemo
/
clothes-graph
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
main
src/ClothesGraph.Model/Drafting/DraftNode.cs
82 строки
3 KB
docNemo
Фундамент продукта: параметрическое построение выкроек, печать, установщик
08 авг 2026, 22:17
08 авг 2026, 22:17
cd47cce
Код
Авторство
О чём код?
using System; using System.Collections.Generic; using ClothesGraph.Geometry; using ClothesGraph.Model.Formulas; using ClothesGraph.Model.Measurements; namespace ClothesGraph.Model.Drafting; /// <summary> /// Построение чертежа — узел графа зависимостей. /// </summary> public abstract class DraftNode { protected DraftNode(NodeId id, string name) { if (id.IsEmpty) throw new ArgumentException("Идентификатор построения не задан", nameof(id)); Id = id; Name = Normalize(name); } public NodeId Id { get; } /// <summary>Имя, под которым построение доступно в формулах.</summary> public string Name { get; internal set; } /// <summary>Построения, без которых это построение не вычислить.</summary> public abstract IEnumerable<NodeId> Dependencies { get; } /// <summary>Мерки, от которых зависит построение.</summary> public abstract IEnumerable<MeasurementId> MeasurementDependencies { get; } /// <summary> /// Копия построения с тем же идентификатором. /// </summary> /// <remarks> /// На копиях держатся отмена операций и откат неудачных правок: состояние /// узла снимается до изменения и восстанавливается целиком, без разбора /// того, какие именно свойства изменились. /// </remarks> public abstract DraftNode Clone(); internal static string Normalize(string name) { if (string.IsNullOrWhiteSpace(name)) throw new ArgumentException("Имя построения не может быть пустым", nameof(name)); return name.Trim(); } public override string ToString() => $"{GetType().Name} «{Name}»"; } /// <summary>Построение, дающее точку.</summary> public abstract class PointNode(NodeId id, string name) : DraftNode(id, name) { public abstract Point2 Evaluate(INodeEvaluationContext context); } /// <summary>Построение, дающее линию.</summary> public abstract class CurveNode(NodeId id, string name) : DraftNode(id, name) { public abstract ICurve Evaluate(INodeEvaluationContext context); } /// <summary> /// Доступ к уже вычисленным построениям и значениям формул. /// </summary> /// <remarks> /// Узел не тянет значения сам: порядок вычисления задаёт граф, а узел лишь /// пользуется тем, что к его очереди уже готово. /// </remarks> public interface INodeEvaluationContext : IFormulaValues { Point2 GetPoint(NodeId id); ICurve GetCurve(NodeId id); /// <summary>Вычисляет формулу и переводит результат в длину.</summary> Length ToLength(double value); }