3.2. Conversión de Polilíneas en Splines



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

Laaplicación de este programa a polilíneas adaptadas a curva-B,como se explica en el texto, logra reducciones muchomás espectaculares. Según pruebas realizadas, hasta 17 vecesmenor.


PolyLINES & BYTES

Al utilizar AutoCAD para la realización de mapas, usualmente tenemosque trabajar con ficheros extremadamente grandes. En muchos casos eltamaño de estos ficheros resulta de las curvas de nivel, y sonprovocados por la manera en que estas son generadas. Las curvas de nivel sedigitalizan como polilíneas en modo "LINEA". Para curvarlas seaplica 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 deloriginal que contenía sólo polilíneas sin amoldar. Otraconsecuencia de esta adaptación es que la polilínea asíadaptada no pasará por todos los vértices, suavizándose elperfil original. He realizado algunas pruebas para determinar la incidencia deeste factor sobre el tamaño del fichero, dibujando una polilíneay creando con ella una matriz de 10 x 10 elementos.

 PLINE.DWG

Utilizando los parámetros por defecto de AutoCAD, y adaptando laspolilí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 deocho veces. Este factor de incremento puede sin embargo reducirse si antes derealizar la adaptación se reduce el valor de la variable SPLINESEGS (quepor defecto es 8). Con SPLINESEGS en 2 el resultado es:

Con SPLINESEGS=2              B-SPLIN1DWG   375.520 bytes

Con ello se reduce el número de segmentos que se emplean paraaproximar la curva teórica. Esta adaptación, sin embargopresentará un aspecto de línea quebrada, tanto más cuantomenor sea el valor de SPLINESEGS empleado, pues los segmentos generados sonrectos. Un mejor resultado desde el punto de vista de su apariencia selograría a partir de dar a la variable SPLINESEGS un valor negativo, eneste caso -2 de manera que la adaptación se hiciera empleando arcos enlugar de segmentos rectos. En este caso se estaría combinando laadaptación tipo "curva-B" (B-spline) que se realiza a partirde segmentos rectos, con un posterior curvamiento del tipo "adaptarcurva" (fit curve) tradicional de AutoCAD, a base de arcos decírculo.

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

Más recomendable para los ficheros existentes, sería utilizaralgún programa que optimizara las curvas adaptadas, eliminando losvértices superfluos. Existen en el mercado varias aplicaciones quecumplen este propósito. La más interesante parece ser laaplicación CURVEFIT de TCI Software. Estaaplicación transforma las polilíneas en "poliarcos"aproximando los mismos a los vértices originales dentro del factor detolerancia fijado por el usuario eliminando aquéllos que no fueranimprescindibles a esta aproximación. Otras utilidades que realizan unadepuración de vértices según determinadosparámetros ajustables por el usuario son WEED(incluido en el paquete de utilidades shareware deJerry WorkmanVECTOR) distribuido por Mountain Software y PFILTER, una utilidad de distribución libre creadapor 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 tipoNURBS. Esta curva se genera como tal, sin necesidad de un amoldamientoposterior, y pasa por todos los vértices que se designen. Es una entidadúnica, no como la polilínea que resulta de unaconcatenación o secuencia de entidades VERTEX individuales, con lo quese logra además un formato mucho más compacto en cuanto a sualmacenaje en disco. Una spline trazada con los mismos vértices que lapolilínea original (y como ella reproducida 100 veces en matriz) dio elsiguiente resultado:

Curva NURBS SPLINE DWG 109.090 bytes

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

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 eldibujo: de 131 en el realizado con splines a 47.431 en el de laspolilíneas adaptadas. También merece atención el hecho deque después de cargado el dibujo, el hecho con splines deja libres 5.6Megabytes de 31.4 totales, mientras que con el de las polilíneasadaptadas se consume prácticamente la totalidad de la RAM, con lo que seempezaría a paginar a disco de inmediato, ralentizando con ello elproceso de trabajo.

La solución ideal para la optimización de estos planosestaría en un programa (AutoLISP o ADS) que, una vez depuradas laspolilíneas (con CURVEFIT, WEED, PFILTER u otro programa similar),creara splines a partir de una lectura de los vértices resultantes, conlo 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ónde los programadores AutoLISP, que vienen a aportar soluciones que en muchoscasos se incorporan a las próximas versiones del programa.

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

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

  • 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 AutoLISP que realiza una conversiónaproximada de una Spline en Polilínea fue publicado hace algúntiempo por VladimirNesterowsky en el foro de discusión comp.cad.autocad. Aúncuando la polilínea que se logra no resulta idéntica al splineoriginal, resulta interesante como ejemplo del procesamiento de entidadesrecurriendo al examen de sus datos de entidad. Que la conversión noresulta sencilla a nivel de programación de usuario, lo demuestra larutina de conversión de B. Stamm y G. Stoykov publicada por AutoDESK ensu colección de documentación técnica on-line,fit_spln.lsp - Converting Splines to Polylines. Esta rutina, mucho menos pretenciosa que la deVladimir, se reduce a marcar puntos sobre la spline mediante el comando DIVIDE,para después unir los puntos con una polilínea de tramoslineales.

Cabría preguntar porqué sería necesario transformar unacurva spline en polilínea. Se me ocurren, al menos, los cuatrosiguientes motivos:

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

El primero de estos problemas seguramente se resolverá en laspróximas versiones de dichas aplicaciones. El segundo sería temapara un programa AutoLISP. Seguramente alguno de vosotros ya lo ha intentado.Si es así tendría mucho gusto en publicarlo. En cuanto al grosorde las entidades, es un tema pendiente para AutoCAD. ¿Hastacuándo, AutoDESK? Mientras tanto puede seguirse gestionando como se hahecho para todas las demás entidades (excepto polilíneas) hastaahora, asignándole un grosor al color en el momento de trazar. En cuantoal ú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 unoque convirtiera una polilínea en spline, pero no mediante laopción EDITPOL (PEDIT) que incrementa el tamaño de la entidadintroduciendo nuevos vértices y que no acierta a pasar por los puntosoriginalmente digitizados. Esta nueva función simplemente podríaleer los vértices originales de la polilínea, descartandoaquéllos que fueran producto del curvado. Con ello reduciríamosen gran medida la dimensión de los ficheros de dibujo que como losplanos topográficos incluyan una gran cantidad de polilíneascurvadas.

La solución que proponemos para ello se encuentra en el ficheroPL2SP.LSP. Los resultados de su aplicación sonimpresionantes. Como prueba hemos utilizado uno de los ficheros de dibujomencionados más arriba: el de las polilíneas adaptadas aB-Spline, B-SPLINE DWG de 1.9 Megabytes, el que llega a reducirse asólo 110 Kbytes. Debo advertir que la reducción no es aparente aprimera vista. Es necesario, una vez ejecutado el programa, comprimir el dibujomediante la orden LIMPIA (PURGE), o salvándolo habiendo establecidopreviamente el valor de la variable ISAVEPERCENT en 0 (cero), oexportándolo mediante BLOQUEDISC (WBLOCK) Los efectos conseguidos puedenverse 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 


LISTADO DEL PROGRAMA

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