Использование : и -› в 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->"?

Спасибо.


person Eae    schedule 21.08.2016    source источник


Ответы (2)


Этот тип синтаксиса не является конструкцией AutoLISP/Visual LISP. это стандарт Ли Мака. Я понимаю это так:

«LM:» на самом деле означает сокращение от «Lee Mac»;)

(LM:ss->vla ss) звук переключает тип данных из набора выбора в список объектов vla, где набор выбора похож на список выбранных элементов, но определяется как сущность типа, а не объект vla. Может быть, пройти (ssget) или (ssgetfirst)

(LM:Ref->Def block) получить определение блока на основе его ссылки. где "LM:Ref->Def" - это только полное имя функции. «Ref» — это не какая-либо переменная, это часть имени функции.

«LM:ss->» не означает, что мы используем ss, определенный как параметр функции, но «LM:ss->vla» — это имя функции.

person CAD Developer    schedule 22.08.2016
comment
Я наконец понял, посмотрев на название функции, которая включает в себя -›. Так что я думаю, что может быть =› как часть LISP, но не реальный -›, который является соглашением Ли Мака. - person Eae; 22.08.2016

При определении функции в AutoLISP единственным соглашением об именах, которое придает альтернативное поведение результирующей функции, является префикс c:.

Например:

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

Использование префикса c: в имени функции означает, что функция может быть оценена как команда непосредственно в командной строке AutoCAD.

Здесь ввод test в командной строке AutoCAD приведет к тому, что Hello World! будет напечатано в новой строке в окне командной строки.

Если бы вместо этого функция была определена как:

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

Ввод test в командной строке AutoCAD приведет к появлению сообщения об ошибке:

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 в пространстве имен документов всегда будет использоваться мое собственное определение этой функции, и будет меньше шансов, что я могу «загрязнить» определение функции, используемой другой загруженной программой.


Точно так же использование -> в имени функции является чисто соглашением об именах и не придает функции никакого другого значения.

Например, я назвал свою функцию LM:ss->vla, потому что это стандартная функция из моей библиотеки, которая преобразует набор выбора (который я сократил ss) до списка объектов VLA.

person Lee Mac    schedule 13.02.2018