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