首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >":“和"->”在AutoLISP的用法

":“和"->”在AutoLISP的用法
EN

Stack Overflow用户
提问于 2016-08-21 00:05:02
回答 2查看 1.4K关注 0票数 3
代码语言:javascript
复制
;;----------------=={ 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->"

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-22 06:19:44

这种类型的语法不是AutoLISP/Visual的构造。这是李·麦克的标准。我是这样理解的:

"LM:“实际上是指"Lee”的捷径;)

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

(LM:Ref->Def块)基于它的引用获取块定义。其中"LM:Ref->Def“只是函数的全名。"Ref“不是任何类型的变量,它是函数名称的一部分。

"LM: ss ->“并不意味着我们使用ss作为函数的参数,但是"LM:ss->vla”是函数的名称。

票数 4
EN

Stack Overflow用户

发布于 2018-02-13 19:38:47

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

例如:

代码语言:javascript
复制
(defun c:test ( )
    (princ "\nHello World!")
    (princ)
)

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

在这里,在test命令行中键入AutoCAD将导致在命令行窗口的新行上打印Hello World!

如果函数被定义为:

代码语言:javascript
复制
(defun test ( )
    (princ "\nHello World!")
    (princ)
)

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

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

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

考虑到这一点,使用LM:除了从我的库中识别函数之外没有其他意义,并且可以降低在同一个命名空间中定义相同名称的函数的可能性。

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

代码语言:javascript
复制
(defun AddLine ( pt1 pt2 )
    (entmakex
        (list
           '(0 . "LINE")
            (cons 10 pt1)
            (cons 11 pt2)
        )
    )
)

考虑到该函数的通用命名以及它所执行的无处不在的操作(至少在涉及AutoCAD的情况下),很可能会有另一个在文档名称空间中定义了相同名称的函数。

因此,当计算上述defun表达式时,将重新定义现有函数,或者,如果稍后计算其自己的defun表达式,则现有函数将重新定义上述函数。

通过在函数名前加上我自己的作者前缀LM:

代码语言:javascript
复制
(defun LM:AddLine ( pt1 pt2 )
    (entmakex
        (list
           '(0 . "LINE")
            (cons 10 pt1)
            (cons 11 pt2)
        )
    )
)

我正在帮助确保当我在文档名称空间中计算LM:AddLine时,我自己对这个函数的定义将始终被使用,并且我不太可能“污染”另一个加载程序使用的函数的定义。

类似地,函数名称中使用->纯粹是一种命名约定,对函数没有任何其他含义。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39059744

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档