![]() |
【转帖】反应器实例
反应器实例
反应器实例 exam10a.cpp代码: #include "rxobject.h" #include "rxregsvc.h" #include "rxdlinkr.h" #include "rxditer.h" #include "aced.h" #include "dbmain.h" #include "dbdict.h" #include "dbidmap.h" #include "dbapserv.h" #include "adslib.h" void printdbevent(const acdbobject *,const char * eventstr); void printobj(const acdbobject * pobj); void watchdb(); void clearreactors(); extern "c" acrx::appretcode acrxentrypoint(acrx::appmsgcode ,void *); class mydbreactor; long gentacc =0; mydbreactor *gpdbr=null; class mydbreactor :public acdbdatabasereactor { public: virtual void objectappended(const acdbdatabase * dwg, const acdbobject *dbobj); virtual void objectmodifier(const acdbdatabase * dwg, const acdbobject *dbobj); virtual void objecterased(const acdbdatabase * dwg, const acdbobject * dbobj,adesk::boolean perased); }; void mydbreactor::objectappended(const acdbdatabase * db, const acdbobject *pobj) { printdbevent(pobj,"objectappended"); acutprintf("db==%lx\n",(long)db); gentacc++; acutprintf("entity count=%d\n",gentacc); } void mydbreactor::objectmodifier(const acdbdatabase *db, const acdbobject *pobj) { printdbevent(pobj,"objectmodified"); acutprintf("db==%=%lx\n",(long)db); } void mydbreactor::objecterased(const acdbdatabase * db, const acdbobject *pobj, adesk::boolean perased) { if(perased) { printdbevent(pobj,"objecterased"); gentacc--; } else { printdbevent(pobj,"object (un)erased"); gentacc++; } acutprintf("db=%lx\n",(long)db); acutprintf("entity count=%d\n",gentacc); } void printdbevent(const acdbobject * pobj, const char * pevent) { acutprintf("event::acdbdatabasereactor::%s",pevent); printobj(pobj); } void printobj(const acdbobject *pobj) { if(pobj==null) { acutprintf("(null)"); return; } acdbhandle objhand; char handbuf[17]; pobj->getacdbhandle(objhand); objhand.getintoasciibuffer(handbuf); acutprintf("\n (class==%s,handle==%s,id==%lx,db==%lx)", pobj->isa()->name(),handbuf, pobj->objectid().asoldid(),pobj->database()); } void watchdb() { if(gpdbr==null) { gpdbr=new mydbreactor(); } acdbhostapplicationservices()->workingdatabase() ->addreactor(gpdbr); acutprintf("added database reactor to" "acdbhostapplicationservices()->workingdatabase().\n"); } void clearreactors() { if(acdbhostapplicationservices()->workingdatabase()!=null) { acdbhostapplicationservices()->workingdatabase() ->removereactor(gpdbr); delete gpdbr; gpdbr=null; } } acrx::appretcode acrxentrypoint(acrx::appmsgcode msg,void * appid) { switch(msg) { case acrx::kinitappmsg: acrxdynamiclinker->unlockapplication(appid); acrxdynamiclinker->registerappnotmdiaware(appid); acedregcmds->addcommand("exam10a", "watch", "watch", acrx_cmd_transparent, watchdb); acedregcmds->addcommand("exam10a", "clear", "clear", acrx_cmd_transparent, clearreactors); break; case acrx::kunloadappmsg: clearreactors(); acedregcmds->removegroup("exam10a"); break; } return acrx::kretok; } exam10a.def代码: library exam10a description "exam10a application" exports acrxentrypoint private acrxgetapiversion private 开发环境:vc++6.0 使用环境:autocad2 调试和使用通过。与大家共免。 vc++ 中的环境要设置一下。 |
所有的时间均为北京时间。 现在的时间是 06:27 PM. |