예제 #1
0
        /// <summary>
        /// Получить расширенные текущие данные входных каналов
        /// </summary>
        private CnlDataExtDTO[] GetCnlDataExtDTOs(IList <int> cnlList)
        {
            int cnlCnt = cnlList.Count;

            CnlDataExtDTO[] cnlDataDTOs = new CnlDataExtDTO[cnlCnt];

            DataAccess dataAccess = AppData.DataAccess;
            DateTime   dataAge;

            SrezTableLight.Srez snapshot = dataAccess.DataCache.GetCurSnapshot(out dataAge);

            string emptyVal    = "";
            bool   dataVisible = snapshot != null &&
                                 DataFormatter.CurDataVisible(dataAge, DateTime.Now, out emptyVal);

            for (int i = 0; i < cnlCnt; i++)
            {
                int           cnlNum     = cnlList[i];
                CnlDataExtDTO cnlDataDTO = new CnlDataExtDTO(cnlNum);
                cnlDataDTOs[i] = cnlDataDTO;

                SrezTableLight.CnlData cnlData;
                snapshot.GetCnlData(cnlNum, out cnlData);
                cnlDataDTO.Val  = cnlData.Val;
                cnlDataDTO.Stat = cnlData.Stat;

                if (dataVisible)
                {
                    InCnlProps cnlProps = dataAccess.GetCnlProps(cnlNum);
                    string     text;
                    string     textWithUnit;
                    DataFormatter.FormatCnlVal(cnlData.Val, cnlData.Stat, cnlProps, out text, out textWithUnit);

                    cnlDataDTO.Text         = text;
                    cnlDataDTO.TextWithUnit = textWithUnit;
                    cnlDataDTO.Color        = DataFormatter.GetCnlValColor(cnlData.Val, cnlData.Stat, cnlProps,
                                                                           dataAccess.GetColorByStat);
                }
                else
                {
                    cnlDataDTO.Text = cnlDataDTO.TextWithUnit = emptyVal;
                }
            }

            return(cnlDataDTOs);
        }
예제 #2
0
        /// <summary>
        /// Создать и заполнить массив расширенных данных входных каналов
        /// </summary>
        private CnlDataExt[] CreateCnlDataExtArr(IList <int> cnlList, SrezTableLight.Srez snapshot,
                                                 bool dataVisible, string emptyVal)
        {
            DataAccess dataAccess = AppData.DataAccess;
            int        cnlCnt     = cnlList == null ? 0 : cnlList.Count;

            CnlDataExt[] cnlDataExtArr = new CnlDataExt[cnlCnt];

            for (int i = 0; i < cnlCnt; i++)
            {
                int        cnlNum     = cnlList[i];
                CnlDataExt cnlDataExt = new CnlDataExt(cnlNum);
                cnlDataExtArr[i] = cnlDataExt;

                if (dataVisible)
                {
                    double val;
                    int    stat;
                    snapshot.GetCnlData(cnlNum, out val, out stat);

                    if (!double.IsNaN(val))
                    {
                        cnlDataExt.Val  = val;
                        cnlDataExt.Stat = stat;
                    }

                    InCnlProps cnlProps = dataAccess.GetCnlProps(cnlNum);
                    string     text;
                    string     textWithUnit;
                    DataFormatter.FormatCnlVal(val, stat, cnlProps, out text, out textWithUnit);

                    cnlDataExt.Text         = text;
                    cnlDataExt.TextWithUnit = textWithUnit;
                    CnlStatProps cnlStatProps = dataAccess.GetCnlStatProps(stat);
                    cnlDataExt.Color = DataFormatter.GetCnlValColor(val, stat, cnlProps, cnlStatProps);
                }
                else
                {
                    cnlDataExt.Text = cnlDataExt.TextWithUnit = emptyVal;
                }
            }

            return(cnlDataExtArr);
        }
예제 #3
0
        /// <summary>
        /// Преобразовать точку тренда в запись JavaScript
        /// </summary>
        protected string TrendPointToJs(double val, int stat, InCnlProps cnlProps)
        {
            string text;
            string textWithUnit;

            dataFormatter.FormatCnlVal(val, stat, cnlProps, out text, out textWithUnit);
            CnlStatProps cnlStatProps = dataAccess.GetCnlStatProps(stat);
            string       color        = dataFormatter.GetCnlValColor(val, stat, cnlProps, cnlStatProps);

            // для text и textWithUnit было бы корректно использовать метод HttpUtility.JavaScriptStringEncode(),
            // но он опускается для повышения скорости
            double chartVal = stat > 0 ? val : double.NaN;

            return((new StringBuilder("[")
                    .Append(double.IsNaN(chartVal) ? "NaN" : chartVal.ToString(CultureInfo.InvariantCulture))
                    .Append(", \"")
                    .Append(text)
                    .Append("\", \"")
                    .Append(textWithUnit)
                    .Append("\", \"")
                    .Append(color)
                    .Append("\"]")).ToString());
        }
