本帖最后由 wzg356 于 2025-5-19 16:42 编辑
20250227 更---简版代码再优化简化
----------------------------------------------
完整的见下载文件
应用示例“ssgetpro应用示例刷文本.lsp”可与前几天发的版本http://bbs.mjtd.com/thread-192163-1-1.html对比体验不同
该函数功能已在我的快选/刷子4.5工具http://bbs.mjtd.com/thread-189250-1-1.html应用,本次整理精简贴出
之前在本站找到类似的,由于均有初次右键/回车/空格等的小bug,故发此贴
贴出2各版本--两种解决方案,好坏不论,重在交流,欢迎大家提议或改进贴出
============356版=函数名ssgetpro==功能更强================
;带关键字及提示的类ssget函数(ssgetpro sel fls msg)
;返回选择集或nil或自定义关键字
;参数msg--提示符 命令行及屏幕跟随显示
;为nil或""时执行默认提示,自设关键字时自己添加
;参数fls--过滤表
;参数del---关键字:
;1.可以是关键字"L" "X" "P" "A" "I"及":E"和":S"组合
;例(ssgetpro "x" nil nil)与(ssget "x" nil)一样
;2.可以是""或nil----执行ssget无关键字模式
;3.自设关键字 可不避ssget模式关键字 执行":S"模式
;例sel='((115 "S")(83 "S"))则调用":S"模式或输入S返回关键字S
;(115 "S")(83 "S")查grread键表写好表即可,可多组
;(setq msg "拾或框取对象或\n[设置..S/设置...W/.....]<>:")
;;(ssgetpro '((115 "S")(83 "S")(119 "W") (87 "W") (101 "E") (69 "E")) nil MSG)
;开始执行时输入s w e均有相应字符返回
;((97 "A")(65 "A")(98 "B") (66 "B")(99 "C") (67 "C")(100 "D") (68 "D") (104 "H") (72 "H"))
;以上提供一些键盘左侧键,其他的可自行查表使用
;4.可以是1个点
;如(ssgetpro (getpoint) nil nil)
;其意义是按已知点自动执行(ssget ":E:S"...)
;可能选中多个对象
=======简版函数名ssgetSEL=简单更符合使用习惯===========
带关键字及命令行提示的类ssget函数(ssgetSEL sel fls msg)
不详介绍了,文件里面有说明
-------------------------------------------------
;带关键字及命令行提示的ssget:s最简代码--中望无效
;(ssget:s "A B" '((0 . "text")) "拾取/框取对象或[设置A/设置B]<>:")
(defun ssget:s(sel fls msg / d p2)
(initget (strcat sel " "))
(setq p(entsel msg))
(cond
((= "" p)nil)
((= 'str(type p))p)
((setq p(car p))(vl-cmdf "select" p "")(ssget "p" fls))
((setq p(cadr(grread t)) p2(getcorner p "\n指定对角点:"))
(ssget "_C" p p2 fls)
)
)
)
网友答: 本帖最后由 wzg356 于 2025-2-27 23:02 编辑
ssgetpro的3种主要的应用场景代码示例
运行:
(setq sel '((97 "A")(65 "A")(115 "S")(83 "S")) ;关键字A S --- 查grread简表设置
fls nil ;过滤表
msg "选取对象(功能A/功能S)<>:" ;提示
)
继续分别运行以下为3 种场景示例代码即可理解区别---均为执行1次 如要循环加while就行
返回关键字/选择集/nil
1.实现关键字A S+:S模式---拾取/框选 区分正/反框选
(ssgetpro sel fls msg)
(while (ssgetpro sel fls msg)) ;循环示例,右键/回车/空格结束,以下2例类似
2.实现关键字A S+:E:S模式---拾取
(if(= 'str(type (setq p(grKwordP sel msg 2))))
p(if p(ssgetpro p fls msg))
)
3.实现关键字A S+1次框选模式---区分正/反框选
(if(= 'str(type (setq p(grKwordP sel msg 2))))
p(if p(ssgetpro (list p) fls msg))
)
总结:利用grKwordP函数,可实现关键字+任何ssget 方法的组合
网友答: 本帖最后由 hubeiwdlue 于 2026-3-10 09:19 编辑
对简版ssget函数进行了一点修改,支持中望cad了。

网友答: 本帖最后由 hubeiwdlue 于 2026-3-7 21:51 编辑
发现了一个小问题,这个函数里面的点选,是通过(setq ss(ssget "_C" (mapcar '- p1(list d d))(mapcar '+ p1(list d d))))来实现的,也就是说本质是框选,在图形比较多又贴在一起的时候,点选的时候,会出现多选的情况。
我只能简单的处理了一下,如果多选,只提取第一个图元。有没有办法避免这种情况的发生。

网友答: 谢谢大佬分享。
网友答:
谢谢分享。网友答:
本帖最后由 muai2010 于 2025-2-25 18:06 编辑
有点厉害,就是看不懂,如果能支持任何实体就好了网友答: 您好,请问可以关键字和自定义关键字一起使用吗?网友答: 这个函数太好用了。
网友答:
说说什么实体不支持?网友答: 本帖最后由 wzg356 于 2025-2-25 22:00 编辑
没必要了吧
交互操作无非就是拾取 框选 ,1次还是多次,输出关键字的问题
自定义限1次选择或输出关键字,多次则文字刷提供了循环案例
全限制拾取有entsel解决
网友答: 贴出第二个版本,简单一些,基本功能也满足网友答:
比如:S单次框选关键字,又希望带自定义关键字做设置选项。
论坛上的这类函数,好像中望一直不支持,2025版没测试过。您的这个函数,在中望和acad是通用的,我本来还准备建议中望官方做一个带自定义关键字的ssget。现在没必要了。
20250227 更---简版代码再优化简化
----------------------------------------------
完整的见下载文件
应用示例“ssgetpro应用示例刷文本.lsp”可与前几天发的版本http://bbs.mjtd.com/thread-192163-1-1.html对比体验不同
该函数功能已在我的快选/刷子4.5工具http://bbs.mjtd.com/thread-189250-1-1.html应用,本次整理精简贴出
之前在本站找到类似的,由于均有初次右键/回车/空格等的小bug,故发此贴
贴出2各版本--两种解决方案,好坏不论,重在交流,欢迎大家提议或改进贴出
============356版=函数名ssgetpro==功能更强================
;带关键字及提示的类ssget函数(ssgetpro sel fls msg)
;返回选择集或nil或自定义关键字
;参数msg--提示符 命令行及屏幕跟随显示
;为nil或""时执行默认提示,自设关键字时自己添加
;参数fls--过滤表
;参数del---关键字:
;1.可以是关键字"L" "X" "P" "A" "I"及":E"和":S"组合
;例(ssgetpro "x" nil nil)与(ssget "x" nil)一样
;2.可以是""或nil----执行ssget无关键字模式
;3.自设关键字 可不避ssget模式关键字 执行":S"模式
;例sel='((115 "S")(83 "S"))则调用":S"模式或输入S返回关键字S
;(115 "S")(83 "S")查grread键表写好表即可,可多组
;(setq msg "拾或框取对象或\n[设置..S/设置...W/.....]<>:")
;;(ssgetpro '((115 "S")(83 "S")(119 "W") (87 "W") (101 "E") (69 "E")) nil MSG)
;开始执行时输入s w e均有相应字符返回
;((97 "A")(65 "A")(98 "B") (66 "B")(99 "C") (67 "C")(100 "D") (68 "D") (104 "H") (72 "H"))
;以上提供一些键盘左侧键,其他的可自行查表使用
;4.可以是1个点
;如(ssgetpro (getpoint) nil nil)
;其意义是按已知点自动执行(ssget ":E:S"...)
;可能选中多个对象
=======简版函数名ssgetSEL=简单更符合使用习惯===========
带关键字及命令行提示的类ssget函数(ssgetSEL sel fls msg)
不详介绍了,文件里面有说明
-------------------------------------------------
;带关键字及命令行提示的ssget:s最简代码--中望无效
;(ssget:s "A B" '((0 . "text")) "拾取/框取对象或[设置A/设置B]<>:")
(defun ssget:s(sel fls msg / d p2)
(initget (strcat sel " "))
(setq p(entsel msg))
(cond
((= "" p)nil)
((= 'str(type p))p)
((setq p(car p))(vl-cmdf "select" p "")(ssget "p" fls))
((setq p(cadr(grread t)) p2(getcorner p "\n指定对角点:"))
(ssget "_C" p p2 fls)
)
)
)
网友答: 本帖最后由 wzg356 于 2025-2-27 23:02 编辑
ssgetpro的3种主要的应用场景代码示例
运行:
(setq sel '((97 "A")(65 "A")(115 "S")(83 "S")) ;关键字A S --- 查grread简表设置
fls nil ;过滤表
msg "选取对象(功能A/功能S)<>:" ;提示
)
继续分别运行以下为3 种场景示例代码即可理解区别---均为执行1次 如要循环加while就行
返回关键字/选择集/nil
1.实现关键字A S+:S模式---拾取/框选 区分正/反框选
(ssgetpro sel fls msg)
(while (ssgetpro sel fls msg)) ;循环示例,右键/回车/空格结束,以下2例类似
2.实现关键字A S+:E:S模式---拾取
(if(= 'str(type (setq p(grKwordP sel msg 2))))
p(if p(ssgetpro p fls msg))
)
3.实现关键字A S+1次框选模式---区分正/反框选
(if(= 'str(type (setq p(grKwordP sel msg 2))))
p(if p(ssgetpro (list p) fls msg))
)
总结:利用grKwordP函数,可实现关键字+任何ssget 方法的组合
网友答: 本帖最后由 hubeiwdlue 于 2026-3-10 09:19 编辑
对简版ssget函数进行了一点修改,支持中望cad了。

- (defun ssgetSEL(sel fls msg / ss ov)
- (defun ssgetSEL00(sel fls msg / d p p2)
- (setq sel(if(= 'str(type sel))(strcase sel)sel)
- msg(cond((and msg(/= "" msg))msg)
- ((member sel '(":E:S" ":S:E" ":E"))"\n拾取对象<>:");仅点选模式
- (t "\n拾取或框选对象<>:")) ;点选+框选模式
- )
- (setvar "OSMODE" 16384)
- (setvar "errno" 0);错误清零
- (cond
- ((member sel '("L" "X" "P" "A" "I"))(ssget sel fls))
- ((member sel '(nil "" ":L" ":D" ":N" ":E" ":S" ":E:S" ":S:E"))
- (setvar "nomutt" 1) ; 禁止重复提示
- (princ msg) ; 显示提示信息
- (if(member sel '(nil ""))(ssget fls)(ssget sel fls))
- )
- ; 注:以下模式可利用 msg 设为点表参数执行,但意义不大
- ; "F"=栏选, "WP"=窗口多边形, "CP"=交叉多边形
- ;((and (member sel '("F" "WP" "CP"))(listp msg)(>(length msg)))(ssget sel msg fls))
- (T
- (initget (strcat (vl-string-right-trim " " sel)" "))
- (setq p(entsel msg) )
- (cond
- ((and(listp p) (/= 52 (getvar "errno")))
- (cond
- ((= (type (car p)) 'ename);entsel选中
- (ssget (cadr p) fls)
- )
- ((not p);entsel未选中
- (setq p (cadr(grread t)))
- (if (setq p2(getcorner p "\n指定对角点:"))
- (ssget(if(> (car p)(car p2))"_C" "_W") p p2 fls)
- )
- )
- )
- )
- ((and p(/= "" p))p) ; 直接返回关键字字符串
- (t nil)
- )
- )
- )
- )
- ; main
- (setq ov (getvar "OSMODE"))
- (setq ss(vl-catch-all-apply 'ssgetSEL00 (list sel fls msg)))
- (setvar "OSMODE" ov)(setvar "nomutt" 0)
- (if(vl-catch-all-error-p ss)(exit)ss)
- )
- (defun c:tt()
- (setq a (ssgetSEL "Area B" nil "拾或框取对象或\n[设置A/设置B]<>:"))
- (cond
- ((= (type a) 'STR)
- (princ a)
- )
- ((= (type a) 'PICKSET)
- (sssetfirst nil a)
- )
- )
- )
网友答: 本帖最后由 hubeiwdlue 于 2026-3-7 21:51 编辑
发现了一个小问题,这个函数里面的点选,是通过(setq ss(ssget "_C" (mapcar '- p1(list d d))(mapcar '+ p1(list d d))))来实现的,也就是说本质是框选,在图形比较多又贴在一起的时候,点选的时候,会出现多选的情况。
我只能简单的处理了一下,如果多选,只提取第一个图元。有没有办法避免这种情况的发生。

- (cond
- ((or(not p1)(= 'str(type p1))));回车/右键/关键字
- ((and p1 (not Cflag)
- (setq ss(ssget "_C" (mapcar '- p1(list d d))(mapcar '+ p1(list d d)) fls))
- ;(setq ss (ssget "p" fls));筛选
- (> (sslength ss) 0) ; 确保有选中对象
- );有效拾取
- (setq ss (ssadd(ssname ss 0)));防止多选
- (setq sss(ss2sss ss sss));单次拾取(ssnamex ss)有选择信息3
- )
- ((not :Eflag) (if;框选
- (setq p2(getcorner p1 "\n指定对角点:"))
- (setq ang(angle p1 p2)
- sss(ss2sss (ssget
- (if(and(> ang (* 0.5 pi))(< ang (* 1.5 pi)))"_C" "_W")
- p1 p2 fls
- ) sss)
- )
- (setq loop nil)
- ))
- )
网友答: 谢谢大佬分享。
网友答:
谢谢分享。网友答:
本帖最后由 muai2010 于 2025-2-25 18:06 编辑 有点厉害,就是看不懂,如果能支持任何实体就好了网友答: 您好,请问可以关键字和自定义关键字一起使用吗?网友答: 这个函数太好用了。
网友答:
muai2010 发表于 2025-2-25 18:04
有点厉害,就是看不懂,如果能支持任何实体就好了
说说什么实体不支持?网友答: 本帖最后由 wzg356 于 2025-2-25 22:00 编辑
hubeiwdlue 发表于 2025-2-25 18:49
您好,请问可以关键字和自定义关键字一起使用吗?
没必要了吧
交互操作无非就是拾取 框选 ,1次还是多次,输出关键字的问题
自定义限1次选择或输出关键字,多次则文字刷提供了循环案例
全限制拾取有entsel解决
网友答: 贴出第二个版本,简单一些,基本功能也满足网友答:
wzg356 发表于 2025-2-25 21:57
没必要了吧
交互操作无非就是拾取 框选 ,1次还是多次,输出关键字的问题
自定义限1次选择或输出关键字 ...
比如:S单次框选关键字,又希望带自定义关键字做设置选项。
论坛上的这类函数,好像中望一直不支持,2025版没测试过。您的这个函数,在中望和acad是通用的,我本来还准备建议中望官方做一个带自定义关键字的ssget。现在没必要了。