我试图找到扫过的折线的顶点。
所以我有一个实体,它是通过沿3D折线扫一圈而创建的。
看起来像这样:image of sweeped solid
上周整个星期五,我觉得我必须处理实体问题。例如,我发现了如何更改子实体边缘的颜色,但由于基督而无法找到如何访问几何体的颜色
到目前为止,这是我尝试过的方法,但是正如我在底部指出的那样,我有点迷失了:
[CommandMethod("SubEntExample")]
public void SubEntExample()
{
Document doc = Application.DocumentManager.MdiActiveDocument;
Database db = doc.Database;
Editor ed = doc.Editor;
PromptEntityOptions peo = new PromptEntityOptions("\nSelect a 3D solid: ");
peo.SetRejectMessage("\nInvalid selection...");
peo.AddAllowedClass(typeof(Solid3d), true);
PromptEntityResult per = ed.GetEntity(peo);
if (per.Status != PromptStatus.OK)
return;
using (Transaction Tx = db.TransactionManager.StartTransaction())
{
Solid3d solid = Tx.GetObject(per.ObjectId, OpenMode.ForWrite) as Solid3d;
ObjectId[] ids = new ObjectId[] { per.ObjectId };
FullSubentityPath path = new FullSubentityPath(ids, new SubentityId(SubentityType.Null, IntPtr.Zero));
List<SubentityId> subEntIds = new List<SubentityId>();
using (Autodesk.AutoCAD.BoundaryRepresentation.Brep brep =
new Autodesk.AutoCAD.BoundaryRepresentation.Brep(path))
{
foreach (Autodesk.AutoCAD.BoundaryRepresentation.Edge edge in brep.Edges)
{
subEntIds.Add(edge.SubentityPath.SubentId);
}
}
foreach (SubentityId subentId in subEntIds)
{
*** here i am lost ***
}
Tx.Commit();
}
}
最佳答案
我的第一个解决方案是获取所有相关信息并做出决定,但是感谢互联网的帮助(:))我想出了一种更好的解决方案
/// <summary>
/// Checks if there are boundaryreps that are marked as elliptical or circular arcs
/// returns true if we found at least 2 of those points
/// also stores the points in a referenced Point3dCollection
/// </summary>
/// <param name="solid"></param>
/// <param name="pts"></param>
/// <returns></returns>
private bool GetSweepPathPoints(Solid3d solid, ref Point3dCollection pts)
{
// create boundary rep for the solid
using (Brep brep = new Brep(solid))
{
// get edges of the boundary rep
BrepEdgeCollection edges = brep.Edges;
foreach (Edge edge in edges)
{
// get the nativ curve geometry of the edges and then
// check if it is a circle
// for more info look at:
// http://adndevblog.typepad.com/autocad/2012/08/retrieving-native-curve-geometry-using-brep-api.html
Curve3d curv = ((ExternalCurve3d)edge.Curve).NativeCurve;
if (curv is CircularArc3d)
{
// transform curved arch into circle and add it to the colecction
// (if not in it alreadz)
CircularArc3d circle = curv as CircularArc3d;
if (!pts.Contains(circle.Center)) pts.Add(circle.Center);
}
}
}
return (pts.Count > 1) ? true : false;
}
我会以以下方式称呼整个事情
Point3dCollection pts = new Point3dCollection();
// only do the whole thing if we face a swept solid
if (GetSweepPathPoints(sld, ref pts))
{
for (int i = 0; i < pts.Count; i++)
{
ed.WriteMessage("\nPt[{0}] = {1}", i, pts[i]);
}
}
关于c# - 在AutoCAD中获取实体的子实体顶点,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40339131/