Mj4

Uma rotita para aqueles que explodiram uma polilinha que foi "transformada" em spline e explodiu a coitada:
(defun c:mj4 (/ ss ent lpt dd mj4_procpt new zc s flag lay n)
  (
tbn:error-init  (list (list "cmdecho" 0 "osmode" 0)
                         '(command "._zoom" "c" zc s)))
;seleciona as linhas:
  (setq ss     (ssget '((0 . "LINE,POLYLINE,LWPOLYLINE")))
;pede as distancia mínimas entre pontos
;que poderão ser conciderados iguais:

        mj4:dd (if mj4:dd mj4:dd 0.001) ;lembre da próxima vez
        dd     (getdist (strcat
                          "\nQual a distância será permitida? <"
                          (rtos mj4:dd 2)
                          ">"))
        dd     (if dd dd mj4:dd)
        mj4:dd dd ;lembre na próxima utilização o valor
;função que calculará a lista de pontos da nova 3dpoly

        mj4_procpt (lambda (pt start / s2 e2 lst)
;procura as ents que podem servir:
                 (setq s2 (ssget "CP" (get-lpt 20 dd (trans pt 0 1))
                                 '((0 . "LINE,POLYLINE,LWPOLYLINE"))))
;calcula as distâncias entre PT e o inicio e o fim de cada uma delas:
                 (repeat (if s2 (sslength s2) 0)
                   (
setq e2  (ssname s2 0)
;só processa se fizer parte da seleção inicial:
;lst estará nesta forma: (distancia entidade inicio/fim)

                         lst (if (ssmemb e2 ss)
                               (
append lst
                                 (list
                                   (list
                                     (distance pt
                                       (vlax-curve-getstartpoint e2))
                                          e2 t)
                                   (
list
                                     (distance pt
                                       (vlax-curve-getendpoint e2))
                                     e2 nil)))
                               lst))
                   (
ssdel e2 s2))
;escolhe a que estiver mais perto
;colocando as distâncias em ordem crescente:

                 (setq lst (car (vl-sort lst
                                         '(lambda (e1 e2)
                                            (
< (car e1) (car e2))))))
;se der certo,
                 (if lst
;se a distancia for aceitável:
                   (if (<= (car lst) dd)
                     (
progn
; pega suas coordenadas e apague ela:
                       (setq e2 (cadr lst) ;<---------correção: 10.11.2006
                             lpt
                              (if start
                                (append
                                  (if (caddr lst)
                                    (
reverse (get-points-polig e2))
                                    (
get-points-polig e2))
                                  (
cdr lpt))
                                (
append
                                  lpt
                                  (cdr (if (caddr lst)
                                         (
get-points-polig e2)
                                         (
reverse
                                           (get-points-polig e2)))))))
                       (
ssdel e2 ss)
                       (
entdel e2)
                       t))))
        zc (getvar "viewctr")
        s  (getvar "viewsize"))
;zoom extens para o ssget não dar problema:
  (command "._zoom" "e")
;processa a seleção toda:
  (while (> (sslength ss) 0)
;pega a entidade da seleção, pega o layer e seus vertices:
    (setq ent  (ssname ss 0)
          lpt  (get-points-polig ent)
          lay  (dxf 8 ent)
          n    0
          flag nil) ;inicializa a variavel flag
;apaga a entidade:

    (entdel ent)
;enquanto conectar alguma coisa nessa lista:
    (while (or (mj4_procpt (car lpt) t) ;no inicio
               (mj4_procpt (last lpt) nil)) ;ou no fim
      (grtext -2 (strcat (itoa (sslength ss)) ": "
                         (itoa (setq n (1+ n)))))
      (
setq flag t)) ;conectou pelo menos algo?
    (if flag ;mesmo?
      (progn
;desenha uma nova polilinha:
        (setq new (draw-pline2 lpt lay nil))
        (
ssadd (handent new) ss))
;não deu... "desdeleta" a entidade:
      (entdel ent))
    (
grtext -2 (itoa (sslength ss)))
    (
ssdel ent ss))
  (
command "._zoom" "c" zc s)
  (
tbn:error-restore))



Com esta rotina será possível juntar todos os segmentos de linhas, mesmo que elas estejam em 3d, em uma entidade só. É possível até escolher uma distância cujo valor será usado para determinar a proximidade das linhas, isto é, se a distancia entre os pontos de duas linhas forem menor que este valor, as duas linhas serão soldadas neste ponto...
claro que você pode definir este valor em zero, se preferir, mas as linhas não serão emendadas se os pontos não forem exatamente iguais...
Link(s) da(s) subrotina(s) usada(s):
tbn:error-init, get-lpt, get-points-polig, dxf, draw-pline2, tbn:error-restore

LinkWithin

Related Posts Plugin for WordPress, Blogger...