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 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)
)
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 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)))
((= a "l")(sssetfirst nil(ssget '((0 . "LINE")))))其余行自己改 谢谢大神指导。。。:victory: 变量呀,设置某个变量例如 ss,并赋值为ssget的返回值:
(setq ss (ssget ....)) e2002 发表于 2023-8-7 14:29
变量呀,设置某个变量例如 ss,并赋值为ssget的返回值:
(setq ss (ssget ....))
谢谢指导,我好好学习下ssget和sssetfirst这两个函数。 你这个为啥不用initget配合getkword写呢、感觉会更方便些 xiaocainiao 发表于 2023-8-7 20:29
你这个为啥不用initget配合getkword写呢、感觉会更方便些
{:1_1:},刚开始学,教学视频才看到15集,既然您提到了这两个函数,那肯定是常用函数了,我提前单独学一下。谢谢。 hubeiwdlue 发表于 2023-8-7 20:35
,刚开始学,教学视频才看到15集,既然您提到了这两个函数,那肯定是常用函数了,我提前单独学一 ...
我也是新手、现用现学那种的、不会的就论坛问大神;P 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