错误的参数类型:我想我
大家好,我正在编写一个小的lisp,遇到了以下问题:
如果我将选择集的名称直接放入sslength,它工作正常,但我处于循环中,因此我想放入一个变化的变量,但它不接受它。请参见下面的AutoCAD响应。
Command: (sslength SELC2)
41
Command: (sslength (read(strcat "SEL" ENT)))
; Error: Bad argument type: lselsetp SELC2
Command: !ENT
"C2"
从我有限的理解来看,这两种表达应该给出相同的结果,但事实显然并非如此。我需要做什么改变才能实现它?
谢谢你的帮助! sslength需要一个ssget对象。(read不提供这一点。
我知道你在做什么了:制作一个拼写SELC2的字符串,希望它引用变量SELC2。
(注意:您可以在php中执行此操作,他们称之为“variable variable”。
$myvar=“你好,世界!”$a=“myvar”;打印$$a;=>将打印“你好,世界!”)
我不知道如何在lisp中这样做。如果有人有答案,我想自己知道。
你能告诉我们更多关于这个循环的信息吗?你在做什么?可能还有其他解决方案 嗯,这有点难以解释。我试图计算图形中块的出现次数,并将结果存储到单个变量中。该变量稍后用于将其放入表中。但不幸的是,我在计算foreach循环中发生的事情的第一步就吃力了。下面是代码:
(defun C:TEST ()
(setq CCLIST (list "C2" "CC" "CS1" "OFF" "PS1" "PS2" "SO"))
(foreach ENT CCLIST
(set (read(strcat "SEL" ENT)) (ssget "_X" (list (cons 0 "INSERT") (cons 2 (strcat "*_" ENT "_*")))))
(set (read(strcat "NO" ENT)) (sslength (read(strcat "SEL" ENT))))
)
)
如果它像我期望的那样工作,我就可以打字了!NOC2或!进入AutoCAD中的命令栏,获取图形中名称中包含字符串“C2”和“OFF”的块的数量。这些变量将在稍后编写的代码中使用 我想我的问题可能是列表中有一些值无法找到相应的块,因此ssget为零。这使得sslength成为一个问题。我会继续测试。 为什么不将这些值存储在列表中?你采取的方法非常非典型。
(defun c:test (/ r s)
(foreach str '("C2" "CC" "CS1" "OFF" "PS1" "PS2" "SO")
(setq r
(cons (cons str
(if (setq s (ssget "_X" (list '(0 . "INSERT") (cons 2 (strcat "*_" str "_*")))))
(sslength s)
0
)
)
r
)
)
)
(if r
(print (reverse r))
(print "No data...")
)
(princ)
)
;; Returns
;; (("C2" . 0) ("CC" . 0) ("CS1" . 0) ("OFF" . 0) ("PS1" . 0) ("PS2" . 0) ("SO" . 0))
我将把变量NOxx的名称存储在一个列表中,以防它被创建。正如我所说,这只是一个较长宏的开始,我使用以下代码解决了我的问题。
(defun C:CABIN ()
(setq CCLIST (list "C2" "CC" "CS1" "OFF" "PS1" "PS2" "SO"))
(foreach ENT CCLIST
(if (setq SSENT (ssget "_X" (list (cons 0 "INSERT") (cons 2 (strcat "*_" ENT "_*")))))
(progn
(set (read(strcat "NO" ENT)) (sslength SSENT))
);progn
);if
);foreach
);defun
现在我将把其他东西放入progn容器中继续
谢谢你的建议。 与设置变量相比,使用ronjonp列表方法更好。在读取列表时,只需使用addrow方法将所有细节放入表中,即简单的双N。如果您需要有关表格位柱的帮助。在项目任意块上工作的旁注任意数量的属性动态表宽度不计算并支持多达2个深度属性总计门银把手5=10 v的门银把手6=8
你可以发布一个示例dwg我需要一些真正的dwg工作。可以把我的ssget换成你的。
给你一个开始
(defun addsels (ss1 / x)
(repeat (setq x (sslength ss1))
(setq ss(ssadd (ssname ss1 (setq x (- x 1) ))ss))
)
)
; to be
; 4 choices a hard code list
; a select from all blocks dcl
; select from file
; pick block-s
(setq CCLIST (list "C2" "CC" "CS1" "OFF" "PS1" "PS2" "SO" "aaa" "BBB")) ; aaa BBB for testing
(setq ss(ssadd))
(foreach ENT CCLIST
(if(=(setq SSENT (ssget "_X" (list (cons 0 "INSERT") (cons 2 (strcat "*_" ENT "_*")))))nil)
(alert(strcat "missing " ent))
(addsels ssent )
)
)
;;;;;; starts here
(setq lst '())
;(setq ss (ssget '((0 . "insert"))))
(repeat (setqx (sslength ss))
(setq lst2 '())
(setq obj (vlax-ename->vla-object (ssname ss (setq x (- x 1)))))
(if (and (vlax-property-available-p obj "hasattributes")
(setq atts (vlax-invoke obj "getattributes"))
)
(progn
(setq lst2 (cons (vla-get-EffectiveName obj) lst2))
(foreach att atts
(setq lst2 (cons (vla-get-textstring att) lst2))
)
(setq lst (cons (reverse lst2) lst))
)
)
)
(sslength (eval (read (strcat "SEL" ENT)))) 啊,酷。LISP也有eval
只知道有些人不是最大的粉丝
我甚至找到了一件lisp(不是Autocad)T恤
你熟悉ASSOC吗?
;; Simple helper function
(defun _get (key l)(cdr (assoc key l)))
(setq l '(("C2" . 0) ("CC" . 0) ("CS1" . 0) ("OFF" . 88) ("PS1" . 0) ("PS2" . 0) ("SO" . 0)))
(_get "OFF" l)
;; Returns 88
页:
[1]
2