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

ADN Club => AutoCAD .NET API => Тема начата: Дмитрий Загорулькин от 30-01-2015, 12:14:04

Название: Свойства StartAngle и EndAngle у Arc и CircularArc3d.
Отправлено: Дмитрий Загорулькин от 30-01-2015, 12:14:04
Здравствуйте!
В пространстве имен AutoCAD.Geometry есть полезные объекты для расчета параметров будущих примитивов, в частности - CircularArc3d. Я хотел использовать его, чтобы строить дугу в чертеже по трем заданным точкам. Задаю точки - создаю объект CircularArc3d - беру из него нужные свойства для создания примитива Arc. Но почему-то у CircularArc3d какие-то не те значения хранятся в свойствах StartAngle и EndAngle. Для демонстрации я набросал такой код:
Код - 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.  
  7. namespace Test
  8. {
  9.     public class CircularArc3dTest
  10.     {
  11.         [CommandMethod("CircularArcTest")]
  12.         public void RunTest1()
  13.         {
  14.             Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  15.  
  16.             PromptPointResult
  17.                 pt1Res = ed.GetPoint("\nSelect first point: "),
  18.                 pt2Res = ed.GetPoint("\nSelect second point: "),
  19.                 pt3Res = ed.GetPoint("\nSelect third point: ");
  20.  
  21.             if (pt1Res.Status == PromptStatus.OK && pt2Res.Status == PromptStatus.OK && pt3Res.Status == PromptStatus.OK)
  22.             {
  23.                 using (CircularArc3d arc = new CircularArc3d(pt1Res.Value, pt2Res.Value, pt3Res.Value))
  24.                 {
  25.                     ed.WriteMessage
  26.                         ("\nCircularArc3d. StartAngle: {0}, EndAngle: {1}",
  27.                         arc.StartAngle.ToString("0.000"),
  28.                         arc.EndAngle.ToString("0.000"));
  29.                 }
  30.             }
  31.         }
  32.  
  33.         [CommandMethod("ArcEntityTest")]
  34.         public void RunTest2()
  35.         {
  36.             Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  37.  
  38.             PromptEntityOptions entOpt = new PromptEntityOptions("\nSelect arc: ");
  39.             entOpt.SetRejectMessage("This is not arc!");
  40.             entOpt.AddAllowedClass(typeof(Arc), true);
  41.             PromptEntityResult entRes = ed.GetEntity(entOpt);
  42.  
  43.             if (entRes.Status == PromptStatus.OK)
  44.             {
  45.                 using (Transaction tr = ed.Document.Database.TransactionManager.StartTransaction())
  46.                 {
  47.                     Arc arc = tr.GetObject(entRes.ObjectId, OpenMode.ForRead, false, true) as Arc;
  48.                     if (arc != null)
  49.                     {
  50.                         ed.WriteMessage
  51.                             ("\nArc entity. StartAngle: {0}, EndAngle: {1}",
  52.                             arc.StartAngle.ToString("0.000"),
  53.                             arc.EndAngle.ToString("0.000"));
  54.                     }
  55.                     tr.Commit();
  56.                 }
  57.             }
  58.         }
  59.     }
  60. }
  61.  
https://screencast.autodesk.com/main/details/c0bcb35f-becf-4346-9801-adb70f948519
Подскажите, пожалуйста, почему так? Может нужно как-то по-другому это делать?
Название: Re: Свойства StartAngle и EndAngle у Arc и CircularArc3d.
Отправлено: German от 30-01-2015, 13:09:02
http://www.theswamp.org/index.php?topic=40382.0
Название: Re: Свойства StartAngle и EndAngle у Arc и CircularArc3d.
Отправлено: Дмитрий Загорулькин от 30-01-2015, 13:20:35
Никогда бы не догадался, что это так и задумано! Спасибо :)
Исправленный метод:
Код - C# [Выбрать]
  1.         [CommandMethod("CircularArcTest")]
  2.         public void RunTest1()
  3.         {
  4.             Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  5.  
  6.             PromptPointResult
  7.                 pt1Res = ed.GetPoint("\nSelect first point: "),
  8.                 pt2Res = ed.GetPoint("\nSelect second point: "),
  9.                 pt3Res = ed.GetPoint("\nSelect third point: ");
  10.  
  11.             if (pt1Res.Status == PromptStatus.OK && pt2Res.Status == PromptStatus.OK && pt3Res.Status == PromptStatus.OK)
  12.             {
  13.                 using (CircularArc3d arc = new CircularArc3d(pt1Res.Value, pt2Res.Value, pt3Res.Value))
  14.                 {
  15.                     double angle = arc.ReferenceVector.AngleOnPlane(new Plane(arc.Center, arc.Normal));
  16.                     ed.WriteMessage
  17.                         ("\nCircularArc3d. StartAngle: {0}, EndAngle: {1}",
  18.                         (angle + arc.StartAngle).ToString("0.000"),
  19.                         (angle + arc.EndAngle).ToString("0.000"));
  20.                 }
  21.             }
  22.         }
Название: Re: Свойства StartAngle и EndAngle у Arc и CircularArc3d.
Отправлено: Александр Ривилис от 30-01-2015, 14:57:49
А у нас на сайте для ObjectARX: http://adn-cis.org/kak-preobrazovat-acgecircarc3d-v-acdbarc-i-naoborot.html
Название: Re: Свойства StartAngle и EndAngle у Arc и CircularArc3d.
Отправлено: Дмитрий Загорулькин от 30-01-2015, 15:20:55
А какой геометрический смысл этих углов? У обычной Arc - мне понятно. А тут - какой-то ссылочный вектор...
Название: Re: Свойства StartAngle и EndAngle у Arc и CircularArc3d.
Отправлено: Александр Ривилис от 30-01-2015, 15:28:36
На плоскости нужно задаться каким-то вектором, от которого мы будем вычислять углы. Вот ReferenceVector и есть этот вектор:
Цитировать
Returns the reference vector of the arc. The reference vector is the vector from which the start and end angles of the arc are measured. This vector is perpendicular to the normal vector. This function always returns a unit vector.