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
AutoLISP 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
. 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
. 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
LISTADO DEL PROGRAMA
OTROS DOCUMENTOS SOBRE EL TEMA:
http://xarch.tu-graz.ac...nestr/polyline_vertices