開いたオブジェクトをアップグレードまたはダウングレードする(.NET)

GetObject または Open メソッドのいずれかを使用してオブジェクトを開いたら、UpgradeOpen および DowngradeOpen メソッドを使用してオブジェクトの現在のオープン モードを変更できます。UpgradeOpen メソッドは、読み込み用に開かれたオブジェクトを書き込みモードに変更し、DowngradeOpen は、書き込み用に開かれたオブジェクトを読み込みモードに変更します。オブジェクトを終了するかトランザクションを破棄すると、図形のオープン状態は十分にクリーンアップされるため、UpgradeOpen を呼び出すたびに DowngradeOpen を呼び出す必要はありません。

オブジェクトを開くときは、オブジェクトを使用するモードで開きます。オブジェクトのクエリーのみが必要なときは、書き込み用にオブジェクトを開かないでください。書き込み用にオブジェクトを開いてオブジェクトのプロパティをクエリーするよりも、読み込み用にオブジェクトを開いてオブジェクトのプロパティをクエリーする方が効率的です。

書き込み用にオブジェクトを開くと、オブジェクトに対して元に戻す操作のためのファイリングが開始されます。元に戻す操作のためのファイリングは、オブジェクトへの変更を追跡し、変更をロールバックできるようにするために使用されます。オブジェクトを修正する必要があるかどうか不明な場合は、読み込み用にオブジェクトを開いてから書き込み用にアップグレードすることをお勧めします。これは、プログラムのオーバーヘッドを減らすのに役立ちます。

UpgradeOpen を使用する場合の例として、特定の条件にオブジェクトが一致するかどうかオブジェクトをクエリーして、条件に一致する場合は、読み込みモードから書き込みモードにオブジェクトをアップグレードして修正する場合があります。

通知を開く

オブジェクトが通知のために開かれ、通知を受け取る場合も同様に、UpgradeFromNotify を使用して書き込み用にオブジェクトをアップグレードします。次に、DowngradeToNotify を使用して通知用にオブジェクトをダウングレードします。UpgradeFromNotifyDowngradeFromNotify は、オブジェクトが自身のオープン状態を変更し、安全に修正できるようにすることを目的としているメソッドで使用するために予約されています。

VB.NET

Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.DatabaseServices
 
<CommandMethod("FreezeDoorLayer")> _
Public Sub FreezeDoorLayer()
    '' Get the current document and database
    Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
    Dim acCurDb As Database = acDoc.Database

    '' Start a transaction
    Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()

        '' Open the Layer table for read
        Dim acLyrTbl As LayerTable
        acLyrTbl = acTrans.GetObject(acCurDb.LayerTableId, OpenMode.ForRead)

        '' Step through each layer and update those that start with 'Door'
        For Each acObjId As ObjectId In acLyrTbl
            '' Open the Layer table record for read
            Dim acLyrTblRec As LayerTableRecord
            acLyrTblRec = acTrans.GetObject(acObjId, OpenMode.ForRead)

            '' Check to see if the layer's name starts with 'Door' 
            If (acLyrTblRec.Name.StartsWith("Door", _
                                            StringComparison.OrdinalIgnoreCase) = True) Then
                '' Check to see if the layer is current, if so then do not freeze it
                If acLyrTblRec.ObjectId <> acCurDb.Clayer Then
                    '' Change from read to write mode
                    acLyrTblRec.UpgradeOpen()

                    '' Freeze the layer
                    acLyrTblRec.IsFrozen = True
                End If
            End If
        Next

        '' Commit the changes and dispose of the transaction
        acTrans.Commit()
    End Using
End Sub

C#

using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
 
[CommandMethod("FreezeDoorLayer")]
public static void FreezeDoorLayer()
{
    // Get the current document and database
    Document acDoc = Application.DocumentManager.MdiActiveDocument;
    Database acCurDb = acDoc.Database;

    // Start a transaction
    using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
    {
        // Open the Layer table for read
        LayerTable acLyrTbl;
        acLyrTbl = acTrans.GetObject(acCurDb.LayerTableId,
                                        OpenMode.ForRead) as LayerTable;

        // Step through each layer and update those that start with 'Door'
        foreach (ObjectId acObjId in acLyrTbl)
        {
            // Open the Layer table record for read
            LayerTableRecord acLyrTblRec;
            acLyrTblRec = acTrans.GetObject(acObjId,
                                            OpenMode.ForRead) as LayerTableRecord;

            // Check to see if the layer's name starts with 'Door' 
            if (acLyrTblRec.Name.StartsWith("Door",
                                            StringComparison.OrdinalIgnoreCase) == true)
            {
                // Check to see if the layer is current, if so then do not freeze it
                if (acLyrTblRec.ObjectId != acCurDb.Clayer)
                {
                    // Change from read to write mode
                    acLyrTblRec.UpgradeOpen();

                    // Freeze the layer
                    acLyrTblRec.IsFrozen = true;
                }
            }
        }

        // Commit the changes and dispose of the transaction
        acTrans.Commit();
    }
}