2dto3d

Ah!!! então aquele perverso do seu estagiário conectou os pontos do civil 3d em 2d????? putaqueopariu!!! Dá um esporro nele, depois mostra pra ele o programinha ver a bagaça
;converte polilinhas 2d para 3d, baseado em vertices do c3d
(defun c:2dto3d (/ ss lst lsc this ent vla pts flag erro)
;controle de erro
(tbn:error-init '(nil (end-status)))
;se seleciona polilinhas:
(if (setq ss (ssget '((0 . "*POLYLINE,LINE"))))
(
progn
;pergunta se quer apagar as plines depois de fazer as 3dpoly
(Setq flag (initget "S N" 0)
this (get-activespace)
flag (getkword "\nApagar as entidades convertidas? [Sim, Não] ")
flag (= "S" (if flag flag "S")))
;munta uma lista com as coordenadas dos pontos do c3d:
(vlax-for x (cvlp-get-points aec-db)
(
setq lst (cons (list (cvlp-get-Easting x)(cvlp-get-Northing x)) lst)
lsc (cons (cvlp-get-Elevation x) lsc)))
;inicia a barra de progresso:
(init-status (sslength ss) "processando...")
;looping em todas as entidades
(repeat (sslength ss)
(
setq ent (ssname ss 0)
vla (vlax-ename->vla-object ent)
erro nil
;escaneia cada vertice da polilinha na lista de pontos do c3d,
; para achar um ponto x,y parecido para pegar seu Z
pts (mapcar '(lambda (pt / tmp d1 d n)
(
Setq d 1e30
n -1
tmp nil)
;procurando o ponto c3d mais proximo:
(foreach a lst
(Setq d1 (distance a pt)
n (1+ n))
(
if (and (< d1 d) (< d1 0.2))
(
setq d d1 tmp n)))
;se encontrou, armazena, senão é um ponto de erro:
(if tmp
(list (car pt) (cadr pt) (nth tmp lsc))
(
setq erro (cons pt erro))))
;pontos 2d da polilinha:
(get-points-polig ent)))
;achou vertices que nao possuem pontos c3d proximos?
(if erro
(progn
;faz a linha ficar vermelha:
(vla-put-color vla 1)
;desenha circulos no vertices com erro:
(foreach a erro
(entmake (list '(0 . "CIRCLE")
'(8 . "ERRO_3d_Poly")
(
cons 10 a)
'(40 . 1)))))
(
progn
;senao, desenha uma polilinha 3d:
(setq linha (vla-Add3Dpoly this
(lst2array (apply 'append pts) vlax-vbDouble)))
;coloca no mesmo layer
(vla-put-layer linha (vla-get-layer vla))
;e faz ficar verde
(vla-put-color linha 3)
;a polilinha era fechada?
(if (vlax-property-available-p vla "closed")
(
vla-put-closed linha (vla-get-closed vla)))
(
if flag (entdel ent))))
;incrementa a barra de status
(ssdel ent ss)
(
show-status))
(
end-status)))
;restaura o controle de erro
(tbn:error-restore))


Link(s) da(s) subrotina(s) usada(s):
tbn:error-init, get-activespace, get-points-polig, lst2array, tbn:error-restore

Aí você usa assim (depois que você copiar as outras sub-rotinas necessárias!!!!): digita 2dto3d na linha de comando, o programa espera que você selecione polilinhas, aí ele pede se você quer apagá-las após cirar as 3dpoly, voce decide.
O programa irá então procurar em cada vértice das linhas selecionadas, pontos do civil 3d, e usará a coordenada Z do ponto encontrado, para formar a 3dpoly. as 3dpoly serão desenhadas no mesmo layer da linha original, e será colocada a cor verde nela, indicando que deu certo, caso não de certo, o programa coloca a linha original na cor vermelha e desenha circulos nos vértices com problema, para que você decida o que fazer com ela....

Editado 22/07/2008:
Tá eu sei que é um saco clicar todas as subrotinas, então tá aí, fiz até um dcl pra ela:

Experimente!!
Dá pra configurar as cores, o erro, se quer apagar as linhas anteriores...
download!!!

Um comentário:

  1. Marcelo Rocha19/11/09 18:13

    Desculpe minha ignorancia no assunto, mas nao conseguir fazer funcionar

    ResponderExcluir