tryhi 发表于 2023-8-8 10:49:21

hubeiwdlue 发表于 2023-8-8 08:50
按照你的提示,我把前面几句重写了一下,确实更像那么回事了。
(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 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)))

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 13:01:14

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 14:22:24

本帖最后由 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]
查看完整版本: ssget筛选后,如何让cad可以使用筛选的结果