using System;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.BoundaryRepresentation;
// This line is not mandatory, but improves loading performances
[assembly
: CommandClass
(typeof(GetSweepAxis
.MyCommands))]
namespace GetSweepAxis
{
public class MyCommands
{
[CommandMethod("FindCylinderAxis")]
public void FindCylinderAxis()
{
Document doc = Application.DocumentManager.MdiActiveDocument;
Editor ed = doc.Editor;
PromptEntityOptions peo
= new PromptEntityOptions
("Pick a 3DSOLID: "); peo.SetRejectMessage("\nA 3d solid must be selected.");
peo
.AddAllowedClass(typeof(Autodesk
.AutoCAD.DatabaseServices.Solid3d),
true); PromptEntityResult per = ed.GetEntity(peo);
if (per.Status != PromptStatus.OK)
return;
using (Transaction tr = doc.Database.TransactionManager.StartTransaction())
{
Solid3d sld = tr.GetObject(per.ObjectId, OpenMode.ForRead, false) as Solid3d;
Point3d axisPt1 = Point3d.Origin;
Point3d axisPt2 = Point3d.Origin;
Point3dCollection pts
= new Point3dCollection
(); if (GetCylinderAxis(sld, ref pts))
{
for (int i = 0; i < pts.Count; i++)
{
ed.WriteMessage("\nPt[{0}] = {1}", i, pts[i]);
}
}
else
{
ed.WriteMessage("\nNot a sweeped solid");
}
tr.Commit();
}
}
private bool GetCylinderAxis(Solid3d solid, ref Point3dCollection pts)
{
using (Brep brep
= new Brep
(solid
)) {
BrepEdgeCollection edges = brep.Edges;
foreach (Edge edge in edges)
{
Curve3d curv = ((ExternalCurve3d)edge.Curve).NativeCurve;
if (curv
is CircularArc3d
) {
CircularArc3d circle = curv as CircularArc3d;
if (!pts.Contains(circle.Center)) pts.Add(circle.Center);
}
else if (curv
is EllipticalArc3d
) {
EllipticalArc3d circle = curv as EllipticalArc3d;
if (!pts.Contains(circle.Center)) pts.Add(circle.Center);
}
}
}
return (pts.Count > 1) ? true : false;
}
}
}