Esses dias me deparei com alguns documentos que estavam organizados em Layers o que é bem raro onde trabalho porque a maior parte das pessoas simplesmente ignora a existência de Layers no AutoCAD e começa a desenhar qualquer coisas sem escala ou controle de qualquer natureza.
Eu não queria desmontar essa organização então pensei em uma maneira de permitir que bloquear os objetos de modo que eu mesmo não pudesse edita-los.
Como eram muito layers isso estava sendo trabalhoso então resolvi buscar na internet algum código que permitisse realizar isso de maneira automática.
Não demorei muito para encontrar esse artigo do Kean que mostra como fazê-lo.
Realmente como ele mesmo relata no artigo existem muitos casos em que o AutoCAD trava fazendo isso, nas minhas primeiras tentativas isso também ocorreu usando o SendCommand(). Seguindo o exemplo dele mudei a configuração do comando para criar a propriedade IsOff/IsFrozen como um ativador para a função personalizada Editor.ApplyCurDwgLayerTableChanges() que faz um regen no desenho.
Aqui está o exemplo de aplicação em C#:
Esse código é uma adaptação do código original do Kean Wasley. Faça o download do código aqui.
Eu não queria desmontar essa organização então pensei em uma maneira de permitir que bloquear os objetos de modo que eu mesmo não pudesse edita-los.
Como eram muito layers isso estava sendo trabalhoso então resolvi buscar na internet algum código que permitisse realizar isso de maneira automática.
Não demorei muito para encontrar esse artigo do Kean que mostra como fazê-lo.
Realmente como ele mesmo relata no artigo existem muitos casos em que o AutoCAD trava fazendo isso, nas minhas primeiras tentativas isso também ocorreu usando o SendCommand(). Seguindo o exemplo dele mudei a configuração do comando para criar a propriedade IsOff/IsFrozen como um ativador para a função personalizada Editor.ApplyCurDwgLayerTableChanges() que faz um regen no desenho.
Aqui está o exemplo de aplicação em C#:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.EditorInput; using Autodesk.AutoCAD.Runtime; namespace AutoCADNetBlogExemplo2020_07 { public class Commands { public String[] LayerList; [CommandMethod("ListarLayers")] public void UpdateListLyers() { Document doc = Application.DocumentManager.MdiActiveDocument; if (doc == null) return; Editor ed = doc.Editor; if (ed == null) return; if (LayerList == null) LayerList = new String[100]; int j = 0; //Fica recebendo as entradas e listando while (true) { PromptResult ppresult = ed.GetString("Digite o Nome do Layer (ESC para sair):"); j++; if (ppresult.Status != PromptStatus.OK) { ed.WriteMessage("Layers Capturados:"); ed.WriteMessage(String.Join(",", LayerList)); return; } String insert_layer = ppresult.StringResult; LayerList[j] = insert_layer; } } [CommandMethod("BloquearLista")] public void BloquearListaLayers() { Document doc = Application.DocumentManager.MdiActiveDocument; doc = Application.DocumentManager.MdiActiveDocument; if (doc == null) return; doc.LockOrUnlockLayersList(LayerList, true); } [CommandMethod("DesbloquearLista")] public void DesbloquearListaLayer() { Document doc = Application.DocumentManager.MdiActiveDocument; if (doc == null) return; doc.LockOrUnlockLayersList(LayerList, false); } [CommandMethod("BloquearTudo")] public void BloquearTodosLayers() { Document doc = Application.DocumentManager.MdiActiveDocument; doc = Application.DocumentManager.MdiActiveDocument; if (doc == null) return; doc.LockOrUnlockAllLayers(true); } [CommandMethod("DesbloquearTudo")] public void DesbloquearTodosLayer() { Document doc = Application.DocumentManager.MdiActiveDocument; if (doc == null) return; doc.LockOrUnlockAllLayers(false); } } public static class Extensions { /// Metodo do Kean public static void LockOrUnlockAllLayers( this Document doc, bool dolock, bool lockZero = false) { var db = doc.Database; var ed = doc.Editor; using (var tr = db.TransactionManager.StartTransaction()) { var lt = (LayerTable)tr.GetObject(db.LayerTableId, OpenMode.ForRead); foreach (var ltrId in lt) { // Don't try to lock/unlock either the current layer or layer 0 // (depending on whether lockZero == true for the latter) if (ltrId != db.Clayer && (lockZero || ltrId != db.LayerZero)) { // Open the layer for write and lock/unlock it var ltr = (LayerTableRecord)tr.GetObject(ltrId, OpenMode.ForWrite); ltr.IsLocked = dolock; ltr.IsOff = ltr.IsOff; // This is needed to force a graphics update } } tr.Commit(); } // These two calls will result in the layer's geometry fading/unfading // appropriately ed.ApplyCurDwgLayerTableChanges(); ed.Regen(); } // public static void LockOrUnlockLayersList(this Document doc, string[] slist, bool dolock, bool lockZero = false) { var db = doc.Database; var ed = doc.Editor; using (var tr = db.TransactionManager.StartTransaction()) { var lt = (LayerTable)tr.GetObject(db.LayerTableId, OpenMode.ForRead); foreach (var ltrId in lt) { if (ltrId != db.Clayer && (lockZero || ltrId != db.LayerZero)) { // Open the layer for write and lock/unlock it var ltr = (LayerTableRecord)tr.GetObject(ltrId, OpenMode.ForWrite); if (slist.Contains(ltr.Name)) { ltr.IsLocked = dolock; ltr.IsOff = ltr.IsOff; // This is needed to force a graphics update } } } tr.Commit(); } // These two calls will result in the layer's geometry fading/unfading // appropriately ed.ApplyCurDwgLayerTableChanges(); ed.Regen(); } } }
Esse código é uma adaptação do código original do Kean Wasley. Faça o download do código aqui.
Comentários
Postar um comentário