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

ADN Club => AutoCAD .NET API => Тема начата: Herber от 11-09-2020, 17:46:12

Название: Как получить все полилинии у которых есть мультивыноски?
Отправлено: Herber от 11-09-2020, 17:46:12
Хочу получить полилинии, к которым "привазаны" мультиновыноски. Сперва думал что у полилинии есть спец. свойство. Теперь же понимаю что нужно:

1) Получить все полилинии
2) Получить все выноски
3) В цикле просмотреть что с с чем перескается

Вот так я получаю список всех полилиний, аналогично для MLeader. Теперь стоит вопрос как получить свойства типа area для полилинии..

Код - C# [Выбрать]
  1. public IList<ObjectId> GetIdsByType()
  2.         {
  3.             Func<Type, RXClass> getClass = RXObject.GetClass;
  4.  
  5.             // You can set this anywhere
  6.             var acceptableTypes = new HashSet<RXClass>
  7.                     {
  8.                 getClass(typeof(Polyline)),
  9.                 getClass(typeof (Polyline2d)),
  10.                 getClass(typeof (Polyline3d))
  11.             };
  12.  
  13.             var doc = Application.DocumentManager.MdiActiveDocument;
  14.             using (var trans = doc.TransactionManager.StartOpenCloseTransaction())
  15.             {
  16.                 var modelspace = (BlockTableRecord)
  17.                 trans.GetObject(SymbolUtilityServices.GetBlockModelSpaceId(doc.Database), OpenMode.ForRead);
  18.  
  19.                 var polylineIds = (from id in modelspace.Cast<ObjectId>()
  20.                                    where acceptableTypes.Contains(id.ObjectClass)
  21.                                    select id).ToList();
  22.  
  23.                 trans.Commit();
  24.                 return polylineIds;
  25.             }
  26.         }
Название: Re: Как получить все полилинии у которых есть мультивыноски?
Отправлено: avc от 11-09-2020, 18:06:17
Свойство Area есть у полилиний. Причем даже у незамкнутых. Получай полилинию из транзакции и смотри нужные свойства. Но только зачем площадь? надо искать точки, взятые с концов мультивыносок.
Кстати в коде нет проверки на уничтоженные объекты, скрытые объекты, отключенные слои т.д.
Название: Re: Как получить все полилинии у которых есть мультивыноски?
Отправлено: Herber от 11-09-2020, 18:09:33
Спасибо, так и сделал.

Код - C# [Выбрать]
  1. using (Transaction trans = db.TransactionManager.StartTransaction())
  2. {
  3.         Entity ent0 = trans.GetObject(item, OpenMode.ForRead) as Entity;
  4.         trans.Commit();
  5. }

