diff --git a/OpenNest/IO/DxfExporter.cs b/OpenNest/IO/DxfExporter.cs index 55178bd..83de69d 100644 --- a/OpenNest/IO/DxfExporter.cs +++ b/OpenNest/IO/DxfExporter.cs @@ -1,23 +1,25 @@ -using System; +using System; using System.Diagnostics; using System.IO; -using netDxf; -using netDxf.Entities; -using netDxf.Tables; +using ACadSharp; +using ACadSharp.Entities; +using ACadSharp.IO; +using ACadSharp.Tables; +using CSMath; using OpenNest.CNC; using OpenNest.Math; namespace OpenNest.IO { - using Layer = netDxf.Tables.Layer; - using Line = netDxf.Entities.Line; + using AcadArc = ACadSharp.Entities.Arc; + using AcadCircle = ACadSharp.Entities.Circle; + using AcadLine = ACadSharp.Entities.Line; + using Layer = ACadSharp.Tables.Layer; public class DxfExporter { - private const double RadToDeg = 180.0 / System.Math.PI; - - private DxfDocument doc; - private Vector2 curpos; + private CadDocument doc; + private XYZ curpos; private Mode mode; private readonly Layer cutLayer; private readonly Layer rapidLayer; @@ -25,30 +27,33 @@ namespace OpenNest.IO public DxfExporter() { - doc = new DxfDocument(); + doc = new CadDocument(); cutLayer = new Layer("Cut"); - cutLayer.Color = AciColor.Red; + cutLayer.Color = new Color(1); rapidLayer = new Layer("Rapid"); - rapidLayer.Color = AciColor.Blue; - rapidLayer.Linetype = Linetype.Dashed; + rapidLayer.Color = new Color(5); plateLayer = new Layer("Plate"); - plateLayer.Color = AciColor.Cyan; + plateLayer.Color = new Color(4); } public void ExportProgram(Program program, Stream stream) { - doc = new DxfDocument(); + doc = new CadDocument(); + EnsureLayers(); AddProgram(program); - doc.Save(stream); + using (var writer = new DxfWriter(stream, doc, false)) + { + writer.Write(); + } } public bool ExportProgram(Program program, string path) { Stream stream = null; - bool success = false; + var success = false; try { @@ -71,26 +76,28 @@ namespace OpenNest.IO public void ExportPlate(Plate plate, Stream stream) { - doc = new DxfDocument(); + doc = new CadDocument(); + EnsureLayers(); AddPlateOutline(plate); foreach (var part in plate.Parts) { - var endpt = part.Location.ToNetDxf(); - var line = new netDxf.Entities.Line(curpos, endpt); - line.Layer = rapidLayer; - doc.Entities.Add(line); - curpos = part.Location.ToNetDxf(); + var endpt = part.Location.ToAcadXYZ(); + AddLine(curpos, endpt, rapidLayer); + curpos = part.Location.ToAcadXYZ(); AddProgram(part.Program); } - doc.Save(stream); + using (var writer = new DxfWriter(stream, doc, false)) + { + writer.Write(); + } } public bool ExportPlate(Plate plate, string path) { Stream stream = null; - bool success = false; + var success = false; try { @@ -111,75 +118,84 @@ namespace OpenNest.IO return success; } + private void EnsureLayers() + { + doc.Layers.Add(cutLayer); + doc.Layers.Add(rapidLayer); + doc.Layers.Add(plateLayer); + } + + private void AddLine(XYZ start, XYZ end, Layer layer) + { + var ln = new AcadLine(); + ln.StartPoint = start; + ln.EndPoint = end; + ln.Layer = layer; + doc.Entities.Add(ln); + } + private void AddPlateOutline(Plate plate) { - Vector2 pt1; - Vector2 pt2; - Vector2 pt3; - Vector2 pt4; + XYZ pt1; + XYZ pt2; + XYZ pt3; + XYZ pt4; switch (plate.Quadrant) { case 1: - pt1 = new Vector2(0, 0); - pt2 = new Vector2(0, plate.Size.Height); - pt3 = new Vector2(plate.Size.Width, plate.Size.Height); - pt4 = new Vector2(plate.Size.Width, 0); + pt1 = new XYZ(0, 0, 0); + pt2 = new XYZ(0, plate.Size.Height, 0); + pt3 = new XYZ(plate.Size.Width, plate.Size.Height, 0); + pt4 = new XYZ(plate.Size.Width, 0, 0); break; case 2: - pt1 = new Vector2(0, 0); - pt2 = new Vector2(0, plate.Size.Height); - pt3 = new Vector2(-plate.Size.Width, plate.Size.Height); - pt4 = new Vector2(-plate.Size.Width, 0); + pt1 = new XYZ(0, 0, 0); + pt2 = new XYZ(0, plate.Size.Height, 0); + pt3 = new XYZ(-plate.Size.Width, plate.Size.Height, 0); + pt4 = new XYZ(-plate.Size.Width, 0, 0); break; case 3: - pt1 = new Vector2(0, 0); - pt2 = new Vector2(0, -plate.Size.Height); - pt3 = new Vector2(-plate.Size.Width, -plate.Size.Height); - pt4 = new Vector2(-plate.Size.Width, 0); + pt1 = new XYZ(0, 0, 0); + pt2 = new XYZ(0, -plate.Size.Height, 0); + pt3 = new XYZ(-plate.Size.Width, -plate.Size.Height, 0); + pt4 = new XYZ(-plate.Size.Width, 0, 0); break; case 4: - pt1 = new Vector2(0, 0); - pt2 = new Vector2(0, -plate.Size.Height); - pt3 = new Vector2(plate.Size.Width, -plate.Size.Height); - pt4 = new Vector2(plate.Size.Width, 0); + pt1 = new XYZ(0, 0, 0); + pt2 = new XYZ(0, -plate.Size.Height, 0); + pt3 = new XYZ(plate.Size.Width, -plate.Size.Height, 0); + pt4 = new XYZ(plate.Size.Width, 0, 0); break; default: return; } - doc.Entities.Add(new Line(pt1, pt2) { Layer = plateLayer }); - doc.Entities.Add(new Line(pt2, pt3) { Layer = plateLayer }); - doc.Entities.Add(new Line(pt3, pt4) { Layer = plateLayer }); - doc.Entities.Add(new Line(pt4, pt1) { Layer = plateLayer }); + AddLine(pt1, pt2, plateLayer); + AddLine(pt2, pt3, plateLayer); + AddLine(pt3, pt4, plateLayer); + AddLine(pt4, pt1, plateLayer); - pt1.X += plate.EdgeSpacing.Left; - pt1.Y += plate.EdgeSpacing.Bottom; + var m1 = new XYZ(pt1.X + plate.EdgeSpacing.Left, pt1.Y + plate.EdgeSpacing.Bottom, 0); + var m2 = new XYZ(m1.X, pt2.Y - plate.EdgeSpacing.Top, 0); + var m3 = new XYZ(pt3.X - plate.EdgeSpacing.Right, m2.Y, 0); + var m4 = new XYZ(m3.X, m1.Y, 0); - pt2.X = pt1.X; - pt2.Y -= plate.EdgeSpacing.Top; - - pt3.X -= plate.EdgeSpacing.Right; - pt3.Y = pt2.Y; - - pt4.X = pt3.X; - pt4.Y = pt1.Y; - - doc.Entities.Add(new Line(pt1, pt2) { Layer = plateLayer, Linetype = Linetype.Dashed }); - doc.Entities.Add(new Line(pt2, pt3) { Layer = plateLayer, Linetype = Linetype.Dashed }); - doc.Entities.Add(new Line(pt3, pt4) { Layer = plateLayer, Linetype = Linetype.Dashed }); - doc.Entities.Add(new Line(pt4, pt1) { Layer = plateLayer, Linetype = Linetype.Dashed }); + AddLine(m1, m2, plateLayer); + AddLine(m2, m3, plateLayer); + AddLine(m3, m4, plateLayer); + AddLine(m4, m1, plateLayer); } private void AddProgram(Program program) { mode = program.Mode; - for (int i = 0; i < program.Length; ++i) + for (var i = 0; i < program.Length; ++i) { var code = program[i]; @@ -212,55 +228,45 @@ namespace OpenNest.IO private void AddLinearMove(LinearMove line) { - var pt = line.EndPoint.ToNetDxf(); + var pt = line.EndPoint.ToAcadXYZ(); if (mode == Mode.Incremental) - pt += curpos; + pt = new XYZ(pt.X + curpos.X, pt.Y + curpos.Y, 0); - var ln = new Line(curpos, pt); - ln.Layer = cutLayer; - doc.Entities.Add(ln); + AddLine(curpos, pt, cutLayer); curpos = pt; } private void AddRapidMove(RapidMove rapid) { - var pt = rapid.EndPoint.ToNetDxf(); + var pt = rapid.EndPoint.ToAcadXYZ(); if (mode == Mode.Incremental) - pt += curpos; + pt = new XYZ(pt.X + curpos.X, pt.Y + curpos.Y, 0); - var ln = new Line(curpos, pt); - ln.Layer = rapidLayer; - doc.Entities.Add(ln); + AddLine(curpos, pt, rapidLayer); curpos = pt; } private void AddArcMove(ArcMove arc) { - var center = arc.CenterPoint.ToNetDxf(); - var endpt = arc.EndPoint.ToNetDxf(); + var center = arc.CenterPoint.ToAcadXYZ(); + var endpt = arc.EndPoint.ToAcadXYZ(); if (mode == Mode.Incremental) { - endpt += curpos; - center += curpos; + endpt = new XYZ(endpt.X + curpos.X, endpt.Y + curpos.Y, 0); + center = new XYZ(center.X + curpos.X, center.Y + curpos.Y, 0); } - // start angle in radians var startAngle = System.Math.Atan2( curpos.Y - center.Y, curpos.X - center.X); - // end angle in radians var endAngle = System.Math.Atan2( endpt.Y - center.Y, endpt.X - center.X); - // convert the angles to degrees - startAngle = Angle.ToDegrees(startAngle); - endAngle = Angle.ToDegrees(endAngle); - if (arc.Rotation == OpenNest.RotationType.CW) Generic.Swap(ref startAngle, ref endAngle); @@ -271,13 +277,19 @@ namespace OpenNest.IO if (startAngle.IsEqualTo(endAngle)) { - var circle = new Circle(center, radius); + var circle = new AcadCircle(); + circle.Center = center; + circle.Radius = radius; circle.Layer = cutLayer; doc.Entities.Add(circle); } else { - var arc2 = new Arc(center, radius, startAngle, endAngle); + var arc2 = new AcadArc(); + arc2.Center = center; + arc2.Radius = radius; + arc2.StartAngle = startAngle; + arc2.EndAngle = endAngle; arc2.Layer = cutLayer; doc.Entities.Add(arc2); } diff --git a/OpenNest/IO/Extensions.cs b/OpenNest/IO/Extensions.cs index 36ff606..21e3cbd 100644 --- a/OpenNest/IO/Extensions.cs +++ b/OpenNest/IO/Extensions.cs @@ -139,7 +139,7 @@ namespace OpenNest.IO var lines = new List(); var center = new Vector(ellipse.Center.X, ellipse.Center.Y); - var majorAxis = new Vector(ellipse.EndPoint.X, ellipse.EndPoint.Y); + var majorAxis = new Vector(ellipse.MajorAxisEndPoint.X, ellipse.MajorAxisEndPoint.Y); var majorLength = System.Math.Sqrt(majorAxis.X * majorAxis.X + majorAxis.Y * majorAxis.Y); var minorLength = majorLength * ellipse.RadiusRatio; var rotation = System.Math.Atan2(majorAxis.Y, majorAxis.X);