![]() |
【转帖】对象的关联
对象的关联
对象的关联 exam10b.cpp #include "string.h" #include "stdlib.h" #include "aced.h" #include "dbents.h" #include "dbsymtb.h" #include "dbapserv.h" #include "adslib.h" void assoclines(); void addtomodelspace(acdbobjectid&,acdbentity *); void initapp(void); void unloadapp(void); extern "c" acrx::appretcode acrxentrypoint(acrx::appmsgcode,void *); class myobjectnotify:public acdbobject { public: acrx_declare_members(myobjectnotify); myobjectnotify(){}; 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; private: acdbobjectid mid; double mfactor; }; acrx_dxf_define_members(myobjectnotify,acdbobject, acdb::kdhl_current,acdb::kmreleasecurrent, 0,myobjectmodify,exam10b); void myobjectnotify::modified(const acdbobject *pobj) { acdbline *pline=acdbline::cast(pobj); if(!pline) { const char * str=pobj->isa()->name(); acutprintf("this is a %s.\n",str); acutprintf("i only work with lines,sorry.\n"); return; } acutprintf("\nreactor attached to %lx calling %lx.\n", pline->objectid(),mid); acdbline *pline2; if(acdbopenobject((acdbobject *&)pline2,mid, acdb::kforwrite)==acad::eok) { acgepoint3d p=pline->startpoint(); acgepoint3d q=pline->endpoint(); acgevector3d v=q-p; double len=v.length(); p=pline2->startpoint(); q=pline2->endpoint(); v=q-p; v=len*mfactor *v.normal(); pline2->setendpoint(p+v); pline2->close(); } } acad::errorstatus myobjectnotify::dwginfields(acdbdwgfiler * filer) { assertwriteenabled(); acdbobject::dwginfields(filer); filer->readitem(&mfactor); filer->readitem((acdbsoftpointerid *) &mid); return filer->filerstatus(); } acad::errorstatus myobjectnotify::dwgoutfields(acdbdwgfiler * filer) const { assertreadenabled(); acdbobject::dwgoutfields(filer); filer->writeitem(mfactor); filer->writeitem((acdbsoftpointerid *) &mid); return filer->filerstatus(); } acad::errorstatus myobjectnotify::dxfinfields(acdbdxffiler * filer) { assertreadenabled(); acad::errorstatus es; if((es=acdbobject::dxfinfields(filer))!=acad::eok) { return es; } if(!filer->atsubclassdata("myobjectnotify")) { return acad::ebaddxfsequence; } struct resbuf rbin; while(es==acad::eok) { if((es=filer->readitem(&rbin))==acad::eok) { if(rbin.restype==acdb::kdxfreal) { mfactor=rbin.resval.rreal; } else if(rbin.restype==acdb::kdxfsoftpointerid) { acdbgetobjectid(mid,rbin.resval.rlname); } else { return (filer->pushbackitem()); } } } return filer->filerstatus(); } acad::errorstatus myobjectnotify::dxfoutfields(acdbdxffiler * filer) const { assertreadenabled(); acdbobject::dxfoutfields(filer); filer->writeitem(acdb::kdxfsubclass, "myobjectnotify"); filer->writeitem(acdb::kdxfreal,mfactor); filer->writeitem(acdb::kdxfsoftpointerid,mid); return filer->filerstatus(); } void assoclines() { acdbdatabase *pdb=acdbhostapplicationservices()->workingdatabase(); acdbobjectid aid,bid; acdbline *plinea=new acdbline; plinea->setdatabasedefaults(pdb); plinea->setstartpoint(acgepoint3d(1,1,0)); plinea->setendpoint(acgepoint3d(2,1,0)); addtomodelspace(aid,plinea); ads_printf("line a is %lx from 1,1 to 2,1j.\n", plinea->objectid()); acdbline *plineb=new acdbline; plineb->setdatabasedefaults(pdb); plineb->setstartpoint(acgepoint3d(1,2,0)); plineb->setendpoint(acgepoint3d(2,2,0)); addtomodelspace(bid,plineb); ads_printf("line b is %lx from 1,2 to 2,2.\n", plineb->objectid()); acdbdictionary *pnamedobj; acdbdictionary *pnamelist; 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(); myobjectnotify *pobj=new myobjectnotify(); pobj->elinkage(bid); 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; ads_printf("object_to_notify_a already existes\n"); } plinea->addpersistentreactor(objid); plinea->close(); pobj=new myobjectnotify(); pobj->elinkage(aid); if((pnamelist->getat("object_to_notify_b",objid)) ==acad::ekeynotfound) { pnamelist->setat("object_to_notify_b",pobj,objid); pobj->close(); } else { delete pobj; ads_printf("object_to_notify_b already existes\n"); } pnamelist->close(); plineb->addpersistentreactor(objid); plineb->close(); } void addtomodelspace(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("exam10b", "alines", "alines", acrx_cmd_modal, assoclines); myobjectnotify::rxinit(); acrxbuildclasshierarchy(); } void unloadapp() { acedregcmds->removegroup("exam10b"); deleteacrxclass(myobjectnotify::desc()); } acrx::appretcode acrxentrypoint(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; } exam10b.def library exam10b description "exam10b application" exports acrxentrypoint private acrxgetapiversion private 用vc++6.0开发,autocad2中使用正常。 command :alines 会增加两条直线,对任意一条直线操作,都会影响到第二个直线。 |
所有的时间均为北京时间。 现在的时间是 01:11 AM. |