ADN Open CIS
Сообщество программистов Autodesk в СНГ

06/05/2018

Определение радиуса и центра кругового конуса при помощи .NET

Мы можем использовать BREP API для определения радиуса и центра кругового конуса (свойства, показанные на изображении панели свойств).

Ниже фрагмента кода .NET, который можно использовать:

Код - C#: [Выделить]
  1. [CommandMethod("circularConeRadiusAndCenter")]
  2. public void circularConeRadiusAndCenter()
  3. {
  4.     Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
  5.     Database db = doc.Database;
  6.     Editor ed = doc.Editor;
  7.  
  8.     // Ask the user to select a solid
  9.     PromptEntityOptions peo = new PromptEntityOptions("Выберите 3Dsolid");
  10.     peo.SetRejectMessage("\nНужно выбрать 3Dsolid.");
  11.     peo.AddAllowedClass(typeof(Solid3d), true);
  12.     PromptEntityResult per = ed.GetEntity(peo);
  13.  
  14.     if (per.Status != PromptStatus.OK)
  15.         return;
  16.  
  17.     Transaction tr = db.TransactionManager.StartTransaction();
  18.     using (tr)
  19.     {
  20.         Solid3d sol = tr.GetObject(per.ObjectId, OpenMode.ForRead) as Solid3d;
  21.         using (Brep brep = new Brep(sol))
  22.         {
  23.             // Проверяем, что в основе круг – тогда можно определить центр и радиус
  24.             foreach (Complex cmp in brep.Complexes)
  25.             {
  26.                 int edgeCnt = 1;
  27.                 foreach (Edge edge in brep.Edges)
  28.                 {
  29.                     ed.WriteMessage("\n --> Грань : {0}", edgeCnt++);
  30.                     Curve3d edgeCurve = edge.Curve;
  31.                     if (edgeCurve is ExternalCurve3d)
  32.                     {
  33.                         ed.WriteMessage("\n Тип грани : {0}", "ExternalCurve3d");
  34.                         ExternalCurve3d extCurve3d = edgeCurve as ExternalCurve3d;
  35.                         Curve3d nativeCurve = extCurve3d.NativeCurve;
  36.                         if (nativeCurve is CircularArc3d)
  37.                         {
  38.                             ed.WriteMessage("\n Родной тип кривой : {0}", "CircularArc3d");
  39.                             CircularArc3d circArc3d = nativeCurve as CircularArc3d;
  40.                             ed.WriteMessage("\n Радиус: " + circArc3d.Radius.ToString());                                   
  41.                             ed.WriteMessage("\n Центр: " + PointToStr(circArc3d.Center));
  42.                         }
  43.                         else
  44.                         {
  45.                             ed.WriteMessage("\n Родной тип кривой не круг");
  46.                             return;
  47.                         }
  48.  
  49.                     }
  50.  
  51.                 }
  52.             }
  53.         }
  54.     }
  55. }
  56. private string PointToStr(Point3d point)
  57. {
  58.     return "[" +
  59.         point.X.ToString("F2") + ", " +
  60.         point.Y.ToString("F2") + ", " +
  61.         point.Z.ToString("F2")
  62.         + "]";
  63. }

Источник: http://adndevblog.typepad.com/autocad/2018/04/determine-the-radius-and-center-of-circular-cone-base-using-net-.html

 

Автор перевода: Александр Ривилис

Обсуждение: http://adn-cis.org/forum/index.php?topic=

Опубликовано 06.05.2018