使用":"和" - >"在AutoLISP中

时间:2016-08-21 00:05:02

标签: 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->"

谢谢。

2 个答案:

答案 0 :(得分:2)

这种语法不是AutoLISP / Visual LISP的构造。这是Lee Mac的标准。我这样理解:

" LM:"实际上意味着" Lee Mac" ;)

(LM:ss-> vla ss)将选择集中的切换数据类型切换为vla对象列表,其中选择集与所选元素列表类似,但定义为类型实体,而不是vla-object。也许得到(ssget)或(ssgetfirst)

(LM:Ref-> Def块)根据它的参考获得块定义。其中" LM:Ref-> Def"只是功能的全名。 "参考"不是任何变量,它是函数名称的一部分。

" LM:SS->"并不意味着我们使用ss定义为函数的参数,但是" LM:ss-> vla"是功能名称。

答案 1 :(得分:0)

在AutoLISP中定义函数时,在结果函数上赋予替代行为的唯一命名约定是前缀c:

例如:

(defun c:test ( )
    (princ "\nHello World!")
    (princ)
)

在函数名中使用c:前缀意味着可以直接在AutoCAD命令行中将该函数计算为命令。

在此处,在AutoCAD命令行键入test会导致Hello World!在命令行窗口中的新行上打印。

如果该功能被定义为:

(defun test ( )
    (princ "\nHello World!")
    (princ)
)

在AutoCAD命令行键入test将导致错误消息:

Command: test Unknown command "TEST". Press F1 for help.

对于要评估的函数,用户需要输入:(test)

考虑到这一点,使用LM:除了识别作为我的库中的函数之外没有其他含义,并且降低了在同一名称空间中定义同名函数的概率。 / p>

例如,如果我要定义一个函数,例如:

(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时,我将始终使用我自己对此函数的定义,并且我可能会污染'另一个加载程序使用的函数的定义。

类似地,在函数名中使用->纯粹是一种命名约定,并且不赋予函数任何其他含义。

例如,我已将我的函数命名为LM:ss->vla,因为它是一个标准函数from my library,它将一个选择集(我将其缩写ss)转换为一个列表VLA-对象。