Manipulação de polilinhas

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

Deixe um comentário

Carrinho de compras
Rolar para cima