• Embeber en un blog

    La edición de artículos en un blog suele apoyarse en un editor que permite introducir los textos, gráficos, vídeos, etc. Ese editor suele presentar dos modos de edición uno visual y otro tipo texto.

    Editor de artículos en un blog

    Editor de artículos en un blog

    Para poder embeber una escena en un artículo de un blog es necesario incluir el código de la misma en el modo de edición texto. Seleccionada esta opción basta pegar el código de la escena en la posición deseada, comprobando que la llamada al intérprete está incluida y el parámetro «docBase» si la escena usa imágenes, macros y/o ficheros.

    Copiar el código de una escena en un blog

    Copiar el código de una escena en un blog

    Al previsualizar o publicar el artículo podrá observar e interactuar con la escena embebida.

    La escena que puede ver en el artículo https://descartesjs.org/documentacion/?p=2051 de esta documentación, la cual tiene como soporte un blog, está embebida siguiendo estas indicaciones.

    Nota: Hay determinadas herramientas o servicios en las que el administrador puede incluir filtros o limitaciones a la hora de embeber código. Si no le funciona este procedimiento, cersiórese que el código que ha copiado no ha sido borrado por algún filtro de este tipo, para ello basta que vuelva a editar y compruebe que el código sigue ahí y que no ha sido cambiado. Si no estuviera o hubiera sido cambiado tendrá que ponerse en contacto con el administrador de su servicio para que cambie ese filtro.

  • Aplicaciones de la comunicación para integrar cálculo simbólico en Descartes

    En este artículo se describe como interactuar con aplicaciones Geogebra desde Descartes aprovechando la comunicación escena-html y la posibilidad de comunicación javascript con los applets de Geogebra. Para ello basta realizar los tres pasos siguientes:

    1. Enviar el comando considerado desde Descartes a una página html que contiene el applet Geogebra.
    2. Enviar este comando de la página html al applet Geogebra y obtener por la página html su resultado.
    3. Enviar el resultado desde la página html a la escena Descartes.

    Para el paso 1 y 3 se requiere que la escena «madre» incluya un espacio HTMLIframe que permita embeber la página html contenedora del applet Geogebra (ver artículo comunicación de una escena con el html embebido en un HTMLframe).

    Para el paso 3 se utiliza el método evalCommandCAS(string) que envía el comando a ejecutar por el CAS de Geogebra en un string y devuelve su resultado también en una cadena de caracteres.

    Para más información sobre los métodos que se pueden utilizar para interactuar con Geogebra mediante programación javascript se puede consultar la página siguiente: https://wiki.geogebra.org/en/Reference:JavaScript.

    El siguiente modelo muestra un ejemplo en el que se envía un comando cuyo resultado es utilizado por la escena Descartes. En concreto, dada una función, se obtiene su derivada e integral definida en un intervalo considerado además de obtener la circunferencia que pasa por tres puntos.

    (Puede descargar esta escena desde este enlace)

    A continuación se presenta la documentación que explica cómo se puede modificar esta escena.

    Con el siguiente modelo se puede ver cómo almacenar en un vector de Descartes el resultado de aquellos comandos que Geogebra da como resultado una lista. En el ejemplo se obtiene los puntos de corte de dos curvas.

    (Puede descargar esta escena desde aquí)

    A continuación se presenta la documentación que explica cómo se puede modificar la escena.

    El siguiente modelo muestra cómo obtener en una matriz Descartes los valores que Geogebra devuelve como una lista de listas. En el ejemplo se calcula la matriz traspuesta de una matriz 3×3.

    (Puede descargar esta escena desde este enlace)

    A continuación se presenta la documentación que explica cómo se modifica esta escena.

    La siguiente escena muestra la sintáxis de algunos comandos para su envío desde Descartes a la página html que contiene el applet Geogegra. Se incluye también un ejemplo de cada uno de ellos viendo cuál es el resultado que se obtiene.

    Puede descargar esta escena desde aquí.

  • Comunicación escena-html usando DescartesJS

    Comunicación entre una escena de Descartes con la página HTML madre o con la página HTML hija

    Con el intérprete DescartesJS, una escena de Descartes puede comunicarse con la página HTML que le da soporte siempre que la escena esté embebida mediante un iframe, y también puede comunicarse con una página HTML que haya sido abierta por ella a través de un espacio HTMLIframe.

    En la imagen siguiente tenemos en el <body> de una página html un <iframe> a través del cual se embebe un fichero html ( en este caso ese archivo se denomina comunicacion_Descartes.html), el cual contiene una escena de Descartes.

    escenaEnIframe

    código iframe para embeber una escena en una página html

    Para que una pagina html, que es madre de una escena de Descartes a través de un iframe o que es hija de ella mediante un espacio HTMLIframe, pueda recibir los mensajes que envía la escena Descartes mediante las funciones para la comunicación, necesita tener un manejador de eventos

    elemento.addEventListener(«message», funcionQueManejaLosMensajes)

    donde elemento es elemento de la página al que se le asocia el manejador de los eventos que sobre él acontecen y la función funcionQueManejaLosMensajes sirve para gestionar el evento. A continuación se refleja un esquema de esa función donde se controla que el mensaje sea tipo set o update. En lugar del evento «message» pueden contemplarse otros.

    __________________________________________________

    function funcionQueManejaLosMensajes(evt) {

    var data = evt.data;

     // se maneja un mensaje del tipo set

    // data.name es el nombre de la variable
    // data.value es el valor de la variable

    if (data.type === «set») {

    // incluir código deseado

    }

     // se maneja un mensaje del tipo update
    else if (data.type === «update») {

    // incluir código deseado

    }

    }

    ___________________________________________________________________

    Comunicación de la página HTML madre con la escena de Descartes

    Para enviar información desde una pagina html, madre de una escena Descartes mediante iframe, a la escena de Descartes se utiliza la interfaz de comunicación window.postMessage de JavaScript, donde los mensajes son de la siguiente forma:

    referenciaAlIframe.contentWindow.postMessage({ type: «update» }, ‘*’);
    referenciaAlIframe.contentWindow.postMessage({ type: «set», name: varName, value: value }, ‘*’);

    donde varName es una cadena con el nombre de la variable que se le quiere pasar a Descartes y value es el valor de la variable.

    Nota: Como se ha indicado en los párrafos anteriores en DescartesJS, no hay un API como tal, porque la función funcionQueManejaLosMensajes debe ser implementada de acuerdo a las necesidades del programa. Tal vez, para enviar mensajes hacia Descartes sería conveniente tener un API, pero la forma de enviar los mensajes es tan simple que quizás no merezca la pena su elaboración. El sistema de comunicación es muy sencillo, el único inconveniente es la necesidad de saber el nombre de las variables que la pagina HTML espera recibir, así como el de las variables que usa internamente la escena de Descartes.
     
     

    Podemos ver un ejemplo a continuación:
    (Puede descargar  esta escena desde este enlace)
     

    El esquema lógico-funcional de la escena anterior es el siguiente:

    1. Para comunicar el html con la escena de Descartes que está embebida en un iframe de id «el_iframe»
    <iframe id=»el_iframe» src=»comunicacion_Descartes.html» width=640 height=480 frameborder=0 seamless scrolling=»no»></iframe>
    se cuenta en el body con un campo de texto de id «texto_a_enviar»
    <input id=»texto_a_enviar» type=»text» />
     
    y un botón de id «enviar»
    <input id=»enviar» type=»button» value=»enviar»> <br />
    y en head se cuenta con el siguiente código
    var contenido = document.getElementById(«texto_a_enviar»);
    var boton = document.getElementById(«enviar»);
    var iframe = document.getElementById(«el_iframe»);
    boton.addEventListener(«click», function(evt) {
    iframe.contentWindow.postMessage({ type: «set», name: «unaVariable», value: contenido.value }, ‘*’);
    iframe.contentWindow.postMessage({ type: «update» }, ‘*’);
    });
    donde se identifica el campo de texto, el botón y el iframe mediante sus id respectivos y se define un manejador de eventos ligado al botón ligado al evento «click», de manera que cuando el usuario hace click sobre el botón se envía un mensaje tipo set al iframe con el contenido del campo de texto y ligado a una variable que en la escena tendrá que tener el nombre «unaVariable» y un mensaje tipo update.
    En la escena ejemplo se cuenta con un gráfico tipo de texto en el que se observa la variable «unaVariable»
    <param name=»G_01″ value=»espacio=’E1′ tipo=’texto’ expresión='[20,20]’ texto='[unaVariable]’ fuente=’SansSerif,PLAIN,22′ fijo=’sí'»>
    que refleja el valor recibido.
    2. Para comunicar la escena con el html madre, en la primera se cuenta con un control tipo campo de texto de id «texto» que recogerá el valor a enviar
    <param name=»C_01″ value=»id=’texto’ tipo=’numérico’ interfaz=’campo de texto’ solo_texto=’sí’ espacio=’E1′ nombre=’texto’ valor=’&squot;un texto&squot;’ fijo=’sí’ visible=’sí'»>
    y otro tipo botón que al pulsarlo tiene una acción calcular en la que se asigna el valor de texto a una variable de id «variableEnviada» en el html madre  mediante la función parent.set(‘variableEnviada’,texto)
    <param name=»C_02″ value=»id=’enviar’ tipo=’numérico’ interfaz=’botón’ espacio=’E1′ nombre=’enviar texto’ fijo=’sí’ visible=’sí’ acción=’calcular’ parámetro=’parent.set(&squot;variableEnviada&squot;,texto)'»>
    Y en el html madre  se ha definido un manejador de eventos para el evento «message»
    window.addEventListener(«message», funcionQueManejaLosMensajes);
    function funcionQueManejaLosMensajes(evt) {
    var data = evt.data;
    // se maneja un mensaje del tipo set
    if (data.type === «set») {
    // data.name es el nombre de la variable
    // data.value es el valor de la variable
    document.getElementById(«textoRecibido»).textContent = data.value; // este es solo un ejemplo de lo que se     puede hacer con los mensajes
    }
    }
    En él se asigna al elemento html de id «textoRecibido» en valor enviado desde la escena
    El texto recibido desde la escena de Descartes es: <span id=»textoRecibido»></span>
     
     
    En el ejemplo siguiente se ha modificado el código para que la comunicación se produzca automáticamente cuando los campos de texto cambian, evitando tener que contar con botones de envío:
    (Puede descargar  esta escena desde este enlace)
    Lo que se ha rrealizado es cambiar el evento «click» por el evento «change» y asociar el manejador de eventos al campo de texto de id «texto_a_enviar»
    var contenido = document.getElementById(«texto_a_enviar»);
    var iframe = document.getElementById(«el_iframe»);
    contenido.addEventListener(«change«, function(evt) {
    iframe.contentWindow.postMessage({ type: «set», name: «unaVariable», value: contenido.value }, ‘*’);
    iframe.contentWindow.postMessage({ type: «update» }, ‘*’);
    });
     
  • Comunicación de una escena con el html embebido en un HTMLIframe

    En el siguiente ejemplo contamos con una escena “madre” que incluye un espacio HTMLIframe que sirve para embeber una página html. En ella podemos distinguir y observar:

    1. La escena madre tienes tres controles n1, n2 y n3 y cuando cambian los valores de estos controles los envía respectivamente hacia un elemento del código html, hacia un campo de texto editable y hacia un área de texto, los cuales quedan actualizados. Hay una comunicación unidireccional de escena a html embebido en un espacio HTMLIframe.
    2. Por otro lado, en el html embebido hay otro campo de texto y otro área de texto y cuando se modifica su valor se actualizan dos variables de la escena madre y se muestra en dos gráficos de texto de esa escena. Hay una comunicación unidireccional desde el html embebido a la escena madre.

    Puede descargar esta escena desde este enlace.

    El esquema lógico-funcional de este objeto es el siguiente:

    1. Una escena que contiene un espacio HTMLIframe con id E2 y que usamos para embeber una página html que hemos denominado EscenaHtmlHija.html.
    2. En la escena, el control n1 tienen asociada la acción calcular en la que se ejecuta la función de comunicación set mediante la expresión E2.set(‘n1’,n1), es decir se asigna el valor del control n1 a la variable n1 en E2 (este n1 es lo que aparece entre comillas en la función set, podríamos llamarlo de otra forma, pero por comodidad le hemos dado igual nombre). Análogo se hace con los controles n2 y n3.
    3. En el fichero html  EscenaHtmlHija.html es necesario utilizar el manejador de eventos de javascript para que detecte el mensaje enviado por la escena a través de la función set y actúe de acuerdo a nuestro deseo. Obviamente esto es algo ajeno a Descartes y nos adentramos en la programación con javascript para controlar eventos, si bien para nuestro fin basta que reproduzcamos adecuadamente el código que ahora describiremos y que mostramos en la siguiente imagen:
      • En la imagen, la línea incluida en el primer recuadro lo que hace es añadir un manejador (listener –oyente–) de eventos que actúa en este caso cuando se genera un mensaje (evento message) ejecutando la función que hemos llamado funcionQueManejaLosMensajes. Ésta comienza a describirse en el segundo recuadro rojo de la imagen.
      • En los tres recuadros siguientes observamos cómo se gestiona respectivamente el evento mensaje generado por los controles n1, n2 y n3 mediante la función set (en este ejemplo el mensaje generado por update() no realiza nada, pues no se usa en la escena).
      • En los tres casos, en la condición lógica de la instrucción if, se identifica que data.type sea «set» y qué control ha sido el activado comparando data.value con «n1», «n2» o «n3» (estos son los nombres que se ponen entre comillas en el primer parámetro de la función set). A continuación se actúa de acuerdo a lo especificado en cada caso. Esa acción se inicia capturando el elemento de la página html cuyo id coincide con el indicado en document.getElementById(«desdeCampoDeTexto»), en este caso «desdeCampoDeTexto» se corresponde con el id de un input tipo texto según podemos ver en el código incluido en el <body> y que se refleja en la siguiente imagen.
        Id en los elementos incluidos en el código HTML
      • Una vez  identificado se procede a modificar alguna propiedad de ese elemento, por ejemplo al especificar document.getElementById(«desdeCampoDeTexto»).value=data.value modificamos su valor con el valor (data.value) enviado en el mensaje. O bien modificar el propio código html con la propiedad innerHTML, o cualquier otra propiedad que se desee.
    4. El proceso inverso, es decir, enviar desde la página EscenaHtmlHija.html algún valor a la escena, se realiza utilizando la interfaz de comunicación dada por JavaScript window.parent.postMessage. En este ejemplo contamos con un texto cuyo id es «unCampoDeTexto» y un área de texto de id «textarea» (ver imagen anterior) y en la imagen siguiente observamos el código para manejar los eventos generados.
      manejaeventos2

      En ellos, el evento que se gestiona es «change», de manera que cuando cambia el valor en ese elemento. Así pues para «unCampoDeTexto» lo que se hace es enviar el valor actual de ese elemento a la variable de la escena cuyo nombre es «variableEnviada», y en el caso del elemento cuyo id es «textarea» su valor es enviado a la variable de la escena denominada «taenviado». Obviamente en lugar del evento «change» si se desea puede gestionarse cualquier otro que acontezca en esa página.

    En el ejemplo anterior la comunicación que se ha planteado en unidireccional, de escena a html o viceversa, pero la comunicación se puede realizar de manera bidireccional sobre cualquier elemento, no hay más que programar la gestión de los dos eventos actuando sobre los elementos que se quieren relacionar. Ello es lo que hemos hecho en la siguiente escena, que se puede descargar desde este enlace.

  • Comunicación entre una escena y la página html que la contiene

    Una escena es un código embebido en una página html, la cual le sirve de contenedor, y que también aporta el intérprete con el que va a ejecutarse. A su vez una escena, mediante espacios HTMLIframe, puede embeber páginas html.

    escenas y páginas html

    escenas y páginas html

     

    Se cuenta por tanto con dos entornos o ambientes de ejecución: el entorno html y el entorno de la escena. El planteamiento que surge y que se plantea es la comunicación entre ambos ambientes, es decir, que determinados valores generados o modificados en el primero sean conocidos por el segundo y viceversa, de manera que uno u otro ambiente pueda modificarse como consecuencia de un cambio en el otro.

    En los siguientes artículos se hace una introducción a esta comunicación según el intérprete de Descartes utilizado.

    Comunicación escena-html usando DescartesJava

    Comunicación escena-html usando DescartesJS