//
virtual IUnknown* GetIUnknown(AcDbDatabase* pDatabase) = 0;
// Установить связь между объектом базы данных и оберткой COM.
// Если IUNKNOWN - NULL, то связь удалена.
//
virtual Adesk::Boolean SetIUnknown(AcDbDatabase* pDatabase,
IUnknown* pUnknown) = 0;
// Учитывая указатель на объект базы данных, возвратите IDISPATCH объекта документа.
// NULL возвращен, если база данных не принадлежит специфическому документу.
//
virtual IDispatch* GetDocIDispatch(AcDbDatabase* pDatabase)= 0;
// Установить связь между объектом базы данных и IDISPATCH документа, которому
// это принадлежит. Если IDISPATCH - NULL, то связь удалена.
//
virtual Adesk::Boolean SetDocIDispatch(AcDbDatabase* pDatabase,
IDispatch* pDispatch) = 0;
};
Создание Объекта COM
API Автоматизации ответствен за создание соответствующего объекта COM для данного объекта резидента базы. AutoCAD осуществляет набор интерфейсов для всех объектов резидента базы данных с соответствующими компонентами Автоматизации.
Многие из этих интерфейсов будут осуществлены автоматически для ваш AcDbObject-получаемый или AcDbEntity полученный класс, когда Вы используете ATL-ОСНОВАННЫЕ обеспеченные шаблоны.
При создании расширений{*продлений*} к API Автоматизации, Вы могут были должны создать объект COM для данного указателя AcDbObjectId или AcDbObject. Это может быть сделано, используя CoCreateInstance сопровождаемый при помощи AcAxOleLinkManager и IACADBASEOBJECT, чтобы основать соответствующие связи. Следующие функции экспортируются для этой цели:
// Получить IUNKNOWN существующего объекта COM (или недавно созданный объект COM,
// если не существуете) который представляет AcDbObject, пропускал{*прошел*} в.
//
HRESULT
AcAxGetIUnknownOfObject(LPUNKNOWN* ppUnk, AcDbObjectId& objId,
LPDISPATCH pApp);
HRESULT
AcAxGetIUnknownOfObject(LPUNKNOWN* ppUnk, AcDbObject* pObj,
LPDISPATCH pApp);
Объекты COM созданы через CoCreateInstance () использование CLSID, который идентифицирует тип объекта. Чтобы отыскивать передачу CLSID для данного объекта AcDbObject-derived, используйте его getClassID () функция. Эта функция определена на уровне AcDbObject и перегружена на каждом другом уровне в иерархии классов, которая имеет различный тип объекта COM, чтобы представить это.
// Получить соответствующий класс обертки COM ID.
//
virtual Acad::ErrorStatus getClassID(CLSID* pClsid) const;
Например, если Вы создаете заказной примитив (другими словами, AcDbEntity - dполучил{*происходил*} класс) и не перегружать getClassID (), тогда возвращенный CLSID - тот для AcadEntity. Это означает, что ваши заказные примитивы будут по крайней мере иметь функциональные возможности основного уровня, даже если Вы не обеспечиваете поддержку COM для вашего примитива.
Имеется дополнительное требование для использования следующих API, чтобы создать объекты COM для вашего AcDbObject-полученного класса:
IAcadBlock::AddCustomObject(BSTR ClassName, LPDISPATCH* pObject)
IAcadModelSpace::AddCustomObject(BSTR ClassName,
LPDISPATCH* pObject)
IAcadPaperSpace::AddCustomObject(BSTR ClassName,
LPDISPATCH* pObject)
CAcadDictionary::AddObject(BSTR Keyword, BSTR ObjectName,
IAcadObject** pObject)
Эти функции берут фактическое AcDbObject-полученное имя класса (например, AcDbMyObject) и создают объект COM для Вас. После того, как объект COM создан, IAcadBaseObjectId:: SetObjectId () будет, обратился к этому, чтобы позволить AcDbObject-полученному классу быть инициализированным и добавлен к базе данных.
К obtai n CLSID для данного AcDbObject-полученного имени класса, системный реестр системы должен содержать вход с именем вашего AcDbObject и его передачи CLSID значение.
Размещение системного реестра напоминает это:
HKEY_LOCAL_MACHINE\SOFTWARE\Autodesk\
ObjectDBX\
ActiveXCLSID\
AcRxClassName\CLSID:REG_SZ:
{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}
В примере выше, замените AcRxClassName именем вашего AcDbObject-полученного класса (другими словами, AcDbMyObject).
Выполнение Объектов Автоматизации
Следующие Определенные автохамом интерфейсы поддержаны объектами COM в API Автоматизации, которые представляют объект в базе данных:
IacadBaseObject | Поддерживает связь к AcDbObject через AcDbObjectId. |
IacadObjectEvents | Исходный интерфейс, который уведомляет клиентов COM когда AcDbObject изменился. |
IretrieveApplication | Используемым, чтобы сообщить объект COM, что возвращаться для Прикладного свойства. |
IacadObject | Выставляет все общие свойства и методы, которые обращаются к каждому объекту в базе данных. |
IacadEntity | Выставляет все общие свойства и методы, которые обращаются к каждому примитиву в базе данных. (Только применимый для AcDbEntity –наследованных классов.) |
Следующие интерфейсы - не AutoCAD, определенный, но требованы для надлежащего поведения:
Idispatch | Позволяет поздно обязывать. Броузеры типа OPM требуют этого интерфейса. |
IconnectionPointContainer | Используемым, чтобы сохранить список точек соединения. |
IconnectionPoint | Используемым, чтобы позволить клиентов COM, чтобы просить о уведомлении. |
IsupportErrorInfo | Сообщает клиентам COM что объектная информация ошибки поддержек. |
Если Вы создаете класс COM, чтобы представить AcDbObject-полученный класс, Вы будете должны осуществить все эти интерфейсы.
Шаблоны ATL
Если Вы используете ATL наряду с ATL-ОСНОВАННЫМИ шаблонами из AutoCAD, чтобы создать ваши объекты Automation, все интерфейсы, перечисленные выше будут осуществлены автоматически. Вы можете концентрироваться на определенных свойствах и методах для вашего AcDbObject-полученного класса; все остальное осуществлено или Autodesk или Microsoft.
Autodesk обеспечивает следующие ATL-ОСНОВАННЫЕ шаблоны:
ATL-ОСНОВАННЫЕ шаблоны (объявлены в axtempl. h)
Template | Implements |
CProxy_AcadObjectEvents | IAcadObjectEvents, IConnectionPoint |
IacadBaseObjectImpl | IAcadBaseObject, IConnectionPointContainer |
IretrieveApplicationImpl | IRetrieveApplication |
IacadObjectDispatchImpl | IAcadObject, IDispatch |
IacadEntityDispatchImpl | IAcadEntity |
Изменяя образование из ATL IDispatchImpl шаблон к IACADENTITYDISPATCHIMPL или IACADOBJECTDISPATCHIMPL, Вы будете иметь автоматическое выполнение для всех требуемых интерфейсов. Шаги, требуемые осуществлять автоматизацию охвачены подробно в “ Взаимодействующий с AutoCAD. ”
Взаимодействие с AutoCAD
Взаимодействие Пользователя (типа acedGetPoint) от запроса Автоматизации должно быть обернуто вокруг ряда ObjectARX ВЫЗОВОВ API. Это позволяет Вам сохранять AutoCAD “состояние” перед взаимодействием и затем восстанавливать это впоследствии. Это также гарантирует, что любой другой из - процесса запросы Автоматизации отклонены для продолжительности вашего взаимодействия. Это предотвращает другого клиента Автоматизации от изменения командной строки или базы данных, в то время как Вы ожидаете ввод пользователя.
ObjectARX API, чтобы использовать при взаимодействии с пользователем включают следующие функции:
Adesk::Boolean acedSetOLELock(int handle, int flags=0);
Adesk::Boolean acedClearOLELock(int handle);
void acedPostCommandPrompt();
Например:
// Получить точку в AutoCAD, даже при том, что точка не используется.
//
STDMETHODIMP CMyApp::GetPoint()
{
// Установление блокировки сообщает AutoCAD, чтобы отклонить любой другой из - процесса запросы
// Автоматизации. Если этот запрос сделан от неизвестного контекста (например, не нормалью AutoCAD
// зарегистрированной командой или lisp), то это также сохраняет поток состояние AutoCAD.
//
if (acedSetOLELock(5) != Adesk::kTrue)
{
return E_FAIL;
}
// Do the input acquisition (interaction) == Делайте входное приобретение (взаимодействие).
//
ads_point result;
if(ads_getpoint(NULL, "Pick a point: ", result) != RTNORM)
{
return E_FAIL;
}
// Clear the lock to allow out-of-process Automation
// requests to be accepted again. If the AutoCAD state was saved
// during the call to acedSetOLELock(), then the saved state is
// restored.
// Очистить блокировку, чтобы позволить из - процесса запросам Автоматизации быть принятым
// снова. Если состояние AutoCAD было сохранено в течение запроса к acedSetOLELock (), то
// сохраненное состояние восстановлено.
//
acedClearOLELock(5);
//Вынуждает AutoCAD восстанавливать изображение приглашения ко вводу команды..
//
acedPostCommandPrompt();
return S_OK;
}
Блокировка документа
Запросы Автоматизации могут быть обработаны во всех возможных контекстах AutoCAD. Это означает, что Вы ответствены за блокировку документа перед изменением этого. Будут также иметься времена, когда Вы будете хотеть делать документ “поток” временно. Например, при добавлении примитива к *MODELSPACE или *PAPERSPACE Вы должны блокировать и делать поток документа. Отказ{*неудача*} блокировать документ в некоторых контекстах вызовет нарушение “блокировки” в течение модификации базы данных. Неудача делать поток документа заставит ваш примитив быть “невидимым” в графическом дисплее (даже после регенерации).
ObjectARX API включает функции в менеджера документа класс, чтобы делать это. Так как это - общая задача, мы формировали функциональные возможности в экспортируемый класс AcAxDocLock.
Например:
STDMETHODIMP CMyEntity::Modify()
{
AcAxDocLock docLock(m_objId, AcAxDocLock::kNormal);
|
Из за большого объема этот материал размещен на нескольких страницах:
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 |


