Найти все вставки динамического блока если имя блока на кирилице

Автор Тема: Найти все вставки динамического блока если имя блока на кирилице  (Прочитано 11490 раз)

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

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
p.p.s Кажется нашел решение сравниваю OwnerId блока с db.CurrentSpaceId, остается проверить по имени.
CurrentSpaceId может быть как моделью, так и листом. Чтобы найти Id именно модели, есть разные способы. Мне лично больше всего нравится такой:
Код - C# [Выбрать]
  1. var mSpaceId = SymbolUtilityServices.GetBlockModelSpaceId(database);
Сравнивать лучше всего не по имени, а как раз по Id. Если Entity.BlockId (или OwnerId) равен Id модели - значит, объект (примитив) находится в модели.
Хотел проверить на совпадение имени блока и получил Model_Space оказывается у Entity.Blockname показывает где он лежит или я не прав?
Да, у Entity есть такое свойство - BlockName. И имя блока модели можно получить с помощью SymbolUtilityServices.BlockModelSpaceName. И можно сравнивать BlockName у объекта с полученным названием блока модели. Но сравнение строк гораздо более медленнее, чем сравнение Id, которое сводится, по сути, к сравнению чисел.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Yusuf,
Разобрался уже или нет? Или нужно писать пример кода?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ***
  • Сообщений: 117
  • Карма: 4
Сравнивать лучше всего не по имени, а как раз по Id. Если Entity.BlockId (или OwnerId) равен Id модели - значит, объект (примитив) находится в модели.
спасибо так и буду делать
Разобрался уже или нет? Или нужно писать пример кода?
Да вроде разобрался, спасибо что Вы есть

Отмечено как Решение Yusuf 04-11-2020, 18:57:00

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Yusuf,
Вот вариант кода от Gilles Chanteau:
Код - C# [Выбрать]
  1. static IEnumerable<ObjectId> GetAllCurrentSpaceBlocksByName(string blockName)
  2. {
  3.     var db = HostApplicationServices.WorkingDatabase;
  4.     using (var tr = db.TransactionManager.StartOpenCloseTransaction())
  5.     {
  6.         var curSpace = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForRead);
  7.         return curSpace
  8.             .Cast<ObjectId>()
  9.             .Where(id => id.ObjectClass.DxfName == "INSERT")
  10.             .Select(id => (BlockReference)tr.GetObject(id, OpenMode.ForRead))
  11.             .Where(br => ((BlockTableRecord)tr.GetObject(br.DynamicBlockTableRecord, OpenMode.ForRead)).Name == blockName)
  12.             .Select(br => br.ObjectId);
  13.     }
  14. }
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ***
  • Сообщений: 117
  • Карма: 4
Yusuf,
Вот вариант кода от Gilles Chanteau:
Код - C# [Выбрать]
  1. static IEnumerable<ObjectId> GetAllCurrentSpaceBlocksByName(string blockName)
  2. {
  3.     var db = HostApplicationServices.WorkingDatabase;
  4.     using (var tr = db.TransactionManager.StartOpenCloseTransaction())
  5.     {
  6.         var curSpace = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForRead);
  7.         return curSpace
  8.             .Cast<ObjectId>()
  9.             .Where(id => id.ObjectClass.DxfName == "INSERT")
  10.             .Select(id => (BlockReference)tr.GetObject(id, OpenMode.ForRead))
  11.             .Where(br => ((BlockTableRecord)tr.GetObject(br.DynamicBlockTableRecord, OpenMode.ForRead)).Name == blockName)
  12.             .Select(br => br.ObjectId);
  13.     }
  14. }

а как сделать тут  чтобы можно было итерировать Id листов, чтобы получить блоки в каждом листе ?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
а как сделать тут  чтобы можно было итерировать Id листов, чтобы получить блоки в каждом листе ?
Тут не знаю как. А вообще проверить владельца ownerId для каждого из выбранных BlockReference и сравнить с ObjectId BlockTableRecord листов.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение