本帖最后由 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了。

  1. (defun ssgetSEL(sel fls msg / ss ov)
  2.   (defun ssgetSEL00(sel fls msg / d p p2)
  3.     (setq sel(if(= 'str(type sel))(strcase sel)sel)
  4.       msg(cond((and msg(/= "" msg))msg)
  5.            ((member sel '(":E:S" ":S:E" ":E"))"\n拾取对象<>:");仅点选模式
  6.            (t "\n拾取或框选对象<>:"))                    ;点选+框选模式
  7.     )
  8.     (setvar "OSMODE" 16384)
  9.     (setvar "errno" 0);错误清零
  10.     (cond
  11.       ((member sel '("L" "X" "P" "A" "I"))(ssget sel fls))
  12.       ((member sel '(nil "" ":L" ":D" ":N" ":E" ":S" ":E:S" ":S:E"))
  13.         (setvar "nomutt" 1)    ; 禁止重复提示
  14.         (princ msg)            ; 显示提示信息
  15.         (if(member sel '(nil ""))(ssget fls)(ssget sel fls))
  16.       )
  17.       ; 注:以下模式可利用 msg 设为点表参数执行,但意义不大
  18.       ; "F"=栏选, "WP"=窗口多边形, "CP"=交叉多边形
  19.       ;((and (member sel '("F" "WP" "CP"))(listp msg)(>(length msg)))(ssget sel msg fls))
  20.       (T
  21.         (initget (strcat (vl-string-right-trim " " sel)"  "))
  22.         (setq p(entsel msg) )
  23.         (cond
  24.           ((and(listp p) (/= 52 (getvar "errno")))
  25.             (cond
  26.               ((= (type (car p)) 'ename);entsel选中
  27.                 (ssget (cadr p) fls)
  28.               )
  29.               ((not p);entsel未选中
  30.                 (setq p (cadr(grread t)))
  31.                 (if (setq p2(getcorner p "\n指定对角点:"))
  32.                   (ssget(if(> (car p)(car p2))"_C" "_W") p p2 fls)
  33.                 )
  34.               )
  35.             )
  36.           )
  37.           ((and p(/= "" p))p)  ; 直接返回关键字字符串
  38.           (t nil)
  39.         )
  40.       )
  41.     )  
  42.   )
  43.   ; main
  44.   (setq ov (getvar "OSMODE"))
  45.   (setq ss(vl-catch-all-apply 'ssgetSEL00 (list sel fls msg)))
  46.   (setvar "OSMODE" ov)(setvar "nomutt" 0)
  47.   (if(vl-catch-all-error-p ss)(exit)ss)
  48. )

  49. (defun c:tt()
  50.   (setq a (ssgetSEL "Area B" nil "拾或框取对象或\n[设置A/设置B]<>:"))
  51.   (cond
  52.     ((= (type a) 'STR)
  53.      (princ a)
  54.     )
  55.     ((= (type a) 'PICKSET)
  56.      (sssetfirst nil a)
  57.     )
  58.   )
  59. )




网友答: 本帖最后由 hubeiwdlue 于 2026-3-7 21:51 编辑

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

  1. (cond
  2.                 ((or(not p1)(= 'str(type p1))));回车/右键/关键字
  3.                 ((and p1 (not Cflag)
  4.                    (setq ss(ssget "_C" (mapcar '- p1(list d d))(mapcar '+ p1(list d d)) fls))
  5.                    ;(setq ss (ssget "p" fls));筛选
  6.                    (> (sslength ss) 0)  ; 确保有选中对象
  7.                  );有效拾取
  8.                   (setq ss (ssadd(ssname ss 0)));防止多选
  9.                   (setq sss(ss2sss ss sss));单次拾取(ssnamex ss)有选择信息3
  10.                 )
  11.                 ((not :Eflag) (if;框选
  12.                                 (setq p2(getcorner p1 "\n指定对角点:"))
  13.                                 (setq ang(angle p1 p2)
  14.                                   sss(ss2sss (ssget
  15.                                                (if(and(> ang (* 0.5 pi))(< ang (* 1.5 pi)))"_C" "_W")
  16.                                                p1 p2 fls
  17.                                              ) sss)
  18.                                 )
  19.                                 (setq loop nil)
  20.                               ))
  21.               )



网友答: 谢谢大佬分享。

网友答: 谢谢分享。

网友答: 本帖最后由 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。现在没必要了。
  • 上一篇:SSF升级版支持vlsfasvlx格式文件指定路径内模糊搜
  • 下一篇:没有了