Example #1
0
        /// <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);
        }
Example #4
0
 /// <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);
        }
Example #6
0
 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);
 }
Example #7
0
 /// <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);
         }
     }
 }