明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
12
返回列表 发新帖
楼主: hubeiwdlue

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

[复制链接]
发表于 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)
)

评分

参与人数 1明经币 +1 收起 理由
lailaifa + 1

查看全部评分

发表于 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-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 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生成点对,来实现。我每个方法都试验一下,谢谢。
 楼主| 发表于 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使用的区别造成的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 10:01 , Processed in 0.174086 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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