2017-09-15 15 views
0

私はしばらくAutoLISP/CADを使っていましたが、今開いているすべてのファイルに自分の名前のラベルを追加したいと思います。私はすべての開いているファイルを繰り返し処理することができましたが、テキストコマンドは最初のファイルでのみ実行されます。 CADが正しく機能するには速すぎると思ったので、遅れを追加しましたが、うまくいきませんでした。開いているすべてのファイルをチェックインし、変数が共有され、同期されています。ちなみに、テキストは開いたファイルごとに1回追加されますが、最初のテキストにのみ追加されます。ここですべての開いているファイルに要素を追加する

は私のコードです:

(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を使用すると、作成したエンティティに "ポインタ"を簡単に取得できます。これは、コマンドを使用すると複雑になります。 –

関連する問題