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


Пример формирования зависимостей в объекте

Следующий пример показывает, как Вы можете использовать реакторы, чтобы установить зависимости среди объектов базы данных. В этом примере, когда Вы изменяете одну линию, другие изменяются тоже.

class AsdkObjectToNotify : public AcDbObject


// AsdkObjectToNotify - customized AcDbObject for persistent

// reactor to notify.





AsdkObjectToNotify() {};

void eLinkage(AcDbObjectId i, double f=1.0)

{mId=i; mFactor=f; };

void modified(const AcDbObject*);

Acad::ErrorStatus dwgInFields(AcDbDwgFiler*);

Acad::ErrorStatus dwgOutFields(AcDbDwgFiler*) const;

Acad::ErrorStatus dxfInFields(AcDbDxfFiler*);

Acad::ErrorStatus dxfOutFields(AcDbDxfFiler*) const;


AcDbObjectId mId;

double mFactor;


ACRX_DXF_DEFINE_MEMBERS(AsdkObjectToNotify, AcDbObject,

AcDb::kDHL_CURRENT, AcDb::kMReleaseCurrent,


// This function is called every time the line it’s

// "watching" is modified. When it’s called, it opens the

// other line of the pair and changes that line’s length to

// match the new length of the line that’s just been

// modified.



AsdkObjectToNotify::modified(const AcDbObject* pObj)


AcDbLine *pLine = AcDbLine::cast(pObj);

if (!pLine) {

const char* cstr = pObj->isA()->name();

acutPrintf("This is a %s.\n", cstr);

acutPrintf("I only work with lines. Sorry.\n");



acutPrintf("\nReactor attached to %lx calling %lx.\n",

pLine->objectId(), mId);

// This open will fail during notification caused by a

// reactor being added to the entity or when this

// notification is in reaction to a change due to the

// other line’s reactor changing this line. This will

// properly prevent an infinite recursive loop

// between the two lines and their reactors.


AcDbLine *pLine2;

if (acdbOpenObject((AcDbObject*&)pLine2, mId, AcDb::kForWrite) == Acad::eOk)


// Get length of line entity we’re being notified

Содержание  Назад  Вперед