예제 #4
0
        /// <summary>
        /// Обработать директиву, связанную со значением ячейки
        /// </summary>
        protected override void ProcVal(Cell cell, string valName)
        {
            string nodeText = null;

            if (valName == "Title")
            {
                nodeText = string.Format(TablePhrases.HourDataTitle,
                                         tableView.Title,
                                         date.ToLocalizedDateString(),
                                         WFrmTable.GetLocalizedHour(startHour) + " - " + WFrmTable.GetLocalizedHour(endHour));
            }
            else if (valName == "Gen")
            {
                nodeText = TablePhrases.HourDataGen + genDT.ToLocalizedString();
            }
            else if (valName == "ItemCol")
            {
                nodeText = TablePhrases.ItemCol;
            }
            else if (valName.StartsWith("H"))
            {
                // заголовок таблицы часовых данных
                if (int.TryParse(valName.Substring(1), out int hour))
                {
                    nodeText = WFrmTable.GetLocalizedHour(hour);
                }
            }
            else if (viewItem != null)
            {
                if (valName == "Name")
                {
                    nodeText = viewItem.Caption;
                }
                else if (valName.StartsWith("h"))
                {
                    // часовые данные
                    if (int.TryParse(valName.Substring(1), out int hour))
                    {
                        if (viewItem.CnlNum > 0 && startHour <= hour && hour <= endHour)
                        {
                            DateTime       colDT     = date.AddHours(hour);
                            SrezTableLight hourTable = hour >= 0 ? reqDateHourTable : prevDateHourTable;
                            hourTable.SrezList.TryGetValue(colDT, out SrezTableLight.Srez snapshot);

                            if (dataFormatter.HourDataVisible(colDT, genDT, snapshot != null, out string emptyVal))
                            {
                                // получение данных
                                snapshot.GetCnlData(viewItem.CnlNum, out double val, out int stat);

                                // форматирование данных
                                dataFormatter.FormatCnlVal(val, stat, viewItem.CnlProps, ".", "",
                                                           out string text, out string textWithUnit, out bool textIsNumber);
                                string color = dataFormatter.GetCnlValColor(val, stat, viewItem.CnlProps,
                                                                            dataAccess.GetCnlStatProps(stat));

                                // вывод данных
                                nodeText = text;
                                workbook.SetColor(cell.Node, null, color);
                                if (textIsNumber)
                                {
                                    cell.SetNumberType();
                                }
                            }
                            else
                            {
                                nodeText = emptyVal;
                            }
                        }
                        else
                        {
                            nodeText = "";
                        }
                    }
                }
            }

            if (nodeText != null)
            {
                cell.DataNode.InnerText = nodeText;
            }
        }
예제 #5
0
        /// <summary>
        /// Вывести в отчёт минутные данные
        /// </summary>
        private void WriteMinData(Table table)
        {
            // получение трендов
            int cnlCnt = cnlNums.Length;

            Trend[] trends = new Trend[cnlCnt];
            Trend   trend;

            for (int i = 0; i < cnlCnt; i++)
            {
                int cnlNum = cnlNums[i];

                if (period == 1)
                {
                    trend = dataAccess.DataCache.GetMinTrend(startDate, cnlNum);
                }
                else
                {
                    trend = new Trend(cnlNum);
                    for (int d = 0; d < period; d++)
                    {
                        Trend dailyTrend = dataAccess.DataCache.GetMinTrend(startDate.AddDays(d), cnlNum);
                        trend.Points.AddRange(dailyTrend.Points);
                    }
                }

                trends[i] = trend;
            }

            // создание связки трендов
            TrendBundle trendBundle = new TrendBundle();

            trendBundle.Init(trends);

            // вывод в отчёт
            DataFormatter dataFormatter = new DataFormatter();
            DateTime      prevDate      = period > 1 ? DateTime.MinValue : DateTime.MaxValue /*не выводить даты*/;

            foreach (TrendBundle.Point point in trendBundle.Series)
            {
                DateTime pointDT = point.DateTime;

                // вывод строки с новой датой
                if (prevDate < pointDT.Date)
                {
                    prevDate = pointDT.Date;
                    Row dateRow = dateRowTemplate.Clone();
                    dateRow.Cells[0].DataNode.InnerText = pointDT.ToLocalizedDateString();
                    table.AppendRow(dateRow);
                }

                // вывод строки с минутными данными
                Row dataRow = dataRowTemplate.Clone();
                dataRow.Cells[0].DataNode.InnerText = pointDT.ToLocalizedTimeString();

                for (int i = 0; i < cnlCnt; i++)
                {
                    SrezTableLight.CnlData cnlData = point.CnlData[i];

                    string text;
                    string textWithUnit;
                    bool   textIsNumber;
                    dataFormatter.FormatCnlVal(cnlData.Val, cnlData.Stat, cnlPropsArr[i], ".", "",
                                               out text, out textWithUnit, out textIsNumber);

                    Cell cell = dataRow.Cells[i + 1];
                    cell.DataNode.InnerText = text;
                    if (textIsNumber)
                    {
                        cell.SetNumberType();
                    }
                }

                table.AppendRow(dataRow);
            }
        }