Насчёт проверки на отключенные слои - можно поподробнее плиз? Есть вообще универсальный метод для получения ВСЕХ полилиний из файла?
Название: Re: Как получить все полилинии у которых есть мультивыноски?
Отправлено: avc от 11-09-2020, 18:32:40
Универсальный метод получения всех объектов из модели - уже написан в изначальном коде. Можно перебрать все записи из таблицы блоков и таким образов перебрать вообще все Entity. А можно и все ObjectId в цикле перебирать - где-то тут была тема как это делать быстро. Только надо ли?
Кстати, если и полилиний и мультивыносок много, то можно ускорить поиск пересечений с помощью RTree. Тоже тема обсуждалась
Название: Re: Как получить все полилинии у которых есть мультивыноски?
Отправлено: avc от 11-09-2020, 18:35:07
А насчет неподходящих слоев - никакой автоматизации в API нет. Надо просто сверять слой объектов со списком мусорных, отключенных, замороженных слоев...
Название: Re: Как получить все полилинии у которых есть мультивыноски?
Отправлено: Александр Ривилис от 11-09-2020, 18:36:19
Herber,
Приветствую на форуме. Обрати внимание на правило форматирования кода на форуме (у меня в подписи) и соблюдай его.
Название: Re: Как получить все полилинии у которых есть мультивыноски?
Отправлено: avc от 11-09-2020, 18:38:32
Есть кстати недокументированная функция acedNEntSelPEx для поиск объектов под заданной точкой. Видимость объектов она сама учитывает. Но с ней куча других проблем.
Название: Re: Как получить все полилинии у которых есть мультивыноски?
Отправлено: Александр Ривилис от 11-09-2020, 18:42:15
Есть кстати недокументированная функция acedNEntSelPEx для поиск объектов под заданной точкой. Видимость объектов она сама учитывает. Но с ней куча других проблем.
А это к чему? Кстати её аналог - Editor.GetNestedEntity
Название: Re: Как получить все полилинии у которых есть мультивыноски?
Отправлено: Александр Ривилис от 11-09-2020, 18:44:52
Хочу получить полилинии, к которым "привазаны" мультиновыноски.
Они реально "привязаны"? Т.е. например находятся в одной группе с полилиниями? Или связаны реакторами?
Название: Re: Как получить все полилинии у которых есть мультивыноски?
Отправлено: avc от 11-09-2020, 18:46:11
А это к чему?
К быстрому поиску объектов на которые указывают мультивыноски.
Название: Re: Как получить все полилинии у которых есть мультивыноски?
Отправлено: Александр Ривилис от 11-09-2020, 18:48:16
А это к чему?
К быстрому поиску объектов на которые указывают мультивыноски.
Сомнительная быстрота, плюс все мультивыноски и полилинии должны быть видны на экране.
Название: Re: Как получить все полилинии у которых есть мультивыноски?
Отправлено: avc от 11-09-2020, 18:51:16
Именно об этом я и писал - "Но с ней куча других проблем.". Требуется обнулять PICKBOX, активировать документ и лист, и т.д. и т.п. ... Быстрота только в написании кода. Но я сильно не советую.
Название: Re: Как получить все полилинии у которых есть мультивыноски?
Отправлено: Herber от 11-09-2020, 18:52:02
Спасибо большое) Остался последний момент. Не могу "закурвить" Mleader

Код - C# [Выбрать]
  1.  for (int i = 0; i < pols.Count(); i++)
  2.             {
  3.                 for (int j = 0; j < mldrs.Count(); j++)
  4.                 {
  5.                     Curve curve1 = pols[i] as Curve;
  6.                     Curve curve2 = mldrs[j] as Curve; # вот тут ошибка
  7.                     Point3dCollection points = new Point3dCollection();
  8.                     curve1.IntersectWith(curve2, Intersect.OnBothOperands, points, IntPtr.Zero, IntPtr.Zero);
  9.  
  10.  
  11.                 }
  12.             }
  13.  
Название: Re: Как получить все полилинии у которых есть мультивыноски?
Отправлено: Александр Ривилис от 11-09-2020, 18:54:15
Не могу "закурвить" Mleader
И не сможешь. Он не наследник Curve:
(https://live.staticflickr.com/65535/50329983793_58f40ab25d_o.png)

Название: Re: Как получить все полилинии у которых есть мультивыноски?
Отправлено: Herber от 11-09-2020, 18:55:48
Подскажите тогда по Intersect. Как узнать есть ли он между ними
Название: Re: Как получить все полилинии у которых есть мультивыноски?
Отправлено: avc от 11-09-2020, 18:57:11
А точно нужно пересечение, а не одна крайняя точка на стрелке выноски?
Название: Re: Как получить все полилинии у которых есть мультивыноски?
Отправлено: Александр Ривилис от 11-09-2020, 19:03:49
Подскажите тогда по Intersect. Как узнать есть ли он между ними
Я бы решал задачу совсем другим способом:
1. Нашел бы крайние точки всех MLEADER
2. Для каждой из полилиний нашел бы из полученных в п. 1) точек ближайшую и оценив расстояние принял бы решение принадлежит этот MLEADER этой полилинии.
Название: Re: Как получить все полилинии у которых есть мультивыноски?
Отправлено: Herber от 11-09-2020, 19:14:21
А точно нужно пересечение, а не одна крайняя точка на стрелке выноски?

По идее пересечение площади полилинии с точной на носике у стрелки
Название: Re: Как получить все полилинии у которых есть мультивыноски?
Отправлено: Herber от 11-09-2020, 19:15:05
А точно нужно пересечение, а не одна крайняя точка на стрелке выноски?

По идее пересечение площади полилинии с точной на носике у стрелки
А как узнать крайние точки?
Название: Re: Как получить все полилинии у которых есть мультивыноски?
Отправлено: Александр Ривилис от 11-09-2020, 19:17:52
По идее пересечение площади полилинии с точной на носике у стрелки
Глупость.
А как узнать крайние точки?
А посмотреть свойства класса MLeader?

Код - C# [Выбрать]
  1. Point3d p = pML.GetFirstVertex(0);
Название: Re: Как получить все полилинии у которых есть мультивыноски?
Отправлено: Herber от 11-09-2020, 19:45:55
По идее пересечение площади полилинии с точной на носике у стрелки
Глупость.
А как узнать крайние точки?
А посмотреть свойства класса MLeader?

Код - C# [Выбрать]
  1. Point3d p = pML.GetFirstVertex(0);

Получаю ближаюшую координату, а дальше не врублюсь
Код - C# [Выбрать]
  1. var m = ((MLeader)mldrs[i]).GetFirstVertex(0);
  2. var p = (Polyline)pols[i];
  3. var ttt0 =  p.GetClosestPointTo(m, false);
Название: Re: Как получить все полилинии у которых есть мультивыноски?
Отправлено: Александр Ривилис от 11-09-2020, 19:50:52
Получаю ближаюшую координату, а дальше не врублюсь
Код - C# [Выбрать]

    var m = ((MLeader)mldrs).GetFirstVertex(0);
    var p = (Polyline)pols;
    var ttt0 =  p.GetClosestPointTo(m, false);
А дальше оцениваешь расстояние от m до ttt0:
Код - C# [Выбрать]
  1. if (m.DistanceTo(ttt0) < delta)
  2. {
  3.   // MLeader указывает на эту полилинию
  4. }

P.S.: Точки принято обозначать p, а не m.
Название: Re: Как получить все полилинии у которых есть мультивыноски?
Отправлено: avc от 11-09-2020, 20:54:24
Между прочим мультивыноска называется МУЛЬТИ потому что у нее вовсе не одна стрелка, а сколько угодно. Может быть даже 0! Поэтому сначала неплохо бы проверить сколько их там и брать точки у же со стрелок:
Код - C# [Выбрать]
  1.       ArrayList arr = ml.GetLeaderIndexes();
  2.       if (arr.Count == 0) return; //можно нарисовать MLeader вообще без стрелок!
  3. ....
  4.       ArrayList arr1 = ml.GetLeaderLineIndexes((int)arr[i]);
  5.       pickPoint = ml.GetFirstVertex((int)arr1[0]);
Название: Re: Как получить все полилинии у которых есть мультивыноски?
Отправлено: Herber от 12-09-2020, 12:42:54
Получаю ближаюшую координату, а дальше не врублюсь
Код - C# [Выбрать]

    var m = ((MLeader)mldrs).GetFirstVertex(0);
    var p = (Polyline)pols;
    var ttt0 =  p.GetClosestPointTo(m, false);
А дальше оцениваешь расстояние от m до ttt0:
Код - C# [Выбрать]
  1. if (m.DistanceTo(ttt0) < delta)
  2. {
  3.   // MLeader указывает на эту полилинию
  4. }

P.S.: Точки принято обозначать p, а не m.

А как сделать наоборот. Самая близкая полилиния к стрелке мультивыноске?
Название: Re: Как получить все полилинии у которых есть мультивыноски?
Отправлено: Александр Ривилис от 12-09-2020, 13:25:30
А как сделать наоборот. Самая близкая полилиния к стрелке мультивыноске?
Точно так же, только для каждой мультивыноски перебираешь все полилинии, находишь ближайшую точку на полилинии к выноске, получаешь расстояние между точками и там где расстояние минимальное и < delta - это и будет нужная полилиния.