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

ADN Club => AutoCAD .NET API => Тема начата: Alxd от 01-06-2016, 10:25:23

Название: GetOrthoProjectedCurve eNotApplicable
Отправлено: Alxd от 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
Не могу понять, почему не строится проекция?
Название: Re: GetOrthoProjectedCurve eNotApplicable
Отправлено: Александр Ривилис от 01-06-2016, 10:44:29
1. Версия AutoCAD?
2. Чертеж с полилинией где?
Название: Re: GetOrthoProjectedCurve eNotApplicable
Отправлено: Alxd от 01-06-2016, 10:45:40
AutoCAD 2012. Чертеж пустой. Просто построил в нем полилинию и все.
Название: Re: GetOrthoProjectedCurve eNotApplicable
Отправлено: Александр Ривилис от 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. }
Название: Re: GetOrthoProjectedCurve eNotApplicable
Отправлено: Alxd от 01-06-2016, 11:30:13
- Вот те раз!
Подумал Штирлиц.
- Вот те два!
СКазал Мюллер и кинул второй кирпич.

Был же нормальный OARX в С++, нет подавай всем С#...
Название: Re: GetOrthoProjectedCurve eNotApplicable
Отправлено: Александр Ривилис от 01-06-2016, 11:38:12
Был же нормальный OARX в С++, нет подавай всем С#...
А ты этот пример в C++ в AutoCAD 2012 проверял?
Название: Re: GetOrthoProjectedCurve eNotApplicable
Отправлено: Alxd от 01-06-2016, 11:49:53
Я проецировал все кривые подряд в С++ одной строчкой кода и ни разу ни одна не брыкнулась. А в С# уже замаялся.
Название: Re: GetOrthoProjectedCurve eNotApplicable
Отправлено: Александр Ривилис от 01-06-2016, 11:54:20
Я проецировал все кривые подряд в С++ одной строчкой кода и ни разу ни одна не брыкнулась. А в С# уже замаялся.
Ну тогда попробую через P/Invoke
Название: Re: GetOrthoProjectedCurve eNotApplicable
Отправлено: Alxd от 01-06-2016, 12:40:14
Как? Примерчик есть?
Название: Re: GetOrthoProjectedCurve eNotApplicable
Отправлено: Alxd от 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.             }

Результат на картинке.
Название: Re: GetOrthoProjectedCurve eNotApplicable
Отправлено: Александр Ривилис от 01-06-2016, 16:18:47
Как? Примерчик есть?
Примерчика нет. Там нужно очень хорошо повозится, т.к. это виртуальный метод, определённый в куче классов. В общем случае решения не вижу.
Название: Re: GetOrthoProjectedCurve eNotApplicable
Отправлено: Александр Ривилис от 01-06-2016, 16:22:24
но она (проекция) куда-то улетает. Не пойму, с какой стати?!
Думаю что это всё тот же баг. О нём в своё время писал Gilles Chanteau: https://forums.autodesk.com/t5/net/projecting-a-circle-on-default-ucs/m-p/3742074#M32650 
Название: Re: GetOrthoProjectedCurve eNotApplicable
Отправлено: Александр Ривилис от 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. }