Happy Hobbit 发表于 2022-7-5 18:03:41

选择对象:或(A)ll

这应该很容易,但我正在努力。我想要一个例程用作使用以下方法的模板:
提示:“选择对象:或(A)ll”
除非输入“A”,否则左键单击将启动“按项目选择”窗口,在这种情况下,所有内容(允许的过滤器)都被选中
 
到目前为止,我的代码是:
 
(defun c:select-opt (/ opt ss)
(setq opt (cond ((getkword "\nSelect objects: or (A)ll "))("s")))
(cond
   ((eq opt "a")
          (setq ss (ssget "_X" '((0 . "TEXT,MTEXT"))))
   )
   ((eq opt "s")
    (setq ss (ssget "_:L" '((0 . "TEXT,MTEXT"))))
    )
)
(princ (itoa (sslength ss)))
(princ)
)
 
这是可行的,但首先需要右键单击,我想取消右键单击

Stefan BMR 发表于 2022-7-5 18:11:39

你可以简单地使用
(setq ss (ssget "_:L" '((0 . "TEXT,MTEXT"))))
并在提示选择时键入“all”。
 

(princ "\nSelect objects or press enter to select all: ")
(or
(setq ss (ssget "_:L" '((0 . "TEXT,MTEXT"))))
(setq ss (ssget "_X" '((0 . "TEXT,MTEXT"))))
)

Happy Hobbit 发表于 2022-7-5 18:16:12

这很奇怪,它可以在控制台中工作,但会产生;错误:lisp中的参数太少:
 
(defun c:select-opt ( ss )
(princ "\nSelect objects or press enter to select all: ")
(or
(setq ss (ssget "_:L" '((0 . "TEXT,MTEXT"))))
(setq ss (ssget "_X" '((0 . "TEXT,MTEXT"))))
)
(princ (strcat "\n" (itoa (sslength ss))))
(princ)
)

Lee Mac 发表于 2022-7-5 18:19:42

( ss )应为:
( / ss )

Happy Hobbit 发表于 2022-7-5 18:24:11

谢谢你Stefan&你也是Lee,很好

Lee Mac 发表于 2022-7-5 18:26:58

别担心

Happy Hobbit 发表于 2022-7-5 18:30:48

我仍然认为必须能够在命令中放入“cond”语句,首先见证绘制圆、圆弧或样条曲线。
 
或Trim,返回“选择对象或:”
 
哦,好吧

Jef! 发表于 2022-7-5 18:35:55

用一个简单的,如果是这样的话,也许?
 
(defun c:select-opt ( / ss)
(princ "\nSelect objects and press enter or press enter right away to select all: \n")
(if (not (setq ss (ssget "_:L" '((0 . "TEXT,MTEXT")))))
   (setq ss (ssget "_X" (list '(0 . "TEXT,MTEXT") (cons 410 (getvar 'ctab)))))
)
(princ (itoa (sslength ss)))
)
 
 
我将ssget _x仅限于当前选项卡,如果没有它,它将从所有选项卡和模型中进行选择。
 
干杯
杰夫!

Happy Hobbit 发表于 2022-7-5 18:40:42

那正是我想要的,谢谢你,杰夫!
 
问题在于
方法是误点击非文本项会使代码默认为ssget\u X

Lee Mac 发表于 2022-7-5 18:43:44

除了为(ssget“_X”)表达式添加布局过滤器外,请注意(if(not…)语句的操作与(或)语句相同。
 
在这两种情况下,只有当第一个表达式返回nil时,才会对第二个表达式求值。
页: [1] 2
查看完整版本: 选择对象:或(A)ll