Civil 3d

Hoje, finalmente vou postar alguma coisa para o civil 3d!!! é o seguinte: quando vamos definir uma superfície, temos pontos, linhas, etc, certo? algumas dessas linhas são de certo modo "obrigatórias" pois ela definem algumas características da triangulação da mesma.... exemplo: linhas que representam estradas, taludes... quem usa o software "Posição" da Manfra sabe do que eu estou falando... no civil 3d também podemos ter tais linhas, mas elas precisam necessariamente estar em 3d...
mais...
Mas nem sempre estão... depois de descarregar os dados da estação total e inserirmos os pontos no civil 3d, vamos "ligando os pontos" (sim, tenho algo pra isso já...) para formar o desenho... por um mutivo qualquer, desenhamos tudo com PLINE, que não é 3d, mas sim 2d (mesmo que ela tem o elevation diferente de 0), o que impossibilita de usar como "breakline" da superfície, já que todos os vértices dela estão na mesma elevação... o que fazer? redesenhar elas com 3dpoly...

Obs: esta é a minha experiência com este programa, se alguem souber de uma forma melhor, estou interessadíssimo em saber!!!!

bom, o que o programinha abaixo faz isso, ele analiza as coordenadas X,Y da pline, procura pontos do CIVIL 3D que tenham as coordenadas X,Y requeridas e usa a coordenada Z deste ponto para construir a 3dpoly... possibilitando assim o uso destas como breakline, bom vamos lá, a primeira coisa é obter a "collection" dos pontos do civil:

(setq acadapp  (vlax-get-acad-object)
                 aec-app  (vla-GetInterfaceObject acadapp "AeccXUiLand.AeccApplication")
                 aec-adoc (vla-get-activedocument aec-app)
                 aec-db   (vla-get-database aec-adoc)
                 aec-pts  (vlax-get-property aec-db "points"))

Isso aí acima é coloco numa subrotina, que fará parte de um projeto de rotina VLX, ok? por isso não tem defun nem nada... outra hora eu explico isso...

agora vamos a rotina:
(defun c:2dto3d  (/ ss lst lsc ent pts flag a erro)
  (
tbn:error-init (list (list "cmdecho" 0) t))
  (
setq ss   (ssget '((0 . "LWPOLYLINE")))
        lst  nil
        lsc  nil
        flag (initget "S N" 0)
        flag (getkword
               "\nApagar as entidades convertidas? [Sim, Não] ")
        flag (= "S"
                (if flag
                  flag

                  "S")))
  (
vlax-map-collection
    aec-pts ;********vide o código acima************
    '(lambda (x)
       (
setq lst (cons (list (vlax-get-property x "Easting")
                             (
vlax-get-property x "Northing"))
                       lst))))
  (
vlax-map-collection
    aec-pts
    '(lambda (x)
       (
setq lsc (cons (list (vlax-get-property x "Elevation")) lsc))))
  (
repeat (if ss
            (sslength ss)
            0)
    (
setq ent  (ssname ss 0)
          erro nil
          pts  (apply 'append
                      (mapcar
                        '(lambda (pt / tmp)
                           (
foreach a  lst
                             (if (equal a pt 0.5)
                               (
setq tmp a)))
                           (
if tmp
                             (append pt (nth (vl-position tmp lst) lsc))
                             (
setq erro (cons pt erro))))
                        (
get-points-polig ent))))

    (
if erro
      (progn
        (remake-ent ent 62 1)
        (
foreach a  erro
          (entmake (list '(0 . "CIRCLE")
                         '(8 . "ERRO_3d_Poly")
                         (
cons 10 a)
                         '(40 . 1)))))
      (
progn
        (setq linha
               (vla-Add3Dpoly
                 (get-activespace)
                 (
vlax-safearray-fill
                   (vlax-make-safearray
                     vlax-vbdouble

                     (cons 0 (1- (length pts))))
                   pts)))
        (
vla-put-layer linha (dxf 8 ent))
        (
vla-put-color linha 2)
        (
if flag
          (entdel ent))))
    (
grtext -2 (itoa (sslength ss)))
    (
ssdel ent ss))
  (
tbn:error-restore ))


é isso... o programa vai pedir se você desenha apagar as linhas antigas e tentará desenhar novas linhas 3d pelas coordenadas obtidas, se a linha for desenhada, ela aparecerá no mesmo layer que estava a linha original, mas estará em AMARELO, ja para as linhas que ela não conseguir desenhar, a linha original terá sua cor alterada para VERMELHO e ainda terá o(s) vértice(s) coordenadas não encontradas nos pontos do civil marcados com um CÍRCULO no layer "ERRO_3d_Poly" para que você possa analizar o que fazer (inserir um ponto, mudar o vértice...)

Um comentário:

  1. Olá Neyton, vc tem alguma apostila, em português, do Civel 3D?

    Um a migo meu me pediu para arranjar, mas não encontrei nenhum pelo Google.

    PS: Gostei muito do seu Blog, já até adicionei aos meu favoritos! Parabéns.

    _____________
    Marcus Malzer

    ResponderExcluir