按照你的提示,我把前面几句重写了一下,确实更像那么回事了。
(defun c:sxx ()
(initget 1 "l p c t") ...
(defun c:sxx (/ a b)
(initget 1 "l p c t")
(setq a (getkword "\n请输入选择类型[直线(l)/多段线(p)/圆(c)/文字(t)]"))
(setq b(cadr(assoc a '(("l""line")("p""LWPOLYLINE")("c""CIRCLE,ARC")("t""*TEXT")))))
(sssetfirst nil (ssget (list(cons 0 b))))
(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)))
本帖最后由 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)
)
tryhi 发表于 2023-8-8 10:49
(defun c:sxx (/ a b)
(initget 1 "l p c t")
(setq a (getkword "\n请输入选择类型[直线(l)/多段线( ...
谢谢您的指导,先生成一个list,然后用assoc查找函数代替cond函数找到表的第二个元素,在和0生成点对,来实现。我每个方法都试验一下,谢谢。 本帖最后由 hubeiwdlue 于 2023-8-8 18:40 编辑
tryhi 发表于 2023-8-8 10:49
(defun c:sxx (/ a b)
(initget 1 "l p c t")
(setq a (getkword "\n请输入选择类型[直线(l)/多段线( ...
按照您的方法出现了一个问题,就是(cons 0 b),无法生成点对,而是一个数组,中间没有点。
没问题了,是cadr和cdr使用的区别造成的。
页:
1
[2]