| MetaCard y Revolution: Herramientas de autor multiplataforma para multimedia | ||
|---|---|---|
| Anterior | Capítulo 9. Imágenes y gráficos | Siguiente |
Què t'agradaria fer?
Algo com Figura 9-9:
Base de datos de imágenes: introducción a la recuperació por contenido de información visuagl.
Se trata de desarrollar un interfaz que permita la interacción con programas externos para selecciónar una image (o una parte de la misma) y buscar a partir de esta selección en una base de datos de imágenes las que sean similares. El resultado de esta búsqueda es la visualización de las imágenes que han respondido satisfactoriamente a la consulta ordenadas por un criterio de similitud.
Elaborar un sencillo interfaz que permita explorar las posibilidades de seleccionar la imagen de partida y una parte de la misma mediante una banda de goma (rubberband) o la imagen al completo (la opción por defecto). La pila proporciona un mecanismo para cargar un fichero de disco (debería ser también una URL) y a partir de la visualización de esta permite escoger un rectángulo de la misma o, si no se indica tal, la toma al completo. Además deberá hacer uso de un programa externo para recortar el trozo de interés en el caso oportuno.
Figura 9-11. Recuperando información de una base de datos de imágenes.

/*
La pila
*/
on openCard
put the directory into field "directoriDeTreball"
set itemDelimiter to "/"
delete last item of field "directoriDeTreball"
delete last character of field "directoriDeTreball"
end openCard
/*
Control: image gImatgeOriginal
*/
on mouseEnter
set the cursor to cross
set the lockCursor to true
end mouseEnter
on mouseLeave
set the cursor to hand
send "bandaInactiva" to graphic "bandaElastica"
end mouseLeave
on mouseDown
send "bandaActiva" to graphic "bandaElastica"
end mouseDown
on mouseUp
send "bandaInactiva" to graphic "bandaElastica"
-- export paint to file "retall"
send "mostraImatge" to image "mostra"
end mouseUp
on mouseMove x, y
send ("actualitzaBanda " & x & "," & y) to graphic "bandaElastica"
end mouseMove
/*
Control: image "mostra"
*/
on mostraImatge
# Hi ha que donar-li temps
send "mouseUp" to me in 250 milliseconds
end mostraImatge
on mouseUp
set the filename of me to empty
set the filename of me to (the field "directoriDeTreball" & "/" &"retall")
put (the field "directoriDeTreball" & "/"& "retall")
end mouseUp
/*
Control: button bAbrir
*/
on mouseUp
answer file "Tria un fitxer" with filter "*.*"
if it is not empty
then set the fileName of the image "gImatgeOriginal" to it
end mouseUp
/*
Control: graphic bandaElastica
*/
local x0, y0, \
x1, y1, estesNoFanFaltaPerAraComprobahhoooo,\
seguintLaBandaElastica
on bandaActiva
put the first item of the mouseLoc into x0
put the second item of the mouseLoc into y0
set the rectangle of me to x0,y0,x0,y0
put true into seguintLaBandaElastica
end bandaActiva
on bandaInactiva
put false into seguintLaBandaElastica
put shell( "pnmcut" && \
the first item of the rect of me - the first item of the rect of image "gImatgeOriginal" && \
the second item of the rect of me - the second item of the rect of image "gImatgeOriginal" && \
the third item of the rect of me - the first item of the rect of me && \
the fourth item of the rect of me - the second item of the rect of me && \
the filename of image "gImatgeOriginal" && "> " &\
the field "directoriDeTreball" & "/"& "retall") into it
if the result is 0 then send "mostraImatge" to image "mostra"
end bandaInactiva
on actualitzaBanda x, y
if (seguintLaBandaElastica) then \
set the rectangle of graphic "bandaElastica" to \
x0,y0,\
min( the third item of the rect of image "gImatgeOriginal", x), \
min( the fourth item of the rect of image "gImatgeOriginal", y )
end actualitzaBanda
En esta parte el objetivo es poner en marcha el interfaz que va a permitir la interacción con el usuario, así como con las aplicaciones a ejecutar para llevar a cabo los procesos "específicos" a los que da un entorno integrador la aplicación en MetaCard. Las acciones del usuario se llevaran a cabo mediante la selección de la parte de la imagen descrita en el apartado anterior y mediante el uso del menú. Por su parte, queda por exponer el mecanismo de llamada a la aplicación externa encarga de realizar un proceso dentro de la tarea global para la cual estamos creando el interfaz.
Para la creación del menú se ha utilizado la herramienta que acompaña a la barra de menú de MetaCard: Tools|Menu Builder.... Desde esta se puede crear de una forma cómoda el mismo. A este se le han hecho un par de modificaciones:
Mantener la funcionalidad de ajustarse al tamaño de la ventana, implicando para ello a la tarjeta que es la que recibe el evento correspondiente.
Eliminar el código inicial de generación de eventos o llamadas dentro de los botones del menú y reconvirtiéndolos a llamadas a botones que se crearan en la propia tarjeta conforme se necesiten las opciones del menú y que se habrán de ocultar cuando finalice el proceso de desarrollo.
Las aplicaciones que realizan las actividades de análisis de imágenes se han implementado mediante programas, haciendo así el papel de aplicaciones externas. La salida de estas deber permitir realizar los subsecuentes análisis y tomar las decisiones. En este punto es donde, de nuevo, entra en juego el interfaz que estamos desarrollando. Puesto que podemos hacer uso de la sencilla comunicación que permite ejecutar aplicaciones mediante las órdenes shell o launch y obtener los resultados en forma de texto que la ejecución de estas deja en la salida estándar.
Para facilitar la programación desde MetaCard con la versión del Starter Kit así como la depuración de errores utilizaremos campos de texto como contenedores de esa información que se obtenga. Después sólo habrá que analizar el texto cuyo formateado habrá sido elaborado con esa intención, ya que en este caso hemos programado tales ejecutables para facilitar este paso.
Figura 9-12. Elementos de comunicación con el usuario y las aplicaciones externa."Para't, para't!".

-- button "analizar"
on mouseUp
set the lockCursor to false
set cursor to busy
#Executa l'analisis
put shell( field "analitzaor" && mostra.ppm) into field "resultatAnalisi"
end mouseUp
Aprovecho que hemos abordado la cuestión de la versión de MetaCard para justificar la decisión que se ha tomado para implementar los eventos asociados a los menús.
Figura 9-13. Menú de la aplicación
-- En la tarjeta
on resizeStack
send "resizeStack" to group "menuGroup"
end resizeStack
-- En el grupo 'menuGroup'
on resizeStack
set the lockLocation of me to true
set the width of me to the width of this card
set the width of button "menuButton" of me to the width of me - 6
set the left of button "menuButton" of me to 4
set the right of button "Ajuda" of me to the right of me - 4
-- pass resizeStack
end resizeStack
-- Botón Ajuda
on menuPick which
send "mouseUp" to button which
#switch which
#case "Help..."
# break
#case "About..."
# break
#end switch
end menuPick
En esta tercera parte nos vamos a centrar en cómo se puede implementar un mecanismo que permita interrumpir un proceso prolongado. En este caso, se refiere a las acciones propias de extracción de información de la BD de imágenes y a la secuencia de presentación de resultados.
Figura 9-14. Mecanismo de parada asíncrona: botón "Para't, para't!".

global gInterrumpeixUsuari, timerID
on mouseUp
put "true" into gInterrumpeixUsuari
cancel timerID
hide scrollBar "barraEstatProgres" of group "barraEstat"
put empty into field "barraEstatMensatges" of group "barraEstat"
#Deixem-ho preparat per a la proxima
put "false" into gInterrumpeixUsuari
end mouseUp