Hoje vou postar uma rotina que me ajuda muito no trabalho de desenhar o levantamento de campo, principalmente quando estou desenhando ruas… Com ela é possível transformar segmentos de polilinhas (LWPOLYLINE) em arcos, diretamente, sem trims, arcs ou joins.. para usar, basta ter a polilinha (obviamente) e usar o comando ABUL (que é definido na rotina), em seguida ir clicando os segmentos que serão convertidos em arcos
mais…
(defun c:abul (/ tmp ent pt pts p bul pm p1 p2 p3 os arc h lst)
(tbn:error-init '(("cmdecho" 0 "osmode" 0) t))
(while (progn
(if (> (length lst) 0) (initget "U" 0))
(setq tmp
(entsel
(strcat
"nSelecione a polilinha no trecho a adicionar o arco"
(if (> (length lst) 0) " [Undo]" ""))))
(or tmp (/= 52 (getvar "errno"))))
(if (= "U" tmp)
(progn
(setq tmp (car lst)
lst (cdr lst))
(vla-setbulge
(vlax-ename->vla-object (car tmp))
(cadr tmp)
(caddr tmp)))
(if (= "LWPOLYLINE" (dxf 0 (car tmp)))
(progn
(setq pt (trans (cadr tmp) 1 0)
ent (car tmp)
pt (vlax-curve-getclosestpointtoprojection ent pt '(0 0 1))
p (list (vlax-curve-getdistatpoint ent pt) pt)
pts (get-points-polig ent)
p (1- (vl-position p
(vl-sort
(cons
p
(mapcar
'(lambda (p)
(list
(vlax-curve-getdistatpoint
ent
p)
p))
pts))
'(lambda (e1 e2) (< (car e1) (car e2))))))
p1 (nth p pts)
p2 (nth (1+ p) pts)
p2 (if p2 p2 (car pts))
pm (media p1 p2)
p3 (getpoint (trans pm 0 1)
"nEntre com a posição do 3º ponto")
os (getvar "osmode"))
(if p3
(progn
(setvar "osmode" 0)
(command "arc" (trans p1 0 1) p3 (trans p2 0 1))
(setvar "osmode" os)
(sssetfirst nil (ssadd ent (ssadd)))
(setq arc (entlast)
p3 (vlax-curve-getpointatdist arc (/ (get-length-of arc) 2))
h (distance p3 pm)
bul (/ (* 2 h) (distance p1 p2)))
(if (equal 0.0
(distance p3 (polar pm (+ (angle p1 p2) (/ pi 2)) h))
0.0001)
(setq bul (- bul)))
(setq lst
(cons (list ent p (vla-getbulge (vlax-ename->vla-object ent) p))
lst))
(vla-setbulge (vlax-ename->vla-object ent) p bul)
(entdel arc))))
(prompt "nNão é POLILINHA"))))
(sssetfirst nil nil)
(tbn:error-restore))
Link(s) da(s) subrotina(s) usada(s):
tbn:error-init, dxf, get-points-polig, media, get-length-of, tbn:error-restore
Antes que alguem pergunte porque esse nome “ABUL”: A de ADD (adicionar) e BUL de BULGE (bulge=2h/D, onde D é o comprimento da corda que une os extremos do arco e h é a distância entre o ponto médio destes pontos e o ponto medio do ARCO)
logo postarei uma que elimina estes arcosm uma que adiciona e uma que elimina vértices… aguardem