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

AutoCAD .NET API:パージ処理の実装

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
End Sub