Pular para o conteúdo principal

Bloqueando e Desbloqueando visibilidade de Layers usando .NET

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#:

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

Postagens mais visitadas deste blog

Numeração Automática no AutoCAD

Sem dúvida esse é uma ferramenta única que fazia falta a tempos e foi introduzida recentemente no AutoCAD, na última década… Em 2013 tinha feito um programa para criar uma bolinhas de numeração automática usando o conceito de Leader eu fazia um controle dos números dos itens na mão mesmo, depois de um tempo resolvi fazer um menuzinho para controlar o conteúdo do número dos bullets, hoje isso não é mais necessário, existe um comando no próprio AutoCAD para isso e faz parte das Ferramentas Expressas do AutoCAD. Gosto de compartilhar ferramentas e dicas que tendem a ser menos conhecidas ou subutilizadas, mas ainda podem fornecer um impulso para sua produtividade e fluxo de trabalho e que eu mesmo me surpreendi quando as encontrei Hoje, quero apresentar outra ferramenta, a numeração automática. Como o nome indica, o comando Numeração automática permite que você adicione automaticamente um número às etiquetas ou texto em um desenho. Vou mostrar como a numeração automática pode ser usada par...

Alterar a cor de fundo do AutoCAD

Eu sou um adepto do fundo preto, tudo que eu posso mudo a cor do fundo para preto. Nas ultimas versões do AutoCAD tenho notado que não é mais o padrão o fundo preto absoluto, é um cinza escuro. As vezes gosto também de mudar a cor do Layout de branco para preto afinal de contas quando trabalhamos com penas e contraste no model space preto, ver um desenho no layout é impossível.  Você pode mudar sua cor de fundo do AutoCAD para a cor que quiser. Definindo cores personalizadas Primeiro, vá para o menu Opções (botão Aplicativo> Opções), selecione a guia Exibição e clique no botão Cores. Agora você deve ver a caixa de diálogo Cores da janela de desenho: Agora você pode atualizar as cores de qualquer elemento da interface. Isso incluí o plano de fundo em qualquer contexto (selecione Model e Layout). Você pode escolher qualquer uma das predefinições, ou você pode escolher a partir de todo o espectro (basta escolher a opção Selecionar Cor ...). Se você não gost...

Unindo blocos em AutoCAD utilizando .NET

Hoje me deparai com uma necessidade de unir blocos com propriedades então resolvi fazer um comando para realizar esses procedimento. A principio esse procedimento não é tão complexo de ser executado individualmente mas por outro lado gostaria também de analisar um pouco melhor as possibilidades de se manipular blocos utilizando o AutoCAD. Abaixo o código que utilizei: using Autodesk.AutoCAD.ApplicationServices ; using Autodesk.AutoCAD.DatabaseServices ; using Autodesk.AutoCAD.EditorInput ; using Autodesk.AutoCAD.Runtime ; using System.Linq ; // This line is not mandatory, but improves loading performances [assembly: CommandClass(typeof(Merging_AutoCAD_blocks.Comandos))] namespace Merging_AutoCAD_blocks { public class Comandos { /// <summary> /// Uni dois ou mais blocos em um unico bloco. /// </summary> [CommandMethod("MERGBLKS")] public static void UnindoBlocos () {...