1 Attachment(s)
Exemplos AutoCAD.NET com C#
Olá,
Neste Thread vou enviar alguns exemplos de rotinas que vou criando para aprender AutoCAD.NET e C#, espero encorajar todos os outros que estejam interessados nesta tecnologia em enviar tambem exemplos, podem ser exemplos criados pelos próprios ou exemplos que encontrem noutros sitios.
O exemplo que vou enviar hoje demonstra a selecção de uma entidade através dos "SelectionSet", este exemplo é basedo nos exemplos do Kean Walmsley http://through-the-interface.typepad.com.
O IDE utilizado foi o SharpDevelop 2.1http://www.sharpdevelop.net/OpenSource/SD/Download/ e o .NET Framework SDK 2.0 http://www.microsoft.com/downloads/d...displaylang=en.
Criem uma nova solução no sharpdevelop do tipo Class Library (para criar um dll) copiem o código aqui indicado para o ficheiro criado e para compilar o código têm que acrescentar ao projecto duas referências, C:\Program Files\AutoCAD 2008\acdbmgd.dll e C:\Program Files\AutoCAD 2008\acmgd.dll.
Depois de compilado podem carregar no AutoCAD através de NETLOAD o dll criado pelo compilador e executar o comando "SINGLEPICK".
Code:
using System;
using System.Collections;
using System.Collections.Generic;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;
namespace singlePick
{
public class singlePick
{
[CommandMethod("SINGLEPICK")]//Exemplo de selecção de uma entidade através dos "SelectionSet".
public void singlepick()
{
//Setup
Document doc = Application.DocumentManager.MdiActiveDocument;//1º Abrimos o documento activo e passamo-lo para a variável "doc" que é do tipo "Document".
Editor ed = doc.Editor;//2º Abrimos o editor do documento actual e passamo-lo para a variável "ed" que é do tipo Editor.
Database db = doc.Database;//3º Abrimos a base de dados do documento actual e passamo-lo para a variável "db" que é do tipo Database.
/*
* A classe "Database" representa o ficheiro do desenho AutoCAD, cada
* objecto "Database" contêm as várias variáveis de cabeçalho "header variables",
* Tabelas de simbolos "Symbol tables", "Table Records", entidades e objectos que
* são o que fazem um desenho. Esta classe contem funções que permitem o acesso a
* todos os "Symbol Tables", a ler e a escrever um ficheiro DWG, a aceder e a modificar
* os defaults da base de dados, a executar várias operações ao nivel da base de dados
* tais como "wblock" e "deepCloneObjects", e a aceder e modificar todas as variáveis de cabeçalho "header variables".
*/
//Opções para a selecção de uma unica entidade com selection sets
PromptSelectionOptions Opso = new PromptSelectionOptions();//Opso é um novo objecto do tipo "PromptSelectionOptions"
Opso.SingleOnly = true;//A propriedade "SingleOnly" indica se a selecção é feita só para uma entidade ou não, é do tipo boolean.
Opso.MessageForAdding = "\nSelect a single entity: ";
PromptSelectionResult psr = ed.GetSelection(Opso);
if(psr.Status == PromptStatus.Error)
{
return;
}
SelectionSet ss = psr.Value;//O resultado da selecção unica que está na variável "psr" é passado para uma variável "ss" do tipo "SelectionSet".
ObjectId[] idarray = ss.GetObjectIds();//Passamos agora o "Object Id" do objecto seleccionado para uma variável "idarray" do tipo ObjectId[], sendo esta um array de ObjectId's.
Transaction tr = db.TransactionManager.StartTransaction();//Damos incio ás transacções com a base de dados actual do documento AutoCAD
/*
* A partir do momento que começamos as Transacções com a base de dados podemos começar a alterar e a ler os objectos do desenho
* no final de todas as operações temos que terminar as transações o que neste caso será com o método "tr.Commit()" se as Transações
* não forem fechadas ou se usar o método "tr.Abort()" todas as alterações que efectuamos não serão gravadas na base de dados.
* A utilização do método "Abort()" é útil quando se quer abortar as operações efectuadas por um qualquer erro ou porque o
* utilizador decidiu cancelar as operações que estava a efectuar.
*/
using(tr)
{
foreach(ObjectId objid in idarray)
{
DBObject obj = tr.GetObject(objid, OpenMode.ForWrite, true);//Recolhemos o objecto que foi passado do array de ObjectID[] e abrimo-lo no modo de escrita.
Entity entity = (Entity) obj;//Aqui fazemos uma conversão explicita de obj que é um objecto do tipo DBObject para uma classe Entity que deriva da classe DBOject.
ed.WriteMessage("\nYou Selected: {0}", entity.GetType().FullName);//Aqui escrevemos na linha de comandos o tipo de entidade seleccionada.
}
tr.Commit();//Aqui Terminamos as nossas transacções.
}
}
}
}
Junto segue tambem apenas o dll já compilado que podem testar no AutoCAD.
NETLOAD->Carregar o dll singlepick.dll->executar o comando "singlepick".
Obrigado
RE: Exemplos AutoCAD.NET com C#
Apenas para informação, o comando NETLOAD não existe no AutoCAD LT!
1 Attachment(s)
RE: Exemplos AutoCAD.NET com C#
Olá a Todos.
Aqui vai mais um exemplo, este mostra como determinar o ponto de intersecção entre dois objectos no AutoCAD.
Gostava que aqueles que percebem "disto", fossem dando dicas e que fizessem observações sobre aquilo que digo nos comentários e aquilo que escrevo no código, pois não sou especialista em programação e muito menos em C# e AutoCAD.NET, e esses comentários seriam para mim muito úteis pois iria aprendendo mais depressa e tambem todos os outros que estiverem interessados no AutoCAD.NET.
E já agora enviem tambem os vossos exemplos! :-)
Code:
using System;
using System.Collections.Generic;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.Geometry;
namespace IntersectionPoint
{
public class IntersectionPoint
{
[CommandMethod("IP")]//Exemplo para a determinação do ponto de intersecção entre duas entidades.
public void intersectAtPoint()
{
Document doc = Application.DocumentManager.MdiActiveDocument;//1º Abrimos o documento activo e passamo-lo para a variável "doc" que é do tipo "Document".
Editor ed = doc.Editor;//2º Abrimos o editor do documento actual e passamo-lo para a variável "ed" que é do tipo Editor.
Database db = doc.Database;//3º Abrimos a base de dados do documento actual e passamo-lo para a variável "db" que é do tipo Database.
//Primeira entidade
PromptEntityOptions firstEnt = new PromptEntityOptions("\nSelect the first entity: ");//Pedimos ao utilizador para seleccionar a primeira entidade
PromptEntityResult firstper = ed.GetEntity(firstEnt);//Recolhemos a primeira Entidade
if(firstper.Status == PromptStatus.Error)//Verificamos se é válida a selecção
{
return;
}
ObjectId firstobjid = firstper.ObjectId;//Obtemos o ObjectId da entidade seleccionada, pois é com o ObjectId que podemos recolher o objecto que queremos manipular.
//Segunda entidade
PromptEntityOptions secEnt = new PromptEntityOptions("\nSelect the second entity: ");//Pedimos ao utilizador para seleccionar a segunda entidade
PromptEntityResult secper = ed.GetEntity(secEnt);//Recolhemos a segunda Entidade
if(secper.Status == PromptStatus.Error)//Verificamos se é válida a selecção
{
return;
}
ObjectId secobjid = secper.ObjectId;//Obtemos o ObjectId
Point3dCollection pt3dcoll = new Point3dCollection();//Colecção de pontos a ser preenchido pelo método IntersectWith()
Plane sourcePlane = new Plane();//Plano a usar no método IntersectWith()
Transaction tr = db.TransactionManager.StartTransaction();//Damos inicio ás transacções
using(tr)
{
DBObject firstobj = tr.GetObject(firstobjid, OpenMode.ForWrite, true);//Abrimos o primeiro objecto no modo de escrita
Entity firstentity = (Entity) firstobj;
DBObject secobj = tr.GetObject(secobjid, OpenMode.ForWrite, true);//Abrimos o segundo objecto no modo de escrita
Entity secentity = (Entity) secobj;
firstentity.IntersectWith(secentity, Intersect.ExtendBoth, sourcePlane, pt3dcoll, 0, 0);//Atenção á opção Intersect.ExtendBoth
if(pt3dcoll.Count == 0)//Teste ao objecto pt3dcoll
{
return;
}
//Point3d pt3d = pt3dcoll[i];
foreach (Point3d pt3d in pt3dcoll)
{
ed.WriteMessage("\nPoint real coordinates : {0}", pt3d);//Escrevemos os resultados na linha de comando, sem arredondamentos
ed.WriteMessage("\nPoint Round coordinates : {0},{1},{2}", Math.Round(pt3d.X, 2), Math.Round(pt3d.Y, 2), Math.Round(pt3d.Z, 2));//Escrevemos os resultados na linha de comando, com arredondamentos
}
tr.Commit();//Terminamos as nossas transacções
}
}
}
}
E aqui vai o tambem o dll. O nome do comando é IP .
Cumprimentos
Re: Exemplos AutoCAD.NET com C#
Olá PFerreira, estou estudando o uso do c# com o autocad e gostaria de uma dica sua.
Tenho a necessidade de atribuir códigos a entidades polylines em meu desenho, e posteriormente selecioná-las através destes códigos, existe um meio de fazer isso?
Estou lendo o guia de referência do autocad.net, mas não acho nada a respeito.
Obrigado.
Rodrigo
Re: Exemplos AutoCAD.NET com C#
Olá,
Também estou iniciando no mundo da Programação em C#.
Estou com dificuldades de achar materiais a respeito de programação como por exemplo todas as bibliotecas disponíveis, exemplos, help e tutoriais. Uso dos forms do C# dentro do Autocad.
Até o momento, achei um material da própria Autodesk :
http://docs.autodesk.com/ACD/2010/ENU/AutoCAD%20.NET%20Developer's%20Guide/index.html
Tem me ajudado um pouco, mas ainda acho bem melhor ver exemplos de códigos de outros desenvolvedores.
Vou postar aqui mesmo o que encontrar.. Abraços a todos,
Re: Exemplos AutoCAD.NET com C#
Olá,
Após muita batalha consegui fazer um Form C# rodar dentro do CAD.
Não achei a coisa simples e espero poder compartilhar o pouco que sei e trocar informações com quem está com as mesmas dificuldades.
Resolvi criar um Blog até para servir como Guia próprio e não me perder nesse mundo de bibliotecas e classes...
Link : http://alefujita.blogspot.com/2010/08/bem-vindo.html
Abraços a Todos,
AleFujita
Re: Exemplos AutoCAD.NET com C#
Caros,
Sei que esse post é antigo, mas gostaria de dizer que, até agora, minha experiência com a API do AutoCAD foi bem positiva. Eu já tinha experiência com C#, e achei bem mais tranquilo do que mexer diretamente com o LISP, que era o que eu estava fazendo antes de descobrir o ObjectARX.
De qualquer forma, eu escrevi (e ainda escrevo) uma série de posts a respeito do AutoCAD. Vi que alguns tiveram dificuldades em instanciar forms. Acho que mudaram a maneira de fazer isto, pois é bem fácil. Eu espero escrever sobre este assunto em um futuro próximo.
Bem, sem mais delongas, eis o link para o blog: http://blog.creactive.com.br/
Espero que gostem.
Abraços
Re: Exemplos AutoCAD.NET com C#
Pessoal, estou entrando agora nesta área de fazer rotinas em c# para autocad, conheço lisp e c# , e trabalho com autocad, mas preciso fazer algumas rotinas , e acho melhor fazer em C# , preciso de dicas, se puderem me ajudar.
desde já agradeço
Re: Exemplos AutoCAD.NET com C#
Ainda estão com pensamento de criar sala de aula referente programação c# para Auto CAD ?
cyberlacs@gmail.com