public FormulaFormatterViewModel(ILocalizerService localizerService, ITypesContainer container, Func <IArgumentViewModel> argumentViewModelGettingFunc, ISharedResourcesGlobalViewModel sharedResourcesGlobalViewModel, IFormattingService formattingService) { _localizerService = localizerService; _container = container; _argumentViewModelGettingFunc = argumentViewModelGettingFunc; _sharedResourcesGlobalViewModel = sharedResourcesGlobalViewModel; _formattingService = formattingService; ArgumentViewModels = new ObservableCollection <IArgumentViewModel>(); _formulaFormatter = _container.Resolve <IUshortsFormatter>(StringKeys.FORMULA_FORMATTER) as IFormulaFormatter; if (_formulaFormatter == null) { throw new ArgumentException(); } CheckCommand = new RelayCommand(OnCheckCommandExecute); DeleteArgumentCommand = new RelayCommand <IArgumentViewModel>(OnDeleteArgumentExecute); AddArgumentCommand = new RelayCommand(OnAddArgumentExecute); _formulaFormatter.NumberOfSimbolsAfterComma = 3; InitializeFormulaTooltip(); }
public async Task <ushort[]> VisitFormulaFormatter(IUshortsFormatter formatter) { try { IFormulaFormatter formulaFormatter = formatter as IFormulaFormatter; (_formattedValue as INumericValue).NumValue = Math.Round((_formattedValue as INumericValue).NumValue, formulaFormatter.NumberOfSimbolsAfterComma); string numstr = (_formattedValue as INumericValue).NumValue.ToString().Replace(',', '.'); Expression expression = new Expression("solve(" + "(" + formulaFormatter.FormulaString + ")" + "-" + numstr + ",x,0," + ushort.MaxValue + 1 + ")"); if (formulaFormatter.UshortFormattableResources != null) { // int index = 1; // foreach (IUshortFormattable formattableUshortResource in formulaFormatter.UshortFormattableResources) // { // if (formattableUshortResource is IDeviceValueContaining) //{ // IFormattedValue value = // formattableUshortResource.UshortsFormatter.Format( // (formattableUshortResource as IDeviceValueContaining).DeviceUshortsValue); // if (value is INumericValue) // { // double num = (value as INumericValue).NumValue; // expression.addArguments(new Argument("x" + index++, num)); // } //} // } } double x = expression.calculate(); if (double.IsNaN(x)) { throw new ArgumentException(); } if (x == (double)(ushort.MaxValue + 1)) { x = ushort.MaxValue; } return(new[] { (ushort)x }); } catch (Exception e) { Console.WriteLine(e); throw; } }
//public async Task<IFormattedValue> VisitFormulaFormatter(IUshortsFormatter formatter) //{ // INumericValue formattedValue = _typesContainer.Resolve<INumericValue>(); // IterationDefinition iterationDefinition = new IterationDefinition(); // IFormulaFormatter formulaFormatter = formatter as IFormulaFormatter; // iterationDefinition.FormulaString = formulaFormatter.FormulaString; // iterationDefinition.ArgumentNames = new List<string>(); // iterationDefinition.ArgumentValues = new List<double>(); // iterationDefinition.ArgumentNames.Add("x"); // iterationDefinition.ArgumentValues.Add(_ushortsPayload[0]); // iterationDefinition.NumberOfSimbolsAfterComma = formulaFormatter.NumberOfSimbolsAfterComma; // if (formulaFormatter.UshortFormattableResources != null) // { // // int index = 1; // // foreach (IUshortFormattable formattableUshortResource in formulaFormatter.UshortFormattableResources) // // { // // if (formattableUshortResource is IDeviceValueContaining) // // { // // IFormattedValue value = formattableUshortResource.UshortsFormatter // // .Format((formattableUshortResource as IDeviceValueContaining).DeviceUshortsValue); // // if (value is INumericValue) // // { // // double num = (value as INumericValue).NumValue; // // iterationDefinition.ArgumentNames.Add("x" + index++); // // iterationDefinition.ArgumentValues.Add(num); // // } // // } // // } // } // formattedValue.NumValue = MemoizeCalculateResult(iterationDefinition, formulaFormatter.FormulaString, // formulaFormatter.NumberOfSimbolsAfterComma); // return formattedValue; //} public async Task <IFormattedValue> VisitFormulaFormatter(IUshortsFormatter formatter) { INumericValue formattedValue = _typesContainer.Resolve <INumericValue>(); IterationDefinition iterationDefinition = new IterationDefinition(); IFormulaFormatter formulaFormatter = formatter as IFormulaFormatter; iterationDefinition.FormulaString = formulaFormatter.FormulaString; iterationDefinition.ArgumentNames = new List <string>(); iterationDefinition.ArgumentValues = new List <double>(); iterationDefinition.ArgumentNames.Add("x"); iterationDefinition.ArgumentValues.Add(_ushortsPayload[0]); iterationDefinition.NumberOfSimbolsAfterComma = formulaFormatter.NumberOfSimbolsAfterComma; if (formulaFormatter.UshortFormattableResources != null) { int index = 1; foreach (string formattableUshortResource in formulaFormatter.UshortFormattableResources) { var resource = _formattingContext.DeviceContext.DeviceSharedResources.SharedResourcesInContainers.FirstOrDefault( container => container.ResourceName == formattableUshortResource); var propValue = await StaticContainer.Container.Resolve <IPropertyValueService>() .GetValueOfProperty(resource.Resource, _formattingContext.DeviceContext, true, _isLocal); if (propValue.Item is INumericValue numericValue) { double num = numericValue.NumValue; iterationDefinition.ArgumentNames.Add("x" + index++); iterationDefinition.ArgumentValues.Add(num); } } } formattedValue.NumValue = MemoizeCalculateResult(iterationDefinition, formulaFormatter.FormulaString, formulaFormatter.NumberOfSimbolsAfterComma); return(formattedValue); }