Autodesk Community Tipsではちょっとしたコツ、やり方、ショートカット、アドバイスやヒントを共有しています。
Issue
AutoCAD .NET API でフォルダ内の DWG ファイルを順に開いて処理していますが、サイズの大きい図面があると相対的に処理時間が長くなってしまいます。高速化するアイデアはありますか?
Solution
AutoCAD 上に図面を開いて表示する際、描画に多く時間がかかってしまいます。
もし、ユーザインターフェース上に図面を表示する必要がないのであれば、Database.ReadDwgFile メソッドを使って、メモリ上に図面を展開する方法を採用することで、描画にかかかる時間を省いて処理全体を高速化させることが出来ます。
次のコードは、フォルダを指定後にフォルダ内の .dwg ファイルを順に Database.ReadDwgFile メソッドでメモリ展開し、モデル空間のオブジェクト タイプを表示するものです。
[CommandMethod("MyCommand", CommandFlags.Modal)]
public void MyCommand()
{
Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
Editor ed = doc.Editor;
using (FolderBrowserDialog fd = new FolderBrowserDialog())
{
if (fd.ShowDialog() == DialogResult.OK)
{
string folder = fd.SelectedPath;
System.IO.DirectoryInfo di = new System.IO.DirectoryInfo(folder);
IEnumerable<System.IO.FileInfo> files =
di.EnumerateFiles("*.dwg", System.IO.SearchOption.AllDirectories);
if (files == null)
return;
ed.WriteMessage("\n\t{0}", folder);
foreach (System.IO.FileInfo f in files)
{
string file = f.FullName;
ed.WriteMessage("\n - {0}", file);
try
{
using (Database db = new Database(false, true))
{
db.ReadDwgFile(file, FileOpenMode.OpenForReadAndAllShare, false, null);
using (Transaction tr = db.TransactionManager.StartTransaction())
{
BlockTableRecord btr = (BlockTableRecord)tr.GetObject(SymbolUtilityServices.GetBlockModelSpaceId(db), OpenMode.ForRead);
foreach (ObjectId id in btr)
{
Entity ent = (Entity)tr.GetObject(id, OpenMode.ForRead);
ed.WriteMessage("\n - {0}", ent.GetType().ToString());
}
tr.Commit();
}
}
}
catch (System.Exception ex)
{
ed.WriteMessage(ex.ToString());
}
}
}
}
}
なお、Database.ReadDwgFile メソッドの使用時には、次の点に注意が必要です。