Тема: DBX wrapper

вот решил заняться созданием своего объекта на базе полилинии :)
с этим делом проблем не возникло. основная проблема заключается в следующем. wrapper, основная задача которого связывать объект с диспетчером свойств объекта воспринимает все слишком буквально :), т.е. свойства есть какие-то базовые, а не полилинии, как я надеялся, причем явная проблема с языками: имя раздела на русском, а их названия на англицком :).

ну и вопрос, как сделать, чтоб при выделении моего объекта, в диспетчере свойств были свойства базового класса, плюс раздел с моими свойствами?
DBX wrapper

PS: надеюсь, что есть вариант проще чем создавать все свойства с нуля в моем враппере :)

Re: DBX wrapper

А какой CLSID у тебя возвращает метод getClassID()?

Re: DBX wrapper

Acad::ErrorStatus CAcDbRope::getClassID(CLSID * pClsid) const
{
    assertReadEnabled();
    *pClsid = CLSID_AcDbRope_wrapper; // CLSID враппера
    return (Acad::eOk);
}

Re: DBX wrapper

А попробуй вернуть CLSID полилинии.

(изменено: Николай, 28 июля 2010г. 14:43:51)

Re: DBX wrapper

попробовал
тогда идут свойства только полилинии, т.к. враппер оказывается за бортом (вообще не нужен)

Acad::ErrorStatus CAcDbRope::getClassID(CLSID * pClsid) const
{
    assertReadEnabled();
    Acad::ErrorStatus retCode =AcDbPolyline::getClassID(pClsid);
    return (Acad::eOk);
}

а если поставить

Acad::ErrorStatus CAcDbRope::getClassID(CLSID * pClsid) const
{
    assertReadEnabled();
    *pClsid = LIBID_smacadRopeDBXLib;
    return (Acad::eOk);
}

то в диспетчере свойств "Нет набора"

Re: DBX wrapper

Обратите внимание на интерфейс IOPMPropertyExtension
и макросы в OPMPROP_MAP:
OPMPROP_ENTRY(0, <Идентификатор поля>, <Идентификатор категории>, 0, 0, 0, _T(""), 0, 1, IID_NULL, IID_NULL, "")

Re: DBX wrapper

в общем практически со всем разобрался. и как всегда получается через Ж...
есть два варианта наследования при создании враппера: от IAcadObject (если не стоит галочка Entity interface support), и от IAcadEntity, если эта галочка стоит.
В первом случае мы получаем свойства ТОЛЬКО своего объекта, во втором базовые свойства непонятно чего:) и только на английском, т.к. Autodesk doesn't localize this idl/tlb :)
Рассматриваем второй случай, т.к. с первым все понятно, хоть и сильно геморойно.
все что создал акад (это я про свойства) остаются по-любому, ибо такова политика и удалить лишнее у меня не получилось. Нашел способ как перевести имена свойств на русский язык.

STDMETHOD(GetDisplayName) (DISPID dispId, BSTR *propName); // это в h-файл враппера

// ну а это в cpp
STDMETHODIMP CAcDbMyWraper::GetDisplayName (DISPID dispId, BSTR *propName)
{
    switch (dispId)
    {
// стандартное
        case (0x401):
            *propName  = ::SysAllocString(_T("Имя объекта"));
            break;

        case (0x516):
            *propName  = ::SysAllocString(_T("Цвет"));
            break;

        case (0x501):
            *propName  = ::SysAllocString(_T("Слой"));
            break;

        case (0x502):
            *propName  = ::SysAllocString(_T("Тип линий"));
            break;

        case (0x503):
            *propName  = ::SysAllocString(_T("Масштаб типа линий"));
            break;

        case (0x513):
            *propName  = ::SysAllocString(_T("Стиль печати"));
            break;

        case (0x514):
            *propName  = ::SysAllocString(_T("Вес линий"));
            break;

        case (0x515):
            *propName  = ::SysAllocString(_T("Гиперссылка"));
            break;

        case (0x577):
            *propName  = ::SysAllocString(_T("Материал"));
            break;
// моё
        case (0x01):
            *propName  = ::SysAllocString(L"Моя первая переменная");
            break;

        case (0x02):
            *propName  = ::SysAllocString(L"Моя первая переменная");
            break;
    }
    return S_OK;
}    

То, о чем писал Роман Рыкмас, отвечает за отображение СВОИХ полей в разных категориях, и это хорошо. пользуюсь :)

ну для примера

BEGIN_OPMPROP_MAP()
//----- Use the OPMPROP_ENTRY/OPMPROP_CAT_ENTRY macros for each of your properties
  OPMPROP_ENTRY(0, 0x00000001, PROPCAT_Geometry, 0, 0, 0, NULL, 0, 1, IID_NULL, IID_NULL, "")
  OPMPROP_ENTRY(0, 0x00000002, PROPCAT_Geometry, 0, 0, 0, NULL, 0, 0, IID_NULL, IID_NULL, "")
END_OPMPROP_MAP()

это говорит о том, что первая переменная будет иметь доступ на модификацию, а вторая - нет.
обе переменных будут лежать в разделе "Геометрия". Причем именно Геометрия - для русского автокада, а не Geometry, видать эта часть нелокализованного у них все-таки локализована  :o .

Осталась одна проблема. То что вывадится как всплывающая подсказка принаведении в 2009-2011 или то, что выводится в прямоугольничке внизу окна свойств. Короче говоря, речь о строке подсказки.
Свои переменные можно легко перекинуть на русский, а вот стандартные, для модификации которых предусмотрена функция GetDisplayString (кажется класса IOPMPropertyExtension), модифицирует значение переменных а не их хинты. Короче говоря, нормаьлное создание своего объекта - это дело серьезное, и нафик никому не нужное, т.к. почти все примеры которые я находил в сети по этому вопросу оканчиваются на этапе создания DBX. остальные 2% пытаются лезть в класс враппера, но уж очень нагло обходят скользкие моменты, ну и из тех двух процентов 1.5% работают не так, как написано в описании.

ладно. если разберусь с подсказками, то напишу как это сделать.