refactor: rewrite DxfImporter for ACadSharp

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-07 13:26:33 -05:00
parent 3baa942f4e
commit d185adecfa

View File

@@ -1,9 +1,9 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using System.IO; using System.IO;
using System.Linq; using ACadSharp;
using netDxf; using ACadSharp.IO;
using OpenNest.Geometry; using OpenNest.Geometry;
namespace OpenNest.IO namespace OpenNest.IO
@@ -16,32 +16,45 @@ namespace OpenNest.IO
{ {
} }
private List<Entity> GetGeometry(DxfDocument doc) private List<Entity> GetGeometry(CadDocument doc)
{ {
var entities = new List<Entity>(); var entities = new List<Entity>();
var lines = new List<Line>(doc.Entities.Lines.Count()); var lines = new List<Line>();
var arcs = new List<Arc>(doc.Entities.Arcs.Count()); var arcs = new List<Arc>();
foreach (var spline in doc.Entities.Splines) foreach (var entity in doc.Entities)
lines.AddRange(spline.ToOpenNest(SplinePrecision)); {
switch (entity)
{
case ACadSharp.Entities.Line line:
lines.Add(line.ToOpenNest());
break;
foreach (var polyline in doc.Entities.Polylines2D) case ACadSharp.Entities.Arc arc:
lines.AddRange(polyline.ToOpenNest()); arcs.Add(arc.ToOpenNest());
break;
foreach (var ellipse in doc.Entities.Ellipses) case ACadSharp.Entities.Circle circle:
lines.AddRange(ellipse.ToOpenNest(SplinePrecision)); entities.Add(circle.ToOpenNest());
break;
foreach (var line in doc.Entities.Lines) case ACadSharp.Entities.Spline spline:
lines.Add(line.ToOpenNest()); lines.AddRange(spline.ToOpenNest());
break;
foreach (var arc in doc.Entities.Arcs) case ACadSharp.Entities.LwPolyline lwPolyline:
arcs.Add(arc.ToOpenNest()); lines.AddRange(lwPolyline.ToOpenNest());
break;
foreach (var circle in doc.Entities.Circles) case ACadSharp.Entities.Polyline polyline:
entities.Add(circle.ToOpenNest()); lines.AddRange(polyline.ToOpenNest());
break;
foreach (var polyline in doc.Entities.Polylines3D) case ACadSharp.Entities.Ellipse ellipse:
lines.AddRange(polyline.ToOpenNest()); lines.AddRange(ellipse.ToOpenNest(SplinePrecision));
break;
}
}
Helper.Optimize(lines); Helper.Optimize(lines);
Helper.Optimize(arcs); Helper.Optimize(arcs);
@@ -54,13 +67,16 @@ namespace OpenNest.IO
public bool GetGeometry(Stream stream, out List<Entity> geometry) public bool GetGeometry(Stream stream, out List<Entity> geometry)
{ {
bool success = false; var success = false;
try try
{ {
var doc = DxfDocument.Load(stream); using (var reader = new DxfReader(stream))
geometry = GetGeometry(doc); {
success = true; var doc = reader.Read();
geometry = GetGeometry(doc);
success = true;
}
} }
catch (Exception ex) catch (Exception ex)
{ {
@@ -78,25 +94,22 @@ namespace OpenNest.IO
public bool GetGeometry(string path, out List<Entity> geometry) public bool GetGeometry(string path, out List<Entity> geometry)
{ {
Stream stream = null; var success = false;
bool success = false;
try try
{ {
var doc = DxfDocument.Load(path); using (var reader = new DxfReader(path))
geometry = GetGeometry(doc); {
success = true; var doc = reader.Read();
geometry = GetGeometry(doc);
success = true;
}
} }
catch (Exception ex) catch (Exception ex)
{ {
Debug.WriteLine(ex.Message); Debug.WriteLine(ex.Message);
geometry = new List<Entity>(); geometry = new List<Entity>();
} }
finally
{
if (stream != null)
stream.Close();
}
return success; return success;
} }