ObjectARX, AutoCAD. Среда программирования библиотеки C++

       

Использование 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);

}


Содержание раздела