using ACadSharp; using ACadSharp.IO; using OpenNest.Geometry; using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; namespace OpenNest.IO { public class DxfImporter { public int SplinePrecision { get; set; } public DxfImporter() { } private List GetGeometry(CadDocument doc) { var entities = new List(); var lines = new List(); var arcs = new List(); foreach (var entity in doc.Entities) { // Skip bend/etch entities — bends are converted to Bend objects // separately via bend detection, and etch marks are generated from // bends during DXF export. Neither should be treated as cut geometry. if (IsNonCutLayer(entity.Layer?.Name)) continue; switch (entity) { case ACadSharp.Entities.Line line: lines.Add(line.ToOpenNest()); break; case ACadSharp.Entities.Arc arc: arcs.Add(arc.ToOpenNest()); break; case ACadSharp.Entities.Circle circle: entities.Add(circle.ToOpenNest()); break; case ACadSharp.Entities.Spline spline: foreach (var e in spline.ToOpenNest(SplinePrecision)) { if (e is Line l) lines.Add(l); else if (e is Arc a) arcs.Add(a); } break; case ACadSharp.Entities.LwPolyline lwPolyline: lines.AddRange(lwPolyline.ToOpenNest()); break; case ACadSharp.Entities.Polyline polyline: lines.AddRange(polyline.ToOpenNest()); break; case ACadSharp.Entities.Ellipse ellipse: foreach (var e in ellipse.ToOpenNest()) { if (e is Line l) lines.Add(l); else if (e is Arc a) arcs.Add(a); } break; } } GeometryOptimizer.Optimize(lines); GeometryOptimizer.Optimize(arcs); entities.AddRange(lines); entities.AddRange(arcs); return entities; } /// /// Imports a DXF file, returning both converted entities and the raw CadDocument /// for bend detection. The CadDocument is NOT disposed — caller can use it for /// additional analysis (e.g., MText extraction for bend notes). /// public DxfImportResult Import(string path) { using var reader = new DxfReader(path); var doc = reader.Read(); var entities = GetGeometry(doc); return new DxfImportResult { Entities = entities, Document = doc }; } public bool GetGeometry(Stream stream, out List geometry) { var success = false; try { using (var reader = new DxfReader(stream)) { var doc = reader.Read(); geometry = GetGeometry(doc); success = true; } } catch (Exception ex) { Debug.WriteLine(ex.Message); geometry = new List(); } finally { if (stream != null) stream.Close(); } return success; } public bool GetGeometry(string path, out List geometry) { var success = false; try { using (var reader = new DxfReader(path)) { var doc = reader.Read(); geometry = GetGeometry(doc); success = true; } } catch (Exception ex) { Debug.WriteLine(ex.Message); geometry = new List(); } return success; } private static bool IsNonCutLayer(string layerName) { return string.Equals(layerName, "BEND", System.StringComparison.OrdinalIgnoreCase) || string.Equals(layerName, "ETCH", System.StringComparison.OrdinalIgnoreCase); } } }