Тема: Как сделать всем вложенным объектам в объекте - explode?
Как сделать всем вложенным объектам в объекте - explode?
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → Программирование → ObjectARX → Как сделать всем вложенным объектам в объекте - explode?
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Как сделать всем вложенным объектам в объекте - explode?
А в чем проблема? Делаешь explode() основному объекту - получаешь массив ID - вложенных. Проходишься по этому массиву и для каждого из них снова explode(), запоминая результаты в другом массиве. И так далее, пока что-то еще будет расчленяться.
Большое спасибо, проблема решена.
Всё банально и просто:
AcDbVoidPtrArray IdsExp; AcDbEntity *Ent; es = pEnt->explode(IdsExp); if(es != Acad::eOk)return; for(int i =0 ;i<IdsExp.length();i++){ Ent = static_cast<AcDbEntity*>(IdsExp[i]); ... Ent->close(); }
А если во взорванном примитиве есть еще сложные объекты?
Я бы сделал при помощи рекурсии...
void explodeEnt(AcDbDatabase* db, AcDbEntity* ent) { AcDbVoidPtrArray entitySet; Acad::ErrorStatus es = ent->explode(entitySet); // итерация по содержимому for (int i = 0; i < entitySet.length(); i++) { AcDbEntity* pIntEnt = (AcDbEntity*)entitySet[i]; if (strcmp((pIntEnt->isA())->name(), "AcDbRegion") == 0) { explodeEnt(db, pIntEnt); } else if (strcmp((pIntEnt->isA())->name(), "AcDbLine") == 0) { AcDbLine* lin = (AcDbLine*)pIntEnt; // ... process lin } } for (int i = 0; i < entitySet.length(); i++) delete (AcRxObject*)entitySet[i]; }
> Леонид
Можно покритикую?
1) Использовать выражение:
if (strcmp((pIntEnt->isA())->name(), "AcDbRegion") == 0)
не красиво и не вполне корректно. Намного элегантнее и правильнее:
if (AcDbRegion::cast(pIntEnt))
2) Нет смысла перечислять все объекты, которые могут расчленяться (некоторые из них заранее неизвестны - это могут быть custom entity). Намного красивее вызывать для каждого из них explode() и анализировать код результата и длину полученного массива примитивов.
> Александр Ривилис
ИМХО...
2) Это если известно, насколько уровней надо опуститься для полного расчленения. На мой взгляд, рекурсия всегда предпочтительнее, так как код короткий, и все понятно. А неизвестные объекты она и так пропустит.
Хотя, конечно, дело вкуса... всё будет работать.
> Леонид
Я не возражал по поводу рекурсии... хотя и не считаю, что она всегда предпочтительней.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форумы CADUser → Программирование → ObjectARX → Как сделать всем вложенным объектам в объекте - explode?
Форум работает на PunBB, при поддержке Informer Technologies, Inc