3.2. Conversión de Polilíneas en Splines


Este plano topográfico construido con polilíneas de tramos rectos, sin amoldar a curva, ocupaba originalmente 1.268 Kbytes. Con la aplicación al mismo del programa AutoLISP PL2SP logró una reducción a 581 Kbytes, un 46 % del original.

La aplicación de este programa a polilíneas adaptadas a curva-B, como se explica en el texto, logra reducciones mucho más espectaculares. Según pruebas realizadas, hasta 17 veces menor.


PolyLINES & BYTES

Al utilizar AutoCAD para la realización de mapas, usualmente tenemos que trabajar con ficheros extremadamente grandes. En muchos casos el tamaño de estos ficheros resulta de las curvas de nivel, y son provocados por la manera en que estas son generadas. Las curvas de nivel se digitalizan como polilíneas en modo "LINEA". Para curvarlas se aplica después el comando EDITPOL (PEDIT) con la opción SPLINE. Este procedimiento genera una gran cantidad de vértices suplementarios, provocando con ello un incremento en el tamaño del fichero respecto del original que contenía sólo polilíneas sin amoldar. Otra consecuencia de esta adaptación es que la polilínea así adaptada no pasará por todos los vértices, suavizándose el perfil original. He realizado algunas pruebas para determinar la incidencia de este factor sobre el tamaño del fichero, dibujando una polilínea y creando con ella una matriz de 10 x 10 elementos.

 PLINE.DWG

Utilizando los parámetros por defecto de AutoCAD, y adaptando las polilíneas con EDITPOL(PEDIT)/SPLINE, el resultado ha sido el siguiente:

Polilínea sin adaptar: PLINE DWG 238.770 bytes
Polilínea adaptada a B-Spline: B-SPLINE DWG 1.930.838 bytes

Como se ve, el tamaño del fichero se incrementa algo más de ocho veces. Este factor de incremento puede sin embargo reducirse si antes de realizar la adaptación se reduce el valor de la variable SPLINESEGS (que por defecto es 8). Con SPLINESEGS en 2 el resultado es:

Con SPLINESEGS=2               B-SPLIN1 DWG   375.520 bytes

Con ello se reduce el número de segmentos que se emplean para aproximar la curva teórica. Esta adaptación, sin embargo presentará un aspecto de línea quebrada, tanto más cuanto menor sea el valor de SPLINESEGS empleado, pues los segmentos generados son rectos. Un mejor resultado desde el punto de vista de su apariencia se lograría a partir de dar a la variable SPLINESEGS un valor negativo, en este caso -2 de manera que la adaptación se hiciera empleando arcos en lugar de segmentos rectos. En este caso se estaría combinando la adaptación tipo "curva-B" (B-spline) que se realiza a partir de segmentos rectos, con un posterior curvamiento del tipo "adaptar curva" (fit curve) tradicional de AutoCAD, a base de arcos de círculo.

Para lograr una aproximación mejor a los vértices originales, resulta también conveniente ajustar la variable SPLINETYPE, cuyo valor por defecto es 6 (B-spline cúbica), haciéndola igual a 5 (B-spline cuadrática). Esto sería una solución para nuevos planos, pero resultaría bastante laborioso aplicarlo manualmente a los ya existentes, pues implicaría el "readaptar" las polilíneas con el nuevo valor de SPLINESEGS, para lo cual sería necesario seleccionarlas una a una con la orden EDITPOL (PEDIT). Algo de este tipo pudiera implementarse a partir de un programa AutoLISP que automatizara el proceso.

Más recomendable para los ficheros existentes, sería utilizar algún programa que optimizara las curvas adaptadas, eliminando los vértices superfluos. Existen en el mercado varias aplicaciones que cumplen este propósito. La más interesante parece ser la aplicación CURVEFIT de TCI Software. Esta aplicación transforma las polilíneas en "poliarcos" aproximando los mismos a los vértices originales dentro del factor de tolerancia fijado por el usuario eliminando aquéllos que no fueran imprescindibles a esta aproximación. Otras utilidades que realizan una depuración de vértices según determinados parámetros ajustables por el usuario son WEED (incluido en el paquete de utilidades shareware de Jerry Workman VECTOR) distribuido por Mountain Software y PFILTER, una utilidad de distribución libre creada por Steve Johnson para WAWA, la Water Authority of Western Australia.


LA SOLUCIÓN SpLINE

