85928213-63687385-Basico-Autocad-Net

11
Conceitos Básicos de AutoCAD® .NET Augusto Gonçalves Autodesk CP222-2V Está curioso para saber o que é .NET? Nesta classe iremos apresentar a informação básica que você precisa para começar a escrever seu próprios aplicativos .NET baseados na interface de programação AutoCAD .NET . Esta classe inclui os seguintes fundamentos: uma revisão do Framework .NET e sua aplicação para programadores; como escrever seu primeiro complemento em AutoCAD .NET ; interações com usuário; discussão da estrutura de vários dados DWG"; como adicionar entidades CAD ao banco de dados DWG"; e como percorrer todas as entidades presentes no DWG". About the Speaker: Augusto é membro do time DevTech desde 2008 e trabalha escritório de São Paulo. É especialista nas APIs AutoCAD, Civil3D e Revit. Antes de trabalhar na Autodesk, Augusto trabalhou em projetos CAD para engenharia e comércio eletrônico. É graduado em Engenharia Civil e pós-graduado em Engenharia de Computação. [email protected]

Transcript of 85928213-63687385-Basico-Autocad-Net

Page 1: 85928213-63687385-Basico-Autocad-Net

Conceitos Básicos de AutoCAD® .NET Augusto Gonçalves – Autodesk

CP222-2V Está curioso para saber o que é .NET? Nesta classe iremos apresentar a informação

básica que você precisa para começar a escrever seu próprios aplicativos .NET baseados na interface de programação AutoCAD .NET . Esta classe inclui os seguintes fundamentos: uma revisão do Framework .NET e sua aplicação para programadores; como escrever seu primeiro complemento em AutoCAD .NET ; interações com usuário; discussão da estrutura de vários dados DWG"; como adicionar entidades CAD ao banco de dados DWG"; e como percorrer todas as entidades presentes no DWG".

About the Speaker: Augusto é membro do time DevTech desde 2008 e trabalha escritório de São Paulo. É especialista nas APIs AutoCAD, Civil3D e Revit. Antes de trabalhar na Autodesk, Augusto trabalhou em projetos CAD para engenharia e comércio eletrônico. É graduado em Engenharia Civil e pós-graduado em Engenharia de Computação. [email protected]

Page 2: 85928213-63687385-Basico-Autocad-Net

Conceitos Básicos de AutoCAD® .NET

2

Introdução

No meu trabalho como consultor de desenvolvimento na Autodesk em São Paulo tenho treinado diversos

desenvolvedores nas APIs Autodesk, principalmente AutoCAD. Para esta classe organizei os principais

conceitos e passos necessários para iniciar o desenvolvimento de plugins nas seguintes seções:

Uma revisão da plataforma .NET e seus benefícios

O que é necessário para começar e onde encontrar o material necessário

Como funciona e como criar um primeiro plugin

A estrutura básica do DWG® e como desenhar

Como extrair informação de um desenho

Plataforma .NET

Atualmente a Microsoft vem evoluindo com a plataforma de desenvolvimento .NET, que é considerada a

base padrão para aplicativos para Windows. Inclusive diversos novos recursos e ferramentas já utilizam

.NET. Uma vantagem imediata é que o utilização interna da plataforma ajuda na depuração de erros e

melhoramentos de performance, mas indiretamente aumenta consideravelmente a quantidade de

material avançado na web, assim como a quantidade de pessoas discutindo e trocando informações em

grupos de discussão.

A atual versão 4 do .NET traz uma enorme quantidade de recursos. Apesar de boa parte dos recursos já

estarem disponíveis desde a versão 2, as recentes novidades em interface e performance fazem do

.NET uma plataforma cada vez mais confiável.

Importante: O AutoCAD 2011 foi desenvolvido para o .NET 3.5, desta forma alguns recursos do .NET

4.0 podem não estar disponíveis ou causar conflitos. Mais detalhes serão discutidos a frente.

Comparativamente com outras linguagens, vemos por experiência na prática treinando desenvolvedores

que a curva de aprendizado é considerável. Isso quer dizer que ao compararmos o que novos

desenvolvedores .NET conseguem produzir após nosso treinamento é consideravelmente maior que em

treinamentos com C++. Neste caso a comparação é feita com uma linguagem poderosa, visto que .NET

traz grande poder de programação a um custo de aprendizado relativamente baixo.

Além disso, a mesma linguagem e plataforma .NET pode ser utilizada em outros produtos Autodesk.

