Autodesk Community Tips- ADNオープン
Autodesk Community Tipsではちょっとしたコツ、やり方、ショートカット、アドバイスやヒントを共有しています。

AutoCAD .NET API:寸法削除直後の寸法参照画層の削除

Issue

寸法が参照する画層が、同寸法の削除後も削除出来ません。

 

layer.jpg

 

ただし、一度、図面を保存して開き直すと削除出来ます。

図面を開き直さなくても、この画層を削除したいのですが、AutoCAD .NET API で可能でしょうか?

 

Solution

AutoCAD .NET API では、Database.ReclaimMemoryFromErasedObjects メソッドでメモリ上の図面データベースからオブジェクトを削除する方法を利用することが出来ます。

 

このメソッドは、元々、32 ビット環境で大規模図面を操作する際の消費メモリ低減を狙ったものですが、図面を保存して開き直さなくても、同じセッションで図面データベース内の削除フラグが付いたオブジェクトをメモリから削除することが可能です。

下記コード例では、対象の寸法オブジェクトの削除後に ReclaimMemoryFromErasedObjects メソッドで同オブジェクトをメモリ上から削除、その後、参照画層と寸法を表現していた匿名ブロックを削除している点にご注意ください。


後半の処理(下部の Using スコープ)がないと、AUDIT コマンドで図面破損が報告されてしまうので注意が必要です。 少し趣旨が異なりますが、ちょうど、LAYDEL[画層削除] コマンドが処理する内容と似ています。

 

Document doc = Application.DocumentManager.MdiActiveDocument;
Database db = doc.Database;
Editor ed = doc.Editor;

PromptEntityOptions peo1 = new PromptEntityOptions("\n削除する寸法を選択:");
PromptEntityResult pent = ed.GetEntity(peo1);
if (pent.Status != PromptStatus.OK)
{
    return;
}

ObjectIdCollection erased = new ObjectIdCollection();
ObjectId layId = ObjectId.Null;
ObjectId blkId = ObjectId.Null;
using (Transaction tr = db.TransactionManager.StartTransaction())
{
    Dimension dim = (Dimension)tr.GetObject(pent.ObjectId, OpenMode.ForWrite);
    erased.Add(pent.ObjectId);
    layId = dim.LayerId;
    blkId = dim.DimBlockId;
    dim.Erase();
    tr.Commit();
}

db.ReclaimMemoryFromErasedObjects(erased);

using (Transaction tr = db.TransactionManager.StartTransaction())
{
    LayerTableRecord lay = (LayerTableRecord)tr.GetObject(layId, OpenMode.ForWrite);
    lay.Erase();
    BlockTableRecord blk = (BlockTableRecord)tr.GetObject(blkId, OpenMode.ForWrite);
    blk.Erase();
    tr.Commit();
}