Как вставить блок с атрибутами в пространство модели
Определение блока содержится в BlockTableRecord. Если у блока есть атрибуты, то они содержатся в BlockTableRecord как AttributeDefinition – точно также как и любые другие примитивы.
Когда мы вставляем блок в чертеж (точнее в пространство модели), то мы вставляем BlockReference. Если у блока есть атрибуты, то для всех (кроме постоянных) AttributeDefinition в BlockTableRecord имеются соответствующие AttributeReference присоединённые к BlockReference. Постоянные атрибуты обрабатываются не так, потому что их текст одинаков во всех вставках этого блока (во всех BlockReference). Они находятся в BlockTableRecord, и не имеют соответствующих AttributeReference присоединённых к BlockReference.
Ниже простой C#-код для вставки блока с атрибутами в пространство модели. Создайте чертеж, содержащий блок с именем “CHECK” содержащий несколько атрибутов (часть постоянных, часть нет) для проверки кода.
- [CommandMethod("AddBlockTest")]
- static public void AddBlockTest()
- {
- Database db = Application.DocumentManager.MdiActiveDocument.Database;
- using (Transaction myT = db.TransactionManager.StartTransaction())
- {
- // Получаем определение блока "Check".
- string blockName = "CHECK";
- BlockTable bt =
- db.BlockTableId.GetObject(OpenMode.ForRead) as BlockTable;
- BlockTableRecord blockDef =
- bt[blockName].GetObject(OpenMode.ForRead) as BlockTableRecord;
- // Открываем пространство модели – мы добавляем наш BlockReference к нему
- BlockTableRecord ms =
- bt[BlockTableRecord.ModelSpace].GetObject(OpenMode.ForWrite)
- as BlockTableRecord;
- // Создаём BlockReference и связываем его с определением блока
- Point3d point = new Point3d(2.0, 4.0, 6.0);
- using (BlockReference blockRef =
- new BlockReference(point, blockDef.ObjectId))
- {
- // Добавляем вставку блока к пространству модели
- ms.AppendEntity(blockRef);
- myT.AddNewlyCreatedDBObject(blockRef, true);
- // Проходимся по определению блока для поиска всех неконстантных атрибутов
- foreach (ObjectId id in blockDef)
- {
- DBObject obj = id.GetObject( OpenMode.ForRead);
- AttributeDefinition attDef = obj as AttributeDefinition;
- if ((attDef != null) && (!attDef.Constant))
- {
- // Это неконстантный AttributeDefinition
- // Создаём новый AttributeReference
- using (AttributeReference attRef = new AttributeReference())
- {
- attRef.SetAttributeFromBlock(attDef, blockRef.BlockTransform);
- attRef.TextString = "Hello World";
- // Добавляем AttributeReference к BlockReference
- blockRef.AttributeCollection.AppendAttribute(attRef);
- myT.AddNewlyCreatedDBObject(attRef, true);
- }
- }
- }
- }
- // Работа выполнена!
- myT.Commit();
- }
- }
Я бы рекомендовал использовать утилиту 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