refactor: merge DxfImporter and DxfExporter into single static Dxf class

Consolidated two stateless classes into one unified API: Dxf.Import(),
Dxf.GetGeometry(), Dxf.ExportPlate(), Dxf.ExportProgram(). Export
state moved into a private ExportContext. Removed bool+out pattern
from GetGeometry in favor of returning empty list on failure.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-06 08:17:49 -04:00
parent e92208b8c0
commit 250fdefaea
20 changed files with 405 additions and 505 deletions
+1 -2
View File
@@ -70,8 +70,7 @@ public class NestRunnerTests
var pgm = ConvertGeometry.ToProgram(shape);
var path = Path.Combine(Path.GetTempPath(), $"test-{Guid.NewGuid()}.dxf");
var exporter = new DxfExporter();
exporter.ExportProgram(pgm, path);
Dxf.ExportProgram(pgm, path);
return path;
}
@@ -35,8 +35,7 @@ public class SolidWorksBendDetectorTests
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();
var result = importer.Import(path);
var result = OpenNest.IO.Dxf.Import(path);
// EllipseConverter now produces arcs directly during import,
// so the imported entities should contain Arc instances from the ellipses
@@ -61,8 +60,7 @@ public class SolidWorksBendDetectorTests
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);
var result = OpenNest.IO.Dxf.Import(path);
// The DXF has 2 trimmed ellipses forming an oblong slot.
// Trimmed ellipses must not generate a closing chord line.
@@ -32,8 +32,7 @@ public class BestFitOverlapTests
if (!File.Exists(DxfPath))
return null;
var importer = new DxfImporter();
importer.GetGeometry(DxfPath, out var geometry);
var geometry = Dxf.GetGeometry(DxfPath);
var pgm = ConvertGeometry.ToProgram(geometry);
return new Drawing("PT16", pgm);
}
+1 -2
View File
@@ -20,8 +20,7 @@ public class EngineOverlapTests
if (!System.IO.File.Exists(DxfPath))
return null;
var importer = new DxfImporter();
importer.GetGeometry(DxfPath, out var geometry);
var geometry = Dxf.GetGeometry(DxfPath);
var pgm = ConvertGeometry.ToProgram(geometry);
return new Drawing("PT15", pgm);
}
@@ -228,8 +228,7 @@ public class EllipseConverterTests
using (var writer = new ACadSharp.IO.DxfWriter(stream, doc, false))
writer.Write();
var importer = new OpenNest.IO.DxfImporter();
var result = importer.Import(tempPath);
var result = OpenNest.IO.Dxf.Import(tempPath);
var arcCount = result.Entities.Count(e => e is Arc);
var lineCount = result.Entities.Count(e => e is Line);
@@ -138,8 +138,7 @@ public class GeometrySimplifierTests
if (!File.Exists(path))
return; // skip if file not available
var importer = new DxfImporter();
var result = importer.Import(path);
var result = Dxf.Import(path);
var shapes = ShapeBuilder.GetShapes(result.Entities);
var simplifier = new GeometrySimplifier { Tolerance = 0.004 };
+3 -6
View File
@@ -11,17 +11,14 @@ public class DxfRoundtripTests
private static List<Entity> ExportAndReimport(List<Entity> geometry)
{
var program = ConvertGeometry.ToProgram(geometry);
var exporter = new DxfExporter();
var importer = new DxfImporter();
using var exportStream = new MemoryStream();
exporter.ExportProgram(program, exportStream);
Dxf.ExportProgram(program, exportStream);
var bytes = exportStream.ToArray();
var importStream = new MemoryStream(bytes);
var success = importer.GetGeometry(importStream, out var reimported);
var reimported = Dxf.GetGeometry(importStream);
Assert.True(success, "Failed to re-import exported DXF");
Assert.NotEmpty(reimported);
return reimported;
}
@@ -369,8 +369,7 @@ public class DrawingSplitterTests
var writer = new OpenNest.IO.SplitDxfWriter();
writer.Write(tempPath, results[0]);
var reimporter = new OpenNest.IO.DxfImporter();
var reimportResult = reimporter.Import(tempPath);
var reimportResult = OpenNest.IO.Dxf.Import(tempPath);
var afterArcs = reimportResult.Entities.OfType<Arc>().Count();
var afterCircles = reimportResult.Entities.OfType<Circle>().Count();
@@ -185,8 +185,7 @@ public class SplitDxfWriterEtchLayerTests
writer.Write(tempPath, splitDrawing);
// Re-import via DxfImporter (same path as CadConverterForm)
var importer = new DxfImporter();
var result = importer.Import(tempPath);
var result = Dxf.Import(tempPath);
// ETCH entities should be filtered during import (like BEND)
var etchEntities = result.Entities
@@ -23,8 +23,7 @@ public class StrategyOverlapTests
if (!System.IO.File.Exists(DxfPath))
return null;
var importer = new DxfImporter();
importer.GetGeometry(DxfPath, out var geometry);
var geometry = Dxf.GetGeometry(DxfPath);
var pgm = ConvertGeometry.ToProgram(geometry);
return new Drawing("PT15", pgm);
}