Как получить блок по имени?

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

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

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

  • ADN OPEN
  • ***
  • Сообщений: 114
  • Карма: 0
Здравствуйте.
верно ли такое решение?
Код - C# [Выбрать]
  1. static Database database = Application.DocumentManager.MdiActiveDocument.Database;
  2. static BlockTableRecord getBlockByName(string blockName, Transaction transaction)
  3. {
  4.        BlockTable blockTable = (BlockTable)transaction.GetObject(database.BlockTableId, OpenMode.ForRead);
  5.        foreach (ObjectId btrID in blockTable)
  6.        {
  7.             BlockTableRecord btr = (BlockTableRecord)transaction.GetObject(btrID, OpenMode.ForWrite);
  8.             if ( btr.Name.ToUpper() == blockName.ToUpper() )
  9.             {
  10.                 return btr;
  11.             }
  12.         }
  13.             return null;
  14.  }
  15.  
может есть более корректный вариант, если этот, вообще, верен?

Отмечено как Решение Luca 29-01-2020, 14:46:35

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как получить блок по имени?
« Ответ #1 : 29-01-2020, 14:43:23 »
foreach не нужен. Достаточно blockTable[blockName] для получения ObjectId того BlockTableRecord, которое соответствует имени blockName.
P.S.: Ты собираешься потом этот блок модифицировать? OpenMode.ForWrite действительно нужен?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 546
  • Карма: 119
Re: Как получить блок по имени?
« Ответ #2 : 29-01-2020, 15:30:18 »
Достаточно blockTable[blockName] для получения ObjectId того BlockTableRecord, которое соответствует имени blockName.

Если ничего не путаю, так делать опасно, blockTable[blockName] вернет исключение, если не содержит blockName.
Лучше с проверкой.

Код - C# [Выбрать]
  1. if (blockTable.Has(blockName)) {
  2.    return (BlockTableRecord)transaction.GetObject(blockTable[blockName], OpenMode.ForWrite);
  3. }

а возможно даже так, если blockTable[blockName] может вернуть id не BlockTableRecord .

Код - C# [Выбрать]
  1. if (blockTable.Has(blockName)) {
  2.    BlockTableRecord btr = transaction.GetObject(blockTable[blockName], OpenMode.ForWrite) as BlockTableRecord;
  3.    if (btr != null) return btr;
  4. }

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как получить блок по имени?
« Ответ #3 : 29-01-2020, 15:33:21 »
Если ничего не путаю, так делать опасно, blockTable[blockName] вернет исключение, если не содержит blockName.
Согласен.
а возможно так, если blockTable[blockName] может вернуть id не BlockTableRecord .
Не может. В BlockTable могут содержаться только BlockTableRecord (точнее их ObjectId)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Lemieux

  • ADN OPEN
  • ****
  • Сообщений: 389
  • Карма: 21
Re: Как получить блок по имени?
« Ответ #4 : 30-01-2020, 14:37:11 »
Автор, из примеров Александра Ривилиса я понял как получать доступ по имени, и способ был очень простой, но я не понимал как это работает и где говорится о такой фиче. Но вот, что говорится в хелпе https://help.autodesk.com/view/OARX/2020/ENU/?guid=GUID-F98FAC6B-4DC4-489E-B65E-5D8C5E64E534