Mostrando entradas con la etiqueta Draw. Mostrar todas las entradas
Mostrando entradas con la etiqueta Draw. Mostrar todas las entradas

miércoles, 10 de diciembre de 2025

Lenguaje

Fonología

PLON-R. Fonología (IV)




En la [entrada anterior] quedó clara la opción de trabajo con el test en su fase input. Esto nos permite diferenciar entre esa fase, ni digitalizada ni informatizada, de las del análisis de datos, aunque si queremos evitar la pérdida de esa información que hemos descrito como de máximo interés, deberíamos proceder a registrarla digitalizada de forma íntegra.


Pero esa es una cuestión que no tiene por qué ocuparnos ahora y que, además, se puede resolver fácilmente con un sistema de recogida de datos basado en Calc, a modo de base de datos, y que no tiene por qué  ser demasiado sofisticado.

Lo que sí puede serlo, por lo que no me resigno a dejarlo pendiente, es desarrollar la opción que rechacé por inconveniente en la entrada precedente y que implica desarrollar lo que la [opción primera] nos ofrece.

Que conste que este paréntesis en el que planteo la automatización del input de PLON-R. Fonología, o si se prefiere de la reformulación de este test con objetivos específicos, que es lo que en realidad trato de desarrollar aquí, es sólo eso, un paréntesis, del cual nos olvidaremos en la entrada siguiente, porque no es en realidad la opción más adecuada. 

No lo es, es cierto, pero sí es la más interesante desde el punto de vista de la automatización de la evaluación. Por eso no me resisto a plantearla ahora para que no quede en el tintero. Y lo haré de un modo sencillo, sin pensar demasiado en lo que exigiría un recurso finalizado y plenamente funcional. Empezando por trabajar ahí donde lo dejamos con el soporte Calc inicial, con todos los ítem de la prueba y sin más pretensión que automatizar la presentación y la puntuación. Y también ahí donde quedó la explicación de la creación de una presentación automatizada sobre Draw (ver entrada). Con estas advertencias quiero decir que no me voy a prodigar en explicaciones que se pueden dar por sabidas. Es una cuestión de economía de tiempos.

Retomo el soporte Calc tal y como lo vimos en [esta entrada]


Añado un módulo al IDE del documento y copio en él el código relevante de la automatización de la presentación. Además copio en una carpeta (img) todas las imágenes que necesito, configurando así el paquete de la documentación necesaria.

Ahora, sobre la hoja realizo las siguientes modificaciones:
  • Reduzco la hoja Portada a lo que muestra esta captura de pantalla. El botón de comando me servirá en su momento para acceder al script principal.

  • Modifico las fórmulas de la identificación de respuesta (SI(E4="";"";SI(E4="1";D4;"Error"))) y de los sumatorios parciales en Fonología para adaptarlas al tipo de dato que introduce el procedimiento de automatización (fórmula CONTAR.SI(E$4:E$24;"1")).
  • Añado una nueva hoja (Matrices) que contiene la estructura matricial de categorización de los ítem de la prueba (sin modificar su contenido). El resultado no es muy diferente al que mostramos al final de la [entrada anterior].



El código OOo Basic del script principal (Acceso) queda modificado como sigue:

Sub Acceso

Dim oHoja As Object
Dim sHoja As String
Dim oCelda As Object
Dim col As String
Dim i As Integer

'Matrices para acceso a datos
Dim mEdad(60) As Integer
Dim edad As Integer
Dim mPal(60) As string
Dim Pal As string
'Matriz para puntuar la prueba
Dim mPtos(60) As String
Dim r As Integer

'Acceso al libro (ThisComponent), y a la hoja (sHoja)

sHoja = "Matrices"
oHoja =ThisComponent.getSheets().getByName(sHoja)

'Acceso al contenidos de las listas

For i = 0 to UBound(mEdad())
'Acceso a los datos de edad
oCelda =  oHoja.getCellRangeByName( "B" & i+1)
edad = oCelda.getValue()
mEdad(i) = edad
'Acceso a los datos Palabras
oCelda =  oHoja.getCellRangeByName( "J" & i+1)
Pal = oCelda.getString()
mPal(i) = Pal
Next

'Muestra imágenes y puntuación de ítem en función de la edad

Dim edad_sujeto As Integer

edad_sujeto = CInt(InputBox("Edad del alumno o alumna (sólo años)"))

For i = 0 To UBound(mEdad())
If mEdad(i) <= edad_sujeto Then
AbrirImagen(mPal(i))
r = MsgBox ("Puntuación del ítem", 4 + 32 , "PLON-R. FONOLOGÍA")
If r = 6 Then
mPtos(i) = "1"
ElseIf r = 7 Then
mPtos(i) = "0"
Else
mPtos(i) = "-"
End If
End If
Next

'Pasar la puntuación a la hoja Fonología

sHoja = "Fonologia"
oHoja =ThisComponent.getSheets().getByName(sHoja)

For i = 0 To UBound(mPtos())
    oCelda =  oHoja.getCellRangeByName( "E" & i+4)
    oCelda.setString(mPtos(i))
Next
End Sub

Al código del script de base se le han añadido los siguientes componentes:
  • Una nueva matriz para recoger las puntuaciones (Dim mPtos(60) As String)
  • Un procedimiento de puntuación basado en MsgBox() en  el bucle que recorre las imágenes que se muestran al alumno:
r = MsgBox ("Puntuación del ítem", 4 + 32 , "PLON-R. FONOLOGÍA")
         If r = 6 Then
mPtos(i) = "1"
    ElseIf r = 7 Then
mPtos(i) = "0"
    Else
mPtos(i) = "-"
        End If
  • Y, al final del script, un procedimiento para acceder a la hoja Fonología y para pasar la puntuación de cada ítem a las celdas de la columna E, este último basado en un bucle (For i = 0 To UBound(mPtos())).
Además he modificado la ruta absoluta que da acceso a la colección de imágenes en la subrutina AbrirImagen() para adaptarla al actual posicionamiento de las imágenes (sDocum = "D:/Docap/Presenta_PLONR/img/" & img &".png")

Materiales.

Entre otras posibilidades de cambio, pero esta no como opción, debes incluir una carpeta (img) en la que incluir las imágenes asociadas a las palabras del test. También puedes aumentar el tiempo en que se muestra la imagen (ahora wait 1000) y realizar todas las modificaciones del código que consideres pertinentes. Yo por mi parte cumplo dejándote [acceso a este documento].

domingo, 7 de diciembre de 2025

MAV. OOo Basic


Presentación de secuencias de imágenes





Podemos realizar presentaciones de forma totalmente automatizada sin necesidad de crearlas previamente, con imágenes adaptadas al cumplimiento de determinadas condiciones. De este modo es posible automatizar la presentación del input, ajustándolo a necesidades específicas y cambiantes.


Está mal que utilice el icono de Impress para ilustrar el ítem de la entrada, ya que precisamente no es éste el servicio al que se accede (por cierto que por defecto). Tampoco se trata de presentaciones en sentido estricto, aunque se puede simular el funcionamiento básico de una presentación sencilla.

En realidad el servicio que se abre por defecto es Draw, ya que es éste el que en LibreOffice está asociado a los formatos más comunes de imágenes, de modo que, al cargar una imagen lo que sucede es que el sistema de LibreOffice recurre al servicio que tiene disponible.

Pero realmente esto no es lo importante. Sí lo es la utilidad que tiene este procedimiento y su versatilidad para adaptar el contenido (gráfico) del ítem que podemos presentar. No sólo no necesitamos tener preparada una determinada presentación, es que podemos adaptarla de forma automatizada (e interactiva) de acuerdo con las condiciones que deseemos, siempre que, claro está, hayamos organizado convenientemente los materiales gráficos.

Como siempre es mejor explicar sobre la base de un proyecto concreto, en este caso lo voy a hacer sobre el que me ha llevado hasta aquí, aunque ahora tome un breve desvío: la automatización de la presentación de las imágenes del test PLON-R Fonología.

Para simplificar me limito a una cuestión de base en este test: los ítem de trabajo estén en función de la edad del niño, aunque de forma acumulativa. Me explico: a los niños de tres años se les aplican los ítem de su grupo de edad, a los de cuatro los ítem de tres y los ítem de cuatro años, y así sucesivamente hasta llegar a los seis años, edad máxima de la batería PLON-R.

Realmente el procedimiento que estoy desarrollando en relación con ese test es más complejo y diferente en cuanto a prioridades, pero lo que aquí te presento ha surgido a raíz de ese trabajo, motivo por el que será ese nuestro actual contexto: generar presentaciones de imágenes en función de la edad del sujeto.

Se trata, en realidad, de una especie de simulacro (en miniatura) de aplicación de un test de Fonología, ya que no es posible utilizar las mismas imágenes y no tengo ningún interés en sobrecargar el trabajo con una extensa lista de imágenes. Pero estas limitaciones no suponen ninguna merma para la potencialidad de la propuesta.

Empezaré por describir los soportes: una hoja de cálculo como gestor, que incluyen el listado de componentes (hoja Listados) y el código, y una carpeta que contiene las imágenes que vamos a emplear, exactamente 15 imágenes, a razón de 5 por grupo de edad (3, 5 y años).


Aunque, lo verdaderamente interesante está oculto en el IDE de plon_lista.ods, también es importante el listado de edades y de palabras, ya que a ellos se acude para acceder a los contenidos. Este acceso se realiza desde código, ubicado con el IDE tal y como muestra la imagen que precede, concretamente en sus dos módulos (Edad y cargarImg).

El primero, el fundamental, contiene un único script (AccesoPorEdad) que es el que tienes que activar para que funciones el conjunto. En cargarImg se encuentran los auxiliares que hacen posible la carga de las imágenes: una subrutina (AbrirImagen) y una función (AbrirImg): la primera es llamada desde el script y la segunda desde la subrutina. Veamos primero el script.

Sub AccesoPorEdad

Dim oHoja As Object
Dim sHoja As String
Dim oCelda As Object
Dim col As String
Dim i As Integer

'Matrices para acceso a datos (EDAD y PALABRAS)
Dim mEdad(14) As Integer
Dim edad As Integer
Dim mPal(14) As string
Dim Pal As string
 
'Acceso al libro (ThisComponent), y a la hoja (sHoja)

sHoja = "Listados"
oHoja =ThisComponent.getSheets().getByName(sHoja)

'Acceso al contenidos de las listas

For i = 0 to UBound(mEdad())
'Acceso a los datos de edad
oCelda =  oHoja.getCellRangeByName( "A" & i+1)
edad = oCelda.getValue()
mEdad(i) = edad
'Acceso a los datos Palabras
oCelda =  oHoja.getCellRangeByName( "B" & i+1)
Pal = oCelda.getString()
mPal(i) = Pal
Next

'Muestra de elementos (palabras) en función de la edad

Dim edad_sujeto As Integer

edad_sujeto = CInt(InputBox("Edad del alumno/alumna (sólo LOS años)"))

For i = 0 To UBound(mEdad())
If mEdad(i) <= edad_sujeto Then
AbrirImagen(mPal(i)) 'Llamada a subrutina
End If
Next

End Sub
Tras acceder al libro y a la hoja que contiene las tablas (oHoja =ThisComponent.getSheets().getByName(sHoja)), mediante un bucle (For i = 0 to UBound(mEdad())) accedemos al contenido de las listas (esto es, a las celdas) para pasar los datos a sendas matrices (Dim mEdad(14) As Integer Dim mPal(14) As string), mediante un procedimiento sencillo y repetitivo pero muy útil, que se realiza en tres pasos:
  • Acceso a celda: oCelda =  oHoja.getCellRangeByName( "A" & i+1)
  • Asignar el contenido de la celda a variable: edad = oCelda.getValue()
  • Y paso del contenido de la variable a la matriz: mEdad(i) = edad
Una vez que ya hemos pasado los datos a las matrices toca el turno de establecer la condición que va a determinar la segunda parte del procedimiento (la carga de las imágenes).

En este caso, lo que determina la condición en la edad del alumno, así que la solicitamos al usuario (edad_sujeto = CInt(InputBox("Edad del alumno/alumna (sólo LOS años)"))).

Con este dato disponible iniciamos un segundo bucle (For i = 0 To UBound(mEdad())) que va a llamar reiteradamente a la subrutina (AbrirImagen(mPal(i))) pasando como parámetro el nombre de la imagen (siempre que se cumpla el criterio establecido (la edad, menor o igual) mediante un condicional (If mEdad(i) <= edad_sujeto Then)

Lo que sucede a continuación es responsabilidad de la subrutina y de la función a la que ésta llama, pero está todo ello presidido por el cumplimiento de la condición que establecemos en el script y en la reiteración de ese proceso mientras se cumpla esa condición. Veamos esos auxiliares:

Sub AbrirImagen(img as String)
Dim sDocum As String
sDocum = "D:/Docap/presenta_plon/img/" & img &".png"
AbrirImg(sDocum) 'Llama a la función
End Sub
La subrutina se encarga de establecer la ruta absoluta en la que se encuentra la imagen (en este caso un directorio de un soporte externo de memoria: sDocum = "D:/Docap/presenta_plon/img/" & img &".png") y de llamar a la función que se encarga de cargar la imagen cuyo identificador hemos pasados desde el listado.

Function AbrirImg(cRuta As String,Optional aOpciones()) As Object
Dim oDocumento As Object
cRuta = ConvertToURL(cRuta)
If IsMissing (aOpciones) Then aOpciones = Array()
              AbrirCualquierDoc = StarDesktop.LoadComponentFromURL(cRuta,"_blank",0, aOpciones())
      oDocumento = AbrirCualquierDoc  
wait 1000
oDocumento.close(True)

End Function
El correcto funcionamiento de este conjunto depende del escrupuloso respeto del código de esta función, así que debes copiarla tal cual, a excepción del tiempo de espera (wait 1000) que puedes no establecer o hacerlo de mayor o menor duración, y del cierre de los documentos Draw  que se van abriendo y que mediante esta instrucción (oDocumento = AbrirCualquierDoc -> oDocumento.close(True)), que también puedes omitir, se cierran automáticamente transcurrido el tiempo establecido.

Documentos. Este [archivo comprimido] contiene el DocAp, incluyendo la carpeta de imágenes. Recuerda que si lo guardas en otra estructura de carpetas debes adaptar la instrucción correspondiente (subrutina AbrirImagen() instrucción asociada a sDocum).