Esteban_CAD 发表于 2022-7-5 16:41:44

错误:没有函数定义:

你们好,可爱的人。
 
我理解,在例程末尾添加(princ)应该可以阻止autocad尝试将返回的nil作为命令运行,但是无论我在哪里插入(princ),我似乎都无法实现这一点。谁能帮我摆脱痛苦,告诉我它应该去哪里。
 
n、 b.我知道程序不太好,使用if-where-cond应该在哪里等,但现在请忽略这一点。
 
(defun c:NLPTEST ( / ssloc rowno floorcur wallsh roomsh windowsh windowscillh balcsh flooraod ssfloor sswalls ssrooms sswindosw sswindowscill ssbalcs setlaywall setlayroom setlaywindow setlaywindowcill setlaybalc sswallssolids sswindowssolids ssroomssolids ssrestsolids)
(Setq ssloc (strcat (getvar 'dwgprefix) "Macro template.xlsx"))
(setq rowno 5)
(repeat 10
(if (= (getCellsFunction ssloc "NLP Heights" (strcat "B" (itoa rowno))) nil)
   (setq rowno (+ rowno 1))
   (
(setq floorcur (getCellsFunction ssloc "NLP Heights" (strcat "Y" (itoa rowno))))
(setq wallsh (getCellsFunction ssloc "NLP Heights" (strcat "B" (itoa rowno))))
(setq roomsh (getCellsFunction ssloc "NLP Heights" (strcat "C" (itoa rowno))))
(setq windowsh (getCellsFunction ssloc "NLP Heights" (strcat "D" (itoa rowno))))
(setq windowscillh (getCellsFunction ssloc "NLP Heights" (strcat "E" (itoa rowno))))
(setq balcsh (getCellsFunction ssloc "NLP Heights" (strcat "I" (itoa rowno))))
(setq flooraod (getCellsFunction ssloc "NLP Heights" (strcat "F" (itoa rowno))))
(setq setlaywall (getCellsFunction ssloc "NLP Heights" (strcat "M" (itoa rowno))))
(setq setlayroom (getCellsFunction ssloc "NLP Heights" (strcat "O" (itoa rowno))))
(setq setlaywindow (getCellsFunction ssloc "NLP Heights" (strcat "Q" (itoa rowno))))
(setq setlaywindowcill (getCellsFunction ssloc "NLP Heights" (strcat "S" (itoa rowno))))
(setq setlaybalc (getCellsFunction ssloc "NLP Heights" (strcat "U" (itoa rowno))))
(setq ssfloor (ssget "x" (list (cons 8 (vl-princ-to-string floorcur)))))
(setq sswalls (ssget "x" (list (cons 8 (vl-princ-to-string setlaywall)))))
(setq ssrooms (ssget "x" (list (cons 8 (vl-princ-to-string setlayroom)))))
(setq sswindows (ssget "x" (list (cons 8 (vl-princ-to-string setlaywindow)))))
(setq sswindowscill (ssget "x" (list (cons 8 (vl-princ-to-string setlaywindowcill)))))
(setq ssbalcs (ssget "x" (list (cons 8 (vl-princ-to-string setlaybalc)))))
(command "move" ssfloor "0,0,0" (strcat "0,0," (rtos flooraod)))
(command "-layer" "s" setlaywall "")
(command "extrude" sswalls "" wallsh)
(command "-layer" "s" setlayroom "")
(if (/= ssrooms nil)
   (
(command "extrude" ssrooms "" roomsh)
))
(command "-layer" "s" setlaywindow "")
(if (/= sswindows nil)
   (
(command "extrude" sswindows "" windowsh)
))
(command "-layer" "s" setlaywindowcill "")
(if (/= sswindowscill nil)
   (
(command "extrude" sswindowscill "" windowscillh)
))
(command "-layer" "s" setlaybalc "")
(if (/= ssbalcs nil)
   (
(command "extrude" ssbalcs "" balcsh)      
))
(setq sswallssolids(ssget "x" (list (cons 8 (vl-princ-to-string setlaywall)))))
(setq ssrestsolids(ssget "x" (list (cons 8 (vl-princ-to-string setlayroom)))))
(command "-layer" "s" setlaywall "")
(if (= ssrestsolids nil)
   (setq rowno (+ rowno 1))
   ((command "subtract" sswallssolids ssrestsolids)
   (setq rowno (+ rowno 1)))
   )
)   
   )
   )
)
 
我认为,正是这一行接近尾声时,将有问题的nil返回到命令行:
 
(
(命令“extrude”ssbalcs“”balcsh)
))
 
谢谢
 
史蒂夫

Esteban_CAD 发表于 2022-7-5 16:52:01

分类后,我是一个dumb@ss.
 
在这里添加了它,我想我已经试过了,它起作用了,很抱歉浪费时间,但感谢阅读。
 
(
(command "extrude" ssbalcs "" balcsh)
(princ)
))

Lee Mac 发表于 2022-7-5 16:58:00

粗略地看一眼后,改变:
    (if (= ssrestsolids nil)
   (setq rowno (+ rowno 1))
   ((command "subtract" sswallssolids ssrestsolids)
   (setq rowno (+ rowno 1)))
   )至:
(if (= ssrestsolids nil)
   (setq rowno (+ rowno 1))
   (progn
       (command "subtract" sswallssolids ssrestsolids)
       (setq rowno (+ rowno 1))
   )
)

marko_ribar 发表于 2022-7-5 17:04:32

在这里,您在代码中有一些缺失。。。李是对的,但它可以更干净。。。
(你的if语句很好-如果一切正常,则不需要cond…)
 
子函数的Excel输出总是以字符串格式-不需要(vl princ to string)等等。。。
HTH。

BIGAL 发表于 2022-7-5 17:14:52

另一个建议变量可以动态生成,无需硬编码,因此可以用类似于本例的内容替换所有setq。需要添加excel位。与6相同,使用列表更容易一些。
 
抱歉,我有点懒,因为没有宏xls来尝试。
 

;by T.Willey at Augi.com
(setq VarList '("one" "two" "three")) ;variable name
(setq ValueList '(1 2 3)) ; matching values
(mapcar
'(lambda (a b)
(set (read a) b)
)
VarList
ValueList
)

 

Command: !one
1

Command: !two
2

Command: !three
3

Grrr 发表于 2022-7-5 17:16:59

BIGAL,这种方法更容易定位变量:

(defun test ( / syms vars one two three)
(setq syms '(one two three))
(setq vars '(1 2 3))
(mapcar 'set syms vars)
)
只需复制要本地化的“syms”内容即可。
 
然而,我会选择assoc list,如下所示:

(setq CellsL
(mapcar
   '(lambda (x)
   (list (car x) (getCellsFunction ssloc "NLP Heights" (strcat (cadr x) (itoa rowno))) )
   )
   '(
   ("floorcur" "Y") ("wallsh" "B") ("roomsh" "C") ("windowsh" "D") ("windowscillh" "E") ("balcsh" "I")
   ("flooraod" "F") ("setlaywall" "M") ("setlayroom" "O") ("setlaywindow" "Q") ("setlaywindowcill" "S") ("setlaybalc" "U")
   )
)
)
 
只需访问所需的变量,如:
(cadr (assoc "setlaywall" CellsL))

BIGAL 发表于 2022-7-5 17:26:41

谢谢,现在代码可能要短得多。这是一种简单的方法,需要设置许多变量。

Esteban_CAD 发表于 2022-7-5 17:32:50

你好
 
感谢您的回复:
 
Lee-Progn是我需要更仔细地研究的东西,现在我更好地理解了它,它解释了以前例程中的一些问题。同时非常感谢您提供的所有内容和LISP,我发现它们在穿越AutoLISP雷区时非常有用。
 
马可-再次感谢你花时间回复,我已经尝试了你发布的修改后的例程,虽然我在运行时没有收到任何错误消息,但它似乎没有任何作用。
 
在此之前,它将一直工作到出现以下突出显示的中断错误:
 
(
(command "extrude" ssbalcs "" balcsh)
))

 
然而现在没有错误,但什么都没有发生,你知道为什么会这样吗?
 
Bigal/Grrr-非常有用的信息,将来会纳入你的建议,但是我现在肯定是个新手,所以在我尝试简化它们并进一步混淆自己之前,只想让事情顺利进行。
 
注意,我把其中一个变量sswindosw拼错了,它应该是sswindows。

marko_ribar 发表于 2022-7-5 17:41:29

 
可能是xlsx文件的B列不是空的,假设它是空的。。。因此,如果(getCellsFunction)首先返回if条件非空字符串(“”),那么(getCellFunction)可能在某个地方有返回(if(=rtn“”)(setq rtn nil))并以:rtn结束,因此返回值将代替您发布的代码中的“be nil”。。。所以快速修复,但我不建议您替换:

(if (= (getCellsFunction ssloc "NLP Heights" (strcat "B" (itoa rowno))) "")

但是我宁愿换一种方式,改变(getCellsFunction)返回“STR”,就像它应该返回的那样(如果它是空单元格,那么“”应该是(getCellsFunction)求值的返回)。。。

Esteban_CAD 发表于 2022-7-5 17:42:35

成功
 
感谢大家的帮助,我从所有的回复中拼凑出了我想要的东西,但可能没有帮助,因为我没有发布文件或电子表格来正确解释我想要实现的目标。偶尔,它会帮助其他人完成以下例行工作:
 
13
 
主要违规者之一是该行(命令“subtract”sswallssolids ssrestssolids),该行本应为(命令“subtract”sswallssolids“ssrestssolids”)。
 
再次感谢大家。
页: [1]
查看完整版本: 错误:没有函数定义: