(изменено: russel, 19 мая 2009г. 22:32:53)

Тема: Explode блока и отрисовка его частей

Привет народ.
Есть такая проблемка, помогите решить.
Есть CustomEntity, который может отрисовываться блоком, т.к. есть проблемы с отрисовкой блока заданым цветом, то делаю explode блока и отрисовываю уже его составные части, все отрисовывается корректно, кроме объекта AcDbSolid, т.е. он не рисуется вообще, в чем может быть проблема?

Привожу код:

Adesk::Boolean Point::subWorldDraw (AcGiWorldDraw *mode) {
    assertReadEnabled () ;
    mode->subEntityTraits().setTrueColor(color().entityColor());

        Acad::ErrorStatus es;
        AcDbBlockTableRecord *pBlockDef = NULL;
        AcDbBlockTable* pBlockTable = NULL;

        AcDbDatabase* pDb = acdbHostApplicationServices()->workingDatabase();
        es = pDb->getBlockTable(pBlockTable, AcDb::kForRead);

        if ( es != Acad::eOk ) { 
            return es; 
        }

        es = pBlockTable->getAt(m_strBlockName, pBlockDef, AcDb::kForRead);
        pBlockTable->close();
        if ( es != Acad::eOk ) {
            return es;
        }
        
        //задаем параметрі блока
        AcDbBlockReference* blockref = new AcDbBlockReference(m_pointPosition, pBlockDef->id());
        pBlockDef->close();

        blockref->setLayer(layerId());
        blockref->setScaleFactors(AcGeScale3d(m_xscale, m_yscale, 1));
        blockref->setRotation(m_rotation);
        
        //explode блока и отрисовка его частей
        AcDbBlockReference* blockrefCopy = new AcDbBlockReference();
        blockrefCopy->copyFrom(blockref);

        AcDbVoidPtrArray explodeObjects;
        blockrefCopy->explode(explodeObjects);

        for (int j = 0; j < explodeObjects.length(); j++)
        {
//если здесь AcDbSolid, то не рисуется.
            AcDbEntity* ent = (AcDbEntity*)explodeObjects.at(j);
            ent->setLayer(layerId());
            ent->setColor(color(), Adesk::kTrue);
            ent->worldDraw(mode);
        }

        delete blockref;
        delete blockrefCopy;
    return Acad::eOk ;
}

(изменено: Александр Ривилис, 20 мая 2009г. 00:14:58)

Re: Explode блока и отрисовка его частей

russel пишет:

//если здесь AcDbSolid, то не рисуется.

1) AcDbSolid или все-таки AcDb3dSolid  :?:
2) Попробуй все тоже самое, но в методе subViewportDraw
3) Это очень плохой стиль выполнять такие операции в методах типа WorldDraw/ViewportDraw - это критичные к времени выполнения операции.

Re: Explode блока и отрисовка его частей

Александр, спасибо за ответ.
1. Если в блоке есть 3dsolid то может быть и он, но пока у меня только Solid. А это важно?
2. Вы знаете, через subViewportDraw получилось, скажите, а в чем принципиальная разница?
3. Какие есть варианты? Хранить AcDbVoidPtrArray вместо названия блока?

Re: Explode блока и отрисовка его частей

russel пишет:

1. Если в блоке есть 3dsolid то может быть и он, но пока у меня только Solid. А это важно?

Ты ничего не путаешь? Solid - это "залитая" (в зависимости от значения переменной FILLMODE) область, ограниченная четырехугольником. Если плоскость ее не перпендикулярна взгляду (DCS), то виден только контур (вне зависимости от FILLMODE). 3DSolid - это твердое тело.

russel пишет:

2. Вы знаете, через subViewportDraw получилось, скажите, а в чем принципиальная разница?

В реализации методов. Правда на Solid это влиять не должно. Только на 3DSolid. Поэтому почему у тебя заработало - не понятно.

russel пишет:

3. Какие есть варианты? Хранить AcDbVoidPtrArray вместо названия блока?

Да. Кроме того тут есть нюанс, связанный с тем, что ты создаешь примитивы, затем отрисовываешь их и сразу удаляешь. Реальная отрисовка происходит не в этот момент, а сами примитивы у тебя уже удалены. Это нехорошо. AutoCAD может аварийно завершится.

Re: Explode блока и отрисовка его частей

Ок, по первым двум вопросам понятно.
А по поводу удаления, в каком месте именно мне их удалять?

Re: Explode блока и отрисовка его частей

russel пишет:

А по поводу удаления, в каком месте именно мне их удалять?

Наверное в деструкторе.

Re: Explode блока и отрисовка его частей

Александр Ривилис пишет:

Да. Кроме того тут есть нюанс, связанный с тем, что ты создаешь примитивы, затем отрисовываешь их и сразу удаляешь. Реальная отрисовка происходит не в этот момент, а сами примитивы у тебя уже удалены. Это нехорошо. AutoCAD может аварийно завершится.

А в какой момент происходит реальная отрисовка?

Re: Explode блока и отрисовка его частей

Это в двух словах не опишешь. В любом случае эта операция происходит асинхронно к методу subWorldDraw примитива.