几何尺寸与公差论坛------致力于产品几何量公差标准GD&T (GDT:ASME)|New GPS(ISO)研究/CAD设计/CAM加工/CMM测量  


返回   几何尺寸与公差论坛------致力于产品几何量公差标准GD&T (GDT:ASME)|New GPS(ISO)研究/CAD设计/CAM加工/CMM测量 » 仿射空间:CAX软件开发(三)二次开发与程序设计 » CAD二次开发 » AutoCAD二次开发 » ObjectARX(C++)
用户名
密码
注册 帮助 会员 日历 银行 搜索 今日新帖 标记论坛为已读


 
 
主题工具 搜索本主题 显示模式
旧 2009-04-17, 10:35 PM   #1
yang686526
高级会员
 
注册日期: 06-11
帖子: 14579
精华: 1
现金: 224494 标准币
资产: 234494 标准币
yang686526 向着好的方向发展
默认 【转帖】对象的关联

对象的关联
对象的关联
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 myobjectnotifyublic 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
会增加两条直线,对任意一条直线操作,都会影响到第二个直线。
yang686526离线中   回复时引用此帖
GDT自动化论坛(仅游客可见)
 


主题工具 搜索本主题
搜索本主题:

高级搜索
显示模式

发帖规则
不可以发表新主题
不可以回复主题
不可以上传附件
不可以编辑您的帖子

vB 代码开启
[IMG]代码开启
HTML代码关闭



所有的时间均为北京时间。 现在的时间是 01:19 AM.


于2004年创办,几何尺寸与公差论坛"致力于产品几何量公差标准GD&T | GPS研究/CAD设计/CAM加工/CMM测量"。免责声明:论坛严禁发布色情反动言论及有关违反国家法律法规内容!情节严重者提供其IP,并配合相关部门进行严厉查处,若內容有涉及侵权,请立即联系我们QQ:44671734。注:此论坛须管理员验证方可发帖。
沪ICP备06057009号-2
更多