#i nclude "dbapserv.h"#i nclude "dbents.h"#i nclude "accmd.h"// 下面这个例子为直线A添加一个反应器,并且关联到标注,当A有变化时,标注也会随之变化void addToModelSpace(AcDbObjectId &objId, AcDbEntity* pEntity);// AsdkObjectToNotify - 反应器对象class AsdkObjectToNotify : public AcDbObject...{public: ACRX_DECLARE_MEMBERS(AsdkObjectToNotify); AsdkObjectToNotify() ...{}; void eLinkage(AcDbObjectId i) ...{mId=i;} void modified(const AcDbObject*); Acad::ErrorStatus dwgInFields(AcDbDwgFiler*); Acad::ErrorStatus dwgOutFields(AcDbDwgFiler*) const; Acad::ErrorStatus dxfInFields(AcDbDxfFiler*); Acad::ErrorStatus dxfOutFields(AcDbDxfFiler*) const;private: AcDbObjectId mId;};ACRX_DXF_DEFINE_MEMBERS(AsdkObjectToNotify, AcDbObject, AcDb::kDHL_CURRENT, AcDb::kMReleaseCurrent, 0, ASDKOBJECTTONOTIFY, persreac);// 每次直线实体变化时会通知反应器,就会调用反应器的这个函数. // 调用时,传入的是修改的那个直线指针,在这个函数里对你的要起反应的直线修改// void AsdkObjectToNotify::modified(const AcDbObject* pObj)...{ AcDbLine *pLine = AcDbLine::cast(pObj); if (pLine == NULL) ...{ const char* cstr = pObj->isA()->name(); acutPrintf("这是一个 %s实体。 ", cstr); acutPrintf("我只能处理直线。 "); return; } acutPrintf(" 直线 %lx的反应器在修改标注 %lx。 ", pLine->objectId(), mId); AcDbAlignedDimension *pDim; if (acdbOpenObject((AcDbObject*&)pDim, mId, AcDb::kForWrite) == Acad::eOk) ...{ // 修改标注 pDim->setXLine1Point(pLine->startPoint()); pDim->setXLine2Point(pLine->endPoint()); pDim->close(); }}// 反应器导入函数Acad::ErrorStatusAsdkObjectToNotify::dwgInFields(AcDbDwgFiler* filer)...{ assertWriteEnabled(); AcDbObject::dwgInFields(filer); filer->readItem((AcDbSoftPointerId*) &mId); return filer->filerStatus();}// 反应器导出Acad::ErrorStatusAsdkObjectToNotify::dwgOutFields(AcDbDwgFiler* filer) const...{ assertReadEnabled(); AcDbObject::dwgOutFields(filer); filer->writeItem((AcDbSoftPointerId&)mId); return filer->filerStatus();}// dxf函数Acad::ErrorStatusAsdkObjectToNotify::dxfInFields(AcDbDxfFiler* filer)...{ assertWriteEnabled(); Acad::ErrorStatus es; if ((es = AcDbObject::dxfInFields(filer)) != Acad::eOk) ...{ return es; } if(!filer->atSubclassData("AsdkObjectToNotify")) ...{ return Acad::eBadDxfSequence; } struct resbuf rbIn; while (es == Acad::eOk) ...{ if ((es = filer->readItem(&rbIn)) == Acad::eOk) ...{ if (rbIn.restype == AcDb::kDxfSoftPointerId) ...{ // ObjectIds are filed in as ads_names. acdbGetObjectId(mId, rbIn.resval.rlname); } else ...{ // invalid group return(filer->pushBackItem()); } } } return filer->filerStatus();}// dxf函数Acad::ErrorStatusAsdkObjectToNotify::dxfOutFields(AcDbDxfFiler* filer) const...{ assertReadEnabled(); AcDbObject::dxfOutFields(filer); filer->writeItem(AcDb::kDxfSubclass, "AsdkObjectToNotify"); filer->writeItem(AcDb::kDxfSoftPointerId, mId); return filer->filerStatus();}// 创建一条线和一个标注,并让他们互相关联起来(通过反应器)voidassocLines()...{ AcDbDatabase *pDb = acdbHostApplicationServices()->workingDatabase(); AcDbObjectId aId, dimId; AcDbLine *pLineA = new AcDbLine; pLineA->setDatabaseDefaults(pDb); pLineA->setStartPoint(AcGePoint3d(1, 1, 0)); pLineA->setEndPoint(AcGePoint3d(2, 1, 0)); addToModelSpace(aId, pLineA); acutPrintf( "Line A is %lx from 1,1 to 2,1. ", pLineA->objectId()); AcDbAlignedDimension *pDim = new AcDbAlignedDimension( AcGePoint3d(1, 10, 0), AcGePoint3d(2, 10, 0), AcGePoint3d(1, 10, 0), NULL, AcDbObjectId::kNull); addToModelSpace(dimId, pDim); pDim->close(); // 打开命名对象词典, 并且检查是否有条目“ASDK_DICT”存在 // 如果没有,创建一个字典,并且添加到命名对象字典中 // AcDbDictionary *pNamedObj = NULL; AcDbDictionary *pNameList = NULL; pDb->getNamedObjectsDictionary(pNamedObj, AcDb::kForWrite); if (pNamedObj->getAt("ASDK_DICT", (AcDbObject*&)pNameList, AcDb::kForWrite) == Acad::eKeyNotFound) ...{ pNameList = new AcDbDictionary; AcDbObjectId DictId; pNamedObj->setAt("ASDK_DICT", pNameList, DictId); } pNamedObj->close(); // 为直线A创建反应器 AsdkObjectToNotify *pObj = new AsdkObjectToNotify(); pObj->eLinkage(dimId); // 把标注的ID存入反应器,以便在A被修改时,能修改标注 AcDbObjectId objId; if ((pNameList->getAt("object_to_notify_A", objId)) == Acad::eKeyNotFound) ...{ pNameList->setAt("object_to_notify_A", pObj, objId); pObj->close(); } else ...{ delete pObj; acutPrintf("object_to_notify_A already exists "); } // 为直线A添加永久反应器 pLineA->addPersistentReactor(objId); pLineA->close(); pNameList->close();}// 添加一个实体到模型空间voidaddToModelSpace(AcDbObjectId &objId, AcDbEntity* pEntity)...{ AcDbBlockTable *pBlockTable; AcDbBlockTableRecord *pSpaceRecord; acdbHostApplicationServices()->workingDatabase() ->getSymbolTable(pBlockTable, AcDb::kForRead); pBlockTable->getAt(ACDB_MODEL_SPACE, pSpaceRecord, AcDb::kForWrite); pBlockTable->close(); pSpaceRecord->appendAcDbEntity(objId, pEntity); pSpaceRecord->close(); return;}// 初始化应用程序void initApp()...{ acedRegCmds->addCommand("ASDK_ALINES", "ASDK_ALINES", "ALINES", ACRX_CMD_MODAL, assocLines); AsdkObjectToNotify::rxInit(); acrxBuildClassHierarchy();}void unloadApp()...{ acedRegCmds->removeGroup("ASDK_ALINES"); // 删除自定义反应器 deleteAcRxClass(AsdkObjectToNotify::desc());}// 入口函数//AcRx::AppRetCodeacrxEntryPoint(AcRx::AppMsgCode msg, void* appId)...{ switch (msg) ...{ case AcRx::kInitAppMsg: acrxDynamicLinker->unlockApplication(appId); acrxDynamicLinker->registerAppMDIAware(appId); initApp(); break; case AcRx::kUnloadAppMsg: unloadApp(); } return AcRx::kRetOK;}