; 初始化计数器(从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可以简单的理解为去掉了双引号.
  1. (setq str(strcat
  2. "(defun c:C" (itoa i) "()
  3.   (command "_insert" (strcat "D:\\\\张生\\\\说明\\\" (itoa i) "孔.dwg")(getpoint "\n图块插入点:"))
  4.   (command "_Rotate" (entlast) (cdr (assoc 10 (entget (entlast)))) pause)
  5.   (princ)
  6.   )" ))
  7. (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. ; 初始化计数器(从1开始); 循环生成C1到C20(当i≤20时执行)
  2. (setq i 1)
  3. (while (<= i 20); 动态定义命令:C1、C2...C20
  4.   (eval (list 'defun
  5.               (read (strcat "C:C" (itoa i)))  ; 命令名:拼接"C:"+数字(如"C:1")
  6.               '()                            ; 无参数
  7.               '(command "_INSERT" (strcat "D:\\张生\\说明\\" (itoa i) "孔.dwg") (getpoint "\n图块插入点:"));出错
  8.               '(command "_.Rotate" (entlast) "" (cdr (assoc 10 (entget (entlast)))) pause);出错
  9.               '(princ)                       ; 清理命令行输出
  10.         ))
  11.   (setq i (+ i 1))  ; 计数器递增(i=1→2→...→20)
  12. );其中有两段代码出错了。始终不明白这代码是怎么写才正确的。望知道的大佬指点指点。感谢大佬 了。


网友答: 本帖最后由 你有种再说一遍 于 2025-8-28 16:04 编辑

这种就是动态编译而已,是动态类型语言的常用工具.
在静态类型语言其实也有,无非就是宏,或者混合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还得回车确认选择结束,才能定义基准点。

  1. (defun _Function (idx)
  2.   (command "_.insert"
  3.      (strcat "D:\\张生\\说明\"  (itoa idx) "孔.dwg")
  4.      (getpoint "\n图块插入点:")
  5.   )
  6.   (while (/= (getvar "cmdactive") 0) (command ""))
  7.   (command "_.Rotate"
  8.      (entlast)
  9.      ""
  10.      (cdr (assoc 10 (entget (entlast))))
  11.      pause
  12.   )
  13. )
  14. (setq i 0)
  15. (repeat  20
  16.   (setq i (1+ i))
  17.   (eval  (read
  18.     (strcat "(defun c:C" (itoa i) "()(_Function " (itoa i) "))")
  19.   )
  20.   )
  21. )




网友答: 本帖最后由 edata 于 2025-8-28 16:10 编辑

  1. (eval (list 'defun
  2.               (read (strcat "C:C" (itoa i)))  ; 命令名:拼接"C:"+数字(如"C:1")
  3.               '()                            ; 无参数
  4.               (list 'COMMAND "_INSERT" (list 'strcat "D:\\张生\\说明\\" (itoa i) "孔.dwg") '(getpoint "\n图块插入点:"));出错
  5.               (list 'command "_.Rotate" '(entlast) "" '(cdr (assoc 10 (entget (entlast)))) pause);出错
  6.               '(princ)                       ; 清理命令行输出
  7.         ))
  • 上一篇:属性块属性编辑器ODCL版
  • 下一篇:没有了