对象的关联
对象的关联
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

ublic 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
会增加两条直线,对任意一条直线操作,都会影响到第二个直线。