Использование MFC и ClassWizard, чтобы Обратиться К AutoCAD ActiveX Автоматизация
Этот метод использует MFC, и Visual C++ ClassWizard, чтобы читать AutoCAD напечатает библиотеку (acad.tlb).
Вызов ActiveX Автоматизацию связывает с помощью интерфейса использование MFC и систему Импорта Библиотеки Типа ClassWizard
1 типовая программа будет использовать COM ActiveX интерфейсы Автоматизации AutoCAD, чтобы создать круг в пространстве модели. В Visual C++ создают новый MFC AppWizard (dll) проект по имени AsdkComMfcDocSamp.
2 Выбирают Регулярный DLL использование общедоступного MFC DLL.
ПРИМЕЧАНИЕ Вы можете фактически выбирать любую из опций, но различных назначений и кода, будет требовано в зависимости от вашего выбора. Этот пример будет использовать Регулярный DLL использование общедоступного MFC DLL. См. главу 8, “MFC Темы”, для подробной информации относительно опций, чтобы выбрать для различных задач.
3 Выберите Finish и затем Ok для создания проекта.
4 Добавляют соответствующие значения к проектным назначениям, чтобы делать проектную компоновку как программа ObjectARX. Эта программа должна связаться со следующими библиотеками:
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);
}