/
docNemo
/
clothes-graph
Обзор
Документация
Войти
/
docNemo
/
clothes-graph
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
main
src/ClothesGraph.App/StarterDocument.cs
161 строка
8 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> /// Строит сетку основы плечевого изделия по меркам: этого достаточно, чтобы /// при запуске было видно работающее параметрическое построение, а не пустое поле. /// </remarks> internal static class StarterDocument { public static PatternDocument Create() { var document = new PatternDocument("46"); document.Measurements.Add("Ог", Length.FromCentimetres(92), "Обхват груди"); document.Measurements.Add("От", Length.FromCentimetres(74), "Обхват талии"); document.Measurements.Add("Об", Length.FromCentimetres(98), "Обхват бёдер"); document.Measurements.Add("Дтс", Length.FromCentimetres(42), "Длина спины до талии"); document.Measurements.Add("Впс", Length.FromCentimetres(43), "Высота плеча косая"); var head = document.Measurements.Add("Огол", Length.FromCentimetres(56), "Обхват головы"); // Размерный ряд: приращения по четыре сантиметра, как в типовых сетках. foreach (var (size, chest, waist, hips, back, shoulderHeight, headSize) in new[] { ("48", 96.0, 78.0, 102.0, 42.5, 43.5, 56.0), ("50", 100.0, 82.0, 106.0, 43.0, 44.0, 57.0) }) { document.Sizes.AddSize(size); document.Sizes.SetValue(size, document.Measurements.FindByName("Ог")!.Id, Length.FromCentimetres(chest)); document.Sizes.SetValue(size, document.Measurements.FindByName("От")!.Id, Length.FromCentimetres(waist)); document.Sizes.SetValue(size, document.Measurements.FindByName("Об")!.Id, Length.FromCentimetres(hips)); document.Sizes.SetValue(size, document.Measurements.FindByName("Дтс")!.Id, Length.FromCentimetres(back)); document.Sizes.SetValue(size, document.Measurements.FindByName("Впс")!.Id, Length.FromCentimetres(shoulderHeight)); document.Sizes.SetValue(size, head.Id, Length.FromCentimetres(headSize)); } var draft = document.Draft; // Прямоугольник сетки основы: ширина от обхвата груди с прибавкой, // высота от длины спины до талии. var origin = draft.Add(new FreePoint(NodeId.New(), "А", document.ParseFormula("0"), document.ParseFormula("0"))); var chestRight = draft.Add(new OffsetPoint(NodeId.New(), "А1", origin.Id, document.ParseFormula("Ог/2 + 4"), document.ParseFormula("0"))); var waistLeft = draft.Add(new OffsetPoint(NodeId.New(), "Т", origin.Id, document.ParseFormula("Дтс"), document.ParseFormula("270"))); var waistRight = draft.Add(new OffsetPoint(NodeId.New(), "Т1", chestRight.Id, document.ParseFormula("Дтс"), document.ParseFormula("270"))); var topEdge = draft.Add(new SegmentNode(NodeId.New(), "АА1", origin.Id, chestRight.Id)); var leftEdge = draft.Add(new SegmentNode(NodeId.New(), "АТ", origin.Id, waistLeft.Id)); var rightEdge = draft.Add(new SegmentNode(NodeId.New(), "А1Т1", chestRight.Id, waistRight.Id)); var bottomEdge = draft.Add(new SegmentNode(NodeId.New(), "ТТ1", waistLeft.Id, waistRight.Id)); // Деталь по сетке основы: замкнутый контур из четырёх сторон. // Обход идёт по кругу, поэтому две стороны проходятся в обратную сторону. var piece = new PatternPiece(PieceId.New(), "Основа", document.ParseFormula("1")) { Quantity = 1, Grainline = new Grainline(document.ParseFormula("90")), Note = "проверочная деталь" }; piece.AddSegment(topEdge.Id); piece.AddSegment(rightEdge.Id); piece.AddSegment(bottomEdge.Id, reversed: true); piece.AddSegment(leftEdge.Id, reversed: true); // По низу припуск шире: подгибка требует больше запаса, чем боковые швы. piece.SetSegmentAllowance(2, document.ParseFormula("4")); piece.AddNotch(new Notch(document.ParseFormula("20"), "контрольная")); document.Pieces.Add(piece); // Вторая деталь, сшиваемая с первой по боковому шву: без пары // проверять сходимость швов не на чем. var sideTop = draft.Add(new OffsetPoint(NodeId.New(), "Б", chestRight.Id, document.ParseFormula("20"), document.ParseFormula("0"))); var sideBottom = draft.Add(new OffsetPoint(NodeId.New(), "Б1", sideTop.Id, document.ParseFormula("Дтс"), document.ParseFormula("270"))); var sideLeft = draft.Add(new SegmentNode(NodeId.New(), "БокЛев", chestRight.Id, waistRight.Id)); var sideRight = draft.Add(new SegmentNode(NodeId.New(), "БокПрав", sideTop.Id, sideBottom.Id)); var sideTopEdge = draft.Add(new SegmentNode(NodeId.New(), "БокВерх", chestRight.Id, sideTop.Id)); var sideBottomEdge = draft.Add(new SegmentNode(NodeId.New(), "БокНиз", waistRight.Id, sideBottom.Id)); var strip = new PatternPiece(PieceId.New(), "Планка", document.ParseFormula("1")) { Quantity = 2 }; strip.AddSegment(sideTopEdge.Id); strip.AddSegment(sideRight.Id); strip.AddSegment(sideBottomEdge.Id, reversed: true); strip.AddSegment(sideLeft.Id, reversed: true); document.Pieces.Add(strip); // Правая сторона основы пришивается к левой стороне планки. document.Seams.Add(new Seam( SeamId.New(), "Боковой", new SeamEdge(piece.Id, 1), new SeamEdge(strip.Id, 3), reversed: true)); // Линия глубины проймы делит сетку по высоте. var armholeLeft = draft.Add(new OffsetPoint(NodeId.New(), "Г", origin.Id, document.ParseFormula("Ог/8 + 6"), document.ParseFormula("270"))); var armholeRight = draft.Add(new OffsetPoint(NodeId.New(), "Г1", chestRight.Id, document.ParseFormula("Ог/8 + 6"), document.ParseFormula("270"))); draft.Add(new SegmentNode(NodeId.New(), "ГГ1", armholeLeft.Id, armholeRight.Id)); // Горловина спинки: ширина от обхвата шеи через обхват груди, // подъём — треть ширины. var neckRight = draft.Add(new OffsetPoint(NodeId.New(), "А2", origin.Id, document.ParseFormula("Ог/12 + 1"), document.ParseFormula("0"))); var neckTop = draft.Add(new OffsetPoint(NodeId.New(), "А3", neckRight.Id, document.ParseFormula("Ог/36 + 0.5"), document.ParseFormula("90"))); var neckControl = draft.Add(new OffsetPoint(NodeId.New(), "К1", origin.Id, document.ParseFormula("Ог/36 + 0.5"), document.ParseFormula("90"))); draft.Add(new CubicCurveNode(NodeId.New(), "Горловина", origin.Id, neckControl.Id, neckRight.Id, neckTop.Id)); // Пройма: кривая от плечевой точки до нижней точки проймы. var shoulder = draft.Add(new OffsetPoint(NodeId.New(), "П", neckTop.Id, document.ParseFormula("Ог/8 + 2"), document.ParseFormula("350"))); var armholeControl = draft.Add(new OffsetPoint(NodeId.New(), "К2", shoulder.Id, document.ParseFormula("Ог/10"), document.ParseFormula("270"))); draft.Add(new SegmentNode(NodeId.New(), "Плечо", neckTop.Id, shoulder.Id)); draft.Add(new CubicCurveNode(NodeId.New(), "Пройма", shoulder.Id, armholeControl.Id, armholeLeft.Id, armholeLeft.Id)); return document; } }