3.2.1.2. Conversión de Splines a Polilíneas


El lunes, 14 Oct 1996 08:34:57 GMT, Vladimir Nesterovsky (vnestr@netvision.net.il) propuso en el grupo de News comp.cad.autocad el siguiente programa que convierte SPLINES R13 ó R12 a polilíneas con líneas y arcos:
Nota: los comentarios originales de VN han sido ampliados por mí a fin de procurar una mejor comprensión del programa. RT

Extracción del valor en una lista de asociación:

(defun dxf(a b)
(cdr(assoc a b))
)

Recibe un conjunto de selección y crea una lista con los nombres de entidad incluidos en dicho conjunto:

(defun sstol ( sel / l n )
(if (= 'PICKSET (type sel))           ;;comprueba si se trata de un conjunto
(repeat (setq n (sslength sel))    ;;de selección
(setq
n (1- n)
l (cons (ssname sel n) l)    ;;añade a la lista los nombres de
)                               ;;entidad
)
)
)

Convertir spline R13 en polilínea amoldada R12 usando puntos de control.

Sin puntos de ajuste del usuario, lamentablemente.
(defun spl13-12 (e / d a p p1) ;; conservar la entidad original
(setq d (entget e))
(setvar"cmdecho"0)
(command"_pline") ;; inicia la nueva polilínea
(foreach a d
(if (= 10 (car a)) ;;puntos de control (
código 10)
(command ;;a diferencia de la polilínea,
(if (null p1) ;;el SPLINE es una entidad única,
(setq p1 (cdr a)) ;;no una secuencia de entidades VERTEX.
(setq p (cdr a))
)
)
)
)
(if (equal p p1) ;;Si el spline es cerrado,

;;cierra la polilínea
(command "c")
(command "")
)
;; Nota: Nesterovsky no hace referencia a
;; la variable SPLINETYPE que determina
;; el tipo de curva, cúbica o cuadrática

;; a utilizar en el amoldamiento.
(if (/= (getvar "splinetype") 6) ;; Para unos resultados más
(setvar "splinetype" 6) ;; aproximados a la spline original
) ;; sería necesario comprobar si el
;; valor de SPLINETYPE sigue siendo el
;; valor por defecto SPLINETYPE=6 (cúbica)
(command"_pedit""_l""_s""") ;; Ahora amolda la polilínea a curva-B.
)

Versión de línea de comandos.Nueva orden para conversión de Splines en Polilíneas:

(defun c:spl13-12 ( / el e)
(if
(if (setq el (ssget "I" '((0 . "SPLINE")) ))
(setq el (
sstol el))
(setq el (
sstol (ssget '((0 . "SPLINE")) )))
)
(foreach e el (spl13-12 e))
)
)

 Convertir polilínea R12 amoldada a curva-B en polilínea normal.

 Usar los puntos de ajuste de spline y curvas con sus factores de abultamiento (bulges). Si SPLINESEGS era negativa cuando la polilínea fue creada  obtendrás segmentos de ARCO tangentes unos a otros. Supongo que es así como AutoCAD mismo despliega las polilíneas amoldadas a curva-B.
(defun despline12 (e / e0 d) ;; borra la entidad original
(setq d (entget (setq e0 e)))
(if
(and
(= "POLYLINE" (
dxf 0 d)) ;;código 0=tipo de entidad
(= 4 (
logand 4 (dxf 70 d)));;código 70=4 detecta si se
) ;;añadieron vértices para
(progn ;;amoldar a curva-B
(entmake
(list
'(0 . "POLYLINE")
(cons 70 (
logand 1 (cdr (assoc 70 d ))))
) ;;simplemente: (70 . 0)
)
(while
(/= "SEQEND" (dxf 0 (setq D (entget (setq E (entnext E))))))
;; puntos de ajuste de spline y curvas
(if (member (dxf 70 d) (list 8 1))
;;comprueba si el vertice resulta de
;;amoldar a curva (
código 70=1 u 8).
;;En ese caso, usar datos de punto
;;y abultamiento (
bulge).
(
entmake
(list (assoc 0 d)(assoc 10 d)(assoc 42 d))
)
)
)
(entdel e0)
(entmake '((0 . "SEQEND")))
)
)
(princ)
)

Versión de línea de comandos

(defun c:despl12 ( )
(foreach e (sstol (ssget '( (0 . "POLYLINE") )))
(despline12 e)
)
)

Y FINALMENTE, convertir la SPLINE R13 en POLILINEA con arcos y líneas.

(defun c:despl13 (/ el)
(if
(if (setq el (ssget "I" '((0 . "SPLINE"))))
(setq el (
sstol el))
(setq el (
sstol (ssget '((0 . "SPLINE")))))
)
(foreach e el (
spl13-12 e)
(
despline12 (entlast))
)
)
)
;;-----------------10-19-96 04:24am-------------------------------;;

Pero esta polilínea amoldada a curva-B tendrá en consideración SOLAMENTE los puntos de control de SPLINE, sin los puntos de ajuste y otra serie de parámetros añadidos en la versión 13 (que admito no entender, pero que puedo ver que producen una curva algo diferente)
Vladimir Nesterovsky ADS/LISP/C/C++ etc.