2016-08-21 1 views
1
;;----------------=={ 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) 

Dies ist das erste Mal, dass ich diese Art von Syntax in AutoLISP verwendet habe.Die Verwendung von ":" und "->" in AutoLISP

Ich versuche zu verstehen, was "LM:" eigentlich bedeutet.

Die Verwendung von "Ref->" ist auch eine Frage an mich. "Ref" scheint nicht definiert zu sein, so scheint es, dass es irgendwie Teil des Systems sein muss, obwohl ich keine Dokumentation entnehmen konnte, die eine solche Verwendung von "Ref->" beschreibt.

Warum wird auf die lokale Variable ss mit "LM:ss->" zugegriffen?

Vielen Dank.

Antwort

2

Diese Art von Syntax ist keine Konstruktion von AutoLISP/Visual LISP. Es ist Lee Macs Standard. Ich verstehe es auf diese Weise:

"LM:" bedeutet eigentlich Abkürzung von "Lee Mac";)

(LM: ss-> VLA ss) shound wechselt Datentyp von der Auswahl zur Liste der VLA-Objekte festgelegt wobei Auswahlmenge etwas ist, das der Liste ausgewählter Elemente ähnelt, aber als Typentität definiert ist, nicht als vla-Objekt. Vielleicht durch (ssget) oder (ssgetfirst)

(LM: Ref-> Def Block) bekommen Blockdefinition basierend auf seiner Referenz. wobei "LM: Ref-> Def" nur der vollständige Name der Funktion ist. "Ref" ist keine Art von Variable, es ist Teil des Funktionsnamens.

"LM: ss->" bedeutet nicht, dass wir ss als Parameter der Funktion definiert haben, aber "LM: ss-> vla" ist der Name der Funktion.

+0

Ich verstand endlich nach dem Blick auf den Namen der Funktion, die "->" enthält. Also denke ich, dass es ein "=>" als Teil von LISP geben kann, aber kein tatsächliches "->", was eine Lee Mac Konvention ist. – Giuseppe

0

Wenn eine Funktion in AutoLISP- definiert, wobei die einzige Namenskonvention, die auf die sich ergebende Funktion ein alternatives Verhalten verleiht, ist das Präfix c:

Zum Beispiel:

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

Die Verwendung des c: prefix Im Funktionsnamen bedeutet dies, dass die Funktion direkt in der AutoCAD-Befehlszeile als Befehl ausgewertet werden kann.

Hier würde die Eingabe von test in der AutoCAD-Befehlszeile dazu führen, dass Hello World! in einer neuen Zeile im Befehlszeilenfenster gedruckt wird.

Wenn die Funktion anstelle wie folgt definiert:

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

test in der Befehlszeile AutoCAD Typing in der Fehlermeldung führen würde:

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

Für die Funktion ausgewertet werden, Der Benutzer müsste stattdessen eingeben: (test).


Vor diesem Hintergrund hat die Verwendung von LM: keine anderen Bedeutung als Identifikation als Funktion von meiner Bibliothek, und die Wahrscheinlichkeit zu verringern, dass eine Funktion mit dem gleichen Namen wird im gleichen Namensraum definiert werden.

Zum Beispiel, wenn ich eine Funktion wie definieren bin:

(defun AddLine (pt1 pt2) 
    (entmakex 
     (list 
      '(0 . "LINE") 
      (cons 10 pt1) 
      (cons 11 pt2) 
     ) 
    ) 
) 

Aufgrund der generischen Benennung dieser Funktion und allgegenwärtiger Operation, die es (zumindest dort, wo AutoCAD betroffen ist) führt, kann es durchaus sein, eine weitere solche Funktion mit demselben Namen, der im Dokumenten-Namespace definiert ist.

Folglich würde die vorhandene Funktion neu definiert werden, wenn der obige Ausdruck defun ausgewertet wird, oder die vorhandene Funktion würde die obige Funktion neu definieren, wenn ihr eigener defun Ausdruck später ausgewertet würde.

die Funktionsnamen mit meinem eigenen Autor Präfix von prefixing LM::

(defun LM:AddLine (pt1 pt2) 
    (entmakex 
     (list 
      '(0 . "LINE") 
      (cons 10 pt1) 
      (cons 11 pt2) 
     ) 
    ) 
) 

mir helfen werde, um sicherzustellen, dass, wenn ich LM:AddLine im Document-Namespace, meine eigene Definition dieser Funktion bewerten wird immer dann verwendet werden, und Es gibt weniger Chancen, dass ich die Definition einer Funktion, die von einem anderen geladenen Programm verwendet wird, "kontaminieren" könnte.


Auch der Einsatz von -> innerhalb des Funktionsnamens ist eine reine Namenskonvention und verleiht keine andere Bedeutung für die Funktion.

Zum Beispiel habe ich meine Funktion LM:ss->vla genannt, weil es sich um eine Standardfunktion ist from my library, die einen Auswahlsatz verwandelt sich in eine Liste von VLA-Objekte (die ich ss abgekürzt habe).

Verwandte Themen