/// <summary> /// Crea un nuevo AssignationChartElement. /// </summary> /// <param name="index">Esta propiedad no es relevante para esta clase.</param> /// <returns>Un nuevo AssignationChartElement.</returns> public override ChartElement Build(int index) { AssignationChartElement element = new AssignationChartElement(); element.PinSize = new Size(5, 5); element.BackColor = Color.LightBlue; element.Display = new Rectangle(Center.X - 50, Center.Y - 10, 100, 20); element.ShowInputPins = false; element.ShowOutputPins = false; element.Name = ""; element.Expression = ""; return(element); }
/// <summary> /// Ejecuta un algoritmo determinado, dado por un ChartElementCollection. /// </summary> /// <param name="instructionCollection">El conjunto de instrucciones a ejecutar.</param> public void ExecuteAlgorithm(ChartElementCollection instructionCollection) { ChartElement current = null; try { ChartElement first = instructionCollection.First; // Obtiene el elemento "Begin" si existe. if (first == null || first.Connections == null) { throw new Exception("Invalid algorithm to execute."); // Si no existe el "Begin", el algoritmo no es valido. } foreach (var connection in first.Connections) { if (connection.To != null) { current = connection.To.ChartElement; // Obtiene la primera instruccion a ejecutar. } } while (!(current is EndChartElement) && !shouldStop) { if (current == null) { throw new InvalidOperationException("Unconnected chart element. Check your chart connections."); } if (current is ConditionalChartElement) { ConditionalChartElement conditionalChart = (ConditionalChartElement)current; if (conditionalChart.Condition == "") { throw new InvalidOperationException("Invalid conditional chart."); } string preExpression = ParseSensorData(conditionalChart.Condition).ToLower(); string evaluationResult = Evaluator.Evaluate(preExpression); bool found = false; foreach (var connection in current.Connections) { if (evaluationResult.Equals(connection.Label)) { if (connection.To != null) { current = connection.To.ChartElement; found = true; } else { throw new Exception("Invalid connection"); } break; } } if (!found) { throw new InvalidOperationException("Invalid conditional expression."); } } else { if (current is CommandChartElement) { ExecuteCommand((CommandChartElement)current); } else if (current is ActivityChartElement) { string activityName = ((ActivityChartElement)current).ActivityName; if (ActivityList.ContainsKey(activityName)) { ExecuteAlgorithm(ActivityList[activityName]); } else { throw new InvalidOperationException("Invalid activity."); } } else if (current is AssignationChartElement) { AssignationChartElement assignChart = (AssignationChartElement)current; if (assignChart.Name == "" || assignChart.Expression == "") { throw new InvalidOperationException("Invalid assignation chart element."); } string where = ParseSensorData(assignChart.Name); string preExpression = ParseSensorData(((AssignationChartElement)current).Expression).ToLower(); string what = Evaluator.Evaluate(preExpression); Evaluator.Assign(where, what); } foreach (var connection in current.Connections) { if (connection.To != null) { current = connection.To.ChartElement; } else { throw new InvalidOperationException("Unconnected chart element. Check your chart connections."); } break; } } } } catch (Exception exception) { if (!(exception is ThreadAbortException)) { OnError(exception); // Lanza el evento Error con el mensaje incluido. if (current != null) { current.BackColor = Color.Red; // Cambia el color del chartElement actual para permitir al usuario conocer la fuente del error. } Thread.CurrentThread.Abort(); // Termina la ejecucion del hilo actual. } } }