Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: Luca от 29-01-2020, 14:36:20

Название: Как получить блок по имени?
Отправлено: Luca от 29-01-2020, 14:36:20
Здравствуйте.
верно ли такое решение?
Код - 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.  
может есть более корректный вариант, если этот, вообще, верен?
Название: Re: Как получить блок по имени?
Отправлено: Александр Ривилис от 29-01-2020, 14:43:23
foreach не нужен. Достаточно blockTable[blockName] для получения ObjectId того BlockTableRecord, которое соответствует имени blockName.
P.S.: Ты собираешься потом этот блок модифицировать? OpenMode.ForWrite действительно нужен?
Название: Re: Как получить блок по имени?
Отправлено: Привалов Дмитрий от 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. }
Название: Re: Как получить блок по имени?
Отправлено: Александр Ривилис от 29-01-2020, 15:33:21
Если ничего не путаю, так делать опасно, blockTable[blockName] вернет исключение, если не содержит blockName.
Согласен.
а возможно так, если blockTable[blockName] может вернуть id не BlockTableRecord .
Не может. В BlockTable могут содержаться только BlockTableRecord (точнее их ObjectId)
Название: Re: Как получить блок по имени?
Отправлено: Lemieux от 30-01-2020, 14:37:11
Автор, из примеров Александра Ривилиса я понял как получать доступ по имени, и способ был очень простой, но я не понимал как это работает и где говорится о такой фиче. Но вот, что говорится в хелпе https://help.autodesk.com/view/OARX/2020/ENU/?guid=GUID-F98FAC6B-4DC4-489E-B65E-5D8C5E64E534