Archivo de la etiqueta: modelo semántico

Mejora al detectar un error de modelo semántico al almacenar una geometría

Hemos mejorado en Digi3D.NET las acciones a realizar si se detecta un error de modelo semántico al almacenar una geometría que no cumpla con el modelo semántico.

Hasta ahora el programa mostraba un globo con un mensaje indicando que la geometría no se iba a almacenar y la entidad no se almacenaba. Esto tenía como inconveniente que el operador tenía que volverla a generar (con la posibilidad de que volviera a cometer el mismo error).

A partir de ahora el programa muestra un panel de tareas como el que se puede ver a continuación:

errordemodelosemantico

En el que se pregunta al usuario por la acción a seguir. Si el operador opta por almacenar la geometría, será su responsabilidad corregir el problema que ha ocasionado el fallo de modelo semántico.

Puedes ver esta nueva funcionalidad en acción en el siguiente vídeo:

 

Nuevo menú «Modelo semántico»

 

La práctica mayoría de las funcionalidades que hemos añadido a Digi3D.NET en los últimos meses estaban enfocadas en realizar controles de calidad de la cartografía en tiempo real.

Gracias a estas funcionalidades el programa le informa de errores al operador en el mismo instante en el que digitaliza una entidad, pero no teníamos una herramienta que ejecutase esos test sobre cartografía existente.

Acabamos de añadir un nuevo menú a Digi3D.NET denominado Modelo semántico.

Este menú nos va a permitir por un lado habilitar o deshabilitar los test en tiempo de ejecución (mediante la opción Modelo semántico/Analizar modelo semántico al digitalizar entidad),  y por otro lado ejecutar test a geometrías existentes mediante el submenú Modelo semántico/Analizar modelo semántico.

Este submenú es dinámico y muestra todas las etiquetas que aparezcan en la tabla de códigos (si es que en la tabla de códigos hemos añadido alguna etiqueta a algún código).

En la captura que encabeza esta entrada puedes ver que algunos códigos tienen la etiqueta RoadTranspFeatureOnGround, otras tienen Anexo_E, etc. Si seleccionamos por ejemplo Anexo_E, se realizará un análisis de modelo semántico a todos los códigos que tengan la etiqueta Anexo_E.

Este menú además dispone de una opción denominada Por código que muestra un cuadro de diálogo que nos permite seleccionar el o los códigos de las entidades a las cuales queremos realizar un análisis de modelo semántico, y por último dispone de la opción Geometrías visibles, que realiza el análisis a las geometrías que tengamos en este momento activadas en la ventana de dibujo.

El resultado de los test se muestra en el panel de resultados como puedes ver en la siguiente captura de pantalla:

ResultadoAnalisisModeloSemantico.PNG

Los test se programan como guiones en la tabla de códigos. Lo que ves en estas capturas de pantalla son test para el proyecto MGCP. Hemos publicado el código fuente de los test para que aprendas a añadir tus propios test en nuestro repositorio de código fuente en GitHub en https://github.com/digi21/mgcp

Puedes ver esta nueva funcionalidad en acción en el siguiente vídeo:

 

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.

Relaciones geométricas entre entidades

 

Hemos añadido a Digi3D.NET lógica para detectar relaciones geométricas entre entidades.

Estas relaciones nos van a servir en un futuro próximo para crear modelos semánticos en la tabla de códigos e indicar por ejemplo que una línea de mar no puede terminar en una curva de nivel, o que una alcantarilla no puede estar dentro de una línea de mar.

La primera fase para lograr este objetivo es añadir operaciones que le permitan a Digi3D.NET analizar relaciones entre geometrías.

Lo que te presento hoy es una serie de opciones que hemos añadido en el menú de Análisis Geométricos de la aplicación.

Definiciones:

Tenemos que definir primero qué es un punto, qué es una línea y lo más importante: qué es un área para Digi3D.NET.

Tipo de entidad Descripción
Punto Puntual de Digi con o sin rotación. Creados con la orden PUNTO, PUNTO_R, etc.
Línea Línea de dos o más puntos (abierta o cerrada). Se consideran únicamente las entidades de tipo línea, y no las entidades de tipo línea que formen parte de un elemento complejo.
Área Se considera un área a cualquier línea cerrada o polígono. Las líneas cerradas o polígonos que formen parte de un elemento complejo no se tienen en cuenta.

Así que en todo lo que te voy a explicar aquí, no se tienen en cuenta ni puntos ni nada que forme parte de un elemento complejo.

Condiciones:

Se tienen que cumplir una serie de condiciones para que los algoritmos que te voy a presentar funcionen:

  • No existencia de puntos dobles. Si una línea tiene dos vértices con la misma coordenada, eso va a hacer que los algoritmos no funcionen. Puedes eliminar automáticamente los posibles puntos dobles existentes en tus geometrías ejecutando la orden COMPRIMIR=1 1, pero ¡ATENTO!, si haces esto y tu cartografía es 3d real (es decir, si has dibujado los edificios con su Z real en limatesas, limahoyas, etc, te cargarás esos puntos.
  • Todas las operaciones trabajan en 2D, de modo que cuando digo que una línea esté cerrada me refiero a que las coordenadas X e Y del primer vértice de la línea coinciden con las coordenadas X e Y del último vértice de ésta, independientemente de la coordenada Z de ambas.
  • Para que funcionesn las operaciones que te presento a continuación deben cumplir la siguiente regla general: Todas las geometrías que intersecten con otras geometrías deben tener un punto común en la intersección.
  • Los test son mutuamente excluyentes, de modo que si el test

Te lo muestro en la siguiente tabla:

Los algoritmos funcionan bien Los algoritmos funcionan mal
Punto – Línea  ReglaPuntoLineaBien  ReglaPuntoLineaMal
Línea – Línea  ReglaLineaLineaBien  ReglaLineaLineaMal
Área – Área  ReglaAreaAreaBien  ReglaAreaAreaMal

Así que ya sabes, antes de ejecutar cualquiera de las órdenes que te voy a presentar en esta entrada, asegúrate de haber insertado vértices en la intersección de las entidades involucradas mediante la opción del menú Análisis geométricos/Insertar un vértice en el punto de cruce de las líneas o acostúmbrate a trabajar con la variable TENTATIVO_INSERTA activada.

Tipos de relaciones que es capaz de analizar Digi3D.NET:

Existen seis tipos de relaciones si nos fijamos en el tipo de entidad:

  • Punto con punto.
  • Punto con línea.
  • Punto con área.
  • Línea con línea.
  • Línea con área.
  • Area con área.

Si ejecutas Digi3D.NET comprobarás que en el menú de Análisis geométricos hemos añadido esas opciones, cada una de ellas con una serie de órdenes que siguen todas el mismo patrón: Nos van a solicitar que seleccionemos dos entidades y luego nos mostrarán un globo indicando si ambas entidades cumplen o no la condición.

Relaciones Punto – Punto

Título Ejemplo
 ¿Son disjuntos?  PuntoPuntoNoCoincidentes
 ¿Son coincidentes?  PuntoPuntoCoincidentes

Relaciones Punto – Línea

Título Ejemplo
¿El punto es disjunto con la línea?
¿La línea es disjunta con el punto?
 PuntoLineaNoCoincidentes
¿El punto coincide con el final de la línea?
¿El punto termina en la línea?
¿La línea termina en el punto?
 PuntoLineaCoincidentesExtremo.png
 ¿El punto es coincidente con la línea?  PuntoLineaCoincidentes

Relaciones Punto – Área​

Título Ejemplo
¿Es el punto disjunto con el área?
¿Es el área disjunta con el punto?
 PuntoAreaNoCoincidentes
¿El punto es coincidente con el borde del área?  PuntoAreaCoincidentes
¿El punto está en el dentro del área?
¿El area encierra al punto?
 PuntoInteriorArea

Relaciones Línea – Línea​

Título Ejemplo
¿Son disjuntas?  LineaNoCoincidenteLinea
 ¿El final de una línea se une con la otra línea?
¿El final de una línea se une con el final de la otra línea?
¿Una línea se une con otra línea?
 LineaCoincideLinea
 ¿Una línea atraviesa la otra línea?  LineaCruzaLinea
 ¿Una línea solapa con la otra línea?  LineaSolapaLinea
 ¿Las dos líneas son idénticas?  LineaLineaIguales

Relaciones Línea – Área​

Título Ejemplo
¿Son disjuntos? LineaAreaNoCoincidentes
¿El extremo de la línea se une con el borde del área? LineaAreaCoincidentes
¿La línea termina dentro del área? LineaTerminaEnArea
¿La línea atraviesa el área? LineaCruzaAreaLineaCruzaArea2
¿La línea es adyacente al área? LineaAdyacenteArea
¿La línea está dentro del área?
¿El área incluye a la línea?
LineaDentroArea

Relaciones Área – Área​

Título Ejemplo
¿Son disjuntos?  AreaDisjuntaArea
¿Un área es adyacente con el otro área?  AreaAdyacenteArea
¿Las áreas se unen?  AreaUneAreaAreaUneArea2
¿Las áreas solapan?  AreaSolapaAreaAreaSolapaArea2
¿El primer área incluye completamente al segundo área?
¿El segundo área está completamente dentro del primer área?
 AreaIncluyeAreaAreaIncluyeArea2AreaIncluyeArea3
¿Las dos áreas son idénticas?  AreaIdenticaArea

A continuación un vídeo en el que te muestro esta nueva característica en acción y aquí tienes el enlace para descargarte el archivo de dibujo que utilizo en el vídeo.