Civil 3D - Ligar Cogo Points

Vamos voltar um pouco mais nas raízes deste blog, hehehe

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:
  1. Pedir a seleção dos Cogo Points
  2. Pedir a seleção da polilinha
  3. Pedir uma distância de referência, para testar se o ponto é válido
  4. Em cada ponto, fazer:
    1. Obter a coordenada do cogo point
    2. Se a distância do ponto em relação à polilinha for maior que a distância pedida, pula pro próximo ponto
    3. Calcular a posição relativa do ponto na polilinha
    4. Armazenar esta posição e a coordenada do cogo point
  5. Ordenar os pontos da lista que foi obtida no looping acima
  6. Redefinir os vértices da polilinha, usando estes pontos
  7. Enfeitar o programinha
  8. 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í!!!

Um comentário: