Pular para o conteúdo principal

Métodos eficientes para chamar comandos programaticamente

Esses dias eu fiz um aplicativo para .NET inicialmente para AutoCAD 2012 que tinha uma simples formulário que chamava os comandos pelos botões, até ai perfeito e eficiente. Quando a empresa atualizou para AutoCAD 2013 fiz atualização da API já que era completamente incompatível e para minha surpresa compilou perfeitamente! Só que não... os comandos não funcionavam mais... 



É muito comum querer chamar comandos de um ou outro dos ambientes de programação do AutoCAD. Embora seja mais limpa (da perspectiva de um purista) para usar uma API para executar a tarefa que você quiser, a maneira mais rápida - e aquela que vai apelar para os pragmáticos entre nós é muitas vezes para chamar uma seqüência de comandos

Vamos pegar o exemplo simples de adicionar uma linha. Aqui está o que você faria a partir dos diferentes ambientes de uma perspectiva de API de baixo nível:

  • LISP - criar uma lista de associação que representa a entidade e, em seguida, (entmake) que
  • VBA (ou COM) - obter o objeto modelspace do desenho ativo e chamar AddLine (a API COM é provavelmente o mais simples a esse respeito)
  • NET e ObjectARX - abrir a tabela de bloco e, em seguida, o modelo de espaço de registro da tabela de bloco, crie um novo objeto de linha e anexá-lo para o espaço do modelo (e para a transação, se você estiver usando-os), fechando os vários objetos ao longo do caminho


Depois comecei a programar para AutoCAD com LISP a maneira mais simples de fazer o que você quer é chamar uma linha de comando, passando os pontos inicial e final é dessa forma:

 (command "_LINE" "0,0,0" "100,100,0" "")  

LISP é ótima nesse aspecto: como você não é capaz de definir comandos nativos (apenas LISP), é perfeitamente aceitável para usá-lo para comandos de script para fazer o que quiser, em vez de confiar em APIs de baixo nível.

ObjectARX tem grandes problemas para chamar comandos nativos por isso a necessidade de estratégias para fazer isso. A verdade é que o melhor para chamar comandos é usando acadCommand() do ObjectARX, ou criando um comando de "chamamamento" registrado como uma função LISP usando acadDefun().

Mas se você quer chamar ainda existem algumas opções alternativas no ObjectARX:


  • ads_queueexpr()
    • Se destina a ser usado a partir de acrxEntryPoint() para executar uma seqüência de comandos depois de (s::startup) foi chamado de LISP (como você não são capazes de usar acedCommand() a partir deste contexto), volta para ir ao mesmo lugar
    • Você precisa declará-la a si mesmo (Extern "C" ads_queueexpr void (Acar *);) antes do uso
    • Foi sem suporte, desde que me lembro, mas é amplamente utilizado e mencionado na seção Tips & Techniques no ObjectARX Developer's Guide
  • AcApDocManager::sendStringToExecute()
    • Esta função tem a vantagem de ter uma série de argumentos de execução que facilitam tanto auditar a utilização da função como esconder a utilização dela, como você envia um string para ser executado você monta o comando como se fosse um script.
  • ::SendMessage()
    • Esta é uma plataforma API Win32 e assim pode ser utilizado para chamar comandos de AutoCAD de um cliente externo - se você quer lançar toda sua aplicação do AutoCAD isso é possível.
  • IAcadDocument::SendCommand()
    • Este método COM é a única maneira (que não acedCommand() ou acedCmd()) para executar um comando de forma síncrona de AutoCAD.
  • acedCommand ()
         Este é o ObjectARX equivalente, e é genuinamente síncrona. Infelizmente problemas com a usá-lo partir diretamente um nativo-registrado.
Esse artigo eu fiz baseado no artigo do Kean Walmsley.

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