Bug en la librería PlotKit de TurboGears (bueno, vale, es una personalización :P)

Programació, Python, TurboGears 2 Comentaris »

(standard disclaimer: si, hace más de un año que no escribo, y vuelvo en castellano!)

Hoy he tenido una pelea con la librerí­a de PlotKit para TurboGears, ya que ignoraba los comandos para personalizar el color y el grueso de las líneas de los gráficos, tanto los gráficos de barras como los de pastel.

Gracias al software libre (¡¡bien bien bien!!) he destripado la libreria para ver exactamente porqué no me hacía caso.

La explicación es sencilla. La forma más fácil de dibujar gráficos des de TurboGears es con el wrapper EasyPlot, que por defecto utiliza gráficos SweetCanvasRenderer (aunque en la web diga que utilizan el CanvasRenderer(¿?¿?)). El problema es que este tipo de gráficos, para que queden muy muy monos, se les fija el color y el grueso de la línea (tal como explican en el enlace anterior).

Qué hacer? Se tienen que modificar el código fuente para indicarle que en vez de fijar el color de línea a blanco, lo lea de las opciones de PlotKit.

Para solucionarlo se tiene que modificar el código fuente del .egg descargado por TurboGears:

  1. Ir a la carpeta /Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/site-packages/ y descomprimir el fichero PlotKit-0.9.1w3-py2.5.egg.zip. Al descomprimirlo conseguimos que TurboGears lea las dependencias desde la carpeta en lugar del zip. (La ruta es en un MacOSX Leopard).
  2. Dentro de la carpeta tendremos que editar el fichero PlotKit-0.9.1w3-py2.5.egg/plotkit/static/javascript/SweetCanvas.js, para corregir el código, aunque realmente para que funcione se tiene que modificar el fichero PlotKit-0.9.1w3-py2.5.egg/plotkit/static/javascript/Plotkit_Packed.js. Este fichero contiene todos los otros de forma optimizada para su ejecución, es el que realmente se utiliza para la generación de el gráfico.
  3. En la línea 1814 y 1815 del fichero Plotkit_Packed.js debíamos tener:
    _342.lineWidth=2;
    _342.strokeStyle=Color.whiteColor().toRGBString();

    Que deberemos cambiar por estas:

    if(this.options.strokeWidth){
     _342.lineWidth=this.options.strokeWidth;
     }else{
     _342.lineWidth=2;
     }
     if(this.options.strokeColor){
     _342.strokeStyle=this.options.strokeColor.toRGBString();
     }else{
     _342.strokeStyle=Color.whiteColor().toRGBString();
     }

Ahora, en vez de fijar los valores internamente, comprobará si han sido configurados por el desarrollador, y si así es, utilizará esos valores para dibujar nuestro anhelado gráfico.

WP Theme & Icons by N.Design Studio
Entries RSS Comments RSS Log in