通过升级或降级对象,可以将对象的当前打开模式从读取更改为写入或从写入更改为读取。 这些方法可用于升级或降级以前打开的对象:
建议使用最匹配对象使用方式的模式打开对象,因为打开对象进行读取和查询对象的属性比打开对象进行写入和查询对象的属性更有效。如果不确定是否需要修改对象,最好打开该对象进行读取,然后升级它以进行写入,因为这有助于减少程序的开销。 VB.NETImports 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 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 acTrans.GetObject(acObjId, OpenMode.ForWrite); // Freeze the layer acLyrTblRec.IsFrozen = true; } } } // Commit the changes and dispose of the transaction acTrans.Commit(); } } |
|Archiver|CAD开发者社区 ( 苏ICP备2022047690号-1 )
GMT+8, 2024-5-19 12:46
Powered by Discuz! X3.4
Copyright © 2001-2021, Tencent Cloud.