AutoLISP 中“:”和“->”的使用
The use of ":" and "->" in AutoLISP
;;----------------=={ Add Objects to Block }==----------------;;
;; ;;
;; Adds all objects in the provided SelectionSet to the ;;
;; definition of the specified block. ;;
;;------------------------------------------------------------;;
;; Author: Lee Mac, Copyright © 2011 - www.lee-mac.com ;;
;;------------------------------------------------------------;;
(defun LM:AddObjectstoBlock ( doc block ss / lst mat )
(setq lst (LM:ss->vla ss)
mat (LM:Ref->Def block)
mat (vlax-tmatrix (append (mapcar 'append (car mat) (mapcar 'list (cadr mat))) '((0. 0. 0. 1.))))
)
(foreach obj lst (vla-transformby obj mat))
(vla-CopyObjects doc (LM:SafearrayVariant vlax-vbobject lst)
(vla-item (vla-get-Blocks doc) (cdr (assoc 2 (entget block))))
)
(foreach obj lst (vla-delete obj))
(vla-regen doc acAllViewports)
这是我第一次看到在 AutoLISP 中使用这种类型的语法。
我正在尝试对 "LM:"
的实际含义进行一些解释。
"Ref->"
的使用也是我的疑问。 "Ref"
似乎没有被定义,所以它似乎一定是系统的一部分,尽管我无法提取任何描述 "Ref->"
的使用的文档。
为什么局部变量ss
被"LM:ss->"
访问?
谢谢。
这种语法不是 AutoLISP/Visual LISP 的构造。这是李 Mac 的标准。我是这样理解的:
"LM:"其实就是"Lee Mac"的快捷方式;)
(LM:ss->vla ss) shound 将数据类型从选择集切换到 vla 对象列表,其中选择集类似于所选元素列表,但定义为类型实体,而不是 vla 对象。也许通过 (ssget) 或 (ssgetfirst)
(LM:Ref->Def block) 根据其引用获取块定义。其中 "LM:Ref->Def" 只是函数的全名。 "Ref" 不是任何类型的变量,它是函数名的一部分。
"LM:ss->" 不是说我们使用定义为函数参数的 ss,而是 "LM:ss->vla" 是函数名。
在 AutoLISP 中定义函数时,赋予结果函数替代行为的唯一命名约定是前缀 c:
例如:
(defun c:test ( )
(princ "\nHello World!")
(princ)
)
在函数名称中使用 c:
前缀意味着该函数可以直接在 AutoCAD 命令行中作为命令求值。
在这里,在 AutoCAD 命令行中键入 test
会导致 Hello World!
在命令行 window.
的新行上打印
如果函数被定义为:
(defun test ( )
(princ "\nHello World!")
(princ)
)
在 AutoCAD 命令行中键入 test
会导致错误消息:
Command: test Unknown command "TEST". Press F1 for help.
对于要计算的函数,用户需要键入:(test)
。
考虑到这一点,LM:
的使用除了标识为我的库中的函数外没有其他意义,并且可以降低在同一命名空间中定义同名函数的可能性.
例如,如果我要定义一个函数,例如:
(defun AddLine ( pt1 pt2 )
(entmakex
(list
'(0 . "LINE")
(cons 10 pt1)
(cons 11 pt2)
)
)
)
鉴于此函数的通用命名和它执行的无处不在的操作(至少在涉及 AutoCAD 的地方),很可能在文档命名空间中定义了另一个具有相同名称的此类函数。
因此,当上面的 defun
表达式被求值时,现有函数将被重新定义,或者如果它自己的 defun
表达式稍后被求值,现有函数将重新定义上面的函数。
通过在函数名称前添加我自己的作者前缀 LM:
:
(defun LM:AddLine ( pt1 pt2 )
(entmakex
(list
'(0 . "LINE")
(cons 10 pt1)
(cons 11 pt2)
)
)
)
我正在帮助确保当我在文档命名空间中评估 LM:AddLine
时,我自己定义的这个函数将始终被使用,并且我可以 'contaminate' 定义的可能性较小另一个加载程序使用的函数。
同样,在函数名称中使用 ->
纯粹是一种命名约定,不赋予函数任何其他含义。
例如,我将我的函数命名为 LM:ss->vla
,因为它是一个标准函数 from my library,它将选择集(我缩写为 ss
)转换为列表VLA-对象。
;;----------------=={ Add Objects to Block }==----------------;;
;; ;;
;; Adds all objects in the provided SelectionSet to the ;;
;; definition of the specified block. ;;
;;------------------------------------------------------------;;
;; Author: Lee Mac, Copyright © 2011 - www.lee-mac.com ;;
;;------------------------------------------------------------;;
(defun LM:AddObjectstoBlock ( doc block ss / lst mat )
(setq lst (LM:ss->vla ss)
mat (LM:Ref->Def block)
mat (vlax-tmatrix (append (mapcar 'append (car mat) (mapcar 'list (cadr mat))) '((0. 0. 0. 1.))))
)
(foreach obj lst (vla-transformby obj mat))
(vla-CopyObjects doc (LM:SafearrayVariant vlax-vbobject lst)
(vla-item (vla-get-Blocks doc) (cdr (assoc 2 (entget block))))
)
(foreach obj lst (vla-delete obj))
(vla-regen doc acAllViewports)
这是我第一次看到在 AutoLISP 中使用这种类型的语法。
我正在尝试对 "LM:"
的实际含义进行一些解释。
"Ref->"
的使用也是我的疑问。 "Ref"
似乎没有被定义,所以它似乎一定是系统的一部分,尽管我无法提取任何描述 "Ref->"
的使用的文档。
为什么局部变量ss
被"LM:ss->"
访问?
谢谢。
这种语法不是 AutoLISP/Visual LISP 的构造。这是李 Mac 的标准。我是这样理解的:
"LM:"其实就是"Lee Mac"的快捷方式;)
(LM:ss->vla ss) shound 将数据类型从选择集切换到 vla 对象列表,其中选择集类似于所选元素列表,但定义为类型实体,而不是 vla 对象。也许通过 (ssget) 或 (ssgetfirst)
(LM:Ref->Def block) 根据其引用获取块定义。其中 "LM:Ref->Def" 只是函数的全名。 "Ref" 不是任何类型的变量,它是函数名的一部分。
"LM:ss->" 不是说我们使用定义为函数参数的 ss,而是 "LM:ss->vla" 是函数名。
在 AutoLISP 中定义函数时,赋予结果函数替代行为的唯一命名约定是前缀 c:
例如:
(defun c:test ( )
(princ "\nHello World!")
(princ)
)
在函数名称中使用 c:
前缀意味着该函数可以直接在 AutoCAD 命令行中作为命令求值。
在这里,在 AutoCAD 命令行中键入 test
会导致 Hello World!
在命令行 window.
如果函数被定义为:
(defun test ( )
(princ "\nHello World!")
(princ)
)
在 AutoCAD 命令行中键入 test
会导致错误消息:
Command: test Unknown command "TEST". Press F1 for help.
对于要计算的函数,用户需要键入:(test)
。
考虑到这一点,LM:
的使用除了标识为我的库中的函数外没有其他意义,并且可以降低在同一命名空间中定义同名函数的可能性.
例如,如果我要定义一个函数,例如:
(defun AddLine ( pt1 pt2 )
(entmakex
(list
'(0 . "LINE")
(cons 10 pt1)
(cons 11 pt2)
)
)
)
鉴于此函数的通用命名和它执行的无处不在的操作(至少在涉及 AutoCAD 的地方),很可能在文档命名空间中定义了另一个具有相同名称的此类函数。
因此,当上面的 defun
表达式被求值时,现有函数将被重新定义,或者如果它自己的 defun
表达式稍后被求值,现有函数将重新定义上面的函数。
通过在函数名称前添加我自己的作者前缀 LM:
:
(defun LM:AddLine ( pt1 pt2 )
(entmakex
(list
'(0 . "LINE")
(cons 10 pt1)
(cons 11 pt2)
)
)
)
我正在帮助确保当我在文档命名空间中评估 LM:AddLine
时,我自己定义的这个函数将始终被使用,并且我可以 'contaminate' 定义的可能性较小另一个加载程序使用的函数。
同样,在函数名称中使用 ->
纯粹是一种命名约定,不赋予函数任何其他含义。
例如,我将我的函数命名为 LM:ss->vla
,因为它是一个标准函数 from my library,它将选择集(我缩写为 ss
)转换为列表VLA-对象。