2017-09-15 15 views
0

저는 잠시 동안 AutoLISP/CAD를 사용해 왔는데, 이제 열려있는 모든 파일에 내 이름의 레이블을 추가하고 싶습니다. 열려있는 모든 파일을 반복 처리했지만 텍스트 명령은 첫 번째 파일에서만 실행됩니다. CAD가 제대로 작동하는 것이 너무 빠르다고 생각하여 지연을 추가했지만 작동하지 않았습니다. 열려있는 모든 파일을 검사했고 변수가 공유되고 동기화되었습니다. 그런데 텍스트는 열린 파일 당 한 번만 추가되지만 첫 번째 파일에는 한 번만 추가됩니다.열려있는 모든 파일에 요소를 추가하십시오.

(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) 
    ) 
) 

답변

0

그것은 내가 가진 그런 짧은 시간에 설명하기 복잡 약간의 :하지만 각 drawig 자신의 "네임 스페이스"아마 잘못된 단어,하지만 신경 끄시 고있다

여기 내 코드입니다. 명령을 실행하면 활성 도면에서만 실행되지만 활성 도면을 변경하면 활성 lisp 루틴이 손실됩니다. 그리기 활성화가 충분하지 않습니다. 더 나은 방법은 모델 객체를 조작하여 그리는 것입니다. 이 같은 예를 들어 :

(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

그것은 명령으로 시작 VLA 스크립트를 사용할 수 없습니다 분명히 아무것도 작동 – RemedialGuns

+0

로 치환 할 수없는 명령의 적은 수의 예 즉, 사실이지만이 VLA. 추가적으로, VLA를 사용하면 생성 된 엔티티에 "포인터"를 쉽게 가져올 수 있습니다. 이는 명령을 사용할 때 더 복잡합니다. –