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

30/05/2013

Чтение Таблицы Свойств Блока для динамического блока

Для динамического блока мы можем создать Таблицу Свойств Блока, которая определяет и управляет параметрами и свойствами. Она доступна, когда запущена команда БЛОКРЕД (BEDIT) для динамического блока, как показано ниже.

 

С точки зрения API эта информация хранится в словаре (DBDictionary) с именем ACAD_ENHANCEDBLOCK. Для доступа к нему нам понадобятся некоторые «внутренние» API. Это подразумевает то, что они недокументированны и могут быть изменены без предупреждения.

Следующий пример кода покажет как получить доступ к этой информации для выбранной вставки блока (объект BlockReference). Минимальная проверка на ошибки сделана для простоты кода.

 

Код - C#: [Выделить]
  1. [CommandMethod("readBlockTable")]
  2. static public void CmdReadBlockTable()
  3. {
  4.   Editor ed = Application.DocumentManager.
  5.     MdiActiveDocument.Editor;
  6.  
  7.   // Выбор вставки блока
  8.   PromptEntityOptions peo = new PromptEntityOptions(
  9.     "Выберите вставку динамического блока: ");
  10.   peo.SetRejectMessage("Только вставка блока ");
  11.   peo.AddAllowedClass(typeof(BlockReference), false);
  12.   PromptEntityResult per = ed.GetEntity(peo);
  13.   if (per.Status != PromptStatus.OK) return;
  14.   ObjectId blockRefId = per.ObjectId;
  15.  
  16.   // Получаем базу данных и стартуем транзакцию
  17.   Database db = Application.DocumentManager
  18.     .MdiActiveDocument.Database;
  19.   using (Transaction trans = db
  20.     .TransactionManager.StartTransaction())
  21.   {
  22.     // Открываем вставку блока
  23.     BlockReference blockRef = trans.GetObject(
  24.       blockRefId, OpenMode.ForRead) as BlockReference;
  25.     if (!blockRef.IsDynamicBlock) return;
  26.  
  27.     // Получаем запись таблицы блоков для динамического блока
  28.     BlockTableRecord blockDef = trans.GetObject(
  29.       blockRef.DynamicBlockTableRecord,
  30.       OpenMode.ForRead) as BlockTableRecord;
  31.  
  32.     // Открываем её словарь расширения
  33.     if (blockDef.ExtensionDictionary.IsNull) return;
  34.     DBDictionary extDic = trans.GetObject(
  35.       blockDef.ExtensionDictionary, OpenMode.ForRead)
  36.       as DBDictionary;
  37.  
  38.     // Открываем словарь ENHANCEDBLOCK
  39.     Autodesk.AutoCAD.Internal.DatabaseServices.EvalGraph graph =
  40.       trans.GetObject(extDic.GetAt("ACAD_ENHANCEDBLOCK"),
  41.       OpenMode.ForRead) as EvalGraph;
  42.  
  43.   int[] nodeIds = graph.GetAllNodes();
  44.     foreach (uint nodeId in nodeIds)
  45.     {
  46.       // Открываем узел по его ID
  47.       DBObject node = graph.GetNode(nodeId,
  48.         OpenMode.ForRead, trans);
  49.       // проверяем корректность типа
  50.       if (!(node is BlockPropertiesTable)) continue;
  51.       // преобразуем объект
  52.       BlockPropertiesTable table =
  53.         node as BlockPropertiesTable;
  54.  
  55.       // Отлично! Мы нашли то, что искали. Теперь покажем его.
  56.  
  57.       // Получаем число колонок
  58.       int columns = table.Columns.Count;
  59.       int currentRow = 0;
  60.       foreach (
  61.         BlockPropertiesTableRow row
  62.         in table.Rows)
  63.       {
  64.         ed.WriteMessage("\n[{0}]:\t", currentRow);
  65.         for (
  66.            int currentColumn = 0;
  67.            currentColumn < columns;
  68.            currentColumn++)
  69.         {
  70.           // получаем значение для текущей ячейки
  71.           // значений может быть несколько
  72.           TypedValue[] columnValue =
  73.             row[currentColumn].AsArray();
  74.           foreach (TypedValue tpVal in columnValue)
  75.           {
  76.             ed.WriteMessage("{0}; ", tpVal.Value);
  77.           }
  78.           ed.WriteMessage("|");
  79.         }
  80.         currentRow++;
  81.       }
  82.     }
  83.   }
  84. }


Источник: http://adndevblog.typepad.com/autocad/2013/02/reading-the-block-table-of-a-dynamic-block.html

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

Опубликовано 30.05.2013
Отредактировано 08.06.2013 в 02:52:00