/
docNemo
/
clothes-graph
Обзор
Документация
Войти
/
docNemo
/
clothes-graph
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
main
src/ClothesGraph.App/HatDocument.cs
109 строк
5 KB
docNemo
Фундамент продукта: параметрическое построение выкроек, печать, установщик
08 авг 2026, 22:17
08 авг 2026, 22:17
cd47cce
Код
Авторство
О чём код?
using ClothesGraph.Geometry; using ClothesGraph.Model; using ClothesGraph.Model.Drafting; using ClothesGraph.Model.Pieces; using ClothesGraph.Model.Seams; namespace ClothesGraph.App; /// <summary> /// Базовая конструкция головного убора: шапка из шести клиньев. /// </summary> /// <remarks> /// Клин строится плоским, от обхвата и глубины головы. Развёртка сложных /// объёмных форм — задача другого порядка и в этот change не входит, но /// клиновые шапки, кепи и колпаки покрываются плоским построением полностью. /// /// Служит проверочным материалом: конструкция головного убора отличается от /// плечевого изделия и от других мерок, а продукт обязан работать с обеими. /// </remarks> internal static class HatDocument { private const int Wedges = 6; public static PatternDocument Create() { var document = new PatternDocument("56"); var head = document.Measurements.Add("Огол", Length.FromCentimetres(56), "Обхват головы"); var depth = document.Measurements.Add("Вгол", Length.FromCentimetres(21), "Высота шапки"); var seam = document.Measurements.Add("Пш", Length.FromCentimetres(1), "Прибавка на свободу"); foreach (var (size, circumference, height) in new[] { ("54", 54.0, 20.0), ("58", 58.0, 22.0) }) { document.Sizes.AddSize(size); document.Sizes.SetValue(size, head.Id, Length.FromCentimetres(circumference)); document.Sizes.SetValue(size, depth.Id, Length.FromCentimetres(height)); document.Sizes.SetValue(size, seam.Id, Length.FromCentimetres(1)); } var draft = document.Draft; // Основание клина — доля обхвата с прибавкой, разделённая на число клиньев. var origin = draft.Add(new FreePoint(NodeId.New(), "О", document.ParseFormula("0"), document.ParseFormula("0"))); var baseRight = draft.Add(new OffsetPoint(NodeId.New(), "О1", origin.Id, document.ParseFormula($"(Огол + Пш) / {Wedges}"), document.ParseFormula("0"))); // Вершина клина лежит по середине основания на высоте шапки. var apex = draft.Add(new OffsetPoint(NodeId.New(), "В", origin.Id, document.ParseFormula($"(Огол + Пш) / {Wedges * 2}"), document.ParseFormula("0"))); var top = draft.Add(new OffsetPoint(NodeId.New(), "В1", apex.Id, document.ParseFormula("Вгол"), document.ParseFormula("90"))); // Управляющие точки боковых линий: клин сужается к вершине плавно, // прямые дали бы острый угол и заломы на готовой шапке. var leftControl = draft.Add(new OffsetPoint(NodeId.New(), "К1", origin.Id, document.ParseFormula("Вгол * 0.55"), document.ParseFormula("88"))); var rightControl = draft.Add(new OffsetPoint(NodeId.New(), "К2", baseRight.Id, document.ParseFormula("Вгол * 0.55"), document.ParseFormula("92"))); var topLeftControl = draft.Add(new OffsetPoint(NodeId.New(), "К3", top.Id, document.ParseFormula($"(Огол + Пш) / {Wedges * 4}"), document.ParseFormula("190"))); var topRightControl = draft.Add(new OffsetPoint(NodeId.New(), "К4", top.Id, document.ParseFormula($"(Огол + Пш) / {Wedges * 4}"), document.ParseFormula("350"))); var bottom = draft.Add(new SegmentNode(NodeId.New(), "Низ", origin.Id, baseRight.Id)); var leftSide = draft.Add(new CubicCurveNode(NodeId.New(), "Левый бок", origin.Id, leftControl.Id, topLeftControl.Id, top.Id)); var rightSide = draft.Add(new CubicCurveNode(NodeId.New(), "Правый бок", baseRight.Id, rightControl.Id, topRightControl.Id, top.Id)); var wedge = new PatternPiece(PieceId.New(), "Клин", document.ParseFormula("0.7")) { Quantity = Wedges, Note = $"шапка из {Wedges} клиньев", Grainline = new Grainline(document.ParseFormula("90")) }; wedge.AddSegment(bottom.Id); wedge.AddSegment(rightSide.Id); wedge.AddSegment(leftSide.Id, reversed: true); // По низу припуск шире: край подгибается внутрь. wedge.SetSegmentAllowance(0, document.ParseFormula("2")); wedge.AddNotch(new Notch(document.ParseFormula("Вгол / 2"), "совмещение")); document.Pieces.Add(wedge); // Клинья сшиваются между собой боковыми срезами по кругу. Замкнутая // цепочка швов здесь — норма, а не ошибка. document.Seams.Add(new Seam( SeamId.New(), "Клиновой", new SeamEdge(wedge.Id, 1), new SeamEdge(wedge.Id, 2), reversed: true)); return document; } }