GetOrthoProjectedCurve eNotApplicable

Автор Тема: GetOrthoProjectedCurve eNotApplicable  (Прочитано 6094 раз)

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

Оффлайн AlxdАвтор темы

  • ADN Club
  • **
  • Сообщений: 78
  • Карма: 2
GetOrthoProjectedCurve eNotApplicable
« : 01-06-2016, 10:25:23 »
Построил в чертеже Autodesk.AutoCAD.DatabaseServices.Polyline. Разместил ее на уровне 10мм, т.е. она поднята над обычной плоскостью на 10мм. Обращаюсь к ней программно. Получаю:
curve2.IsPlanar возвращает true
curve2.GetPlane().Coefficients возвращает 0, 0, 1, -10 (почему-то последняя цифра отрицательна)
Пытаюсь построить ее проекцию с помощью:
Код - C# [Выбрать]
  1. projCurve2 = curve2.GetOrthoProjectedCurve(new Plane(new Point3d(0, 0, 0), new Vector3d(0, 0, 1)));
Но получаю сообщение об ошибке: eNotApplicable
Не могу понять, почему не строится проекция?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: GetOrthoProjectedCurve eNotApplicable
« Ответ #1 : 01-06-2016, 10:44:29 »
1. Версия AutoCAD?
2. Чертеж с полилинией где?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн AlxdАвтор темы

  • ADN Club
  • **
  • Сообщений: 78
  • Карма: 2
Re: GetOrthoProjectedCurve eNotApplicable
« Ответ #2 : 01-06-2016, 10:45:40 »
AutoCAD 2012. Чертеж пустой. Просто построил в нем полилинию и все.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: GetOrthoProjectedCurve eNotApplicable
« Ответ #3 : 01-06-2016, 11:15:22 »
Похоже на баг в 2012. В 2015 работает нормально. Проверял такой код:
Код - C# [Выбрать]
  1. [CommandMethod("PRG")]
  2. public void Prg()
  3. {
  4.   Document doc = Application.DocumentManager.MdiActiveDocument;
  5.   if (doc == null) return;
  6.   Editor ed = doc.Editor;
  7.   PromptEntityResult prs = ed.GetEntity("\nУкажите полилинию: ");
  8.   if (prs.Status != PromptStatus.OK) return;
  9.   using (Polyline pl = prs.ObjectId.Open(OpenMode.ForRead) as Polyline)
  10.   {
  11.     using (Plane pln = new Plane(Point3d.Origin, Vector3d.ZAxis))
  12.     {
  13.       using (Curve curve = pl.GetOrthoProjectedCurve(pln))
  14.       {
  15.         using (BlockTableRecord btr = doc.Database.CurrentSpaceId.Open(OpenMode.ForWrite) as BlockTableRecord)
  16.         {
  17.           btr.AppendEntity(curve);
  18.         }
  19.       }
  20.     }
  21.   }
  22. }
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн AlxdАвтор темы

  • ADN Club
  • **
  • Сообщений: 78
  • Карма: 2
Re: GetOrthoProjectedCurve eNotApplicable
« Ответ #4 : 01-06-2016, 11:30:13 »
- Вот те раз!
Подумал Штирлиц.
- Вот те два!
СКазал Мюллер и кинул второй кирпич.

Был же нормальный OARX в С++, нет подавай всем С#...

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: GetOrthoProjectedCurve eNotApplicable
« Ответ #5 : 01-06-2016, 11:38:12 »
Был же нормальный OARX в С++, нет подавай всем С#...
А ты этот пример в C++ в AutoCAD 2012 проверял?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн AlxdАвтор темы

  • ADN Club
  • **
  • Сообщений: 78
  • Карма: 2
Re: GetOrthoProjectedCurve eNotApplicable
« Ответ #6 : 01-06-2016, 11:49:53 »
Я проецировал все кривые подряд в С++ одной строчкой кода и ни разу ни одна не брыкнулась. А в С# уже замаялся.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: GetOrthoProjectedCurve eNotApplicable
« Ответ #7 : 01-06-2016, 11:54:20 »
Я проецировал все кривые подряд в С++ одной строчкой кода и ни разу ни одна не брыкнулась. А в С# уже замаялся.
Ну тогда попробую через P/Invoke
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн AlxdАвтор темы

  • ADN Club
  • **
  • Сообщений: 78
  • Карма: 2