La versión 13 de AutoCAD introduce una entidad "SPLINE", que dibuja directamente curvas cúbicas o cuadráticas del tipo NURBS. Esta curva se genera como tal, sin necesidad de un amoldamiento posterior, y pasa por todos los vértices que se designen. Es una entidad única, no como la polilínea que resulta de una concatenación o secuencia de entidades VERTEX individuales, con lo que se logra además un formato mucho más compacto en cuanto a su almacenaje en disco. Una spline trazada con los mismos vértices que la polilínea original (y como ella reproducida 100 veces en matriz) dio el siguiente resultado:

Curva NURBS SPLINE DWG 109.090 bytes

Otro indicador de la eficacia en la gestión gráfica a partir de esta entidad la obtenemos de aplicar sobre los distintos dibujos el comando STATUS:

DIBUJO UTILIZANDO SPLINES:
Command: _status 131 objects in C:\USR\DWG\spline
Free physical memory: 6.8 Mbytes (out of 31.4M).
Free swap file space: 84.6 Mbytes (out of 100.9M).
Virtual address space: 57.4 Mbytes.
DIBUJO UTILIZANDO POLILÍNEAS SIN ADAPTAR:
Command: status 5731 objects in C:\USR\DWG\pline
Free physical memory: 5.6 Mbytes (out of 31.4M).
Free swap file space: 84.3 Mbytes (out of 100.9M).
Virtual address space: 57.8 Mbytes.
DIBUJO CON POLILÍNEAS ADAPTADAS:
Command: _status 47431 objects in C:\USR\DWG\b-spline
Free physical memory: 0.2 Mbytes (out of 31.4M).
Free swap file space: 78.4 Mbytes (out of 100.9M).
Virtual address space: 76.3 Mbytes.

Es notable la diferencia en la cantidad de entidades registradas en el dibujo: de 131 en el realizado con splines a 47.431 en el de las polilíneas adaptadas. También merece atención el hecho de que después de cargado el dibujo, el hecho con splines deja libres 5.6 Megabytes de 31.4 totales, mientras que con el de las polilíneas adaptadas se consume prácticamente la totalidad de la RAM, con lo que se empezaría a paginar a disco de inmediato, ralentizando con ello el proceso de trabajo.

La solución ideal para la optimización de estos planos estaría en un programa (AutoLISP o ADS) que, una vez depuradas las polilíneas (con CURVEFIT, WEED, PFILTER u otro programa similar), creara splines a partir de una lectura de los vértices resultantes, con lo que se lograría una dimensión óptima del dibujo.


De SpLINES a PolyLINES:

Como nueva entidad en AutoCAD, SPLINE deja aún muchos cabos sueltos. Como de costumbre, estos cabos sueltos son campo propicio para la acción de los programadores AutoLISP, que vienen a aportar soluciones que en muchos casos se incorporan a las próximas versiones del programa.

Uno de estos cabos sueltos está en la conversión entre las entidades POLILÍNEA y SPLINE. La conversión polilínea - spline está resuelta, siempre que se haya realizado previamente su adaptación mediante la opción "curva-B" (SPLINE). Esta posibilidad, que forma parte de las opciones del comando SPLINE, tiene el inconveniente de exigir un amoldamiento previo a curva-B utilizando el incómodo comando EDITPOL (PEDIT).

Algo que no ofrece AutoCAD es la conversión en sentido inverso: la conversión SPLINE > POLILÍNEA. Decimos "no ofrece" pues no es que no esté resuelta. Lo que no está es disponible de manera directa, como tal conversión. El proceso que habrá de seguir resulta bastante alambicado: habrá que salvar el dibujo (o la parte de él que querramos convertir) como dibujo de la versión 12 (saveasR12). Al reabrir el dibujo en la versión 13 encontraremos que nuestra SPLINE es ahora una perfecta polilínea. Aunque esta conversión deja aún mucho que desear, pues es polilínea, pero siempre 3D. Faltaría la capacidad de discriminar si se trata de entidades coplanares para entonces convertirla a una polilínea 2D. Si la opción de conversión no aparece como tal, quizás se deba a que Autodesk desea reservarse algunas "novedades" para vendernos la próxima versión. De nuevo pudiéramos ingeniarnos para, aprovechando la posibilidad de salvar los splines como versión 12, crear una orden que automatizara (recurriendo a un simple SCRIPT) el siguiente proceso:

  • seleccionar las entidades spline del dibujo
  • exportarlas mediante la orden BLOQUEDISC (WBLOCK)
  • salir del dibujo actual y entrar en el nuevo dibujo creado
  • salvar este nuevo dibujo como R12
  • volver al dibujo anterior
  • importar, insertándolo, el dibujo salvado como R12
  • borrar los dibujos creados en los dos pasos intermedios

