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

       

Создавать обертку Автоматизации для заказного объекта или примитива


1 Основанный ваш проект согласно шагам в “ Введение Файла Проекта ATL. ”

2 В файле заголовка объекта COM, включите axtempl.h (главное ActiveX файл заголовка шаблона Автоматизации) и файл (ы) заголовка для ваших заказных объектов или примитивов.

3 Изменяют образование из объекта COM или примитива,  удаляя IDISPATCHIMPL часть образования и заменяя это со следующим кодом:

// Для заказного объекта.

//

public IAcadObjectDispatchImpl<CWrapperClass,

&CLSID_WrapperClass,IWrapperClass,

&IID_IWrapperClass,&LIBID_LIBRARYLib>

// For a custom entity.

//

public IAcadEntityDispatchImpl<CWrapperClass,

&CLSID_WrapperClass,IWrapperClass,

&IID_IWrapperClass,&LIBID_LIBRARYLib>

4 Добавляют следующие вхождения в COM_MAP:

COM_INTERFACE_ENTRY(IAcadBaseObject)

COM_INTERFACE_ENTRY(IAcadObject)

COM_INTERFACE_ENTRY(IAcadEntity) // For an entity only.

COM_INTERFACE_ENTRY(IRetrieveApplication)

COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer) // Only

// necessary to support events.

5 Добавляют следующую требуемую перегрузку к заголовку file:

// IAcadBaseObjectImpl

//

virtual HRESULT

CreateNewObject(

AcDbObjectId& objId,

TCHAR* entryName,

TCHAR* keyName);

Эта абстрактная функция, определенная в IACADBASEOBJECTIMPL шаблоне должна быть перегружена, чтобы позволить Вам добавлять заданные по умолчанию объекты к базе данных.

6 Осуществляют CreateNewObject () для любго объекта или определенного примитива.

Следующий пример показывает выполнение CreateNewObject () из AsdkSquareWrapper:

HRESULT CAsdkSquareWrapper::CreateNewObject(

AcDbObjectId& objId,

AcDbObjectId& ownerId,

TCHAR* keyName)

{

try

{

//AXEntityDocLock(ownerId);

Acad::ErrorStatus es;

AcDbObjectPointer<AsdkSquare> pSq;

if((es = pSq.create()) != Acad::eOk)

throw es;

AcDbDatabase* pDb = ownerId.database();

pSq->setDatabaseDefaults(pDb);

AcDbBlockTableRecordPointer

pBlockTableRecord(ownerId, AcDb::kForWrite);

if((es = pBlockTableRecord.openStatus()) != Acad::eOk)


throw es;

if((es = pBlockTableRecord->appendAcDbEntity(objId, pSq.object())) != Acad::eOk)

throw es;

}

catch(const Acad::ErrorStatus)

{

//To become more sophisticated

//

return Error(L"Failed to create square",

IID_IAsdkSquareWrapper, E_FAIL);

}

return S_OK;

}

7 В файле IDL, добавьте importlib ("c:\ACAD\acad.tlb"); после importlib stdole32.tlb и importlib stdole2.tlb. Удостоверитесь, чтобы использовать правильный путь, который соответствует вашей инсталляции AutoCAD.

8 Перемещают acad.tlb секцию в вершину файла IDL и перемещают ваш заказной объектный код так, чтобы это было в пределах той секции.

ОБРАТИТЕ ВНИМАНИЕ, что  модификации файла IDL заставят компилятор выпускать предупреждение, заявляющее, что интерфейс не соответствует. Вы можете игнорировать это сообщение.

9 Изменяют{*заменяют*} образование в файле IDL от IDISPATCH до IACADOBJECT для заказного объекта или IACADENTITY для заказного примитива.

10 В секции файла IDL, который соответствует вашей обертке coclass, добавьте [источник] связывают с помощью интерфейса IACADOBJECTEVENTS; после [заданной по умолчанию] линии, чтобы поддерживать события. Файл IDL будет теперь казаться подобным следующему коду:

import "oaidl.idl";

import "ocidl.idl";

[

uuid(800F70A1-6DE9-11D2-A7A6-0060B0872457),

version(1.0),

helpstring("AsdkSquareLib 1.0 Type Library")

]

library ASDKSQUARELIBLib

{

importlib("stdole32.tlb");

importlib("stdole2.tlb");

importlib("v:\acad\acad2000\acad.tlb");

[

object,

uuid(800F70AD-6DE9-11D2-A7A6-0060B0872457),

dual,

helpstring("IAsdkSquareWrapper Interface"),

pointer_default(unique)

]

interface IAsdkSquareWrapper : IAcadEntity

{

[propget, id(1), helpstring("property Number")]

HRESULT Number([out, retval] short *pVal);

[propput, id(1), helpstring("property Number")]

HRESULT Number([in] short newVal);

};

[

uuid(800F70AE-6DE9-11D2-A7A6-0060B0872457),



helpstring("AsdkSquareWrapper Class")

]

coclass AsdkSquareWrapper

{

[default] interface IAsdkSquareWrapper;

[source] interface IAcadObjectEvents;

};

};

11 После #include <Atlcom.h> в stdafx.h, включите acad15.h, сначала, сопровождаемый любыми необходимыми ObjectARX файлами заголовка.

12 в конце stdafx.cpp, включите acad15_i.c.

13, если приложение ARX и обертка COM объединено, добавьте следующий код к вашему главному CPP файл, и назовите это DllMain в AcRx:: kInitAppMsg и AcRx:: kUnloadAppMsg с соответствующими параметрами. Это инициализирует карту объекта ATL, среди других вещей:

extern "C" HINSTANCE _hdllInstance;

extern "C" BOOL WINAPI DllMain(HINSTANCE hInstance,

DWORD dwReason,LPVOID /*lpReserved*/);

14 Добавляют желательные ActiveX методы, и свойства к вашему классу обертки выбором Добавляют Метод или Добавляют Свойство от подручного меню Интерфейса представления{*вида*} Класса.

15 Для любого ObjectARX обертываемого класса, перегрузите getClassId () функция для заказного объекта или примитива со следующим:

Acad::ErrorStatus

Class::getClassID(CLSID* pClsid) const

{

*pClsid = CLSID_WrapperClass;

return Acad::eOk;

}

16 В файле, который содержит,  перегрузка для getClassId (), добавляет:

#include <objbase.h>

#include <initguid.h>

#include

"library_i.c"            // Файл, содержащий фактические определения

// IIDs

и CLSIDS

для проекта COM.

17 Компоновки и регистр приложение согласно шагам в “ Формирование и Регистрация COM DLL. ”


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