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

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

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

Оффлайн 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
  • *****
  • Сообщений: 839
  • Карма: 168
    • Мои плагины к Автокаду
Свойство 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
  • *****
  • Сообщений: 839
  • Карма: 168
    • Мои плагины к Автокаду
Универсальный метод получения всех объектов из модели - уже написан в изначальном коде. Можно перебрать все записи из таблицы блоков и таким образов перебрать вообще все Entity. А можно и все ObjectId в цикле перебирать - где-то тут была тема как это делать быстро. Только надо ли?
Кстати, если и полилиний и мультивыносок много, то можно ускорить поиск пересечений с помощью RTree. Тоже тема обсуждалась

Оффлайн avc

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

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

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

Оффлайн avc

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

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

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

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

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

Оффлайн avc

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

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

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

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 839
  • Карма: 168
    • Мои плагины к Автокаду
Именно об этом я и писал - "Но с ней куча других проблем.". Требуется обнулять 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
  • *****
  • Сообщений: 13898
  • Карма: 1790
  • Рыцарь ObjectARX
  • Skype: rivilis
Не могу "закурвить" Mleader
И не сможешь. Он не наследник Curve:


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

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

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