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

Altitudes no Google Earth

Então, uns testes que estou fazendo aqui, se bem que até agora, obtive umas elevações bem "variadas" por assim dizer... O caso é o seguinte: a rotina a seguir deveria servir para isso: dadas as coordenadas geográficas de um ponto, ela abre o google earth e "pergunta" a ele qual a elevação do ponto na coordenada informada.. bom, deveria ser assim, mas até agora não encontrei uma confiável de de certificar-me que a imagem "estabilizou" na tela, para aí sim, "perguntar" a cota... se ela não estabiliza, o terreno não informa a cota corretamente, e o google earth não está sendo "modal" nos métodos que usei nele.. aos que pensarem que isso se deve a estar programado em lisp, digo que não tem nada a ver... faz o teste, rode a rotina para as coordenadas Lat: -21 e Lon:-48 por exemplo... põe o globo em movimento e rode a rotina pelo console... ela deverá informar cotas estranhas... e se deixar a imagem estabilizar nesta coordenada, ele passa a informar sempre o mesmo valor.. em fim... se estabilizar funciona!!!
imagine as utilidades!! para um anteprojeto de estradas por exemplo, já é um começo se você não tem topografia alguma, hehehe, eu mesmo estou usando este esquema até a topografia ser concluída, aliás, até o geométrico preliminar foi feito no google earth e exportado para o cad com o expge. Se alguém quiser contribuir no desenvolvimento, ou tiver alguma dica, manda aí!!!
mais...
;inicializa o google earth:
(defun getools:init ()
  (
if (setq ge:app (vlax-get-or-create-object "GoogleEarth.ApplicationGE")
        kh:app (vlax-get-or-create-object "Keyhole.khInterface"))
    (
progn
      (while (/= 1 (vlax-invoke-method ge:app "isinitialized")))
      (
while (/= 1 (vlax-invoke-method ge:app "isonline")))
      

      t)
    ))


;calcula a elevação de um ponto na superficie do globo:
(defun getools:elevation-from-pt (lon lat / PointOnTerrain)
  (
if (not kh:app)  (getools:init))
  (
vlax-invoke-method kh:app "setViewParams" lat lon 1000 0 0 5 5)
  (
setq PointOnTerrain nil)
  (
setvar "cmdecho" 0)
  (
while (/= PointOnTerrain
         (setq PointOnTerrain
            (caddr
              (vlax-safearray->list
            (vlax-invoke-method
              kh:app
              "GetPointOnTerrainFromScreenCoords"
              0 0)))))
    (
command "delay" 500))
  (
setvar "cmdecho" 1)
  PointOnTerrain)

;libera a memória:
(defun getools:restore ()
  (
if (equal 'vla-object (type ge:app)) (vlax-release-object ge:app))
  (
if (equal 'vla-object (type kh:app)) (vlax-release-object kh:app))
  (
setq ge:app nil kh:app nil))
Para usar é simples:
(getools:init)
(getools:elevation-from-pt lon lat)
(getools:restore)
onde lat e lon são as coordenadas geográficas do ponto, por exemplo
Lon = -48.5 ( 48º30' Oeste )
Lat = -21 ( 21º00' Sul )

Publicidade: interneyshop