Как получить 3D-полилинию, по которой получается тело сдвига
Вопрос: Имеется труба - твердое тело, полученной сдвигом круга (Circle) по траектории, образованной 3D-полилинией (3DPoly). Как получить вершины 3D-полилинии?
Ответ: Вариантов решения этой задачи несколько:
1) Использование метода GetGripPoints. Для тела у которого не очищена история редактирования если пропустить первые четыре ручки, то мы получим вершины 3D-полилинии. Но если история очищена, то получить вершины таким образом не получится, так как расположение ручек совсем другое:
2) Использовать BREP .NET API для получения информации о вершинах.
Второй вариант мы и рассмотрим, так как он более универсальный. Нам следует получить все ребра (Edge) твердого тела, выделить из них круглые (CircularArc3d) и эллиптические (EllipticalArc3d) и найти их центры.
Вот пример кода:
- 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;
- [assembly: CommandClass(typeof(GetSweepAxis.MyCommands))]
- namespace GetSweepAxis
- {
- public class MyCommands
- {
- [CommandMethod("FindSweepAxis")]
- public void FindCylinderAxis()
- {
- Document doc = Application.DocumentManager.MdiActiveDocument;
- Editor ed = doc.Editor;
- PromptEntityOptions peo =
- new PromptEntityOptions("\nУкажите твердое тело: ");
- peo.SetRejectMessage("\nЭто не твердое тело.");
- 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;
- Point3dCollection pts = new Point3dCollection();
- if (GetCylinderAxis(sld, ref pts))
- {
- for (int i = 0; i < pts.Count; i++)
- {
- ed.WriteMessage("\nВершина N{0} = {1}", i, pts[i]);
- }
- }
- else
- {
- ed.WriteMessage("\nЭто не твердое тело сдвига!");
- }
- 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;
- }
- }
- }
Обсуждение: http://adn-cis.org/forum/index.php?topic=7434
Опубликовано 07.11.2016Отредактировано 07.11.2016 в 01:02:50