明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2543|回复: 0

选择集,实体,和符号表函数(二)选择集的处理

[复制链接]
发表于 2014-2-28 15:41 | 显示全部楼层 |阅读模式
选择集的处理
ObjectARX 函数对选择集的处理类似于AutoLISP.acedSSGet()函数提供了大多数创建选择集的方法.它一般通过以下三种方法之一创建选择集:
·        提示让用户选择对象.
·        像交互式应用AutoCAD一样,利用PICKFIRST定义,窗交,窗选,栏选,单选或者窗口内选择等匹配条件的方式来选择实体对象,也可以通过指定一个单点或Fence点来选择.
·        使用一系列属性和选定条件筛选当前图形数据库来选择实体对象,我们可以使用前面提到的任何匹配条件.
int
acedSSGet (
    constchar *str,
    constvoid *pt1,
    constvoid *pt2,
    conststruct resbuf *entmask,
    ads_namess);
acedSSGet() 的第一个参数str,说明所使用的选择条件,参见下表.
  
acedSSGet 函数的选择条件
  
  
  
  
  
选择集条件参数
  
  
定义
  
NULL
单点选择 (如果指定了pt1)
  
或用户选择 (如果pt1为NULL)
#
非几何选择 (all, last,  previous)
:$
提供提示文字
.
用户拾取方式
:?
其他回调函数
A
All选择方式
B
Box选择方式
C
Crossing选择方式
CP
Crossing Polygon 选择方式
:D
可以重复,即可以重复选择一个实体,并都加入选择集中
:E
在aperture中的所有实体
F
栏选
G
编组选择
I
如果存在PICKFIRST选择集,则用这个集
:K
关键字回调函数
L
将最后一个实体添加进选择集
M
多重选择方式
P
选择上一个选择集
:S
强制单个实体对象被选择
W
Window选择方式
WP
Window Polygon选择方式
X
用于对整个图形数据库选择
接下来的两个参数用于指定与某些选择方式有关的可选择的点.当不实用它们时,应该取NULL.如果第四个参数entmask不是NULL,则指向一个结果缓冲区表,用于存放用筛选选择方式的结果.最后的参数ss是选择集的识别名
x.
下列是调用acedSSGet()的一段例子,对于多边形选项"CP"和"WP"(不包括"F"),像函数acutBuildList()说明的那样,函数acedSSGet()自动封闭点的列表,所以我们不必建立一个终点与起点相同的表.
ads_point pt1, pt2,pt3, pt4;  
pt1[X] = pt1[Y] =pt1[Z] = 0.0;
pt2[X] = pt2[Y] =5.0; pt2[Z] = 0.0;
// Get pt2[X] =pt2[Y] = 5.0; pt2[Z] = 0.0;
// 如果存在,获取当前PICKFIRST选择集,没有则提示用户选择一个;
acedSSGet(NULL, NULL,NULL, NULL, ssname);
// 如果存在,获取当前PICKFIRST选择集.
acedSSGet("I",NULL, NULL, NULL, ssname);
// 选择最近使用过的对象.
acedSSGet("P",NULL, NULL, NULL, ssname);
// 选择最后加入到数据库中的对象.
acedSSGet("L",NULL, NULL, NULL, ssname);
// 选择通过点 (5,5)的实体.
acedSSGet(NULL, pt2,NULL, NULL, ssname);
// 选择在从点 (0,0) 到(5,5)的窗口中的实体.
acedSSGet("W",pt1, pt2, NULL, ssname);
// 选择指定多边形包围的实体.
pt3[X] = 10.0; pt3[Y]= 5.0; pt3[Z] = 0.0; tlist = acutBuildList(RTPOINT, pt1, RTPOINT, pt2,
        RTPOINT, pt3, RTPOINT, pt4, 0);
acedSSGet("WP",pointlist, NULL, NULL, ssnameacedSSGet("WP", pointlist, NULL, NULL,ssname);
// 选择从点(0,0) 到(5,5)的窗口内交的实体.
acedSSGet("C",pt1, pt2, NULL, ssname);
// 选择指定多边形内交的实体.
acedSSGet("CP",pointlist, NULL, NULL, ssname); tiacutRelRb(pointlist);
// 选择与指定的栅栏交叉的实体.
pt4[Y] = 15.0; pt4[Z]= 0.0; OINT, pt2,
        RTPOINT, pt3, RTPOINT, pt4, 0);
acedSSGet("F",pointlist, NULL, NULL, ssname);
acutRelRb(pointlist);
<="" acutrelrb(pointlist);="">
</prex<>
acedSSGet() 的补充函数是 acedSSFree(),它能在应用程序用完选择集后释放选择集.选择集是按名称来被使用的.对上面程序中定义的 ads_name,在这里这样使用:
acedSSFree(ssname);
注意 AutoCAD 不能同时打开多于128个选择集,这包括运行中的ObjectARXAutoLISP应用程序所打开的选择集的总和.该限制在不同的系统中可能有所不同.如果这一限制被突破.AutoCAD会拒绝创建更多的选择集.我们不推荐同时管理的大量选择集.相反,应该在任何时刻仅仅打开并保持适当的最小数量的选择集.并且在不用选择集时应尽快的用acedSSFree()释放.AutoLISP不一样,ObjectARX环境不能对使用过的选择集所形成的那些零碎的无用的信息单元进行自动收集,以释放这些选择集.应用程序应该记着在收到kUnloadDwgMsgkEndMsgkQuitMsg消息时,释放它所打开的选择集.
本节包含的内容
·        选择集过滤表
·        选择集的管理
·        选择集的变换



该贴已经同步到 mccad的微博
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-3-29 21:41 , Processed in 0.215074 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表