Posição, Sftopo, pontos e polilinhas

Sabe aquelas polilinhas que você desenha conectando pontos de levantamento topográfico? então... já reparou que se você receber mais dados de campo e racalcular as poligonais de fechamento e reinserir todos os pontos no desenho, apagando os anteriores, as vezes dependendo da nova distribuição do erro, os pontos "saem" um pouquinho do lugar? não chega a ser um problema se a distância do ponto até o vértice da polilinha for pequeno, mas pode parecer meio "chutado" o desenho, não é? pelo menos eu acho... isso ocorre se você está usando um tal de SFTOPO para calcular os pontos... mas creio que no Posição ou no Topograph isso também ocorra... para amenizar um pouco isso, fiz esta rotina:
ver...
(defun c:arrumapline  (/ ss f ent q vla d)
  (
tbn:error-init (list (list "cmdecho" 0) t))
  (
setq ss (ssget '((0 . "LINE,*POLYLINE")))
        d  (getdist "\nEntre com a distancia <0.1>")
        d  (if d
             d

             0.1)
        f  (lambda (pt / lpt s2)
             (
setq lpt (get-lpt 20 d (trans pt 0 1)))
             (
command "zoom" "c" (trans pt 0 1) "")
             (
if (setq s2 (ssget "CP" lpt '((0 . "POINT"))))
               (
cadar (vl-sort
                        (mapcar
                          '(lambda (x)
                             (
list (distance pt (dxf 10 x)) (dxf 10 x)))
                          (
dxf -1 s2))
                        '(lambda (e1 e2)
                           (
< (car e1) (car e2))))))))
  (
repeat (if ss (sslength ss) 0)
    (
setq ent (ssname ss 0))
    (
if (= "LINE" (dxf 0 ent))
      (
progn
        (if (setq pt (f (dxf 10 ent)))
          (
remake-ent ent 10 pt))
        (
if (setq pt (f (dxf 11 ent)))
          (
remake-ent ent 11 pt)))
      (
progn
        (setq n   1
              vla (vlax-ename->vla-object ent)
              q  (= (dxf 0 ent) "LWPOLYLINE"))
        (
repeat (1- (length (get-points-polig ent)))
          (
if (setq pt (f (3d-of-vla (vla-get-coordinate vla n))))
            (
vla-put-coordinate
              vla
              n

              (if (= (dxf 0 ent) "LWPOLYLINE")
                (
vlax-2d-point pt)
                (
vlax-3d-point pt))))
          (
setq n (1+ n)))
        (
vlax-release-object vla)))
    (
ssdel ent ss))
  (
tbn:error-restore ))


Link(s) da(s) subrotina(s) usada(s):
tbn:error-init, get-lpt, dxf, remake-ent, get-points-polig, 3d-of-vla, vlax-2d-point, tbn:error-restore

Ela faz o seguinte: pede a seleção de linhas que ela irá dar "grip_stretchs" nos vértices até o ponto (entidades POINT) mais próximo, levando em conta que o ponto deve estar a uma distância máxima aceitável...

Um comentário:

  1. Cara estou apanhando com o 2011, nao rada lisp alguma, to pra ficar doido, o problema é que troquei de maquina e o bom e velho 2004 nao roda em 64 bits, sera que vc pode me ajudar ... ??

    ResponderExcluir