3.2.1.1. Conversión LWPolyLINE-SpLINE


CONVERTIR A SPLINES LAS LWPOLYLINES DE AUTOCAD 2000


Below is the result of your feedback form.  It was submitted by
(orpfeifer@arquired.es) on Friday, March 3, 2000 at 11:34:10
---------------------------------------------------------------------------
acc_name: Visual LISP
nombre: Oscar Rodríguez
comentario: HE INTENTADO ADAPTAR TU PROGRAMA PARA QUE PUEDA CONVERTIR
;;;A SPLINES LAS LWPOLYLINES DE AUTOCAD 2000
;;;--INICIO DEL PROGRAMA/PROGRAM BEGINS HERE--------------
;;;*******************************************************
;;;Sustitución POLYLINE o LWPOLYLINE->SPLINE
;;;Lee los vértices originales de una polilínea y crea a
;;;partir de ellos una SPLINE. Borra la polilínea original.
;;;(C) Reinaldo Togores, Santander, 1997
;;;-------------------------------------------------------
;;;Nota: Este programa sólo funcionará correctamente si el
;;;Sistema de Coordenadas de Objeto de la polilínea a convertir
;;;coincide con el Sistema de Coordenadas Universal, es decir
;;;que la polilínea esté contenida en un plano paralelo
;;;al plano XY Universal.
;;;--------------------------------------------------------
;;;--------------------------------------------------------
;;;Adaptado a LWPOLYLINE por Oscar Rodríguez, Sevilla, 2000
;;;--------------------------------------------------------
;;;--------------------------------------------------------
;;;En AutoCAD 2000 las polilíneas son LWPOLYLINE y su base
;;;de datos no contiene sublistas como en el caso de las POLYLINE
;;;de anteriores versiones. Por tanto no podemos acceder a ellas con
;;;la orden ENTNEXT para obtener los vértices de la polilínea.
;;;De hecho si se intenta utilizar esta orden obtenemos un error.
;;;Autocad 2000 convierte automáticamente las POLYLINE de dibujos
;;;realizados con versiones anteriores a LWPOLYLINE, pero si la
;;;polilínea estaba adaptada a curva continúa siendo una POLYLINE,
;;;lo mismo ocurre si adaptamos a curva una LWPOLYLINE, se transformará
;;;en una POLYLINE.
;;;En definitiva, debemos poder seleccionar ambos tipos de entidades
;;;indistintamente y acceder a su base de datos para obtener la
;;;secuencia de vértices.
;;;;;********************************************************
;;;Rutina de selección de objetos:
;;;Del conjunto de selección original, crea un nuevo
;;;conjunto de selección que incluya sólo polilíneas:
(defun pl_sel (/ orig_selset pl_selset count)
(prompt "\nSeleccione Polilíneas/Select Polylines: ")
(setq
orig_selset
(ssget)
pl_selset (ssadd)
count -1
)
(repeat (sslength orig_selset)
(setq count (1+ count))
(if (or
(= (cdr (assoc 0 (entget (ssname orig_selset count))))
"POLYLINE"
)
;Aquí seleccionamos también las LWPOLYLINE
(= (cdr (assoc 0 (entget (ssname orig_selset count))))
"LWPOLYLINE"
)
)
(ssadd (ssname orig_selset count) pl_selset)
)
)
pl_selset
)
;;;Rutina de lectura de los vértices de la polilínea
;;;crea una lista de entidad SPLINE a partir de los
;;;vértices originales de la polilínea, (señalados por
;;;el código 70=0 ó 16) cambiando el código 10 de la
;;;entidad POLYLINE o LWPOLYLINE por el código 11 de
;;;la entidad SPLINE.
;;;Sólo se incluyen en la nueva lista los códigos
;;;imprescindibles para la creación de la SPLINE.
;;;Cada lista creada se pasa a entmake
;;;para crear la nueva SPLINE. Después se borra la
;;;polilínea original
(defun vertex (sset / cont count ent_sup act_ent lon_ent spl_list)
(setq count 0)
(repeat (sslength sset)
(setq
ent_sup (ssname sset count)
act_ent (entget ent_sup)
count (1+ count)
spl_list nil
)
(if (= (cdr (assoc 0 act_ent)) "POLYLINE")
;Si la entidad seleccionada es una POLYLINE accedemos
;a las sublistas de su base de datos para obtener sus
;vértices.
(progn
(setq act_ent (entnext ent_sup))
(while (/= (cdr (assoc 0 (entget act_ent))) "SEQEND")
(if
(or
(= (cdr (assoc 70 (entget act_ent))) 0)
(= (cdr (assoc 70 (entget act_ent))) 16)
)
(setq
spl_list
(cons (cons 11 (cdr (assoc 10 (entget act_ent)))) spl_list)
)
)
(setq
act_ent (entnext act_ent)
)
)
)
;Si la entidad seleccionada es una LWPOLYLINE accedemos
;a su base de datos para obtener sus vértices.
(progn
(setq lon_ent (length act_ent)
cont 0
)
(if
(or
(= (cdr (assoc 70 act_ent)) 0)
(= (cdr (assoc 70 act_ent)) 16)
)
(repeat lon_ent
(if (= 10 (car (nth cont act_ent)))
(setq
spl_list
(cons (cons 11 (cdr (nth cont act_ent))) spl_list)
)
)
(setq cont (1+ cont))
)
)
)
)
;A partir de aqí es idéntico para POLYLINE o LWPOLYLINE.
(setq spl_list (reverse spl_list))
;;Consrucción de la nueva lista de entidad
(foreach
cod
(list
(assoc 8 (entget ent_sup))
(cons 74 (length spl_list))
(cons 71 3)
(cons 100 "AcDbSpline")
(cons 100 "AcDbEntity")
(cons 0 "SPLINE")
)
(setq spl_list (cons cod spl_list))
)
;;Hacer la SPLINE
(entmake spl_list)
;;Borrar la POLILÍNEA
(entdel ent_sup)
)
)
;;;Función Principal/Command line function
(defun c:pl2sp (/ oce)
(setq oce (getvar "cmdecho"))
(setvar "cmdecho" 0)
(vertex (pl_sel))
(redraw)
(setvar "cmdecho" oce)
(princ)
)
;;;----------------FIN DEL PROGRAMA-----------------------