Статическая информация типа для каждого объекта COM - не единственный источник информации свойства для OPM. OPM также делает запрос объекта для нескольких других интерфейсов, чтобы управлять вещи типа классификации свойства, названия значения свойства для раскрывающихся списков, и инициализация диалогов для редактирования " в собственность " (типа диалогов кнопки замещающего знака). Они будут описаны подробно позже в этой секции, но будут упомянуты все вместе как “ flavoring ” интерфейсы.

Статические OPM Интерфейсы COM

Если заказной объект не осуществляет обертку объекта COM для себя, GetIUnknownOfObject генерирует заданную по умолчанию обертку, которая осуществляет методы IACADENTITY или IACADOBJECT, в зависимости от того, если основной объект может приводиться AcDbEntity. OPM тогда использует этот объект, чтобы отобразить Цвет, Уровень, Linetype, и Lineweight свойства, также известный как примитив общие свойства. ICategorizeProperties, IPerPropertyBrowsing, и IOPMPROPERTYEXTENSION - интерфейсы flavoring.

Эта секция описывает OPM flavoring интерфейсы подробно и объясняет, как использовать их, чтобы управлять дисплей статических свойств в OPM.

Все другие статические интерфейсы будут зарегистрированы в другом месте как часть документации Автоматизации.

ICategorizeProperties Интерфейс

Этот интерфейс используется OPM, чтобы категоризировать свойства, показанные в контроле. Это необязательно, но строго рекомендовано. Если объект не осуществляет этот интерфейс, все свойства категоризированы под “Генералом”. OPM не поддерживает вложение категорий.

НЕ нашли? Не то? Что вы ищете?

OPM будет использовать QueryInterface для этого интерфейса, когда это собирает информацию свойства. Типично это произойдет, когда пользователь выбирает объекты, вызывая набор pickfirst измениться. Если QueryInterface преуспевает, это вызывает MapPropertyToCategory для каждого свойства, определенного информацией типа для объекта. Если категория (PROPCAT) возвращенный - не одно из предопределенных значений, это вызывает GetCategoryName, чтобы определить которую категорию разместить свойство в. Если Вы только заинтересованы категоризацией использования предопределенных значений, Вы можете возвращать E_NOTIMPL от GetCategoryName. Это требует, чтобы Вы знали DISPID для каждого из ваших свойств. Активная Библиотека Шаблонов (ATL) автоматически назначает значения DISPID на свойства в файлах IDL, которые определяют ваш интерфейс. Они - числа рядом с ключевым словом “id” в списке атрибута свойства.

IPerPropertyBrowsing Интерфейс

IPerPropertyBrowsing - стандарт интерфейс Microsoft. Пожалуйста см. документацию Microsoft для детального объяснения. Это типично используется подручными меню (типа OPM) чтобы отобразить вкладки для объектов, которые имеют их. Это имеет две основных функции. Первый должен связать вкладку или другой диалог со специфическим свойством через кнопку замещающего знака на OPM диалоге. Вторая цель IPerPropertyBrowsing состоит в том, чтобы поддержать заказные раскрывающиеся списки свойства в контроле OPM.

IOPMPropertyExtension Интерфейс

IOPMPropertyExtension - коллекция других flavoring функциональных возможностей.

GetDisplayName используется, чтобы перегрузить имя свойства от этого в информации типа. Доступно для редактирования используется, чтобы делать свойства, которые могут быть установлены в информации типа к только для чтения в OPM. ShowProperty временно удаляет свойство из отображения в OPM.

IOPMPropertyExpander Интерфейс

Основная цель этого класса состоит в том, чтобы позволить одному свойству вспыхиваться в несколько свойств в OPM. Например, Автоматизация имеет свойство по имени StartPoint для AcadLine. Это свойство получает или устанавливает ВАРИАНТ, который содержит массив, удваивается (технически ВАРИАНТ содержит указатель на SAFEARRAY, удваивает) представление точки начала линии. Это несколько более эффективно и более чисто с точки зрения API чем наличие свойств Автоматизации по имени StartX, StartY, StartZ на AcadLine. Однако, OPM должен отобразить свойства, расширялся из этим способом. В добавлении к разбиванию одного свойства в массив свойств, Вы можете также группировать элементы в том массиве. Например, для вершины ломаной линии, имеется одно свойство Автоматизации, “Координаты”, который возвращается, массив удваивает, каждая последовательная пара, представляющая X, Y вершину 2-ой ломаной линии. Определяя группировку, OPM автоматически создаст контроль spinner для свойства, позволяя пользователю перечислять и изменить значения вершины.

Эти методы необязательные, с тех пор в большинстве случаев, Вы можете создавать отдельные свойства в IDL.

Реализация Статические Интерфейсы OPM

Чтобы осуществлять обертки объекта COM, определяющие статические свойства для заказных объектов, самый простой метод состоит в том, чтобы использовать ATL. ATL делает это очень простым создать объекты COM та поддержка IDispatch. Наиболее трудная часть интегрирует ObjectARX заказной объектный код с ActiveX Сервером DLLs, что ATL генерирует.

Как только основной объект работает, просто добавить свойства, которые обнаружятся в OPM. См. предыдущую секцию для команд, чтобы создать основную обертку объекта COM для ваших заказных объектов.

Добавлять свойства

1 Идут к Представлению Класса в IDE Visual C++, щелкают правой кнопкой мыши на заказном интерфейсе примитива (типа IAsdkSquareWrapper), и выбирают AddProperty.

2 Для Типа Свойства, выберите Двойной. Для Имени Свойства, выберите свойство (типа SquareSize). Оставьте пробел параметров.

3 В заглушке, что Мастер, созданный для Вас, добавьте следующий код запроса (типа функции get_SquareSize от выборки многоугольника):

AcDbObjectPointer<AsdkSquare> pSq(m_objId, AcDb::kForRead);

if (pSq. openStatus() != Acad::eOk)

return E_ACCESSDENIED;

double size;

pSq->squareSideLength(size);

*pVal = size;

return S_OK;

4 В заглушке, которую Мастер создавал, добавьте следующий код модификации (типа функции put_SquareSize от выборки многоугольника):

AcDbObjectPointer<AsdkSquare> pSq(m_objId, AcDb::kForWrite);

if (pSq. openStatus() != Acad::eOk)

return E_ACCESSDENIED;

pSq->setSquareSideLength(newVal);

return S_OK;

5 В AutoCAD, загрузите приложение (типа squareui. arx) и выполните команду, чтобы создать заказной примитив.

6 Удостоверятся, ЧТО OPM загружен. Выберите объект. Вы должны видеть и быть способными изменить общие свойства примитив и побочная длина. Обратите внимание, что SquareSize свойство отображает под “Общей” категорией.

Категоризировать свойства

Вы не можете хотеть, чтобы все ваши свойства обнаружились под “Общей” категорией, так что эта следующая секция демонстрирует, как использовать встроенные категории.

1 Идут к Представлению Класса в IDE Visual C++, щелкают правой кнопкой мыши на заказном интерфейсе примитива (типа IAsdkSquareWrapper), и выбирают AddProperty. Добавьте свойства для квадратного центра и номера ID.

2 Затем изменяют образование из объекта COM, чтобы включить IOPMPropertyExtensionImpl и IOPMPropertyExpander:

public IOPMPropertyExtensionImpl<CAsdkSquareWrapper>,

public IOPMPropertyExpander

3 Добавляют интерфейсы к карте интерфейса COM:

COM_INTERFACE_ENTRY(IOPMPropertyExtension)

COM_INTERFACE_ENTRY(ICategorizeProperties)

COM_INTERFACE_ENTRY(IPerPropertyBrowsing)

COM_INTERFACE_ENTRY(IOPMPropertyExpander)

4 Добавляют объявление для интерфейса IOPMPropertyExtension:

// IOPMPropertyExtension

//

BEGIN_OPMPROP_MAP()

OPMPROP_ENTRY(0, 0x00000001, PROPCAT_Data, \

0, 0, 0, "", 0, 1, IID_NULL, IID_NULL, "")

OPMPROP_ENTRY(0, 0x00000003, PROPCAT_Geometry, \

0, 0, 0, "", 0, 1, IID_NULL, IID_NULL, "")

END_OPMPROP_MAP()

5 Добавляют следующий две подставляемых функции к классу:

STDMETHOD(GetCategoryName)(

THIS_

/* [in] */ PROPCAT propcat,

/* [in] */ LCID lcid,

/* [out] */ BSTR* pbstrName)

{return S_FALSE;}

virtual HINSTANCE GetResourceInstance()

{

return _Module. GetResourceInstance();

}

6 Добавляют объявления для следующих функций:

STDMETHOD(GetElementValue)(

/* [in] */ DISPID dispID,

/* [in] */ DWORD dwCookie,

/* [out] */ VARIANT * pVarOut) ;

// Used for property expansion (currently variant types)

//

STDMETHOD(SetElementValue)(

/* [in] */ DISPID dispID,

/* [in] */ DWORD dwCookie,

/* [in] */ VARIANT VarIn) ;

// Used for property expansion (currently variant types)

//

STDMETHOD(GetElementStrings)(

/* [in] */ DISPID dispID,

/* [out] */ OPMLPOLESTR __RPC_FAR *pCaStringsOut,

/* [out] */ OPMDWORD __RPC_FAR *pCaCookiesOut) ;

//Used for property expansion (currently variant types)

//

STDMETHOD(GetElementGrouping)(

/* [in] */ DISPID dispID,

/* [out] */ short *groupingNumber) ;

// Used for property expansion (currently variant types)

//

STDMETHOD(GetGroupCount)(

/* [in] */ DISPID dispID,

/* [out] */ long *nGroupCnt) ;

STDMETHOD(GetPredefinedStrings)(

/* [in] */ DISPID dispID,

/* [out] */ CALPOLESTR *pCaStringsOut,

/* [out] */ CADWORD *pCaCookiesOut);

STDMETHOD(GetPredefinedValue)(

/* [in] */ DISPID dispID,

/* [out] */ DWORD dwCookie,

/* [out] */ VARIANT *pVarOut);

7 Добавляют выполнение для функции в CPP исходном файле. Эти примеры - для объекта AsdkSquare:

STDMETHODIMP CAsdkSquareWrapper::GetElementValue(

/* [in] */ DISPID dispID,

/* [in] */ DWORD dwCookie,

/* [out] */ VARIANT * pVarOut)

{

if (pVarOut == NULL)

return E_POINTER;

AcDbObjectPointer<AsdkSquare> pSq(m_objId, AcDb::kForRead);

if (pSq. openStatus() != Acad::eOk)

return E_ACCESSDENIED;

if (dispID == 0x03) {

AcGePoint3d acgePt;

pSq->squareCenter(acgePt);

AcAxPoint3d acaxPt(acgePt);

::VariantCopy(pVarOut,&CComVariant(acaxPt[dwCookie]));

}

return S_OK;

}

STDMETHODIMP CAsdkSquareWrapper::SetElementValue(

/* [in] */ DISPID dispID,

/* [in] */ DWORD dwCookie,

/* [in] */ VARIANT VarIn)

{

AcDbObjectPointer<AsdkSquare> pSq(m_objId, AcDb::kForRead);

if (pSq. openStatus() != Acad::eOk)

return E_ACCESSDENIED;

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132