Добавить элемент во все открытые файлы

Я уже давно использую AutoLISP/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)
    )
  )

person RemedialGuns    schedule 15.09.2017    source источник


Ответы (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)
  (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))
)
person CAD Developer    schedule 18.09.2017
comment
Это работает, по-видимому, все, что начинается с команды, не может использоваться в сценариях vla. - person RemedialGuns; 19.09.2017
comment
Да, это правда, но есть лишь небольшое количество команд, которые не могут быть заменены VLA. Кроме того, когда вы используете VLA, вы можете легко получить указатель на созданный объект, что сложнее, когда вы используете команды. - person CAD Developer; 19.09.2017