Acad. lib
Rxapi. lib
Acedapi. lib
5 Добавляют соответствующие строки к файлу DEF в секцию EXPORTS:
AcrxEntryPoint
_SetacrxPtp
AcrxGetApiVersion
6 Открывают AsdkComMfcDocSamp. cpp исходный файл и добавляют следующий код, чтобы делать программу ObjectARX совместимой. Обратите внимание, что макрокоманда вызывает acrxEntryPoint () функция для AFX_MANAGE_STATE(AfxGetStaticModuleState()):
static void initApp()
{
acedRegCmds->addCommand(
"ASDK_MFC_COM",
"AsdkMfcComCircle",
"MfcComCircle",
ACRX_CMD_MODAL,
addCircleThroughMfcCom);
}
static void unloadApp()
{
acedRegCmds->removeGroup("ASDK_MFC_COM");
}
extern "C" AcRx::AppRetCode acrxEntryPoint
(AcRx::AppMsgCode msg, void* appId)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
switch(msg)
{
case AcRx::kInitAppMsg:
acrxDynamicLinker->unlockApplication(appId);
acrxDynamicLinker->registerAppMDIAware(appId);
initApp();
break;
case AcRx::kUnloadAppMsg:
unloadApp();
break;
default:
break;
}
return AcRx::kRetOK;
}
7 следующий шаг должен решить, который интерфейсы являются необходимыми получить круг в пространство модели. В этом случае, IACADAPPLICATION, IAcadDocument, и интерфейсы IACADMODELSPACE требованы. Чтобы получить определения этих интерфейсов, используйте AutoCAD, напечатают библиотеку (acad. tlb). Сначала выберите ClassWizard из меню VIEW. Тогда выберите, добавляют Класс и указку От Библиотеки Типов. В Импорте от диалога Библиотеки Типа, выберите acad. tlb файл из корневого каталога AUTOCAD, и выберите Открытый. От Подтверждающегося диалога Классов, мультивыберите IACADAPPLICATION, IAcadDocument, и IACADMODELSPACE Классы интерфейса. Заголовок и файл выполнения будут по умолчанию к acad. h и acad. cpp, соответственно. Нажмите OK, и ClassWizard импортирует эти классы интерфейса от библиотеки типов.
8 Открывают acad. cpp и acad. h файлы и исследуют классы и методы, которые были импортированы.
ОБРАТИТЕ ВНИМАНИЕ, что все ActiveX интерфейсы Автоматизации зарегистрированы в ActiveX и VBA Ссылке.
9 Открывают AsdkComMfcDocSamp. cpp файл и добавляют следующую функцию к file:
void addCircleThroughMfcCom ()
{
}
10 Добавляют объявления для трех классов интерфейса:
IAcadApplication IApp;
IAcadDocument IDoc;
IAcadModelSpace IMSpace;
11 Используют acedGetAcadWinApp, чтобы получить объект CWinApp MFC для AutoCAD и вызывать GetIDispatch метод.
IDispatch *pDisp = acedGetAcadWinApp()->GetIDispatch (TRUE);
12, как только Вы имеете, объект IDispatch, прикрепляет это к локально определенному объекту IAcadApplication и удостоверится, что AutoCAD видим:
IApp. AttachDispatch (pDisp);
IApp. SetVisible (true);
13 Получают активный документ, посылают и прикрепляют это к локально определенному объекту IAcadDocument:
pDisp = IApp. GetActiveDocument ();
IDoc. AttachDispatch (pDisp);
14 Сделают запрос активного документа для пространства модели.
pDisp = IDoc. GetModelSpace ();
IMSpace. AttachDispatch (pDisp);
15 круг требует средней точки и радиуса. Чтобы делать этот эффективным и прозрачным к различным языкам программирования, интерфейс COM использует РАЗЛИЧНЫЙ тип. Точка сохранена в ВАРИАНТЕ как SAFEARRAY. Следующие кодовые наборы SAFEARRAY и память это в ВАРИАНТЕ:
SAFEARRAYBOUND rgsaBound;
rgsaBound. lLbound = 0L;
rgsaBound. cElements = 3;
SAFEARRAY* pStartPoint = NULL;
pStartPoint = SafeArrayCreate(VT_R8, 1, &rgsaBound);
// X value.
//
long i = 0;
double value = 4.0;
SafeArrayPutElement(pStartPoint, &i, &value);
// Y value.
//
i++;
value = 2.0;
SafeArrayPutElement(pStartPoint, &i, &value);
// Z value.
//
i++;
value = 0.0;
SafeArrayPutElement(pStartPoint, &i, &value);
VARIANT pt1;
VariantInit(&pt1);
V_VT(&pt1) = VT_ARRAY | VT_R8;
V_ARRAY(&pt1) = pStartPoint;
16 Вызывают AddCircle метод от объекта IAcadModelSpace:
IMSpace. AddCircle (pt1, 2.0);
Полная функция должна теперь напомнить
void addCircleThroughMfcCom()
{
IAcadApplication IApp;
IAcadDocument IDoc;
IAcadModelSpace IMSpace;
IDispatch *pDisp = acedGetAcadWinApp()->GetIDispatch(FALSE);
IApp. AttachDispatch(pDisp);
IApp. SetVisible(true);
pDisp = IApp. GetActiveDocument();
IDoc. AttachDispatch(pDisp);
pDisp = IDoc. GetModelSpace();
IMSpace. AttachDispatch(pDisp);
SAFEARRAYBOUND rgsaBound;
rgsaBound. lLbound = 0L;
rgsaBound. cElements = 3;
SAFEARRAY* pStartPoint = NULL;
pStartPoint = SafeArrayCreate(VT_R8, 1, &rgsaBound);
// X value
long i = 0;
double value = 4.0;
SafeArrayPutElement(pStartPoint, &i, &value);
// Y value
i++;
value = 2.0;
SafeArrayPutElement(pStartPoint, &i, &value);
// Z value
i++;
value = 0.0;
SafeArrayPutElement(pStartPoint, &i, &value);
VARIANT pt1;
VariantInit(&pt1);
V_VT(&pt1) = VT_ARRAY | VT_R8;
V_ARRAY(&pt1) = pStartPoint;
IMSpace. AddCircle(pt1, 2.0);
}
Использование COM, чтобы обратиться к AutoCAD ActiveX Автоматизация
Этот метод требует большего количества кодирования, но не полагается НА MFC.
Вызывать ActiveX Автоматизацию связывает с помощью интерфейса без MFC
1 типовая программа будет использовать COM ActiveX интерфейсы Автоматизации, чтобы добавить новое всплывающее меню к строке меню AutoCAD. Visual C++ Начала и создает новый Win32 проект Динамически компонуемой библиотеки по имени AsdkComDocSamp.
2 Добавляют соответствующие значения к проектным{*строительным*} назначениям, чтобы делать проектную{*строительную*} компоновку как программа ObjectARX. Эта программа должна связаться со следующими библиотеками:
Acad. lib
Rxapi. lib
Acrx15.lib
Acutil15.lib
Acedapi. lib
3 Добавляют новый файл определения к проекту по имени AsdkComDocSamp. def и добавляют следующие линии:
DESCRIPTION ’Autodesk AsdkCom ARX test application’
LIBRARY AsdkComDocSamp
EXPORTS acrxEntryPoint
_SetacrxPtp
acrxGetApiVersion
4 Добавляют новый исходный файл к проекту по имени AsdkComDocSamp. cpp и добавляют следующий код, чтобы делать программу ObjectARX совместимой:
#include <rxregsvc. h>
#include <aced. h>
#include <adslib. h>
// Used to add/remove the menu with the same command.
//
static bool bIsMenuLoaded = false;
void
addMenuThroughCom()
{
}
static void initApp()
{
acedRegCmds->addCommand(
"ASDK_PLAIN_COM",
"AsdkComMenu",
"ComMenu",
ACRX_CMD_MODAL,
addMenuThroughCom);
}
static void unloadApp()
{
acedRegCmds->removeGroup("ASDK_PLAIN_COM");
}
extern "C" AcRx::AppRetCode acrxEntryPoint
(AcRx::AppMsgCode msg, void* appId)
{
switch( msg )
{
case AcRx::kInitAppMsg:
acrxDynamicLinker->unlockApplication(appId);
acrxDynamicLinker->registerAppMDIAware(appId);
initApp();
break;
case AcRx::kUnloadAppMsg:
unloadApp();
break;
default:
break;
}
return AcRx::kRetOK;
}
5 Импортируют AutoCAD, напечатают библиотеку, чтобы приобрести определения для объектов COM. Добавьте следующую линию к вершине AsdkComDocSamp. cpp файла.
Удостоверитесь, чтобы использовать путь для AutoCAD, установленного на вашей системе:
#import "c:\\acad\\acad. tlb" no_implementation \
Raw_interfaces_only named_guids
6 Решают, который связывает с помощью интерфейса Вас, будет должен обратиться. Так как этот пример использует строку меню AutoCAD, это требует большинства объектов меню. Они объявлены в функции addMenuThroughCom следующим образом:
AutoCAD::IAcadApplication *pAcad;
AutoCAD::IAcadMenuBar *pMenuBar;
AutoCAD::IAcadMenuGroups *pMenuGroups;
AutoCAD::IAcadMenuGroup *pMenuGroup;
AutoCAD::IAcadPopupMenus *pPopUpMenus;
AutoCAD::IAcadPopupMenu *pPopUpMenu;
AutoCAD::IAcadPopupMenuItem *pPopUpMenuItem;
7 более прямой подход COM обращаться к интерфейсам Автоматизации использует QueryInterface. Следующий код возвращает IUNKNOWN для AutoCAD:
HRESULT hr = NOERROR;
CLSID clsid;
LPUNKNOWN pUnk = NULL;
LPDISPATCH pAcadDisp = NULL;
hr = ::CLSIDFromProgID(L"AutoCAD. Application", &clsid);
if (SUCCEEDED(hr))
{
if(::GetActiveObject(clsid, NULL, &pUnk) == S_OK)
{
if (pUnk->QueryInterface(IID_IDispatch, (LPVOID*) &pAcadDisp) != S_OK)
return;
pUnk->Release();
}
}
8 Использования IUnknown, чтобы получить объект приложения AutoCAD. Также, удостоверитесь, что AutoCAD видим и получать объекты IACADMENUBAR И IACADMENUGROUPS.
Этому показывают в следующем коде:
if (SUCCEEDED(pAcadDisp->QueryInterface (AutoCAD::IID_IAcadApplication,(void**)&pAcad)))
{
pAcad->put_Visible(true);
}
else {
acutPrintf("\nQueryInterface trouble.");
return;
}
9 С приложением AutoCAD, получите строку меню и коллекции групп меню.
Определите, сколько меню текущие на строке меню:
pAcad->get_MenuBar(&pMenuBar);
pAcad->get_MenuGroups(&pMenuGroups);
pAcad->Release();
long numberOfMenus;
pMenuBar->get_Count(&numberOfMenus);
pMenuBar->Release();
10 Получают первое меню от коллекции групп меню. Это будет обычно ACAD, но могло быть кое-что еще. Тогда получите коллекцию всплывающих меню от первой группы меню:
VARIANT index;
VariantInit(&index);
V_VT(&index) = VT_I4;
V_I4(&index) = 0;
pMenuGroups->Item(index, &pMenuGroup);
pMenuGroups->Release();
pMenuGroup->get_Menus(&pPopUpMenus);
pMenuGroup->Release();
11 В зависимости от того, создано ли меню уже, или создает новое всплывающее меню или удаляют предварительно созданный. Следующий код заканчивает пример:
WCHAR wstrMenuName[256];
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED,
"AsdkComAccess", -1, wstrMenuName, 256);
if (!bIsMenuLoaded) {
pPopUpMenus->Add(wstrMenuName, &pPopUpMenu);
if (pPopUpMenu!= NULL) {
pPopUpMenu->put_Name(wstrMenuName);
WCHAR wstrMenuItemName[256];
|
Из за большого объема этот материал размещен на нескольких страницах:
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 |


