オブジェクトの現在のオープン モードは、オブジェクトをアップグレードまたはダウングレードすることによって、読み込みから書き込み、または書き込みから読み込みに変更することができます。
次のメソッドを使用して、以前に開いたオブジェクトをアップグレードまたはダウングレードできます。
オブジェクトの使用方法に最適なモードを使用してオブジェクトを開くことをお勧めします。たとえば、オブジェクトを書き込み用に開いてオブジェクトのプロパティを照会するよりも、オブジェクトを読み込み用に開いてオブジェクトのプロパティを照会する方が効率的です。オブジェクトを修正する必要があるかどうかが不明な場合は、オブジェクトを読み込み用に開いてから書き込み用にアップグレードすることをお勧めします。これによって、プログラムのオーバーヘッドを軽減できます。
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 acTrans.GetObject(acObjId, OpenMode.ForWrite) '' 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
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 acTrans.GetObject(acObjId, OpenMode.ForWrite); // Freeze the layer acLyrTblRec.IsFrozen = true; } } } // Commit the changes and dispose of the transaction acTrans.Commit(); } }