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の下に配置されるようになっている.若干の修正がある.

