netDxfを使ってみた.
なんということはないプログラム.
netDxfでdxfファイルを開いて円だけを抜き出し,半径でソートして,中心のX座標でソートして,中心のY座標でソートして順に表示するアプリを作ってみた.
using netDxf; using System; using System.Collections.Generic; using System.IO; using System.IO.MemoryMappedFiles; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DxfProc { class Program { static void Main(string[] args) { bool fileMode = false; string fileName = ""; for (int i = 0; i < args.Length; i++) // もしコマンドライン引数で渡されたらファイルとして処理 { { fileMode = true; fileName = args[i]; } } DxfDocument dxf = null; if (fileMode) { dxf = DxfDocument.Load(fileName); } else { Int32 length = Int32.Parse(Console.ReadLine()); // get file size MemoryMappedFile shared_mem = MemoryMappedFile.OpenExisting("shared_mem", MemoryMappedFileRights.Read); Stream stream = shared_mem.CreateViewStream(0, length, MemoryMappedFileAccess.Read); dxf = DxfDocument.Load(stream); } var circles = dxf.Circles; var a = circles.OrderBy(p => p.Center.Y).OrderBy(p => p.Center.X).OrderBy(p => p.Radius); Console.WriteLine("Diameter,Center X, Center Y"); foreach (var circle in a) { Console.WriteLine($"{circle.Radius*2:0.00000},{circle.Center.X:0.00000},{circle.Center.Y:0.00000}"); } } } }
ちなみに共有メモリを開くようにしている理由は?netDxfのライセンスの関係で本体アプリは別に作っていたから.例えばこんな感じ.
using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.IO.MemoryMappedFiles; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApp1 { class Program { static void Main(string[] args) { string fileName = "Untitled.dxf"; Process proc = new Process(); ProcessStartInfo processStartInfo = new ProcessStartInfo() { FileName = "DxfProc.exe", RedirectStandardInput = true, RedirectStandardOutput = true, UseShellExecute = false, }; FileInfo fileInfo = new FileInfo(fileName); var length = fileInfo.Length; // ファイルサイズ MemoryMappedFile share_mem = MemoryMappedFile.CreateFromFile(fileName, FileMode.Open, "shared_mem", length, MemoryMappedFileAccess.Read); proc.StartInfo = processStartInfo; proc.Start(); proc.StandardInput.WriteLine(length); Console.Write(proc.StandardOutput.ReadToEnd()); proc.WaitForExit(); } } }
最新のnetDxfはライセンスが変更になったのでこれがnugetに上がってくる頃にはこの対応は不要になると思う.最新訂正ではDxfDocumentの直下にCirclesはなくなりEntitiesの下に配置されるようになっている.若干の修正がある.