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


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


回复
 
主题工具 搜索本主题 显示模式
旧 2009-04-22, 03:21 PM   #1
yang686526
高级会员
 
注册日期: 06-11
帖子: 14579
精华: 1
现金: 224494 标准币
资产: 234494 标准币
yang686526 向着好的方向发展
默认 【转帖】遇到问题:遍历所有块,并将块中的子实体的颜色随层,请教....

遇到问题:遍历所有块,并将块中的子实体的颜色随层,请教....
www.dimcax.com
遇到问题:遍历所有块,并将块中的子实体的颜色随层,请教....
本程序的实现目的:遍历所有块,并将 每个块中的子实体 的颜色 设置为" 随层//bylayer" 已经实现:遍历所有块,实体颜色随层也实现 本程序当前遇到的问题:获取到的每个块中的子实体个数总是为0,也就是获取不到的每个块中的子实体 补充说明:本程序考虑到一个块的不同子实体可能在不同的层上,所以要将每个块的子实体提取分析 [commandmethod("setblock1")] public void setblock1() // 主程序 { database db = hostapplicationservices.workingdatabase; editor ed = autodesk.autocad.applicationservices.application.documentmanager.mdiactivedocument.editor; ed.writemessage("正在按照数据库设置好定义好的层颜色定义所有的块颜色......\n"); //定义过滤器 typedvalue[] fillist = { new typedvalue((int)dxfcode.start, "insert") }; selectionfilter filter = new selectionfilter(fillist); promptselectionresult res = ed.selectall(filter);//选择所有的blockreference ed.writemessage("\n共遍历出:" + res.value.count.tostring() + "个blockreference。\n"); if (res.status != promptstatus.ok || res.value.count == 0) { return; } using (transaction trans = db.transactionmanager.starttransaction()) { //循环遍历选择集并打开其中的每个实体 foreach (objectid id in res.value.getobjectids()) { // ed.writemessage("\n开始遍历一级块。"); entity blkent = trans.getobject(id, openmode.forwrite) as entity; //ed.writemessage("\n依次获取一级块id。"); try { ed.writemessage("\nblkent s extensiondictionary。" + blkent.extensiondictionary.tostring()));//执行结果:blkent s extensiondictionary。(0) ed.writemessage("\nblkent s blockid。" + blkent.blockid.tostring());// 执行结果:blkent s blockid。(2130361592) blockreference blkrefs = (blockreference)blkent;//test whether it is an employee block autodesk.autocad.databaseservices.attributecollection blkrefcollection = blkrefs.attributecollection; if (blkrefcollection.count > 0) //如果该块有子实体,貌似这句话没起到作用 blkrefcollection.count返回值总是为"0";请教大家问题出在哪里! { ed.writemessage("\n获取该block存在二级块。"); foreach (objectid attid in blkrefcollection) { attributereference att; using (att = (attributereference)trans.getobject(attid, openmode.forwrite, false)) { ed.writemessage("\n开始遍历二级块。"); string attlayer = att.layer; ///这是另外的一个函数就不多说了 conmdbsetblock(attlayer, att);//将该二级块所在图层与mdb图层设置对比,看mdb中是否有attlayer,如有,则att颜色bylayer } } } } } catch (system.exception ex) { ed.writemessage("\nerror is : " + ex.message); } } trans.commit(); } [
获取块中的子实体的个数是用什么方法? 怎么逐个取出子实体? 那位大大指教下,不胜感激!
//循环遍历选择集并打开其中的每个实体 foreach (objectid id in res.value.getobjectids()) { entity blkent = trans.getobject(id, openmode.forwrite) as entity; dbobjectcollection objs = new dbobjectcollection(); blkent.explode(objs);//貌似将块强行explode可以取到真正的子实体个数 ed.writemessage("\n分解的objs共有" + objs.count.tostring() +"个"); if (objs.count > 0) //如果该块有子实体 { ed.writemessage("\n开始获取该block存在二级块。"); ed.writemessage("\n分解的objs共有" + objs.tostring() + "个"); foreach (objectid attid in objs)//这边cad会提示指定的转换无效,取到的子实体貌似没能操作成功 { ed.writemessage("\n分解的attid共有" + attid.tostring() + "个"); } foreach (objectid attid in objs) { ed.writemessage("\n开始遍历二级块。"); entity ent = trans.getobject(attid, openmode.forwrite) as entity; if (ent != null) { ent.colorindex = 256; } } }
查到一个鬼子的网站,资料不少! acdbobject(全オブジェクト共通) acdbsymboltablerecord(シンボルテーブルレコード共通) acdbblocktablerecord(ブロックテーブルレコード) { blockbeginid(または getblockbeginid) 日本語名:「ブロック開始id取得」 blockendid(または getblockendid) 日本語名:「ブロック終了id取得」 getblockreferenceids 日本語名:「ブロック参照id全取得」 geterasedblockreferenceids 日本語名:「削除ブロック参照id全取得」 } 我使用blockbeginid和blockendid取到了块的两个子实体的id 但是使用getblockreferenceids 总是取到的是块的id,而获取不到该块的所有子实体的id????? 奇怪 //循环遍历选择集并打开其中的每个实体 foreach (objectid id in res.value.getobjectids()) { blockreference blkref = (blockreference)trans.getobject(id, openmode.forwrite); blocktablerecord btr = (blocktablerecord)trans.getobject(blkref.blocktablerecord, openmode.forwrite); ed.writemessage("\n分解的idcol共有" + btr.getblockreferenceids(false, true).count.tostring() + "个");//其中的返回值总是1,奇怪??
能行吗?
我的理解是:块引用只是保存了块定义的引用和块的定位方位信息; 块中子实体的性质包括颜色是在块定义中定死的,一旦更改块定义,所有块引用都会改变,而单个块引用无法单独改变子实体的性质
yang686526离线中   回复时引用此帖
GDT自动化论坛(仅游客可见)
回复


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

高级搜索
显示模式

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

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



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


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