Тема: Как изменить отображаемое имя?

У меня есть класс, производный от, скажем, AcDbPolyline, - мне необходимо, что бы при выделении объекта этого класса отображалось его имя (например, "трубопровод"), а не "ломаная линия". При этом, должны отображаться все остальные поля как у полилинии. Как это проще сделать?

Re: Как изменить отображаемое имя?

Истина где-то тут...

ACRX_DECLARE_MEMBERS(_CS_DBX_Pribor);
где ACRX_DEFINE_MEMBERS(CLASS_NAME) ==
#define ACRX_DECLARE_MEMBERS(CLASS_NAME) \
    virtual AcRxClass* isA() const; \
    static AcRxClass* gpDesc; \
    static AcRxClass* desc(); \
    static CLASS_NAME* cast(const AcRxObject* inPtr) \
        { return ((inPtr == NULL) || !inPtr->isKindOf(CLASS_NAME::desc())) \
          ? NULL : (CLASS_NAME*)inPtr; }; \
    static void rxInit()
// ACRX_DEFINE_MEMBERS(CLASS_NAME)
//
// Use this macro to define the member functions declared with
// the ACRX_DECLARE_MEMBERS() macro.
//
// This macro does not create the associated AcRxClass object; that is
// the responsibility of a service implementation, i.e., the "rxInit()"
// static member-function declared by the ACRX_DECLARE_MEMBERS() macro.
//
// The ACRX_xxx_DEFINE_MEMBERS() macros defined below use this macro,
// as well as provide alternate definitions for the "rxInit()" function.
//

Re: Как изменить отображаемое имя?

Да это понятно, но только это имя мне надо определять во время исполнения sad

Re: Как изменить отображаемое имя?

У меня сработал такой фокус:
ACRX_DXF_DEFINE_MEMBERS(adtJoint, AcDbEntity,
AcDb::kDHL_CURRENT, AcDb::kMReleaseCurrent,
                        AcDbProxyEntity::kNoOperation, Стык, adtFrameEntities);
т.е. примитив стал называться по-русски "Стык". Но это нелегальный трюк: по документации DXFName должно быть латинским и без пробелов. Тем не менее, если не надо писаться в DXF, то it works.
Кстати, как в программе узнать локализованное название примитива, я пока еще не нашел...

Re: Как изменить отображаемое имя?

DiKey, локализованное имя примитива можно узнать через COM. Но только у меня другая проблема - есть мой класс, он содержит внедрённый полиморфный указатель на некие данные, среди прочих, в этих данных и есть имя, полностью характеризующее объект (например, "трубопровод") - его я и хочу отображать вместо имени. Мало того, на самом деле у меня есть шаблон линейного объекта, который в качестве параметра может принимать любой класс, производный от AcDbCurve, - я имею несколько классов, которые производны от AcDbLine, AcDbPolyline, AcDbCircle и т.д., только это всё равно трубопроводы (или ЛЭП, или ещё что, неважно что).
Сейчас, склоняюсь к тому, что бы динамически формировать реализации IDispatch в зависисмости от ситуации...

Re: Как изменить отображаемое имя?

мы ведь ведем речь об окне "Properties"?
По-моему проще было бы сделать так:
в com wraper-e  определить некоторое поле, как то "Имя", да и выводить значение этого имени.
А то, что будет отображаться класс XXXLine или еще что, то это не так важно.

Re: Как изменить отображаемое имя?

Michael, это было бы проще, если бы не одно но... У меня новые классы генерируются на основе шаблона. Добавляя одну строчку в программу, я добавляю новый класс. Но, стандартный com wraper придётся писать для каждого класса - это приведёт к разбуханию кода и проблемам с масштабируемостью, поэтому идти по такому пути я не хочу.

Re: Как изменить отображаемое имя?

Я тут разобирался с отображаемыми именами и вот что получается. Отображаемое имя примитива возвращается COM-Wrapper'ом через GetDisplayName с DISPID==1025, Поэтому динамически подписать примитив из этой функции труда не составит.