Documente Academic
Documente Profesional
Documente Cultură
GRÁFICOS
Como punto principal de este artículo se debe aclarar que aprender a manipular o
editar los gráficos que podamos crear en la calculadora, no significa que ya podamos
crear Interfaces gráficas propias, por ese motivo en la parte final de este artículo se
adjunta una pequeña introducción a ese tema. La manipulación de gráficos representa
un ~25% de los conocimientos necesarios para crear Interfaces.
Variables gráficas
Existen 10 variables de gráfico en HP Prime, los cuales son G0 a G9. G0 es siempre
el gráfico actual de la pantalla, y es G0 a quien debemos modificar para visualizar los
cambios deseados en pantalla, por lo ya descrito no es posible redefinir su
dimensión o alguna acción similar.
Por lo tanto nos queda G1 a G9 para almacenar nuestros gráficos (objetos gráficos
temporales), en inglés se denomina GROB (Graphic Object). Las variables gráficas
pueden llegar a ser términos o elementos confusos para programadores principiantes,
es por ello que podemos compararlos como lienzos invisibles que se encuentran en
la memoria.
En estos lienzos podemos dibujar rectángulos, textos, líneas, arcos y triángulos, al
igual como se hace en G0 (pantalla de la calculadora); estos lienzos se encuentran
en memoria y necesitan ser creados antes de ser usados (inicializados y
dimensionados). También no son visibles, si fueran siempre visibles no aportarían
muchos beneficios, es por ello que debemos recordar que son variables, similar a una
variable con un valor numérico que no es visible hasta mostrarla en Inicio, MSGBOX o
PRINT; en el caso de las variables gráficas las debemos enviar a G0 para poder
visualizarlas (pantalla de la calculadora).
Uso incorrecto
Aunque en Inicio es posible ver a los gráficos insertados en las expresiones creadas,
eso no significa que el gráfico sea parte de ella, solo es una característica de
visualización que adiciona Inicio para los identificadoresgráficos G0-9.
Uso correcto
Los objetos gráficos deben manipularse con comandos de dibujo, es el único medio
que permite acceder a la fuente gráfica a las que hacen referencia sus identificadores.
Para hacer nuestras pruebas en Inicio, usaremos el comando FREEZE, para salir de
la pausa de pantalla presionamos Esc u otra tecla, no podemos presionar Enter por la
razón ya mencionada en la última parte de Consideraciones - 1° Parte. El comando
FREEZE solo congela la pantalla al finalizar el programa, no es útil para Interfaces
gráficas propias.
Si bien es cierto, se puede trabajar directamente sobre G0, no es incoveniente si no
hay necesidad de almacenar los gráficos creados, los gráficos se deben entender
como objetos de almacenamiento al igual que las variables comunes, solo usarlas si
es necesario. Se recomienda eliminar su contenido antes de finalizar el programa,
ya que este no se eliminará hasta apagar la calculadora, por ejemplo con la siguiente
instrucción: DIMGROB(G1,0,0).
Usar gráficos resulta un asunto sencillo, solo es poner sentencias una detrás de otra,
cosa que no representa un reto para el programador; el verdadero reto será al
momento de interactuar con ellos (crear juegos por ejemplo). Algunos comandos
gráficos tienen usos prácticos que resultan muy útiles en ocasiones.
La mayoría de estos usos mostrados estan orientados a un manejo complejo de
gráficos, por lo que es probable que no sean usados (es más solicitado para juegos).
Colores
A menos que se especifique de otra forma, los colores se definen en el formato
#A8R8G8B8 (8 bits para R, G, B y A). El manual recomienda usar la función RGB al
definir los colores con el fin de brindar compatibilidad en dispositivos futuros (la
definición de color puede variar en firmwares futuros, aunque es poco probable).
Variando la intensidad de cada canal de color se logra obtener un gran espectro de
colores; puedes leer más sobre el Modelo de color RGB que se basa en la síntesis
aditiva.
Las mezclas se relacionan con el uso del nivel de opacidad/transparencia, valor que
también varía de 0 a 255 (8 bits - #FFh); no todos los comandos aceptan el canal alfa
al definir colores. Las mezclas realizadas sobre los gráficos se basan en el grado de
superposición de un color de mezcla sobre un color base, esta acción no debe
confundirse como un sistema de color aditivo (como pasa con la combinación de
canales RGB).
Los comandos ARC, TEXTOUT, LINE y TRIANGLE no aceptan el canal alfa (LINE y
TRIANGLE sí lo aceptan en sus formas avanzadas). La creación de GROB's sin fondo
con el comando DIMGROB presenta problemas pero se espera que sea solucionado
en el futuro (reemplazable con un BLIT con exclusión de color).
Otra observación a este ajuste de bits para cada píxel en la calculadora, es que solo
tenemos 1 bit para definir un dato alfa almacenable (color final en un gráfico),
siendo así que muchos comandos no aceptan el canal alfa y simplemente muestran o
no muestra un color (similar a un verdadero y falso). Esto representa claramente
un obstáculo para una combinación avanzada de gráficos, pero son limitaciones a las
que nos debemos ajustar a la hora de programar (el programador se adapta al
dispositivo con el que trabaja).
La función propia Imprimir simula un paso por referencia, esto gracias a cómo son
interpretados las variables gráficas en el código, la forma de acceder a los GROB's
que tienen los comandos de dibujo y por último que las variables gráficas son globales
(accesibles desde cualquier ámbito).
DRAWMENU
Recordando nuevamente que los gráficos son estáticos, debemos sobreentender que
este comando solo nos apoya con el dibujado estándar de menús fiel al tema de la
calculadora. Por lo tanto siempre se ubica en la parte inferior de la pantalla; el dibujo
solo se crea en G0. El comando también permite una lista como único parámetro.
La calculadora tiene esa área definida como la Zona de menú (320x21), área que
responde de forma especial frente al resto de la pantalla ante los gestos táctiles.
Sintaxis
Se definen con la directiva ICON antepuesta al nombre del objeto gráfico seguido del
código hexadecimal. Esta línea de código puede ubicarse en cualquier parte del
programa pero fuera de cualquier función (el código hexadecimal no puede ser
modificado por espacios o saltos de línea).
Para usar estos objetos gráficos usamos sus identificadores en formato de cadenas,
de esta manera es posible usarlos con los comandos de dibujo, excepto con
DIMGROB y SUBGROB.
Objetivo
Esta característica nos permite usar imágenes complejas dentro de un programa (la
idea es enviar imágenes pequeñas); no debe reemplazar el uso de las variables
gráficas integradas (usarlo como destino de los comandos de dibujo), es posible
modificarlos pero tienen más un propósito de origen.
Debemos evitar usar los comandos ISKEYDOWN o GETKEY dentro del mismo bucle,
ya que ocasionan conflictos incluso con los eventos de pantalla, es posible usarlo
dentro de subfunciones que regulen un compartamiento independiente al bucle
principal.
La inserción de gráficos
Como se aprecia en el código anterior, existen instrucciones gráficas fuera del bucle
que crean el gráfico base (gráfico estático que no es necesario redibujar), esto es
igual a una buena práctica de ahorro de recursos, los fondos y gráficos base deben
insertarse o crearse fuera de los bucles, solo pueden ir instrucciones gráficas que
involucren la parte dinámica del programa.
En este ejemplo simple, se simula una interfaz de entrada de datos en celdas, como
se sabe los fondos pueden editarse como el programador lo desee; en este caso nos
enfocamos un poco en la interacción del código para capturar las acciones del
usuario, es posible agregarle más características que mejoren la experiencia del
usuario, pero este ejemplo trata de ser sencillo para servir como un ejemplo base.
Los campos de edición reconocen solo las operaciones básicas, cuando los datos
numéricos van a imprimirse suele usarse STRING para dar el formato deseado puesto
que cada usuario puede tener una configuración distinta. Los valores ingresados
estan controlados por un intervalo de valores y siempre serán enteros por referirse a
coordenadas de píxel. No tiene implementado una característica que limite la escritura
de datos dentro de su campo, por lo tanto cuando se salga del campo habrá dibujos
residuales.
Entendiendo cada comportamiento, es posible definir cualquier tipo de acción ante los
diversos tipos que reconoce la calculadora, ya sea crear una interfaz similar a un
INPUT, una tabla de datos y demás interfaces que se nos puedan ocurrir.
En esta pequeña introducción solo se muestra una de las 2 formas que existen para
crear una interfaz gráfica, la cual es la más útil, simple y recomendada. Si deseas ver
un artículo más completo puedes ingresar a Creando una Interfaz Gráfica.
En resumen y datos finales
Las variables gráficas no se pueden asignar con := o ►, ya que su sistema de edición
o entrada de datos es diferente que los tipos numéricos o cadenas; para manipular
estos objetos debemos usar comandos especiales de dibujo como BLIT,
DIMGROB, LINE, etc.
Para visualizar los gráficos en pantalla, luego de usar un BLIT, necesitamos pausar o
retener el refrescado en pantalla, eso se logra con FREEZE, WAIT o WAIT(-1).
También es posible mediante un bucle debidamente controlado con un WAIT(0.01), el
valor de 0.01 se recomienda para estos casos.
Sin importar el tamaño de las variables gráficas, el punto fijo siempre será el [0,0],
bajo ese fundamento es que podemos interactuar los diversos objetos gráficos con los
comandos de dibujo.
Las variables como Xmin pueden ser manipulados desde un programa, por lo que es
posible usar coordenadas cartesianas en programas si se realiza un adecuado
respaldo y restaurado de sus valores. La desventaja de intentar usar el sistema
cartesiano desde un programa recae sobre la inexistencia de estas variables en
muchas Apps, el efecto es el error al intentar compilar el programa. No es
recomendable intentar usar el sistema cartesiano incorporado al desarrollar
programas, la alternativa es tratar los datos dando la escala y posicionamiento
deseado.
Aclarando otro punto respecto a gráficos, es que las vistas redefinidas no traen
consigo la asignación de títulos (barra superior con hora y batería) como Vista
simbólica NuevaApp o cualquier variación diferente a lo ya conocido sobre interfaces
integradas y el concepto de la variable de gráfico G0 como gráfico estático.
Las coordenadas de píxel son de uso general y para todo tipo de programas, incluído
para el desarrollo de aplicaciones, puesto que se basa en el fundamente general
orientado a la programación para estandarizar y agilizar la creación de gráficos.
"Cada una de estas vistas va acompañada de una vista de configuración que permite
configurar la apariencia de los datos en la vista principal correspondiente. Estas vistas
se denominan Config. simbólica, Config. de gráfico y Configuración numérica. Puede
acceder a ellas pulsando Shift Symb, Shift Plot y Shift Numrespectivamente." -
Ayuda de la calculadora
Conocimientos requeridos
La creación de Apps en la calculadora es el paso casi inmediato tras entender
conceptos básicos para el desarrollo de programas, puesto que son exactamente lo
mismo con la diferencia que se adiciona características de manipulación que mejoran
enormemente la experiencia del usuario. Se necesita comprender lo siguiente para
seguir adecuadamente el hilo de este artículo.
Anidación de funciones
Ámbito de variables
Estructura principal de un programa
Pautas para crear una Interfaz gráfica (opcional)
Comandos dedicados
Crear una nueva aplicaciones es sinónimo de duplicar una App integrada o modificada
, ya sea desde la Biblioteca de aplicaciones o desde el Kit de conectividad; el sistema
nos pedirá un nuevo nombre y la App base con el cual fabricará los nuevos archivos
vinculados/asociados que conformarán el cuerpo de la App. Esta nueva App puede
ser arrastrada desde el Kit de conectividad, lista para ser transferida a otras
calculadoras.
Al tratarse de una copia surge el término "App base", para referirnos a la App de
partida y de la cual profundizaremos más adelante. Debido a que siempre debemos
usar una aplicación base, trae consigo variables y funciones heredadas, vista
simbólica, gráfica y numérica, variables de control de tales vistas como Xmin, Ymin e
incluso la configuración modificada si es que la App base ya contaba con
modificaciones. Si se elige la App base vacía (Ninguno), esta solo heredará la Vista
Configuración Simbólica por defecto y las variables de manipulación de una App
(AAngle, AFormat, ADigits, AFiles, etc).
Definiendo una función llamada Info se logra el mismo efecto mostrado, por ejemplo
mostrando una caja de texto con MSGBOX con el nombre, versión y fecha de nuestra
App.
En la versión FW 11226 y posiblemente en otras versiones, esta redefinición no surge
efecto.
El toque final para redefinir el flujo de nuestra App es definir la función START quien
se ejecutará cada vez que se ingrese a la App mediante la Biblioteca de aplicaciones
o el comando STARTAPP.
El principal objetivo de crear la función START es decidir qué nueva vista se ejecutará
de entre todas nuestras funciones creadas (definir la pantalla inicial de la App). Si
elegimos a la vista simbólica modificada como la primera en mostrarse al iniciar
nuestra App deberemos anidar la función Symb con la función START como es usual.
Otro cometido de esta función es ocultar la vista nativa a la que nos dirije la App base,
para ello usaremos el comando STARTVIEW para iniciar una vista seleccionada al
final de la ejecución del primer ingreso.
Funciones exportadas
Al duplicarse una App, solo se copia una especie de identificador, los datos de
configuración y los datos que contenga, es recomendable restaurar una App antes
de copiarla como base para evitar datos inútiles. No se esta duplicando toda la App
como su codificación, eso es algo que se encuentra integrado en el firmware, se
podría decir que solo se logra copiar una cáscara que reutiliza el código interno de la
App integrada. De acuerdo a lo descrito, el nuevo ícono no se esta duplicando, solo
esta usando el mismo ícono de la App base, los únicos íconos duplicados son los
íconos nuevos (icon.png).
App vacía
Si se elige a la App vacía (Ninguno) como App base, el programador obtendrá una
App limpia para trabajarla desde 0, se asegura de poseer la App base más ligera
respecto al resto, y obviamente no arrastrará variables/funciones residuales que sí
poseen sus compañeras y que posiblemente no nos sean útiles. La App vacía fue
implementada a partir del firmware 2018 01 24 (13333).
Los elementos que conserva este tipo de App para asegurar su correcto
funcionamiento son la vista de Configuración simbólica que toda App requiere poseer
para que el usuario realice sus configuraciones personales, y las variables de
aplicación que permiten al programador manipular la aplicación como AAngle,
AFormat, ADigits, AComplex, AFiles, AFilesB, DelAFiles, ANote, AProgram, AVars y
DelAVars.
La elección
Por último no olvidarnos del menú Vista, redefinirlo por lo menos una vez porque
usualmente la App base trae consigo su propio menú Vista que puede acceder a las
vistas nativas, opción que no sería adecuada. Esto no será necesario si se eligió una
App base adecuada (que originalmente no tiene esta opción).
Depuración
Como una aplicación no se ejecuta igual que los programas, no tenemos forma de
identificar el tipo de error por compilación o ejecución de forma simple, para ello es
recomendable usar funciones externas (un programa aparte), de esa manera se
trabaja tranquilamente sobre el programa externo que al finalizar puede ser fusionado
con la App (permitiendo usar PrimeMom).
Codificar la App no directamente sobre las funciones de las vistas nos facilita crear el
enlace que debe existir entre las vistas, ya que no termineramos la ejecucción del
anidado de funciones pero sí se eliminará toda variable local que ya no utilizaremos
(problema de funciones recursivas), permitiéndonos ejecutar nuevamente las
funciones de forma limpia.
Ícono
Esta funcionalidad resulta ser la más atractiva para los usuarios y programadores
principiantes, de todas formas no debemos subestimar la creación de esta
característica, puesto que muchas veces se requiere de conocimientos muy cercanos
al diseño gráfico para obtener un resultado deseado.
Mejora el acceso
Agregar un ícono representativo (su diseño es un trabajo adicional)
Tiene un flujo continuo de ejecución (como en las Apps integradas)
Una app no retorna valor a través de sus vistas o al iniciarse, las funciones principales
usualmente son locales, por lo que no se puede acceder a ellas sino es con las teclas
Symb, Plot y Num; por eso se aconseja programar la App primero desde un programa
externo para poder detectar los errores de ejecución, al final se podrá acoplar el
código dentro de la App.
Observación
Los beneficios de una App sobre un programa convencional es notorio, sin embargo
crear todo programa como una App es contradictorio a nivel de optimización; es de
acuerdo a la estimación del nivel de importancia y frecuencia de uso de un programa,
que decidimos si es realmente necesario amontonarlo o sobrecargar la Biblioteca de
aplicaciones; debemos evitar la idea de abandonar o dejar de lado el uso del catálogo
de programas.
Las variables como Xmin pueden ser manipulados desde un programa, por lo que es
posible usar coordenadas cartesianas en programas si se realiza un adecuado
respaldo y restaurado de sus valores. La desventaja de intentar usar el sistema
cartesiano desde un programa recae sobre la inexistencia de estas variables en
muchas Apps, el efecto es el error al intentar compilar el programa. No es
recomendable intentar usar el sistema cartesiano incorporado al desarrollar
programas, la alternativa es tratar los datos dando la escala y posicionamiento
deseado.
Aclarando otro punto respecto a gráficos, es que las vistas redefinidas no traen
consigo la asignación de títulos (barra superior con hora y batería) como Vista
simbólica NuevaApp o cualquier variación diferente a lo ya conocido sobre interfaces
integradas y el concepto de la variable de gráfico G0 como gráfico estático.
Las variables de aplicación son públicas, las podemos encontrar desde el cuadro de
herramientas/Aplicaciones/NuevaApp. Se eliminan con DelAVars.
Archivos en HP Prime: AFiles, AFilesB
La gestión de archivos fue implementado a partir del firmware 2015 04 27 (7820)
mediante la adición de las variables de aplicación AFiles, AFilesB y DelAFiles que
como se puede revisar en la ayuda de la calculadora, pueden crear archivos si no
existen, modificarlos, consultar sus bytes y eliminar el archivo especificado.
Gracias a esa implementación se permite crear con facilidad archivos, los cuales se
llenan con datos que provienen de cualquier variable que escojamos, luego estos
archivos pueden ser reutilizados en cualquier momento. Debemos entender como
principio de programación que los programas siempre se ejecutan con los datos
alojados en la memoria RAM (32MB), y los archivos se encuentra en la unidad de
almacenamiento (memoria flash 256MB), por esa razón debemos cargar su contenido
a variables y usar esos datos con normalidad.
Con estas asignaciones hacia nombres de archivos mediante AFiles se logra enviar la
estructura del dato usado por HP Prime, exactamente como la usa la memoria RAM.
La reutilización de estos archivos en HP Prime es fácil gracias a que cada dato incluye
su tipo internamente, por lo que no requerimos de aspectos detallados como
declaración de punteros según el tipo de dato.
La variable AFilesB permite manipular los bytes del archivo, si solo usamos el
nombre del archivo retornará la cantidad de bytes que contiene el archivo (Tamaño de
archivo en bytes). Usando la variable AFilesB podemos inspeccionar los Tipos de
datos: Bytes de estrutura que nos ayudaría a exportar nuestros archivos a otros
sistemas.
Podemos enviar las variables gráficas hacia archivos de imagen; el envío se realiza
respecto al gráfico completo, para crear el archivo de la imagen parcial se puede usar
SUBGROB para ; para crear un archivo PNG usamos AFiles("archivo[.png]"):=G1,
colocar la extensión es opcional puesto que el dato almacenado sigue siendo en
formato PNG.
Para una archivo JPG usamos AFiles("archivo.jpg",[1,100]):=G1 donde opcionalmente
podemos elegir el porcentaje de compresión (1%-15% compresión fuerte, 98%-100%
compresión baja), sino se especifica el porcentaje (calidad) se asume 60. Se
recomienda aplicar un porcentaje de compresión adecuado puesto que la creación de
imágenes desde la calculadora, como capturar la pantalla, puede crear un archivo
notablemente más pesado que si realiza en formato PNG.
Beneficio adicional
Las aplicaciones deben prestar un flujo contínuo y confiable, por esa razón
debemos realizar los preparativos para no tener pérdida de datos tras la recompilación
del código de la aplicación; el código es recompilado al enviar la App a una
calculadora nueva, al dar guardar desde el Kit de conectividad si tenemos abierta la
App, por último cuando se visualiza el código desde el catálogo de programas.
*Los datos de aplicación son todo dato modificable que posee una app integrada
como: la expresión F1 de App Función, definición de un círculo de App Geometría, las
celdas existentes de App Hoja de cálculo, Result de App Inferencia, las listas C1 y C2
de App Var 2 estadística, incluso los datos que aparentan estar vacíos poseen un
valor que los identifica en esa condición. En cuanto a datos de configuración de vistas
tenemos el formato de número, sistema angular, mostrar ejes, rango de ejes o el
nombre del archivo que será usado como fondo en la Vista de gráfico, etc.