Então, vamos escrever um programinha para resolver um pequeno problema:
Adicionar vértices em uma polilinha para que esta passe por Cogo Points do Civil 3D
Primeiro vamos ver como era a polilinha antes de processar:
Agora como ela ficará após processar:
Percebe a diferença?
Agora a polilinha passa pelos Cogo Points do Civil 3D
Utilidade disso???
Bem, imagine que você precise ligar os pontos de um eixo de estrada com 3 mil pontos…
Faz uma polilinha com muito menos que isso, passando pela “média” desses pontos e roda a lisp….
Seja criativo!!!!
Antes, vamos ver a receita do bolo:
- Pedir a seleção dos Cogo Points
- Pedir a seleção da polilinha
- Pedir uma distância de referência, para testar se o ponto é válido
- Em cada ponto, fazer:
- Obter a coordenada do cogo point
- Se a distância do ponto em relação à polilinha for maior que a distância pedida, pula pro próximo ponto
- Calcular a posição relativa do ponto na polilinha
- Armazenar esta posição e a coordenada do cogo point
- Ordenar os pontos da lista que foi obtida no looping acima
- Redefinir os vértices da polilinha, usando estes pontos
- Enfeitar o programinha
- Curtir o blog do neyton!!!!
Bem simples né?
Agora o código:
;|ADDVERTPL
procura nos cogopoints selecionados os que poderão fazer parte da
lista de vertices de uma polilinha 2d e adiciona vertices a esta pl
autor:
neyton luiz dalle molle
engenheiro civil
neyton@yahoo.com
https://tbn2.blogspot.com
licença de uso: free, mas mantenha os créditos.
|;
;liga as funções VL*
(vl-load-com)
;define uma nova função:
(DEFUN C:ADDVERTPL (/ SS PL LST ent vla pt pproj dist)
;controle de erros e undo e redo
;veja https://tbn2.blogspot.com para habilitar esta subrotina
;(tbn:error-init nil)
;pede a seleção de cogo points
(SETQ SS (SSGET ‘((0 . “AECC_COGO_POINT”))))
;pede a seleção de uma polilinha 2d
(SETQ PL (vlax-ename->vla-object (CAR (ENTSEL “nSelecione a polilinha”))))
;pede a distancia de busca
(setq dist (getdist “nQual a distancia de busca <2>”)
dist (if dist dist 2))
;cria uma lista de coordenadas ((param (coordx cordy)) …)
(SETQ LST NIL)
(REPEAT (SSLENGTH SS)
(SETQ ;pega o primeiro ponto
ENT (SSNAME SS 0)
VLA (vlax-ename->vla-object ENT)
;calcula suas coordenadas
PT (LIST (vlax-get-property VLA “easting”)
(vlax-get-property VLA “northing”))
;projeta o ponto na polilinha, usando p plano xy como referencia
pproj (VLAX-CURVE-GETCLOSESTPOINTTOPROJECTION PL PT ‘(0 0 1)))
;se a distancia do ponto projetado ao cogopoint for menor que uma distancia
(IF (< (DISTANCE PT pproj) dist)
(SETQ LST (CONS (LIST (VLAX-CURVE-GETPARAMATPOINT PL pproj)
PT)
LST)))
;passa pro proximo cogopoint
(SSDEL ENT SS)
) ;fim do repeat
(SETQ ;ordena a lista
LST (VL-SORT LST ‘(LAMBDA (A B) (< (CAR A) (CAR B))))
;monda uma lista de coordenadas ‘(x y x1 y1 x2 y2….)
lst (APPLY ‘APPEND (MAPCAr ‘CADR lst))
;cria uma safearray da lista acima
lst (VLAX-SAFEARRAY-FILL
(VLAX-MAKE-SAFEARRAY
VLAX-VBDOUBLE
(CONS 0 (1- (LENGTH LST))))
LST))
;faz a polilinha adotar as coordenadas colculadas
(VLA-PUT-COORDINATES PL lst)
;reastaura o controle para o autocad
;(tbn:error-restore)
)
(prompt
“ADDVERTPL carregado!!!
visite: https:\tbn2net.com
“)
(princ)
Simples né?
Este programinha tem o intuito de mostrar como pode ser útil saber programar…. Imagine conectar os pontos “na mão”???
Curte aí!!!
Obrigado Neyton!!!!