[CommandMethod("DrawCircleOnFace")]
public static void DrawCircleOnFace()
{
var doc = Application.DocumentManager.MdiActiveDocument;
var db = doc.Database;
var ed = doc.Editor;
// Select a sub entity of a solid 3d
var options
= new PromptSelectionOptions
(); options.MessageForAdding = "\nSelect face of a solid";
options.SingleOnly = true;
options.SinglePickInSpace = true;
options.ForceSubSelections = true;
var filter
= new SelectionFilter
(new[] { new TypedValue
(0,
"3DSOLID") }); var result = ed.GetSelection(options, filter);
if (result.Status != PromptStatus.OK)
{
return;
}
var selectedObject = result.Value[0];
var subSelectedObject = selectedObject.GetSubentities()[0];
var subEntityType = subSelectedObject.FullSubentityPath.SubentId.Type;
// Check if the sub entity is a face
if (subEntityType != SubentityType.Face)
{
ed.WriteMessage($"\nSelected sub-entity is not a Face ({subEntityType})");
return;
}
using (var tr = db.TransactionManager.StartTransaction())
{
var solidId = selectedObject.ObjectId;
var solid = (Solid3d)tr.GetObject(solidId, OpenMode.ForRead);
var subentityId = subSelectedObject.FullSubentityPath.SubentId;
var facePath
= new FullSubentityPath
(new[] { solid
.ObjectId }, subentityId
); var entityPath
= new FullSubentityPath
(new[] { solid
.ObjectId },
new SubentityId
(SubentityType
.Null, IntPtr
.Zero)); using (var brep
= new Brep
(entityPath
)) {
var face = brep.Faces.First(f => f.SubentityPath == facePath);
// Check if the face is planar
var boundedSurface = (ExternalBoundedSurface)face.Surface;
if (!boundedSurface.IsPlane)
{
ed.WriteMessage($"\nSelected Face is not planar");
return;
}
var plane = (Plane)boundedSurface.BaseSurface;
var faceCoordinateSystem = Matrix3d.PlaneToWorld(plane);
var circle
= new Circle
(Point3d
.Origin, Vector3d
.ZAxis,
0.5); circle.TransformBy(faceCoordinateSystem);
var curSpace = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
curSpace.AppendEntity(circle);
tr.AddNewlyCreatedDBObject(circle, true);
}
tr.Commit();
}
}