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)




Начало  Назад  Вперед



Книжный магазин