Получение имени блока в ARX
Вопрос:
Могу ли я используя ObjectARX получить имя блока из вставки блока внутри ObjectARX приложения? Я знаю, что это можно сделать используя ads_entget (acdbEntGet), а затем найти соответствующий код группы.
Ответ:
Нет метода у класса вставки блока, который бы возвращал имя определения блока. Вставка блока (класс AcDbBlockReference) хранит ID объекта определения блока (класс AcDbBlockTableRecord). Имя блока хранится в определении блока. Чтобы получить имя блока нужно получить ID определения блока и открыть его. Тогда можно будет получить имя блока из определения блока. Следующий код позволяет выбрать вставку блока и получить его имя:
- void AsdkGetBlockName()
- {
- // Позволим пользователю выбрать вставку блока.
- ads_name ename;
- ads_point pt;
- if (RTNORM != acedEntSel(L"\nВыберите вставку блока: ",
- ename,
- pt))
- return;
- AcDbObjectId objId;
- AcDbEntity *pEnt;
- AcDbBlockReference *pInsert;
- Acad::ErrorStatus es;
- // Проверяем тип примитива.
- acdbGetObjectId(objId, ename);
- if (Acad::eOk != (es = acdbOpenAcDbEntity(pEnt,
- objId,
- AcDb::kForRead)))
- {
- acutPrintf(L"\nНельзя получить доступ к примитиву.\n");
- return;
- }
- pInsert = AcDbBlockReference::cast(pEnt);
- if (!pInsert)
- {
- acutPrintf(L"\nВыбрали не вставку блока.\n");
- pEnt->close();
- return;
- }
- // Получаем objectID определения блока.
- AcDbObjectId blockDefId = pInsert->blockTableRecord();
- // Закрываем вставку блока.
- pInsert->close();
- // Открываем определение блока.
- AcDbBlockTableRecord *pBlkRecord;
- if (Acad::eOk != (es = acdbOpenObject(pBlkRecord,
- blockDefId,
- AcDb::kForRead)))
- {
- acutPrintf(L"\nНельзя получить доступ к определению блока.\n");
- return;
- }
- // Получаем имя определения блока.
- const TCHAR* pBlkName;
- es = pBlkRecord->getName(pBlkName);
- pBlkRecord->close();
- if ((Acad::eOk != es) || !pBlkName)
- {
- acutPrintf(L"\nНе можем получить имя блока.\n");
- return;
- }
- acutPrintf(L"\nИмя блока: '%s'\n", pBlkName);
- }
Примечание переводчика: Этот код справедлив только для нединамических блоков. Для динамического блока мы получим имя в формате “*Unnn”. Для универсального получения имени блока можно использовать такой код:
- //----------------------------------------------------------------
- // Печать имени выбранного блока (динамического или статического)
- //----------------------------------------------------------------
- static void PrintBlockName(void)
- {
- ads_name en; ads_point p;
- if (acedEntSel(_T("\nВыберите вставку блока: "),en,p) == RTNORM) {
- AcDbObjectId eId; acdbGetObjectId(eId,en);
- AcDbObjectPointer pBlkRef(eId,AcDb::kForRead);
- if (pBlkRef.openStatus() == Acad::eOk) {
- AcDbObjectId idBlkTblRec = pBlkRef->blockTableRecord();
- AcDbDynBlockReference dynBlk(eId);
- if (dynBlk.isDynamicBlock()) {
- AcDbBlockTableRecordPointer pBTR(dynBlk.dynamicBlockTableRecord(),AcDb::kForRead);
- if (pBTR.openStatus() == Acad::eOk){
- const ACHAR *blkName = NULL; pBTR->getName(blkName);
- acutPrintf(_T("\nИмя динамического блока: \"%s\""), blkName);
- }
- } else {
- AcDbBlockTableRecordPointer pBTR(pBlkRef->blockTableRecord(),AcDb::kForRead);
- const ACHAR *blkName = NULL; pBTR->getName(blkName);
- acutPrintf(_T("\nИмя статического блока: \"%s\""), blkName);
- }
- }
- }
- }
Источник: http://adndevblog.typepad.com/autocad/2012/05/get-the-name-of-a-block.html
Обсуждение: http://adn-cis.org/forum/index.php?topic=67.0
Отредактировано 08.06.2013 в 00:50:19