明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1762|回复: 14

ssget筛选后,如何让cad可以使用筛选的结果

[复制链接]
发表于 2023-8-7 13:00:29 | 显示全部楼层 |阅读模式
各位大神,我最近刚开始学lsp,写了一个简单的筛选lsp,但是筛选完了以后,结果无法使用,按空格后,筛选结果直接消失。


(defun c:sxx ()
(setq a (getstring "选择直线(L)选择多段线(P)选择园(C)选择文字(T)"))
(setq a (strcase a T)) ;将输入字符串全部改成小写
(setq b (or (= a "l") (= a "p") (= a "c") (= a "t")))
(while (= b nill)
        (setq a (getstring "选择直线(L)选择多段线(P)选择园(C)选择文字(T)"))
        (setq a (strcase a T))
)

(cond
        ((= a "l") (ssget '((0 . "LINE"))))
        ((= a "p") (ssget '((0 . "LWPOLYLINE"))))
        ((= a "c") (ssget '((0 . "CIRCLE,ARC"))))
        ((= a "t") (ssget '((0 . "TEXT,MTEXT"))))         
        (t (ssget '((0 . "LINE"))))
)
(princ)
)

请问要怎么样修改,才能将筛选后的结果保留下来,用作cad的下一步操作?
 楼主| 发表于 2023-8-8 12:55:54 | 显示全部楼层
本帖最后由 hubeiwdlue 于 2023-8-8 14:24 编辑
e2002 发表于 2023-8-8 10:50
另外,你上面的cond中各个 case,执行的都是同样的语句,重复多次没有意义,
设置 sFilter 变量,赋值对应 ...

看懂您的意思了,您的意思是先把点对赋予一个变量是sfilter,后面单独对sfilter操作。或者将这些点对直接做成一个表,通过assoc函数查找对应的点对。

(defun c:sxx ()
(initget 1 "l p c t")
(setq a (getkword "\n请输入选择类型[直线(l)/多段线(p)/圆(c)/文字(t)]"))
(cond
        ((= a "l") (setq sfilter '((0 . "LINE"))))
        ((= a "p") (setq sfilter '((0 . "LWPOLYLINE"))))
        ((= a "c") (setq sfilter '((0 . "CIRCLE,ARC"))))
        ((= a "t") (setq sfilter '((0 . "TEXT,MTEXT"))))         
        (t (setq sfilter '((0 . "TEXT,MTEXT"))))
)
(setq ss (ssget sfilter))
(sssetfirst nil ss)
(princ)
)

 楼主| 发表于 2023-8-8 08:50:13 | 显示全部楼层
xiaocainiao 发表于 2023-8-7 20:43
我也是新手、现用现学那种的、不会的就论坛问大神

按照你的提示,我把前面几句重写了一下,确实更像那么回事了。
(defun c:sxx ()
(initget 1 "l p c t")
(setq a (getkword "\n请输入选择类型[直线(l)/多段线(p)/圆(c)/文字(t)]"))
(cond
        ((= a "l") (sssetfirst nil (ssget '((0 . "LINE")))))
        ((= a "p") (sssetfirst nil (ssget '((0 . "LWPOLYLINE")))))
        ((= a "c") (sssetfirst nil (ssget '((0 . "CIRCLE,ARC")))))
        ((= a "t") (sssetfirst nil (ssget '((0 . "TEXT,MTEXT")))))         
        (t (sssetfirst nil (ssget '((0 . "TEXT,MTEXT")))))
)
(princ)
)
发表于 2023-8-8 10:50:20 | 显示全部楼层
本帖最后由 e2002 于 2023-8-8 11:03 编辑

另外,你上面的cond中各个 case,执行的都是同样的语句,重复多次没有意义,
设置 sFilter 变量,赋值对应的对象类型过滤字符串,cond 结束之后 只需要一句:

  1.   (cond
  2.      ((= sKey "A") (setq sFilter "....")
  3.      ....
  4.      ....
  5. )
  6. (setq ss (ssget  sFilter))
  7. (sssetfirst nil ss)


cond也可以不用,设置一个 list 对应sKey与sFilter:

  1. (setq ls  '(("A" . "LINE") ("S" . "LWPOLYLINE") ("D" . "ARC") ("F" "TEXT,MTEXT")))
  2. (setq sFilter (cdr (assoc sKey ls)))
发表于 2023-8-7 13:03:37 | 显示全部楼层
((= a "l")(sssetfirst nil(ssget '((0 . "LINE")))))其余行自己改
 楼主| 发表于 2023-8-7 14:19:06 | 显示全部楼层
谢谢大神指导。。。
发表于 2023-8-7 14:29:00 | 显示全部楼层
变量呀,设置某个变量例如 ss,并赋值为ssget的返回值:
(setq ss (ssget ....))
 楼主| 发表于 2023-8-7 17:42:05 | 显示全部楼层
e2002 发表于 2023-8-7 14:29
变量呀,设置某个变量例如 ss,并赋值为ssget的返回值:
(setq ss (ssget ....))

谢谢指导,我好好学习下ssget和sssetfirst这两个函数。
发表于 2023-8-7 20:29:51 | 显示全部楼层
你这个为啥不用initget配合getkword写呢、感觉会更方便些
 楼主| 发表于 2023-8-7 20:35:24 | 显示全部楼层
xiaocainiao 发表于 2023-8-7 20:29
你这个为啥不用initget配合getkword写呢、感觉会更方便些

,刚开始学,教学视频才看到15集,既然您提到了这两个函数,那肯定是常用函数了,我提前单独学一下。谢谢。
发表于 2023-8-7 20:43:20 | 显示全部楼层
hubeiwdlue 发表于 2023-8-7 20:35
,刚开始学,教学视频才看到15集,既然您提到了这两个函数,那肯定是常用函数了,我提前单独学一 ...

我也是新手、现用现学那种的、不会的就论坛问大神
发表于 2023-8-8 10:44:03 | 显示全部楼层
hubeiwdlue 发表于 2023-8-8 08:50
按照你的提示,我把前面几句重写了一下,确实更像那么回事了。
(defun c:sxx ()
(initget 1 "l p c t") ...

关键字字符的选择,特别是对于中文用户来说,以击键效率为优先原则,而不是非要用对应的英语单词中的字母。


  1. (initget "A S D F")
  2. (setq sKey (getkword "\n请选择类型[直线(A)/多段线(S)/圆(D)/文字(F)]: <直线>"))
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 10:04 , Processed in 0.182329 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表