2017-09-15 1 views
0

Ich habe AutoLISP/CAD schon eine Weile benutzt und möchte jetzt ein Etikett mit meinem Namen zu allen geöffneten Dateien hinzufügen. Ich habe es geschafft, über alle geöffneten Dateien zu iterieren, aber der Textbefehl läuft nur in der ersten Datei. Ich dachte, es wäre zu schnell, damit CAD richtig funktioniert, also habe ich Verzögerungen hinzugefügt, aber es hat nicht funktioniert. Ich habe alle geöffneten Dateien eingecheckt und die Variablen werden geteilt und synchronisiert. Der Text wird übrigens einmal pro geöffneter Datei hinzugefügt, aber nur in der ersten.Element zu allen geöffneten Dateien hinzufügen

Hier ist mein Code:

(defun c:labeling() 
    (vl-load-com) 
    (setq docs (vla-get-documents (vlax-get-acad-object))) 
    (setq top (vla-get-count docs)) 
    (setq p1 (list 10 -10))     
    (setq p2 (list 95 -15)) 
    (setq p3 (list 12 -14)) 
    (setq c 0) 
    (vl-propagate 'docs) 
    (vl-propagate 'top) 
    (vl-propagate 'p1) 
    (vl-propagate 'p2) 
    (vl-propagate 'p3) 
    (vl-propagate 'c) 
    (while (< c top) 
    (vla-activate (vla-item docs c)) 
    (command "_rectang" p1 p2) 
    (command "delay" 500) 
    (command "_text" p3 "3" 0 "My name - year" "" nil) 
    ;(print c) 
    (setq c (+ c 1)) 
    (vl-propagate 'c) 
    (command "delay" 1000) 
    ) 
) 

Antwort

0

Es ist ein bisschen in so kurzer Zeit habe ich zu erklären, kompliziert, aber: Jeder drawig hat seinen eigenen „Namensraum“ wahrscheinlich es ist falsche Wort, aber macht nichts. Wenn Sie den Befehl ausführen, wird er nur in der aktiven Zeichnung ausgeführt, aber wenn Sie die aktive Zeichnung ändern, haben Sie die aktive Lisp-Routine verloren. Es ist also nicht genug, um das Zeichnen zu aktivieren. Besserer Weg ist, zu zeichnen, indem man Modellobjekt manipuliert. zum Beispiel wie folgt aus:

(defun c:labeling() 
    (vl-load-com) 
    (setq docs (vla-get-documents (vlax-get-acad-object))) 
    (setq top (vla-get-count docs)) 
    (setq p1 (list 10 -10)) 
    (setq p2 (list 95 -15)) 
    (setq p3 (list 12 -14)) 
    (setq c 0) 
    (vlax-for ThisDoc docs 
    (setq Space (vlax-get-property ThisDoc 'ModelSpace)) 
    (Rectangle Space p1 p2) 
    (setq txt (vlax-invoke-method Space 'AddText "My name - year" (vlax-3d-point p3) 3 )) 
    (setq c (+ c 1)) 
    ) 
) 


(defun Rectangle (Space P1 P2/lpts pts poly) 
    (setq lpts (append p1 (list 0) (list (car p1) (cadr p2) 0) p2 (list 0) (list (car P2) (cadr p1) 0))) 
    (setq pts (L2v lpts vlax-vbDouble)) 
    (setq poly(vlax-invoke-method Space 'AddPolyline pts)) 
    (vlax-put-property poly 'Closed :vlax-true) 
    poly 
) 

(defun L2v(lista typ/NObj SelObjArray iCount iList SelObjArrayVar) 
    ;| 
    vlax-vbInteger (2)  Integer 
    vlax-vbLong (3)   Long integer 
    vlax-vbSingle (4)  Single-precision floating-point number 
    vlax-vbDouble (5)  Double-precision floating-point number 
    vlax-vbString (8)  String 
    vlax-vbBoolean (11)  Boolean 
    vlax-vbVariant (12)  Variant 
|; 

    (setq NObj (length lista) 
     SelObjArray (vlax-make-safearray typ (cons 0 (1- NObj))) 
     iCount 0) 
(repeat NObj  
(vlax-safearray-put-element SelObjArray iCount (nth iCount lista)) 
(setq iCount (1+ iCount)) 
) 
    (setq SelObjArrayVar (vlax-make-variant SelObjArray)) 
) 
+0

Es funktioniert anscheinend alles, was mit Befehl startet nicht in VLA-Skripte verwendet werden – RemedialGuns

+0

Ja, das ist wahr, aber gibt es nur kleine Anzahl von Befehlen, die von substituierten kann nicht sein VLA. Zusätzlich, wenn Sie VLA verwenden, können Sie leicht "Zeiger" zu erstellen Entität, die komplizierter ist, wenn Sie Befehle verwenden. –

Verwandte Themen