/// <summary> Проведение обратного логического вывода </summary> public void InvertedAnalize() { Stack Stack = new Stack(); Queue Queue = new Queue(); ConditionTreeNode Node, Prev = null; KBObject KBObject; bool Found; for (int i = 0; i < KBObjects.Count; i++) { if (((KBObject)KBObjects[i]).Value != "Не определено") { Queue.Enqueue(KBObjects[i]); } } while (Queue.Count > 0) { KBObject = (KBObject)Queue.Dequeue(); for (int i = Rules.Count - 1; i >= 0; i--) { // Поиск вхождения объекта в часть "ТО" условия if (KBObject.Name != ((Rule)Rules[i]).ConsequentObject || KBObject.Value != ((Rule)Rules[i]).ConsequentValue) { continue; } Stack.Clear(); Stack.Push(((Rule)Rules[i]).Root); while (Stack.Count > 0) { Node = (ConditionTreeNode)Stack.Pop(); if (Node.Operation == Operations.Equals) { if ((string)Node.Operands[1] != "Не определено") { SetKBObjectValue((string)Node.Operands[0], (string)Node.Operands[1], i); KBObject kbo = new KBObject(); kbo.Name = (string)Node.Operands[0]; kbo.Value = (string)Node.Operands[1]; if (Queue.Contains(kbo) == false) { Queue.Enqueue(kbo); } } else { Found = false; foreach (Rule r in Rules) { if (r.ConsequentObject == (string)Node.Operands[0]) { Found = true; break; } } if (Found == false) { // Дополнительная инициализация string ObjectName = (string)Node.Operands[0]; string[] LegalValues = GetLegalValuesList(ObjectName); string Comment = ((Rule)Rules[i]).Comment; Form2 Form = new Form2(ObjectName, LegalValues, Comment); if (Form.ShowDialog() == DialogResult.OK) { SetKBObjectValue(ObjectName, Form.comboBox1.Text, -1); KBObject kbo = new KBObject(); kbo.Name = ObjectName; kbo.Value = Form.comboBox1.Text; if (Queue.Contains(kbo) == false) { Queue.Enqueue(kbo); } } else { throw new Exception("Вывод прерван по желанию пользователя"); } } } } else { for (int j = 0; j < Node.Operands.Count; j++) { Stack.Push(Node.Operands[j]); } } } continue; /*if (Found == false) continue; * * // Проверка выполнения условия * if (CheckRuleConditionWithoutInitializing((Rule)Rules[i]) == false) * continue; * Stack.Clear(); * Stack.Push(((Rule)Rules[i]).Root); * while (Stack.Count > 0) * { * Node = (ConditionTreeNode)Stack.Peek(); * // Для операции "Равно" * if (Node.Operation == Operations.Equals) * { * // Дополнительная инициализация * if (GetKBObjectValue((string)Node.Operands[0]) == "Не определено") * { * string ObjectName = (string)Node.Operands[0]; * string[] LegalValues = GetLegalValuesList(ObjectName); * string Comment = ((Rule)Rules[i]).Comment; * Form2 Form = new Form2(ObjectName, LegalValues, Comment); * if (Form.ShowDialog() == DialogResult.OK) * SetKBObjectValue(ObjectName, Form.comboBox1.Text, -1); * else throw new Exception("Вывод прерван по желанию пользователя"); * } * if (GetKBObjectValue((string)Node.Operands[0]) == (string)Node.Operands[1]) * Node.Result = true; * else Node.Result = false; * Prev = (ConditionTreeNode)Stack.Pop(); * continue; * } * * // Если просмотрены все дочерние узлы * if ((ConditionTreeNode)Node.Operands[Node.Operands.Count - 1] == Prev) * { * if (Node.Operation == Operations.Not) * { * Node.Result = true; * for (int j = 0; j < Node.Operands.Count; j++) * if (((ConditionTreeNode)Node.Operands[j]).Result == true) * { * Node.Result = false; * break; * } * } * if (Node.Operation == Operations.And) * { * Node.Result = true; * for (int j = 0; j < Node.Operands.Count; j++) * if (((ConditionTreeNode)Node.Operands[j]).Result == false) * { * Node.Result = false; * break; * } * } * if (Node.Operation == Operations.Or) * { * Node.Result = false; * for (int j = 0; j < Node.Operands.Count; j++) * if (((ConditionTreeNode)Node.Operands[j]).Result == true) * { * Node.Result = true; * break; * } * } * Prev = (ConditionTreeNode)Stack.Pop(); * } * else * { * for (int j = Node.Operands.Count - 1; j >= 0; j--) * Stack.Push(Node.Operands[j]); * Prev = Node; * } * } * * // Если условие выполняется * if (((Rule)Rules[i]).Root.Result == true) * Queue.Enqueue(SetKBObjectValue(((Rule)Rules[i]).ConsequentObject, * ((Rule)Rules[i]).ConsequentValue, i));*/ } } }