几何尺寸与公差论坛------致力于产品几何量公差标准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-18, 06:50 PM   #1
yang686526
高级会员
 
注册日期: 06-11
帖子: 14579
精华: 1
现金: 224494 标准币
资产: 234494 标准币
yang686526 向着好的方向发展
默认 【转帖】编程日记(1)arx中如何insert一个图

编程日记(1)arx中如何insert一个图
编程日记(1)arx中如何insert一个图
在实践中常常要将外部的图形文件source.dwg中插入到另外一个图形中或者当前图形中.以插入到当前图形dest.dwg为例.
为了将一个source.dwg插入dest.dwg中,首先要找到source.dwg这个文件. 我们可以使用各种基本的技术和相应的规则从你的机器上或pdm数据库中检索到你要插入的source.dwg, 返回来一个字符窜sfilename代表整个文件及其路径.
然后创建一个空的数据库pnewdb读入source.dwg.
acdbdatabase *pnewdb =new acdbdatabase(adesk::kfalse);
//在这里一定要用adesk::kfalse
acdocmanager->lockdocument(acdocmanager->curdocument()) ;//如果确定你不需要lockdocument, 这一行可以不要

es=pnewdb->readdwgfile(sfilename , _sh_denyno,false);
if (es!=acad::eok)
{
acutprintf("\nthe file %s cannot be opend",sfilename);
return;
}
这样,source.dwg以经用pnewdb来表示了. 我们用pdb来表示当前数据库
acdbdatabase *pdb;
pdb =acdbhostapplicationservices ()->workingdatabase () ;
现在,我们用insert来插入数据库. insert有两种用法,一种是直接insert, source.dwg中的图元实体被分散地插入pdb中
pdb->insert( acgematrix3d::kidentity, pnewdb );//这里假定不对source.dwg做比例和转角的变换. 如果我们在这里结束程序,我们能看到source.dwg已经被插入,但不是一个图块.
另外一种插入法是要求插入后source.dwg成为一个图块,图块的attribute也要从source.dwg中得到.这种方法要做大量的工作.首先运行insert()
cstring pblockname=”testblock”;
acdbobjectid blockid;
if((es=pdb->insert(blockid, pblockname,pnewdb, true))==acad::eok)
{
acutprintf("\ninsert ok\n");
}
else
{
afxmessagebox("insert failed");
delete pnewdb;
return;
}
//这里blcokid是insert运行后产生的,它代表的是一个块表记录acdbblockrecord的id. pblockname是记录名,要在insert运行前设定其值.
如果我们在这里结束程序,我们看不到任何东西,因为source并没有真正被插入.我们还要做一些事,首先是创建一个acdbblockreference, 并将它指向blockid所代表的acdbblockrecord, 然后将这个acdbblockreference加入pdb所代表的图形数据库中.
acdbblockreference *pblkref = new acdbblockreference;
pblkref->setblocktablerecord(blockid);//指向blockid;
pblkref->setposition(pt);//设定位置
pblkref->setrotation(angle);//设定转角
pblkref->setscalefactors( xrefscale);//设定放大比例
acdbblocktable *pblocktable;
pdb->getsymboltable(pblocktable, acdb::kforread);
acdbblocktablerecord *pblocktablerecord;
pblocktable->getat(acdb_model_space, pblocktablerecord, acdb::kforwrite);
pblocktable->close();
acdbobjectid newentid;
pblocktablerecord->appendacdbentity(newentid, pblkref);
pblocktablerecord->close();
如果我们在这里结束程序,我们将看到当前图形中source.dwg已经被作为图块插入.但是图块中没有source.dwg所定义的attibute. 因此我们还要做工作.后面的事情就简单了.
acdbblocktablerecord *pblockdef;
acdbopenobject(pblockdef, blockid, acdb::kforread);
acdbblocktablerecorditerator *piterator;
pblockdef->newiterator(piterator);
acgepoint3d basepoint;
acdbentity *pent;
acdbattributedefinition *pattdef;
for (piterator->start(); !piterator->done();
piterator->step())//将source.dwg中所有的attibute进行遍历
{
piterator->getentity(pent, acdb::kforread);
pattdef = acdbattributedefinition::cast(pent);
if (pattdef != null && !pattdef->isconstant()) {
acdbattribute *patt = new acdbattribute();
patt->setpropertiesfrom(pattdef);
patt->setinvisible(pattdef->isinvisible());
basepoint = pattdef->position();
basepoint += pblkref->position().asvector();
patt->setposition(basepoint);
patt->setheight(pattdef->height());
patt->setrotation(pattdef->rotation());
patt->settag("tag");
patt->setfieldlength(25);
char *pstr = pattdef->tag();
patt->settag(pstr);
acutdelstring(pstr);
patt->setfieldlength(pattdef->fieldlength());
patt->settextstring("-");
acdbobjectid attid;
pblkref->appendattribute(attid, patt);
patt->close();
}
pent->close(); // use pent... pattdef might be null
}
delete piterator;
(结束)
获的图块的大小
我最近用你的方法插进dwg的图块后,请问如何获的图块的大小,比如它的长和宽,此类dwg图块是一些比较规则的图。请快点回答帮帮我,比较急。
回复:你的意思我明白,但实现起来并不是很简单
因为图块生成后,是作为一个整体出现的,而不管你设计时是否规则。并且图块的比例是可以任意定的,所以唯一的办法就是根据子实体以及基点来计算图块的基本大小。
请教下:在cad里插入个珊格图象,同时位置方向比例确定 和这个原理类似吗?
以下是引用goldenshin在
yang686526离线中   回复时引用此帖
GDT自动化论坛(仅游客可见)
 


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

高级搜索
显示模式

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

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



所有的时间均为北京时间。 现在的时间是 05:56 PM.


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