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.
|