AutoCAD Contornos de sombreados

#1
Hola, a todos, soy nuevo por estos lares, así que os ruego paciencia, por favor.
Me acaba de ocurrir un pequeño problemilla recurrente, que es invertir el proceso de sombreado: de un sombreado sin las líneas de delimitación quisiera obtener las polilíneas de su contorno, sabéis alguno un modo "económico" de hacerlo?
Gracias adelantadas.
Salud.
Pelayo.
 
#2
Seleccionar el objeto.
Botón derecho - generar contorno.
Seleccionar el contorno.
Botón derecho - convertir a - polilínea.
 
#3
Hola Berobreo, gracias por tu ayuda, simple y concisa, pero me temo que no válida. Supongo que eso es en las últimas versiones, no? En mi trabajo ando con el 2002. Cosas del jefe, ya sabes....
Sabes si es posible en esta versión? No me apetece andar trasegando archivos de un lado a otro....
 
#4
Hola denuevo, Berobreo, ya veo que no es una cuestión exclusiva de las últimas versiones, ya sabes, los caminos no se mantienen pero existen, así que ya lo he encontrado.
Gracias por todo
 
#5
pelayo ha dicho:
Hola denuevo, Berobreo, ya veo que no es una cuestión exclusiva de las últimas versiones, ya sabes, los caminos no se mantienen pero existen, así que ya lo he encontrado.
Gracias por todo
Te agradecería que expusieras como lo has hecho...:confused:
 
#6
Disculpas

hola de nuevo. Pues me adelanté en mis suposiciones: en un ordenador que no es mío, que tiene Autocad LT2006 no sale en el menú contextual lo que comentaba Berobreo, pero al editar directamente el sombreado aparecía tal posibilidad. En la "euforia" del momento, supuse que esa posibilidad me había pasado inadvertida en mi 2002 y así lo reflejé en el foro. Pero al ponerme a hacerlo en el 2002 he visto que no es posible...
Siento la precipitación, de todo se aprende.
 
#7
Pues yo esto lo hago con una rutina lisp, que lo hace perfectamente. Voy a intentar pegarla aqui a ver si sale correctamente:
(defun c:hb () (c:hatchb)) ; this line can be commented out if there is an existing command called hb
(defun c:hatchb (/ es blay ed1 ed2 loops1 bptf part
et noe plist ic bul nr ang1 ang2 obj *ModelSpace* *PaperSpace*
space cw errexit undox olderr oldcmdecho ss1 lastent en1 en2 ss lwp
list->variantArray 3dPoint->2dPoint A2k ent i ss2
knot-list controlpoint-list kn cn pos xv bot area hst
)
(setq A2k (>= (substr (getvar "ACADVER") 1 2) "15"))
(if A2k
(progn
(defun list->variantArray (ptsList / arraySpace sArray)
(setq arraySpace
(vlax-make-safearray
vlax-vbdouble
(cons 0 (- (length ptsList) 1))
)
)
(setq sArray (vlax-safearray-fill arraySpace ptsList))
(vlax-make-variant sArray)
)
(defun areaOfObject (en / curve area)
(if en
(if A2k
(progn
(setq curve (vlax-ename->vla-object en))
(if
(vl-catch-all-error-p
(setq
area
(vl-catch-all-apply 'vlax-curve-getArea (list curve))
)
)
nil
area
)
)
(progn
(command "._area" "_O" en)
(getvar "area")
)
)
)
)
)
)
(if A2k
(defun 3dPoint->2dPoint (3dpt)
(list (float (car 3dpt)) (float (cadr 3dpt)))
)
)

(defun errexit (s)
(princ "\nError: ")
(princ s)
(restore)
)

(defun undox ()
(command "._ucs" "_p")
(command "._undo" "_E")
(setvar "cmdecho" oldcmdecho)
(setq *error* olderr)
(princ)
)

(setq olderr *error*
restore undox
*error* errexit
)
(setq oldcmdecho (getvar "cmdecho"))
(setvar "cmdecho" 0)
(command "._UNDO" "_BE")
(if A2k (progn
(vl-load-com)
(setq *ModelSpace* (vla-get-ModelSpace
(vla-get-ActiveDocument (vlax-get-acad-object))
)
*PaperSpace* (vla-get-PaperSpace
(vla-get-ActiveDocument (vlax-get-acad-object))
)
))
)


; For testing purpose
; (setq A2k nil)

(if (/= (setq ss2 (ssget '((0 . "HATCH")))) nil)
(progn
(setq i 0)
(setq area 0)
(setq bMoreLoops nil)
(while (setq ent (ssname ss2 i))
(setq ed1 (entget ent))
(if (not (equal (assoc 210 ed1) '(210 0.0 0.0 1.0))) (princ "\nHatch not in WCS!"))
(setq xv (cdr (assoc 210 ed1)))
(command "._ucs" "_w")
(setq loops1 (cdr (assoc 91 ed1))) ; number of boundary paths (loops)
(if (and A2k :) (strcase (cdr (assoc 410 ed1))) "MODEL"))
(setq space *ModelSpace*)
(setq space *PaperSpace*)
)
(repeat loops1
(setq ed1 (member (assoc 92 ed1) ed1))
(setq bptf (cdr (car ed1))) ; boundary path type flag
(setq ic (cdr (assoc 73 ed1))) ; is closed
(setq noe (cdr (assoc 93 ed1))) ; number of edges
(setq bot (cdr (assoc 92 ed1))) ; boundary type
(setq hst (cdr (assoc 75 ed1))) ; hatch style
(setq ed1 (member (assoc 72 ed1) ed1))
(setq bul (cdr (car ed1))) ; bulge
(setq plist nil)
(setq blist nil)
(cond
((> (boole 1 bptf 2) 0) ; polyline
(repeat noe
(setq ed1 (member (assoc 10 (cdr ed1)) ed1))
(setq plist (append plist (list (cdr (assoc 10 ed1)))))
(setq blist (append blist
(if (> bul 0)
(list (cdr (assoc 42 ed1)))
nil
)
)
)
)
(if A2k (progn
(setq polypoints
(apply 'append
(mapcar '3dPoint->2dPoint plist)
)
)
(setq VLADataPts (list->variantArray polypoints))
(setq obj (vla-addLightweightPolyline space VLADataPts))
(setq nr 0)
(repeat (length blist)
(if (/= (nth nr blist) 0)
(vla-setBulge obj nr (nth nr blist))
)
(setq nr (1+ nr))
)
(if :) ic 1)
(vla-put-closed obj T)
)
)
(progn
(if :) ic 1)
(entmake '((0 . "POLYLINE") (66 . 1) (70 . 1)))
(entmake '((0 . "POLYLINE") (66 . 1)))
)
(setq nr 0)
(repeat (length plist)
(if :) bul 0)
(entmake (list (cons 0 "VERTEX")
(cons 10 (nth nr plist))
)
)
(entmake (list (cons 0 "VERTEX")
(cons 10 (nth nr plist))
(cons 42 (nth nr blist))
)
)
)
(setq nr (1+ nr))
)
(entmake '((0 . "SEQEND")))
)
)
)
(t ; not polyline
(setq lastent (entlast))
(setq lwp T)
(repeat noe
(setq et (cdr (assoc 72 ed1)))
(cond
:)) et 1) ; line
(setq ed1 (member (assoc 10 (cdr ed1)) ed1))
(if A2k
(vla-AddLine
space
(vlax-3d-point (cdr (assoc 10 ed1)))
(vlax-3d-point (cdr (assoc 11 ed1)))
)
(entmake
(list
(cons 0 "LINE")
(list 10 (cadr (assoc 10 ed1)) (caddr (assoc 10 ed1)) 0)
(list 11 (cadr (assoc 11 ed1)) (caddr (assoc 11 ed1)) 0)
; (cons 210 xv)
)
)
)
(setq ed1 (cddr ed1))
)
:)) et 2) ; circular arc
(setq ed1 (member (assoc 10 (cdr ed1)) ed1))
(setq ang1 (cdr (assoc 50 ed1)))
(setq ang2 (cdr (assoc 51 ed1)))
(setq cw (cdr (assoc 73 ed1)))
(if (and (equal ang1 0 0.00001) (equal ang2 6.28319 0.00001))
(progn
(if A2k
(vla-AddCircle
space
(vlax-3d-point (cdr (assoc 10 ed1)))
(cdr (assoc 40 ed1))
)
(entmake (list (cons 0 "CIRCLE")
(assoc 10 ed1)
(assoc 40 ed1)
)
)
)
(setq lwp nil)
)
(if A2k
(vla-AddArc
space
(vlax-3d-point (cdr (assoc 10 ed1)))
(cdr (assoc 40 ed1))
(if :) cw 0)
(- 0 ang2)
ang1
)
(if :) cw 0)
(- 0 ang1)
ang2
)
)
(entmake (list (cons 0 "ARC")
(assoc 10 ed1)
(assoc 40 ed1)
(cons 50
(if :) cw 0)
(- 0 ang2)
ang1
)
)
(cons 51
(if :) cw 0)
(- 0 ang1)
ang2
)
)
)
)
)
)
(setq ed1 (cddddr ed1))
)
:)) et 3) ; elliptic arc
(setq ed1 (member (assoc 10 (cdr ed1)) ed1))
(setq ang1 (cdr (assoc 50 ed1)))
(setq ang2 (cdr (assoc 51 ed1)))
(setq cw (cdr (assoc 73 ed1)))
(if A2k (progn
(setq obj (vla-AddEllipse
space
(vlax-3d-point (cdr (assoc 10 ed1)))
(vlax-3d-point (cdr (assoc 11 ed1)))
(cdr (assoc 40 ed1))
)
)
(vla-put-startangle obj (if :) cw 0) (- 0 ang2) ang1))
(vla-put-endangle obj (if :) cw 0) (- 0 ang1) ang2))
)
(princ "\nElliptic arc not supported!")
)
(setq lwp nil)
)
:)) et 4) ; spline
(setq ed1 (member (assoc 94 (cdr ed1)) ed1))
(setq knot-list nil)
(setq controlpoint-list nil)
(setq kn (cdr (assoc 95 ed1)))
(setq cn (cdr (assoc 96 ed1)))
(setq pos (vl-position (assoc 40 ed1) ed1))
(repeat kn
(setq knot-list (cons (cons 40 (cdr (nth pos ed1))) knot-list))
(setq pos (1+ pos))
)
(setq pos (vl-position (assoc 10 ed1) ed1))
(repeat cn
(setq controlpoint-list (cons (cons 10 (cdr (nth pos ed1))) controlpoint-list))
(setq pos (1+ pos))
)
(setq knot-list (reverse knot-list))
(setq controlpoint-list (reverse controlpoint-list))
(entmake (append
(list '(0 . "SPLINE"))
(list (cons 100 "AcDbEntity"))
(list (cons 100 "AcDbSpline"))
(list (cons 70 (+ 1 8 (* 2 (cdr (assoc 74 ed1))) (* 4 (cdr (assoc 73 ed1))))))
(list (cons 71 (cdr (assoc 94 ed1))))
(list (cons 72 kn))
(list (cons 73 cn))
knot-list
controlpoint-list
)
)
(setq ed1 (member (assoc 10 ed1) ed1))
(setq lwp nil)
)
) ; end cond
) ; end repeat noe
(if lwp (progn
(setq en1 (entnext lastent))
(setq ss (ssadd))
(ssadd en1 ss)
(while (setq en2 (entnext en1))
(ssadd en2 ss)
(setq en1 en2)
)
(if :) (getvar "peditaccept") 1)
(command "_.pedit" (entlast) "_J" ss "" "")
(command "_.pedit" (entlast) "_Y" "_J" ss "" "")
)
))

) ; end t
) ; end cond
; Tries to get the area on islands but it's not clear how to know if an island is filled or not
; and if it should be substracted or added to the total area.
; (if (or :) bot 0) :) (boole 1 bot 1) 1)) (setq area (+ area (areaOfObject (entlast)))))
; (if (and (/= hst 1) (/= bot 0) :) (boole 1 bot 1) 0)) (setq area (- area (areaOfObject (entlast)))))
; (princ "\n") (princ bot) (princ "\n") (princ hst) (princ "\n")
; (princ (areaOfObject (entlast)))
) ; end repeat loops1
(if :) loops1 1) (setq area (+ area (areaOfObject (entlast)))) (setq bMoreLoops T))
(setq i (1+ i))
)
)
)
(if (and area (not bMoreLoops)) (progn
(princ "\nTotal Area = ")
(princ area)
))
(restore)
(princ)
)
 
#9
pues a mi también me gustaría poder hacer eso (y con una versión de CAD antigua)...
quizá sea una pregunta un poco ridícula (no soy experto), pero esto del lisp como se utiliza? hay que copiar y pegar todo esto en la linia de comandos? :confused:
 
#10
Medit, para hacer correr una rutina lisp en autocad debes hacer lo siguiente:

1. copiar el texto lisp en un archivo nuevo con el bloc de notas.
2. cambiar la extension de este archivo .txt. a .lsp
3. en autocad "herramientas/AutoLisp/Cargar"
4. seleccionar para que te lo cargue cada vez q inicias autocad
5. ya puedes usar esa aplicacion como un comando mas. En este caso el comando es "hatchb"
 
#11
Lo primero de todo, gracias Xoubino, funciona perfectamente.
Para Medit:
Herramientas/autoLISP/Editor de Visual Lisp.
Se abre un programilla, que es el editor. Creas un nuevo archivo en blanco, copias la rutina proporcionada por xoubino y la guardas con el nombre que quieras.
Para cargarla, haces lo mismo de antes, pero en vez de elegir "editor de visual LISP" eliges "cargar". La buscas, la cargas y tecleas "hatchb" y se produce la magia....
 
#12
ah, bien.. lo probaré .. hay algun sitio (web, etc.) con "rutinas" de éstas.. ? otros truquillos que ayuden a acelerar procesos repetitivos o tareas a la arts&crafts de éstos? .. a veces pierdo una tarde entera retocando planos sólo para que "queden bién" y al final en realidad la gente ni se los mira cuando se los traes a las obras... :rolleyes:

gracias xoubino & pelayo!

pd. hay algun truco para seleccionar un hatch sólido sin estar 2 horas buscando un punto por donde "agarrarlo" o tener que hacer una ventana de selección..? porqué hay zonas de esas tramas que són seleccionables y otras no?
 
#14
Sobre lo del sombreado, yo, con la versión 2006, hago lo siguiente:

Seleccionar sombreado - botón derecho "editar sombreado"- "volver a generar contorno" - "polilínea".

:cool:
 
Arriba