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