zoukankan      html  css  js  c++  java
  • ssget使用方法

    语法:

    (ssget [sel-method] [pt1 [pt2]] [pt-list] [filter-list])

    ssget 的参数均为可选参数,需要注意的是可选参数之间的组合条件。
    以下语法表示中 <parameter> 尖括号代表必选,[parameter] 方括号代表可选。

    一、选择集的窗口参数
    [sel-method] 字符串类型,不区分大小写,指定一个选择方法。
    [pt1 [pt2]] 表类型,由三个数字的点参数表,表示 xyz 坐标,也可以是仅包括xy 的坐标。
    [pt-list] 表类型,由点参数表组成的表。
    C 窗交(反选)
    如果指定了该参数,则必须跟一对点创建一个矩形窗口,与矩形窗口相交的对象均被加入选择集。注意:此模式仅选择绘图区域内的可见对象,而且线框选择模式均有这个限制。
    参数语法: (ssget "c" <pt1> <pt2> [filter-list])
    此时,[pt-list] 参数不能出现,否则 ssget 将会返回一个错误提示:错误的点参数
    示例:

    (setq pt1 (getpoint "First Pt:"))
    (setq pt2 (getpoint "Second Pt:"))
    (setq ss (ssget "_c" pt1 pt2))
    1
    2
    3
    W 窗口(正选)
    与 C 参数语法及用法类似,但功能不同,只有在矩形窗口内完整的对象才会被加入选择集。仅选绘图区可见对象。
    参数语法: (ssget "w" <pt1> <pt2> [filter-list])
    注意: 字符串参数前加下划线 “_” 可以使 模式字符串 在非英文版的 AutoCAD 里安全运行,建议写上。中文版 AutoCAD 与英文版编码兼容,添加下划线前缀不是必须的。

    CP 圈交(多边形反选)
    如果指定了该参数,则必须用构成多边形的点表响应,与多边形相交的对象被加入选择集。仅选绘图区可见对象。
    参数语法: (ssget "CP" <pt-list> [filter-list])
    此时点参数 [pt1] [pt2] 不能出现,而且,CP 参数依赖 <pt-list> 的顺序来构成一个多边形。
    例如四个点按顺序连接为一个8字型,而不是一个矩形,ssget 将返回一个空选择集,即使对象与窗口相交。
    如果参数为少于3个点的表,也将返回一个 nil。
    示例:

    (setq pt1 (getpoint "Piont1:"))
    (setq pt2 (getpoint "Piont2:"))
    (setq pt3 (getpoint "Piont3:"))
    (setq pt4 (getpoint "Piont4:"))
    (setq ss (ssget "_cp" (list pt1 pt2 pt4 pt4)))
    1
    2
    3
    4
    5
    WP 圈围(多边形正选)
    与 CP 参数语法及用法类似,但只有被多边形窗口包围的对象才会被加入选择集。仅选绘图区可见对象。
    参数语法: (ssget "wp" <pt-list> [filter-list])

    F 栏选
    将参数点表连接为一条折线,与折线相交的对象被加入选择集。仅选绘图区可见对象。
    参数语法: (ssget "f" <pt-list> [filter-list])
    pt-list 最少由2个点组成表,CP/WP 参数最少需要 3 个点。
    示例:选择穿越(0 10) (100 100)两点的连线的所有可见文字

    (ssget "_f" '((0 10)(100 100)) '((0 . "text")))
    1
    P 前一批创建的图形
    包括 CAD 命令或 LISP 程序创建的图形对象。
    参数语法: (ssget "p" [filter-list])
    P 参数不能和 [pt1 [pt2]] [pt-list] 任何一个点参数组合,否则将返回一个错误,有的 CAD 版本会返回 nil
    当分解(EXPLODE)一个 CAD 图形时,p 方法特别有用,可以一次性建立分解后的所有对象选择集。

    L 最后一个创建的对象
    包括 CAD 命令或 LISP 程序创建的对象,注意和 P 参数的区别。
    参数语法: (ssget "l" [filter-list])
    在获取最后一个对象的图元名时,与 entlast 作用相同,但是后者不能提供直接过滤功能,而且返回值不同。

    (ssname (ssget "L") 0) == (entlast)
    1
    I 隐含窗口选择
    参数语法: (ssget “i” [filter-list])
    CAD 命令有两种执行方式,第一种先命令后选择,第二种先选择后命令。所以在 Lisp 中也允许先选择后命令,
    而且这方式可以通过 系统变量 pickfirst 来关闭(值为 0),此时 I 参数失效,(ssget “i”) 将返回 nil。
    选择对象后,选择集呈现亮显状态,可以用 (sssetfirst nil) 取消选择集的亮显。

    X 整个文件
    在当前打开的CAD文件中搜索所有对象,包括关闭、冻结图层中的图元和可见屏幕外的图元对象,不分大小写。
    参数语法: (ssget "x" [filter-list])
    X 用法与 A 用法等价,(ssget “A”) 也是选择所有对象,但是 A 模式不包括冻结图层上的对象。

    :E 拾取框
    用鼠标拾取框选择对象,此时 ssget 将不再拉出一个矩形窗口,直到点右键结束选择。此模式可与 “+” 组合使用。
    参数语法: (ssget ":E" [filter-list])
    与 :E 对应的 :N 参数为只能拉出一个矩形窗口选择,而不能通过点选拾取对象。

    :S 仅允许单一选择集
    使用:s参数时,ssget 将点选对象一次就会结束,无论是否选中对象,未选中则返回 nil,可节省一次回车确认。
    参数语法: (ssget ":S" [filter-list])
    说明: “:S” 参数和 “:E” 可以同时使用,例如: (ssget "_:S:E"),此时 ssget 与 entsel 作用相同,但是返回值不同。

    : D 重复选择
    允许同一个对象多次加入选择集,每选择一次,则加入一次。
    参数语法: (ssget ":D" [filter-list])
    例如:画两条直线,然后运行代码 (setq ss (ssget ":D")),框选3次直线后。(sslength ss) 返回 6

    :L 不选择锁定图层对象
    注意: L、:L、-L 的参数是不同的。
    参数语法: (ssget ":L" [filter-list])
    ssget 默认选择所有图层对象,这样在程序中需判断图层是否锁定,才能编辑,否则 lisp 代码将返回错误。

    其他
    其他方法还有A :A -A _:V _:U _:R -M -P :P -G -L :? 等参数以及组合用法,有兴趣的朋友可以测试。
    使用 AutoCAD 命令 select 然后用 “?” 响应对象选择,就会出现选择提示符如下:
    需要点或窗口(W)/上一个(L)/窗交(C)/框(BOX)/全部(ALL)/栏选(F)/圈围(WP)/圈交(CP)/编组(G)/添加(A)/删除(R)/多个(M )/前一个(P)/放弃(U)/自动(AU)/单个(SI)/子对象(SU)/对象(O)
    命令行里提示的参数与 ssget 基本兼容。例如:在使用 “G” 作为 ssget 的模式字符串时,没有参数将编组名称传递给 ssget,因此该参数虽然有效,但无法返回期望结果,不知道新版的 CAD 会不会改进。

    重要提醒:
    ssget 带点参数调用时,可能会受到自动捕捉的影响,一般先将系统变量 osmode 置零。
    一些系统变量可能会影响模式字符串的使用,例如 pickadd, pickauto, pickdrag, pickfirst, pickstyle 等。
    ssget 点参数包围的矩形、多边形应在当前绘图区域内可见,否则 ssget 仅返回可见区域内的对象选择集。
    创建选择集会消耗 AutoCAD 的临时文件存储区,所以 AutoLISP 不允许同时创建多于 128 个选择集。
    例如:画一个圆,然后执行以下代码:
    (repeat 130 (setq a (cons (ssget "l") a)))
    这段程序循环了 130 次,AutoCAD提示 “错误: 超出选择集数量的最大范围”,如果继续调用 (ssget) 将返回 nil;此时,只有清空选择集变量 (setq a nil) 才能继续调用 ssget。
    ssget 选择时没有自定义提示,如果特别需要可用第三方函数,比如飞诗的: Fsxm-ssget
    二、选择集的过滤条件
    [filter-list] 过滤条件,表类型,指定与属性(DXF 组码)匹配的对象被加入选择集。
    常用支持过滤的 DXF 组码:

    0 实体类型
    -4 条件运算, SSGET 的专用组码,包括逻辑条件与关系条件
    1 图元文字内容
    -3 扩展数据
    2 属性标记、块名
    6 线型名
    7 文字样式
    8 图层名
    40 CIRCLE 直径或 TEXT 文字高度
    62 颜色号
    0 组码
    指定对象实体类型,语法 ((0 . types)),对象类型 types 为字符,不分大小写,常用的实体类型如下:

    "POINT"、"TEXT"、"MTEXT" 点、单行文本、多行文本
    "LINE"、"LWPOLYLINE"、"SPLINE" 直线、多段线、样条曲线
    "CIRCLE"、"ARC"、"ELLIPSE" 圆、圆弧、椭圆
    "HATCH"、"DIMENSION" 填充、标注
    "ATTDEF"、"INSERT" 属性文字、图块
    1
    2
    3
    4
    5
    “,” 逻辑或,对象类型可多选,名称用 “,” 分隔。例如,创建直线和文本的选择集:

    ;;框选对象后,将只有直线和文本被选中(亮显)并加入选择集。
    (ssget '((0 . "TEXT,LINE")))
    1
    2
    “~” 逻辑非,用来排除某类型。例如:创建除过图块的选择集

    ;;显然,第二个 LINE 毫无意义,因为第一个 ~INSERT 非图块类型范围包含了 LINE 类型。
    (ssget '((0 . "~INSERT,LINE")))
    1
    2
    “*” 通配符,用来表示模糊类型。例如,创建所有直线的选择集。如果通配符用在数字参数的过滤,则表示所有比较关系。

    (ssget '((0 . "*LINE")))
    ;;也可以精确指定ssget过滤哪些直线类型。如下:
    (ssget '((0 . "LINE,LWPOLYLINE,SPLINE,MLINE")))
    1
    2
    3
    其他:
    (ssget '((0 . "*"))) 与 (ssget) 等价,相当于全选。
    (ssget '((0 . "~*"))) Lisp 都不知道你要干嘛了,因为它什么也选不上。

    0 组码可以和其他组码组成 list 表过滤。例如,选择半径为 20 的圆:

    (ssget '((0 . "CIRCLE")(40 . 20)))
    1
    不仅仅是 0 号组码,通常,对于字符类型组码均支持通配过滤语法,包括线型名、文字样式、图层等。
    例如:选择非 0 层的所有对象,8号组码

    (ssget '((8 . "~0")))
    1
    强烈注意:并不是所有组码都支持 ssget 过滤选择,例如下面过滤条件将返回 nil,即使存在句柄为 “25F” 的圆。

    (ssget '((0 . "CIRCLE")(5 . "25*")))
    1
    -4 组码
    -4 组码是桌子公司专门为 ssget 这个函数准备的,它并不存在于图形对象的 dxf 数据中,不能作为图形数据的属性编码。所以严格的说 -4 不属于 dxf 组码,仅以点表的形式存在于 ssget 函数中。
    使用 -4 组码可以任意组合和嵌套各种 dxf 信息过滤的条件运算,在本文中,作者将条件运算划分为逻辑条件和关系条件两种,试图让概念清晰,便于理解。
    因为专一,所以强大。

    逻辑条件运算
    用 -4 组码和逻辑运算符组成表对,将一个或几个表项包夹。逻辑运算符对大小写不敏感。
    表对必须成对出现,如:(-4 . "<xx")...(-4 . "xx>"), 常用的逻辑运算符如下:

    or 项目并集
    and 项目交集
    not 不含此项
    xor 两项异或
    1
    2
    3
    4
    or 并集。例如,选择直线和文本:

    (ssget '((-4 . "<or")(0 . "line")(0 . "text")(-4 . "or>")))
    1
    此时 -4 组码的这种写法与 (ssget '((0 . "text,line"))) 等价,但后者写法更简洁。
    例如,选择颜色为红色和绿色的文字和直线:

    (ssget '((0 . "TEXT,LINE")(-4 . "<or")(62 . 1)(62 . 3)(-4 . "or>")))
    1
    and 交集。例如,选择图层为 “notes”,颜色为绿色的单行文本:

    (ssget '((-4 . "<and")(0 . "text")(8 . "notes")(62 . 3)(-4 . "and>")))
    1
    not 非。例如,选择非 “notes” 层的实体对象:

    (ssget '((-4 . "<not")(8 . "notes")(-4 . "not>")))
    1
    这种写法与 (ssget '((8 . "~notes"))) 等价。
    注意:非运算只能有一个表项被包夹,否则 ssget 将返回 nil。

    xor 异或。即半加法,实现二进制加法的不进位运算。逻辑意义: 相同为0,相异为1。
    例如,选择在 “notes” 层不是绿色、或是绿色而不在 “notes” 层的文本对象:

    (ssget '((0 . "text")(-4 . "<xor")(8 . "notes")(62 . 3)(-4 . "xor>")))
    1
    注意:异或运算只能有两项,如果超过两项或只有一项,ssget 将返回 nil。
    嵌套。逻辑运算可以嵌套使用,组成更复杂的条件运算。

    (ssget '((0 . "text")
    (-4 . "<or")
    (-4 . "<and")(8 . "0")(62 . 1)(-4 . "and>")
    (-4 . "<and")(8 . "notes")(62 . 3)(-4 . "and>")
    (-4 . "or>")
    ))
    1
    2
    3
    4
    5
    6
    关系条件运算
    用 -4 组码和关系运算符组成表对,放在需要比较的表项前。
    与成对出现的逻辑条件不同,关系表对单个出现,常用关系运算符如下:

    "*" 通配符,在x,y,z坐标测试时,可代表任何关系的条件表示,例如">", "<", "<>"
    "=" 等于
    "!=" 不等于,等价 "<>" (方向矢量210组码只能用:"*", "=", "!=")
    "<" 小于
    "<=" 小于或等于
    ">" 大于
    ">=" 大于或等于
    "&" 按位与
    "&=" 按位屏蔽相等(仅适用于组值为整型的组)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    例如:选择端点通过 x=8,y 值任意,z=12 的直线,此时 * 代表所有关系

    (ssget '((0 . "LINE")(-4 . "=,*,=")(10 8 0 12)))
    1
    例如:选择圆心的 x,y 坐标任意,z坐标不为 0 的的圆

    (ssget '((0 . "CIRCLE")(-4 . "*,*,<>")(10 0 0 0)))
    1
    例如:选择圆心坐标 x>100, y<120, z=0,图层名以 cir 开始的圆

    (ssget '((0 . "CIRCLE")(-4 . ">,<,=")(10 100 120 0)(8 . "cir*")))
    1
    例如:选择半径大于或等于20的圆

    (ssget '((0 . "CIRCLE")(-4 . ">=")(40 . 20)))
    1
    例如:选择半径20的圆,颜色不是红色

    (ssget '((0 . "CIRCLE")(-4 . "<and")(-4 . "!=")(62 . 1)(40 . 20)(-4 . "and>")))
    1
    异或。例如:选择图形颜色不是随层 (bylayer) 的对象,可用以下代码
    (ssget '((-4 . "&")(62 . 255)))
    我们知道 CAD 的索引颜色数为 1-255,用 2 个字节表示,随层的颜色为 0,在 DXF 组码中并不显示。
    此时如果用 (ssget '((-4 . “>”)(62 . 0))) 来过滤是不对的,随层颜色的图形也将被选上。
    如果用二进制的 8 个 1 (0b11111111),与当前颜色数进行逻辑与的位运算 &,其结果都不是 0, 即为真, 2^8=255,这就是异或过滤运算的原理。

    1 组码
    文本内容的匹配运算(与 wcmatch 函数语法相同),相当于简单正则。
    对于包含大量文本对象的图形,有时候需要精确的过滤条件,可以通过以下特殊符号来实现:

    "*" 通配符,代表一个或多个任意字符
    "|" 管道符,用来连接并列字符,表示或的关系
    "?" 占位符,代表一个任意字符
    "#" 数字符,代表一个0-9的字符
    "@" 字母符,代表一个a-z,A-Z字符
    "." 特殊字符,代表一个除字母和数字的其他字符
    "~" 符号非运算
    "`" 转义字符(数字 1 左边那个字符)
    "," 分隔两个模式的表达式
    "[]" 限位符,用中括号包括一个表达式,表示一位字符
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    例1: CAD 中有以下 3 组 TEXT 文本,要求分别实现文本选择过滤
    ① X=35.614 ② Y=356.201 ③ Z=11.526

    要求匹配以 “X=” 这两个字母开始的单行文本

    (ssget '((0 . "TEXT") (1 . "X=*")))
    1
    以上 ssget 运行返回第 ① 组文本的选择集
    解读: “X=” 在此表示精确匹配,后面加 “*” 可以匹配任意符号。

    要求匹配以 “X=” 或 “Y=” 这两个字母开始的单行文本

    (ssget '((0 . "TEXT") (1 . "[X|Y]=*")))
    1
    运行后返回第 ①、② 组文本选择集
    解读: 并列出现的字符,用 “|” 连接(不能用逗号了)。

    要求匹配 包含数字小于 100 的单行文本

    (ssget '((0 . "TEXT") (1 . "@=##[.]*)))
    1
    以上返回第 ①、③ 组文本选择集
    解读: “##” 代表两个数字,两个数字连接最大只能是 99。小数点单独出现用方括号 [.]
    如果仅仅是 “.”,而没有方括号,则代表任意特殊符号。

    例2: 我们再试验一组复杂的文本,在 CAD 中写入以下 10 组 TEXT 文本
    ① abcde ② 12345 ③ -25.390 ④ *&@125 ⑤ F35
    ⑥ #54-65 ⑦ 头文字 ⑧ 36 75 ⑨ F ⑩ /(*&%@!

    要求匹配 包含数字 文本

    (ssget '((0 . "TEXT") (1 . "*#*")))
    1
    以上代码将选中 ②③④⑤⑥⑧ 包含数字的 6 组文本
    解读: “#” 代表一个数字字符,

    匹配 以*开始的 文本

    (ssget '((0 . "TEXT") (1 . "`**")))
    1
    以上代码将选中 ④ 以*开始的 1 组文本
    解读: 因为 "*" 是通配符,要匹配语法中的专用字符用转义 "'*"

    要求匹配 不含特殊字符 文本

    (ssget '((0 . "TEXT") (1 . "~*.*")))
    1
    以上代码将选中 ①②⑤⑦⑨,注意:负号和小数点也是特殊符号
    解读: “.” 代表一个特殊字符,前后加 “.” 包含一个特殊字符,不含特殊字符就是 “~.”

    要求匹配 纯数字 的单行文本,包含负号和小数点

    (setq ss (ssget '((0 . "TEXT") (1 . "~*[~.--9]*))))
    1
    解读: 负负得正,两次取非可获取数字本身,括号内 “[~.-]”, 意为包含小数点和负号。
    注意, 220-11 不能参加计算的数字也会被包括其中。

    下面给出常用匹配规则,欢迎测试
    匹配数字,不含小数点和正负号: "~*[~0-9]*" 如: 9824
    匹配 26 个小写字母: "~*[~a-z]*" 如: loveu
    匹配大写字母或数字: "~*[~A-Z]*,~*[~0-9]*" 如: NASAA 或 9527
    匹配大写字母和数字混排: "~*[~A-Z|0-9]*" 如: F36D
    空格是一个很特殊的字符,用一个空格可以匹配任意个空格,其他字符没有这个特性。
    例如: (wcmatch " " " ") 返回 T

    -3 组码
    扩展数据过滤。ALISP 中可以用如下方法给图形添加扩展数据,增加自定义组码及表值。

    第一步,注册一个扩展对象应用名

    (regapp "xapp")
    1
    第二步,选择一个图元并返回组码

    (setq En (entget (car (entsel))))
    1
    第三步,定义加入图元的扩展数据

    (setq data '((-3 ("xapp" (1000 . "你好中国")))))
    1
    第四步,将扩展数据附着更新图元

    (entmod (append En data))
    1
    完成,我们可以检查一下扩展数据

    (assoc -3 (entget (car (entsel)) '("xapp")))
    1
    结果返回 (-3 ("xapp" (1000 . "你好中国")))
    采用这种方法添加扩展数据,用 EXPLODE 命令不能清除。

    与 -3 组码无关的话题。
    用 VLisp 函数给图元添加数据比较简单,无需提前注册名称,例如
    (vlax-ldata-put (car (entsel)) "xa" "你好中国")
    查询数据如下:
    (vlax-ldata-get (car (entsel)) "xa")
    返回 “你好中国”

    采用这种方法,用 EXPLODE 命令可以炸开扩展数据,相当于清除图元的扩展数据。
    在某些二次开发的 CAD 程序中,扩展数据被大量使用,用来分类图元对象(图层分类法容易被修改)。
    这时候的 ssget 方显英雄本色,用来精确选择,再适合不过。在参数化制图时,添加扩展数据,当参数
    发生变化时,很容易遍历修改这些对象,由于扩展数据的不可见和不可分解的特性,不会被用户误操作。
    这时候只需要用下面代码即可完成过滤,连对象类别的 0 组码 都不需要了。

    (ssget '((-3 ("xapp"))))
    1
    2 组码
    等待测试。
    ---------------------
    作者:yxp_xa
    来源:CSDN
    原文:https://blog.csdn.net/yxp_xa/article/details/72229202
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    书籍阴影
    Cookie工具类
    兼容性问题总结
    pc端弹框
    懒加载 js----例子------图片
    pc端样式初始化
    Sublime 插件- px 转rem
    手机端1px细线公共类
    移动端样式初始化
    SQL Server(七)——存储过程
  • 原文地址:https://www.cnblogs.com/xzh1993/p/10297746.html
Copyright © 2011-2022 走看看