/// <summary> /// Handles the event lauched when the "edit label" option is clicked /// in the formula node's contextual menu. /// </summary> /// <param name="sender"> /// A <see cref="System.Object"/> /// </param> /// <param name="a"> /// A <see cref="EventArgs"/> /// </param> private void OnEditLabeItemActivate(object sender, EventArgs a) { Dialogs.SymbolLabelEditorDialog dialog = new Dialogs.SymbolLabelEditorDialog(MainRecognizerWindow.Window, selectedNode); if (dialog.Show() == ResponseType.Ok) { bool changeLabel = true; if (selectedNode.ChildCount > 0) { ResponseType res = ConfirmDialog.Show(MainRecognizerWindow.Window, "Este nodo tiene hijos, y se estableces " + "una etiqueta se eliminarán, ¿quieres" + " continuar?"); if (res == ResponseType.Yes) { // We remove the nodes. while (selectedNode.ChildCount > 0) { selectedNode.RemoveChild((TreeNode)(selectedNode[0])); } } else { changeLabel = false; } } if (changeLabel) { // We remove all the symbols, then add the new one. selectedNode.Symbols.Clear(); selectedNode.Symbols.Add(new MathSymbol(dialog.Label)); selectedNode.SetLabels(); } } dialog.Destroy(); }
/// <summary> /// Con este metodo cramos un arbol de imagenes, de forma recursiva. /// Primero intentamos reconocer la imagen como un caracter, si no es /// posible, la intentamos segmentar. Si ninguno de estos procesos es /// posible, la imagen nopudo ser reconocida. /// </summary> /// <param name="node"> /// El nodo donde esta la imagen sobre la que trabajaremos. /// </param> private void RecognizerTreeBuild(SegmentedNode node) { // Seleccionamos el nodo. NodeBeingProcessedInvoker(node); SuspendByNode(); node.Select(); while (node.ChildCount > 0) { node.RemoveChild((SegmentedNode)node[0]); } MathTextBitmap bitmap = node.MathTextBitmap; MessageLogSentInvoker("======================================="); MessageLogSentInvoker("Tratando la subimagen «{0}»", node.Name); // Lanzamos el reconocedor de caracteres para cada una de // las bases de datos. List <MathSymbol> associatedSymbols = new List <MathSymbol>(); if (searchDatabase) { foreach (MathTextDatabase database in databases) { MessageLogSentInvoker("---------- «{0}» ------------", database.ShortDescription); bitmap.ProcessImage(database.Processes); BitmapProcessedByDatabaseInvoker(bitmap); // Añadimos los caracteres reconocidos por la base de datos foreach (MathSymbol symbol in database.Recognize(bitmap)) { if (!associatedSymbols.Contains(symbol)) { // Solo añadimos si no esta ya el simbolo. associatedSymbols.Add(symbol); } } } } // We associate all symbols to the node, so we can postargate // the decission step. node.Symbols = associatedSymbols; //Si no hemos reconocido nada, pues intentaremos segmentar el caracter. if (associatedSymbols.Count == 0) { if (searchDatabase) { MessageLogSentInvoker("La imagen no pudo ser reconocida como un " + "simbolo por la base de datos, se tratará de " + "segmentar"); } else { MessageLogSentInvoker("Se procede directamente a segmentar la imagen"); this.SearchDatabase = true; } List <MathTextBitmap> children = CreateChildren(bitmap); if (children.Count > 1) { MessageLogSentInvoker("La imagen se ha segmentado correctamente"); //Si solo conseguimos un hijo, es la propia imagen, asi que nada List <SegmentedNode> nodes = new List <SegmentedNode>(); foreach (MathTextBitmap child in children) { SegmentedNode childNode = new SegmentedNode(child, node.View); node.AddSegmentedChild(childNode); nodes.Add(childNode); } foreach (SegmentedNode childNode in nodes) { RecognizerTreeBuild(childNode); } } else { MessageLogSentInvoker("La imagen no pudo ser segmentada, el " + "símbolo queda sin reconocer"); } } else { // We prepare the string. string text = ""; foreach (MathSymbol s in associatedSymbols) { text += String.Format("«{0}», ", s.Text); } text = text.TrimEnd(',', ' '); MessageLogSentInvoker("Símbolo reconocido por la base de datos como {0}.", text); } }