Pular para o conteúdo principal

Obtendo atributos dos blocos no AutoCAD usando .NET


Esses dias comecei a trabalhar com projetos usando objetos e blocos para legendas e me veio a necessidade de listar todos as propriedades de um bloco em uma lista no prompt de comando.




Este pequeno código é uma prova de funcionalidade de como é possível listar as propriedades de um Block Reference da tela.

Associado com outras funções que já apresentei nesse blog é possível criar uma ferramenta completa até mesmo listando e referenciando.

Código em C#:

using Autodesk.AutoCAD;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;

namespace Exemplos
{
    public class FunccoesParaBlocos
    {
        [CommandMethod("LISTA_ATRIBUTOS")]
        public void LISTA_ATRIBUTOS()
        {
            Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
            Database db = HostApplicationServices.WorkingDatabase;
            Transaction tr = db.TransactionManager.StartTransaction();

            // Inicia a transferência de ações para o documento ativo
            try
            {
                // Utiliza um filtro para não pressicar fazer um loop e varrer todos os 
                //elementos do desenho
                TypedValue[] filList = new TypedValue[1] {
                                       new TypedValue((int)DxfCode.Start, "INSERT")
                };

                SelectionFilter filter = new SelectionFilter(filList);
                PromptSelectionOptions opts = new PromptSelectionOptions();
                opts.MessageForAdding = "Selecione os blocos da tela: ";
                PromptSelectionResult res = ed.GetSelection(opts, filter);

                // Trata seleção vazia
                if (res.Status != PromptStatus.OK)
                    return;

                SelectionSet selSet = res.Value;
                ObjectId[] idArray = selSet.GetObjectIds();
                foreach (ObjectId blkId in idArray)
                {
                    BlockReference blkRef = (BlockReference)tr.GetObject(blkId,
                        OpenMode.ForRead); 
                    
                    BlockTableRecord btr = (BlockTableRecord)tr.GetObject(
                        blkRef.BlockTableRecord,
                        OpenMode.ForRead
                      );
                    
                    ed.WriteMessage("\nBloco: " + btr.Name );
                    btr.Dispose();

                    AttributeCollection attCol =
                      blkRef.AttributeCollection;
                    foreach (ObjectId attId in attCol)
                    {
                        AttributeReference attRef = (AttributeReference)tr.GetObject(attId,OpenMode.ForRead);

                        string str = ("\n  Atributo " + attRef.Tag + " = " + attRef.TextString);
                        ed.WriteMessage(str);
                    }
                }
                tr.Commit();
            }
            catch (Autodesk.AutoCAD.Runtime.Exception ex)
            {
                //Tratamento de erros
                ed.WriteMessage(("Ocorreu um erro bizarro: " + ex.Message));
            }
            finally
            {
                //Finaliza a transaction para não ficar no buffer de memória.
                tr.Dispose();
            }
        }
    }

}


A coisa mais interessante que tem nesse código é a utilização do filtro para selecionar apenas os blocos. Geralmente nos meus códigos utilizo métodos de varredura que são muito demorados dessa forma fica realmente rápido.

Espero que esse código seja útil.


Solução em Visual Studio: Download

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...

Operando com Imagens Georreferenciadas no AutoCAD - Ortofotos

A coisa mais desagradável para quem trabalha com documentos em DWG com ortofotos ( fotos aéreas georreferenciadas) é quando se recebe o documento e a ortofoto não é carregada. Uma linha de transmissão onde a plotagem da estruturas é feita em um documento combinado de planta e perfil. Na área da planta é feito pela topografia um serviço de recorte e renderização das imagens em formato de ortofoto na região do desenho. Como a linha de transmissão a projeção é feita sempre linear na planta observando os vértices uma mesma ortofoto pode ser representada várias vezes numa mesma folha em um enjanelamento diferente. Tratamento de Ortofotos no AutoCAD - EXTERNALREFERENCES As ortofotos no AutoCAD são tratadas como referências a objetos externos. Isso é bom porque cada ortofoto pode ter de poucos kb até Gb de tamanho. Se for parte integrante do DWG poderia deixa-lo grande de mais para ser manipulado. Cada projeção no documento funciona como uma imagem projetada em um...