Pular para o conteúdo principal

AutoCAD .NET #005 Tutorial – Criando um Plug-in básico para AutoCAD

 Agora que já estamos mais ou menos familiarizados com a ferramenta do Visual Studio e como ele interage com o AutoCAD acho interessante seguir o tutorial básico da própria Autodesk para a API .NET disponível em (https://knowledge.autodesk.com/support/autocad/learn-explore/caas/simplecontent/content/lesson-1-the-basic-autocad-plug.html)

Tratam-se de 8 lições bem instrutivas de como usar as ferramentas do AutoCAD .NET para customizar o AutoCAD e expandir as possibilidades.

A primeira lição é basicamente um sumário de tudo que vimos até agora. 

Vale fazer um pequeno adendo: As linguagens vb e c# bem como F# são linguagens equivalentes, ou seja, o tutorial da Autodesk é desenvolvido em vb (visual basic) mas ele pode ser convertido usando até mesmo ferramentas online de conversão para C#. Assim vou seguir criando aqui os códigos em C# .NET mas se preferir pode fazer o download ou seguir os exemplos do próprio tutorial da Autodesk.

Criando um Plug-in básico para AutoCAD

Objetivo:

O objetivo dessa lição será: (1) rever todo o processo de criação de um projeto do zero e (2) introduzir a manipulação de propriedades de atributos de blocos, criando um comando que posiciona automaticamente os atributos de um bloco para a posição paralela ao eixo X do WCS.

Passo-a-passo de criação:

1 - Iniciando o Visual Studio 2019:

2 - Criando um projeto Novo no Visual Studio:

3 – Configurando um Novo Projeto:

4 - AutoCAD.NET Wizard Configurator:

5 - Salve o projeto:

6 – Feche e reabra o Visual Studio: Particulamente acho que esse passo não é necessário, mas para fazer um paralelo com o que foi feito na lição 1 da Autodesk coloquei esse passo aqui.

7 – Verifique as referências:

Na janela Gerenciador de Soluções no lado direito da janela expanda a opção “Referências”.

Se por algum motivo AcCoreMgd, AcMgd e AcDbMgd não estiverem listados, clique no botão Adicionar…, selecione Referência…, navegue até a pasta ... ObjectARX\inc e selecione esses arquivos. Em seguida, selecione cada referência na lista para visualizar suas propriedades na janela no canto inferior direito e defina a propriedade Copy Local como false.

8 – Adicione seu Código

Dê um clique duplo no myCommands.cs e abra-o.

Apague tudo e substitua pelo código a seguir:

using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;

namespace HorizontalAttributes
{
    public class Commands
    {

        // Class variable to store the instance of our overrule
        private static KeepStraightOverrule myOverrule;

        [CommandMethod("KeepStraight")]
        public static void ImplementOverrule()
        {

            // We only want to create our overrule instance once, 
            // so we check if it already exists before we create it
            // (i.e. this may be the 2nd time we've run the command)
            if (myOverrule == null)
            {
                // Instantiate our overrule class
                myOverrule = new KeepStraightOverrule();
                // Register the overrule
                Overrule.AddOverrule(RXClass.GetClass(typeof(AttributeReference)), myOverrule, false);
            }
            // Make sure overruling is turned on so our overrule works
            Overrule.Overruling = true;
        }
    }

    // Our custom overrule class derived from TransformOverrule
    public class KeepStraightOverrule : TransformOverrule
    {

        // We want to change how an AttributeReference responds to being
        // transformed (moved, rotated, etc.), so we override its
        // standard TransformBy function.
        public override void TransformBy(Entity entity, Matrix3d transform)
        {

            // Call the normal TransformBy function for the attribute
            // reference we're overruling.
            base.TransformBy(entity, transform);
            // We know entity must be an AttributeReference because 
            // that is the only entity we registered the overrule for.
            AttributeReference attRef = entity;
            // Set rotation of attribute reference to 0 (horizontal)
            attRef.Rotation = 0.0;
        }
    }

Nas notas do código o autor diz que é possível apagar o myPlugin.cs. Eu nunca fiz isso, sempre deixei o código de inicialização para caso eu precise no futuro quando tornar a aplicação escalável. Chega a ser até um pouco contraditório porque lendo as notas geradas dentro do myPlugin.cs é mencionado que esse código serve também para algumas otimizações.

Quando ao código em si. Esse código achei até um pouco “avançado” para um exemplo básico. O que o código faz resumidamente é sobreescrever um método que já existe dentro do AutoCAD chamado TransformOverrule, esse método possuí uma função TransformBy que possui um conjunto de dois argumentos diferentes das implementações nativas do AutoCAD. Esse novo método permite que ele seja utilizado na função ImplementOverrule() sob o nome de comando KeepStraight.

Dentro do comando ImplementOverrule() ele atribui apenas uma vez o myOverrule a um novo objeto KeepStraightOverrule e depois apenas ativa a atribuição de argumentos sempre na horizontal.

8 – Compile e código.


Executando o código:

1 – Com o AutoCAD sendo executado abra o desenho “BlocksWithAttributes.dwg”.

2 – Use o comando NETLOAD para carregar a aplicação.

3 – Navegue até a pasta \debug\seuaplicativo.dll selecione e clique em Open.

4 – Teste a sua aplicação: Digite KEEPSTRAIGHT na linha de comando e pressione <Enter> . Feito isso o comando personalizado será executado. O comportamento de cada atributo em cada desenho aberto no AutoCAD agora está sendo modificado pelo seu plug-in. Para ver esse comportamento está realmente funcionando, use o comando ROTATE para girar cada uma das inserções de bloco em BlockWithAttributes.dwg. Conforme você monta o bloco, verá que seus atributos permanecem paralelos ao eixo x do UCS.


E assim você tem o seu primeiro Plug-in para AutoCAD completamente pronto e operacional. Se você quiser distribuir para alguém utilizar dentro do seu trabalho precisa apenas enviar essa DLL compilada para pessoa e ela conseguirá utilizando o NETLOAD carregar a ferramenta que você fez.

Na próxima lição veremos mais um exemplo de como utilizar a API do dotNET a nossa favor no AutoCAD

Abrindo o AutoCAD com um desenho pré-definido

Complementando um pouco, nesse projeto utilizamos o arquivo BlockWithAttributes.dwg que é o mesmo disponível na lição 1 da Autodesk, tivemos que carrega-lo manualmente no AutoCAD clicando em abrir no entanto é possível carregar esse arquivo continuamente sempre que clicar no comando de depuração no visual Studio em RUN.

Para isso vá em propriedades do projeto, Properities:

Vá na aba Depurar (debug):


Nessa aba vamos configurar dois campos: campo de Diretório de Trabalho (work directory) e Argumentos (arguments). Esses campos é configurado onde o AutoCAD está considerando o espaço de trabalho, geralmente eu coloco sempre a pasta de depuração ...Visual Studio 2013\Projects\Lesson 1 The Basic AutoCAD Plug-in\bin\Debug.

Para ele abrir o documento BlockWithAttributes.dwg automaticamente coloque o arquivo BlockWithAttributes.dwg em ...Visual Studio 2013\Projects\Lesson 1 The Basic AutoCAD Plug-in\bin\Debug.

Finalmente nos argumentos inclua o nome do arquivo que deseja abrir com aspas duplas “"blockswithattributes.dwg"”.

Pronto!” agora toda vez que você for testar sua aplicação o arquivo de teste será aberto automaticamente poupando o tempo de ir lá tentar abri-lo.

Arquivos para Download:

Lesson 1 The Basic AutoCAD Plug-in.zip 

Lesson 1 The Basic AutoCAD Plug-in.dll (compilado)

Arquivo blockswithattributes.dwg


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 () {...