в общем практически со всем разобрался. и как всегда получается через Ж...
есть два варианта наследования при создании враппера: от 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% работают не так, как написано в описании.
ладно. если разберусь с подсказками, то напишу как это сделать.