Тема: Как сделать всем вложенным объектам в объекте - explode?

Как сделать всем вложенным объектам в объекте - explode?

Re: Как сделать всем вложенным объектам в объекте - explode?

А в чем проблема? Делаешь explode() основному объекту - получаешь массив ID - вложенных. Проходишься по этому массиву и для каждого из них снова explode(), запоминая результаты в другом массиве. И так далее, пока что-то еще будет расчленяться.

Re: Как сделать всем вложенным объектам в объекте - 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();
}

Re: Как сделать всем вложенным объектам в объекте - explode?

А если во взорванном примитиве есть еще сложные объекты?
Я бы сделал при помощи рекурсии...

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];
}

Re: Как сделать всем вложенным объектам в объекте - explode?

> Леонид
Можно покритикую? smile
1) Использовать выражение:

if (strcmp((pIntEnt->isA())->name(), "AcDbRegion") == 0)

не красиво и не вполне корректно. Намного элегантнее и правильнее:

if (AcDbRegion::cast(pIntEnt))

2) Нет смысла перечислять все объекты, которые могут расчленяться (некоторые из них заранее неизвестны - это могут быть custom entity). Намного красивее вызывать для каждого из них explode() и анализировать код результата и длину полученного массива примитивов.

Re: Как сделать всем вложенным объектам в объекте - explode?

> Александр Ривилис
ИМХО...
2) Это если известно, насколько уровней надо опуститься для полного расчленения. На мой взгляд, рекурсия всегда предпочтительнее, так как код короткий, и все понятно. А неизвестные объекты она и так пропустит.
Хотя, конечно, дело вкуса... всё будет работать.

Re: Как сделать всем вложенным объектам в объекте - explode?

> Леонид
Я не возражал по поводу рекурсии... smile хотя и не считаю, что она всегда предпочтительней.