public void ImportFormula(DsonTypes.DsonDocument doc, DsonTypes.Formula formula) { FormulaRecipe recipe = new FormulaRecipe { Output = ConvertChannelUri(doc, formula.output), Operations = new List <OperationRecipe>() }; SplineOperationBuilder splineOperationBuilder = new SplineOperationBuilder(); foreach (DsonTypes.Operation operation in formula.operations) { ImportOperation(splineOperationBuilder, recipe.Operations, doc, operation); } if (formula.stage == DsonTypes.Stage.Sum) { recipe.Stage = FormulaRecipe.FormulaStage.Sum; } else if (formula.stage == DsonTypes.Stage.Multiply) { recipe.Stage = FormulaRecipe.FormulaStage.Multiply; } else { throw new InvalidOperationException(); } formulaRecipes.Add(recipe); }
private void ImportOperation(SplineOperationBuilder splineOperationBuilder, List <OperationRecipe> operations, DsonTypes.DsonDocument doc, DsonTypes.Operation operation) { if (operation.op == DsonTypes.Operator.Push) { if (operation.url != null) { splineOperationBuilder.ConfirmInactive(); string channelRef = ConvertChannelUri(doc, operation.url); operations.Add(OperationRecipe.MakePushChannel(channelRef)); } else { Object val = operation.val; switch (val) { case JArray arrayValue: float[] values = arrayValue.ToObject <float[]>(); splineOperationBuilder.AddValueArray(values); break; default: if (splineOperationBuilder.Active) { splineOperationBuilder.AddSize(Convert.ToInt32(operation.val)); } else { float value = Convert.ToSingle(operation.val); operations.Add(OperationRecipe.MakePushConstant(value)); } break; } } } else if (operation.op == DsonTypes.Operator.Add) { splineOperationBuilder.ConfirmInactive(); operations.Add(OperationRecipe.Make(OperationRecipe.OperationKind.Add)); } else if (operation.op == DsonTypes.Operator.Sub) { splineOperationBuilder.ConfirmInactive(); operations.Add(OperationRecipe.Make(OperationRecipe.OperationKind.Sub)); } else if (operation.op == DsonTypes.Operator.Mult) { splineOperationBuilder.ConfirmInactive(); operations.Add(OperationRecipe.Make(OperationRecipe.OperationKind.Mul)); } else if (operation.op == DsonTypes.Operator.Div) { splineOperationBuilder.ConfirmInactive(); operations.Add(OperationRecipe.Make(OperationRecipe.OperationKind.Div)); } else if (operation.op == DsonTypes.Operator.SplineTcb) { operations.Add(splineOperationBuilder.Build()); } }