VPFREEZE

Então, pra variar um pouco, um´programa para se trabalhar com viewports. è o seguinte, você cria a viewport, congela alguns layers nela com o vpfreeze e tal... depois inventa que precisa o mesmo "estado" dos layers numa outra viewport, ou em "trocentas" delas em outros layouts, bem, como saber quais layers estão congelados? simples, basta pegar os dxf 330 da ELIST da viewport, hehehe... complicou né, certo... faz assim:
mais...
(defun c:svpstate (/ view)
  (
tbn:error-init nil)
  (
if (setq view (ssget ":S" '((0 . "VIEWPORT"))))
    (
setq svpstate:frzc (vl-remove nil
                          (mapcar '(lambda (l)
                                     (
if (= 331 (car l))
                                       (
dxf 2 (cdr l))))
                                  (
entget (ssname view 0))))))
  (
tbn:error-restore))


(
defun c:lvpstate (/ ss)
  (
tbn:error-init nil)
  (
if svpstate:frzc
    (progn
      (prompt "\nSeleciona as viewports onde aplicar o layer_state")
      (
if (setq ss (ssget '((0 . "VIEWPORT"))))
    (
progn
          (vla-put-mspace thisdrawing :vlax-true)
      (
repeat (sslength ss)
        (
setq ent (ssname ss 0))
        (
vla-put-ActivePViewport thisdrawing (vlax-ename->vla-object ent))
        (
command "vplayer" "thaw" "*" "" ""
             "vplayer" "freeze"

             (vl-string-right-trim ","
                       (apply 'strcat (mapcar '(lambda (x) (strcat x ",")) svpstate:frzc)) ) "" "")
        (
ssdel ent ss))))))
  (
tbn:error-restore))


Link(s) da(s) subrotina(s) usada(s):
tbn:error-init, dxf, tbn:error-restore, thisdrawing

É pra ser usado assim: crie a viewport da maneira que lhe convém, use o comando svpstate, ele irá criar uma lista dos layers congelados nesta viewport. Depois, selecione as viewports onde ele irá congelar os mesmos layers e use o comando lvpstate, pronto...
Obs: o primeiro comando cria uma variável global chamada "svpstate:frzc", se você recuperar o seu conteúdo, verá que é uma lista com os nomes dos layers

3 comentários:

  1. Eu queria criar um layer que ele já viesse congelado na view. Não estou conseguindo. Não sei qual código dxf para usar o entmake ou criar pelo _layer make-up. Consegue ajudar?

    ResponderExcluir
  2. Eu queria criar um layer que ele já viesse congelado na view. Não estou conseguindo. Não sei qual código dxf para usar o entmake ou criar pelo _layer make-up. Consegue ajudar?

    ResponderExcluir
  3. Veja, para congelar um layer numa viewport, acesse a XDATA "ACAD" da viewport e adicione o seu layer na lista e reinsira a XDATA na viewport
    A lisp abaixo faz isso. ( vpfreeze vlaObjectViewport '( "nomeLayerCongelar1" "nomeLayerCongelar2" ) )

    (setq acadapp (vlax-get-acad-object)
    thisdrawing (vla-get-activedocument acadapp))



    (defun expandlist (el qtd / lst)
    (repeat qtd (setq lst (cons el lst))))


    (defun vpfreeze (vp lays / typ val L)
    (foreach l lays
    (if (not (tblsearch "layer" l )) (vla-add (vla-get-layers thisdrawing) L))
    )
    (vla-getXdata vp "ACAD" 'typ 'val)
    (setq typ (reverse
    (cons
    1002
    (cons 1002
    (append (expandlist 1003 (length lays))
    (cddr (reverse (vlax-safearray->list typ)))))))
    val (reverse
    (cons (vlax-make-variant "}")
    (cons (vlax-make-variant "}")
    (append
    (mapcar 'vlax-make-variant lays)
    (cddr (reverse (vlax-safearray->list val))))))))

    (vla-setXData vp
    (vlax-safearray-fill
    (vlax-make-safearray
    vlax-vbInteger (cons 0 (1- (length typ)))) typ)
    (vlax-safearray-fill
    (vlax-make-safearray vlax-vbVariant (cons 0 (1- (length val))))
    val))
    ;; this is needed to display the change
    (vla-display vp :vlax-false)
    (vla-display vp :vlax-true)
    )


    ResponderExcluir