85928213-63687385-Basico-Autocad-Net
-
Upload
luiz-silva -
Category
Documents
-
view
4 -
download
1
Transcript of 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]
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’.
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
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.
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.
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
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.
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
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
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
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.