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

01/12/2021

Как создать конус, направленный вдоль заданной оси

Вопрос:  Как при помощи AutoCAD .NET API можно создать конус, который бы был направлен вдоль заданной пользователем оси?

Ответ: Для того, чтобы создать конус достаточно воспользоваться методом Solid3d.CreateFrustum. Созданный таким образом конус направлен вдоль оси Z, и начало координат находится в середине оси конуса. Дальше следует выполнить трансформацию конуса. Ниже исходный текст программы:

Код - C#: [Выделить]
  1. using Autodesk.AutoCAD.ApplicationServices;
  2. using Autodesk.AutoCAD.DatabaseServices;
  3. using Autodesk.AutoCAD.EditorInput;
  4. using Autodesk.AutoCAD.Geometry;
  5. using Autodesk.AutoCAD.Runtime;
  6. using System;
  7.  
  8. // This line is not mandatory, but improves loading performances
  9. [assembly: CommandClass(typeof(CreateCone.ConeHandler))]
  10.  
  11. namespace CreateCone
  12. {
  13.  
  14.   public class ConeHandler
  15.   {
  16.     [CommandMethod("CreateCone")]
  17.     public void CreateConeHandler()
  18.     {
  19.       Document doc = Application.DocumentManager.MdiActiveDocument;
  20.       if (doc == null) return;
  21.       Editor ed = doc.Editor;
  22.       Matrix3d ucsMat = ed.CurrentUserCoordinateSystem;
  23.       PromptDistanceOptions prDistOpt =
  24.         new PromptDistanceOptions("Укажите диаметр конуса");
  25.       double radius = 0;
  26.       PromptDoubleResult rsDist = ed.GetDistance(prDistOpt);
  27.       if (rsDist.Status != PromptStatus.OK) return;
  28.  
  29.       radius = rsDist.Value;
  30.  
  31.       PromptPointOptions prPoint1 =
  32.         new PromptPointOptions("Укажите точку центра основания конуса");
  33.       PromptPointResult rsPoint1 = ed.GetPoint(prPoint1);
  34.       if (rsPoint1.Status != PromptStatus.OK) return;
  35.       Point3d p1 = rsPoint1.Value;
  36.       PromptPointOptions prPoint2 =
  37.         new PromptPointOptions("Укажите точку вершины конуса");
  38.       prPoint2.UseBasePoint = true;
  39.       prPoint2.BasePoint = p1;
  40.       PromptPointResult rsPoint2 = ed.GetPoint(prPoint2);
  41.       if (rsPoint2.Status != PromptStatus.OK) return;
  42.       Point3d p2 = rsPoint2.Value;
  43.  
  44.       p1 = p1.TransformBy(ucsMat);
  45.       p2 = p2.TransformBy(ucsMat);
  46.  
  47.       Vector3d vZnew = (p2 - p1).GetNormal();
  48.       double height = p2.DistanceTo(p1);
  49.       Matrix3d matTrans = Matrix3d.Displacement(Vector3d.ZAxis * 0.5 * height);
  50.       // Вычисляем оси конуса
  51.       Vector3d vXnew = vZnew.GetPerpendicularVector().GetNormal();
  52.       Vector3d vYnew = vXnew.CrossProduct(vZnew).GetNormal();
  53.       // Получаем матрицу выравнивания конуса вдоль заданной оси
  54.       Matrix3d matAlign = Matrix3d.AlignCoordinateSystem(
  55.            Point3d.Origin, Vector3d.XAxis, Vector3d.YAxis, Vector3d.ZAxis,
  56.            p1, vXnew, vYnew, vZnew);
  57.  
  58.       using (Transaction tr = doc.TransactionManager.StartOpenCloseTransaction() as Transaction)
  59.       {
  60.         BlockTableRecord btr = (BlockTableRecord)tr.GetObject(doc.Database.CurrentSpaceId, OpenMode.ForWrite);
  61.         Solid3d sol = new Solid3d();
  62.         sol.CreateFrustum(height, radius * 0.5, radius * 0.5, 0.0);
  63.         sol.TransformBy(matTrans); // Переносим центр основания конуса в точку {0,0,0}
  64.         sol.TransformBy(matAlign); // Трансформируем конус по матрице выравнивания
  65.         btr.AppendEntity(sol);
  66.         tr.AddNewlyCreatedDBObject(sol, true);
  67.         tr.Commit();
  68.       }
  69.     }
  70.   }
  71. }
  72.  

 

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