Autolisp用户功能重载

时间:2017-08-18 08:13:41

标签: autolisp

您可以在AutoCAD知识网站上阅读:
“注意:您可以使用相同的名称定义多个用户函数,但每个定义都接受不同数量或类型的参数。” 有人使用这个功能吗?我试过但根本不工作。 我只能调用最新定义的函数。如果我这样调用(file::AppendFile arg1)那么autocad说我的参数太少了 enter image description here

2 个答案:

答案 0 :(得分:2)

我没有安装AutoCAD的计算机,所以我无法检查AutoLISP是否按照文档说的方式工作,但我知道我已经看到了一个解决方法来通过函数中可变数量的参数。

诀窍是将所有参数作为单个列表传递,然后在函数体中处理该列表。例如:

(defun myFunction (argsList / path header)
  (setq path (car argsList))
  (setq header (cadr argsList))
  (someFunction path "a" header)
)

...然后您使用(myFunction '(arg1))(myFunction '(arg1 arg2))来调用您的函数。

请注意,在上面的示例中,我使用了列表构造函数文字,因此它将传入实际的字符串" arg1"和" arg2"。如果您想传递变量内容,则需要使用(myFunction (list var1 var2))形式。

它有点难看,但它是一种选择。

答案 1 :(得分:1)

  

“注意:您可以使用相同的名称定义多个用户函数,但每个定义都接受不同数量或类型的参数。”

这在AutoLISP中是不可能的:评估的最后一个defun表达式将覆盖命名空间中符号的所有先前定义 - 因此,在您的示例中,file:AppendFile函数将需要两个参数,如第二个defun表达式将立即重新定义该函数。

提供两个参数(除了提供不同长度的参数列表)之外的唯一方法是在评估第二个file:AppendFile表达式之前评估defun函数。