22/09/2015
Нахождение конечных точек оси цилиндрического твердого тела
В недавнем запросе от разработчика потребовалось найти конечные точки оси цилиндрического твердого тела. Для этого требуется найти круглые ребра тела и найти их центры. Я вспомнил про элегантный образец кода Gilles Chanteau на форуме, который использует Linq запрос к BRep API здесь. Мы немного изменим его код чтобы получить концы осей цилиндра. Вот немного модифицированный код и благодарности Gilles.
Код - C#: [Выделить]
- [CommandMethod("FindCylinderAxis")]
- public void FindCylinderAxis()
- {
- Document doc
- = Application.DocumentManager.MdiActiveDocument;
- Editor ed = doc.Editor;
- PromptEntityOptions peo
- = new PromptEntityOptions("Укажите цилиндр: " );
- 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;
- Point3d axisPt1 = Point3d.Origin;
- Point3d axisPt2 = Point3d.Origin;
- if (GetCylinderAxis(sld, ref axisPt1, ref axisPt2))
- {
- ed.WriteMessage(String.Format("{0}Точки оси : {1} {2}" ,
- Environment.NewLine,
- axisPt1.ToString(), axisPt2.ToString()));
- }
- else
- ed.WriteMessage(String.Format("{0} Это не цилиндр." ,
- Environment.NewLine));
- tr.Commit();
- }
- }
- private bool GetCylinderAxis(
- Solid3d solid, ref Point3d axisPt1, ref Point3d axisPt2)
- {
- bool isCylinder = false ;
- axisPt1 = Point3d.Origin;
- axisPt2 = Point3d.Origin;
- using (Brep brep = new Brep(solid))
- {
- if (brep.Complexes.Count() != 1)
- return false ;
- if (brep.Faces.Count() != 3)
- return false ;
- BrepEdgeCollection edges = brep.Edges;
- if (edges.Count() != 2)
- return false ;
- CircularArc3d[] circles = brep.Edges
- .Select(edge =>
- ((ExternalCurve3d)edge.Curve).NativeCurve
- as CircularArc3d)
- .Where(circle => circle != null )
- .ToArray();
- if (circles.Length != 2)
- isCylinder = false ;
- else
- {
- isCylinder =
- (circles[0].Radius == circles[1].Radius &&
- circles[0].Normal.IsParallelTo(circles[1].Normal));
- axisPt1 = circles[0].Center;
- axisPt2 = circles[1].Center;
- }
- }
- return isCylinder;
- }
Источник: http://adndevblog.typepad.com/autocad/2015/09/finding-axis-end-points-of-a-cylindrical-3d-solid.html
Автор перевода: Александр Ривилис
Отредактировано 23.09.2015 в 16:25:19
Обсуждение: http://adn-cis.org/forum/index.php?topic=3036
Опубликовано 22.09.2015Отредактировано 23.09.2015 в 16:25:19