Свойства StartAngle и EndAngle у Arc и CircularArc3d.

Автор Тема: Свойства StartAngle и EndAngle у Arc и CircularArc3d.  (Прочитано 7084 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 738
Здравствуйте!
В пространстве имен 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
Подскажите, пожалуйста, почему так? Может нужно как-то по-другому это делать?

Отмечено как Решение Дмитрий Загорулькин 30-01-2015, 13:19:36

Оффлайн German

  • ADN Club
  • **
  • Сообщений: 84
  • Карма: 13

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 738
Никогда бы не догадался, что это так и задумано! Спасибо :)
Исправленный метод:
Код - 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.         }

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 738
А какой геометрический смысл этих углов? У обычной Arc - мне понятно. А тут - какой-то ссылочный вектор...

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
На плоскости нужно задаться каким-то вектором, от которого мы будем вычислять углы. Вот 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.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение