/// <summary> /// Метод для очистки всех коллекций AnData, RVData, BatteryNums, FrequencyItems /// </summary> public void ClearAll() { try { AnData.Clear(); RVData.Clear(); BatteryNums.Clear(); FrequencyItems.Clear(); SelectedFrequency = null; LLPoint.Clear(); ChartTitle = Thread.CurrentThread.CurrentUICulture.ToString().Contains("en") ? "Battery Parameters" : "Параметры АКБ"; } catch (Exception ex) { MessageBox.Show(ex.Message); } }
/// <summary> /// Метод для вычисления моды из выборки сопротивлений (+построение линии уровня (моды)) /// </summary> public void GetModa() { try { if (RVData.Count() > 1) { var minValue = RVData.Select(item => item.CellResistance).Min(); var maxValue = RVData.Select(item => item.CellResistance).Max(); int numOfIntervals = (int)Math.Round(1 + 3.322 * Math.Log10(RVData.Count())); var Interval = Math.Abs((maxValue - minValue) / numOfIntervals); if (Interval > Math.Abs(minValue) && 0 != minValue) { Interval = 0.1 * Math.Abs(minValue); numOfIntervals = (int)Math.Abs(Math.Round((maxValue - minValue) / Interval)); } var frequencyArray = Enumerable.Range(1, numOfIntervals).Select(i => { return(RVData.Select(item => item.CellResistance).ToList().FindAll(item => item >= (minValue + (Interval * (i - 1))) && item <= (minValue + (Interval * i))).Count()); }).ToArray(); var maxFreqIndex = frequencyArray.ToList().IndexOf(frequencyArray.Max()); var minLimitInterval = minValue + ((Interval * maxFreqIndex)); if (maxFreqIndex == 0) { var temp = frequencyArray.ToList(); temp.Insert(0, 0); frequencyArray = temp.ToArray(); maxFreqIndex++; } else { if (maxFreqIndex == frequencyArray.Count() - 1) { var temp = frequencyArray.ToList(); temp.Add(0); frequencyArray = temp.ToArray(); } } Moda = minLimitInterval + Interval * ((double)(frequencyArray[maxFreqIndex] - frequencyArray[maxFreqIndex - 1]) / (double)((frequencyArray[maxFreqIndex] - frequencyArray[maxFreqIndex - 1]) + (frequencyArray[maxFreqIndex] - frequencyArray[maxFreqIndex + 1]))); } else { Moda = RVData.Count == 0 ? 0 : RVData.Select(item => item.CellResistance).Max(); } LLPoint = RVData.Select(item => new LevelLinePoint() { PointX = item.CellName, PointY = Moda }).ToList(); } catch (Exception ex) { throw new Exception(ex.Message); } }
/// <summary> /// Метод для вычисления максимальных и минимальных значений осей R и U /// </summary> public void GetAxisScale() { try { var maxRealV = RVData.Select(item => item.CellVoltage).Max(); // получаем максимальное значение напряжения var minRealV = RVData.Where(item => // получаем минимальное значение напряжения, с условием, { // что ононе меньше 50% от максимального значения if (item.CellVoltage < maxRealV * 0.5) { return(false); } else { return(true); } }).Select(item => item.CellVoltage).Min(); var maxScaleV = maxRealV * 1.06; // добавляем к максимальному знач. напряж. 6% сверху var minScaleV = minRealV * 0.1; // "подрезаем" минимальное значение на 10% снизу var scaleRangeV = maxScaleV - minScaleV; // вычисляем отображаемый диапазон напряжения IntervalV = 0; // scaleRangeV / 10; // обнуляем за ненадобностью double maxScaleR = MaxScaleR; double minScaleR = MinScaleR; if (IsFixYRange.Equals(false)) { var maxRealR = RVData.Select(item => item.CellResistance).Max(); // получаем максимальное значение сопротивления (угла) var minRealR = RVData.Select(item => item.CellResistance).Min(); // получаем минимальное значение сопротивления (угла) minScaleR = minRealR > 0 ? minRealR * 0.3 : minRealR * 1.05; // "подрезаем" положительное минимальное значение на 30% снизу или // добавляем к отрицательному минимальному знач. 5% снизу if (maxRealR > 0) { if (minRealR > 0) { maxScaleR = maxRealR // подгоняем макс. положит. знач. сопрот. так, чтобы оно зизуально было меньше / ((minRealV - minScaleV) / scaleRangeV - 0.05); // мин. знач. напряж. на 5% от отображаемого диапазона или } else { maxScaleR = (maxRealR - minScaleR) // если мин. значение сопрот отрицательное, то подгоняем макс. знач. сопрот. так, / ((minRealV - minScaleV) / scaleRangeV - 0.05) // чтобы оно визуально было меньше мин. знач. напряж. на 5% от отображаемого диапазона или - Math.Abs(minScaleR); } } else { maxScaleR = Math.Abs(minScaleR * 0.12); // добавляем к отрицательному максимальному знач. 12% сверху } IntervalR = (maxScaleR - minScaleR) / 10; // вычисляем величину интервала между линиями сетки (10 линий сетки) } // Логика исключающая случаи, когда MaxScaleR(V) меньше MinScaleR(V) if (MinScaleR > maxScaleR || MinScaleV > maxScaleV) { MinScaleR = minScaleR; MaxScaleR = maxScaleR; MinScaleV = minScaleV; MaxScaleV = maxScaleV; } else { MaxScaleR = maxScaleR; MinScaleR = minScaleR; MaxScaleV = maxScaleV; MinScaleV = minScaleV; } // Задаем ширину графика, исходя из количества элементов (столбцов гистогрвммы) WidthOfChart = RVData.Count() * 50 + 120; // Но ширина графика не должна быть меньше 320 if (WidthOfChart <= 320) { WidthOfChart = 320; } } catch (Exception ex) { throw new Exception(ex.Message); } }
/// <summary> /// Метод для получения набора значений параметров R и U, а также для составления /// списка номеров батарей и частот тестового сигнала /// </summary> public void GetRVData() { try { IsCanBild = false; var rvdata = new List <CellData>(); RVData.Clear(); var anDataBat = AnData.Where(item => item.PrimNumber.Equals(SelectedBattery)); FrequencyItems = anDataBat.Select(item => item.Frequency).Distinct().OrderBy(item => int.Parse(item)).ToList(); if (SelectedFrequency == null) { SelectedFrequency = FrequencyItems.LastOrDefault(); } var AnDataBatFreq = new List <AnalizerData>(anDataBat.Where(item => item.Frequency.Equals(SelectedFrequency))); switch (SelectedSortIndex) { case 0: AnDataBatFreq = !SortDirection?AnDataBatFreq.OrderBy(item => int.Parse(item.SecNumber, new CultureInfo("EN"))).ToList() : AnDataBatFreq.OrderByDescending(item => int.Parse(item.SecNumber, new CultureInfo("EN"))).ToList(); break; case 1: AnDataBatFreq = !SortDirection?AnDataBatFreq.OrderBy(item => double.Parse(item.ZValue, new CultureInfo("EN"))).ToList() : AnDataBatFreq.OrderByDescending(item => double.Parse(item.ZValue, new CultureInfo("EN"))).ToList(); break; case 2: AnDataBatFreq = !SortDirection?AnDataBatFreq.OrderBy(item => double.Parse(item.RValue, new CultureInfo("EN"))).ToList() : AnDataBatFreq.OrderByDescending(item => double.Parse(item.RValue, new CultureInfo("EN"))).ToList(); break; case 3: AnDataBatFreq = !SortDirection?AnDataBatFreq.OrderBy(item => double.Parse(item.XValue, new CultureInfo("EN"))).ToList() : AnDataBatFreq.OrderByDescending(item => double.Parse(item.XValue, new CultureInfo("EN"))).ToList(); break; case 4: AnDataBatFreq = !SortDirection?AnDataBatFreq.OrderBy(item => double.Parse(item.AValue, new CultureInfo("EN"))).ToList() : AnDataBatFreq.OrderByDescending(item => double.Parse(item.AValue, new CultureInfo("EN"))).ToList(); break; case 5: AnDataBatFreq = !SortDirection?AnDataBatFreq.OrderBy(item => double.Parse(item.Voltage, new CultureInfo("EN"))).ToList() : AnDataBatFreq.OrderByDescending(item => double.Parse(item.Voltage, new CultureInfo("EN"))).ToList(); break; } switch (SelectedParameterIndex) { case 0: rvdata = new List <CellData>(AnDataBatFreq.Select(item => new CellData(item.SecNumber, double.Parse(item.ZValue, new CultureInfo("EN")), double.Parse(item.Voltage, new CultureInfo("EN"))))); break; case 1: rvdata = new List <CellData>(AnDataBatFreq.Select(item => new CellData(item.SecNumber, double.Parse(item.RValue, new CultureInfo("EN")), double.Parse(item.Voltage, new CultureInfo("EN"))))); break; case 2: rvdata = new List <CellData>(AnDataBatFreq.Select(item => new CellData(item.SecNumber, double.Parse(item.XValue, new CultureInfo("EN")), double.Parse(item.Voltage, new CultureInfo("EN"))))); break; case 3: rvdata = new List <CellData>(AnDataBatFreq.Select(item => new CellData(item.SecNumber, double.Parse(item.AValue, new CultureInfo("EN")), double.Parse(item.Voltage, new CultureInfo("EN"))))); break; } RVData = new ObservableCollection <CellData>(rvdata); IsCanBild = true; ChartTitle = SelectedBattery; } catch (Exception ex) { throw new Exception(ex.Message); } }