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

ADN Club => AutoCAD .NET API => Тема начата: Sergey Makarov от 11-05-2023, 12:05:16

Название: eNotApplicable в Entity.JoinEntities(...)
Отправлено: Sergey Makarov от 11-05-2023, 12:05:16
Всем доброго дня!

Обнаружил проблему при использовании метода JoinEntities(...) при присоединении  массива полилиний к выбранной полилинии.
Написал простейшую функцию (ниже) и выяснил следующее: Если в массиве хотя бы одна из присоединяемых полилиний примыкает к объекту полилинии из которого вызывается метод JoinEntities(...), то всё происходит штатно, достаточно раскомментировать строку (в данный момент она закомментирована); Если же ни одна из массива полилиний не примыкает к целевой или примыкает внутренней точкой, то вызов JoinEntities(...) приводит к исключению:

Код - C# [Выбрать]
  1.         [CommandMethod("MyGroup", "MyPoly", "MyPolyLocal", CommandFlags.Modal)]
  2.         public void MyPoly()
  3.         {
  4.             Database db = Application.DocumentManager.MdiActiveDocument.Database;
  5.             Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  6.  
  7.             using (Transaction ts = db.TransactionManager.StartTransaction())
  8.             {
  9.                 BlockTableRecord btr = (BlockTableRecord)ts.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
  10.                 List<Polyline> pls = new List<Polyline>();
  11.  
  12.                 Polyline polyline = new Polyline();
  13.                 polyline.AddVertexAt(0, new Point2d(0.0, 0.0), 0.0, 0.0, 0.0);
  14.                 polyline.AddVertexAt(0, new Point2d(1.0, 0.0), 0.0, 0.0, 0.0);
  15.  
  16.                 Polyline polyline1 = new Polyline();
  17.                 polyline1.AddVertexAt(0, new Point2d(3.0, 2.0), 0.0, 0.0, 0.0);
  18.                 polyline1.AddVertexAt(0, new Point2d(2.0, 1.0), 0.0, 0.0, 0.0);
  19.                 polyline1.AddVertexAt(0, new Point2d(1.5, 0.0), 0.0, 0.0, 0.0);
  20.                 //polyline1.AddVertexAt(0, new Point2d(1.0, 0.0), 0.0, 0.0, 0.0);
  21.                
  22.  
  23.                 pls.Add(polyline1);
  24.  
  25.                 try
  26.                 { polyline.JoinEntities(pls.ToArray()); }
  27.                 catch(Autodesk.AutoCAD.Runtime.Exception e) { ed.WriteMessage("\nExcaption message: " + e.Message); }
  28.  
  29.                 btr.AppendEntity(polyline);
  30.                 ts.AddNewlyCreatedDBObject(polyline, true);
  31.  
  32.                 ts.Commit();
  33.             }                
  34.         }
  35.  

Так и должно быть или это баг?
Название: Re: eNotApplicable в Entity.JoinEntities(...)
Отправлено: alz от 11-05-2023, 12:37:01
JoinEntities() это такая штука где гораздо проще получить исключение чем заставить ее сработать как надо, вроде бы как минимум должны быть объекты, которые образуют цепь, причем последовательность в массиве тоже играет роль, в общем без проблем она отработает если ты добавляешь массив полилиний где startpoint последующей совпадает с endpoint предыдущей, любое отхождение от этого у меня вызывало исключение.
Название: Re: eNotApplicable в Entity.JoinEntities(...)
Отправлено: Sergey Makarov от 11-05-2023, 13:55:23
Немного подправил код и дополнил сообщение, чтобы, раскомментировав строку, можно было увидеть корректный вызов Entity.JoinEntities(...).
Странная, конечно, реализация. Метод возвращает коллекцию IntegerCollection, куда можно было бы добавлять результат обработки присоединяемого объекта  в массиве, типа OK, Error и другие в целом выражении. А так, try{} catch{} решили проблему.