ObjectARX中如何选择块参照中的对象

上传人:M****1 文档编号:491399017 上传时间:2023-05-06 格式:DOC 页数:3 大小:58.50KB
返回 下载 相关 举报
ObjectARX中如何选择块参照中的对象_第1页
第1页 / 共3页
ObjectARX中如何选择块参照中的对象_第2页
第2页 / 共3页
ObjectARX中如何选择块参照中的对象_第3页
第3页 / 共3页
亲,该文档总共3页,全部预览完了,如果喜欢就下载吧!
资源描述

《ObjectARX中如何选择块参照中的对象》由会员分享,可在线阅读,更多相关《ObjectARX中如何选择块参照中的对象(3页珍藏版)》请在金锄头文库上搜索。

1、ObjectARX中如何选择块参照中的对象在利用ObjectARX进行CAD二次开发时,如何选择块参照中嵌套的实体,并进行进行下一步操作?这个问题的难点是:如何判断用户选中的实体到底是块参照里面的非嵌套对象实体?还是块参照中嵌套的块参照的实体?本文利用全局函数acedNEnsSelP解决了这个问题,并可实现:如果用户选择块参照中嵌套的实体,直接视为用户选择了这个嵌套的块参照,效果如图。一、全局r-函数acedNEntSelF介绍为了选中块参照中的实体,ObjectARX提供了一个接口intacedNEntSelP(匸ME:國兰口扣孙沖3二馨輩箋彳亡SiconstACHAR*str,gdsnam

2、eentres,ads_pointptres,constACHAR*str:在选择块参照中实体时的提示语,如果为NULL,AutoCAD显示默认的提示语。ads_nameentres:选择实体的ads_name名称。ads_pointptres:选择实体时点取的点。intpickflag:指定acedNEntSelP是否用于和用户交互;如果为假,acedNEntSelP提示用户指定实体并忽略ptres;如果为真,使用ptres的初始值去选择实体。ads_matrixxformres:该4x4变换矩阵可以将实体的任意ECS坐标转换为WCS坐标。如果选择的实体不是嵌套实体,该值设为单位矩阵。利用这

3、个矩阵,可以将选中的实体从ECS坐标系转换到WCS坐标系。structresbuf*refstkres:包含嵌套实体的各级块参照。注意,最后一个参数最为重要,它实际记录了选择对象的各级嵌套块参照。二、实现方法介绍利用acedNEntSelP参数中最后的链表参数,查看选择对象的各级嵌套块参照,并对块参照进行坐标变换,将其坐标转为当前图形的WCS坐标。BOOLSelectEntsFromBlock(CStringcsPrompt,PickSet&ssResult,AcGePoint3d&ptBase)BOOLSelectEntsFromBlock(CStringcsPrompt,PickSet&s

4、sResult,AcGePoint3d&ptBase)ads_nameent;ads_pointpt;ads_matrixmat;structresbuf*pHead=NULL;intiRet=acedNEntSelP(csPrompt,ent,pt,FALSE,mat,&pHead);ads_nameentOuterBlockif(iRet=RTNORM)acutPrintf(_T(这并不是一个块参照中的对象);returnFALSE;ptBase.x=pt0;ptBase.y=pt1;ptBase.z=pt2;如果ent为块参照中的嵌套块参照对象,例如块参A嵌套块参照B块参照B嵌套块参照C

5、name用户点取了嵌套块C的某个实体,以下循环可以将nt修改为块参照B;并且获得最外层的块参照的ds.while(pHead&pHead-restype=RTENAME)ads_name_set(pHead-resval.rlname,entOuterBlock);break;ads_name_set(pHead-resval.rlname,ent);ads_name_set(pHead-rbnext-resval.rlname,entOuterBlock);break;pHead=pHead-rbnext;求解块参照的变换矩阵AcGeMatrix3dmatBlockRef;AcDbObjec

6、tIdid;AcDbBlockReference*pOuterBlockRef=NULL;if(Acad:eOk=acdbOpenObject(pOuterBlockRef,id,AcDb:kForRead)if(pOuterBlockRef)获取转换矩阵,从块表记录中的CS坐标转为当前图形的CS坐标matBlockRef=pOuterBlockRef-blockTransform();pOuterBlockRef-close();AcDbEntity*pEnt=NULL;AcDbEntity*pEntClone=NULL;if(Acad:eOk=acdbOpenObject(pEnt,id,AcDb:kForRead)if(pEnt)pEntClone=(AcDbEntity*)pEnt-clone();此步骤是关键,复制出来实体以后,将实体从块参照自己眈S坐标系转换为当前数据库的CSpEntClone-transformBy(matBlockRef);AddToCurrentSpace(pEntClone,true);加入到当前数据库pEnt-close();returnTRUE;elsereturnFALSE;

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 解决方案

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号