Este ejemplo muestra como poner en cero la coordenada Z de unos elementos dentro de un dibujo de AutoCAD, es decir "baja" las entidades que estén dibujadas a una altura en el eje Z y le asigna el valor "0", o en el caso de polilíneas 3d las aplana poniendole a todos sus vertices una altura 0 en Z y respentando sus coordenadas X e Y. Solo tiene en cuenta los puntos, los textos (TEXT y MTEXT), las líneas y las polilíneas. Básicamente lo que hace es hacer un conjunto por cada tipo de entidad (línea, polilínea, texto, y punto) analizar los puntos por cada uno de los elementos dentro del conjunto y redefinir cada punto poniendo en 0 su coordenada Z, en el caso de las polilíneas recorre uno por uno todos los vértices que la componen.
El ejemplo puede mejorarse, quizás no sea la forma más óptima de hacerlo, por ejemplo podriamos hacer solo un conjunto y trabajar con todos lo elementos, pero bueno de esta manera quizás es un poco más claro, además hay que tener en cuenta que no contempla todos los elementos, como bloques, circulos, igualmente una vez que se comprende se puede agregar el tipo de elemento necesario.
Otra cosa a tener en cuenta es que trabaja con polilíneas 3d (POLYLINE) y no con polilíneas 2d (LWPOLYLINE) ya que las polilíneas 2d están dibujadas en un plano, para bajarla podemos moverla directamente, no hace falta cambiar la coordenada Z de cada uno de sus vértices.
(defun c:2d()
(setq conj (ssget "x" '((0 . "POLYLINE")))) ;;;;;1
(if (/= conj nil)
(progn
(setq lar (sslength conj))
(setq no 0)
(while (< no lar) ;;;;;;2
(setq ent (ssname conj no)) ;;;;;;3
(setq vert (entnext ent)) ;;;;;;4
(setq pto (entget vert))
(while (/= (cdr (assoc 0 pto)) "SEQEND") ;;;;;;5
(setq coords (cdr (assoc 10 pto)))
(setq x (car coords))
(setq y (car (cdr coords)))
(entmod (subst (cons 10 (list x y 0.0)) (assoc 10 pto) pto)) ;;;;;;6
(setq vert (entnext vert) pto (entget vert)) ;;;;;;7
)
(entupd ent) ;;;;;;8
(princ (strcat "\rConvirtiendo polilíneas 3d a 2d: " (itoa no) " de " (itoa lar)))
(setq no (+ 1 no))
)
)
)
(setq conj (ssget "x" '((0 . "LINE")))) ;;;;;;9
(if (/= conj nil)
(progn
(setq lar (sslength conj))
(setq no 0)
(while (< no lar)
(setq ent (ssname conj no))
(setq enti (entget ent))
(setq pto (cdr (assoc 10 enti)))
(setq x (car pto))
(setq y (car (cdr pto)))
(entmod (subst (cons 10 (list x y 0.0)) (assoc 10 enti) enti))
(entupd ent)
(princ (strcat "\rConvirtiendo líneas 3d a 2d: " (itoa no) " de " (itoa lar)))
(setq no (+ 1 no))
)
(setq no 0)
(while (< no lar)
(setq ent (ssname conj no))
(setq enti (entget ent))
(setq pto (cdr (assoc 11 enti)))
(setq x (car pto))
(setq y (car (cdr pto)))
(entmod (subst (cons 11 (list x y 0.0)) (assoc 11 enti) enti))
(entupd ent)
(princ (strcat "\rConvirtiendo líneas 3d a 2d: " (itoa no) " de " (itoa lar)))
(setq no (+ 1 no))
)
)
)
(setq conj (ssget "x" '((0 . "POINT"))))
(if (/= conj nil)
(progn
(setq lar (sslength conj))
(setq no 0)
(while (< no lar)
(setq ent (ssname conj no))
(setq enti (entget ent))
(setq pto (cdr (assoc 10 enti)))
(setq x (car pto))
(setq y (car (cdr pto)))
(entmod (subst (cons 10 (list x y 0.0)) (assoc 10 enti) enti))
(entupd ent)
(princ (strcat "\rBajando coordenada Z de los puntos: " (itoa no) " de " (itoa lar)))
(setq no (+ 1 no))
)
)
)
(setq conj (ssget "x" '((-4 . " <> )(0 . "TEXT")(0 . "MTEXT")(-4 . "or>" ))))
(if (/= conj nil)
(progn
(setq lar (sslength conj))
(setq no 0)
(while (< no lar)
(setq ent (ssname conj no))
(setq enti (entget ent))
(setq pto (cdr (assoc 10 enti)))
(setq x (car pto))
(setq y (car (cdr pto)))
(entmod (subst (cons 10 (list x y 0.0)) (assoc 10 enti) enti))
(entupd ent)
(princ (strcat "\rBajando coordenada Z de los Textos: " (itoa no) " de " (itoa lar)))
(setq no (+ 1 no))
)
)
)
)
;Breve comentario de las líneas marcadas
; 1.- se crea el conjunto con todas las entidades POLYLINE del dibujo
; 2.- si el conjunto no está vacío calculamos el largo y vamos recorriendo uno por uno los elementos
; 3.- obtengo el nombre de la entidad
; 4.- se obtiene el primer vértice de la polilinea
; 5.- se recorre toda la polilinea analizando uno por uno sus vértices
; 6.- se modifica la altura del vértice mediante el comando entmod
; 7.- voy al siguiente vértice
; 8.- se hace visual el cambio mediante entupd
; 9.- se hace un nuevo conjunto, esta vez con las líneas
El ejemplo puede mejorarse, quizás no sea la forma más óptima de hacerlo, por ejemplo podriamos hacer solo un conjunto y trabajar con todos lo elementos, pero bueno de esta manera quizás es un poco más claro, además hay que tener en cuenta que no contempla todos los elementos, como bloques, circulos, igualmente una vez que se comprende se puede agregar el tipo de elemento necesario.
Otra cosa a tener en cuenta es que trabaja con polilíneas 3d (POLYLINE) y no con polilíneas 2d (LWPOLYLINE) ya que las polilíneas 2d están dibujadas en un plano, para bajarla podemos moverla directamente, no hace falta cambiar la coordenada Z de cada uno de sus vértices.
(defun c:2d()
(setq conj (ssget "x" '((0 . "POLYLINE")))) ;;;;;1
(if (/= conj nil)
(progn
(setq lar (sslength conj))
(setq no 0)
(while (< no lar) ;;;;;;2
(setq ent (ssname conj no)) ;;;;;;3
(setq vert (entnext ent)) ;;;;;;4
(setq pto (entget vert))
(while (/= (cdr (assoc 0 pto)) "SEQEND") ;;;;;;5
(setq coords (cdr (assoc 10 pto)))
(setq x (car coords))
(setq y (car (cdr coords)))
(entmod (subst (cons 10 (list x y 0.0)) (assoc 10 pto) pto)) ;;;;;;6
(setq vert (entnext vert) pto (entget vert)) ;;;;;;7
)
(entupd ent) ;;;;;;8
(princ (strcat "\rConvirtiendo polilíneas 3d a 2d: " (itoa no) " de " (itoa lar)))
(setq no (+ 1 no))
)
)
)
(setq conj (ssget "x" '((0 . "LINE")))) ;;;;;;9
(if (/= conj nil)
(progn
(setq lar (sslength conj))
(setq no 0)
(while (< no lar)
(setq ent (ssname conj no))
(setq enti (entget ent))
(setq pto (cdr (assoc 10 enti)))
(setq x (car pto))
(setq y (car (cdr pto)))
(entmod (subst (cons 10 (list x y 0.0)) (assoc 10 enti) enti))
(entupd ent)
(princ (strcat "\rConvirtiendo líneas 3d a 2d: " (itoa no) " de " (itoa lar)))
(setq no (+ 1 no))
)
(setq no 0)
(while (< no lar)
(setq ent (ssname conj no))
(setq enti (entget ent))
(setq pto (cdr (assoc 11 enti)))
(setq x (car pto))
(setq y (car (cdr pto)))
(entmod (subst (cons 11 (list x y 0.0)) (assoc 11 enti) enti))
(entupd ent)
(princ (strcat "\rConvirtiendo líneas 3d a 2d: " (itoa no) " de " (itoa lar)))
(setq no (+ 1 no))
)
)
)
(setq conj (ssget "x" '((0 . "POINT"))))
(if (/= conj nil)
(progn
(setq lar (sslength conj))
(setq no 0)
(while (< no lar)
(setq ent (ssname conj no))
(setq enti (entget ent))
(setq pto (cdr (assoc 10 enti)))
(setq x (car pto))
(setq y (car (cdr pto)))
(entmod (subst (cons 10 (list x y 0.0)) (assoc 10 enti) enti))
(entupd ent)
(princ (strcat "\rBajando coordenada Z de los puntos: " (itoa no) " de " (itoa lar)))
(setq no (+ 1 no))
)
)
)
(setq conj (ssget "x" '((-4 . " <> )(0 . "TEXT")(0 . "MTEXT")(-4 . "or>" ))))
(if (/= conj nil)
(progn
(setq lar (sslength conj))
(setq no 0)
(while (< no lar)
(setq ent (ssname conj no))
(setq enti (entget ent))
(setq pto (cdr (assoc 10 enti)))
(setq x (car pto))
(setq y (car (cdr pto)))
(entmod (subst (cons 10 (list x y 0.0)) (assoc 10 enti) enti))
(entupd ent)
(princ (strcat "\rBajando coordenada Z de los Textos: " (itoa no) " de " (itoa lar)))
(setq no (+ 1 no))
)
)
)
)
;Breve comentario de las líneas marcadas
; 1.- se crea el conjunto con todas las entidades POLYLINE del dibujo
; 2.- si el conjunto no está vacío calculamos el largo y vamos recorriendo uno por uno los elementos
; 3.- obtengo el nombre de la entidad
; 4.- se obtiene el primer vértice de la polilinea
; 5.- se recorre toda la polilinea analizando uno por uno sus vértices
; 6.- se modifica la altura del vértice mediante el comando entmod
; 7.- voy al siguiente vértice
; 8.- se hace visual el cambio mediante entupd
; 9.- se hace un nuevo conjunto, esta vez con las líneas
Comentarios