Чтение Таблицы Свойств Блока для динамического блока
Для динамического блока мы можем создать Таблицу Свойств Блока, которая определяет и управляет параметрами и свойствами. Она доступна, когда запущена команда БЛОКРЕД (BEDIT) для динамического блока, как показано ниже.
С точки зрения API эта информация хранится в словаре (DBDictionary) с именем ACAD_ENHANCEDBLOCK. Для доступа к нему нам понадобятся некоторые «внутренние» API. Это подразумевает то, что они недокументированны и могут быть изменены без предупреждения.
Следующий пример кода покажет как получить доступ к этой информации для выбранной вставки блока (объект BlockReference). Минимальная проверка на ошибки сделана для простоты кода.
- [CommandMethod("readBlockTable")]
- static public void CmdReadBlockTable()
- {
- Editor ed = Application.DocumentManager.
- MdiActiveDocument.Editor;
- // Выбор вставки блока
- PromptEntityOptions peo = new PromptEntityOptions(
- "Выберите вставку динамического блока: ");
- peo.SetRejectMessage("Только вставка блока ");
- peo.AddAllowedClass(typeof(BlockReference), false);
- PromptEntityResult per = ed.GetEntity(peo);
- if (per.Status != PromptStatus.OK) return;
- ObjectId blockRefId = per.ObjectId;
- // Получаем базу данных и стартуем транзакцию
- Database db = Application.DocumentManager
- .MdiActiveDocument.Database;
- using (Transaction trans = db
- .TransactionManager.StartTransaction())
- {
- // Открываем вставку блока
- BlockReference blockRef = trans.GetObject(
- blockRefId, OpenMode.ForRead) as BlockReference;
- if (!blockRef.IsDynamicBlock) return;
- // Получаем запись таблицы блоков для динамического блока
- BlockTableRecord blockDef = trans.GetObject(
- blockRef.DynamicBlockTableRecord,
- OpenMode.ForRead) as BlockTableRecord;
- // Открываем её словарь расширения
- if (blockDef.ExtensionDictionary.IsNull) return;
- DBDictionary extDic = trans.GetObject(
- blockDef.ExtensionDictionary, OpenMode.ForRead)
- as DBDictionary;
- // Открываем словарь ENHANCEDBLOCK
- Autodesk.AutoCAD.Internal.DatabaseServices.EvalGraph graph =
- trans.GetObject(extDic.GetAt("ACAD_ENHANCEDBLOCK"),
- OpenMode.ForRead) as EvalGraph;
- int[] nodeIds = graph.GetAllNodes();
- foreach (uint nodeId in nodeIds)
- {
- // Открываем узел по его ID
- DBObject node = graph.GetNode(nodeId,
- OpenMode.ForRead, trans);
- // проверяем корректность типа
- if (!(node is BlockPropertiesTable)) continue;
- // преобразуем объект
- BlockPropertiesTable table =
- node as BlockPropertiesTable;
- // Отлично! Мы нашли то, что искали. Теперь покажем его.
- // Получаем число колонок
- int columns = table.Columns.Count;
- int currentRow = 0;
- foreach (
- BlockPropertiesTableRow row
- in table.Rows)
- {
- ed.WriteMessage("\n[{0}]:\t", currentRow);
- for (
- int currentColumn = 0;
- currentColumn < columns;
- currentColumn++)
- {
- // получаем значение для текущей ячейки
- // значений может быть несколько
- TypedValue[] columnValue =
- row[currentColumn].AsArray();
- foreach (TypedValue tpVal in columnValue)
- {
- ed.WriteMessage("{0}; ", tpVal.Value);
- }
- ed.WriteMessage("|");
- }
- currentRow++;
- }
- }
- }
- }
Источник: 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
Отредактировано 08.06.2013 в 02:52:00