hubeiwdlue 发表于 2023-8-7 13:00:29

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

各位大神,我最近刚开始学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的下一步操作?

hubeiwdlue 发表于 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)
)

hubeiwdlue 发表于 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)
)

e2002 发表于 2023-8-8 10:50:20

本帖最后由 e2002 于 2023-8-8 11:03 编辑

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

(cond
   ((= sKey "A") (setq sFilter "....")
   ....
   ....
)
(setq ss (ssgetsFilter))
(sssetfirst nil ss)

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

(setq ls'(("A" . "LINE") ("S" . "LWPOLYLINE") ("D" . "ARC") ("F" "TEXT,MTEXT")))
(setq sFilter (cdr (assoc sKey ls)))

tigcat 发表于 2023-8-7 13:03:37

((= a "l")(sssetfirst nil(ssget '((0 . "LINE")))))其余行自己改

hubeiwdlue 发表于 2023-8-7 14:19:06

谢谢大神指导。。。:victory:

e2002 发表于 2023-8-7 14:29:00

变量呀,设置某个变量例如 ss,并赋值为ssget的返回值:
(setq ss (ssget ....))

hubeiwdlue 发表于 2023-8-7 17:42:05

e2002 发表于 2023-8-7 14:29
变量呀,设置某个变量例如 ss,并赋值为ssget的返回值:
(setq ss (ssget ....))

谢谢指导,我好好学习下ssget和sssetfirst这两个函数。

xiaocainiao 发表于 2023-8-7 20:29:51

你这个为啥不用initget配合getkword写呢、感觉会更方便些

hubeiwdlue 发表于 2023-8-7 20:35:24

xiaocainiao 发表于 2023-8-7 20:29
你这个为啥不用initget配合getkword写呢、感觉会更方便些

{:1_1:},刚开始学,教学视频才看到15集,既然您提到了这两个函数,那肯定是常用函数了,我提前单独学一下。谢谢。

xiaocainiao 发表于 2023-8-7 20:43:20

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

我也是新手、现用现学那种的、不会的就论坛问大神;P

e2002 发表于 2023-8-8 10:44:03

hubeiwdlue 发表于 2023-8-8 08:50
按照你的提示,我把前面几句重写了一下,确实更像那么回事了。
(defun c:sxx ()
(initget 1 "l p c t") ...
关键字字符的选择,特别是对于中文用户来说,以击键效率为优先原则,而不是非要用对应的英语单词中的字母。


(initget "A S D F")
(setq sKey (getkword "\n请选择类型[直线(A)/多段线(S)/圆(D)/文字(F)]: <直线>"))
页: [1] 2
查看完整版本: ssget筛选后,如何让cad可以使用筛选的结果