Atualmente é possível utilizar o mesmo conhecimento de programação com APIs AutoCAD e verticais

como Map3D, Civil3D, além de Revit, Inventor, Navisworks, dentre outros.

Benefícios da Tecnologia .NET

Um dos grandes benefícios de trabalhar com .NET é a facilidade atrelada com o avançado paradigma de

programação orientado a objetos. Sim, esta maneira de desenvolver também está disponível em outras

linguagens, mas aqui é bastante facilitada. Resumindo em poucas palavras, o desenvolvimento

orientado a objetos permite um alto índice de reuso de código, o que no limite evita o precário ‘copiar &

colar’.

Page 3: 85928213-63687385-Basico-Autocad-Net

Conceitos Básicos de AutoCAD® .NET

3

Nesta classe trabalharemos com VB.NET, mas a tecnologia de linguagem intermediária da plataforma

.NET permite mesclar códigos escritos em outras linguagens, como C# ou mesmo C++. Isto é uma

grande vantagem por permitir que desenvolvedores com diferentes conhecimentos prévios e habilidades

possam trabalhar juntos.

Finalmente, a Microsoft incorporou diversas ferramentas para permitir que o .NET pudesse se comunicar

com linguagens e tecnologias anteriores, tais como COM e C++ nativo. Neste classe não iremos abordar

tais tópicos, mas é importante saber que, quando necessário, podemos acessar recursos nativos do

sistema ainda não disponíveis em .NET.

O que é necessário para começar?

Para desenvolver plugins para AutoCAD com .NET é necessário apenas uma IDE e AutoCAD instalado.

O ambiente de desenvolvimento integrado (do inglês Integrated Development Environment, IDE) oficial

da Microsoft é o Visual Studio. Atualmente a versão mais recente desta IDE é a 2010, mas para

AutoCAD 2011 é recomendada a versão 2008 devido a compatibilidade da versão do .NET.

Dica: Existe um problema conhecido de compatibilidade entre a versão 2011 do AutoCAD com a versão

2010 do Visual Studio. É possível resolver este problema seguindo os passos apresentados neste artigo:

http://through-the-interface.typepad.com/through_the_interface/2010/04/hitting-breakpoints-in-net-class-

libraries-while-debugging-with-visual-studio-2010.html

Nesta classe utilizaremos a linguagem Visual Basic .NET, juntamente com a versão gratuita do Visual

Studio, chamada de Visual Basic Express Edition. Esta plataforma pode ser descarregada de

http://www.microsoft.com/express/vb/. Atualmente estão disponíveis as versões 2008 e 2010.

O AutoCAD instalado é necessário para obter a referencia, ou seja, ligação entre nosso código e a

plataforma AutoCAD, mas também para permitir a execução, teste e depuração do código. É possível

compilar o código sem esta instalação utilizando as referencias do pacote ObjectARX, disponível em

http://www.objectarx.com.

O pacote ObjectARX ainda contém outros materiais de ajuda. Para treinamento em .NET é relevante a

arquivo de ajuda \Help\arxmgd.dll e os exemplos dentro da pasta \Samples\dotNET. Além destes, as

DLLs de referencia estão na pasta \inc.

Como funciona um plugin para AutoCAD?

A arquitetura de plugin para AutoCAD é similar a outros aplicativos, Autodesk ou de outras companhias.

O código escrito em uma linguagem .NET, neste caso VB.NET, é agrupado em um projeto e referencia

as DLLs do aplicativo base (AutoCAD). Um projeto é uma unidade de organização do Visual Studio e

todo o código de um projeto produz uma DLL. O processo de gerar uma DLL a partir do código de um

projeto é chamado de compilação. No linguajar de desenvolvedores .NET, uma DLL também é chamada

de assembly.

Finalmente, o código escrito e compilado em .NET que referencia as DLLs necessárias é carregado e se

integra ao AutoCAD. Esta integração é tão forte que diversos recursos nativos do .NET estão disponíveis

Page 4: 85928213-63687385-Basico-Autocad-Net

Conceitos Básicos de AutoCAD® .NET

4

de forma bastante transparente para desenvolvimento de plugins. A figura abaixo apresenta uma visão

geral desta arquitetura.

Um ponto importante desta arquitetura, que também é um erro comum, é que sempre temos que abrir o

projeto (arquivo .vbproj) no Visual Basic Express. Comumente vemos desenvolvedores abrindo

