See the top rated post in this thread. Click here

Results 1 to 8 of 8

Thread: Exemplos AutoCAD.NET com C#

  1. #1
    Active Member pferreira's Avatar
    Join Date
    2006-06
    Location
    Lisbon, Portugal
    Posts
    88


    1 members found this post helpful.

    Lightbulb 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
    Attached Files Attached Files
    Pedro Ferreira
    Senior CAD Drafter at ATKINS Portugal
    www.wsatkins.pt

  2. #2
    Active Member pferreira's Avatar
    Join Date
    2006-06
    Location
    Lisbon, Portugal
    Posts
    88


    Default Re: Exemplos AutoCAD.NET com C#

    Apenas para informação, o comando NETLOAD não existe no AutoCAD LT!
    Pedro Ferreira
    Senior CAD Drafter at ATKINS Portugal
    www.wsatkins.pt

  3. #3
    Active Member pferreira's Avatar
    Join Date
    2006-06
    Location
    Lisbon, Portugal
    Posts
    88


    Default 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
    Attached Files Attached Files
    Pedro Ferreira
    Senior CAD Drafter at ATKINS Portugal
    www.wsatkins.pt

  4. #4
    Member
    Join Date
    2010-05
    Posts
    5


    Smile 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

  5. #5
    Member
    Join Date
    2007-07
    Posts
    19


    Smile 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,

  6. #6
    Member
    Join Date
    2007-07
    Posts
    19


    Default 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

  7. #7
    Woo! Hoo! my 1st post
    Join Date
    2013-11
    Posts
    1


    Default 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

  8. #8
    Woo! Hoo! my 1st post
    Join Date
    2017-06
    Posts
    1


    Default 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

Similar Threads

  1. 2012: Problems in autocad 2012 when opening files from autocad 2011 saved as 2000
    By debora.fernandes in forum AutoCAD General
    Replies: 13
    Last Post: 2012-06-30, 02:12 PM
  2. Replies: 15
    Last Post: 2010-09-23, 01:57 PM
  3. Replies: 6
    Last Post: 2009-06-01, 07:10 AM
  4. Replies: 3
    Last Post: 2007-09-07, 04:36 PM
  5. AutoCAD 2002 - Function / Tool that edits AutoCAD command quick keys
    By stevejlipski in forum AutoCAD Customization
    Replies: 3
    Last Post: 2007-01-02, 12:07 AM

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •