HighCharts. Exportar imagen offline

Gracias Paco por la atención prestada, lo que me desorienta de tu ejemplo, es que en la ayuda, en la seccion que explicas el diseño del ejercicio, cuando explicas el proceso haces referencia a la utilización de una variable local EVENT_PARAMS y analizando tu código tanto de la Plantilla HTML como del manejador de evento en javascript no aparece en ninguna parte la referencia a esa variable local.

el texto en la ayuda es este:
“4.Mediante un evento click() de javascript enviamos el string base64 a Velneo donde es capturado por la variable local EVENT_PARAMS[1].”

Como bien te dice Paco te falta un parentesis
if (oImage.loadFromData(oByteArray, “JPEG”)) {

Y lo del EVENT_PARAMS[1] esta aqui todo
https://velneo.es/info_v7_719_es/velneo_vdevelop/proyectos_objetos_y_editores/variable_local/variables_locales_especiales/

GraCIAS por responder tecnico, entendi lo de EVENT_PARAMS[1] (DE LO CUAL NO TENIA IDEA), veo entonces que lo que me esta faltando, según la ayuda del documento de paco es un evento click() de javascript para enviar el string base64 a Velneo donde es capturado por la variable local EVENT_PARAMS[1]. delo cual TAMPOCO tengo IDEA de como hacerlo (por lo de javascript),

Mirate este link en el foro

https://velneo.es/foros/topic/enlazar-velneo-con-html/

Gracias Técnico Nuevamente, era lo que me faltaba… ahora funciona perfectamente… en mi caso faltaba esta parte:

// Atrapamos todos los clics en enlaces del control visor html
menu = theRoot.dataView().control( “CONTROL” );
menu.setLinkDelegationPolicy( VCWebView.DelegateAllLinks );

la cual es un manejador de evento en javasript, del formulario que contiene el control HTML asociado a un evento botón pulsado de ese control HTML,

y otro manejador de evento que cargue el contenido de EVENT-PARAMS[1] a la variable CHREF_LINK asociado al evento LinK clicked del control html y que el mismo manejador llame al manejador de vento Guardar Imagen… Ha y por supuesto definir la variable reservada especial EVENT_PARAMS, de tipo texto , array de 1 dimensión… Todo lo demás lo resuelve el código de Paco

Todo esto lo aclaro por si lee este post otro dummie como yo!

Un gran agradecimeinto a Paco y a Técnico ya que sin sus aporte y guía… los Analfabetos en programacion como yo no tendrían oprtunidad!!

Hola paco que tal, tengo una pregunta para ti quien fue el que desarrollo la idea, en mi caso yo envio dos variables con contenidos html por separado para mostrar dos graficas distintas pero con los mismo datos, como se muestran en las imagenes, lei toda la documentacion acerca de este ejercicio y en uno de los comentarios dices que cada vez que se le asigne un nuevo contenido html al visor se ejecute el codigo del API que por alli colocastes una vez, en mi caso tengo dos botonos de izq y der, para cambiar el tipo de grafica y en efecto cada vez que se cambia el contenido html del visor ejecuto ese manejador de evento.

Para la grafica que contiene no solo las lineas sino el efecto de sombreado el boton de JPEG ejecuta la funcion exportar pero no realiza el evento click() que es necesario para extrar la url con el contenido base64, caso contrario pasa con la primera grafica que a ella si puedo dar el alta extrayendo su contenido, es algo raro de verdad, porque cada grafica posee una leyenda y si clickeo sobre ella se oculta su contenido en la grafica y para el caso de la grafica con sombreado si oculto su contenido hay si me extrae el url en bae64, obviamente sale en blanco porque se le oculta su contenido.

De verdad no se cual es error.

Hola osuna.

Creo recordar que cuando estaba haciendo mis primeras pruebas había problemas con los gráficos que tenían fondos semitransparentes.
Quizás era un problema de incompatibilidad del Visor HTML con SVG.

Haz una prueba poniendo los 2 fondos con colores planos, sin transaparencia.

Si no se arregla puedo intentar echar un vistazo al código HTML (adjúntalo al mensaje).

Saludos
Paco Satué

La verdad no entendi a lo que haces referencia, comparto el codigo HTML de la segunda grafica que es la que no realiza la funcion:

“<html>
<head>
<title>
Chart
</title>
<meta http-equiv=‘Content-Type’ content=‘text/html; charset=utf-8’>
<link rel=‘stylesheet’ href=‘https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css’>
<script src='file:///”+sysCacheClientPath+"/canvg.js’></script>
<script src=‘file:///"+sysCacheClientPath+"/rgbcolor.js’></script>
<script src=‘file:///"+sysCacheClientPath+"/jquery.min.js’></script>
<script src=‘file:///"+sysCacheClientPath+"/bootstrap.min.js’></script>
<script src=‘file:///"+sysCacheClientPath+"/jquery-1.9.1.js’ type=‘text/javascript’></script>
<script src=‘file:///"+sysCacheClientPath+"/highcharts.js’ type=‘text/javascript’></script>
<script src=‘http://code.highcharts.com/modules/exporting.js’></script>
<script type=‘text/javascript’>
$(function () {
Highcharts.setOptions({
// Opciones del gráfico para la exportación
// Se tienen en cuenta en la función getSVGForExport
lang: {
contextButtonTitle: ‘Exportar gráfico a Velneo’
},
chart: {
// Espacio para que quepa el botón de exportar
spacing: [10, 10, 10, 60],
borderWidth: 0
},
exporting: {
chartOptions: {
// chart: {backgroundColor: ‘transparent’},
chart: {
backgroundColor: ‘white’,
spacing: [10, 10, 15, 10],
borderWidth: 0,
width: 600,
height: 400
},
plotOptions: {
series: {
dataLabels: {
enabled: false
}
}
}
},
// Hacemos que el Botón contextual ejecute directamente la Exportación
buttons: {
contextButton: {
menuItems: null,
onclick: function () {
exportar();
},
text: ‘JPEG’,
verticalAlign: ‘bottom’,
align: ‘left’,
height: 20,
x: -60,
y: 0,
symbol: ‘triangle-down’,
symbolStroke: ‘DarkRed’,
symbolFill: ‘DarkSalmon’,
symbolStrokeWidth: 2,
symbolSize: 14,
symbolX: 16,
symbolY: 14,
theme: {
‘stroke-width’: 1,
stroke: ‘silver’,
fill: ‘WhiteSmoke’,
r: 4,
states: {
hover: {
fill: ‘Orange’
}
}
}
}
}
},
credits: {
enabled: false
}
});
});
$(function() {
$(’#container’).highcharts({
chart: {
type: ‘area’
},
credits: {
enabled: true
},
title: {
text: ‘Relación Tiempos - Tickets’,
x: -20 //center
},
yAxis: { title: { text: ‘Numeros’ } },
xAxis: { categories: ["+MES+"] },
tooltip: { pointFormat: ‘{series.name} producidpos <b>{point.y:,.0f}</b>’},
legend: { layout: ‘vertical’, align: ‘right’, verticalAlign: ‘middle’ },
plotOptions: {
area: {
marker: {
dataLabels: { enabled: true },
enableMouseTracking: true
}
}
},
series:
[
{
name: ‘Tiempos’,
data: ["+TIME+"]
},
{
name: ‘Tickets’,
data: ["+TIKC+"]
}
]
});
});
</script>
<script type=‘text/javascript’>
function exportar() {
var chart = $(’#container’).highcharts();
// svg = chart.getSVG()
svg = chart.getSVGForExport()
var chartWidth = chart.options.exporting.chartOptions.chart.width
var chartHeight = chart.options.exporting.chartOptions.chart.height
var nRelacion = chartHeight / chartWidth;
// Creamos un elemento Canvas o usamos uno ya existente
// var canvas = document.getElementById(‘canvas’)
// canvas.style.display=‘none’;
var canvas = document.createElement(‘canvas’)
canvas.width = 1200;
canvas.height = canvas.width * nRelacion;
canvg(canvas, svg, {
ignoreDimensions: true,
scaleWidth: canvas.width,
scaleHeight: canvas.height
});
var a = document.createElement(‘a’);
a.href = canvas.toDataURL(‘image/jpeg’,1);
a.click();
}
</script>
</head>
<body>


</body>
</html>"

Saludos.

El comentario anterior no se ve ordenado el codigo, espero que la imagen lo deje claro.

Hola osuna.

Envíame en un fichero adjunto el código HTML final que muestras en el Visor (opción Ver código fuente de la barra de herramientas).

Saludos
Paco Satué

Hola paco, gracias por la atencion, aqui adjunto el archivo html

.

Me toco compartir por dropbox:

https://www.dropbox.com/s/d8a3gu3g43rmb7c/Grafica3.html?dl=0

Si no pueden descargar el archivo aqui esta este:

https://www.dropbox.com/s/ay5ensl3j9zgqlt/Grafica3.txt?dl=0

Saludos

Hola osuna.

En la aplicación de ejercicios (vatp://pruebas:pruebas@v7cloud6.velneo.com:8894/0PS_Varios_iapp) he colocado tu código y funciona perfectamente sin tocar nada. Está en el apartado del Editor de Código HTML, en la rama Gráfico HighCharts.

Verás que la pulsación del Botón <Exportar> funciona perfectamente. He sustituido la línea a.click() por window.location.href = a.href para que veas el resultado en el Visor HTML.

Saludos
Paco Satué

Hola paco que tal, esto se me ha vuelto engorroso, imagino que el contenido de tu visor html es la direccion url del archivo alojado en la cacherun, de no ser asi que rabia, porque si a ese visor le envias una variable como parametro cuyo contenido es tooooodo el codigo que alli se encuentra no entiendo porque si te funciona y en mi caso no.

Yo simplemente tomo los datos que tengo en una rejilla y los proceso para extraer los valores que necesito para armar mi grafica, y en una variable alfabetica tengo todo mi codigo html y le concateno esos valores, creo el manejador de objeto(el formulario que tiene el visor), le asigno la variable CHTML, disparo el objeto y ya el formulario me presenta la grafica sin nungun problema, pero desde alli para ese tipo de gráfica no funciona esa funcion Exportar… obviamente cambie la conexión de evento que no fuese link clicked sino URLchanged por la modificacion que hiciste en la linea de la funcion pero igual no funciona.

Saludos

Hola osuna.

Tranquilo, te puedo asegurar que los ejercicios llevan muchas horas de “prueba y error” y de acordarme de las pocas herramientas avanzadas que tenemos en Velneo para torear con estos problemas.

En mi Visor HTML el proceso es el mismo que tú usas, es decir, asigno el código HTML al Visor mediante la función setSourceCode().

De todas formas poco tiene que ver eso porque el gráfico se pinta bien. Dices que donde falla es al ejecutar la función exportar().
Como ves, el código HTML que me has enviado funciona perfectamente.

  • De todas formas ¿Me has enviado exactamente el código HTML que te está fallando? Ten en cuenta que a veces una coma mal puesta echa al traste todo el resultado. También en el código que me has enviado hay un cierto caos con las librerías que usas.
  • Te adjunto las librerías con las que funciona bien el gráfico. Puede ser que estés usando una librería más moderna de highcharts y tenga problemas al renderizar este tipo de gráfico en el canvas. Ya te dije que los gráficos con colores semitransparentes pueden dar problemas.

Tienes que entender que lo que se muestra en el Visor es código SVG y lo que envías a Velneo para imprimir es un gráfico rasterizado como una imagen. La función canvg() es la que transforma el SVG en imagen y ahí puede estar el fallo con ese tipo concreto de gráfico que tiene colores con transparencias.

Saludos
Paco Satué

lib-highcharts.zip (113 KB)

'-_-

Mil Gracias paco, con estas librerías si funciona correctamente.

Saludos