Выбор набора примитивов по Entity

Автор Тема: Выбор набора примитивов по Entity  (Прочитано 9500 раз)

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

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1188
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
К примеру есть объект Entity

Мне нужно через класс SelectionSet выбрать подобные объекты
1) По слою. (Тут все мне понятно просто передать Entity.Layer)
2) По классу примитива. (А как быть с типом примитива?)

Как из объекта Entity взять информацию что это к примеру "LWPOLYLINE"?
Чтобы передать в фильтр объекта SelectionSet
 


Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Выбор набора примитивов по Entity
« Ответ #1 : 15-11-2017, 17:32:29 »
object.GetType().Name

Хотя, это не будет Dxf-имя...

В общем - подходов много на самом деле

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Выбор набора примитивов по Entity
« Ответ #2 : 15-11-2017, 17:40:28 »
А можно не использовать фильтр вообще, а просто перебрать все объекты в базе и взять те, которые подходят по условию. И могу сказать сразу - это быстро работает (если конечно не косячно сделать)
И говорю я так потому-что уже сто лет назад реализовал такую функцию. Надо видео сделать

В таком случае проверять то, что это нужный объект можно так
Код - C# [Выбрать]
  1. if(ent is Polyline polyline)
  2. {
  3. //....
  4. }
Или так
Код - C# [Выбрать]
  1. if(baseEnt.GetType().Equals(ent.GetType())
  2. {
  3. //....
  4. }
Ну и еще можно придумать варианты =)

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1188
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Re: Выбор набора примитивов по Entity
« Ответ #3 : 15-11-2017, 17:47:14 »
А можно не использовать фильтр вообще, а просто перебрать все объекты в базе
А перебрать не медленнее будет чем SelectionSet?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Выбор набора примитивов по Entity
« Ответ #4 : 15-11-2017, 17:47:31 »
object.GetType().Name

Хотя, это не будет Dxf-имя...
Как-то так без проверки:
Код - C# [Выбрать]
  1. RXClass.GetClass(ent.GetType()).DxfName;
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Выбор набора примитивов по Entity
« Ответ #5 : 15-11-2017, 17:47:54 »
А перебрать не медленнее будет чем SelectionSet?
Будет намного быстрее.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн RevitTormentor

  • ADN OPEN
  • ***
  • Сообщений: 162
  • Карма: 6
Re: Выбор набора примитивов по Entity
« Ответ #6 : 16-11-2017, 21:04:14 »
А можно не использовать фильтр вообще, а просто перебрать все объекты в базе и взять те, которые подходят по условию. И могу сказать сразу - это быстро работает (если конечно не косячно сделать)

Есть код, как сделать это не "косячно"?
И ещё путаница небольшая есть. Чем отличается Entity от DBObject? DBObject это любой объект в базе? И пока что непонятно какой объект, а как только делаем as Entity то автокад стал понимать что перед ним например либо полилиния либо круг либо размер?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Выбор набора примитивов по Entity
« Ответ #7 : 16-11-2017, 22:48:19 »
Есть код, как сделать это не "косячно"?
А что такое "косячно"?
Чем отличается Entity от DBObject? DBObject это любой объект в базе?
Да. Например слой (LayerTableRecord) или блок (BlockTableRecord) или полилиния (Polyline), но только последний из них еще и примитив (Entity)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн RevitTormentor

  • ADN OPEN
  • ***
  • Сообщений: 162
  • Карма: 6
Re: Выбор набора примитивов по Entity
« Ответ #8 : 17-11-2017, 06:49:23 »
А что такое "косячно"?
Не знаю. Александр написал, лишь бы сделать некосячно. Может нюансы есть.



Оффлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 611
  • Карма: 155
    • ПГСу Бложик
Re: Выбор набора примитивов по Entity
« Ответ #9 : 17-11-2017, 07:35:33 »
Чем отличается Entity от DBObject?
Я предполагаю, что Вы знакомы с основными принципами ООП и думаю для полной ясности кто и что, достаточно будет посмотреть диаграмму классов в файле ...\ObjectARX_20ХХ\classmap\classmap.dwg , раздел ObjectARX  20XX Managed Class Hierarchy

Оффлайн RevitTormentor

  • ADN OPEN
  • ***
  • Сообщений: 162
  • Карма: 6
Re: Выбор набора примитивов по Entity
« Ответ #10 : 18-11-2017, 07:42:28 »
Чем отличается Entity от DBObject?
Я предполагаю, что Вы знакомы с основными принципами ООП и думаю для полной ясности кто и что, достаточно будет посмотреть диаграмму классов в файле ...\ObjectARX_20ХХ\classmap\classmap.dwg , раздел ObjectARX  20XX Managed Class Hierarchy
:) Не очень знаком. Но данная диаграммка полезная штука кое что прояснилось. Спасибо.

