Тема: Как создать иконку блока (PreviewIcon)?

Всем привет.
Как с помощью arx можно создать иконку блока, аналогично как это умеет делать design center, и команда создания блока?
Можно ли выполнять масштабирование созданой иконки?
Есть метод:
Acad::ErrorStatus
  getPreviewIcon(PreviewIcon & previewIcon) const;
но как им пользоваться не известно

Re: Как создать иконку блока (PreviewIcon)?

HBITMAP gswrBlockIcon2Bmp(const AcDbObjectId &blkId, HDC hdc)
{
    Acad::ErrorStatus es;
    AcDbBlockTableRecord *pBlk = NULL;
    AcArray<Adesk::UInt8> icon;
    try {
        es = acdbOpenObject(pBlk, blkId, AcDb::kForRead);
        if (es != Acad::eOk) throw 1;
        if (!pBlk->hasPreviewIcon()) {
            pBlk->close();
            return NULL;
        }
        es = pBlk->getPreviewIcon(icon);
        if (es != Acad::eOk) throw 2;
        es = pBlk->close();
        if (es != Acad::eOk) throw 3;
    } catch (...) {
        pBlk->close();
        return NULL;
    }
    
    
    BITMAPINFOHEADER    ih;
    memcpy(&ih, icon.asArrayPtr(), sizeof(ih));
    size_t memsize = sizeof(BITMAPINFOHEADER) + ((1<<ih.biBitCount) * sizeof(RGBQUAD));
    LPBITMAPINFO bi = (LPBITMAPINFO)malloc(memsize);
    memcpy(bi, icon.asArrayPtr(), memsize);
    HBITMAP hbm = CreateDIBitmap(hdc, &ih, CBM_INIT, icon.asArrayPtr() + memsize, bi, DIB_RGB_COLORS);
    free(bi);
    return hbm;
}

Enjoy!!!

Re: Как создать иконку блока (PreviewIcon)?

Метод
Acad::ErrorStatus
getPreviewIcon(PreviewIcon & previewIcon) const
вернет иконку если команда blockicon была запущена, а как  программно заставить Автокад сгенерировать иконку для отдельного блока не используя команд?   Спасибо!

Re: Как создать иконку блока (PreviewIcon)?

Штатной "штуки" похоже нет, а если и есть, то тщательно скрывается.
Если бы я решал эту задачу, то наверное, пошел бы следующим путем:
Наследовать класс AcGiWorldGeometry и переопределить
все AcGiGeometry Primitive Drawing Functions таким образом, чтобы они рисовали на "своем" bitmap-е, ну и остальное что нужно.
Далее останется задать bitmap и "запихнуть" в AcGiGeometry::draw()  нужный AcDbBlockTableRecord.
Хотя если иметь такой класс, то "пихать" в него можно будет все, что автокадом может рисоваться.
По-моему должно работать.
Предлагаю обсудить, так как подозреваю, что самому скоро потребуется.
Идея бесплатная. :)

Re: Как создать иконку блока (PreviewIcon)?

В COM AutoCAD есть функции, позволяющие сохранить часть чертежа как *.bmp или *.wmf.
- Export(FileName, Extension, SelectionSet). Т.е. сохранить wmf (чтобы не было проблем с масштабированием), загрузить обратно, отрисовать его в bitmap'е, сделать из bitmap'а иконку и присвоить ее блоку.
Огранчение следующее: графика должна быть на экране, т.е. метод не подойдет для блоков, создаваемых полностью "в темную". Для них по-моему подойдет только вышеизложенная "бесплатная идея". Реализовать что-то подобное ей я пытался, но сразу выяснилось, что результат в моем случае не окупил бы затраты времени.

Re: Как создать иконку блока (PreviewIcon)?

Да, насчет того, что "графика должна быть на экране", я не совсем точно выразился. Я имел в виду, что надо иметь возможность загнать ее в SelectionSet.

Re: Как создать иконку блока (PreviewIcon)?

> Michael
Это очень даже непросто smile
А для чего нужны иконки? Если нужно выводить изображение на  экран, то я создал оконный класс, в который внедрены указатели на AcGsDevice, AcGsView и AcGsModel и который умеет отображать передаваемые ему объеты. Блоки отображаються замечательно, но вот с линиями я пока ещё не разобрался.
Можно попробовать создавать такое окно невидимым, и посылать ему сообщение WM_PRINT с подготовленным в памяти контекстом устройства, возможно может получиться...

Re: Как создать иконку блока (PreviewIcon)?

Еще вопрос в тему.
Как создать окна просмотра блока, аналогично как в DesignCenter. Там это окно называется "RenderPreviewWindow" но как оно работает ? sad
Хотя мне кажется свою задачу оно решает путем предложенным

Наследовать класс AcGiWorldGeometry (или возможного другого типа AcGs..)

Re: Как создать иконку блока (PreviewIcon)?

Насчет

В COM AutoCAD есть функции, позволяющие сохранить часть чертежа как *.bmp или *.wmf.
- Export(FileName, Extension, SelectionSet).

Эта функция работает немного не так. Главным ее недостаттком является рисование большой области соответсвующей размерам экрана на момент экспорта.
В идеале я от нее ожидал прямоугольник с selectionSet(и только с ним)