/// <summary> /// Получить цвет значения входного канала /// </summary> public string GetCnlValColor(double val, int stat, InCnlProps cnlProps, CnlStatProps cnlStatProps) { try { if (cnlProps == null) { return(DefColor); } else { if (cnlProps.ShowNumber || cnlProps.UnitArr == null || cnlProps.UnitArr.Length != 2 || stat == BaseValues.CnlStatuses.Undefined || stat == BaseValues.CnlStatuses.FormulaError || stat == BaseValues.CnlStatuses.Unreliable) { return(cnlStatProps == null || string.IsNullOrEmpty(cnlStatProps.Color) ? DefColor : cnlStatProps.Color); } else { return(val > 0 ? OnColor : OffColor); } } } catch (Exception ex) { string cnlNumStr = cnlProps == null?cnlProps.CnlNum.ToString() : "?"; throw new ScadaException(string.Format(Localization.UseRussian ? "Ошибка при получении цвета значения входного канала {0}" : "Error getting color of input channel {0}", cnlNumStr), ex); } }
/// <summary> /// Get the color of the input channel value /// </summary> public string GetCnlValColor(double val, int stat, InCnlProps cnlProps, CnlStatProps cnlStatProps) { try { if (cnlProps == null) { return(DefColor); } if (cnlProps.ShowNumber || cnlProps.UnitArr == null || cnlProps.UnitArr.Length != 2 || stat == BaseValues.CnlStatuses.Undefined || stat == BaseValues.CnlStatuses.FormulaError || stat == BaseValues.CnlStatuses.Unreliable) { return(cnlStatProps == null || string.IsNullOrEmpty(cnlStatProps.Color) ? DefColor : cnlStatProps.Color); } return(val > 0 ? OnColor : OffColor); } catch (Exception ex) { string cnlNumStr = cnlProps == null?cnlProps.CnlNum.ToString() : "?"; throw new ScadaException($"Error getting color of input channel {cnlNumStr}", ex); } }
/// <summary> /// Получить текст события /// </summary> public string GetEventText(EventTableLight.Event ev, InCnlProps cnlProps, CnlStatProps cnlStatProps) { if (string.IsNullOrEmpty(ev.Descr)) { // текст в формате "<статус>: <значение>" StringBuilder sbText = cnlStatProps == null ? new StringBuilder() : new StringBuilder(cnlStatProps.Name); if (ev.NewCnlStat > BaseValues.CnlStatuses.Undefined) { if (sbText.Length > 0) { sbText.Append(": "); } sbText.Append(FormatCnlVal(ev.NewCnlVal, ev.NewCnlStat, cnlProps, true)); } return(sbText.ToString()); } else { // только описание события return(ev.Descr); } }
/// <summary> /// Заполнить свойства статусов входных каналов /// </summary> protected void FillCnlStatProps() { try { log.WriteAction(Localization.UseRussian ? "Заполнение свойств статусов входных каналов" : "Fill input channel statuses properties"); DataTable tblEvType = BaseTables.EvTypeTable; int statusCnt = tblEvType.Rows.Count; SortedList <int, CnlStatProps> newCnlStatProps = new SortedList <int, CnlStatProps>(statusCnt); for (int i = 0; i < statusCnt; i++) { DataRow row = tblEvType.Rows[i]; CnlStatProps cnlStatProps = new CnlStatProps((int)row["CnlStatus"]) { Color = (string)row["Color"], Name = (string)row["Name"] }; newCnlStatProps.Add(cnlStatProps.Status, cnlStatProps); } CnlStatProps = newCnlStatProps; } catch (Exception ex) { log.WriteException(ex, (Localization.UseRussian ? "Ошибка при заполнении свойств статусов входных каналов: " : "Error filling input channel statuses properties")); } }
/// <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); }
/// <summary> /// Получить свойства статусов входных каналов, ключ - статус /// </summary> public SortedList <int, CnlStatProps> GetCnlStatProps() { DataTable tblEvType = baseTables.EvTypeTable; int statusCnt = tblEvType.Rows.Count; SortedList <int, CnlStatProps> cnlStatPropsList = new SortedList <int, CnlStatProps>(tblEvType.Rows.Count); foreach (DataRow row in tblEvType.Rows) { CnlStatProps cnlStatProps = new CnlStatProps((int)row["CnlStatus"]) { Color = (string)row["Color"], Name = (string)row["Name"] }; cnlStatPropsList.Add(cnlStatProps.Status, cnlStatProps); } return(cnlStatPropsList); }
/// <summary> /// Получить отображаемое событие на основе данных события. /// </summary> /// <remarks>Метод всегда возвращает объект, не равный null.</remarks> public DispEvent GetDispEvent(EventTableLight.Event ev, DataFormatter dataFormatter) { DispEvent dispEvent = new DispEvent(); try { dispEvent.Num = ev.Number; dispEvent.Time = ev.DateTime.ToLocalizedString(); dispEvent.Ack = ev.Checked ? CommonPhrases.EventAck : CommonPhrases.EventNotAck; InCnlProps cnlProps = GetCnlProps(ev.CnlNum); CnlStatProps cnlStatProps = GetCnlStatProps(ev.NewCnlStat); if (cnlProps == null) { dispEvent.Obj = GetObjName(ev.ObjNum); dispEvent.KP = GetKPName(ev.KPNum); } else { dispEvent.Obj = cnlProps.ObjName; dispEvent.KP = cnlProps.KPName; dispEvent.Cnl = cnlProps.CnlName; dispEvent.Color = dataFormatter.GetCnlValColor( ev.NewCnlVal, ev.NewCnlStat, cnlProps, cnlStatProps); dispEvent.Sound = cnlProps.EvSound; } dispEvent.Text = dataFormatter.GetEventText(ev, cnlProps, cnlStatProps); } catch (Exception ex) { log.WriteException(ex, Localization.UseRussian ? "Ошибка при получении отображаемого события на основе данных события" : "Error getting displayed event based on the event data"); } return(dispEvent); }
/// <summary> /// Get event text /// </summary> public string GetEventText(EventTableLight.Event ev, InCnlProps cnlProps, CnlStatProps cnlStatProps) { if (string.IsNullOrEmpty(ev.Descr)) { // text in the format "<status>: <value>" var sbText = cnlStatProps == null ? new StringBuilder() : new StringBuilder(cnlStatProps.Name); if (ev.NewCnlStat > BaseValues.CnlStatuses.Undefined) { if (sbText.Length > 0) { sbText.Append(": "); } sbText.Append(FormatCnlVal(ev.NewCnlVal, ev.NewCnlStat, cnlProps, true)); } return(sbText.ToString()); } // description of the event only return(ev.Descr); }
/// <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()); }