Un intento de programa C�digo FuenteAutoLISP que realiza una conversión aproximada de una Spline en Polilínea fue publicado hace algún tiempo por Vladimir Nesterowsky en el foro de discusión comp.cad.autocad. Aún cuando la polilínea que se logra no resulta idéntica al spline original, resulta interesante como ejemplo del procesamiento de entidades recurriendo al examen de sus datos de entidad. Que la conversión no resulta sencilla a nivel de programación de usuario, lo demuestra la rutina de conversión de B. Stamm y G. Stoykov publicada por AutoDESK en su colección de documentación técnica on-line, fit_spln.lsp - Converting Splines to Polylines Código Fuente. Esta rutina, mucho menos pretenciosa que la de Vladimir, se reduce a marcar puntos sobre la spline mediante el comando DIVIDE, para después unir los puntos con una polilínea de tramos lineales.

Cabría preguntar porqué sería necesario transformar una curva spline en polilínea. Se me ocurren, al menos, los cuatro siguientes motivos:

  • Muchos programas que reciben sus datos de ficheros DWG aún no reconocen las splines.
  • AutoCAD no suministra la manera de "juntar" splines. Si se interrumpiera accidentalmente el dibujo de una spline, habría que iniciarla desde el principio para lograr continuidad.
  • Tampoco permite darle un grosor a la entidad, cosa que sí hace con las polilíneas.
  • El comando EQDIST (OFFSET) no opera de manera satisfactoria con las SPLINES, fragmentándolas de manera imprevisible.
  • La opción TTR del comando CIRCULO no funciona con SPLINES (y tampoco con ELIPSES)

El primero de estos problemas seguramente se resolverá en las próximas versiones de dichas aplicaciones. El segundo sería tema para un programa AutoLISP. Seguramente alguno de vosotros ya lo ha intentado. Si es así tendría mucho gusto en publicarlo. En cuanto al grosor de las entidades, es un tema pendiente para AutoCAD. ¿Hasta cuándo, AutoDESK? Mientras tanto puede seguirse gestionando como se ha hecho para todas las demás entidades (excepto polilíneas) hasta ahora, asignándole un grosor al color en el momento de trazar. En cuanto al último aspecto, suponemos que se trata de un "bug" reparable en el futuro.


HACERLO AL REVÉS: DE PolyLINE A SpLINE

Desde mi punto de vista, el programa más urgente a elaborar era uno que convirtiera una polilínea en spline, pero no mediante la opción EDITPOL (PEDIT) que incrementa el tamaño de la entidad introduciendo nuevos vértices y que no acierta a pasar por los puntos originalmente digitizados. Esta nueva función simplemente podría leer los vértices originales de la polilínea, descartando aquéllos que fueran producto del curvado. Con ello reduciríamos en gran medida la dimensión de los ficheros de dibujo que como los planos topográficos incluyan una gran cantidad de polilíneas curvadas.

La solución que proponemos para ello se encuentra en el fichero PL2SP.LSP Código Fuente. Los resultados de su aplicación son impresionantes. Como prueba hemos utilizado uno de los ficheros de dibujo mencionados más arriba: el de las polilíneas adaptadas a B-Spline, B-SPLINE DWG de 1.9 Megabytes, el que llega a reducirse a sólo 110 Kbytes. Debo advertir que la reducción no es aparente a primera vista. Es necesario, una vez ejecutado el programa, comprimir el dibujo mediante la orden LIMPIA (PURGE), o salvándolo habiendo establecido previamente el valor de la variable ISAVEPERCENT en 0 (cero), o exportándolo mediante BLOQUEDISC (WBLOCK) Los efectos conseguidos pueden verse en el siguiente listado:


Dibujo original:   B-SPLINE DWG 1.930.838 bytes
Ejecutado PL2SP:         PRUEBA DWG 2.027.294 bytes
Limpiando el DWG:         PURGE DWG   110.683
bytes
Salvando con BLOQUEDISC: WBLOCK DWG   110.228 bytes 


Código FuenteLISTADO DEL PROGRAMA

OTROS DOCUMENTOS SOBRE EL TEMA:
http://xarch.tu-graz.ac...nestr/polyline_vertices