Тема: Объекты блока
Здравствуйте! Подскажите, плз., как получить AcDbObjectId объектов, входящих в состав блока. Заранее благодарен.
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → Программирование → ObjectARX → Объекты блока
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Здравствуйте! Подскажите, плз., как получить AcDbObjectId объектов, входящих в состав блока. Заранее благодарен.
1. Начнём с терминологии. Что понимаешь под блоком? Запись таблицы блоков (AcDbBlockTableRecord) или вставка блока (AcDbBlockReference)?
2. Если имеется в виду AcDbBlockTableRecord, то создаёшь итератор и проходишься им.
Вот пример, как установить атрибут видимости для всех примитивов в блоке:
AcDbObjectPointer<AcDbBlockTableRecord> pCurSpace(acdbCurDwg()->currentSpaceId(),AcDb::kForRead); if (pCurSpace.openStatus() == Acad::eOk) { AcDbBlockTableRecordIterator *pIter = 0; pCurSpace->newIterator(pIter); if (pIter) { for ( ; !pIter->done(); pIter->step()) { AcDbObjectId eId; pIter->getEntityId(eId); AcDbObjectPointer<AcDbEntity> pEnt(eId,AcDb::kForWrite); if (pEnt.openStatus() == Acad::eOk) { pEnt->setVisibility(AcDb::kVisible,true); } } delete pIter; } }
Нет. Это я знаю. Я имел ввиду AcDbBlockReference. Задача такова: нарисован блок (например круг+прямоугольник). Надо определить AcDbObjectId круга и прямоугольника. Я это делал при помощи acedNEntSel. работает. Но нужен автомат. Пробежался по базе - нашел вхождение блока (ну это как в Вашем примере), потом в найденый блок заглянул... и вот задача: узнать, из чего он состоит.
Нет. Это я знаю. Я имел ввиду AcDbBlockReference. Задача такова: нарисован блок (например круг+прямоугольник). Надо определить AcDbObjectId круга и прямоугольника.
Круг и прямоугольник - примитивы внутри AcDbBlockTableRecord. Так что с терминологией у тебя плохо.
Что ты об этом блоке знаешь? Его имя? Его AcDbObjectId?
// Массив AcDbObjectId из блока по его (т.е. AcDbBlockTableRecord) AcDbObjectId Acad::ErrorStatus ObjectIdArrayFromBlock(AcDbObjectId idBTR, AcDbObjectIdArray &ids) { Acad::ErrorStatus es; AcDbBlockTableRecordPointer pBTR(idBTR,AcDb::kForRead); if ((es = pBTR.openStatus()) != Acad::eOk) return es; AcDbBlockTableRecordIterator *iter = NULL; if ((es = pBTR->newIterator(iter)) != Acad::eOk) return es; if (iter) { AcDbObjectId eId; for (;!iter->done(); iter->step()) { if (iter->getEntityId(eId) == Acad::eOk) ids.append(eId); } delete iter; } return Acad::eOk; } // Массив AcDbObjectId из блока по его имени Acad::ErrorStatus ObjectIdArrayFromBlock(ACHAR *blockName, AcDbObjectIdArray &ids) { Acad::ErrorStatus es; AcDbBlockTableRecordPointer pBTR(blockName,acdbCurDwg(),AcDb::kForRead); if ((es = pBTR.openStatus()) != Acad::eOk) return es; AcDbBlockTableRecordIterator *iter = NULL; if ((es = pBTR->newIterator(iter)) != Acad::eOk) return es; if (iter) { AcDbObjectId eId; for (;!iter->done(); iter->step()) { if (iter->getEntityId(eId) == Acad::eOk) ids.append(eId); } delete iter; } return Acad::eOk; }
А что если изначально была вставка блока AcDbBlockReference. Как перейти к блоку (AcDbBlockTableRecord) и по нему итерироваться?
у каждого экземпляра блока есть ссылка на главную таблицу:
AcDbBlockReference::blockTableRecord()
А что если изначально была вставка блока AcDbBlockReference. Как перейти к блоку (AcDbBlockTableRecord) и по нему итерироваться?
Возможно такой код будет интересен: Получение имени блока в ARX
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форумы CADUser → Программирование → ObjectARX → Объекты блока
Форум работает на PunBB, при поддержке Informer Technologies, Inc