Как найти все вставки динамического блока
В предыдущей статье Баладжи Рамамурти (Balaji Ramamoorthy) показал нам как найти имя динамического блока по одной из вставок блока. Эта статья показывает нам как двигаться в противоположном направлении – найти все вставки динамического блока.
Вспомним, что когда мы манипулируем динамическим блоком, все изменения сохраняются как анонимные блоки. Анонимный блок создаётся для каждого различного состояния динамического блока в чертеже. В ObjectARX вы используете классы AcDbDybBlockReference и AcDbDynBlockTableRecord для работы с этими анонимными блоками. Для простоты в AutoCAD .NET API эти функции помещены в классы BlockReference и BlockTableRecord.
- [CommandMethod("selb")]
- public void selectDynamicBlockReferences()
- {
- Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
- Database db = Application.DocumentManager.MdiActiveDocument.Database;
- using (Transaction trans = db.TransactionManager.StartTransaction())
- {
- // получаем таблицу блоков и проходим по всем записям таблицы блоков
- BlockTable bt =
- (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForRead);
- foreach (ObjectId btrId in bt)
- {
- // получаем запись таблицы блоков и смотри анонимная ли она
- BlockTableRecord btr =
- (BlockTableRecord)trans.GetObject(btrId, OpenMode.ForRead);
- if (btr.IsDynamicBlock)
- {
- // получаем все анонимные блоки динамического блока
- ObjectIdCollection anonymousIds = btr.GetAnonymousBlockIds();
- // получаем все прямые вставки динамического блока
- ObjectIdCollection dynBlockRefs = btr.GetBlockReferenceIds(true, true);
- foreach (ObjectId anonymousBtrId in anonymousIds)
- {
- // получаем анонимный блок
- BlockTableRecord anonymousBtr =
- (BlockTableRecord)trans.GetObject(anonymousBtrId, OpenMode.ForRead);
- // получаем все вставки этого блока
- ObjectIdCollection blockRefIds =
- anonymousBtr.GetBlockReferenceIds(true, true);
- foreach (ObjectId id in blockRefIds)
- {
- dynBlockRefs.Add(id);
- }
- }
- // Что-нибудь делаем с созданным нами набором
- ed.WriteMessage("\nДинамическому блоку \"{0}\" соответствуют {1} анонимных блоков и {2} вставок блока\n",
- btr.Name, anonymousIds.Count, dynBlockRefs.Count);
- }
- }
- }
- }
P.S.: Исправлено по замечанию Максима Маркевича
Источник: http://adndevblog.typepad.com/autocad/2012/06/finding-all-block-references-of-a-dynamic-block.html
Обсуждение: http://adn-cis.org/forum/index.php?topic=131.0
Отредактировано 18.12.2016 в 20:18:41