/// <summary> /// Вычислить формулу /// </summary> /// <param name="formula">формула</param> /// <returns>значение. null, при вычислении формулы произошла ошибка</returns> private double?CalculateFormula(string formula) { var formulaForVar = CalculatorE.ComputeFormula(formula); return(formulaForVar.GetFormulaComputeResultType() == TypeOfComputeFormulaResult.DoubleResult ? (double?)formulaForVar.CalculatedDoubleValue : null); }
/// <summary> /// Получить текст для вывода на индикатор /// </summary> /// <returns>Текст для индикатора</returns> public string GetIndicatorText() { var res = string.Empty; if (!IsPowerOn()) { res = res.PadRight(_digitsNumber, ' '); return(res); } var formulaResult = CalculatorE.ComputeFormula(GetFormula()); if (formulaResult.GetFormulaComputeResultType() == TypeOfComputeFormulaResult.FormulaWasEmpty) { res = res.PadRight(_digitsNumber, ' '); return(res); } if (formulaResult.GetFormulaComputeResultType() != TypeOfComputeFormulaResult.DoubleResult) { return("Error"); } var valueAsString = formulaResult.CalculatedDoubleValue.ToString(CultureInfo.InvariantCulture).Split('.'); var beforePointText = valueAsString[0]; var afterPointText = valueAsString.Length > 1 ? valueAsString[1] : string.Empty; var digitsBeforePoint = _digitsNumber - _digitsAfterPoint; // Цифры после запятой. Удаляем лишние или дополняем нулями, если не хватает // Дополняем нулями, если не хватает if (afterPointText.Length < _digitsAfterPoint) { afterPointText = afterPointText.PadRight(_digitsAfterPoint, '0'); } // Удаляем лишнее, если оно есть if (afterPointText.Length > _digitsAfterPoint) { afterPointText = afterPointText.Remove(_digitsAfterPoint); } // Дополняем нулями, если не хватает if (beforePointText.Length < digitsBeforePoint) { beforePointText = beforePointText.PadLeft(digitsBeforePoint, ' '); } // Удаляем лишнее, если оно есть if (beforePointText.Length > digitsBeforePoint) { beforePointText = beforePointText.Remove(0, beforePointText.Length - digitsBeforePoint); } res = beforePointText + (_digitsAfterPoint == 0 ? "" : "." + afterPointText); return(res); }
/// <summary> /// ToDo: костыль для шагового двигателя /// Получить текст для вывода на индикатор /// </summary> /// <returns>Значение для установки на двигателе</returns> public double?GetIndicatorValue() { if (!IsPowerOn()) { return(null); } var formulaResult = CalculatorE.ComputeFormula(GetFormula()); return(formulaResult.GetFormulaComputeResultType() == TypeOfComputeFormulaResult.DoubleResult ? (double?)formulaResult.CalculatedDoubleValue : null); }
/// <summary> /// Для всех переменных вычислить формулы и записать значения /// </summary> private void CalculateVariablesFormulaAndWriteValues() { foreach (var varId in UsedVariables) { var formula = GlobalFormulaKeeper.Instance.GetVariableFormulaText(GetId(), varId, 0); var formulaForVar = CalculatorE.ComputeFormula(formula); if (formulaForVar.GetFormulaComputeResultType() == TypeOfComputeFormulaResult.DoubleResult) { Profile.VariableStorage.WriteValue(varId, formulaForVar.CalculatedDoubleValue); } } }
public bool GetLineState() { if (!IsPowerOn()) { return(false); } var calcResult = CalculatorE.ComputeFormula(GetFormula()); if (calcResult.GetFormulaComputeResultType() == TypeOfComputeFormulaResult.FormulaWasEmpty) { return(true); } return(calcResult.GetFormulaComputeResultType() == TypeOfComputeFormulaResult.BooleanResult && calcResult.CalculatedBoolBoolValue); }
public DescriptorRange() { StateDescriptors.Add(new Connector { Id = 0, Name = "*", Order = 0 }); CalculatorE.RegisterTokenizer(FormulaResultTokenizer); CalculatorE.RegisterPreprocessor(FormulaResultProcessor); _inputValueCalculator.RegisterTokenizer(_calculatorVariableAccessAddonCachedValues.VariableTokenizer); _inputValueCalculator.RegisterPreprocessor(_calculatorVariableAccessAddonCachedValues.VariablePreprocessor); // Для Range повторитель всегда включен EnableRepeater(true); //_inputValueCalculator.RegisterTokenizer(CalculatorVariableAccessAddonE.VariableTokenizer); //_inputValueCalculator.RegisterPreprocessor(CalculatorVariableAccessAddonE.VariablePreprocessor); }
/// <summary> /// Установить значение переменных в соответствие с указанной для этого формулой /// </summary> /// <param name="stateId"></param> public void SetState(int stateId) { if (StateDescriptors.Count(sd => sd.Id == stateId) == 0) { return; } if (!IsPowerOn() || stateId == -1) { return; } foreach (var varId in UsedVariables) { var formula = GlobalFormulaKeeper.Instance.GetVariableFormulaText(GetId(), varId, stateId); if (string.IsNullOrEmpty(formula)) { return; } var formulaResult = CalculatorE.ComputeFormula(formula); if (formulaResult.GetFormulaComputeResultType() == TypeOfComputeFormulaResult.DoubleResult) { Profile.VariableStorage.WriteValue(varId, formulaResult.CalculatedDoubleValue); } } }