; 初始化计数器(从1开始); 循环生成C1到C20(当i≤20时执行)
(setq i 1)
(while (<= i 20); 动态定义命令:C1、C2...C20
(eval (list 'defun
(read (strcat "C:C" (itoa i))) ; 命令名:拼接"C:"+数字(如"C:1")
'() ; 无参数
(list 'COMMAND "_INSERT" (strcat "D:\\张生\\说明\\" (itoa i) "孔.dwg") (getpoint "\n图块插入点:"));出错
(list 'command "_.Rotate" (entlast) "" (cdr (assoc 10 (entget (entlast)))) pause);出错
'(princ) ; 清理命令行输出
))
(setq i (+ i 1)) ; 计数器递增(i=1→2→...→20)
);其中有两段代码出错了。始终不明白这代码是怎么写才正确的。望知道的大佬指点指点。感谢大佬 了。
网友答: 本帖最后由 1028695446 于 2025-8-29 17:17 编辑
看不下去了,请参照附件的格式去写
网友答: 瞎学Leemac的写代码方式。
老老实实做个带参数的函数,然后顺次定义输入命令名为参数调用改函数即可。
网友答: 实际上用字符串简单点,(eval (read str))
read可以简单的理解为去掉了双引号.

网友答: 本帖最后由 liuhe 于 2025-8-28 15:50 编辑
求助,如何批量定义函数 - AutoLISP/Visual LISP 编程技术 - AutoCAD论坛 - 明经CAD社区 - Powered by Discuz!网友答: (setq i 1)
(while (<= i 20); 动态定义命令:C1、C2...C20
(eval (list 'defun
(read (strcat "C:C" (itoa i))) ; 命令名:拼接"C:"+数字(如"C:1")
'() ; 无参数
(list 'COMMAND "_INSERT" (strcat "D:\\张生\\说明\\" (itoa i) "孔.dwg") '(getpoint "\n图块插入点:"));出错
(list 'command "_.Rotate" '(entlast) "" '(cdr (assoc 10 (entget (entlast)))) 'pause);出错
'(princ) ; 清理命令行输出
))
(setq i (+ i 1)) ; 计数器递增(i=1→2→...→20)
)网友答:
20个呢 这写的有点麻烦。所以想学习一下这种方式。虽然用到的不多。大佬能指点下吗?网友答:
网友答:
本帖最后由 你有种再说一遍 于 2025-8-28 16:04 编辑
这种就是动态编译而已,是动态类型语言的常用工具.
在静态类型语言其实也有,无非就是宏,或者混合runtime.
当你想做什么的时候,哥已经做完,并写上博客:
https://www.cnblogs.com/JJBox/p/14487646.html网友答: 本帖最后由 kozmosovia 于 2025-8-28 16:30 编辑
肯定没改对,insert图块,点了插入位置,还得定义缩放旋转才能结束command呢
rotate选了entlast还得回车确认选择结束,才能定义基准点。

网友答: 本帖最后由 edata 于 2025-8-28 16:10 编辑
(setq i 1)
(while (<= i 20); 动态定义命令:C1、C2...C20
(eval (list 'defun
(read (strcat "C:C" (itoa i))) ; 命令名:拼接"C:"+数字(如"C:1")
'() ; 无参数
(list 'COMMAND "_INSERT" (strcat "D:\\张生\\说明\\" (itoa i) "孔.dwg") (getpoint "\n图块插入点:"));出错
(list 'command "_.Rotate" (entlast) "" (cdr (assoc 10 (entget (entlast)))) pause);出错
'(princ) ; 清理命令行输出
))
(setq i (+ i 1)) ; 计数器递增(i=1→2→...→20)
);其中有两段代码出错了。始终不明白这代码是怎么写才正确的。望知道的大佬指点指点。感谢大佬 了。
网友答: 本帖最后由 1028695446 于 2025-8-29 17:17 编辑
看不下去了,请参照附件的格式去写
网友答: 瞎学Leemac的写代码方式。
老老实实做个带参数的函数,然后顺次定义输入命令名为参数调用改函数即可。
网友答: 实际上用字符串简单点,(eval (read str))
read可以简单的理解为去掉了双引号.

- (setq str(strcat
- "(defun c:C" (itoa i) "()
- (command "_insert" (strcat "D:\\\\张生\\\\说明\\\" (itoa i) "孔.dwg")(getpoint "\n图块插入点:"))
- (command "_Rotate" (entlast) (cdr (assoc 10 (entget (entlast)))) pause)
- (princ)
- )" ))
- (eval(read str))
网友答: 本帖最后由 liuhe 于 2025-8-28 15:50 编辑
求助,如何批量定义函数 - AutoLISP/Visual LISP 编程技术 - AutoCAD论坛 - 明经CAD社区 - Powered by Discuz!网友答: (setq i 1)
(while (<= i 20); 动态定义命令:C1、C2...C20
(eval (list 'defun
(read (strcat "C:C" (itoa i))) ; 命令名:拼接"C:"+数字(如"C:1")
'() ; 无参数
(list 'COMMAND "_INSERT" (strcat "D:\\张生\\说明\\" (itoa i) "孔.dwg") '(getpoint "\n图块插入点:"));出错
(list 'command "_.Rotate" '(entlast) "" '(cdr (assoc 10 (entget (entlast)))) 'pause);出错
'(princ) ; 清理命令行输出
))
(setq i (+ i 1)) ; 计数器递增(i=1→2→...→20)
)网友答:
kozmosovia 发表于 2025-8-28 15:37
瞎学Leemac的写代码方式。
老老实实做个带参数的函数,然后顺次定义输入命令名为参数调用改函数即可。
20个呢 这写的有点麻烦。所以想学习一下这种方式。虽然用到的不多。大佬能指点下吗?网友答:

- ; 初始化计数器(从1开始); 循环生成C1到C20(当i≤20时执行)
- (setq i 1)
- (while (<= i 20); 动态定义命令:C1、C2...C20
- (eval (list 'defun
- (read (strcat "C:C" (itoa i))) ; 命令名:拼接"C:"+数字(如"C:1")
- '() ; 无参数
- '(command "_INSERT" (strcat "D:\\张生\\说明\\" (itoa i) "孔.dwg") (getpoint "\n图块插入点:"));出错
- '(command "_.Rotate" (entlast) "" (cdr (assoc 10 (entget (entlast)))) pause);出错
- '(princ) ; 清理命令行输出
- ))
- (setq i (+ i 1)) ; 计数器递增(i=1→2→...→20)
- );其中有两段代码出错了。始终不明白这代码是怎么写才正确的。望知道的大佬指点指点。感谢大佬 了。
这种就是动态编译而已,是动态类型语言的常用工具.
在静态类型语言其实也有,无非就是宏,或者混合runtime.
当你想做什么的时候,哥已经做完,并写上博客:
https://www.cnblogs.com/JJBox/p/14487646.html网友答: 本帖最后由 kozmosovia 于 2025-8-28 16:30 编辑
tryhi 发表于 2025-8-28 15:42
(setq i 1)
(while (
肯定没改对,insert图块,点了插入位置,还得定义缩放旋转才能结束command呢
rotate选了entlast还得回车确认选择结束,才能定义基准点。

- (defun _Function (idx)
- (command "_.insert"
- (strcat "D:\\张生\\说明\" (itoa idx) "孔.dwg")
- (getpoint "\n图块插入点:")
- )
- (while (/= (getvar "cmdactive") 0) (command ""))
- (command "_.Rotate"
- (entlast)
- ""
- (cdr (assoc 10 (entget (entlast))))
- pause
- )
- )
- (setq i 0)
- (repeat 20
- (setq i (1+ i))
- (eval (read
- (strcat "(defun c:C" (itoa i) "()(_Function " (itoa i) "))")
- )
- )
- )
网友答: 本帖最后由 edata 于 2025-8-28 16:10 编辑

- (eval (list 'defun
- (read (strcat "C:C" (itoa i))) ; 命令名:拼接"C:"+数字(如"C:1")
- '() ; 无参数
- (list 'COMMAND "_INSERT" (list 'strcat "D:\\张生\\说明\\" (itoa i) "孔.dwg") '(getpoint "\n图块插入点:"));出错
- (list 'command "_.Rotate" '(entlast) "" '(cdr (assoc 10 (entget (entlast)))) pause);出错
- '(princ) ; 清理命令行输出
- ))