Issue
PURGE コマンド相当の機能を AutoCAD .NET API で実装したいと考えていますが、Database.Purge メソッドがありますが利⽤⽅法がわかりませ ん。 どのように利⽤すればいいでしょうか?
Solution
atabase.Purge() メソッドには、2 つのオーバーロードが存在します。もっとも⼀般的なのは、 Database.Purge(ObjectIdCollection) です。この メソッドは、事前に設定された ObjectIdCollection から、他のオブジェクトから参照されていて、パージ出来ないオブジェクトの ObjectId を削除し ます。
なお、PURGE コマンドとは異なり、Database.Purge() 関数⾃体は図⾯データベースを調節操作することはありません。あくまで、削除可能なオブ ジェクトの ObjectId を選別するのみです。不要なオブジェクトを削除する場合には、DBObject.Erase メソッドを利⽤して明⽰的に削除してくださ い。
次のコードは、不要な BlockTableRecord を削除する機能を実装しています。
C# コード
Database oDb = Application.DocumentManager.MdiActiveDocument.Database;
Editor oEd = Application.DocumentManager.MdiActiveDocument.Editor;
try {
using (Transaction oTr = oDb.TransactionManager.StartTransaction()) {
ObjectIdCollection oObjIds = new ObjectIdCollection();
BlockTable oTbl = oTr.GetObject(oDb.BlockTableId, OpenMode.ForRead, false) as BlockTable;
IEnumerator oEnu1 = oTbl.GetEnumerator();
while (oEnu1.MoveNext()) {
oObjIds.Add((ObjectId)oEnu1.Current);
}
oDb.Purge(oObjIds);
ObjectId oObjId;
BlockTableRecord oRec;
IEnumerator oEnu2 = oObjIds.GetEnumerator();
while (oEnu2.MoveNext()) {
oObjId = (ObjectId)oEnu2.Current;
oRec = oTr.GetObject(oObjId, OpenMode.ForWrite, false) as BlockTableRecord;
oRec.Erase();
oEd.WriteMessage( "\nパージ対象ブロック定義 = " + oRec.Name);
}
oTr.Commit();
}
} catch (Autodesk.AutoCAD.Runtime.Exception ex) {
oEd.WriteMessage(ex.Message);
} finally {
}
VB.NET コード
Dim oDb As Database = Application.DocumentManager.MdiActiveDocument.Database
Dim oEd As Editor = Application.DocumentManager.MdiActiveDocument.Editor
Try
Using oTr As Transaction = oDb.TransactionManager.StartTransaction()
Dim oObjIds As New ObjectIdCollection()
Dim oTbl As BlockTable = TryCast(oTr.GetObject(oDb.BlockTableId, OpenMode.ForRead, False), BlockTable)
Dim oEnu1 As IEnumerator = oTbl.GetEnumerator()
While oEnu1.MoveNext()
oObjIds.Add(DirectCast(oEnu1.Current, ObjectId))
End While
oDb.Purge(oObjIds)
Dim oObjId As ObjectId
Dim oRec As BlockTableRecord
Dim oEnu2 As IEnumerator = oObjIds.GetEnumerator()
While oEnu2.MoveNext()
oObjId = DirectCast(oEnu2.Current, ObjectId)
oRec = TryCast(oTr.GetObject(oObjId, OpenMode.ForWrite, False), BlockTableRecord)
oRec.Erase()
oEd.WriteMessage(vbLf & "パージ対象ブロック定義 = " + oRec.Name)
End While
oTr.Commit()
End Using
Catch ex As Autodesk.AutoCAD.Runtime.Exception
oEd.WriteMessage(ex.Message)
Finally
End Try