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

15/07/2013

Как найти все вставки динамического блока

В предыдущей статье Баладжи Рамамурти (Balaji Ramamoorthy) показал нам как найти имя динамического блока по одной из вставок блока. Эта статья показывает нам как двигаться в противоположном направлении – найти все вставки динамического блока.

Вспомним, что когда мы манипулируем динамическим блоком, все изменения сохраняются как анонимные блоки. Анонимный блок создаётся для каждого различного состояния динамического блока в чертеже. В ObjectARX вы используете классы AcDbDybBlockReference и AcDbDynBlockTableRecord для работы с этими анонимными блоками. Для простоты в AutoCAD .NET API эти функции помещены в классы BlockReference и BlockTableRecord.

Код - C#: [Выделить]
  1. [CommandMethod("selb")]
  2. public void selectDynamicBlockReferences()
  3. {
  4.   Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  5.   Database db = Application.DocumentManager.MdiActiveDocument.Database;
  6.   using (Transaction trans = db.TransactionManager.StartTransaction())
  7.   {
  8.     // получаем таблицу блоков и проходим по всем записям таблицы блоков
  9.     BlockTable bt =
  10.       (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForRead);
  11.     foreach (ObjectId btrId in bt)
  12.     {
  13.       // получаем запись таблицы блоков и смотри анонимная ли она
  14.       BlockTableRecord btr =
  15.         (BlockTableRecord)trans.GetObject(btrId, OpenMode.ForRead);
  16.       if (btr.IsDynamicBlock)
  17.       {
  18.         // получаем все анонимные блоки динамического блока
  19.         ObjectIdCollection anonymousIds = btr.GetAnonymousBlockIds();
  20.         // получаем все прямые вставки динамического блока
  21.         ObjectIdCollection dynBlockRefs = btr.GetBlockReferenceIds(true, true);
  22.         foreach (ObjectId anonymousBtrId in anonymousIds)
  23.         {
  24.           // получаем анонимный блок
  25.           BlockTableRecord anonymousBtr =
  26.                (BlockTableRecord)trans.GetObject(anonymousBtrId, OpenMode.ForRead);
  27.           // получаем все вставки этого блока
  28.           ObjectIdCollection blockRefIds =
  29.                anonymousBtr.GetBlockReferenceIds(true, true);
  30.           foreach (ObjectId id in blockRefIds)
  31.           {
  32.             dynBlockRefs.Add(id);
  33.           }
  34.         }
  35.         // Что-нибудь делаем с созданным нами набором
  36.         ed.WriteMessage("\nДинамическому блоку \"{0}\" соответствуют {1} анонимных блоков и {2} вставок блока\n",
  37.             btr.Name, anonymousIds.Count, dynBlockRefs.Count);
  38.       }
  39.     }
  40.   }
  41. }


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

 
Опубликовано 15.07.2013
Отредактировано 18.12.2016 в 20:18:41