Multiplos ProfileViews


Uma rotina para o civil 3d!!
Então, no civil 3d 2008 tem esta funcionalidade (ver imagem), mas no 2007 não tem... e muitas vezes o profileview fica enorme e é necessário subdividir ele para caber na prancha... como eu disse no 2008 tem isso é bem legal, mas no 2007... em fim, bolei um esquema parecido com o 2008, mas prerferi deixar a cargo do usuário definir os limites de cada profileview. Funciona assim: você cria uma View do alinhamento inteiro (fica enorme eu sei), configura nele tudo o que você quer que apareça, tal como as bandset, perfis que deverão aparecer etc... aí cria retângulos (com o comando rectangle mesmo) em cima que servirão de limitadores para os diversos profileviews que serão criados. Assim, pode-se defini-los com diversos tamanhos inclusive com superposições, de modo a acomodar da melhor forma e de maneira mais rápida que fazer um a um. Em seguida, é rodar a rotina e pronto... dependendo da velocidade da sua máquina pode demorar um pouco... no meu p4 ht de 3.06GB levou 10 minutos para criar 53 profileviews... na mão levei uns 10 para cada um, hehehe, então clica aí pra ver!!
a rotina...
(defun c:createmview (/ view ElevationMin VerticalScale StationStart StationEnd Name
                 minx miny pie psd minxl minyl maxxl maxyl prof ent ss
)

;inicia o controle de erros:
  (tbn:error-init nil)
  
  (
prompt "\Nselecione o profileview modelo")
  (
if (setq view (ssget ":S" '((0 . "AECC_PROFILE_VIEW"))))
    (
if (progn
      (prompt "\nSelecione as polilinhas limitadoras")
      (
setq ss (ssget '((0 . "LWPOLYLINE")))))
    (
progn
;calcula os limites do profileview "pai":
      (setq view          (vlax-ename->vla-object (ssname view 0))
        ElevationMin  (vlax-get-property view "ElevationMin")
        VerticalScale (vlax-get-property view "VerticalScale")
        StationStart  (vlax-get-property view "StationStart")
        StationEnd    (vlax-get-property view "StationEnd"))
      

;calcula a origem do gráfico:
      (vlax-invoke-method view "FindXYAtStationAndElevation" StationStart ElevationMin 'minx 'miny)
      (
setq origin (vlax-3d-point minx miny 0))

;cria os profileview "filhos":
      (repeat (sslength ss)
    (
setq ent    (ssname ss 0)
          prof   (vla-copy view)) ;clona o "pai"
;limites da polilinha:
    (vla-GetBoundingBox (vlax-ename->vla-object ent) 'pie 'psd)
    

;move o clone para o canto inferior esquerdo da polilinha:
    (vla-move prof origin pie)
    

;calcula os limites da polilinha:
    (setq minxl (vlax-safearray-get-element pie 0)
          minyl (vlax-safearray-get-element pie 1)
          maxxl (vlax-safearray-get-element psd 0)
          maxyl (vlax-safearray-get-element psd 1))

;redimensiona o clone ("filho") para os limites da polilinha:
    (mapcar '(lambda (pm pv) (vlax-put-property prof pm pv))
        '("StationLocked"   ;setar em 1 para aceitar os limites abaixo
          "ElevationLocked" ;idem
          "ElevationMin"    ;limites do profileview "filho"
          "ElevationMax"
          "StationStart"
          "StationEnd"
 )
        (
list
          1
          1
          (+ ElevationMin (/ (- minyl miny) VerticalScale))
          (
+ ElevationMin (/ (- maxyl miny) VerticalScale))
          (
+ StationStart (- minxl minx))
          (
+ StationStart (- maxxl minx))))

;libera a memoria ( precisa disso mesmo? )
    (vlax-release-object prof)

;next
    (ssdel ent ss))

;libera a memoria ( precisa disso mesmo? )
      (vlax-release-object view)
      )))


;reestabelece o cntrole de erros do cad:
  (tbn:error-restore)
)


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

2 comentários:

  1. Caro neyton
    Achei utimas algumas postagens aqui, e uso algumas dicas...mas sobre o profileviews. prefiro mesmo é criar Named View,
    simples crio um retangulo e no e estipulo o tamanho que vai ficar nele, tudo em escala ...

    no layout crio o viewport da mesma proporção, dou named view escolho a view que criei dou set current....seleciono o viewport e pronto....simples e muito bom, sempre que mudar seu projeto já esta amarrado a suas viewports

    ResponderExcluir
  2. entendo, a ideia é pra ser aplicada no civil 3d 2007 quando a altura do perfil é muito grande, e vc precisa representar ele em escalas grandes, onde o tamanho da folha nao possibilitasse mostrar todo o perfil...

    no civil 3d 2008 é possivel criar um unico profileview com "quebras" em estacas, onde sepode colocar datums diferenciados... limitando assim a altura do quadriculado para que possa caber em um determinado papel, independente da escala... que é o que normalmente se faz: quebrar o perfil... até porque as informaçõess de texto se "indireitam" sozinhas usando as quebras do civil 3d 2008

    ResponderExcluir