From 356b9894242d9d2d05353215ade9ed8da1887345 Mon Sep 17 00:00:00 2001 From: AJ Isaacs Date: Thu, 26 Mar 2026 20:27:46 -0400 Subject: [PATCH] feat: mirror axis simplifier, bend note propagation, ellipse fixes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Geometry Simplifier: - Replace least-squares circle fitting with mirror axis algorithm that constrains center to perpendicular bisector of chord, guaranteeing zero-gap endpoint connectivity by construction - Golden section search optimizes center position along the axis - Increase default tolerance from 0.005 to 0.5 for practical CNC use - Support existing arcs in simplification runs (sample arc points to find larger replacement arcs spanning lines + arcs together) - Add tolerance zone visualization (offset original geometry ±tolerance) - Show original geometry overlay with orange dashed lines in preview - Add "Original" checkbox to CadConverter for comparing old vs new - Store OriginalEntities on FileListItem to prevent tolerance creep when re-running simplifier with different settings Bend Detection: - Propagate bend notes to collinear bend lines split by cutouts using infinite-line perpendicular distance check - Add bend note text rendering in EntityView at bend line midpoints DXF Import: - Fix trimmed ellipse closing chord: only close when sweep ≈ 2π, preventing phantom lines through slot cutouts Co-Authored-By: Claude Opus 4.6 (1M context) --- OpenNest.Core/Geometry/GeometrySimplifier.cs | 193 +- OpenNest.IO/Bending/SolidWorksBendDetector.cs | 63 + OpenNest.IO/Extensions.cs | 5 +- .../Bending/SolidWorksBendDetectorTests.cs | 78 + .../Bending/TestData/4526 A14 PT11 Test.dxf | 2866 +++++++ .../Bending/TestData/4526 A14 PT11.dxf | 6662 +++++++++++++++++ .../Bending/TestData/4526 A14 PT23.dxf | 4370 +++++++++++ OpenNest.Tests/GeometrySimplifierTests.cs | 5 +- OpenNest/Controls/EntityView.cs | 49 +- OpenNest/Controls/FileListControl.cs | 1 + OpenNest/Forms/CadConverterForm.Designer.cs | 11 + OpenNest/Forms/CadConverterForm.cs | 16 +- OpenNest/Forms/SimplifierViewerForm.cs | 31 +- README.md | 135 +- 14 files changed, 14400 insertions(+), 85 deletions(-) create mode 100644 OpenNest.Tests/Bending/TestData/4526 A14 PT11 Test.dxf create mode 100644 OpenNest.Tests/Bending/TestData/4526 A14 PT11.dxf create mode 100644 OpenNest.Tests/Bending/TestData/4526 A14 PT23.dxf diff --git a/OpenNest.Core/Geometry/GeometrySimplifier.cs b/OpenNest.Core/Geometry/GeometrySimplifier.cs index 4f8737c..4828972 100644 --- a/OpenNest.Core/Geometry/GeometrySimplifier.cs +++ b/OpenNest.Core/Geometry/GeometrySimplifier.cs @@ -19,7 +19,7 @@ public class ArcCandidate public class GeometrySimplifier { - public double Tolerance { get; set; } = 0.005; + public double Tolerance { get; set; } = 0.5; public int MinLines { get; set; } = 3; public List Analyze(Shape shape) @@ -30,21 +30,26 @@ public class GeometrySimplifier while (i < entities.Count) { - if (entities[i] is not Line firstLine) + if (entities[i] is not Line and not Arc) { i++; continue; } - // Collect consecutive lines on the same layer + // Collect consecutive lines and arcs on the same layer var runStart = i; - var layer = firstLine.Layer; - while (i < entities.Count && entities[i] is Line line && line.Layer == layer) + var layer = entities[i].Layer; + var lineCount = 0; + while (i < entities.Count && (entities[i] is Line || entities[i] is Arc) && entities[i].Layer == layer) + { + if (entities[i] is Line) lineCount++; i++; + } var runEnd = i - 1; - // Try to find arc candidates within this run - FindCandidatesInRun(entities, runStart, runEnd, candidates); + // Only analyze runs that have enough line entities to simplify + if (lineCount >= MinLines) + FindCandidatesInRun(entities, runStart, runEnd, candidates); } return candidates; @@ -94,12 +99,20 @@ public class GeometrySimplifier while (j <= runEnd - MinLines + 1) { - // Start with MinLines lines + // Need at least MinLines entities ahead var k = j + MinLines - 1; - var points = CollectPoints(entities, j, k); - var (center, radius) = FitCircle(points); + if (k > runEnd) break; - if (!center.IsValid() || MaxDeviation(points, center, radius) > Tolerance) + var points = CollectPoints(entities, j, k); + if (points.Count < 3) + { + j++; + continue; + } + + var (center, radius, dev) = FitMirrorAxis(points); + + if (!center.IsValid() || dev > Tolerance) { j++; continue; @@ -108,34 +121,33 @@ public class GeometrySimplifier // Extend as far as possible var prevCenter = center; var prevRadius = radius; - var prevMaxDev = MaxDeviation(points, center, radius); + var prevDev = dev; while (k + 1 <= runEnd) { k++; points = CollectPoints(entities, j, k); - var (newCenter, newRadius) = FitCircle(points); - if (!newCenter.IsValid()) + if (points.Count < 3) { k--; break; } - var newMaxDev = MaxDeviation(points, newCenter, newRadius); - if (newMaxDev > Tolerance) + var (nc, nr, nd) = FitMirrorAxis(points); + + if (!nc.IsValid() || nd > Tolerance) { k--; break; } - prevCenter = newCenter; - prevRadius = newRadius; - prevMaxDev = newMaxDev; + prevCenter = nc; + prevRadius = nr; + prevDev = nd; } - // Build the candidate var finalPoints = CollectPoints(entities, j, k); - var arc = BuildArc(prevCenter, prevRadius, finalPoints, entities[j]); + var arc = CreateArc(prevCenter, prevRadius, finalPoints, entities[j]); var bbox = ComputeBoundingBox(finalPoints); candidates.Add(new ArcCandidate @@ -143,7 +155,7 @@ public class GeometrySimplifier StartIndex = j, EndIndex = k, FittedArc = arc, - MaxDeviation = prevMaxDev, + MaxDeviation = prevDev, BoundingBox = bbox, }); @@ -151,28 +163,142 @@ public class GeometrySimplifier } } - private static List CollectPoints(List entities, int start, int end) + /// + /// Fits a circular arc through a set of points using the mirror axis approach. + /// The center is constrained to lie on the perpendicular bisector of the chord + /// (P1→Pn), guaranteeing the arc passes exactly through both endpoints. + /// Golden section search finds the optimal position along this axis. + /// + private (Vector center, double radius, double deviation) FitMirrorAxis(List points) { - var points = new List(); - points.Add(((Line)entities[start]).StartPoint); - for (var i = start; i <= end; i++) - points.Add(((Line)entities[i]).EndPoint); - return points; + if (points.Count < 3) + return (Vector.Invalid, 0, double.MaxValue); + + var p1 = points[0]; + var pn = points[^1]; + + // Chord midpoint and length + var mx = (p1.X + pn.X) / 2; + var my = (p1.Y + pn.Y) / 2; + var dx = pn.X - p1.X; + var dy = pn.Y - p1.Y; + var chordLen = System.Math.Sqrt(dx * dx + dy * dy); + + if (chordLen < 1e-10) + return (Vector.Invalid, 0, double.MaxValue); + + var halfChord = chordLen / 2; + + // Unit normal (mirror axis direction, perpendicular to chord) + var nx = -dy / chordLen; + var ny = dx / chordLen; + + // Find max signed projection onto the normal (sagitta with sign) + var maxSagitta = 0.0; + for (var i = 1; i < points.Count - 1; i++) + { + var proj = (points[i].X - mx) * nx + (points[i].Y - my) * ny; + if (System.Math.Abs(proj) > System.Math.Abs(maxSagitta)) + maxSagitta = proj; + } + + if (System.Math.Abs(maxSagitta) < 1e-10) + return (Vector.Invalid, 0, double.MaxValue); // collinear + + // Initial d estimate from sagitta geometry: + // Center at M + d*N, radius R = sqrt(halfChord² + d²) + // For a point on the arc at perpendicular distance s from chord: + // (d - s)² = halfChord² + d² → d = (s² - halfChord²) / (2s) + var dInit = (maxSagitta * maxSagitta - halfChord * halfChord) / (2 * maxSagitta); + + // Golden section search around initial estimate + var range = System.Math.Max(System.Math.Abs(dInit) * 2, halfChord); + var dLow = dInit - range; + var dHigh = dInit + range; + + var phi = (System.Math.Sqrt(5) - 1) / 2; + for (var iter = 0; iter < 50; iter++) + { + var d1 = dHigh - phi * (dHigh - dLow); + var d2 = dLow + phi * (dHigh - dLow); + + var dev1 = EvalDeviation(points, mx, my, nx, ny, halfChord, d1); + var dev2 = EvalDeviation(points, mx, my, nx, ny, halfChord, d2); + + if (dev1 < dev2) + dHigh = d2; + else + dLow = d1; + + if (dHigh - dLow < 1e-12) + break; + } + + var dOpt = (dLow + dHigh) / 2; + var center = new Vector(mx + dOpt * nx, my + dOpt * ny); + var radius = System.Math.Sqrt(halfChord * halfChord + dOpt * dOpt); + var deviation = EvalDeviation(points, mx, my, nx, ny, halfChord, dOpt); + + return (center, radius, deviation); } - private static double MaxDeviation(List points, Vector center, double radius) + /// + /// Evaluates the max deviation of intermediate points from the circle + /// defined by center = M + d*N, radius = sqrt(halfChord² + d²). + /// Endpoints are excluded since they're on the circle by construction. + /// + private static double EvalDeviation(List points, + double mx, double my, double nx, double ny, double halfChord, double d) { + var cx = mx + d * nx; + var cy = my + d * ny; + var r = System.Math.Sqrt(halfChord * halfChord + d * d); + var maxDev = 0.0; - for (var i = 0; i < points.Count; i++) + for (var i = 1; i < points.Count - 1; i++) { - var dev = System.Math.Abs(points[i].DistanceTo(center) - radius); + var px = points[i].X - cx; + var py = points[i].Y - cy; + var dist = System.Math.Sqrt(px * px + py * py); + var dev = System.Math.Abs(dist - r); if (dev > maxDev) maxDev = dev; } return maxDev; } - private static Arc BuildArc(Vector center, double radius, List points, Entity sourceEntity) + private static List CollectPoints(List entities, int start, int end) + { + var points = new List(); + + for (var i = start; i <= end; i++) + { + switch (entities[i]) + { + case Line line: + if (i == start) + points.Add(line.StartPoint); + points.Add(line.EndPoint); + break; + + case Arc arc: + if (i == start) + points.Add(arc.StartPoint()); + // Sample intermediate points so deviation is measured + // accurately across the full arc span + var segments = System.Math.Max(2, arc.SegmentsForTolerance(0.1)); + var arcPoints = arc.ToPoints(segments); + // Skip first (already added or connects to previous) and add the rest + for (var j = 1; j < arcPoints.Count; j++) + points.Add(arcPoints[j]); + break; + } + } + + return points; + } + + private static Arc CreateArc(Vector center, double radius, List points, Entity sourceEntity) { var firstPoint = points[0]; var lastPoint = points[^1]; @@ -246,9 +372,6 @@ public class GeometrySimplifier sumZ += z; } - // Solve: [sumX2 sumXY sumX] [A] [sumXZ] - // [sumXY sumY2 sumY] [B] = [sumYZ] - // [sumX sumY n ] [C] [sumZ ] var det = sumX2 * (sumY2 * n - sumY * sumY) - sumXY * (sumXY * n - sumY * sumX) + sumX * (sumXY * sumY - sumY2 * sumX); diff --git a/OpenNest.IO/Bending/SolidWorksBendDetector.cs b/OpenNest.IO/Bending/SolidWorksBendDetector.cs index 9892f6a..061cc24 100644 --- a/OpenNest.IO/Bending/SolidWorksBendDetector.cs +++ b/OpenNest.IO/Bending/SolidWorksBendDetector.cs @@ -63,9 +63,72 @@ namespace OpenNest.IO.Bending bends.Add(bend); } + PropagateCollinearBendNotes(bends); + return bends; } + /// + /// For bends without a note (e.g. split by a cutout), copy angle/radius/direction + /// from a collinear bend that does have a note. + /// + private static void PropagateCollinearBendNotes(List bends) + { + const double angleTolerance = 0.01; // radians + const double distanceTolerance = 0.01; + + foreach (var bend in bends) + { + if (!string.IsNullOrEmpty(bend.NoteText)) + continue; + + foreach (var other in bends) + { + if (string.IsNullOrEmpty(other.NoteText)) + continue; + + if (!AreCollinear(bend, other, angleTolerance, distanceTolerance)) + continue; + + bend.Direction = other.Direction; + bend.Angle = other.Angle; + bend.Radius = other.Radius; + bend.NoteText = other.NoteText; + break; + } + } + } + + private static bool AreCollinear(Bend a, Bend b, double angleTolerance, double distanceTolerance) + { + var angleA = a.StartPoint.AngleTo(a.EndPoint); + var angleB = b.StartPoint.AngleTo(b.EndPoint); + + // Normalize angle difference to [0, PI) since opposite directions are still collinear + var diff = System.Math.Abs(angleA - angleB) % System.Math.PI; + if (diff > angleTolerance && System.Math.PI - diff > angleTolerance) + return false; + + // Perpendicular distance from midpoint of A to the infinite line through B + var midA = new Vector( + (a.StartPoint.X + a.EndPoint.X) / 2.0, + (a.StartPoint.Y + a.EndPoint.Y) / 2.0); + + var dx = b.EndPoint.X - b.StartPoint.X; + var dy = b.EndPoint.Y - b.StartPoint.Y; + var len = System.Math.Sqrt(dx * dx + dy * dy); + + if (len < 1e-9) + return false; + + // 2D cross product gives signed perpendicular distance * length + var vx = midA.X - b.StartPoint.X; + var vy = midA.Y - b.StartPoint.Y; + var perp = System.Math.Abs(vx * dy - vy * dx) / len; + + return perp <= distanceTolerance; + } + private List FindBendLines(CadDocument document) { return document.Entities diff --git a/OpenNest.IO/Extensions.cs b/OpenNest.IO/Extensions.cs index a7d4be3..fcf82e0 100644 --- a/OpenNest.IO/Extensions.cs +++ b/OpenNest.IO/Extensions.cs @@ -221,8 +221,9 @@ namespace OpenNest.IO }); } - // Close the ellipse if it's a full ellipse - if (lines.Count >= 2) + // Close only if it's a full ellipse (sweep ≈ 2π) + var sweep = endParam - startParam; + if (lines.Count >= 2 && System.Math.Abs(sweep - System.Math.PI * 2.0) < 0.01) { var first = lines.First(); var last = lines.Last(); diff --git a/OpenNest.Tests/Bending/SolidWorksBendDetectorTests.cs b/OpenNest.Tests/Bending/SolidWorksBendDetectorTests.cs index a27b357..e142ea6 100644 --- a/OpenNest.Tests/Bending/SolidWorksBendDetectorTests.cs +++ b/OpenNest.Tests/Bending/SolidWorksBendDetectorTests.cs @@ -29,6 +29,84 @@ public class SolidWorksBendDetectorTests Assert.Empty(bends); } + [Fact] + public void Simplifier_EllipseSegments_FewLargeArcs() + { + var path = Path.Combine(AppContext.BaseDirectory, "Bending", "TestData", "4526 A14 PT11 Test.dxf"); + Assert.True(File.Exists(path), $"Test DXF not found: {path}"); + + var importer = new OpenNest.IO.DxfImporter { SplinePrecision = 200 }; + var result = importer.Import(path); + + var shape = new OpenNest.Geometry.Shape(); + shape.Entities.AddRange(result.Entities); + + // Default tolerance is 0.5 — should produce very few large arcs + var simplifier = new OpenNest.Geometry.GeometrySimplifier(); + var candidates = simplifier.Analyze(shape); + + // With 0.5 tolerance, 2 ellipses (~400 segments) should reduce to a handful of arcs + // Dump for visibility then assert + var info = string.Join(", ", candidates.Select(c => $"[{c.StartIndex}..{c.EndIndex}]={c.LineCount}lines R={c.FittedArc.Radius:F3}")); + Assert.True(candidates.Count <= 10, + $"Expected <=10 arcs but got {candidates.Count}: {info}"); + + // Each arc should cover many lines + foreach (var c in candidates) + Assert.True(c.LineCount >= 3, $"Arc [{c.StartIndex}..{c.EndIndex}] only covers {c.LineCount} lines"); + + // Arcs should connect to the original geometry within tolerance + foreach (var c in candidates) + { + var firstLine = (OpenNest.Geometry.Line)shape.Entities[c.StartIndex]; + var lastLine = (OpenNest.Geometry.Line)shape.Entities[c.EndIndex]; + var arc = c.FittedArc; + + var startGap = firstLine.StartPoint.DistanceTo(arc.StartPoint()); + var endGap = lastLine.EndPoint.DistanceTo(arc.EndPoint()); + + Assert.True(startGap < 1e-9, $"Start gap {startGap} at candidate [{c.StartIndex}..{c.EndIndex}]"); + Assert.True(endGap < 1e-9, $"End gap {endGap} at candidate [{c.StartIndex}..{c.EndIndex}]"); + } + } + + [Fact] + public void Import_TrimmedEllipse_NoClosingChord() + { + var path = Path.Combine(AppContext.BaseDirectory, "Bending", "TestData", "4526 A14 PT11.dxf"); + Assert.True(File.Exists(path), $"Test DXF not found: {path}"); + + var importer = new OpenNest.IO.DxfImporter(); + var result = importer.Import(path); + + // The DXF has 2 trimmed ellipses forming an oblong slot. + // Trimmed ellipses must not generate a closing chord line. + // 83 = 72 lines + 4 arcs + 7 circles + ellipse segments (heavily merged by optimizer) + Assert.Equal(83, result.Entities.Count); + } + + [Fact] + public void DetectBends_SplitBendLine_PropagatesNote() + { + var path = Path.Combine(AppContext.BaseDirectory, "Bending", "TestData", "4526 A14 PT23.dxf"); + Assert.True(File.Exists(path), $"Test DXF not found: {path}"); + + using var reader = new DxfReader(path); + var doc = reader.Read(); + + var detector = new SolidWorksBendDetector(); + var bends = detector.DetectBends(doc); + + Assert.Equal(5, bends.Count); + Assert.All(bends, b => + { + Assert.NotNull(b.NoteText); + Assert.Equal(BendDirection.Up, b.Direction); + Assert.Equal(90.0, b.Angle); + Assert.Equal(0.125, b.Radius); + }); + } + [Fact] public void DetectBends_RealDxf_ParsesNotesCorrectly() { diff --git a/OpenNest.Tests/Bending/TestData/4526 A14 PT11 Test.dxf b/OpenNest.Tests/Bending/TestData/4526 A14 PT11 Test.dxf new file mode 100644 index 0000000..8593a48 --- /dev/null +++ b/OpenNest.Tests/Bending/TestData/4526 A14 PT11 Test.dxf @@ -0,0 +1,2866 @@ +999 +dxfrw 0.6.3 + 0 +SECTION + 2 +HEADER + 9 +$ACADVER + 1 +AC1021 + 9 +$DWGCODEPAGE + 3 +ANSI_1252 + 9 +$INSBASE + 10 +0 + 20 +0 + 30 +0 + 9 +$EXTMIN + 10 +-58.73953909937123 + 20 +9.231402269653605 + 30 +0 + 9 +$EXTMAX + 10 +-52.95410548517051 + 20 +14.06840414382142 + 30 +0 + 9 +$LIMMIN + 10 +0 + 20 +0 + 9 +$LIMMAX + 10 +17 + 20 +11 + 9 +$ORTHOMODE + 70 + 0 + 9 +$REGENMODE + 70 + 1 + 9 +$FILLMODE + 70 + 1 + 9 +$QTEXTMODE + 70 + 0 + 9 +$MIRRTEXT + 70 + 1 + 9 +$LTSCALE + 40 +1 + 9 +$ATTMODE + 70 + 1 + 9 +$TEXTSIZE + 40 +0.1666666667 + 9 +$TRACEWID + 40 +0.05 + 9 +$TEXTSTYLE + 7 +Standard + 9 +$CLAYER + 8 +0 + 9 +$CELTYPE + 6 +ByLayer + 9 +$CECOLOR + 62 + 256 + 9 +$CELTSCALE + 40 +1 + 9 +$DISPSILH + 70 + 0 + 9 +$DIMSCALE + 40 +1 + 9 +$DIMASZ + 40 +0.18 + 9 +$DIMEXO + 40 +0.0625 + 9 +$DIMDLI + 40 +0.38 + 9 +$DIMRND + 40 +0 + 9 +$DIMDLE + 40 +0 + 9 +$DIMEXE + 40 +0.18 + 9 +$DIMTP + 40 +0 + 9 +$DIMTM + 40 +0 + 9 +$DIMTXT + 40 +0.18 + 9 +$DIMCEN + 40 +0.09 + 9 +$DIMTSZ + 40 +0 + 9 +$DIMTOL + 70 + 0 + 9 +$DIMLIM + 70 + 0 + 9 +$DIMTIH + 70 + 0 + 9 +$DIMTOH + 70 + 0 + 9 +$DIMSE1 + 70 + 0 + 9 +$DIMSE2 + 70 + 0 + 9 +$DIMTAD + 70 + 0 + 9 +$DIMZIN + 70 + 0 + 9 +$DIMBLK + 1 + + 9 +$DIMASO + 70 + 1 + 9 +$DIMSHO + 70 + 1 + 9 +$DIMPOST + 1 + + 9 +$DIMAPOST + 1 + + 9 +$DIMALT + 70 + 0 + 9 +$DIMALTD + 70 + 2 + 9 +$DIMALTF + 40 +25.4 + 9 +$DIMLFAC + 40 +1 + 9 +$DIMTOFL + 70 + 0 + 9 +$DIMTVP + 40 +0 + 9 +$DIMTIX + 70 + 0 + 9 +$DIMSOXD + 70 + 0 + 9 +$DIMSAH + 70 + 0 + 9 +$DIMBLK1 + 1 + + 9 +$DIMBLK2 + 1 + + 9 +$DIMSTYLE + 2 +Standard + 9 +$DIMCLRD + 70 + 0 + 9 +$DIMCLRE + 70 + 0 + 9 +$DIMCLRT + 70 + 0 + 9 +$DIMTFAC + 40 +1 + 9 +$DIMGAP + 40 +0.09 + 9 +$DIMJUST + 70 + 0 + 9 +$DIMSD1 + 70 + 0 + 9 +$DIMSD2 + 70 + 0 + 9 +$DIMTOLJ + 70 + 1 + 9 +$DIMTZIN + 70 + 0 + 9 +$DIMALTZ + 70 + 0 + 9 +$DIMALTTZ + 70 + 0 + 9 +$DIMUPT + 70 + 0 + 9 +$DIMDEC + 70 + 4 + 9 +$DIMTDEC + 70 + 4 + 9 +$DIMALTU + 70 + 2 + 9 +$DIMALTTD + 70 + 2 + 9 +$DIMTXSTY + 7 +STANDARD + 9 +$DIMAUNIT + 70 + 0 + 9 +$DIMADEC + 70 + 0 + 9 +$DIMALTRND + 40 +0 + 9 +$DIMAZIN + 70 + 3 + 9 +$DIMDSEP + 70 + 46 + 9 +$DIMATFIT + 70 + 3 + 9 +$DIMFRAC + 70 + 0 + 9 +$DIMLDRBLK + 1 + + 9 +$DIMLUNIT + 70 + 2 + 9 +$DIMLWD + 70 + -2 + 9 +$DIMLWE + 70 + -2 + 9 +$DIMTMOVE + 70 + 0 + 9 +$DIMFXL + 40 +1 + 9 +$DIMFXLON + 70 + 0 + 9 +$DIMJOGANG + 40 +0.7854 + 9 +$DIMTFILL + 70 + 0 + 9 +$DIMTFILLCLR + 70 + 0 + 9 +$DIMARCSYM + 70 + 0 + 9 +$DIMLTYPE + 6 +ByBlock + 9 +$DIMLTEX1 + 6 +ByBlock + 9 +$DIMLTEX2 + 6 +ByBlock + 9 +$LUNITS + 70 + 2 + 9 +$LUPREC + 70 + 4 + 9 +$SKETCHINC + 40 +0.1 + 9 +$FILLETRAD + 40 +0.5 + 9 +$AUNITS + 70 + 0 + 9 +$AUPREC + 70 + 1 + 9 +$MENU + 1 +. + 9 +$ELEVATION + 40 +0 + 9 +$PELEVATION + 40 +0 + 9 +$THICKNESS + 40 +0 + 9 +$LIMCHECK + 70 + 0 + 9 +$CHAMFERA + 40 +0 + 9 +$CHAMFERB + 40 +0 + 9 +$CHAMFERC + 40 +0 + 9 +$CHAMFERD + 40 +0 + 9 +$SKPOLY + 70 + 0 + 9 +$USRTIMER + 70 + 1 + 9 +$ANGBASE + 50 +0 + 9 +$ANGDIR + 70 + 0 + 9 +$PDMODE + 70 + 0 + 9 +$PDSIZE + 40 +-1 + 9 +$PLINEWID + 40 +0 + 9 +$SPLFRAME + 70 + 0 + 9 +$SPLINETYPE + 70 + 6 + 9 +$SPLINESEGS + 70 + 8 + 9 +$HANDSEED + 5 +20000 + 9 +$SURFTAB1 + 70 + 6 + 9 +$SURFTAB2 + 70 + 6 + 9 +$SURFTYPE + 70 + 6 + 9 +$SURFU + 70 + 6 + 9 +$SURFV + 70 + 6 + 9 +$UCSBASE + 2 + + 9 +$UCSNAME + 2 + + 9 +$UCSORG + 10 +0 + 20 +0 + 30 +0 + 9 +$UCSXDIR + 10 +1 + 20 +0 + 30 +0 + 9 +$UCSYDIR + 10 +0 + 20 +1 + 30 +0 + 9 +$UCSORTHOREF + 2 + + 9 +$UCSORTHOVIEW + 70 + 0 + 9 +$UCSORGTOP + 10 +0 + 20 +0 + 30 +0 + 9 +$UCSORGBOTTOM + 10 +0 + 20 +0 + 30 +0 + 9 +$UCSORGLEFT + 10 +0 + 20 +0 + 30 +0 + 9 +$UCSORGRIGHT + 10 +0 + 20 +0 + 30 +0 + 9 +$UCSORGFRONT + 10 +0 + 20 +0 + 30 +0 + 9 +$UCSORGBACK + 10 +0 + 20 +0 + 30 +0 + 9 +$PUCSBASE + 2 + + 9 +$PUCSNAME + 2 + + 9 +$PUCSORG + 10 +0 + 20 +0 + 30 +0 + 9 +$PUCSXDIR + 10 +1 + 20 +0 + 30 +0 + 9 +$PUCSYDIR + 10 +0 + 20 +1 + 30 +0 + 9 +$PUCSORTHOREF + 2 + + 9 +$PUCSORTHOVIEW + 70 + 0 + 9 +$PUCSORGTOP + 10 +0 + 20 +0 + 30 +0 + 9 +$PUCSORGBOTTOM + 10 +0 + 20 +0 + 30 +0 + 9 +$PUCSORGLEFT + 10 +0 + 20 +0 + 30 +0 + 9 +$PUCSORGRIGHT + 10 +0 + 20 +0 + 30 +0 + 9 +$PUCSORGFRONT + 10 +0 + 20 +0 + 30 +0 + 9 +$PUCSORGBACK + 10 +0 + 20 +0 + 30 +0 + 9 +$USERI1 + 70 + 0 + 9 +$USERI2 + 70 + 0 + 9 +$USERI3 + 70 + 0 + 9 +$USERI4 + 70 + 0 + 9 +$USERI5 + 70 + 0 + 9 +$USERR1 + 40 +0 + 9 +$USERR2 + 40 +0 + 9 +$USERR3 + 40 +0 + 9 +$USERR4 + 40 +0 + 9 +$USERR5 + 40 +0 + 9 +$WORLDVIEW + 70 + 1 + 9 +$SHADEDGE + 70 + 3 + 9 +$SHADEDIF + 70 + 70 + 9 +$TILEMODE + 70 + 1 + 9 +$MAXACTVP + 70 + 64 + 9 +$PINSBASE + 10 +0 + 20 +0 + 30 +0 + 9 +$PLIMCHECK + 70 + 0 + 9 +$PEXTMIN + 10 +1e+20 + 20 +1e+20 + 30 +1e+20 + 9 +$PEXTMAX + 10 +-1e+20 + 20 +-1e+20 + 30 +-1e+20 + 9 +$GRIDMODE + 70 + 0 + 9 +$SNAPSTYLE + 70 + 0 + 9 +$PLIMMIN + 10 +0 + 20 +0 + 9 +$PLIMMAX + 10 +12 + 20 +9 + 9 +$UNITMODE + 70 + 0 + 9 +$VISRETAIN + 70 + 1 + 9 +$PLINEGEN + 70 + 0 + 9 +$PSLTSCALE + 70 + 1 + 9 +$TREEDEPTH + 70 + 3020 + 9 +$CMLSTYLE + 2 +Standard + 9 +$CMLJUST + 70 + 0 + 9 +$CMLSCALE + 40 +1 + 9 +$PROXYGRAPHICS + 70 + 1 + 9 +$MEASUREMENT + 70 + 0 + 9 +$CELWEIGHT +370 + -1 + 9 +$ENDCAPS +280 + 0 + 9 +$JOINSTYLE +280 + 0 + 9 +$LWDISPLAY +290 + 1 + 9 +$INSUNITS + 70 + 1 + 9 +$HYPERLINKBASE + 1 + + 9 +$STYLESHEET + 1 + + 9 +$XEDIT +290 + 1 + 9 +$CEPSNTYPE +380 + 0 + 9 +$PSTYLEMODE +290 + 1 + 9 +$EXTNAMES +290 + 1 + 9 +$PSVPSCALE + 40 +0 + 9 +$OLESTARTUP +290 + 0 + 9 +$SORTENTS +280 + 127 + 9 +$INDEXCTL +280 + 0 + 9 +$HIDETEXT +280 + 1 + 9 +$XCLIPFRAME +290 + 0 + 9 +$HALOGAP +280 + 0 + 9 +$OBSCOLOR + 70 + 257 + 9 +$OBSLTYPE +280 + 0 + 9 +$INTERSECTIONDISPLAY +280 + 0 + 9 +$INTERSECTIONCOLOR + 70 + 257 + 9 +$DIMASSOC +280 + 1 + 9 +$PROJECTNAME + 1 + + 9 +$CAMERADISPLAY +290 + 0 + 9 +$LENSLENGTH + 40 +50 + 9 +$CAMERAHEIGHT + 40 +0 + 9 +$STEPSPERSEC + 40 +2 + 9 +$STEPSIZE + 40 +50 + 9 +$3DDWFPREC + 40 +2 + 9 +$PSOLWIDTH + 40 +5 + 9 +$PSOLHEIGHT + 40 +80 + 9 +$LOFTANG1 + 40 +1.570796326794897 + 9 +$LOFTANG2 + 40 +1.570796326794897 + 9 +$LOFTMAG1 + 40 +0 + 9 +$LOFTMAG2 + 40 +0 + 9 +$LOFTPARAM + 70 + 7 + 9 +$LOFTNORMALS +280 + 1 + 9 +$LATITUDE + 40 +1 + 9 +$LONGITUDE + 40 +1 + 9 +$NORTHDIRECTION + 40 +0 + 9 +$TIMEZONE + 70 +-8000 + 9 +$LIGHTGLYPHDISPLAY +280 + 1 + 9 +$TILEMODELIGHTSYNCH +280 + 1 + 9 +$SOLIDHIST +280 + 1 + 9 +$SHOWHIST +280 + 1 + 9 +$DWFFRAME +280 + 2 + 9 +$DGNFRAME +280 + 0 + 9 +$REALWORLDSCALE +290 + 1 + 9 +$INTERFERECOLOR + 62 + 1 + 9 +$CSHADOW +280 + 0 + 9 +$SHADOWPLANELOCATION + 40 +0 + 0 +ENDSEC + 0 +SECTION + 2 +CLASSES + 0 +ENDSEC + 0 +SECTION + 2 +TABLES + 0 +TABLE + 2 +VPORT + 5 +8 +330 +0 +100 +AcDbSymbolTable + 70 + 1 + 0 +VPORT + 5 +31 +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbViewportTableRecord + 2 +*ACTIVE + 70 + 0 + 10 +0 + 20 +0 + 11 +1 + 21 +1 + 12 +-25.68943121359204 + 22 +7.054490047452094 + 13 +0 + 23 +0 + 14 +10 + 24 +10 + 15 +10 + 25 +10 + 16 +0 + 26 +0 + 36 +1 + 17 +0 + 27 +0 + 37 +0 + 40 +4.921638827346603 + 41 +1.815133276010318 + 42 +50 + 43 +0 + 44 +0 + 50 +0 + 51 +0 + 71 + 0 + 72 + 100 + 73 + 1 + 74 + 3 + 75 + 0 + 76 + 0 + 77 + 0 + 78 + 0 +281 + 0 + 65 + 1 +110 +0 +120 +0 +130 +0 +111 +1 +121 +0 +131 +0 +112 +0 +122 +1 +132 +0 + 79 + 0 +146 +0 +348 +10020 + 60 + 7 + 61 + 5 +292 +1 +282 + 1 +141 +0 +142 +0 + 63 + 250 +421 +3358443 + 0 +ENDTAB + 0 +TABLE + 2 +LTYPE + 5 +5 +330 +0 +100 +AcDbSymbolTable + 70 + 4 + 0 +LTYPE + 5 +14 +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +ByBlock + 70 + 0 + 3 + + 72 + 65 + 73 + 0 + 40 +0 + 0 +LTYPE + 5 +15 +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +ByLayer + 70 + 0 + 3 + + 72 + 65 + 73 + 0 + 40 +0 + 0 +LTYPE + 5 +16 +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +Continuous + 70 + 0 + 3 +Solid line + 72 + 65 + 73 + 0 + 40 +0 + 0 +LTYPE + 5 +32 +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +DOT + 70 + 0 + 3 +Dot . . . . . . . . . . . . . . . . . . . . . . + 72 + 65 + 73 + 2 + 40 +6.35 + 49 +0 + 74 + 0 + 49 +-6.35 + 74 + 0 + 0 +LTYPE + 5 +33 +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +DOTTINY + 70 + 0 + 3 +Dot (.15x) ..................................... + 72 + 65 + 73 + 2 + 40 +0.9525 + 49 +0 + 74 + 0 + 49 +-0.9525 + 74 + 0 + 0 +LTYPE + 5 +34 +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +DOT2 + 70 + 0 + 3 +Dot (.5x) ..................................... + 72 + 65 + 73 + 2 + 40 +3.175 + 49 +0 + 74 + 0 + 49 +-3.175 + 74 + 0 + 0 +LTYPE + 5 +35 +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +DOTX2 + 70 + 0 + 3 +Dot (2x) . . . . . . . . . . . . . + 72 + 65 + 73 + 2 + 40 +12.7 + 49 +0 + 74 + 0 + 49 +-12.7 + 74 + 0 + 0 +LTYPE + 5 +36 +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +DASHED + 70 + 0 + 3 +Dashed _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + 72 + 65 + 73 + 2 + 40 +19.05 + 49 +12.7 + 74 + 0 + 49 +-6.35 + 74 + 0 + 0 +LTYPE + 5 +37 +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +DASHEDTINY + 70 + 0 + 3 +Dashed (.15x) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + 72 + 65 + 73 + 2 + 40 +2.8575 + 49 +1.905 + 74 + 0 + 49 +-0.9525 + 74 + 0 + 0 +LTYPE + 5 +38 +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +DASHED2 + 70 + 0 + 3 +Dashed (.5x) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + 72 + 65 + 73 + 2 + 40 +9.524999999999999 + 49 +6.35 + 74 + 0 + 49 +-3.175 + 74 + 0 + 0 +LTYPE + 5 +39 +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +DASHEDX2 + 70 + 0 + 3 +Dashed (2x) ____ ____ ____ ____ ____ ___ + 72 + 65 + 73 + 2 + 40 +38.09999999999999 + 49 +25.4 + 74 + 0 + 49 +-12.7 + 74 + 0 + 0 +LTYPE + 5 +3A +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +DASHDOT + 70 + 0 + 3 +Dash dot __ . __ . __ . __ . __ . __ . __ . __ + 72 + 65 + 73 + 4 + 40 +25.4 + 49 +12.7 + 74 + 0 + 49 +-6.35 + 74 + 0 + 49 +0 + 74 + 0 + 49 +-6.35 + 74 + 0 + 0 +LTYPE + 5 +3B +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +DASHDOTTINY + 70 + 0 + 3 +Dash dot (.15x) _._._._._._._._._._._._._._._. + 72 + 65 + 73 + 4 + 40 +3.81 + 49 +1.905 + 74 + 0 + 49 +-0.9525 + 74 + 0 + 49 +0 + 74 + 0 + 49 +-0.9525 + 74 + 0 + 0 +LTYPE + 5 +3C +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +DASHDOT2 + 70 + 0 + 3 +Dash dot (.5x) _._._._._._._._._._._._._._._. + 72 + 65 + 73 + 4 + 40 +12.7 + 49 +6.35 + 74 + 0 + 49 +-3.175 + 74 + 0 + 49 +0 + 74 + 0 + 49 +-3.175 + 74 + 0 + 0 +LTYPE + 5 +3D +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +DASHDOTX2 + 70 + 0 + 3 +Dash dot (2x) ____ . ____ . ____ . ___ + 72 + 65 + 73 + 4 + 40 +50.8 + 49 +25.4 + 74 + 0 + 49 +-12.7 + 74 + 0 + 49 +0 + 74 + 0 + 49 +-12.7 + 74 + 0 + 0 +LTYPE + 5 +3E +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +DIVIDE + 70 + 0 + 3 +Divide ____ . . ____ . . ____ . . ____ . . ____ + 72 + 65 + 73 + 6 + 40 +31.75 + 49 +12.7 + 74 + 0 + 49 +-6.35 + 74 + 0 + 49 +0 + 74 + 0 + 49 +-6.35 + 74 + 0 + 49 +0 + 74 + 0 + 49 +-6.35 + 74 + 0 + 0 +LTYPE + 5 +3F +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +DIVIDETINY + 70 + 0 + 3 +Divide (.15x) __..__..__..__..__..__..__..__.._ + 72 + 65 + 73 + 6 + 40 +4.7625 + 49 +1.905 + 74 + 0 + 49 +-0.9525 + 74 + 0 + 49 +0 + 74 + 0 + 49 +-0.9525 + 74 + 0 + 49 +0 + 74 + 0 + 49 +-0.9525 + 74 + 0 + 0 +LTYPE + 5 +40 +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +DIVIDE2 + 70 + 0 + 3 +Divide (.5x) __..__..__..__..__..__..__..__.._ + 72 + 65 + 73 + 6 + 40 +15.875 + 49 +6.35 + 74 + 0 + 49 +-3.175 + 74 + 0 + 49 +0 + 74 + 0 + 49 +-3.175 + 74 + 0 + 49 +0 + 74 + 0 + 49 +-3.175 + 74 + 0 + 0 +LTYPE + 5 +41 +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +DIVIDEX2 + 70 + 0 + 3 +Divide (2x) ________ . . ________ . . _ + 72 + 65 + 73 + 6 + 40 +63.5 + 49 +25.4 + 74 + 0 + 49 +-12.7 + 74 + 0 + 49 +0 + 74 + 0 + 49 +-12.7 + 74 + 0 + 49 +0 + 74 + 0 + 49 +-12.7 + 74 + 0 + 0 +LTYPE + 5 +42 +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +BORDER + 70 + 0 + 3 +Border __ __ . __ __ . __ __ . __ __ . __ __ . + 72 + 65 + 73 + 6 + 40 +44.45 + 49 +12.7 + 74 + 0 + 49 +-6.35 + 74 + 0 + 49 +12.7 + 74 + 0 + 49 +-6.35 + 74 + 0 + 49 +0 + 74 + 0 + 49 +-6.35 + 74 + 0 + 0 +LTYPE + 5 +43 +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +BORDERTINY + 70 + 0 + 3 +Border (.15x) __.__.__.__.__.__.__.__.__.__.__. + 72 + 65 + 73 + 6 + 40 +6.6675 + 49 +1.905 + 74 + 0 + 49 +-0.9525 + 74 + 0 + 49 +1.905 + 74 + 0 + 49 +-0.9525 + 74 + 0 + 49 +0 + 74 + 0 + 49 +-0.9525 + 74 + 0 + 0 +LTYPE + 5 +44 +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +BORDER2 + 70 + 0 + 3 +Border (.5x) __.__.__.__.__.__.__.__.__.__.__. + 72 + 65 + 73 + 6 + 40 +22.225 + 49 +6.35 + 74 + 0 + 49 +-3.175 + 74 + 0 + 49 +6.35 + 74 + 0 + 49 +-3.175 + 74 + 0 + 49 +0 + 74 + 0 + 49 +-3.175 + 74 + 0 + 0 +LTYPE + 5 +45 +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +BORDERX2 + 70 + 0 + 3 +Border (2x) ____ ____ . ____ ____ . ___ + 72 + 65 + 73 + 6 + 40 +88.89999999999999 + 49 +25.4 + 74 + 0 + 49 +-12.7 + 74 + 0 + 49 +25.4 + 74 + 0 + 49 +-12.7 + 74 + 0 + 49 +0 + 74 + 0 + 49 +-12.7 + 74 + 0 + 0 +LTYPE + 5 +46 +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +CENTER + 70 + 0 + 3 +Center ____ _ ____ _ ____ _ ____ _ ____ _ ____ + 72 + 65 + 73 + 4 + 40 +50.8 + 49 +31.75 + 74 + 0 + 49 +-6.35 + 74 + 0 + 49 +6.35 + 74 + 0 + 49 +-6.35 + 74 + 0 + 0 +LTYPE + 5 +47 +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +CENTERTINY + 70 + 0 + 3 +Center (.15x) ___ _ ___ _ ___ _ ___ _ ___ _ ___ + 72 + 65 + 73 + 4 + 40 +7.619999999999999 + 49 +4.7625 + 74 + 0 + 49 +-0.9525 + 74 + 0 + 49 +0.9525 + 74 + 0 + 49 +-0.9525 + 74 + 0 + 0 +LTYPE + 5 +48 +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +CENTER2 + 70 + 0 + 3 +Center (.5x) ___ _ ___ _ ___ _ ___ _ ___ _ ___ + 72 + 65 + 73 + 4 + 40 +28.575 + 49 +19.05 + 74 + 0 + 49 +-3.175 + 74 + 0 + 49 +3.175 + 74 + 0 + 49 +-3.175 + 74 + 0 + 0 +LTYPE + 5 +49 +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +CENTERX2 + 70 + 0 + 3 +Center (2x) ________ __ ________ __ _____ + 72 + 65 + 73 + 4 + 40 +101.6 + 49 +63.5 + 74 + 0 + 49 +-12.7 + 74 + 0 + 49 +12.7 + 74 + 0 + 49 +-12.7 + 74 + 0 + 0 +ENDTAB + 0 +TABLE + 2 +LAYER + 5 +2 +330 +0 +100 +AcDbSymbolTable + 70 + 1 + 0 +LAYER + 5 +10 +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +0 + 70 + 0 + 62 + 7 + 6 +CONTINUOUS +370 + -3 +390 +F + 0 +LAYER + 5 +4A +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +BEND + 70 + 0 + 62 + 2 + 6 +CONTINUOUS +370 + -3 +390 +F + 0 +LAYER + 5 +4B +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +ETCH + 70 + 0 + 62 + 3 + 6 +CONTINUOUS +370 + -3 +390 +F + 0 +LAYER + 5 +4C +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +SLD-0 + 70 + 0 + 62 + 179 + 6 +CONTINUOUS +370 + -3 +390 +F + 0 +ENDTAB + 0 +TABLE + 2 +STYLE + 5 +3 +330 +0 +100 +AcDbSymbolTable + 70 + 3 + 0 +STYLE + 5 +4D +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbTextStyleTableRecord + 2 +Standard + 70 + 0 + 40 +0 + 41 +1 + 50 +0 + 71 + 0 + 42 +1 + 3 +txt + 4 + + 0 +ENDTAB + 0 +TABLE + 2 +VIEW + 5 +6 +330 +0 +100 +AcDbSymbolTable + 70 + 0 + 0 +ENDTAB + 0 +TABLE + 2 +UCS + 5 +7 +330 +0 +100 +AcDbSymbolTable + 70 + 0 + 0 +ENDTAB + 0 +TABLE + 2 +APPID + 5 +9 +330 +0 +100 +AcDbSymbolTable + 70 + 1 + 0 +APPID + 5 +12 +330 +9 +100 +AcDbSymbolTableRecord +100 +AcDbRegAppTableRecord + 2 +ACAD + 70 + 0 + 0 +APPID + 5 +4E +330 +9 +100 +AcDbSymbolTableRecord +100 +AcDbRegAppTableRecord + 2 +LibreCad + 70 + 0 + 0 +ENDTAB + 0 +TABLE + 2 +DIMSTYLE + 5 +A +330 +0 +100 +AcDbSymbolTable + 70 + 1 +100 +AcDbDimStyleTable + 71 + 1 + 0 +DIMSTYLE +105 +4F +330 +A +100 +AcDbSymbolTableRecord +100 +AcDbDimStyleTableRecord + 2 +Standard + 70 + 0 + 40 +1 + 41 +0.18 + 42 +0.0625 + 43 +0.38 + 44 +0.18 + 45 +0 + 46 +0 + 47 +0 + 48 +0 + 49 +1 +140 +0.18 +141 +0.09 +142 +2.5 +143 +25.4 +144 +1 +145 +0 +146 +1 +147 +0.09 +148 +0 + 71 + 0 + 72 + 0 + 73 + 0 + 74 + 1 + 75 + 0 + 76 + 0 + 77 + 0 + 78 + 0 + 79 + 3 +170 + 0 +171 + 2 +172 + 0 +173 + 0 +174 + 0 +175 + 0 +176 + 0 +177 + 0 +178 + 0 +179 + 0 +271 + 4 +272 + 4 +273 + 2 +274 + 2 +275 + 0 +276 + 0 +277 + 2 +278 + 46 +279 + 0 +280 + 0 +281 + 0 +282 + 0 +283 + 1 +284 + 0 +285 + 0 +286 + 0 +288 + 0 +289 + 3 +340 +4D + 0 +ENDTAB + 0 +TABLE + 2 +BLOCK_RECORD + 5 +1 +330 +0 +100 +AcDbSymbolTable + 70 + 2 + 0 +BLOCK_RECORD + 5 +1F +330 +1 +100 +AcDbSymbolTableRecord +100 +AcDbBlockTableRecord + 2 +*Model_Space + 70 + 0 +280 + 1 +281 + 0 + 0 +BLOCK_RECORD + 5 +1E +330 +1 +100 +AcDbSymbolTableRecord +100 +AcDbBlockTableRecord + 2 +*Paper_Space + 70 + 0 +280 + 1 +281 + 0 + 0 +ENDTAB + 0 +ENDSEC + 0 +SECTION + 2 +BLOCKS + 0 +BLOCK + 5 +20 +330 +1F +100 +AcDbEntity + 8 +0 +100 +AcDbBlockBegin + 2 +*Model_Space + 70 + 0 + 10 +0 + 20 +0 + 30 +0 + 3 +*Model_Space + 1 + + 0 +ENDBLK + 5 +21 +330 +1F +100 +AcDbEntity + 8 +0 +100 +AcDbBlockEnd + 0 +BLOCK + 5 +1C +330 +1B +100 +AcDbEntity + 8 +0 +100 +AcDbBlockBegin + 2 +*Paper_Space + 70 + 0 + 10 +0 + 20 +0 + 30 +0 + 3 +*Paper_Space + 1 + + 0 +ENDBLK + 5 +1D +330 +1F +100 +AcDbEntity + 8 +0 +100 +AcDbBlockEnd + 0 +ENDSEC + 0 +SECTION + 2 +ENTITIES + 0 +ELLIPSE + 5 +50 +100 +AcDbEntity + 8 +0 + 6 +CONTINUOUS + 62 + 7 +370 + 25 +100 +AcDbEllipse + 10 +-55.6648265946 + 20 +11.5 + 30 +0 + 11 +-0.848528137423869 + 21 +1e-16 + 31 +0 + 40 +0.7071067812 + 41 +1.46008486522431 + 42 +-1.46008486522429 + 0 +ELLIPSE + 5 +51 +100 +AcDbEntity + 8 +0 + 6 +CONTINUOUS + 62 + 7 +370 + 25 +100 +AcDbEllipse + 10 +-55.8523265946 + 20 +11.5 + 30 +0 + 11 +-0.848528137423869 + 21 +1e-16 + 31 +0 + 40 +0.7071067812 + 41 +-1.68150778836545 + 42 +1.68150778836546 + 0 +LWPOLYLINE + 5 +52 +100 +AcDbEntity + 8 +0 + 6 +ByLayer + 62 + 256 +370 + -1 +100 +AcDbPolyline + 90 + 4 + 70 + 1 + 43 +0 + 10 +-58.73953909937123 + 20 +14.06840414382142 + 10 +-52.95410548517051 + 20 +14.06840414382142 + 10 +-52.95410548517051 + 20 +9.231402269653605 + 10 +-58.73953909937123 + 20 +9.231402269653605 + 0 +ENDSEC + 0 +SECTION + 2 +OBJECTS + 0 +DICTIONARY + 5 +C +330 +0 +100 +AcDbDictionary +281 + 1 + 3 +ACAD_GROUP +350 +D + 0 +DICTIONARY + 5 +D +330 +C +100 +AcDbDictionary +281 + 1 + 0 +PLOTSETTINGS + 5 +53 +100 +AcDbPlotSettings + 6 +1x1 + 40 +0 + 41 +0 + 42 +0 + 43 +0 + 0 +ENDSEC + 0 +EOF diff --git a/OpenNest.Tests/Bending/TestData/4526 A14 PT11.dxf b/OpenNest.Tests/Bending/TestData/4526 A14 PT11.dxf new file mode 100644 index 0000000..c8ee816 --- /dev/null +++ b/OpenNest.Tests/Bending/TestData/4526 A14 PT11.dxf @@ -0,0 +1,6662 @@ +0 +SECTION +2 +HEADER +9 +$ACADVER +1 +AC1018 +9 +$DWGCODEPAGE +3 +ANSI_1252 +9 +$LASTSAVEDBY +1 +aisaacs +9 +$HANDSEED +5 +F4 +9 +$ANGBASE +50 +0.0 +9 +$ANGDIR +70 +0 +9 +$ATTMODE +70 +1 +9 +$AUNITS +70 +0 +9 +$AUPREC +70 +1 +9 +$CECOLOR +62 +256 +9 +$CELTSCALE +40 +1.0 +9 +$CELTYPE +6 +ByLayer +9 +$CELWEIGHT +370 +-1 +9 +$CLAYER +8 +0 +9 +$CMLJUST +70 +0 +9 +$CMLSCALE +40 +1.0 +9 +$CMLSTYLE +2 +Standard +9 +$DIMSTYLE +2 +Standard +9 +$TEXTSIZE +40 +0.1666666667 +9 +$TEXTSTYLE +7 +Standard +9 +$LUNITS +70 +2 +9 +$LUPREC +70 +4 +9 +$MIRRTEXT +70 +1 +9 +$EXTNAMES +290 +1 +9 +$INSBASE +10 +0.0 +20 +0.0 +30 +0.0 +9 +$INSUNITS +70 +1 +9 +$LTSCALE +40 +1.0 +9 +$LWDISPLAY +290 +1 +9 +$PDMODE +70 +0 +9 +$PDSIZE +40 +-1.0 +9 +$PLINEGEN +70 +0 +9 +$PSLTSCALE +70 +1 +9 +$TDCREATE +40 +2461123.58939267 +9 +$TDUCREATE +40 +2461123.75605933 +9 +$TDUPDATE +40 +2461123.58939314 +9 +$TDUUPDATE +40 +2461123.75605979 +9 +$TDINDWG +40 +0.0000000115740741 +9 +$UCSORG +10 +0.0 +20 +0.0 +30 +0.0 +9 +$UCSXDIR +10 +1.0 +20 +0.0 +30 +0.0 +9 +$UCSYDIR +10 +0.0 +20 +1.0 +30 +0.0 +9 +$DIMADEC +70 +0 +9 +$DIMALT +70 +0 +9 +$DIMALTD +70 +2 +9 +$DIMALTF +40 +25.4 +9 +$DIMALTRND +40 +0.0 +9 +$DIMALTTD +70 +2 +9 +$DIMALTTZ +70 +0 +9 +$DIMALTU +70 +2 +9 +$DIMALTZ +70 +0 +9 +$DIMAPOST +1 + +9 +$DIMATFIT +70 +3 +9 +$DIMAUNIT +70 +0 +9 +$DIMASZ +40 +0.18 +9 +$DIMAZIN +70 +3 +9 +$DIMSAH +70 +0 +9 +$DIMBLK +1 + +9 +$DIMLDRBLK +1 + +9 +$DIMCEN +40 +0.09 +9 +$DIMCLRD +70 +0 +9 +$DIMCLRE +70 +0 +9 +$DIMCLRT +70 +0 +9 +$DIMDEC +70 +4 +9 +$DIMDLE +40 +0.0 +9 +$DIMDLI +40 +0.38 +9 +$DIMDSEP +70 +46 +9 +$DIMEXE +40 +0.18 +9 +$DIMEXO +40 +0.0625 +9 +$DIMFXLON +70 +0 +9 +$DIMFXL +40 +1.0 +9 +$DIMGAP +40 +0.09 +9 +$DIMJUST +70 +0 +9 +$DIMLFAC +40 +1.0 +9 +$DIMLUNIT +70 +2 +9 +$DIMLWD +70 +-2 +9 +$DIMLWE +70 +-2 +9 +$DIMPOST +1 + +9 +$DIMRND +40 +0.0 +9 +$DIMSCALE +40 +1.0 +9 +$DIMSD1 +70 +0 +9 +$DIMSD2 +70 +0 +9 +$DIMSE1 +70 +0 +9 +$DIMSE2 +70 +0 +9 +$DIMSOXD +70 +0 +9 +$DIMTAD +70 +0 +9 +$DIMTDEC +70 +4 +9 +$DIMTFAC +40 +1.0 +9 +$DIMTIH +70 +0 +9 +$DIMTIX +70 +0 +9 +$DIMTM +40 +0.0 +9 +$DIMTMOVE +70 +0 +9 +$DIMTOFL +70 +0 +9 +$DIMTOH +70 +0 +9 +$DIMTOL +70 +0 +9 +$DIMLIM +70 +0 +9 +$DIMTOLJ +70 +1 +9 +$DIMTP +40 +0.0 +9 +$DIMTXT +40 +0.18 +9 +$DIMTXTDIRECTION +70 +0 +9 +$DIMTZIN +70 +0 +9 +$DIMZIN +70 +0 +9 +$DIMFRAC +70 +0 +9 +$DIMLTYPE +6 +ByBlock +9 +$DIMLTEX1 +6 +ByBlock +9 +$DIMLTEX2 +6 +ByBlock +9 +$EXTMIN +10 +0.0 +20 +0.0 +30 +0.0 +9 +$EXTMAX +10 +17.0 +20 +11.0 +30 +0.0 +9 +$LIMMIN +10 +0.0 +20 +0.0 +9 +$LIMMAX +10 +17.0 +20 +11.0 +9 +$ORTHOMODE +70 +0 +9 +$REGENMODE +70 +1 +9 +$FILLMODE +70 +1 +9 +$QTEXTMODE +70 +0 +9 +$TRACEWID +40 +0.05 +9 +$DISPSILH +70 +0 +9 +$SKETCHINC +40 +0.1 +9 +$FILLETRAD +40 +0.5 +9 +$MENU +1 +. +9 +$ELEVATION +40 +0.0 +9 +$PELEVATION +40 +0.0 +9 +$THICKNESS +40 +0.0 +9 +$LIMCHECK +70 +0 +9 +$CHAMFERA +40 +0.0 +9 +$CHAMFERB +40 +0.0 +9 +$CHAMFERC +40 +0.0 +9 +$CHAMFERD +40 +0.0 +9 +$SKPOLY +70 +0 +9 +$TDUSRTIMER +40 +0.0000000116 +9 +$USRTIMER +70 +1 +9 +$PLINEWID +40 +0.0 +9 +$SPLFRAME +70 +0 +9 +$SPLINETYPE +70 +6 +9 +$SPLINESEGS +70 +8 +9 +$SURFTAB1 +70 +6 +9 +$SURFTAB2 +70 +6 +9 +$SURFTYPE +70 +6 +9 +$SURFU +70 +6 +9 +$SURFV +70 +6 +9 +$UCSBASE +2 + +9 +$UCSNAME +2 + +9 +$UCSORTHOREF +2 + +9 +$UCSORTHOVIEW +70 +0 +9 +$UCSORGTOP +10 +0.0 +20 +0.0 +30 +0.0 +9 +$UCSORGBOTTOM +10 +0.0 +20 +0.0 +30 +0.0 +9 +$UCSORGLEFT +10 +0.0 +20 +0.0 +30 +0.0 +9 +$UCSORGRIGHT +10 +0.0 +20 +0.0 +30 +0.0 +9 +$UCSORGFRONT +10 +0.0 +20 +0.0 +30 +0.0 +9 +$UCSORGBACK +10 +0.0 +20 +0.0 +30 +0.0 +9 +$PUCSBASE +2 + +9 +$PUCSNAME +2 + +9 +$PUCSORG +10 +0.0 +20 +0.0 +30 +0.0 +9 +$PUCSXDIR +10 +1.0 +20 +0.0 +30 +0.0 +9 +$PUCSYDIR +10 +0.0 +20 +1.0 +30 +0.0 +9 +$PUCSORTHOREF +2 + +9 +$PUCSORTHOVIEW +70 +0 +9 +$PUCSORGTOP +10 +0.0 +20 +0.0 +30 +0.0 +9 +$PUCSORGBOTTOM +10 +0.0 +20 +0.0 +30 +0.0 +9 +$PUCSORGLEFT +10 +0.0 +20 +0.0 +30 +0.0 +9 +$PUCSORGRIGHT +10 +0.0 +20 +0.0 +30 +0.0 +9 +$PUCSORGFRONT +10 +0.0 +20 +0.0 +30 +0.0 +9 +$PUCSORGBACK +10 +0.0 +20 +0.0 +30 +0.0 +9 +$USERI1 +70 +0 +9 +$USERI2 +70 +0 +9 +$USERI3 +70 +0 +9 +$USERI4 +70 +0 +9 +$USERI5 +70 +0 +9 +$USERR1 +40 +0.0 +9 +$USERR2 +40 +0.0 +9 +$USERR3 +40 +0.0 +9 +$USERR4 +40 +0.0 +9 +$USERR5 +40 +0.0 +9 +$WORLDVIEW +70 +1 +9 +$SHADEDGE +70 +3 +9 +$SHADEDIF +70 +70 +9 +$TILEMODE +70 +1 +9 +$MAXACTVP +70 +64 +9 +$PINSBASE +10 +0.0 +20 +0.0 +30 +0.0 +9 +$PLIMCHECK +70 +0 +9 +$PEXTMIN +10 +100000000000000000000.0 +20 +100000000000000000000.0 +30 +100000000000000000000.0 +9 +$PEXTMAX +10 +-100000000000000000000.0 +20 +-100000000000000000000.0 +30 +-100000000000000000000.0 +9 +$PLIMMIN +10 +0.0 +20 +0.0 +9 +$PLIMMAX +10 +12.0 +20 +9.0 +9 +$UNITMODE +70 +0 +9 +$VISRETAIN +70 +1 +9 +$TREEDEPTH +70 +3020 +9 +$PROXYGRAPHICS +70 +1 +9 +$MEASUREMENT +70 +0 +9 +$ENDCAPS +280 +0 +9 +$JOINSTYLE +280 +0 +9 +$HYPERLINKBASE +1 + +9 +$STYLESHEET +1 + +9 +$XEDIT +290 +1 +9 +$CEPSNTYPE +380 +0 +9 +$PSTYLEMODE +290 +1 +9 +$FINGERPRINTGUID +2 +{371B8A5D-F3C8-4D27-852D-8A69AF1CAA12} +9 +$VERSIONGUID +2 +{FAEB1C32-E019-11D5-929B-00C0DF256EC4} +9 +$PSVPSCALE +40 +0.0 +9 +$OLESTARTUP +290 +0 +9 +$SORTENTS +280 +127 +9 +$INDEXCTL +280 +0 +9 +$HIDETEXT +280 +1 +9 +$XCLIPFRAME +290 +0 +9 +$HALOGAP +280 +0 +9 +$OBSCOLOR +70 +257 +9 +$OBSLTYPE +280 +0 +9 +$INTERSECTIONDISPLAY +280 +0 +9 +$INTERSECTIONCOLOR +70 +257 +9 +$PROJECTNAME +1 + +0 +ENDSEC +0 +SECTION +2 +CLASSES +0 +CLASS +1 +RASTERVARIABLES +2 +AcDbRasterVariables +3 +ISM +90 +0 +91 +1 +280 +0 +281 +0 +0 +ENDSEC +0 +SECTION +2 +TABLES +0 +TABLE +2 +APPID +5 +9 +330 +0 +100 +AcDbSymbolTable +70 +5 +0 +APPID +5 +12 +330 +9 +100 +AcDbSymbolTableRecord +100 +AcDbRegAppTableRecord +2 +ACAD +70 +0 +0 +APPID +5 +D4 +330 +9 +100 +AcDbSymbolTableRecord +100 +AcDbRegAppTableRecord +2 +ACAD_MLEADERVER +70 +0 +0 +APPID +5 +E9 +330 +9 +100 +AcDbSymbolTableRecord +100 +AcDbRegAppTableRecord +2 +AcCmTransparency +70 +0 +0 +APPID +5 +EA +330 +9 +100 +AcDbSymbolTableRecord +100 +AcDbRegAppTableRecord +2 +GradientColor1ACI +70 +0 +0 +APPID +5 +EB +330 +9 +100 +AcDbSymbolTableRecord +100 +AcDbRegAppTableRecord +2 +GradientColor2ACI +70 +0 +0 +ENDTAB +0 +TABLE +2 +VPORT +5 +8 +330 +0 +100 +AcDbSymbolTable +70 +1 +0 +VPORT +5 +29 +330 +8 +100 +AcDbSymbolTableRecord +100 +AcDbViewportTableRecord +2 +*Active +70 +0 +10 +0.0 +20 +0.0 +11 +1.0 +21 +1.0 +12 +8.5 +22 +5.5 +13 +0.0 +23 +0.0 +14 +0.5 +24 +0.5 +15 +0.5 +25 +0.5 +16 +0.0 +26 +0.0 +36 +1.0 +17 +0.0 +27 +0.0 +37 +0.0 +40 +11.0 +41 +1.5454545455 +75 +0 +76 +0 +0 +ENDTAB +0 +TABLE +2 +LTYPE +5 +5 +330 +0 +100 +AcDbSymbolTable +70 +8 +0 +LTYPE +5 +14 +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord +2 +ByBlock +70 +0 +3 + +72 +65 +73 +0 +40 +0.0 +0 +LTYPE +5 +15 +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord +2 +ByLayer +70 +0 +3 + +72 +65 +73 +0 +40 +0.0 +0 +LTYPE +5 +16 +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord +2 +Continuous +70 +0 +3 +Solid line +72 +65 +73 +0 +40 +0.0 +0 +LTYPE +5 +6E +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord +2 +HIDDEN +70 +0 +3 +Hidden __ __ __ __ __ __ __ __ __ __ __ __ __ __ +72 +65 +73 +2 +40 +0.075 +49 +0.05 +74 +0 +49 +-0.025 +74 +0 +0 +LTYPE +5 +6F +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord +2 +PHANTOM +70 +0 +3 +Phantom ______ __ __ ______ __ __ ______ +72 +65 +73 +6 +40 +0.5 +49 +0.25 +74 +0 +49 +-0.05 +74 +0 +49 +0.05 +74 +0 +49 +-0.05 +74 +0 +49 +0.05 +74 +0 +49 +-0.05 +74 +0 +0 +LTYPE +5 +70 +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord +2 +CENTER +70 +0 +3 +Center ____ _ ____ _ ____ _ ____ _ ____ _ ____ +72 +65 +73 +4 +40 +0.4 +49 +0.25 +74 +0 +49 +-0.05 +74 +0 +49 +0.05 +74 +0 +49 +-0.05 +74 +0 +0 +LTYPE +5 +71 +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord +2 +CENTERX2 +70 +0 +3 +Center (2x) ________ __ ________ __ _____ +72 +65 +73 +4 +40 +0.8 +49 +0.5 +74 +0 +49 +-0.1 +74 +0 +49 +0.1 +74 +0 +49 +-0.1 +74 +0 +0 +LTYPE +5 +72 +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord +2 +DOT2 +70 +0 +3 +Dot (.5x) ........................................ +72 +65 +73 +2 +40 +0.025 +49 +0.0 +74 +0 +49 +-0.025 +74 +0 +0 +ENDTAB +0 +TABLE +2 +LAYER +5 +2 +330 +0 +100 +AcDbSymbolTable +70 +4 +0 +LAYER +5 +10 +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord +2 +0 +70 +0 +62 +7 +6 +Continuous +290 +1 +370 +-3 +390 +0 +0 +LAYER +5 +73 +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord +2 +SLD-0 +70 +0 +62 +179 +6 +Continuous +290 +1 +370 +-3 +390 +0 +0 +LAYER +5 +E1 +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord +2 +BEND +70 +0 +62 +2 +6 +Continuous +290 +1 +370 +-3 +390 +0 +0 +LAYER +5 +E3 +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord +2 +ETCH +70 +0 +62 +3 +6 +Continuous +290 +1 +370 +-3 +390 +0 +0 +ENDTAB +0 +TABLE +2 +STYLE +5 +3 +330 +0 +100 +AcDbSymbolTable +70 +2 +0 +STYLE +5 +11 +330 +3 +100 +AcDbSymbolTableRecord +100 +AcDbTextStyleTableRecord +2 +Standard +3 +simplex.shx +70 +0 +71 +0 +40 +0.0 +41 +1.0 +42 +0.0 +50 +0.0 +0 +STYLE +5 +CC +330 +3 +100 +AcDbSymbolTableRecord +100 +AcDbTextStyleTableRecord +2 +SLDTEXTSTYLE0 +3 +simplex.shx +70 +0 +71 +0 +40 +0.0 +41 +0.5721875 +42 +0.0 +50 +0.0 +0 +ENDTAB +0 +TABLE +2 +DIMSTYLE +5 +A +330 +0 +100 +AcDbSymbolTable +70 +1 +100 +AcDbDimStyleTable +0 +DIMSTYLE +105 +27 +330 +A +100 +AcDbSymbolTableRecord +100 +AcDbDimStyleTableRecord +2 +Standard +3 + +4 + +40 +1.0 +41 +0.18 +42 +0.0625 +43 +0.38 +44 +0.18 +45 +0.0 +46 +0.0 +47 +0.0 +48 +0.0 +49 +1.0 +70 +0 +71 +0 +72 +0 +73 +0 +74 +0 +75 +0 +76 +0 +77 +0 +78 +0 +79 +3 +140 +0.18 +141 +0.09 +143 +25.4 +144 +1.0 +146 +1.0 +147 +0.09 +148 +0.0 +170 +0 +171 +2 +172 +0 +174 +0 +175 +0 +176 +0 +177 +0 +178 +0 +179 +0 +271 +4 +272 +4 +273 +2 +274 +2 +275 +0 +276 +0 +277 +2 +278 +46 +279 +0 +280 +0 +281 +0 +282 +0 +283 +1 +284 +0 +285 +0 +286 +0 +289 +3 +290 +0 +294 +0 +340 +11 +173 +0 +345 +14 +346 +14 +347 +14 +371 +-2 +372 +-2 +0 +ENDTAB +0 +TABLE +2 +VIEW +5 +6 +330 +0 +100 +AcDbSymbolTable +70 +0 +0 +ENDTAB +0 +TABLE +2 +UCS +5 +7 +330 +0 +100 +AcDbSymbolTable +70 +0 +0 +ENDTAB +0 +TABLE +2 +BLOCK_RECORD +5 +1 +330 +0 +100 +AcDbSymbolTable +70 +3 +0 +BLOCK_RECORD +5 +1F +330 +1 +100 +AcDbSymbolTableRecord +100 +AcDbBlockTableRecord +2 +*Model_Space +340 +22 +0 +BLOCK_RECORD +5 +1B +330 +1 +100 +AcDbSymbolTableRecord +100 +AcDbBlockTableRecord +2 +*Paper_Space +340 +1E +0 +BLOCK_RECORD +5 +23 +330 +1 +100 +AcDbSymbolTableRecord +100 +AcDbBlockTableRecord +2 +*Paper_Space0 +340 +26 +0 +ENDTAB +0 +ENDSEC +0 +SECTION +2 +BLOCKS +0 +BLOCK +5 +20 +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +100 +AcDbBlockBegin +2 +*Model_Space +70 +0 +10 +0.0 +20 +0.0 +30 +0.0 +3 +*Model_Space +0 +ENDBLK +5 +21 +330 +1F +100 +AcDbEntity +8 +0 +100 +AcDbBlockEnd +0 +BLOCK +5 +1C +330 +1B +100 +AcDbEntity +67 +1 +8 +0 +100 +AcDbBlockBegin +2 +*Paper_Space +70 +0 +10 +0.0 +20 +0.0 +30 +0.0 +3 +*Paper_Space +0 +ENDBLK +5 +1D +330 +1B +100 +AcDbEntity +8 +0 +100 +AcDbBlockEnd +0 +BLOCK +5 +24 +330 +23 +100 +AcDbEntity +67 +1 +8 +0 +100 +AcDbBlockBegin +2 +*Paper_Space0 +70 +0 +10 +0.0 +20 +0.0 +30 +0.0 +3 +*Paper_Space0 +0 +ENDBLK +5 +25 +330 +23 +100 +AcDbEntity +8 +0 +100 +AcDbBlockEnd +0 +ENDSEC +0 +SECTION +2 +ENTITIES +0 +LINE +5 +74 +330 +1F +100 +AcDbEntity +67 +0 +8 +BEND +62 +256 +6 +CENTERX2 +370 +-1 +48 +1.0 +60 +0 +100 +AcDbLine +10 +-34.7447870314 +20 +25.5 +30 +0.0 +11 +-34.7447870314 +21 +-25.5 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +75 +330 +1F +100 +AcDbEntity +67 +0 +8 +BEND +62 +256 +6 +CENTERX2 +370 +-1 +48 +1.0 +60 +0 +100 +AcDbLine +10 +34.7447870314 +20 +-25.5 +30 +0.0 +11 +34.7447870314 +21 +-7.0 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +76 +330 +1F +100 +AcDbEntity +67 +0 +8 +BEND +62 +256 +6 +CENTERX2 +370 +-1 +48 +1.0 +60 +0 +100 +AcDbLine +10 +34.7447870314 +20 +7.0 +30 +0.0 +11 +34.7447870314 +21 +25.5 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +ELLIPSE +5 +77 +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbEllipse +10 +-55.6648265946 +20 +11.5 +30 +0.0 +11 +-0.848528137423869 +21 +0.0000000000000001 +31 +0.0 +210 +-0.0000000000000069 +220 +0.0 +230 +1.0 +40 +0.7071067812 +41 +1.46008486522431 +42 +-1.46008486522429 +0 +ELLIPSE +5 +78 +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbEllipse +10 +-55.8523265946 +20 +11.5 +30 +0.0 +11 +-0.848528137423869 +21 +0.0000000000000001 +31 +0.0 +210 +-0.0000000000000069 +220 +0.0 +230 +1.0 +40 +0.7071067812 +41 +-1.68150778836545 +42 +1.68150778836546 +0 +LINE +5 +79 +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +5.0 +20 +15.75 +30 +0.0 +11 +5.0 +21 +16.125 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +7A +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +5.0 +20 +16.125 +30 +0.0 +11 +3.0 +21 +16.125 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +7B +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +3.0 +20 +16.125 +30 +0.0 +11 +3.0 +21 +15.75 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +7C +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +3.0 +20 +15.75 +30 +0.0 +11 +5.0 +21 +15.75 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +7D +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +5.0 +20 +9.375 +30 +0.0 +11 +5.0 +21 +9.75 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +7E +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +5.0 +20 +9.75 +30 +0.0 +11 +3.0 +21 +9.75 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +7F +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +3.0 +20 +9.75 +30 +0.0 +11 +3.0 +21 +9.375 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +80 +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +3.0 +20 +9.375 +30 +0.0 +11 +5.0 +21 +9.375 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +81 +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +5.0 +20 +3.0 +30 +0.0 +11 +5.0 +21 +3.375 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +82 +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +5.0 +20 +3.375 +30 +0.0 +11 +3.0 +21 +3.375 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +83 +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +3.0 +20 +3.375 +30 +0.0 +11 +3.0 +21 +3.0 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +84 +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +3.0 +20 +3.0 +30 +0.0 +11 +5.0 +21 +3.0 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +85 +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +5.0 +20 +-3.375 +30 +0.0 +11 +5.0 +21 +-3.0 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +86 +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +5.0 +20 +-3.0 +30 +0.0 +11 +3.0 +21 +-3.0 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +87 +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +3.0 +20 +-3.0 +30 +0.0 +11 +3.0 +21 +-3.375 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +88 +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +3.0 +20 +-3.375 +30 +0.0 +11 +5.0 +21 +-3.375 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +89 +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +-3.0 +20 +15.75 +30 +0.0 +11 +-3.0 +21 +16.125 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +8A +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +-3.0 +20 +16.125 +30 +0.0 +11 +-5.0 +21 +16.125 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +8B +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +-5.0 +20 +16.125 +30 +0.0 +11 +-5.0 +21 +15.75 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +8C +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +-5.0 +20 +15.75 +30 +0.0 +11 +-3.0 +21 +15.75 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +8D +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +-3.0 +20 +9.375 +30 +0.0 +11 +-3.0 +21 +9.75 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +8E +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +-3.0 +20 +9.75 +30 +0.0 +11 +-5.0 +21 +9.75 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +8F +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +-5.0 +20 +9.75 +30 +0.0 +11 +-5.0 +21 +9.375 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +90 +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +-5.0 +20 +9.375 +30 +0.0 +11 +-3.0 +21 +9.375 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +91 +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +-3.0 +20 +3.0 +30 +0.0 +11 +-3.0 +21 +3.375 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +92 +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +-3.0 +20 +3.375 +30 +0.0 +11 +-5.0 +21 +3.375 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +93 +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +-5.0 +20 +3.375 +30 +0.0 +11 +-5.0 +21 +3.0 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +94 +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +-5.0 +20 +3.0 +30 +0.0 +11 +-3.0 +21 +3.0 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +95 +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +-3.0 +20 +-3.375 +30 +0.0 +11 +-3.0 +21 +-3.0 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +96 +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +-3.0 +20 +-3.0 +30 +0.0 +11 +-5.0 +21 +-3.0 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +97 +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +-5.0 +20 +-3.0 +30 +0.0 +11 +-5.0 +21 +-3.375 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +98 +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +-5.0 +20 +-3.375 +30 +0.0 +11 +-3.0 +21 +-3.375 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +CIRCLE +5 +99 +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbCircle +10 +0.0 +20 +19.125 +30 +0.0 +40 +0.5625 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +CIRCLE +5 +9A +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbCircle +10 +0.0 +20 +12.75 +30 +0.0 +40 +0.5625 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +CIRCLE +5 +9B +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbCircle +10 +0.0 +20 +6.375 +30 +0.0 +40 +0.5625 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +CIRCLE +5 +9C +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbCircle +10 +0.0 +20 +0.0 +30 +0.0 +40 +0.5625 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +CIRCLE +5 +9D +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbCircle +10 +0.0 +20 +-6.375 +30 +0.0 +40 +0.5625 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +9E +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +60.8020740629 +20 +25.5 +30 +0.0 +11 +60.8020740629 +21 +-25.5 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +9F +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +-60.8020740629 +20 +-25.5 +30 +0.0 +11 +60.8020740629 +21 +-25.5 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +A0 +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +-60.8020740629 +20 +-25.5 +30 +0.0 +11 +-60.8020740629 +21 +-21.21875 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +A1 +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +-57.8645740629 +20 +-21.21875 +30 +0.0 +11 +-60.8020740629 +21 +-21.21875 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +ARC +5 +A2 +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbCircle +39 +0.0 +10 +-57.8645740629 +20 +-20.65625 +30 +0.0 +40 +0.5625 +210 +0.0 +220 +0.0 +230 +1.0 +100 +AcDbArc +50 +270.0 +51 +0.0 +0 +LINE +5 +A3 +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +-57.3020740629 +20 +-14.09375 +30 +0.0 +11 +-57.3020740629 +21 +-20.65625 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +ARC +5 +A4 +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbCircle +39 +0.0 +10 +-57.8645740629 +20 +-14.09375 +30 +0.0 +40 +0.5625 +210 +0.0 +220 +0.0 +230 +1.0 +100 +AcDbArc +50 +0.0 +51 +90.0 +0 +LINE +5 +A5 +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +-60.8020740629 +20 +-13.53125 +30 +0.0 +11 +-57.8645740629 +21 +-13.53125 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +A6 +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +-60.8020740629 +20 +-13.53125 +30 +0.0 +11 +-60.8020740629 +21 +13.46875 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +A7 +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +-57.8645740629 +20 +13.46875 +30 +0.0 +11 +-60.8020740629 +21 +13.46875 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +ARC +5 +A8 +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbCircle +39 +0.0 +10 +-57.8645740629 +20 +14.03125 +30 +0.0 +40 +0.5625 +210 +0.0 +220 +0.0 +230 +1.0 +100 +AcDbArc +50 +270.0 +51 +0.0 +0 +LINE +5 +A9 +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +-57.3020740629 +20 +20.59375 +30 +0.0 +11 +-57.3020740629 +21 +14.03125 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +ARC +5 +AA +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbCircle +39 +0.0 +10 +-57.8645740629 +20 +20.59375 +30 +0.0 +40 +0.5625 +210 +0.0 +220 +0.0 +230 +1.0 +100 +AcDbArc +50 +0.0 +51 +90.0 +0 +LINE +5 +AB +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +-60.8020740629 +20 +21.15625 +30 +0.0 +11 +-57.8645740629 +21 +21.15625 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +AC +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +-60.8020740629 +20 +21.15625 +30 +0.0 +11 +-60.8020740629 +21 +25.5 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +AD +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +60.8020740629 +20 +25.5 +30 +0.0 +11 +-60.8020740629 +21 +25.5 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +CIRCLE +5 +AE +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbCircle +10 +0.0 +20 +-19.125 +30 +0.0 +40 +0.5625 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +CIRCLE +5 +AF +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbCircle +10 +0.0 +20 +-12.75 +30 +0.0 +40 +0.5625 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +B0 +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +5.0 +20 +-15.75 +30 +0.0 +11 +3.0 +21 +-15.75 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +B1 +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +3.0 +20 +-15.75 +30 +0.0 +11 +3.0 +21 +-16.125 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +B2 +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +3.0 +20 +-16.125 +30 +0.0 +11 +5.0 +21 +-16.125 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +B3 +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +5.0 +20 +-16.125 +30 +0.0 +11 +5.0 +21 +-15.75 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +B4 +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +-3.0 +20 +-15.75 +30 +0.0 +11 +-5.0 +21 +-15.75 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +B5 +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +-5.0 +20 +-15.75 +30 +0.0 +11 +-5.0 +21 +-16.125 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +B6 +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +-5.0 +20 +-16.125 +30 +0.0 +11 +-3.0 +21 +-16.125 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +B7 +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +-3.0 +20 +-16.125 +30 +0.0 +11 +-3.0 +21 +-15.75 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +B8 +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +-3.0 +20 +-9.375 +30 +0.0 +11 +-5.0 +21 +-9.375 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +B9 +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +-5.0 +20 +-9.375 +30 +0.0 +11 +-5.0 +21 +-9.75 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +BA +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +-5.0 +20 +-9.75 +30 +0.0 +11 +-3.0 +21 +-9.75 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +BB +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +-3.0 +20 +-9.75 +30 +0.0 +11 +-3.0 +21 +-9.375 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +BC +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +5.0 +20 +-9.375 +30 +0.0 +11 +3.0 +21 +-9.375 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +BD +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +3.0 +20 +-9.375 +30 +0.0 +11 +3.0 +21 +-9.75 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +BE +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +3.0 +20 +-9.75 +30 +0.0 +11 +5.0 +21 +-9.75 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +BF +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +5.0 +20 +-9.75 +30 +0.0 +11 +5.0 +21 +-9.375 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +C0 +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +34.5364240629 +20 +-6.96875 +30 +0.0 +11 +34.5364240629 +21 +-5.0 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +C1 +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +34.5364240629 +20 +-5.0 +30 +0.0 +11 +37.1770740629 +21 +-5.0 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +C2 +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +37.1770740629 +20 +-5.0 +30 +0.0 +11 +37.1770740629 +21 +5.0 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +C3 +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +37.1770740629 +20 +5.0 +30 +0.0 +11 +34.5364240629 +21 +5.0 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +C4 +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +34.5364240629 +20 +5.0 +30 +0.0 +11 +34.5364240629 +21 +6.96875 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +C5 +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +34.5364240629 +20 +6.96875 +30 +0.0 +11 +35.0520740629 +21 +6.96875 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +C6 +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +35.0520740629 +20 +6.96875 +30 +0.0 +11 +35.0520740629 +21 +7.0 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +C7 +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +35.0520740629 +20 +7.0 +30 +0.0 +11 +34.4375 +21 +7.0 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +C8 +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +34.4375 +20 +7.0 +30 +0.0 +11 +34.4375 +21 +-7.0 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +C9 +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +34.4375 +20 +-7.0 +30 +0.0 +11 +35.0520740629 +21 +-7.0 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +CA +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +35.0520740629 +20 +-6.96875 +30 +0.0 +11 +35.0520740629 +21 +-7.0 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +CB +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +34.5364240629 +20 +-6.96875 +30 +0.0 +11 +35.0520740629 +21 +-6.96875 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +MTEXT +5 +CD +330 +1F +100 +AcDbEntity +67 +0 +8 +BEND +62 +7 +6 +Continuous +370 +0 +48 +1.0 +60 +0 +100 +AcDbMText +10 +-34.9075398851 +20 +-0.0162615485 +30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +1 +UP 90\U+00B0 R 0.313 +40 +0.125 +41 +0.0 +44 +1.0 +11 +-0.0000000000000035 +21 +1.0 +31 +0.0 +71 +2 +72 +1 +73 +1 +7 +SLDTEXTSTYLE0 +0 +MTEXT +5 +CE +330 +1F +100 +AcDbEntity +67 +0 +8 +BEND +62 +7 +6 +Continuous +370 +0 +48 +1.0 +60 +0 +100 +AcDbMText +10 +34.586462758 +20 +-16.2662615485 +30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +1 +UP 90\U+00B0 R 0.313 +40 +0.125 +41 +0.0 +44 +1.0 +11 +-0.0000000000000035 +21 +1.0 +31 +0.0 +71 +2 +72 +1 +73 +1 +7 +SLDTEXTSTYLE0 +0 +LINE +5 +E2 +330 +1F +100 +AcDbEntity +67 +0 +8 +ETCH +62 +256 +6 +ByLayer +370 +-1 +48 +1.0 +60 +0 +100 +AcDbLine +10 +-34.7447870314 +20 +-25.5 +30 +0.0 +11 +-34.7447870314 +21 +-24.5 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +E4 +330 +1F +100 +AcDbEntity +67 +0 +8 +ETCH +62 +256 +6 +ByLayer +370 +-1 +48 +1.0 +60 +0 +100 +AcDbLine +10 +-34.7447870314 +20 +25.5 +30 +0.0 +11 +-34.7447870314 +21 +24.5 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +E5 +330 +1F +100 +AcDbEntity +67 +0 +8 +ETCH +62 +256 +6 +ByLayer +370 +-1 +48 +1.0 +60 +0 +100 +AcDbLine +10 +34.7447870314 +20 +-25.5 +30 +0.0 +11 +34.7447870314 +21 +-24.5 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +E6 +330 +1F +100 +AcDbEntity +67 +0 +8 +ETCH +62 +256 +6 +ByLayer +370 +-1 +48 +1.0 +60 +0 +100 +AcDbLine +10 +34.7447870314 +20 +-7.0 +30 +0.0 +11 +34.7447870314 +21 +-8.0 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +E7 +330 +1F +100 +AcDbEntity +67 +0 +8 +ETCH +62 +256 +6 +ByLayer +370 +-1 +48 +1.0 +60 +0 +100 +AcDbLine +10 +34.7447870314 +20 +7.0 +30 +0.0 +11 +34.7447870314 +21 +8.0 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +E8 +330 +1F +100 +AcDbEntity +67 +0 +8 +ETCH +62 +256 +6 +ByLayer +370 +-1 +48 +1.0 +60 +0 +100 +AcDbLine +10 +34.7447870314 +20 +25.5 +30 +0.0 +11 +34.7447870314 +21 +24.5 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +ENDSEC +0 +SECTION +2 +OBJECTS +0 +DICTIONARY +5 +EC +330 +0 +100 +AcDbDictionary +280 +0 +281 +1 +3 +ACAD_GROUP +350 +ED +3 +ACAD_LAYOUT +350 +EE +3 +ACAD_MLINESTYLE +350 +F2 +0 +DICTIONARY +5 +ED +330 +EC +100 +AcDbDictionary +280 +0 +281 +1 +0 +DICTIONARY +5 +EE +330 +EC +100 +AcDbDictionary +280 +0 +281 +1 +3 +Layout1 +350 +1E +3 +Layout2 +350 +26 +3 +Model +350 +22 +0 +DICTIONARY +5 +F2 +330 +EC +100 +AcDbDictionary +280 +0 +281 +1 +3 +Standard +350 +18 +0 +LAYOUT +5 +1E +330 +EE +100 +AcDbPlotSettings +1 + +2 +none_device +4 + +6 + +40 +0.0 +41 +0.0 +42 +0.0 +43 +0.0 +44 +0.0 +45 +0.0 +46 +0.0 +47 +0.0 +48 +0.0 +49 +0.0 +140 +0.0 +141 +0.0 +142 +1.0 +143 +1.0 +70 +688 +72 +0 +73 +0 +74 +5 +7 + +75 +16 +76 +0 +77 +2 +78 +300 +147 +1.0 +148 +0.0 +149 +0.0 +100 +AcDbLayout +1 +Layout1 +70 +1 +71 +1 +10 +0.0 +20 +-7.5 +11 +12.0 +21 +9.0 +12 +0.0 +22 +0.0 +32 +0.0 +14 +100000000000000000000.0 +24 +100000000000000000000.0 +34 +100000000000000000000.0 +15 +-100000000000000000000.0 +25 +-100000000000000000000.0 +35 +-100000000000000000000.0 +146 +0.0 +13 +0.0 +23 +0.0 +33 +0.0 +16 +1.0 +26 +0.0 +36 +0.0 +17 +0.0 +27 +1.0 +37 +0.0 +76 +0 +330 +1B +0 +LAYOUT +5 +26 +330 +EE +100 +AcDbPlotSettings +1 + +2 +none_device +4 + +6 + +40 +0.0 +41 +0.0 +42 +0.0 +43 +0.0 +44 +0.0 +45 +0.0 +46 +0.0 +47 +0.0 +48 +0.0 +49 +0.0 +140 +0.0 +141 +0.0 +142 +1.0 +143 +1.0 +70 +688 +72 +0 +73 +0 +74 +5 +7 + +75 +16 +76 +0 +77 +2 +78 +300 +147 +1.0 +148 +0.0 +149 +0.0 +100 +AcDbLayout +1 +Layout2 +70 +1 +71 +2 +10 +0.0 +20 +-7.5 +11 +0.0 +21 +0.0 +12 +0.0 +22 +0.0 +32 +0.0 +14 +0.0 +24 +0.0 +34 +0.0 +15 +0.0 +25 +0.0 +35 +0.0 +146 +0.0 +13 +0.0 +23 +0.0 +33 +0.0 +16 +1.0 +26 +0.0 +36 +0.0 +17 +0.0 +27 +1.0 +37 +0.0 +76 +0 +330 +23 +0 +LAYOUT +5 +22 +330 +EE +100 +AcDbPlotSettings +1 + +2 +none_device +4 +Letter_(8.50_x_11.00_Inches) +6 + +40 +6.35 +41 +6.35 +42 +6.35000508 +43 +6.35000508 +44 +215.9 +45 +279.4 +46 +0.0 +47 +0.0 +48 +0.0 +49 +0.0 +140 +0.0 +141 +0.0 +142 +1.0 +143 +1.0 +70 +1712 +72 +0 +73 +0 +74 +0 +7 + +75 +0 +76 +0 +77 +2 +78 +300 +147 +1.0 +148 +0.0 +149 +0.0 +100 +AcDbLayout +1 +Model +70 +1 +71 +3 +10 +0.0 +20 +-7.5 +11 +17.0 +21 +11.0 +12 +0.0 +22 +0.0 +32 +0.0 +14 +0.0 +24 +0.0 +34 +0.0 +15 +17.0 +25 +11.0 +35 +0.0 +146 +0.0 +13 +0.0 +23 +0.0 +33 +0.0 +16 +1.0 +26 +0.0 +36 +0.0 +17 +0.0 +27 +1.0 +37 +0.0 +76 +0 +330 +1F +0 +MLINESTYLE +5 +18 +330 +F2 +100 +AcDbMlineStyle +2 +Standard +70 +0 +3 + +62 +256 +51 +90.0 +52 +90.0 +71 +2 +49 +0.5 +62 +256 +6 +ByLayer +49 +-0.5 +62 +256 +6 +ByLayer +0 +ENDSEC +0 +EOF diff --git a/OpenNest.Tests/Bending/TestData/4526 A14 PT23.dxf b/OpenNest.Tests/Bending/TestData/4526 A14 PT23.dxf new file mode 100644 index 0000000..6f8b890 --- /dev/null +++ b/OpenNest.Tests/Bending/TestData/4526 A14 PT23.dxf @@ -0,0 +1,4370 @@ +0 +SECTION +2 +HEADER +9 +$ACADVER +1 +AC1018 +9 +$DWGCODEPAGE +3 +ANSI_1252 +9 +$LASTSAVEDBY +1 +aisaacs +9 +$HANDSEED +5 +BF +9 +$ANGBASE +50 +0.0 +9 +$ANGDIR +70 +0 +9 +$ATTMODE +70 +1 +9 +$AUNITS +70 +0 +9 +$AUPREC +70 +1 +9 +$CECOLOR +62 +256 +9 +$CELTSCALE +40 +1.0 +9 +$CELTYPE +6 +ByLayer +9 +$CELWEIGHT +370 +-1 +9 +$CLAYER +8 +0 +9 +$CMLJUST +70 +0 +9 +$CMLSCALE +40 +1.0 +9 +$CMLSTYLE +2 +Standard +9 +$DIMSTYLE +2 +Standard +9 +$TEXTSIZE +40 +0.1666666667 +9 +$TEXTSTYLE +7 +Standard +9 +$LUNITS +70 +2 +9 +$LUPREC +70 +4 +9 +$MIRRTEXT +70 +1 +9 +$EXTNAMES +290 +1 +9 +$INSBASE +10 +0.0 +20 +0.0 +30 +0.0 +9 +$INSUNITS +70 +1 +9 +$LTSCALE +40 +1.0 +9 +$LWDISPLAY +290 +1 +9 +$PDMODE +70 +0 +9 +$PDSIZE +40 +-1.0 +9 +$PLINEGEN +70 +0 +9 +$PSLTSCALE +70 +1 +9 +$TDCREATE +40 +2461123.58996874 +9 +$TDUCREATE +40 +2461123.75663542 +9 +$TDUPDATE +40 +2461123.58996933 +9 +$TDUUPDATE +40 +2461123.756636 +9 +$TDINDWG +40 +0.0000000115740741 +9 +$UCSORG +10 +0.0 +20 +0.0 +30 +0.0 +9 +$UCSXDIR +10 +1.0 +20 +0.0 +30 +0.0 +9 +$UCSYDIR +10 +0.0 +20 +1.0 +30 +0.0 +9 +$DIMADEC +70 +0 +9 +$DIMALT +70 +0 +9 +$DIMALTD +70 +2 +9 +$DIMALTF +40 +25.4 +9 +$DIMALTRND +40 +0.0 +9 +$DIMALTTD +70 +2 +9 +$DIMALTTZ +70 +0 +9 +$DIMALTU +70 +2 +9 +$DIMALTZ +70 +0 +9 +$DIMAPOST +1 + +9 +$DIMATFIT +70 +3 +9 +$DIMAUNIT +70 +0 +9 +$DIMASZ +40 +0.18 +9 +$DIMAZIN +70 +3 +9 +$DIMSAH +70 +0 +9 +$DIMBLK +1 + +9 +$DIMLDRBLK +1 + +9 +$DIMCEN +40 +0.09 +9 +$DIMCLRD +70 +0 +9 +$DIMCLRE +70 +0 +9 +$DIMCLRT +70 +0 +9 +$DIMDEC +70 +4 +9 +$DIMDLE +40 +0.0 +9 +$DIMDLI +40 +0.38 +9 +$DIMDSEP +70 +46 +9 +$DIMEXE +40 +0.18 +9 +$DIMEXO +40 +0.0625 +9 +$DIMFXLON +70 +0 +9 +$DIMFXL +40 +1.0 +9 +$DIMGAP +40 +0.09 +9 +$DIMJUST +70 +0 +9 +$DIMLFAC +40 +1.0 +9 +$DIMLUNIT +70 +2 +9 +$DIMLWD +70 +-2 +9 +$DIMLWE +70 +-2 +9 +$DIMPOST +1 + +9 +$DIMRND +40 +0.0 +9 +$DIMSCALE +40 +1.0 +9 +$DIMSD1 +70 +0 +9 +$DIMSD2 +70 +0 +9 +$DIMSE1 +70 +0 +9 +$DIMSE2 +70 +0 +9 +$DIMSOXD +70 +0 +9 +$DIMTAD +70 +0 +9 +$DIMTDEC +70 +4 +9 +$DIMTFAC +40 +1.0 +9 +$DIMTIH +70 +0 +9 +$DIMTIX +70 +0 +9 +$DIMTM +40 +0.0 +9 +$DIMTMOVE +70 +0 +9 +$DIMTOFL +70 +0 +9 +$DIMTOH +70 +0 +9 +$DIMTOL +70 +0 +9 +$DIMLIM +70 +0 +9 +$DIMTOLJ +70 +1 +9 +$DIMTP +40 +0.0 +9 +$DIMTXT +40 +0.18 +9 +$DIMTXTDIRECTION +70 +0 +9 +$DIMTZIN +70 +0 +9 +$DIMZIN +70 +0 +9 +$DIMFRAC +70 +0 +9 +$DIMLTYPE +6 +ByBlock +9 +$DIMLTEX1 +6 +ByBlock +9 +$DIMLTEX2 +6 +ByBlock +9 +$EXTMIN +10 +0.0 +20 +0.0 +30 +0.0 +9 +$EXTMAX +10 +17.0 +20 +11.0 +30 +0.0 +9 +$LIMMIN +10 +0.0 +20 +0.0 +9 +$LIMMAX +10 +17.0 +20 +11.0 +9 +$ORTHOMODE +70 +0 +9 +$REGENMODE +70 +1 +9 +$FILLMODE +70 +1 +9 +$QTEXTMODE +70 +0 +9 +$TRACEWID +40 +0.05 +9 +$DISPSILH +70 +0 +9 +$SKETCHINC +40 +0.1 +9 +$FILLETRAD +40 +0.5 +9 +$MENU +1 +. +9 +$ELEVATION +40 +0.0 +9 +$PELEVATION +40 +0.0 +9 +$THICKNESS +40 +0.0 +9 +$LIMCHECK +70 +0 +9 +$CHAMFERA +40 +0.0 +9 +$CHAMFERB +40 +0.0 +9 +$CHAMFERC +40 +0.0 +9 +$CHAMFERD +40 +0.0 +9 +$SKPOLY +70 +0 +9 +$TDUSRTIMER +40 +0.0000000116 +9 +$USRTIMER +70 +1 +9 +$PLINEWID +40 +0.0 +9 +$SPLFRAME +70 +0 +9 +$SPLINETYPE +70 +6 +9 +$SPLINESEGS +70 +8 +9 +$SURFTAB1 +70 +6 +9 +$SURFTAB2 +70 +6 +9 +$SURFTYPE +70 +6 +9 +$SURFU +70 +6 +9 +$SURFV +70 +6 +9 +$UCSBASE +2 + +9 +$UCSNAME +2 + +9 +$UCSORTHOREF +2 + +9 +$UCSORTHOVIEW +70 +0 +9 +$UCSORGTOP +10 +0.0 +20 +0.0 +30 +0.0 +9 +$UCSORGBOTTOM +10 +0.0 +20 +0.0 +30 +0.0 +9 +$UCSORGLEFT +10 +0.0 +20 +0.0 +30 +0.0 +9 +$UCSORGRIGHT +10 +0.0 +20 +0.0 +30 +0.0 +9 +$UCSORGFRONT +10 +0.0 +20 +0.0 +30 +0.0 +9 +$UCSORGBACK +10 +0.0 +20 +0.0 +30 +0.0 +9 +$PUCSBASE +2 + +9 +$PUCSNAME +2 + +9 +$PUCSORG +10 +0.0 +20 +0.0 +30 +0.0 +9 +$PUCSXDIR +10 +1.0 +20 +0.0 +30 +0.0 +9 +$PUCSYDIR +10 +0.0 +20 +1.0 +30 +0.0 +9 +$PUCSORTHOREF +2 + +9 +$PUCSORTHOVIEW +70 +0 +9 +$PUCSORGTOP +10 +0.0 +20 +0.0 +30 +0.0 +9 +$PUCSORGBOTTOM +10 +0.0 +20 +0.0 +30 +0.0 +9 +$PUCSORGLEFT +10 +0.0 +20 +0.0 +30 +0.0 +9 +$PUCSORGRIGHT +10 +0.0 +20 +0.0 +30 +0.0 +9 +$PUCSORGFRONT +10 +0.0 +20 +0.0 +30 +0.0 +9 +$PUCSORGBACK +10 +0.0 +20 +0.0 +30 +0.0 +9 +$USERI1 +70 +0 +9 +$USERI2 +70 +0 +9 +$USERI3 +70 +0 +9 +$USERI4 +70 +0 +9 +$USERI5 +70 +0 +9 +$USERR1 +40 +0.0 +9 +$USERR2 +40 +0.0 +9 +$USERR3 +40 +0.0 +9 +$USERR4 +40 +0.0 +9 +$USERR5 +40 +0.0 +9 +$WORLDVIEW +70 +1 +9 +$SHADEDGE +70 +3 +9 +$SHADEDIF +70 +70 +9 +$TILEMODE +70 +1 +9 +$MAXACTVP +70 +64 +9 +$PINSBASE +10 +0.0 +20 +0.0 +30 +0.0 +9 +$PLIMCHECK +70 +0 +9 +$PEXTMIN +10 +100000000000000000000.0 +20 +100000000000000000000.0 +30 +100000000000000000000.0 +9 +$PEXTMAX +10 +-100000000000000000000.0 +20 +-100000000000000000000.0 +30 +-100000000000000000000.0 +9 +$PLIMMIN +10 +0.0 +20 +0.0 +9 +$PLIMMAX +10 +12.0 +20 +9.0 +9 +$UNITMODE +70 +0 +9 +$VISRETAIN +70 +1 +9 +$TREEDEPTH +70 +3020 +9 +$PROXYGRAPHICS +70 +1 +9 +$MEASUREMENT +70 +0 +9 +$ENDCAPS +280 +0 +9 +$JOINSTYLE +280 +0 +9 +$HYPERLINKBASE +1 + +9 +$STYLESHEET +1 + +9 +$XEDIT +290 +1 +9 +$CEPSNTYPE +380 +0 +9 +$PSTYLEMODE +290 +1 +9 +$FINGERPRINTGUID +2 +{85E90399-6519-4314-A4D0-A55B92ADDB30} +9 +$VERSIONGUID +2 +{FAEB1C32-E019-11D5-929B-00C0DF256EC4} +9 +$PSVPSCALE +40 +0.0 +9 +$OLESTARTUP +290 +0 +9 +$SORTENTS +280 +127 +9 +$INDEXCTL +280 +0 +9 +$HIDETEXT +280 +1 +9 +$XCLIPFRAME +290 +0 +9 +$HALOGAP +280 +0 +9 +$OBSCOLOR +70 +257 +9 +$OBSLTYPE +280 +0 +9 +$INTERSECTIONDISPLAY +280 +0 +9 +$INTERSECTIONCOLOR +70 +257 +9 +$PROJECTNAME +1 + +0 +ENDSEC +0 +SECTION +2 +CLASSES +0 +CLASS +1 +RASTERVARIABLES +2 +AcDbRasterVariables +3 +ISM +90 +0 +91 +1 +280 +0 +281 +0 +0 +ENDSEC +0 +SECTION +2 +TABLES +0 +TABLE +2 +APPID +5 +9 +330 +0 +100 +AcDbSymbolTable +70 +5 +0 +APPID +5 +12 +330 +9 +100 +AcDbSymbolTableRecord +100 +AcDbRegAppTableRecord +2 +ACAD +70 +0 +0 +APPID +5 +9B +330 +9 +100 +AcDbSymbolTableRecord +100 +AcDbRegAppTableRecord +2 +ACAD_MLEADERVER +70 +0 +0 +APPID +5 +B4 +330 +9 +100 +AcDbSymbolTableRecord +100 +AcDbRegAppTableRecord +2 +AcCmTransparency +70 +0 +0 +APPID +5 +B5 +330 +9 +100 +AcDbSymbolTableRecord +100 +AcDbRegAppTableRecord +2 +GradientColor1ACI +70 +0 +0 +APPID +5 +B6 +330 +9 +100 +AcDbSymbolTableRecord +100 +AcDbRegAppTableRecord +2 +GradientColor2ACI +70 +0 +0 +ENDTAB +0 +TABLE +2 +VPORT +5 +8 +330 +0 +100 +AcDbSymbolTable +70 +1 +0 +VPORT +5 +29 +330 +8 +100 +AcDbSymbolTableRecord +100 +AcDbViewportTableRecord +2 +*Active +70 +0 +10 +0.0 +20 +0.0 +11 +1.0 +21 +1.0 +12 +8.5 +22 +5.5 +13 +0.0 +23 +0.0 +14 +0.5 +24 +0.5 +15 +0.5 +25 +0.5 +16 +0.0 +26 +0.0 +36 +1.0 +17 +0.0 +27 +0.0 +37 +0.0 +40 +11.0 +41 +1.5454545455 +75 +0 +76 +0 +0 +ENDTAB +0 +TABLE +2 +LTYPE +5 +5 +330 +0 +100 +AcDbSymbolTable +70 +8 +0 +LTYPE +5 +14 +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord +2 +ByBlock +70 +0 +3 + +72 +65 +73 +0 +40 +0.0 +0 +LTYPE +5 +15 +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord +2 +ByLayer +70 +0 +3 + +72 +65 +73 +0 +40 +0.0 +0 +LTYPE +5 +16 +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord +2 +Continuous +70 +0 +3 +Solid line +72 +65 +73 +0 +40 +0.0 +0 +LTYPE +5 +6E +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord +2 +HIDDEN +70 +0 +3 +Hidden __ __ __ __ __ __ __ __ __ __ __ __ __ __ +72 +65 +73 +2 +40 +0.075 +49 +0.05 +74 +0 +49 +-0.025 +74 +0 +0 +LTYPE +5 +6F +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord +2 +PHANTOM +70 +0 +3 +Phantom ______ __ __ ______ __ __ ______ +72 +65 +73 +6 +40 +0.5 +49 +0.25 +74 +0 +49 +-0.05 +74 +0 +49 +0.05 +74 +0 +49 +-0.05 +74 +0 +49 +0.05 +74 +0 +49 +-0.05 +74 +0 +0 +LTYPE +5 +70 +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord +2 +CENTER +70 +0 +3 +Center ____ _ ____ _ ____ _ ____ _ ____ _ ____ +72 +65 +73 +4 +40 +0.4 +49 +0.25 +74 +0 +49 +-0.05 +74 +0 +49 +0.05 +74 +0 +49 +-0.05 +74 +0 +0 +LTYPE +5 +71 +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord +2 +CENTERX2 +70 +0 +3 +Center (2x) ________ __ ________ __ _____ +72 +65 +73 +4 +40 +0.8 +49 +0.5 +74 +0 +49 +-0.1 +74 +0 +49 +0.1 +74 +0 +49 +-0.1 +74 +0 +0 +LTYPE +5 +72 +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord +2 +DOT2 +70 +0 +3 +Dot (.5x) ........................................ +72 +65 +73 +2 +40 +0.025 +49 +0.0 +74 +0 +49 +-0.025 +74 +0 +0 +ENDTAB +0 +TABLE +2 +LAYER +5 +2 +330 +0 +100 +AcDbSymbolTable +70 +4 +0 +LAYER +5 +10 +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord +2 +0 +70 +0 +62 +7 +6 +Continuous +290 +1 +370 +-3 +390 +0 +0 +LAYER +5 +73 +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord +2 +SLD-0 +70 +0 +62 +179 +6 +Continuous +290 +1 +370 +-3 +390 +0 +0 +LAYER +5 +A8 +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord +2 +BEND +70 +0 +62 +2 +6 +Continuous +290 +1 +370 +-3 +390 +0 +0 +LAYER +5 +AA +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord +2 +ETCH +70 +0 +62 +3 +6 +Continuous +290 +1 +370 +-3 +390 +0 +0 +ENDTAB +0 +TABLE +2 +STYLE +5 +3 +330 +0 +100 +AcDbSymbolTable +70 +2 +0 +STYLE +5 +11 +330 +3 +100 +AcDbSymbolTableRecord +100 +AcDbTextStyleTableRecord +2 +Standard +3 +simplex.shx +70 +0 +71 +0 +40 +0.0 +41 +1.0 +42 +0.0 +50 +0.0 +0 +STYLE +5 +91 +330 +3 +100 +AcDbSymbolTableRecord +100 +AcDbTextStyleTableRecord +2 +SLDTEXTSTYLE0 +3 +simplex.shx +70 +0 +71 +0 +40 +0.0 +41 +0.5721875 +42 +0.0 +50 +0.0 +0 +ENDTAB +0 +TABLE +2 +DIMSTYLE +5 +A +330 +0 +100 +AcDbSymbolTable +70 +1 +100 +AcDbDimStyleTable +0 +DIMSTYLE +105 +27 +330 +A +100 +AcDbSymbolTableRecord +100 +AcDbDimStyleTableRecord +2 +Standard +3 + +4 + +40 +1.0 +41 +0.18 +42 +0.0625 +43 +0.38 +44 +0.18 +45 +0.0 +46 +0.0 +47 +0.0 +48 +0.0 +49 +1.0 +70 +0 +71 +0 +72 +0 +73 +0 +74 +0 +75 +0 +76 +0 +77 +0 +78 +0 +79 +3 +140 +0.18 +141 +0.09 +143 +25.4 +144 +1.0 +146 +1.0 +147 +0.09 +148 +0.0 +170 +0 +171 +2 +172 +0 +174 +0 +175 +0 +176 +0 +177 +0 +178 +0 +179 +0 +271 +4 +272 +4 +273 +2 +274 +2 +275 +0 +276 +0 +277 +2 +278 +46 +279 +0 +280 +0 +281 +0 +282 +0 +283 +1 +284 +0 +285 +0 +286 +0 +289 +3 +290 +0 +294 +0 +340 +11 +173 +0 +345 +14 +346 +14 +347 +14 +371 +-2 +372 +-2 +0 +ENDTAB +0 +TABLE +2 +VIEW +5 +6 +330 +0 +100 +AcDbSymbolTable +70 +0 +0 +ENDTAB +0 +TABLE +2 +UCS +5 +7 +330 +0 +100 +AcDbSymbolTable +70 +0 +0 +ENDTAB +0 +TABLE +2 +BLOCK_RECORD +5 +1 +330 +0 +100 +AcDbSymbolTable +70 +3 +0 +BLOCK_RECORD +5 +1F +330 +1 +100 +AcDbSymbolTableRecord +100 +AcDbBlockTableRecord +2 +*Model_Space +340 +22 +0 +BLOCK_RECORD +5 +1B +330 +1 +100 +AcDbSymbolTableRecord +100 +AcDbBlockTableRecord +2 +*Paper_Space +340 +1E +0 +BLOCK_RECORD +5 +23 +330 +1 +100 +AcDbSymbolTableRecord +100 +AcDbBlockTableRecord +2 +*Paper_Space0 +340 +26 +0 +ENDTAB +0 +ENDSEC +0 +SECTION +2 +BLOCKS +0 +BLOCK +5 +20 +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +100 +AcDbBlockBegin +2 +*Model_Space +70 +0 +10 +0.0 +20 +0.0 +30 +0.0 +3 +*Model_Space +0 +ENDBLK +5 +21 +330 +1F +100 +AcDbEntity +8 +0 +100 +AcDbBlockEnd +0 +BLOCK +5 +1C +330 +1B +100 +AcDbEntity +67 +1 +8 +0 +100 +AcDbBlockBegin +2 +*Paper_Space +70 +0 +10 +0.0 +20 +0.0 +30 +0.0 +3 +*Paper_Space +0 +ENDBLK +5 +1D +330 +1B +100 +AcDbEntity +8 +0 +100 +AcDbBlockEnd +0 +BLOCK +5 +24 +330 +23 +100 +AcDbEntity +67 +1 +8 +0 +100 +AcDbBlockBegin +2 +*Paper_Space0 +70 +0 +10 +0.0 +20 +0.0 +30 +0.0 +3 +*Paper_Space0 +0 +ENDBLK +5 +25 +330 +23 +100 +AcDbEntity +8 +0 +100 +AcDbBlockEnd +0 +ENDSEC +0 +SECTION +2 +ENTITIES +0 +LINE +5 +74 +330 +1F +100 +AcDbEntity +67 +0 +8 +BEND +62 +256 +6 +CENTERX2 +370 +-1 +48 +1.0 +60 +0 +100 +AcDbLine +10 +-33.9887805752 +20 +-12.2143508307 +30 +0.0 +11 +33.9887805752 +21 +-12.2143508307 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +75 +330 +1F +100 +AcDbEntity +67 +0 +8 +BEND +62 +256 +6 +CENTERX2 +370 +-1 +48 +1.0 +60 +0 +100 +AcDbLine +10 +34.0581008307 +20 +-12.1450305752 +30 +0.0 +11 +34.0581008307 +21 +12.1450305752 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +76 +330 +1F +100 +AcDbEntity +67 +0 +8 +BEND +62 +256 +6 +CENTERX2 +370 +-1 +48 +1.0 +60 +0 +100 +AcDbLine +10 +-34.0581008307 +20 +12.1450305752 +30 +0.0 +11 +-34.0581008307 +21 +-0.82085 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +77 +330 +1F +100 +AcDbEntity +67 +0 +8 +BEND +62 +256 +6 +CENTERX2 +370 +-1 +48 +1.0 +60 +0 +100 +AcDbLine +10 +33.9887805752 +20 +12.2143508307 +30 +0.0 +11 +-33.9887805752 +21 +12.2143508307 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +78 +330 +1F +100 +AcDbEntity +67 +0 +8 +BEND +62 +256 +6 +CENTERX2 +370 +-1 +48 +1.0 +60 +0 +100 +AcDbLine +10 +-34.0581008307 +20 +-8.69585 +30 +0.0 +11 +-34.0581008307 +21 +-12.1450305752 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +79 +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +-34.1760016614 +20 +-12.1936111503 +30 +0.0 +11 +-35.4912016614 +21 +-12.1936111503 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +7A +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +-35.4912016614 +20 +-12.1936111503 +30 +0.0 +11 +-35.4912016614 +21 +-8.69585 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +7B +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +-35.4912016614 +20 +-8.69585 +30 +0.0 +11 +-33.9402 +21 +-8.69585 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +7C +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +-33.9402 +20 +-8.69585 +30 +0.0 +11 +-33.9402 +21 +-0.82085 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +7D +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +-33.9402 +20 +-0.82085 +30 +0.0 +11 +-35.4912016614 +21 +-0.82085 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +7E +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +-35.4912016614 +20 +-0.82085 +30 +0.0 +11 +-35.4912016614 +21 +12.1936111503 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +7F +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +-34.1760016614 +20 +12.1936111503 +30 +0.0 +11 +-35.4912016614 +21 +12.1936111503 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +80 +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +-34.1760016614 +20 +12.1936111503 +30 +0.0 +11 +-33.9402 +21 +12.09645 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +81 +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +-33.9402 +20 +12.09645 +30 +0.0 +11 +-34.0373611503 +21 +12.3322516614 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +82 +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +-34.0373611503 +20 +12.3322516614 +30 +0.0 +11 +-34.0373611503 +21 +13.6474516614 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +83 +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +-34.0373611503 +20 +13.6474516614 +30 +0.0 +11 +34.0373611503 +21 +13.6474516614 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +84 +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +34.0373611503 +20 +12.3322516614 +30 +0.0 +11 +34.0373611503 +21 +13.6474516614 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +85 +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +33.9402 +20 +12.09645 +30 +0.0 +11 +34.1760016614 +21 +12.1936111503 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +86 +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +34.1760016614 +20 +12.1936111503 +30 +0.0 +11 +35.4912016614 +21 +12.1936111503 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +87 +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +35.4912016614 +20 +12.1936111503 +30 +0.0 +11 +35.4912016614 +21 +-12.1936111503 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +88 +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +34.1760016614 +20 +-12.1936111503 +30 +0.0 +11 +35.4912016614 +21 +-12.1936111503 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +89 +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +34.1760016614 +20 +-12.1936111503 +30 +0.0 +11 +33.9402 +21 +-12.09645 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +8A +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +33.9402 +20 +-12.09645 +30 +0.0 +11 +34.0373611503 +21 +-12.3322516614 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +8B +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +34.0373611503 +20 +-12.3322516614 +30 +0.0 +11 +34.0373611503 +21 +-13.6474516614 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +8C +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +34.0373611503 +20 +-13.6474516614 +30 +0.0 +11 +-34.0373611503 +21 +-13.6474516614 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +8D +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +-34.0373611503 +20 +-12.3322516614 +30 +0.0 +11 +-34.0373611503 +21 +-13.6474516614 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +8E +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +-34.0373611503 +20 +-12.3322516614 +30 +0.0 +11 +-33.9402 +21 +-12.09645 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +8F +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +-33.9402 +20 +-12.09645 +30 +0.0 +11 +-34.1760016614 +21 +-12.1936111503 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +90 +330 +1F +100 +AcDbEntity +67 +0 +8 +0 +62 +7 +6 +Continuous +370 +25 +48 +1.0 +60 +0 +100 +AcDbLine +10 +34.0373611503 +20 +12.3322516614 +30 +0.0 +11 +33.9402 +21 +12.09645 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +MTEXT +5 +92 +330 +1F +100 +AcDbEntity +67 +0 +8 +BEND +62 +7 +6 +Continuous +370 +0 +48 +1.0 +60 +0 +100 +AcDbMText +10 +-0.0162615485 +20 +-12.0560265573 +30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +1 +UP 90\U+00B0 R 0.125 +40 +0.125 +41 +0.0 +44 +1.0 +11 +1.0 +21 +0.0 +31 +0.0 +71 +2 +72 +1 +73 +1 +7 +SLDTEXTSTYLE0 +0 +MTEXT +5 +93 +330 +1F +100 +AcDbEntity +67 +0 +8 +BEND +62 +7 +6 +Continuous +370 +0 +48 +1.0 +60 +0 +100 +AcDbMText +10 +33.8997765573 +20 +-0.0162615485 +30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +1 +UP 90\U+00B0 R 0.125 +40 +0.125 +41 +0.0 +44 +1.0 +11 +-0.0000000000000035 +21 +1.0 +31 +0.0 +71 +2 +72 +1 +73 +1 +7 +SLDTEXTSTYLE0 +0 +MTEXT +5 +94 +330 +1F +100 +AcDbEntity +67 +0 +8 +BEND +62 +7 +6 +Continuous +370 +0 +48 +1.0 +60 +0 +100 +AcDbMText +10 +-34.2208536844 +20 +5.6458287391 +30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +1 +UP 90\U+00B0 R 0.125 +40 +0.125 +41 +0.0 +44 +1.0 +11 +-0.0000000000000035 +21 +1.0 +31 +0.0 +71 +2 +72 +1 +73 +1 +7 +SLDTEXTSTYLE0 +0 +MTEXT +5 +95 +330 +1F +100 +AcDbEntity +67 +0 +8 +BEND +62 +7 +6 +Continuous +370 +0 +48 +1.0 +60 +0 +100 +AcDbMText +10 +-0.0162615485 +20 +12.3771036844 +30 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +1 +UP 90\U+00B0 R 0.125 +40 +0.125 +41 +0.0 +44 +1.0 +11 +1.0 +21 +0.0 +31 +0.0 +71 +2 +72 +1 +73 +1 +7 +SLDTEXTSTYLE0 +0 +LINE +5 +A9 +330 +1F +100 +AcDbEntity +67 +0 +8 +ETCH +62 +256 +6 +ByLayer +370 +-1 +48 +1.0 +60 +0 +100 +AcDbLine +10 +-33.9887805752 +20 +-12.2143508307 +30 +0.0 +11 +-32.9887805752 +21 +-12.2143508307 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +AB +330 +1F +100 +AcDbEntity +67 +0 +8 +ETCH +62 +256 +6 +ByLayer +370 +-1 +48 +1.0 +60 +0 +100 +AcDbLine +10 +33.9887805752 +20 +-12.2143508307 +30 +0.0 +11 +32.9887805752 +21 +-12.2143508307 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +AC +330 +1F +100 +AcDbEntity +67 +0 +8 +ETCH +62 +256 +6 +ByLayer +370 +-1 +48 +1.0 +60 +0 +100 +AcDbLine +10 +34.0581008307 +20 +-12.1450305752 +30 +0.0 +11 +34.0581008307 +21 +-11.1450305752 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +AD +330 +1F +100 +AcDbEntity +67 +0 +8 +ETCH +62 +256 +6 +ByLayer +370 +-1 +48 +1.0 +60 +0 +100 +AcDbLine +10 +34.0581008307 +20 +12.1450305752 +30 +0.0 +11 +34.0581008307 +21 +11.1450305752 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +AE +330 +1F +100 +AcDbEntity +67 +0 +8 +ETCH +62 +256 +6 +ByLayer +370 +-1 +48 +1.0 +60 +0 +100 +AcDbLine +10 +-34.0581008307 +20 +-0.82085 +30 +0.0 +11 +-34.0581008307 +21 +0.17915 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +AF +330 +1F +100 +AcDbEntity +67 +0 +8 +ETCH +62 +256 +6 +ByLayer +370 +-1 +48 +1.0 +60 +0 +100 +AcDbLine +10 +-34.0581008307 +20 +12.1450305752 +30 +0.0 +11 +-34.0581008307 +21 +11.1450305752 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +B0 +330 +1F +100 +AcDbEntity +67 +0 +8 +ETCH +62 +256 +6 +ByLayer +370 +-1 +48 +1.0 +60 +0 +100 +AcDbLine +10 +33.9887805752 +20 +12.2143508307 +30 +0.0 +11 +32.9887805752 +21 +12.2143508307 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +B1 +330 +1F +100 +AcDbEntity +67 +0 +8 +ETCH +62 +256 +6 +ByLayer +370 +-1 +48 +1.0 +60 +0 +100 +AcDbLine +10 +-33.9887805752 +20 +12.2143508307 +30 +0.0 +11 +-32.9887805752 +21 +12.2143508307 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +B2 +330 +1F +100 +AcDbEntity +67 +0 +8 +ETCH +62 +256 +6 +ByLayer +370 +-1 +48 +1.0 +60 +0 +100 +AcDbLine +10 +-34.0581008307 +20 +-12.1450305752 +30 +0.0 +11 +-34.0581008307 +21 +-11.1450305752 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +LINE +5 +B3 +330 +1F +100 +AcDbEntity +67 +0 +8 +ETCH +62 +256 +6 +ByLayer +370 +-1 +48 +1.0 +60 +0 +100 +AcDbLine +10 +-34.0581008307 +20 +-8.69585 +30 +0.0 +11 +-34.0581008307 +21 +-9.69585 +31 +0.0 +39 +0.0 +210 +0.0 +220 +0.0 +230 +1.0 +0 +ENDSEC +0 +SECTION +2 +OBJECTS +0 +DICTIONARY +5 +B7 +330 +0 +100 +AcDbDictionary +280 +0 +281 +1 +3 +ACAD_GROUP +350 +B8 +3 +ACAD_LAYOUT +350 +B9 +3 +ACAD_MLINESTYLE +350 +BD +0 +DICTIONARY +5 +B8 +330 +B7 +100 +AcDbDictionary +280 +0 +281 +1 +0 +DICTIONARY +5 +B9 +330 +B7 +100 +AcDbDictionary +280 +0 +281 +1 +3 +Layout1 +350 +1E +3 +Layout2 +350 +26 +3 +Model +350 +22 +0 +DICTIONARY +5 +BD +330 +B7 +100 +AcDbDictionary +280 +0 +281 +1 +3 +Standard +350 +18 +0 +LAYOUT +5 +1E +330 +B9 +100 +AcDbPlotSettings +1 + +2 +none_device +4 + +6 + +40 +0.0 +41 +0.0 +42 +0.0 +43 +0.0 +44 +0.0 +45 +0.0 +46 +0.0 +47 +0.0 +48 +0.0 +49 +0.0 +140 +0.0 +141 +0.0 +142 +1.0 +143 +1.0 +70 +688 +72 +0 +73 +0 +74 +5 +7 + +75 +16 +76 +0 +77 +2 +78 +300 +147 +1.0 +148 +0.0 +149 +0.0 +100 +AcDbLayout +1 +Layout1 +70 +1 +71 +1 +10 +0.0 +20 +-7.5 +11 +12.0 +21 +9.0 +12 +0.0 +22 +0.0 +32 +0.0 +14 +100000000000000000000.0 +24 +100000000000000000000.0 +34 +100000000000000000000.0 +15 +-100000000000000000000.0 +25 +-100000000000000000000.0 +35 +-100000000000000000000.0 +146 +0.0 +13 +0.0 +23 +0.0 +33 +0.0 +16 +1.0 +26 +0.0 +36 +0.0 +17 +0.0 +27 +1.0 +37 +0.0 +76 +0 +330 +1B +0 +LAYOUT +5 +26 +330 +B9 +100 +AcDbPlotSettings +1 + +2 +none_device +4 + +6 + +40 +0.0 +41 +0.0 +42 +0.0 +43 +0.0 +44 +0.0 +45 +0.0 +46 +0.0 +47 +0.0 +48 +0.0 +49 +0.0 +140 +0.0 +141 +0.0 +142 +1.0 +143 +1.0 +70 +688 +72 +0 +73 +0 +74 +5 +7 + +75 +16 +76 +0 +77 +2 +78 +300 +147 +1.0 +148 +0.0 +149 +0.0 +100 +AcDbLayout +1 +Layout2 +70 +1 +71 +2 +10 +0.0 +20 +-7.5 +11 +0.0 +21 +0.0 +12 +0.0 +22 +0.0 +32 +0.0 +14 +0.0 +24 +0.0 +34 +0.0 +15 +0.0 +25 +0.0 +35 +0.0 +146 +0.0 +13 +0.0 +23 +0.0 +33 +0.0 +16 +1.0 +26 +0.0 +36 +0.0 +17 +0.0 +27 +1.0 +37 +0.0 +76 +0 +330 +23 +0 +LAYOUT +5 +22 +330 +B9 +100 +AcDbPlotSettings +1 + +2 +none_device +4 +Letter_(8.50_x_11.00_Inches) +6 + +40 +6.35 +41 +6.35 +42 +6.35000508 +43 +6.35000508 +44 +215.9 +45 +279.4 +46 +0.0 +47 +0.0 +48 +0.0 +49 +0.0 +140 +0.0 +141 +0.0 +142 +1.0 +143 +1.0 +70 +1712 +72 +0 +73 +0 +74 +0 +7 + +75 +0 +76 +0 +77 +2 +78 +300 +147 +1.0 +148 +0.0 +149 +0.0 +100 +AcDbLayout +1 +Model +70 +1 +71 +3 +10 +0.0 +20 +-7.5 +11 +17.0 +21 +11.0 +12 +0.0 +22 +0.0 +32 +0.0 +14 +0.0 +24 +0.0 +34 +0.0 +15 +17.0 +25 +11.0 +35 +0.0 +146 +0.0 +13 +0.0 +23 +0.0 +33 +0.0 +16 +1.0 +26 +0.0 +36 +0.0 +17 +0.0 +27 +1.0 +37 +0.0 +76 +0 +330 +1F +0 +MLINESTYLE +5 +18 +330 +BD +100 +AcDbMlineStyle +2 +Standard +70 +0 +3 + +62 +256 +51 +90.0 +52 +90.0 +71 +2 +49 +0.5 +62 +256 +6 +ByLayer +49 +-0.5 +62 +256 +6 +ByLayer +0 +ENDSEC +0 +EOF diff --git a/OpenNest.Tests/GeometrySimplifierTests.cs b/OpenNest.Tests/GeometrySimplifierTests.cs index 6b0b061..2b2c4f1 100644 --- a/OpenNest.Tests/GeometrySimplifierTests.cs +++ b/OpenNest.Tests/GeometrySimplifierTests.cs @@ -77,9 +77,10 @@ public class GeometrySimplifierTests } [Fact] - public void Analyze_MixedEntitiesWithArc_OnlyAnalyzesLines() + public void Analyze_MixedEntitiesWithArc_FindsSeparateCandidates() { - // Line, Line, Line, Arc, Line, Line, Line — should find candidates only in line runs + // Lines on one curve, then an arc at a different center, then lines on another curve + // The arc is included in the run but can't merge with lines on different curves var shape = new Shape(); // First run: 5 lines on a curve var arc1 = new Arc(new Vector(0, 0), 10, 0, System.Math.PI / 2, false); diff --git a/OpenNest/Controls/EntityView.cs b/OpenNest/Controls/EntityView.cs index d052ada..9932dc2 100644 --- a/OpenNest/Controls/EntityView.cs +++ b/OpenNest/Controls/EntityView.cs @@ -25,6 +25,9 @@ namespace OpenNest.Controls } public Arc SimplifierPreview { get; set; } + public List SimplifierToleranceLeft { get; set; } + public List SimplifierToleranceRight { get; set; } + public List OriginalEntities { get; set; } private readonly Pen gridPen = new Pen(Color.FromArgb(70, 70, 70)); private readonly Dictionary penCache = new Dictionary(); @@ -79,6 +82,17 @@ namespace OpenNest.Controls e.Graphics.TranslateTransform(origin.X, origin.Y); + // Draw original geometry overlay (faded, behind current) + if (OriginalEntities != null) + { + using var origPen = new Pen(Color.FromArgb(50, 255, 140, 40)); + foreach (var entity in OriginalEntities) + { + if (!IsEtchLayer(entity.Layer)) + DrawEntity(e.Graphics, entity, origPen); + } + } + foreach (var entity in Entities) { if (IsEtchLayer(entity.Layer)) continue; @@ -102,6 +116,25 @@ namespace OpenNest.Controls if (SimplifierPreview != null) { + // Draw tolerance zone (offset lines each side of original geometry) + if (SimplifierToleranceLeft != null) + { + using var zonePen = new Pen(Color.FromArgb(40, 100, 200, 100)); + foreach (var entity in SimplifierToleranceLeft) + DrawEntity(e.Graphics, entity, zonePen); + foreach (var entity in SimplifierToleranceRight) + DrawEntity(e.Graphics, entity, zonePen); + } + + // Draw old geometry (highlighted lines) in orange dashed + if (simplifierHighlightSet != null) + { + using var oldPen = new Pen(Color.FromArgb(180, 255, 160, 50), 1f / ViewScale) { DashPattern = new float[] { 6, 3 } }; + foreach (var entity in simplifierHighlightSet) + DrawEntity(e.Graphics, entity, oldPen); + } + + // Draw the new arc in bright green using var previewPen = new Pen(Color.FromArgb(0, 200, 80), 2f / ViewScale); DrawArc(e.Graphics, SimplifierPreview, previewPen); } @@ -260,20 +293,26 @@ namespace OpenNest.Controls { DashPattern = new float[] { 6, 4 } }; + using var noteFont = new Font("Segoe UI", 9f); + using var noteBrush = new SolidBrush(Color.FromArgb(220, 255, 255, 200)); + using var selectedNoteBrush = new SolidBrush(Color.FromArgb(220, 255, 180, 100)); for (var i = 0; i < Bends.Count; i++) { var bend = Bends[i]; var pt1 = PointWorldToGraph(bend.StartPoint); var pt2 = PointWorldToGraph(bend.EndPoint); + var isSelected = i == SelectedBendIndex; - if (i == SelectedBendIndex) - { + if (isSelected) g.DrawLine(glowPen, pt1, pt2); - } else - { g.DrawLine(bendPen, pt1, pt2); + + if (!string.IsNullOrEmpty(bend.NoteText)) + { + var mid = new PointF((pt1.X + pt2.X) / 2f, (pt1.Y + pt2.Y) / 2f); + g.DrawString(bend.NoteText, noteFont, isSelected ? selectedNoteBrush : noteBrush, mid.X + 4, mid.Y + 4); } } } @@ -424,6 +463,8 @@ namespace OpenNest.Controls { SimplifierHighlight = null; SimplifierPreview = null; + SimplifierToleranceLeft = null; + SimplifierToleranceRight = null; Invalidate(); } diff --git a/OpenNest/Controls/FileListControl.cs b/OpenNest/Controls/FileListControl.cs index 6a35270..8d8aa08 100644 --- a/OpenNest/Controls/FileListControl.cs +++ b/OpenNest/Controls/FileListControl.cs @@ -17,6 +17,7 @@ namespace OpenNest.Controls public int Quantity { get; set; } = 1; public string Path { get; set; } public List Entities { get; set; } = new(); + public List OriginalEntities { get; set; } public List Bends { get; set; } = new(); public Box Bounds { get; set; } public int EntityCount { get; set; } diff --git a/OpenNest/Forms/CadConverterForm.Designer.cs b/OpenNest/Forms/CadConverterForm.Designer.cs index b000691..f801128 100644 --- a/OpenNest/Forms/CadConverterForm.Designer.cs +++ b/OpenNest/Forms/CadConverterForm.Designer.cs @@ -29,6 +29,7 @@ namespace OpenNest.Forms lblEntityCount = new System.Windows.Forms.Label(); btnSplit = new System.Windows.Forms.Button(); btnSimplify = new System.Windows.Forms.Button(); + chkShowOriginal = new System.Windows.Forms.CheckBox(); lblDetect = new System.Windows.Forms.Label(); cboBendDetector = new System.Windows.Forms.ComboBox(); bottomPanel1 = new OpenNest.Controls.BottomPanel(); @@ -129,6 +130,7 @@ namespace OpenNest.Forms detailBar.Controls.Add(lblEntityCount); detailBar.Controls.Add(btnSplit); detailBar.Controls.Add(btnSimplify); + detailBar.Controls.Add(chkShowOriginal); detailBar.Controls.Add(lblDetect); detailBar.Controls.Add(cboBendDetector); detailBar.Dock = System.Windows.Forms.DockStyle.Bottom; @@ -225,6 +227,14 @@ namespace OpenNest.Forms btnSimplify.Margin = new System.Windows.Forms.Padding(4, 0, 0, 0); btnSimplify.Click += new System.EventHandler(this.OnSimplifyClick); // + // chkShowOriginal + // + chkShowOriginal.AutoSize = true; + chkShowOriginal.Font = new System.Drawing.Font("Segoe UI", 9F); + chkShowOriginal.Text = "Original"; + chkShowOriginal.Margin = new System.Windows.Forms.Padding(6, 3, 0, 0); + chkShowOriginal.CheckedChanged += new System.EventHandler(this.OnShowOriginalChanged); + // // lblDetect // lblDetect.AutoSize = true; @@ -324,6 +334,7 @@ namespace OpenNest.Forms private System.Windows.Forms.TextBox txtCustomer; private System.Windows.Forms.Button btnSplit; private System.Windows.Forms.Button btnSimplify; + private System.Windows.Forms.CheckBox chkShowOriginal; private System.Windows.Forms.ComboBox cboBendDetector; private System.Windows.Forms.Label lblQty; private System.Windows.Forms.Label lblCust; diff --git a/OpenNest/Forms/CadConverterForm.cs b/OpenNest/Forms/CadConverterForm.cs index b477da0..3d3a7c8 100644 --- a/OpenNest/Forms/CadConverterForm.cs +++ b/OpenNest/Forms/CadConverterForm.cs @@ -141,6 +141,7 @@ namespace OpenNest.Forms entityView1.IsPickingBendLine = false; filterPanel.SetPickMode(false); } + entityView1.OriginalEntities = chkShowOriginal.Checked ? item.OriginalEntities : null; entityView1.Entities.Clear(); entityView1.Entities.AddRange(item.Entities); entityView1.Bends = item.Bends ?? new List(); @@ -384,7 +385,13 @@ namespace OpenNest.Forms if (entityView1.Entities == null || entityView1.Entities.Count == 0) return; - var shapes = ShapeBuilder.GetShapes(entityView1.Entities); + // Always simplify from original geometry to prevent tolerance creep + var item = CurrentItem; + if (item != null && item.OriginalEntities == null) + item.OriginalEntities = new List(item.Entities); + + var sourceEntities = item?.OriginalEntities ?? entityView1.Entities; + var shapes = ShapeBuilder.GetShapes(sourceEntities); if (shapes.Count == 0) return; @@ -422,6 +429,13 @@ namespace OpenNest.Forms lblEntityCount.Text = $"{entities.Count} entities"; } + private void OnShowOriginalChanged(object sender, EventArgs e) + { + var item = CurrentItem; + entityView1.OriginalEntities = chkShowOriginal.Checked ? item?.OriginalEntities : null; + entityView1.Invalidate(); + } + #endregion #region Output diff --git a/OpenNest/Forms/SimplifierViewerForm.cs b/OpenNest/Forms/SimplifierViewerForm.cs index ff91db5..1853ec0 100644 --- a/OpenNest/Forms/SimplifierViewerForm.cs +++ b/OpenNest/Forms/SimplifierViewerForm.cs @@ -54,10 +54,10 @@ public class SimplifierViewerForm : Form numTolerance = new System.Windows.Forms.NumericUpDown { Minimum = 0.001m, - Maximum = 1.000m, + Maximum = 5.000m, DecimalPlaces = 3, - Increment = 0.001m, - Value = 0.005m, + Increment = 0.05m, + Value = 0.500m, Width = 70, }; numTolerance.ValueChanged += OnToleranceChanged; @@ -100,7 +100,7 @@ public class SimplifierViewerForm : Form Controls.Add(bottomPanel); } - public void LoadShapes(List shapes, EntityView view, double tolerance = 0.005) + public void LoadShapes(List shapes, EntityView view, double tolerance = 0.5) { this.shapes = shapes; this.entityView = view; @@ -167,7 +167,28 @@ public class SimplifierViewerForm : Form entityView.SimplifierHighlight = highlightEntities; entityView.SimplifierPreview = candidate.FittedArc; - entityView.ZoomToArea(candidate.BoundingBox); + + // Build tolerance zone by offsetting each original line both directions + var tol = simplifier.Tolerance; + var leftEntities = new List(); + var rightEntities = new List(); + foreach (var entity in highlightEntities) + { + var left = entity.OffsetEntity(tol, OffsetSide.Left); + var right = entity.OffsetEntity(tol, OffsetSide.Right); + if (left != null) leftEntities.Add(left); + if (right != null) rightEntities.Add(right); + } + entityView.SimplifierToleranceLeft = leftEntities; + entityView.SimplifierToleranceRight = rightEntities; + + // Zoom with padding for the tolerance zone + var padded = new Box( + candidate.BoundingBox.X - tol * 2, + candidate.BoundingBox.Y - tol * 2, + candidate.BoundingBox.Width + tol * 4, + candidate.BoundingBox.Length + tol * 4); + entityView.ZoomToArea(padded); } private void OnItemChecked(object sender, ItemCheckedEventArgs e) diff --git a/README.md b/README.md index 860ecb2..8606608 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # OpenNest -A Windows desktop app for CNC nesting — imports DXF drawings, arranges parts on plates and exports layouts as DXF or G-code for cutting. +A Windows desktop application for CNC nesting — imports DXF drawings, arranges parts on material plates, and exports layouts as DXF or G-code for cutting. ![OpenNest - parts nested on a 36x36 plate](screenshots/screenshot-nest-1.png) @@ -8,15 +8,21 @@ OpenNest takes your part drawings, lets you define your sheet (plate) sizes, and ## Features -- **DXF Import/Export** — Load part drawings from DXF files and export completed nest layouts -- **Multiple Fill Strategies** — Grid-based linear fill and rectangle bin packing -- **Part Rotation** — Automatically tries different rotation angles to find better fits -- **Gravity Compaction** — After placing parts, pushes them together to close gaps +- **DXF/DWG Import & Export** — Load part drawings from DXF or DWG files and export completed nest layouts as DXF +- **Multiple Fill Strategies** — Grid-based linear fill, interlocking pair fill, rectangle bin packing, extents-based tiling, and more via a pluggable strategy system +- **Best-Fit Pair Nesting** — NFP-based (No Fit Polygon) pair evaluation finds tight-fitting interlocking orientations between parts +- **GPU Acceleration** — Optional ILGPU-based bitmap overlap detection for faster best-fit evaluation +- **Part Rotation** — Automatically tries different rotation angles to find better fits, with optional ML-based angle prediction (ONNX) +- **Gravity Compaction** — After placing parts, pushes them together using polygon-based directional distance to close gaps between irregular shapes - **Multi-Plate Support** — Work with multiple plates of different sizes and materials in a single nest -- **G-code Output** — Post-process nested layouts to G-code for CNC cutting machines -- **Built-in Shapes** — Create basic geometric parts (circles, rectangles, triangles, etc.) without needing a DXF file -- **Interactive Editing** — Zoom, pan, select, clone, and manually arrange parts on the plate view -- **Lead-in/Lead-out & Tabs** — Cutting parameters like approach paths and holding tabs (engine support, UI coming soon) +- **Sheet Cut-Offs** — Automatically cut the plate to size after nesting, with geometry-aware clearance that avoids placed parts +- **Drawing Splitting** — Split oversized parts into pieces that fit your plate, with straight cuts, weld-gap tabs, or interlocking spike-groove joints +- **Bend Line Detection** — Import bend lines from DXF files with pluggable detectors (SolidWorks flat pattern support built in) +- **Lead-In/Lead-Out & Tabs** — Configurable approach paths, exit paths, and holding tabs for CNC cutting +- **G-code Output** — Post-process nested layouts to G-code via plugin post-processors +- **Built-in Shapes** — 12 parametric shapes (circles, rectangles, L-shapes, T-shapes, flanges, etc.) for quick testing or simple parts +- **Interactive Editing** — Zoom, pan, select, clone, push, and manually arrange parts on the plate view +- **Pluggable Engine Architecture** — Swap between built-in nesting engines or load custom engines from plugin DLLs ![OpenNest - 44 parts nested on a 60x120 plate](screenshots/screenshot-nest-2.png) @@ -46,12 +52,11 @@ Or open `OpenNest.sln` in Visual Studio and run the `OpenNest` project. ### Quick Walkthrough 1. **Create a nest** — File > New Nest -2. **Add drawings** — Import DXF files or create built-in shapes (rectangles, circles, etc.). DXF drawings should be 1:1 scale CAD files. -3. **Set up a plate** — Define the plate size and material -4. **Fill the plate** — The nesting engine will automatically arrange parts on the plate -5. **Export** — Save as a `.nest` file, export to DXF, or post-process to G-code - - +2. **Add drawings** — Import DXF files via the CAD Converter (handles bend detection, layer filtering, and color/linetype exclusion) or create built-in shapes +3. **Set up a plate** — Define the plate size, material, quadrant, and spacing +4. **Fill the plate** — The nesting engine arranges parts automatically using the active fill strategy +5. **Add cut-offs** — Optionally add horizontal/vertical cut-off lines to trim unused plate material +6. **Export** — Save as a `.nest` file, export to DXF, or post-process to G-code ## Command-Line Interface @@ -95,6 +100,7 @@ dotnet run --project OpenNest.Console/OpenNest.Console.csproj -- project.zip ext | `--keep-parts` | Keep existing parts instead of clearing before fill | | `--check-overlaps` | Run overlap detection after fill (exits with code 1 if found) | | `--engine ` | Select a registered nesting engine | +| `--post ` | Post-process the result with the named post-processor plugin | | `--no-save` | Skip saving the output file | | `--no-log` | Skip writing the debug log | @@ -102,26 +108,74 @@ dotnet run --project OpenNest.Console/OpenNest.Console.csproj -- project.zip ext ``` OpenNest.sln -├── OpenNest/ # WinForms desktop application (UI) -├── OpenNest.Core/ # Domain model, geometry, and CNC primitives -├── OpenNest.Engine/ # Nesting algorithms (fill, pack, compact) -├── OpenNest.IO/ # File I/O — DXF import/export, nest file format -├── OpenNest.Console/ # Command-line interface for batch nesting -├── OpenNest.Gpu/ # GPU-accelerated nesting evaluation -├── OpenNest.Training/ # ML training data collection -├── OpenNest.Mcp/ # MCP server for AI tool integration -└── OpenNest.Tests/ # Unit tests +├── OpenNest/ # WinForms desktop application (UI) +├── OpenNest.Core/ # Domain model, geometry, and CNC primitives +├── OpenNest.Engine/ # Nesting algorithms (fill, pack, compact, best-fit) +├── OpenNest.IO/ # File I/O — DXF import/export, nest file format +├── OpenNest.Console/ # Command-line interface for batch nesting +├── OpenNest.Api/ # Programmatic nesting API (NestRunner pipeline) +├── OpenNest.Gpu/ # GPU-accelerated pair evaluation (ILGPU) +├── OpenNest.Training/ # ML training data collection (SQLite + EF Core) +├── OpenNest.Mcp/ # MCP server for AI tool integration +├── OpenNest.Posts.Cincinnati/ # Cincinnati CL-707 laser post-processor plugin +└── OpenNest.Tests/ # Unit tests (xUnit) ``` -For most users, only these matter: - | Project | What it does | |---------|-------------| -| **OpenNest** | The app you run. WinForms UI with plate viewer, drawing list, and dialogs. | +| **OpenNest** | The app you run. WinForms MDI interface with plate viewer, drawing list, CAD converter, and dialogs. | | **OpenNest.Console** | Command-line interface for batch nesting, scripting, and automation. | -| **OpenNest.Core** | The building blocks — parts, plates, drawings, geometry, G-code representation. | -| **OpenNest.Engine** | The brains — algorithms that decide where parts go on a plate. | -| **OpenNest.IO** | Reads and writes files — DXF (via ACadSharp), G-code, and the `.nest` ZIP format. | +| **OpenNest.Core** | The building blocks — parts, plates, drawings, geometry, G-code representation, bend lines, cut-offs, and drawing splitting. | +| **OpenNest.Engine** | The brains — fill strategies (linear, pairs, rect best-fit, extents), NFP-based pair evaluation, gravity compaction, and a pluggable engine registry. | +| **OpenNest.IO** | Reads and writes files — DXF/DWG (via ACadSharp), G-code, and the `.nest` ZIP format. | +| **OpenNest.Api** | High-level API for running the full nesting pipeline programmatically (import, nest, export). | +| **OpenNest.Gpu** | GPU-accelerated bitmap overlap detection for best-fit pair evaluation using ILGPU. | +| **OpenNest.Posts.Cincinnati** | Post-processor plugin for Cincinnati CL-707/800/900/940/CLX laser cutting machines. Outputs Cincinnati-format G-code with material library, kerf compensation, and pierce logic. | +| **OpenNest.Mcp** | MCP (Model Context Protocol) server exposing nesting operations as tools for AI assistants. | +| **OpenNest.Tests** | 75+ test files covering core geometry, fill strategies, splitting, bending, post-processing, and the API. | + +## Nesting Engines + +OpenNest uses a pluggable engine architecture. The active engine can be selected at runtime. + +| Engine | Description | +|--------|-------------| +| **Default** | Multi-phase strategy: linear fill, pair fill, rect best-fit, then remainder. Balances density and speed. | +| **Vertical Remnant** | Optimizes for a clean vertical drop on the right side of the plate. | +| **Horizontal Remnant** | Optimizes for a clean horizontal drop on the top of the plate. | + +Custom engines can be built by subclassing `NestEngineBase` and registering via `NestEngineRegistry` or dropping a plugin DLL in the `Engines/` directory. + +### Fill Strategies + +Each engine composes from a set of fill strategies: + +| Strategy | Description | +|----------|-------------| +| **Linear** | Grid-based fill with geometry-aware copy distance and 4-config rotation/axis optimization | +| **Pairs** | NFP-based interlocking pair evaluation — finds tight-fitting orientations between two parts | +| **Rect Best-Fit** | Greedy rectangle bin-packing with horizontal and vertical orientation trials | +| **Extents** | Extents-based pair tiling for simple rectangular arrangements | + +## Drawing Splitting + +Oversized parts that don't fit on a single plate can be split into smaller pieces: + +- **Straight Split** — Clean cut with no joining features +- **Weld-Gap Tabs** — Rectangular tab spacers on one side for weld alignment +- **Spike-Groove** — Interlocking V-shaped spike and groove pairs for self-aligning joints + +The split system supports fit-to-plate (auto-calculates split lines) and split-by-count modes, with an interactive UI for adjusting split positions and feature parameters. + +## Post-Processors + +Post-processors convert nested layouts into machine-specific G-code. They are loaded as plugin DLLs from the `Posts/` directory at runtime. + +**Included:** + +- **Cincinnati** — Full post-processor for Cincinnati CL-707/800/900/940/CLX laser cutting machines with variable declarations, material library resolution, speed classification, kerf compensation, and optional part sub-programs (M98). + +Custom post-processors implement the `IPostProcessor` interface and are auto-discovered from DLLs in the `Posts/` directory. ## Keyboard Shortcuts @@ -131,6 +185,7 @@ For most users, only these matter: | `F` | Zoom to fit the plate view | | `Shift` + Mouse Wheel | Rotate parts when a drawing is selected | | `Shift` + Left Click | Push the selected group of parts to the bottom-left most point | +| Middle Mouse Click | Rotate selected parts 90 degrees | | `X` | Push selected parts left (negative X) | | `Shift+X` | Push selected parts right (positive X) | | `Y` | Push selected parts down (negative Y) | @@ -145,18 +200,26 @@ For most users, only these matter: | DXF (AutoCAD Drawing Exchange) | Yes | Yes | | DWG (AutoCAD Drawing) | Yes | No | | G-code | No | Yes (via post-processors) | +| `.nest` (ZIP-based project format) | Yes | Yes | + +## Nest File Format + +Nest files (`.nest`) are ZIP archives containing: + +- `nest.json` — JSON metadata: nest info, plate defaults, drawings (with bend data), and plates (with parts and cut-offs) +- `programs/program-N` — G-code text for each drawing's cut program +- `bestfits/bestfit-N` — Cached best-fit pair evaluation results (optional) ## Roadmap -- **NFP-based nesting** — No Fit Polygon algorithms and simulated annealing optimizer exist in the engine but aren't integrated into the UI or engine registry yet -- **Lead-in/Lead-out UI** — Engine support for lead-ins, lead-outs, and tabs is implemented; needs a UI for configuration -- **Sheet cut-offs** — Cut the sheet to size after nesting to reduce waste -- **Post-processors** — Plugin interface (`IPostProcessor`) is in place; need to ship built-in post-processors for common CNC controllers -- **Shape library UI** — Built-in shape generation code exists; needs a browsable library UI for quick access +- **NFP-based auto-nesting** — Simulated annealing optimizer and NFP placement exist in the engine but aren't exposed as a selectable engine yet +- **Geometry simplifier** — Replace consecutive small line segments with fitted arcs to reduce program size and improve nesting performance +- **Shape library UI** — 12 built-in parametric shapes exist in code; needs a browsable library UI for quick access +- **Additional post-processors** — Plugin interface is in place; more machine-specific post-processors planned ## Status -OpenNest is under active development. The core nesting workflows function, but there's plenty of room for improvement in packing efficiency, UI polish, and format support. Contributions and feedback are welcome. +OpenNest is under active development. The core nesting workflows function end-to-end — from DXF import through filling, splitting, cut-offs, and G-code post-processing. Contributions and feedback are welcome. ## License