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

21/07/2016

Как вставить блок с атрибутами в пространство модели

Определение блока содержится в BlockTableRecord. Если у блока есть атрибуты, то они содержатся в BlockTableRecord как AttributeDefinition – точно также как и любые другие примитивы.

Когда мы вставляем блок в чертеж (точнее в пространство модели), то мы вставляем BlockReference. Если у блока есть атрибуты, то для всех (кроме постоянных) AttributeDefinition в BlockTableRecord имеются соответствующие AttributeReference присоединённые к BlockReference. Постоянные атрибуты обрабатываются не так, потому что их текст одинаков во всех вставках этого блока (во всех BlockReference). Они находятся в BlockTableRecord, и не имеют соответствующих AttributeReference  присоединённых к BlockReference.

Ниже простой C#-код для вставки блока с атрибутами в пространство модели. Создайте чертеж, содержащий блок с именем “CHECK” содержащий несколько атрибутов (часть постоянных, часть нет) для проверки кода.

Код - C#: [Выделить]
  1. [CommandMethod("AddBlockTest")]
  2. static public void AddBlockTest()
  3. {
  4.   Database db = Application.DocumentManager.MdiActiveDocument.Database;
  5.   using (Transaction myT = db.TransactionManager.StartTransaction())
  6.   {
  7.     // Получаем определение блока "Check".
  8.     string blockName = "CHECK";
  9.     BlockTable bt =
  10.         db.BlockTableId.GetObject(OpenMode.ForRead) as BlockTable;
  11.     BlockTableRecord blockDef =
  12.       bt[blockName].GetObject(OpenMode.ForRead) as BlockTableRecord;
  13.     // Открываем пространство модели – мы добавляем наш BlockReference к нему
  14.     BlockTableRecord ms =
  15.       bt[BlockTableRecord.ModelSpace].GetObject(OpenMode.ForWrite)
  16.                                               as BlockTableRecord;
  17.     // Создаём BlockReference и связываем его с определением блока
  18.     Point3d point = new Point3d(2.0, 4.0, 6.0);
  19.     using (BlockReference blockRef =
  20.             new BlockReference(point, blockDef.ObjectId))
  21.     {
  22.       // Добавляем вставку блока к пространству модели
  23.       ms.AppendEntity(blockRef);
  24.       myT.AddNewlyCreatedDBObject(blockRef, true);
  25.       // Проходимся по определению блока для поиска всех неконстантных атрибутов
  26.       foreach (ObjectId id in  blockDef)
  27.       {
  28.         DBObject obj = id.GetObject( OpenMode.ForRead);
  29.         AttributeDefinition attDef = obj as AttributeDefinition;
  30.         if ((attDef != null) && (!attDef.Constant))
  31.         {
  32.           // Это неконстантный AttributeDefinition
  33.           // Создаём новый AttributeReference
  34.           using (AttributeReference attRef = new AttributeReference())
  35.           {
  36.             attRef.SetAttributeFromBlock(attDef, blockRef.BlockTransform);
  37.             attRef.TextString = "Hello World";
  38.             // Добавляем AttributeReference к BlockReference
  39.             blockRef.AttributeCollection.AppendAttribute(attRef);
  40.             myT.AddNewlyCreatedDBObject(attRef, true);
  41.           }
  42.         }
  43.       }
  44.     }
  45.     // Работа выполнена!
  46.     myT.Commit();
  47.   }
  48. }

Я бы рекомендовал использовать утилиту MdgDbg для лучшего понимания как объекты хранятся в базе DWG.

Источник: http://adndevblog.typepad.com/autocad/2012/06/inserting-a-block-with-attributes-to-modelspace.html

 

Автор перевода: Александр Ривилис

Обсуждение: http://adn-cis.org/forum/index.php?topic=7224

Опубликовано 21.07.2016
Отредактировано 21.07.2016 в 00:36:32