在AutoCAD、 中选择实体
选择集一个选择集就是AutoCAD当前图形中的一组实体,通过名字加以引用,在这里是一个ads采用name对象。选择集非常类似于AutoCAD实体的“组(group)”。一旦拥有一个选择集,就可以确定组成选择集的实体数量(也称为选择集长度引用)。既然我们知道了选择集的长度,我们就可以使用循环机制遍历选择集中的每个实体,并读取和修改实体。一个实体在一个选择集中只能表示一次,然而一个实体可以属于多个选择集。如果我们有一个选择集ss1,并希望向选择集中添加一条直线实体,我们可以手工选择直线实体。按规则我们可以多次选择直线实体,但在选择集中多次选择的实体只表示一次。假定我们现在创建第二个选择集ss2,并选择同一条直线实体,那么该实体就被加到第二个选择集中。现在直线实体出现在ss1和ss2两个选择集中,但在每一个选择集中直线实体只表达一次。
选择集是实体的有名集合,选择集中的实体由AutoCAD用户手工选择或依据实体特性加入。依据特性选择实体,如选择“parts”层上半径小于0.25的所有圆,这允许我们把它们的半径改为0.375。选择集甚至可以选择被冻结的图层上的实体。选择集也可以是空的—它只是存放AutoCAD实体的一个容器,就像放糖果的纸袋一样,如果你没有在里面放糖果或者你已把它们全部吃光,纸袋就空了。
选择集函数 说 明 等效的AutoLISP函数
acedSSGet() 选择要加到选择集中的实体 ssget
acedSSLength()返回指定选择集的长度 sslength
acedSSAdd() 添加实体到已有选择集或新建一空选择集 ssadd
acedSSDel() 从已有选择集中删除实体 ssdel
acedSSName() 在选择集中检索出实体的ads采用name ssname
acedSSMemb() 测试某实体是否为选择集的成员 ssmemb
acedSSFree() 释放选择集 —
1. acedSSGet()
选择集是ads采用name对象,为了把实体加入到指定的选择集,必须使用acedSSGet()函数选择实体,或者假如预先知道实体名,则可使用acedSSAdd()函数。
下面是acedSSGet()函数的定义:acedSSGet()函数返回一个选择集,当指定了一种AutoCAD选取模式时就获得该选择集,选取模式可以通过AutoCAD用户的提示或过滤图形数据库指定。使用acedSSGet()函数有多种方式。首先我们将说明函数中的各个参数,然后阐述使用acedSSGet()函数的各种方式。
参数str是指定实体选取模式的可选字符串。参数pt1和pt2指定若干选取模式的可选点。对于polygon(多边形)或fence(栏选)选取模式选项,参数pt1还可以是一个含有多个点的结果缓冲区链表。参数filter是一个可选的结果缓冲区链表,能使acedSSGet()函数过滤图形以选择具有某种类型与(或)具有某种特性的实体。无论你使用哪一种模式来获得选择集,都用参数ss来标识选择集的名称。参数str指定要使用哪一种选取模式,它可以是表3-7所列字符串之一。
从表3-7可以看出有多种选择集的选取模式,如果想探讨所有的选项,可参阅帮助文档。一般我只做两件事:让用户选择实体(NULL选项)或根据特性选择实体(“X”选项)。
下面是一些有代表性的调用acedSSGet()函数的程序代码。如acutBuildList()函数调用示例那样,对于多边形选项CP和WP(但不包括F)会自动封闭列出的点,不必把终点指定为起点。
表3-7 acedSSGet()函数的选取模式选项:参数str的值
值(选取模式) 说 明
NULL 单点选择(指定pt1)或用户选择(pt1也是NULL)
“I” 指定PICKFIRST实体集
“C” Crossing选取模式
“CP” Crossing polygon选取模式
“F” Fence(或open polygon)选取模式
“L” Last选取模式,选择最近生成的实体
“P” Previous选取模式,选择上一个选择集
“W” Window选取模式
“WP” Window Polygon选取模式
“X” 只用于过滤选取模式
“G” Groups选取模式
“:$” Prompts supplied选取模式
“:?” “Other” callbacks选取模式
“:D” Duplicates allowed选取模式
“:E” Everything in aperture选取模式
“:K” Keyword callbacks选取模式
“:N” Nested选取模式
“:S” 单一对象选取模式
“.” 用户选取模式
“#” 非几何选取模式(all、last、previous)
“A” All选取模式
“B” BOX选取模式
“M” Multiple选取模式
3.10.1 选择集的过滤
为了使用选择集过滤模式,参数str必须指定为“X”。选择集过滤模式允许依据特性选择实体。过滤参数是一个结果缓冲区表,在这里给acedSSGet()函数详细说明了要使用的实体种类和特性种类。如果过滤参数是NULL,并且参数str为“X”,则选择集ss将包含当前AutoCAD图形中的每一
个实体,而不考虑实体是否在冻结的层上。函数调用如下:
现在选择集ss将包含当前AutoCAD图形中的每一个实体。那么我们怎样选择数据库中所有的圆实体呢?为了有效地使用选择集,必须知道DXF组码。首先我们必须构造一个结果缓冲区,但因为我们只寻找一种实体,所以我们可以使用acutNewRb()函数来创建该结果缓冲区。下面是一段代码实
例:
下面的程序代码实例生成由某一图层上所有的实体组成的选择集。图层的DXF组码是8。
好了,下面我们举一个稍微复杂一点的例子,假定我们要选择“parts”层上的所有圆。这是一个利用acutBuildList()函数构造结果缓冲区表后再传给acedSSGet()函数的实例。
3.10.2 选择集的关系过滤
在选择集中可以使用关系运算符。例如:我们要选取“parts”图层上半径大于等于2.0的所有圆。在缺省情况下,acedSSGet()函数选取满足过滤表中所有条件的实体。过滤时每两个项之间的隐含关系是“相等(equals)”。对于数值型组码(整数、实数、点和向量),借助在结果缓冲区中包
含一个说明关系运算符的特殊组码“-4”可以指定其他的关系运算。该运算符应用于紧跟其后的结果缓冲区项。关系运算符由字符串指定。表3-8列出了所有的关系运算符。
关系运算符可以用实例来很好地说明,继续我们所举的例子:选取“parts”图层上半径大于等于2.0的所有圆。其程序代码如下:
表3-8 选择集过滤表的关系运算符关系运算符 说 明
“*” 任意(始终为真)
“=” 等于
“!=” 不等于(C/C++)
“/=” 不等于(AutoLISP)
“<>” 不等于
““
“>” 大于
“>=” 大于或等于
“&” 按位“与”(只用于整数组码)
“&=” 按位等于(只用于整数组码)
页:
[1]