erroneamente os arquivos .vb e tentando escrever e compilar o código, mas não é a maneira correta. A

partir da próxima seção trabalharemos em mais detalhes como criar um plugin.

Primeiro plugin .NET

Os passos para criar um primeiro plugin para AutoCAD são:

1. Iniciar o Visual Basic Express e criar um novo projeto. Este projeto deve ser uma Class Library.

Este tipo de projeto irá produzir uma DLL, ou assembly, o que funciona como uma extensão ao

aplicativo base, neste caso AutoCAD. Também é possível criar plugins como executáveis,

extensão.exe, mas para tal é necessário utilizar a API COM, que não será trabalhada nesta

classe.

Page 5: 85928213-63687385-Basico-Autocad-Net

Conceitos Básicos de AutoCAD® .NET

5

2. Para começar a escrever código para um plugin AutoCAD é necessário adicionar referencias as

DLLs AcMdg e AcDbMgd. A primeira permite acesso aos recursos de interface, ou seja, a

aplicação acad.exe em execução. A segunda dá acesso à base de dados do AutoCAD, que será

o(s) arquivo(s) DWG em execução. O desenvolvimento de plugin com uma instalação do

AutoCAD não permite acessar a API sem uma instancia do AutoCAD (acad.exe) em execução.

Para execução independente é necessário utilizar RealDWG, para mais detalhes visite

http://usa.autodesk.com/adsk/servlet/index?siteID=123112&id=770257

Para adicionar as referências, clique com o botão direto no nome do projeto, depois acesse Add

Reference.

Em seguida localize a pasta do ObjectARX 2011\inc e selecione AcMgd.dll e AcDbMgd.dll e

clique OK.

Page 6: 85928213-63687385-Basico-Autocad-Net

Conceitos Básicos de AutoCAD® .NET

6

É muito importante marcar as referências como Copy Local igual a falso. Isso irá evitar a cópia

desnecessária destas DLLs para a pasta do projeto, assim como erros de execução ou

depuração. Para tal, acesse as propriedades do projeto, em seguida a aba References, marque

as novas referências e na paleta propriedades marque Copy Local como False.

Estes são os passos necessários para qualquer novo plugin para AutoCAD. Os próximos passos

são específicos para este exemplo.

3. Um novo projeto criar em .NET automaticamente contêm uma Class1. Como vamos utilizar

recursos da API AutoCAD, podemos evitar digitar o nome completo das classes importando os

conjuntos de classes, através de imports.

Para um comando para o AutoCAD é necessário criar uma rotina, ou sub-rotina. Não é possível

utilizar function para comandos. Esta sub deve ser publica, marcada como tal através da palavra

chave Public. Finalmente a rotina é marcada com um atributo CommandMethod. O valor dentro

deste atributo é o que o usuário irá digitar na linha de comando do AutoCAD para executar a

rotina, neste caso ‘meuComando’ irá executar a rotina ‘minhaRotina’. Observe que estes nomes

não precisam ser iguais.

Quase todos os comandos de interação com usuário necessitam utilizar o Editor, que é a linha

de comando do AutoCAD. Finalmente podemos escrever uma mensagem com WriteMessage.

Imports Autodesk.AutoCAD.Runtime

Imports Autodesk.AutoCAD.EditorInput

Imports Autodesk.AutoCAD.ApplicationServices

Public Class Class1

<CommandMethod("meuComando")> _

Public Sub minhaRotina()

'Acessar o editor do AutoCAD

'(linha de comando)

Dim ed As Editor = Application.DocumentManager. _

MdiActiveDocument.Editor

'Escrever uma mensagem

ed.WriteMessage("Meu primeiro comando")

End Sub

End Class

Page 7: 85928213-63687385-Basico-Autocad-Net

Conceitos Básicos de AutoCAD® .NET

7

4. Após escrever o código, é necessário compilar para gerar um assembly (DLL). Acesse o menu

Build e escolha Build NOME_DO_PROJETO. Agora basta iniciar o AutoCAD e execute o

comando NETLOAD para carregar a DLL e finalmente executar o comando criado, neste caso

‘meuComando’.

Interação com o usuário

A primeira etapa para interação com o usuário consiste em obter informação. Em geral um ponto,

numero ou texto, ou mesmo selecionar algo na tela. Para todos estes casos é necessário utilizar o Editor

e passar as opções de prompt.

Em geral utiliza-se um PromptXXXXOptions para configurar as opções, como mensagens e restrições da

