Cómo el elemento ficticio señala que se cumplen las restricciones
Este elemento auxiliar se crea para que siempre pueda detectar algo en las imágenes, siempre que no esté activada la funciónDontFind() (es decir, “detener la búsqueda”). El número de hipótesis no debe ser demasiado grande para evitar expandir en exceso el árbol de hipótesis y aumentar el tiempo de emparejamiento de FlexiLayout.
Para ello, puede usar, por ejemplo, elementos de los tipos colección de objetos o párrafo. Estos elementos siempre generan una única hipótesis que incluye todos los objetos del tipo especificado en el área de búsqueda.
La sección de relación avanzada de prebúsqueda del elemento ficticio contiene el conjunto de condiciones para comprobar algunos de los elementos situados debajo del elemento ficticio en el árbol del proyecto. Si se cumplen todas las condiciones, se llama a la función DontFind() para el elemento ficticio.
En este caso, se generará una hipótesis nula para el elemento ficticio, que servirá como marcador de que todas las condiciones se han cumplido cuando FlexiLayout Studio empiece a buscar otros elementos. Esto hace que FlexiLayout Studio ejecute solo la comprobación IsNull del elemento ficticio, en lugar de verificar las mismas restricciones complejas para varios elementos.
Este método ayuda a que el código sea más descriptivo. Además, si necesita editar las restricciones, puede hacerlo solo en la descripción del elemento ficticio. Esto reduce la probabilidad de errores lógicos y sintácticos al duplicar el código.
Está previsto que futuras versiones del producto admitan la creación de variables en el área de subelementos de los grupos. Los resultados de la comprobación de las restricciones se almacenarán entonces en los valores de distintas variables.El método actual es una solución temporal (workaround) que ayuda a simplificar el código en las secciones Advanced de la versión actual de FlexiLayout Studio.
Los dos diseños de factura en el proyecto de ejemplo
El proyecto1.fsp (carpeta %public%\ABBYY\FlexiCapture\12.0\Samples\FLS\Tips and Tricks\Auxiliary element) muestra cómo funciona este método.
En estas imágenes, el objetivo es encontrar los siguientes campos: “Número de factura”, “Fecha de la factura”, “Nombre de la empresa” y “Dirección de la empresa”.
Suponga que deben procesarse facturas de dos tipos distintos:
- Los campos “Nombre de la empresa” y “Dirección de la empresa” están encima del campo “Número de factura”.
- Los campos “Nombre de la empresa” y “Dirección de la empresa” están debajo del campo “Número de factura”.
Buscar el campo de fecha con dos conjuntos de restricciones
El proyecto contiene un elemento de grupo InvoiceGroup con los elementos InvoiceHeader, InvoiceNum y DateHeader, así como un elemento de grupo DateGroup. Estos subelementos son necesarios para detectar los nombres de los campos y los campos “Número de factura” y “Fecha de la factura”.Para obtener más información sobre los métodos para buscar fechas, consulte Búsqueda de fechas después de un reconocimiento de alta o baja calidad. En esta sección solo se describen las restricciones para la búsqueda de fechas en el proyecto actual.
if not DateHeader.IsNull), la búsqueda se realizará tomando como referencia el nombre del campo de fecha: a la derecha del nombre, en el mismo nivel horizontal, con cierto margen de error para el desplazamiento vertical:
Para simplificar, supongamos que las imágenes son de buena calidad y que el campo “Número de factura” y su nombre siempre se detectan.En una situación real, antes de acceder a las propiedades de estos elementos, debe comprobar
IsNull, porque, si los elementos no se detectan, las búsquedas posteriores se realizarán tomando como referencia las áreas de búsqueda de los elementos correspondientes.
Penalizar las hipótesis de fecha alejadas de los campos de facturas
La sección Relaciones avanzadas de posbúsqueda del elemento Fecha contiene el siguiente código:Para obtener más información sobre el uso de estas funciones, consulte Buscar elementos con Nearest y FuzzyQuality.
Restricciones de búsqueda para el elemento DateAsString
Se especifican restricciones de búsqueda idénticas para el elemento DateAsString, pero su sección de Relaciones avanzadas de posbúsqueda añade una línea más al código mostrado anteriormente:RestrictSearchArea (Date.Rect);.
Esto indica a FlexiLayout Studio que busque el objeto del elemento DateAsString en el área del rectángulo difuso del elemento fecha. El área de búsqueda del elemento fecha puede representarse como un array de rectángulos.
Cuando se genera una hipótesis nula para el elemento fecha, el rectángulo que encierra el área de búsqueda se toma como un rectángulo (Rect) del elemento actual. Como puede ver en la imagen siguiente, también encierra el campo “Número de factura” descrito por el elemento InvoiceNum.
En algunas condiciones (por ejemplo, cuando el campo de fecha tiene mucho ruido), puede darse una situación en la que, en lugar del campo de fecha, el elemento DateAsString detecte el campo del número de factura, ya que los caracteres (incluidos los dígitos) especificados para este elemento no tienen ninguna restricción de formato.

Compruebe la disposición de los campos con el elemento auxiliar ShamElement
Después de describir los elementos necesarios para buscar los campos “Número de factura” y “Fecha de la factura”, el siguiente paso es buscar los campos “Nombre de la empresa” y “Dirección de la empresa”. El proyecto usa un elemento Párrafo llamado ShamElement. Este elemento actúa como elemento auxiliar y se utiliza exclusivamente para comprobar la ubicación relativa de los campos “Número de factura” y “Fecha de la factura”. La sección Relación avanzada de prebúsqueda del elemento auxiliar contiene el siguiente código:
Buscar el nombre de la empresa en relación con los campos de facturas
Para detectar los datos de la empresa, el proyecto utiliza un elemento de grupo CompanyGroup. Agrupa el elemento CompanyName de tipo cadena de caracteres (el nombre de la empresa en las imágenes de prueba está escrito en una sola línea) y el elemento dirección de tipo párrafo. Este último elemento se utiliza para buscar el bloque que contiene la dirección de la empresa. El uso del elemento auxiliar ayuda a simplificar el código que describe las restricciones de búsqueda del elemento en la sección de relación avanzada de prebúsqueda. Si no se detecta el elemento auxiliar (es decir, se genera una hipótesis nula para él), esto significa que el campo de fecha está situado a la derecha del campo de factura. En este caso, el campo “Nombre de la empresa” se buscará debajo del campo “Número de factura”. Si se detecta el elemento auxiliar, el campo “Nombre de la empresa” se buscará encima del campo “Número de factura”.En este caso, puede usarse la función
Nearest, ya que permite identificar de forma inequívoca y precisa el campo que contiene el nombre de la empresa (no hay objetos que coincidan con las mismas restricciones de búsqueda).Above: InvoiceGroup.InvoiceHeader; y Above: InvoiceGroup.InvoiceNum; las cumplen no solo la cadena con el nombre de la empresa, sino también las cadenas del campo de dirección.

