Как получить все полилинии у которых есть мультивыноски?

Автор Тема: Как получить все полилинии у которых есть мультивыноски?  (Прочитано 6481 раз)

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

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

  • ADN OPEN
  • Сообщений: 24
  • Карма: 0
Хочу получить полилинии, к которым "привазаны" мультиновыноски. Сперва думал что у полилинии есть спец. свойство. Теперь же понимаю что нужно:

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.         }
« Последнее редактирование: 11-09-2020, 18:36:48 от Александр Ривилис »

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 809
  • Карма: 166
    • Мои плагины к Автокаду
Свойство Area есть у полилиний. Причем даже у незамкнутых. Получай полилинию из транзакции и смотри нужные свойства. Но только зачем площадь? надо искать точки, взятые с концов мультивыносок.
Кстати в коде нет проверки на уничтоженные объекты, скрытые объекты, отключенные слои т.д.

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

  • ADN OPEN
  • Сообщений: 24
  • Карма: 0
Спасибо, так и сделал.

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

Насчёт проверки на отключенные слои - можно поподробнее плиз? Есть вообще универсальный метод для получения ВСЕХ полилиний из файла?
« Последнее редактирование: 11-09-2020, 18:37:06 от Александр Ривилис »

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 809
  • Карма: 166
    • Мои плагины к Автокаду
Универсальный метод получения всех объектов из модели - уже написан в изначальном коде. Можно перебрать все записи из таблицы блоков и таким образов перебрать вообще все Entity. А можно и все ObjectId в цикле перебирать - где-то тут была тема как это делать быстро. Только надо ли?
Кстати, если и полилиний и мультивыносок много, то можно ускорить поиск пересечений с помощью RTree. Тоже тема обсуждалась

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 809
  • Карма: 166
    • Мои плагины к Автокаду
А насчет неподходящих слоев - никакой автоматизации в API нет. Надо просто сверять слой объектов со списком мусорных, отключенных, замороженных слоев...

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Herber,
Приветствую на форуме. Обрати внимание на правило форматирования кода на форуме (у меня в подписи) и соблюдай его.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 809
  • Карма: 166
    • Мои плагины к Автокаду
Есть кстати недокументированная функция acedNEntSelPEx для поиск объектов под заданной точкой. Видимость объектов она сама учитывает. Но с ней куча других проблем.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Есть кстати недокументированная функция acedNEntSelPEx для поиск объектов под заданной точкой. Видимость объектов она сама учитывает. Но с ней куча других проблем.
А это к чему? Кстати её аналог - Editor.GetNestedEntity
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Хочу получить полилинии, к которым "привазаны" мультиновыноски.
Они реально "привязаны"? Т.е. например находятся в одной группе с полилиниями? Или связаны реакторами?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 809
  • Карма: 166
    • Мои плагины к Автокаду
А это к чему?
К быстрому поиску объектов на которые указывают мультивыноски.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
А это к чему?
К быстрому поиску объектов на которые указывают мультивыноски.
Сомнительная быстрота, плюс все мультивыноски и полилинии должны быть видны на экране.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 809
  • Карма: 166
    • Мои плагины к Автокаду
Именно об этом я и писал - "Но с ней куча других проблем.". Требуется обнулять PICKBOX, активировать документ и лист, и т.д. и т.п. ... Быстрота только в написании кода. Но я сильно не советую.

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

  • ADN OPEN
  • Сообщений: 24
  • Карма: 0
Спасибо большое) Остался последний момент. Не могу "закурвить" 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.  

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Не могу "закурвить" Mleader
И не сможешь. Он не наследник Curve:


Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 24
  • Карма: 0
Подскажите тогда по Intersect. Как узнать есть ли он между ними

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 809
  • Карма: 166
    • Мои плагины к Автокаду
А точно нужно пересечение, а не одна крайняя точка на стрелке выноски?

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Подскажите тогда по Intersect. Как узнать есть ли он между ними
Я бы решал задачу совсем другим способом:
1. Нашел бы крайние точки всех MLEADER
2. Для каждой из полилиний нашел бы из полученных в п. 1) точек ближайшую и оценив расстояние принял бы решение принадлежит этот MLEADER этой полилинии.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 24
  • Карма: 0
А точно нужно пересечение, а не одна крайняя точка на стрелке выноски?

По идее пересечение площади полилинии с точной на носике у стрелки

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

  • ADN OPEN
  • Сообщений: 24
  • Карма: 0
А точно нужно пересечение, а не одна крайняя точка на стрелке выноски?

По идее пересечение площади полилинии с точной на носике у стрелки
А как узнать крайние точки?

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
По идее пересечение площади полилинии с точной на носике у стрелки
Глупость.
А как узнать крайние точки?
А посмотреть свойства класса MLeader?

Код - C# [Выбрать]
  1. Point3d p = pML.GetFirstVertex(0);
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 24
  • Карма: 0
По идее пересечение площади полилинии с точной на носике у стрелки
Глупость.
А как узнать крайние точки?
А посмотреть свойства класса 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);

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

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

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 809
  • Карма: 166
    • Мои плагины к Автокаду
Между прочим мультивыноска называется МУЛЬТИ потому что у нее вовсе не одна стрелка, а сколько угодно. Может быть даже 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]);

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

  • ADN OPEN
  • Сообщений: 24
  • Карма: 0
Получаю ближаюшую координату, а дальше не врублюсь
Код - 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.

А как сделать наоборот. Самая близкая полилиния к стрелке мультивыноске?

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
А как сделать наоборот. Самая близкая полилиния к стрелке мультивыноске?
Точно так же, только для каждой мультивыноски перебираешь все полилинии, находишь ближайшую точку на полилинии к выноске, получаешь расстояние между точками и там где расстояние минимальное и < delta - это и будет нужная полилиния.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение