本帖最后由 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 方法的组合






网友答:
wzg356 发表于 2025-5-19 16:43
屏幕提示截去方括号(简单些好),比较完整的更新了  去下载研究

我的程序没写那么规矩,凑活看,这个现在只能在命令行有提示

  1. (vl-load-com)
  2. ;   测试程序
  3. (defun c:Q( / ss_k)

  4.   (setq ss_k (ssgetSEL "" nil "提示语3" ))

  5.   (command "chprop" "p" "" "c" "1" "")(princ))

  6. ;   ssget关键字提示函数简版
  7. (defun ssgetSEL(sel fls msg / ss ov)
  8.   (setq ov (getvar "OSMODE"))
  9.   (setq ss(vl-catch-all-apply 'ssgetSEL00 (list sel fls msg)))
  10.   (setvar "OSMODE" ov)(setvar "nomutt" 0)
  11.   (if(vl-catch-all-error-p ss)(exit)ss)
  12. )
  13. (defun ssgetSEL00(sel fls msg / p p2 d ps)
  14.   (setq sel(if(= 'str(type sel))(strcase sel)sel)
  15.     msg(cond((and msg(/= "" msg))msg)
  16.         ((member sel '(":E:S" ":S:E" ":E"))"\n拾取对象<>:")
  17.         (t "\n拾取或框选对象<>:"))   
  18.   )  
  19.   (setvar "OSMODE" 16384)  
  20.   (cond
  21.     ((member sel '("L" "X" "P" "A" "I"))(ssget sel fls))
  22.     ((member sel '(nil "" ":L" ":D" ":N" ":E" ":S" ":E:S" ":S:E"))
  23.       (setvar "nomutt" 1)(princ msg)
  24.       (if(member sel '(nil ""))(ssget fls)(ssget sel fls))
  25.     );无互动/无点表参数的均可加入
  26.     ;((and (member sel '("F" "WP" "CP"))(listp msg)(>(length msg)))(ssget sel msg fls))
  27.     ;可利用msg设为点表参数执行的ssget"F" "Wp" "Cp"模式 意义不大
  28.     ( (setq d(* 0.5(getvar 'pickbox)(/ (getvar 'viewsize)(cadr(getvar 'screensize)))))
  29.       (initget (strcat (vl-string-right-trim " " sel)"  "))
  30.       ;自定义关键字最后要双空格
  31.       (setq p(entsel msg))
  32.       (cond((and p (listp p))(ssget "_C"
  33.           (mapcar '- (cadr p)(list d d))(mapcar '+ (cadr p)(list d d))fls
  34.         ));仿ssget拾取框尺寸
  35.         ((not p)(setq p(cadr(grread t)))(if
  36.           (setq p2(getcorner p "\n指定对角点:"));框选
  37.           (ssget(if(> (car p)(car p2))"_C" "_W") p p2 fls)
  38.         ))
  39.         ((and p(/= "" p))p);返回关键字
  40.       )      
  41.     )
  42.   )  
  43. )



网友答: 本帖最后由 wzg356 于 2025-5-16 17:51 编辑
sandyvs 发表于 2025-5-16 16:22
可以按了关键字之后不结束ssget吗?就是有多个关键字,每个关键字对应一项设置,要不还没设置完都结束选 ...

(defun getpickp(sel msg / p)
        (initget (strcat sel "  "))
        (setq p(entsel msg))
        (cond((= "" p)nil)
                ((= 'str(type p))p)
                ((cadr p))
                ((cadr(grread t 13 1)))
        )        
)
(defun xxxx( / stop p p2 ss....);循环选择示例
(setq stop nil)
(while (not stop)
        (setq p(getpickp sel msg));这种要变换提示
        (cond
                ((not p)(setq stop nil))
                ((= p ....)(.....))
                ((and p(listp p))
                        (cond
                        ;((setq e(nentselp p))....)可以另模拟小窗选
                        ((and
                                        (setq p2(getcorner p "\n指定对角点:"))
                                        (setq ss(ssget"_C" p p2 fls))
                                        )
                                        .....
                        )
                ))
        )
)
)

网友答: 谢谢大佬分享。

网友答: 谢谢分享。

网友答: 本帖最后由 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。现在没必要了。
  • 上一篇:关于多重引线标注不能选择
  • 下一篇:没有了