Re: GetOrthoProjectedCurve eNotApplicable
« Ответ #8 : 01-06-2016, 12:40:14 »
Как? Примерчик есть?

Оффлайн AlxdАвтор темы

  • ADN Club
  • **
  • Сообщений: 78
  • Карма: 2
Re: GetOrthoProjectedCurve eNotApplicable
« Ответ #9 : 01-06-2016, 14:40:14 »
Пытаюсь построить проекцию преобразовав Polyline в Polyline2d, но она (проекция) куда-то улетает. Не пойму, с какой стати?!
Код - C# [Выбрать]
  1. using (Transaction tr = doc.TransactionManager.StartTransaction())
  2.             {
  3.                 Curve curve2 = (Curve)tr.GetObject(objId2, OpenMode.ForRead);
  4.                 BlockTableRecord containerBlock = (BlockTableRecord)tr.GetObject(curve2.OwnerId, OpenMode.ForWrite);
  5.  
  6.                 Polyline2d testCurve2 = (curve2 as Polyline).ConvertTo(false);
  7.                 containerBlock.AppendEntity(testCurve2);
  8.                 tr.AddNewlyCreatedDBObject(testCurve2, true);
  9.  
  10.                 Curve projCurve2 = testCurve2.GetOrthoProjectedCurve(new Plane(0, 0, 1, 0));
  11.                 containerBlock.AppendEntity(projCurve2);
  12.                 tr.AddNewlyCreatedDBObject(projCurve2, true);
  13.  
  14.                 tr.Commit();
  15.                 return true;
  16.             }

Результат на картинке.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: GetOrthoProjectedCurve eNotApplicable
« Ответ #10 : 01-06-2016, 16:18:47 »
Как? Примерчик есть?
Примерчика нет. Там нужно очень хорошо повозится, т.к. это виртуальный метод, определённый в куче классов. В общем случае решения не вижу.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: GetOrthoProjectedCurve eNotApplicable
« Ответ #11 : 01-06-2016, 16:22:24 »
но она (проекция) куда-то улетает. Не пойму, с какой стати?!
Думаю что это всё тот же баг. О нём в своё время писал Gilles Chanteau: https://forums.autodesk.com/t5/net/projecting-a-circle-on-default-ucs/m-p/3742074#M32650 
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: GetOrthoProjectedCurve eNotApplicable
« Ответ #12 : 01-06-2016, 16:55:36 »
Вот так работает, но собрать в одну полилинию потом не получится, так как в 2012 у меня всегда вместо дуг получалась эллиптические дуги, несмотря на то, что направление проекции совпадало с нормалью полилинии (и соответственно дугового сегмента) :
Код - C# [Выбрать]
  1. [CommandMethod("PRG")]
  2. public void Prg()
  3. {
  4.   Document doc = Application.DocumentManager.MdiActiveDocument;
  5.   if (doc == null) return;
  6.   Editor ed = doc.Editor;
  7.   PromptEntityResult prs = ed.GetEntity("\nУкажите полилинию: ");
  8.   if (prs.Status != PromptStatus.OK) return;
  9.   using (Polyline pl = prs.ObjectId.Open(OpenMode.ForRead) as Polyline) {
  10.     using (Plane pln = new Plane(Point3d.Origin, Vector3d.ZAxis)) {
  11.       using (DBObjectCollection col = new DBObjectCollection()) {
  12.         try {
  13.           pl.Explode(col);
  14.         } catch {
  15.           col.Add(pl);
  16.         } finally {
  17.           foreach (Entity en in col) {
  18.             using (Curve curve = (en as Curve).GetOrthoProjectedCurve(pln)) {
  19.               using (BlockTableRecord btr =
  20.                 doc.Database.CurrentSpaceId.Open(OpenMode.ForWrite) as BlockTableRecord) {
  21.                 btr.AppendEntity(curve);
  22.               }
  23.             }
  24.           }
  25.         }
  26.       }
  27.     }
  28.   }
  29. }
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение