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.
- 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:
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…
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.
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 |
|
Punto | Linea |
|
Punto | Area |
|
Linea | Linea |
|
Linea | Area |
|
Area | Area |
|
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:
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: