Archivo por meses: marzo 2016

Rotaciones de las imágenes en la ventana fotogramétrica

Acabamos a añadir a Digi3D.NET la orden ROTACIONES_CAMARAS.

Esta orden te va a permitir cambiar dinámicamente los ángulos Omega, Phi y Kappa con los que se visualizan las imágenes en la ventana fotogramétrica.

Puedes utilizar los deslizadores para cambiar los ángulos o asignar valores tecleándolos en los cuadros que aparece a la derecha de cada deslizador.

Si aceptas el cuadro de diálogo, se mantendrán los ajustes que has realizado. Si cancelas, se volverá a asignar a las imágenes los ajustes que tuvieran antes de ejecutar la orden.

Digi3D.NET memorizará (almacenando en el archivo .D3D asociado a cada modelo) los valores de los ángulos, de manera que la próxima vez que cargues ese modelo en particular, las imágenes mantendrán la rotación.

Si el modelo cargado es monoscópico, los deslizadores de la cámara derecha aparecerán deshabilitados, y los ángulos de rotación de la única imagen se modificarán mediante los controles para la cámara izquierda.

En el siguiente vídeo puedes esta nueva funcionalidad en acción:

 

Modelo semántico

En la entrada del blog relaciones geométricas entre entidades te explicamos los tipos de relaciones geométricas que es capaz de analizar Digi3D.NET, y se introdujeron una serie de órdenes que básicamente servían para que el usuario pueda probar esas nuevas relaciones (y descubrir errores, porque seguro que algún caso se localizará que no se ha contemplado) y aprender en qué casos el programa da positivo y en qué casos negativo a la hora de analizar  relaciones geométricas entre dos entidades, pero por sí mismas esas órdenes carecían de sentido más que el puramente formativo o de depuración de errores.

Lo que te presentamos hoy es la causa por la cual se añadió esa lógica al programa, que no es más que la posibilidad de añadir un Modelo semántico, Modelo de datos, Modelo de Control de Calidad de la Cartografía, o como lo quieras llamar. A partir de ahora lo voy a llamar Modelo Semántico.

Gracias a esta novedad, vas a poder hacer trabajos como M.G.C.P., B.T.A., Grafcan, Geomadrid, etc. con la seguridad de que lo que sale de restitución está bien hecho, sin error alguno, ya que Digi3D.NET se encarga de analizar todas las reglas en tiempo real, según digitalizas. Las posibilidades son infinitas, tal y como vas a poder ver un poco más adelante.

Para ello hemos hecho las siguientes modificaciones al programa:

  • Hemos añadido una pestaña nueva al programa Editor de Tablas de Códigos.
  • Hemos añadido una nueva orden a Digi3D.NET.
  • Hemos añadido una nueva sección en el cuadro de diálogo de configuración de Digi3D.NET.
Y luego las cosas que no se ven:
  • Muchos cambios dentro del motor de topología de Digi3D.NET.
  • Más cambios dentro del motor de topología de Digi3D.NET.
  • Y más cambios ☺

Modificaciones en el Editor de Tablas de Códigos.

Hemos añadido al programa Editor de Tablas de Códigos una nueva pestaña (puedes verla en la imagen que encabeza esta entrada en el blog) denominada Modelo Semántico que nos va a permitir añadir una serie de reglas que van a definir incompatibilidades entre entidades.

Las reglas están formadas por los siguientes componentes:

    • El código de las entidades a las que se aplica la regla.
    • El tipo de entidad al que se aplica la regla, que pueden ser:
      • Puntos.
      • Líneas abiertas.
      • Áreas (polígonos o líneas cerradas).
    • Un mensaje de error a mostrar en caso de que se cumpla la regla (es decir, en caso de que se detecte alguna incompatibilidad).
    • Una o varias condiciones (que básicamente son relaciones entre entidades).
    • Un valor booleano (positivo o negativo) que indica si la regla se cumple en caso de que alguna de las condiciones anteriores de como resultado positivo o negativo.
      • Si indicamos aquí que la regla se cumple en caso de que alguna condición de positivo, con que una sola de las condiciones de como resultado positivo, se considerará que la regla se cumple.
      • Si indicamos aquí que la regla se cumple en caso de que alguna condición de negativo, se analizarán todas las condiciones, y en caso de que todas ellas den como resultado negativo, se considerará que la regla se cumple.

Opcionalmente además se pueden añadir los siguientes componentes a una regla:

      • Nombre de la regla, como por ejemplo Error 127.
      • Una URL para abrir un navegador a una página que explique el problema detectado.

Por ejemplo, supongamos que queremos que se muestre el mensaje de error: Las curvas de nivel no pueden terminar dentro de un área de océano si el operador dibuja una curva de nivel que entra dentro de un área de océano.

Vamos a suponer que el código de curva de nivel es: Curva y que el código de océano es (sorprendentemente): Océano.

Bien, pues podemos añadir una regla que diga:

      • Si la entidad tiene el código: Curva
      • Y es de tipo: Linea
      • Mostrar el mensaje de error: Las curvas de nivel no pueden terminar dentro de un área de océano
      • En caso de que alguna de las siguientes condiciones:
        • La línea termina dentro del área
        • La línea termina en el borde del área
      • De como resultado: Verdadero

Si el operador dibuja una línea de curva de nivel, en caso de que el código de curva de nivel tenga activo el análisis de modelos semánticos en tiempo real (te lo explico más adelante), Digi3D.NET analiza todas las reglas añadidas en el modelo semántico y, en caso de localizar alguna regla en la cual esté involucrado el código: Curva comprobará si se cumple la regla. En caso afirmativo, mostrará un cuadro de mensaje al usuario indicando de la condición del error, que en este caso será el mensaje Las curvas de nivel no pueden terminar dentro de un área de océano.

Añadir una regla es muy sencillo, tan solo tenemos que pulsar el botón Añadir regla en la pestaña Modelo semántico del programa Editor de Tablas de Códigos.

Aparecerá el cuadro de diálogo Añadir regla semántica que nos va a permitir introducir un código o una etiqueta (si incluyes una etiqueta se considerarán todos los códigos que tengan esa etiqueta), el tipo de la entidad a la cual se aplicará la regla, el mensaje de error a mostrar, el booleano que indica si la regla se cumple si las condiciones son positivas o negativas y los dos campos opcionales de título y URL tal y como puedes ver a continuación:

Dialogo Anadir Regla Semantica

En esta captura de pantalla puedes ver este cuadro de diálogo mostrando los datos necesarios para añadir una regla semántica para todos los códigos que tengan la etiqueta Altimetría, en el que además se han rellenado los campos opcionales Nombre (me he inventado que ese es el error 127) y URL. Si te fijas la URL la he puesto para que apunte a un archivo local. Ya sería responsabilidad tuya crear ahí un archivo con ese nombre (E127.html en este caso) que explique al usuario información referente a ese error en particular.

Si te fijas en este cuadro de diálogo no estamos introduciendo las condiciones. Únicamente hemos creado la regla. Si aceptamos el cuadro de diálogo, se añadirá una regla sin ninguna condición a nuestro listado de reglas…

Regla sin condición

Para añadir una condición, tendrás que seleccionar la regla y pulsar el botón Añadir condición a esta regla. Aparecerá el cuadro de diálogo Añadir condición a regla semántica.

Dialogo anadir condición a regla semántica

Este cuadro de diálogo nos va a permitir añadir una condición (que no es más que una relación geométrica entre dos entidades) a la regla.

En una condición indicamos los siguientes componentes:

      • El código de la segunda entidad.
      • El tipo de la segunda entidad.
      • La relación geométrica entre las dos entidades.

El listado de relaciones geométricas posibles varía obviamente en función del tipo de entidad de la primera entidad y la segunda entidad.

En la siguiente tabla te muestro el conjunto relaciones posibles en función del tipo de la primera y segunda entidades:

Primera entidad Segunda entidad Relaciones posibles
 Punto  Punto
  • Disjuntos.
  • Coinciden.
 Punto  Linea
  • Disjuntos.
  • Coinciden.
  • El punto coincide con un extremo de la línea.
 Punto  Area
  • Disjuntos.
  • Coinciden.
  • El punto está en el interior del área.
 Linea  Linea
  • Disjuntos.
  • Se unen.
  • Se unen por sus extremos.
  • El extremo de la primera línea se une con la segunda.
  • Cruzan.
  • Solapan.
  • Iguales.
 Linea  Area
  • Disjuntos.
  • La línea termina en el borde del área.
  • Se unen.
  • La línea termina dentro del área.
  • La línea cruza el área.
  • Adyacentes.
  • La línea está completamente dentro del área.
 Area  Area
  • Disjuntos.
  • Se unen.
  • Adyacentes.
  • El primer área está completamente incluida dentro del segundo área.
  • El primer área incluye completamente al segundo área.
  • El primer área está incluida dentro del segundo área.
  • El primer área incluye al segundo área.
  • Solapan.
  • Iguales.

Como puedes comprobar no hay relaciones Área->Punto, ni Area->Línea, ni Línea->Punto ni tiene sentido añadirlas, porque las reglas se ejecutan siempre que el código de la entidad digitalizada esté involucrado en la regla (tanto si su código coincide con el principal de la regla como con el de cualquiera de las condiciones que tenga la regla), de manera que por ejemplo en el caso de querer marcar como errores las líneas de curva de nivel que terminen dentro de un área de océano, con crear la regla que define que las líneas de curva de nivel no pueden terminar en áreas de océano es suficiente. Esta regla se aplicará cada vez que digitalicemos una línea de curva de nivel pero también cada vez que digitalicemos un área de océano. Digi3D.NET se encargará de hacer las cosas bien automáticamente.

Por último nos queda indicar a Digi3D.NET si queremos que estas reglas se analicen en tiempo real, en el momento en el que el usuario está digitalizando una entidad. Es posible que no queramos analizarlas en tiempo real, sino que queramos analizarlas bajo demanda (hablaremos de esto en la siguiente entrada en el blog), de modo que tiene que haber alguna forma de indicar que la regla no se debe aplicar en tiempo real.

Para ello hemos añadido una propiedad adicional a las Propiedades del código de cada uno de los códigos que aparecen en la pestaña Códigos del programa Editor de Tablas de Códigos.

Esta propiedad se denomina Analizar reglas de modelo semántico. Si está activa, cuando finalicemos la digitalización de una entidad, se analizarán todas las reglas en las cuales esté involucrada dicha entidad.

Puedes ver esa nueva propiedad en la siguiente captura de pantalla:

Propiedad Analizar reglas de modelo semántico

Una orden más para Digi3D.NET

Tiene que haber alguna forma de activar y desactivar esto ¿no crees?. Quizás te interese deshabilitar temporalmente los análisis en tiempo real, para activarlos un poco más adelante.

Para ello hemos añadido una orden en Digi3D.NET denominada ANALIZAR_MODELO_SEMANTICO que es una variable de tipo booleano que por defecto está activada y que en caso de ser activada comienza el análisis semántico de las entidades cuyos códigos tengan activo el modelo semántico en tiempo real.

Una nueva sección de configuración en el cuadro de diálogo de configuración de Digi3D.NET

Y por último, hemos añadido en el cuadro de diálogo de configuración de Digi3D.NET una sección denominada Modelo semántico en la que podemos indicar parámetros como el método de comunicación de mensajes preferido (cuadro de mensajes, globo, síntesis de voz, ventana de tareas).

Puedes verlo en acción en el siguiente vídeo:

Insertando automáticamente puntos en las intersecciones al finalizar una línea

Tal y como se explica en Relaciones geométricas entre entidades, para que dichos análisis funcionen correctamente, es necesario que siempre que una entidad (punto, línea, polígono) cruce otra entidad exista un vértice en la intersección de ambas entidades.

Hasta hoy teníamos dos formas de insertar vértices en las intersecciones:

Pero estas órdenes tienen sus inconvenientes:

  • La orden tentativo inserta únicamente introduce vértices en las entidades en las que hemos tentativado (líneas y polígonos desde hace unos pocos días).
  • La orden de insertar vértice en la intersección de líneas visibles analiza todo el archivo, de modo que si éste tiene muchas entidades, puede demorarse. Además, trabaja únicamente con líneas. Si una línea se cruza con un polígono, no añade vértice alguno a las entidades que formen el polígono.

Acabamos de añadir a Digi3D.NET la variable booleana: AUTO_INSERTAR_VERTICE_INTERSECCION_AL_FINALIZAR_LINEA, que como su nombre indica, inserta automáticamente vértices en las intersecciones de la línea que acabas de digitalizar con el resto de intersecciones.

Esta orden tiene la característica de que sí que es capaz de añadir vértices en polígonos (en la línea que hace de límite del polígono o en cualquiera de las líneas que forman los huecos de éste), y además está optimizada pues únicamente analiza las líneas que se cruzan con la línea que acabas de digitalizar.

Esta orden no sabe de códigos, es decir que añadirá vertices a todas las líneas o polígonos que se crucen con la línea que acabas de digitalizar (y obviamente también añadirá esos vértices a la propia línea), independientemente de los códigos que tengan dichas líneas.

En el siguiente vídeo te muestro en acción esta nueva característica de Digi3D.NET.