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!!
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
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