Quem já desenhou uma hachura e, por algum motivo, apagou as linhas que delimitavam esta hachura e depois quiz alterar a dita cuja? Mas sem os contornos, como fazêlo?
é o que esta rotina faz, desenha os contornos que definem esta hachura…
que faz arquitetura deverá usar bastante, pra hachurar as “linhas do terreno”
(defun c:cn2hatch (/ ent lay loop tp pts isclose qtd dg rc
pe nk ncp kv i f c ss)
(tbn:error-init (list (list “cmdecho” 0) t))
(setq ss (ssget ‘((0 . “HATCH”))))
(repeat (if ss (sslength ss) 0)
(setq ent (ssname ss 0)
ss (ssdel ent ss)
ent (entget ent)
lay (dxf 8 ent)
loop (dxf 91 ent)) ;Number of boundary paths (loops))
(if (/= 1 (dxf 71 ent))
(progn
;remove a informação inicial que é desnecessária:
(while (/= 92 (caar ent)) (setq ent (cdr ent)))
;descarta os “source objects, pois é hatch não associativa
(while (assoc 97 ent)
(setq ent (vl-remove (assoc 97 ent) ent)))
;descarta as Boundary path type flag (bit coded):
(while (assoc 92 ent)
(setq ent (vl-remove (assoc 92 ent) ent)))
(repeat loop
(if ; boundary type = polyline:
(or (and (= 1 (cdar ent)) (= 1 (cdadr ent)))
(= 0 (cdar ent)))
(progn
(setq isclose (cdadr ent)
qtd (cdaddr ent)
pts nil
ent (cdddr ent))
(repeat qtd
(if (= 42 (caadr ent)) ;se tem arco (bulge)
(setq pts (append pts (sub-list ent 0 1))
ent (cddr ent))
(setq pts (append pts (list (car ent)))
ent (cdr ent))))
(entmake
(append
(list ‘(0 . “LWPOLYLINE”)‘(100 . “AcDbEntity”)
(cons 8 lay) ‘(100 . “AcDbPolyline”)
(cons 90 qtd) (cons 70 isclose))
pts)))
(progn
;qtd: Number of edges in this boundary path
;(only if boundary is not a polyline)
(setq qtd (cdar ent) ent (cdr ent))
(repeat qtd
;tp: 1 = Line; 2 = Circular arc;
; 3 = Elliptic arc; 4 = Spline
(setq tp (cdar ent) ent (cdr ent))
(cond
((= tp 1)
(entmake (list ‘(0 . “LINE”) (assoc 10 ent)
(assoc 11 ent) (cons 8 lay)))
(setq ent (cddr ent)))
((= tp 2)
(setq i (dxf 50 ent) f (dxf 51 ent) c (dxf 73 ent))
(entmake
(list ‘(0 . “ARC”) ‘(100 . “AcDbEntity”)
(cons 8 lay) ‘(100 . “AcDbCircle”)
(car ent) (cadr ent)
‘(100 . “AcDbArc”)
(cons 50 (if (= c 1) i (* -1 f)))
(cons 51 (if (= c 1) f (* -1 i)))))
(setq ent (cdr (cddddr ent))))
((= tp 3)
(entmake
(list ‘(0 . “ELLIPSE”) ‘(100 . “AcDbEntity”)
(cons 8 lay) ‘(100 . “AcDbEllipse”)
(car ent) (cadr ent) (caddr ent)
(cons 41 (if (= 1 (dxf 73 ent))
(dxf 50 ent)
(dxf 51 ent)))
(cons 42 (if (= 1 (dxf 73 ent))
(dxf 51 ent)
(dxf 50 ent)))))
(setq ent (cddr (cddddr ent))))
((= tp 4)
(setq dg (cdar ent) ;Degree
rc (cdadr ent) ;Rational
pe (cdaddr ent) ;Periodic
nk (cdr (cadddr ent)) ;Number of knots
ncp (cdr (nth 4 ent)) ;Number of control points
kv (sub-list ent 5 (+ 4 nk)) ;Knot values
pts (sub-list ent (+ 5 nk) (+ 4 nk ncp));Ctrl pt
ent (sub-list ent (+ 5 nk ncp) (1- (length ent))))
(entmake
(append
(list
‘(0 . “SPLINE”) ‘(100 . “AcDbEntity”)
(cons 8 lay) ‘(100 . “AcDbSpline”)
(cons 70 (logior (* 4 rc) (* 2 pe)))
(cons 71 dg) (cons 72 nk) (cons 73 ncp)
‘(74 . 0))
kv
pts)))))))))))
(tbn:error-restore))
Claro, que as linhas não serão exatamente as mesmas de antes, pois se você as apagou, como vou saber em que layers elas estavam? 🙂
Link(s) da(s) subrotina(s) usada(s):
tbn:error-init, dxf, sub-list, tbn:error-restore