Т.е. у объекта не может быть слоя например. И так, как в коде ниже можно найти только объекты, потом из них сделать Entity и дальше отсеивать по слоям и XData?
Код - C# [Выбрать]
  1.          foreach (ObjectId id in btr)
  2.                 {
  3.                     if (id.ObjectClass.DxfName == "CIRCLE" && id... == "NameLayer")
  4.                     {
  5.                         ids.Add(id);
  6.                     }
  7.                 }
  8.  

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Выбор набора примитивов по Entity
« Ответ #11 : 18-11-2017, 09:41:14 »
И так, как в коде ниже можно найти только объекты, потом из них сделать Entity и дальше отсеивать по слоям и XData?
Ниже не код, а обрывок кода. Каким образом кто-то может узнать что такое btr и как ты его получил?
По типу примитива можно отобрать не открывая объект, а только зная его ObjectId. А вот чтобы проверить его слой или анализировать Xdata его придётся открыть (с транзакцией или без - не столь существенно).
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн RevitTormentor

  • ADN OPEN
  • ***
  • Сообщений: 162
  • Карма: 6
Re: Выбор набора примитивов по Entity
« Ответ #12 : 18-11-2017, 11:18:40 »
Прошу прощения.
Код - C# [Выбрать]
  1.             ObjectIdCollection ids = new ObjectIdCollection();
  2.             Database db = HostApplicationServices.WorkingDatabase;
  3.             using (Transaction tr = db.TransactionManager.StartTransaction())
  4.             {
  5.                 BlockTable bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
  6.                 BlockTableRecord btr = tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForRead) as BlockTableRecord;
  7.                 foreach (ObjectId id in btr)
  8.                 {
  9.                     if (id.ObjectClass.DxfName == "CIRCLE")
  10.                     {
  11.                         ids.Add(id);
  12.                     }
  13.                 }
  14.                 tr.Commit();
  15.             }
  16.             return ids;
  17.  

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Выбор набора примитивов по Entity
« Ответ #13 : 18-11-2017, 11:38:18 »
Это тоже огрызок, хотя и подлиннее. А вот это законченная функция:
Код - C# [Выбрать]
  1. /// <summary>
  2. /// Функция отбирает все окружности на заданном слое, имеющие расширенные данные заданного приложения
  3. /// </summary>
  4. /// <param name="layerName">Имя слоя</param>
  5. /// <param name="appname">Имя приложения</param>
  6. /// <returns></returns>
  7. static ObjectIdCollection GetAllCirclesOnLayerAndApplication(string layerName, string appname)
  8. {
  9.   ObjectIdCollection ids = new ObjectIdCollection();
  10.   Database db = HostApplicationServices.WorkingDatabase;
  11.   using (Transaction tr = db.TransactionManager.StartTransaction())
  12.   {
  13.     BlockTable bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
  14.     BlockTableRecord btr = tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForRead) as BlockTableRecord;
  15.     foreach (ObjectId id in btr)
  16.     {
  17.       if (id.ObjectClass.Name == RXClass.GetClass(typeof(Circle)).Name)
  18.       {
  19.         Circle circle = tr.GetObject(id, OpenMode.ForRead) as Circle;
  20.         if (circle.Layer.ToUpper() == layerName.ToUpper())
  21.         using (ResultBuffer rb = circle.GetXDataForApplication(appname))
  22.         {
  23.             if (rb != null) ids.Add(id);
  24.         }
  25.       }
  26.     }
  27.     tr.Commit();
  28.   }
  29.   return ids;
  30. }
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн RevitTormentor

  • ADN OPEN
  • ***
  • Сообщений: 162
  • Карма: 6
Re: Выбор набора примитивов по Entity
« Ответ #14 : 18-11-2017, 12:27:41 »
Александр можете объяснить по этому фрагменту
Код - C# [Выбрать]
  1. ...
  2.     BlockTable bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
  3.     BlockTableRecord btr = tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForRead) as BlockTableRecord;
  4.     foreach (ObjectId id in btr)
  5.     {
  6.       if (id.ObjectClass.Name == RXClass.GetClass(typeof(Circle)).Name)
  7.       {
  8.         Circle circle = tr.GetObject(id, OpenMode.ForRead) as Circle;
  9. ...
  10. }

Код - C# [Выбрать]
  1. ObjectId id in btr
здесь id - это объект
А
Код - C# [Выбрать]
  1.  Circle circle = tr.GetObject(id, OpenMode.ForRead) as Circle;
здесь опять GetObject опять какой то объект получаем. Получается circle это ещё один какой то объект или это уже Entity. Или Entity он станет, когда написать circle as Entity.

И вообще проходясь циклом по BlockTableRecord
Код - C# [Выбрать]
  1. foreach (ObjectId id in btr)
вроде как находим объект circle внутри BlockTableRecord
а объект получаем почему то из транзакции
Код - C# [Выбрать]
  1. Circle circle = tr.GetObject(id,
В BlockTableRecord не хранятся сами объекты? Там только ссылки какие то?