entrada de dados, onde XXXX representa o que desejamos obter. Estas opções são passadas a linha de

comando através de Editor.GetXXXX, o que retorna um objeto do tipo PromptXXXXResult. O exemplo

abaixo mostra como configurar as opções para selecionar um ponto, pede ao usuário para selecionar o

ponto e finalmente escreve as coordenadas (X, Y e Z) na linha de comando.

'Opções de seleção de um ponto

Dim opcoesPonto As New PromptPointOptions("Selecione um ponto: ")

'Para para o editor - que irá pedir ao

'usuário - e guardar o resultado

Dim resultadoPonto As PromptPointResult = ed.GetPoint(opcoesPonto)

'Acessar o ponto clicado

Dim pontoClicado As Point3d = resultadoPonto.Value

'Escrever o resultado na tela

ed.WriteMessage(pontoClicado.ToString)

A entrada de outros tipos de dados, inclusive seleção do usuário, segue a mesma sequência. Embora

seja possível suprimir a configuração das opções passando a mensagem diretamente ao

Editor.GetXXXX, a abordagem mais comum é configurar melhor as opções para evitar entradas

inválidas.

Visão geral da estrutura de banco de dados

O banco de dados do AutoCAD é a representação em memória de um arquivo DWG. De fato cada

arquivo é expandido em memória para esta estrutura hierárquica de tabelas, das quais as mais utilizadas

são a tabela de blocos (BlockTable) e a tabela de camadas (LayerTable). Ainda existem outras tabelas,

conforme apresentado na figura abaixo, alem de dicionários que são utilizados para armazenar

informações não gráficas, tanto nativas do AutoCAD quanto personalizadas.

Um dos conceitos mais importantes desta visão geral é que todos os espaços de desenho e definições

de blocos são registros na tabela de blocos (BlockTableRecord). Isso que dizer que o tanto o model

space, quanto os layouts (paper spaces), quando a definição de blocos criados, são armazenados em

como records na tabela de blocos, ou seja, BlockTableRecord.

Page 8: 85928213-63687385-Basico-Autocad-Net

Conceitos Básicos de AutoCAD® .NET

8

Visto que tanto o model space quanto os layouts (paper spaces) quanto as definições de bloco são

BlockTableRecord, a maneira de desenhar alguma coisa é a mesma para todos os casos. Tecnicamente,

a ação de desenhar é adicionar uma entidade gráfica a um BlockTableRecord. Seguindo o conceito de

hierarquia, podemos adicionar qualquer classe derivada de Entity ao bando de dados, e existem diversas

classes que podemos adicionar como linhas, textos ou círculos. A figura abaixo resume esta hierarquia.

Para realizar qualquer operação que modifica a base de dados do desenho é necessário iniciar uma

transação, que é a maneira padrão. A transação representa o limite para uma operação, e quanto esta

Page 9: 85928213-63687385-Basico-Autocad-Net

Conceitos Básicos de AutoCAD® .NET

9

transação é finalizada é possível guardar ou descartar as modificações feitas. Ao final cada transação

representará uma opção de desfazer (undo) no AutoCAD. Duas coisas são muito importantes quando

lidamos com transações: (1) é necessário descartar o objeto de transação ao final do processo e (2)

qualquer entidade adicionada à base de dados deve ser informada a transação.

Para evitar esquecer-se de descartar a transação é recomendado sempre utilizar a palavra chave using.

Desta maneira o próprio mecanismo do .NET cuidará de descartar o objeto. Já para informar novos

objetos adicionados é necessário chamar AddNewlyCreatedDBObject, caso contrário o objeto

permanecerá aberto e conseqüentemente a visualização do desenho ficará comprometida.

O código exemplo a seguir acessar a base de dados ativa, ou seja o documento aberto no AutoCAD,

inicia uma transação, acessar o espaço ativo que geralmente é o model space, cria uma nova linha

desde o ponto 0,0,0 até o ponto 10,10,0, adiciona este linha ao espaço corrent, informa a transação

desta nova entidade e finalmente confirma as alterações com um commit.

'Acessar o banco de dados do desenho aberto no AutoCAD

Dim db As Database = Application.DocumentManager.MdiActiveDocument.Database

'Iniciar uma transção

Using trans As Transaction = db.TransactionManager.StartTransaction

'Abrir o Model Space

Dim modelSpace As BlockTableRecord = _

trans.GetObject(db.CurrentSpaceId, OpenMode.ForWrite)

'Criar uma nova linha

Dim novaLinha As New Line(New Point3d(0, 0, 0), New Point3d(10, 10, 0))

'Adicionar ao Model Space

modelSpace.AppendEntity(novaLinha)

'É necessário informar a transação

trans.AddNewlyCreatedDBObject(novaLinha, True)

'Confirmar a transação

trans.Commit()

End Using 'Fecha a transação

Percorrer a base dados

Após adicionar entidades ao banco de dados, outra operação comum é ler as informações do desenho.

Em geral esta operação consiste em abrir o desenho e percorrer cada entidade e, conforme o tipo desta

entidade, ler um determinado conjunto de informações. Para tal, assim como para adicionar entidades, é

necessário acessar o bando de dados ativo e iniciar uma transação. As transações devem ser utilizadas

tanto para modificação quanto para apenas leitura, e alem disso utilizar um commit ao final da transação

tem melhor performance que abortar, o que é o padrão.

Sempre que acessamos a base de dados estamos acessando o identificador deste objeto. O ObjectId é

um identificador único de cada entidade da base de dados. Como não é possível acessar um objeto de

Page 10: 85928213-63687385-Basico-Autocad-Net

Conceitos Básicos de AutoCAD® .NET

10

base de dados diretamente, as coleções de entidades como model space contêm a lista de objetId das

entidades. Ou seja, ao percorrer todas as entidades estamos de fato percorrendo uma lista de objectIds.

Desta forma é necessário abrir cada entidade.

Tudo que é gráfico no desenho é derivado de Entity, então é necessário verificar o tipo específico de

cada entidade utilizando a palavra chave TypeOf do Visual Basic .NET. Desta forma podemos converter

o objeto ao tipo correto e ler os dados específicos, o que no caso da linha são o ponto inicial e final.

Outros tipos de entidade têm outros tipos de informações.

'Acessar o editor do AutoCAD

Dim ed As Editor = Application.DocumentManager.MdiActiveDocument.Editor

'Acessar o banco de dados do desenho aberto no AutoCAD

Dim db As Database = Application.DocumentManager.MdiActiveDocument.Database

'Iniciar uma transção

Using trans As Transaction = db.TransactionManager.StartTransaction

'Abrir o Model Space

Dim modelSpace As BlockTableRecord = _

trans.GetObject(db.CurrentSpaceId, OpenMode.ForWrite)

'Para cada ObjectId de entidade no model space...

For Each idEntidade As ObjectId In modelSpace

'...vamos abrir a entidade

Dim entidade As Entity = trans.GetObject(idEntidade, OpenMode.ForRead)

'Verificar o Tipo

If TypeOf entidade Is Line Then

'É uma linha!

Dim linha As Line = entidade

'Escrever informações na tela

ed.WriteMessage("Linha começando em {0} mede {1}", _

linha.StartPoint, linha.Length)

End If

Next

'Confirmar a transação

trans.Commit()

End Using 'Fecha a transação

Material Adicional

Para continuar o estudo da API AutoCAD .NET temos alguns materiais disponíveis online. Abaixo uma

lista dos principais.

Through the Interface blog

http://through-the-interface.typepad.com

AutoCAD.NET Developer’s Guide

http://www.autodesk.com/autocad-net-developers-guide

Grupos de Discussão

http://discussion.autodesk.com/forums/category.jspa?categoryID=8

Autodesk Developer Network

http://www.autodesk.com/joinadn

Page 11: 85928213-63687385-Basico-Autocad-Net

Conceitos Básicos de AutoCAD® .NET

11

Oferecemos diversos treinamentos de API Autodesk em nosso escritório de São Paulo, assim como

eventualmente em outros locais pelo Brasil. Visite o nosso site em www.autodesk.com/apitraining e

escolha Schedule para uma lista completa e inscrições. Vários treinamentos são em Português e

eventualmente em Inglês.

Conclusão

Obrigado por participar deste treinamento de API AutoCAD.NET. Espero que tenha gostado e se

interessado por esta poderosa ferramenta para automação e modificação do AutoCAD.

Com esta classe vimos como iniciar um projeto de addin e configurá-lo para AutoCAD, assim como

interagir com usuário e mostrar mensagens na linha de comando. Por fim vimos como percorrer a base

de dados para extrair informação do desenho.

Agora o próximo passo é acessar um treinamento online desta API ou no nosso escritório. Aguardo você

e boa trabalho com desenvolvimento para AutoCAD.