using DataEntity; using DataEntity.Share; using HxEnum; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Configuration; using System.Linq; using System.Net.Sockets; using System.Reflection; using System.Security.Cryptography; using System.Text; using System.Text.RegularExpressions; using System.Windows.Media; using System.Xml; using XCommon.Log; using XImagingXhandler.XDAL; using static HxEnum.DataTypeEnum; namespace XCommon { /// /// 共用类 /// public class ComUtility { #region 获取配置参数 /// /// 获取配置参数 /// /// public static bool GetConfigParams() { bool bIsOk = false; string strValue = string.Empty; double dValue = 0d; try { do { #region 窗体显示尺寸 Shared.Config.DisplaySizeW = 1920d; Shared.Config.DisplaySizeH = 1080d; Shared.Config.DisplayMarginTop = 0d; #region 窗体显示尺寸 if (!GetConfigValue("displaySize", out strValue)) { break; } string[] displaySizes = strValue.Split('*'); if (displaySizes.Length == 2) { if (!ParseToDouble(displaySizes[0], out dValue)) { break; } Shared.Config.DisplaySizeW = dValue; if (!ParseToDouble(displaySizes[1], out dValue)) { break; } Shared.Config.DisplaySizeH = dValue; } #endregion #region 窗体显示距顶距离 if (!GetConfigValue("displayMarginTop", out strValue)) { break; } if (!ParseToDouble(strValue, out dValue)) { break; } Shared.Config.DisplayMarginTop = dValue; #endregion #endregion bIsOk = true; } while (false); } catch (Exception ex) { LoggerHelper.ErrorLog("ERROR:", ex); } return bIsOk; } /// /// 获取Config的值 /// /// /// public static bool GetConfigValue(string key, out string value) { value = ConfigurationManager.AppSettings.Get(key); if (value == null) { LoggerHelper.ErrorLog(string.Format("[GetConfigValue]: Key:{0}, Value:{1}", key, value)); return false; } return true; } #endregion #region 获取Guid /// /// 获取Guid /// /// public static string GetGuid() { return Guid.NewGuid().ToString("N"); } #endregion #region 获取MD5值 /// /// 获取MD5值 /// /// /// public static string GetMD5(string strVal) { MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider(); byte[] bytValue, bytHash; bytValue = Encoding.UTF8.GetBytes(strVal); bytHash = md5.ComputeHash(bytValue); md5.Clear(); string sTemp = ""; for (int i = 0; i < bytHash.Length; i++) { sTemp += bytHash[i].ToString("X").PadLeft(2, '0'); } return sTemp.ToLower(); } #endregion #region 有效孔字符串转换成List /// /// 有效孔字符串转换成List /// /// /// public static List GetValidWells(string strValidWells) { List lstValidWells = new List(); if (!string.IsNullOrEmpty(strValidWells)) { string[] validWellsArry = strValidWells.Split(','); lstValidWells = validWellsArry.ToList(); } return lstValidWells; } #endregion #region 获取放盖位名称 /// /// 获取放盖位名称 /// /// /// public static List GetPlateCoverLatticeName() { string coatingCoverLatticeId = ConfigurationManager.AppSettings["coatingCoverLatticeId"].ToString(); // 涂布的板放盖位号:P2,P3 List listCoatingCoverLatticeId = coatingCoverLatticeId.Split(',').ToList(); return listCoatingCoverLatticeId; } #endregion #region 根据输入的行数,取得对应的字符串名称 /// /// 根据输入的行数,取得对应的字符串名称 /// /// 当前的行号 /// 该行对应的字母 public static string GetRowChar(int rowNum) { var a = rowNum / 26; var b = rowNum % 26; if (a > 0) return GetRowChar(a - 1) + (char)(b + 65); return ((char)(b + 65)).ToString(); } #endregion #region 根据输入的行字母,取得对应的行号 /// /// 根据输入的行字母,取得对应的行号 /// /// 当前的行字母 /// 该行号 public static string GetRowIndexByRowChar(string rowName) { int currentValue = Convert.ToInt32(rowName.ToCharArray()[0]); return (currentValue - 65).ToString(); } #endregion #region 根据输入的行名称,取得对应的行index public static int GetRowIndex(string col) { if (string.IsNullOrEmpty(col)) { return -1; } return (Convert.ToChar(col) - 65); } #endregion #region 根据输入的行编号,取得对应的行名称 public static string GetRowName(string rowNum) { return Convert.ToChar((Convert.ToInt32(rowNum) + 65)).ToString(); } #endregion #region 获取列号: A11 -> 11 /// /// 获取列号 /// /// /// public static int GetColNum(string wellName) { string colNum = Regex.Replace(wellName, "[A-Za-z ]", string.Empty); return int.Parse(colNum); } #endregion #region 获取行字母: A11 -> A /// /// 获取行字母 /// /// /// public static string GetRowChar(string wellName) { return Regex.Replace(wellName, "[0-9 ]", string.Empty); } #endregion #region 获取吸头盒、孔板有效孔位信息 /// /// 获取吸头盒、孔板有效孔位信息 /// /// /// /// public static string GetValidWells(int rowCount, int columnCount) { string validWells = string.Empty; for (int i = 1; i < rowCount + 1; i++) { string rowName = ComUtility.GetRowChar(i - 1); for (int j = 1; j < columnCount + 1; j++) { string wellName = rowName + j.ToString(); validWells += wellName + ","; } } if (!string.IsNullOrEmpty(validWells)) { validWells = validWells.Substring(0, validWells.Length - 1); } return validWells; } #endregion #region 从xml中获取通道数组值 /// /// 从xml中获取通道数组值 /// /// /// public static int[] GetChannelsFromXml(string xmlChs) { int[] nArrayChs = new int[0]; if (xmlChs.Contains(",")) { string[] chs = xmlChs.Split(','); nArrayChs = Array.ConvertAll(chs, s => int.Parse(s)); } else { if (!string.IsNullOrEmpty(xmlChs)) { nArrayChs = new int[1] { Convert.ToInt32(xmlChs) }; } } var channelList = nArrayChs.ToList(); channelList.Sort(); nArrayChs = channelList.ToArray(); return nArrayChs; } #endregion #region 根据板位别名和台面信息xml查找到对应唯一板位节点 /// /// 根据板位别名和台面信息xml查找到对应唯一板位 /// /// /// /// public static XmlNode GetXmlNodeByBoardName(XmlNodeList platformList, string boardName) { XmlNode result = null; for (int i = 0; i < platformList.Count; i++) { XmlNodeList labwareNodeList = platformList[i].SelectNodes("labware"); var labwareSrcNode = labwareNodeList[0].SelectSingleNode("labware_sname[text()='" + boardName + "']"); if (labwareSrcNode != null) { result = platformList[i]; break; } } return result; } #endregion #region 根据枚举值获取下拉值 public static List GetDropDownList() { List dropdownNames = new List(); var dicCommunicateType = EnumManagement.EnumToDictionaryValue(); foreach (var dicItem in dicCommunicateType) { dropdownNames.Add(new DropdownName() { dropdown_id = dicItem.Key, dropdown_name = dicItem.Value }); } return dropdownNames; } #endregion #region 判断Socket是否连接上,需要通过发包来确认: (这个方法也不能解决物理掉线问题,比如拔网线) /// /// 判断Socket是否连接上,需要通过发包来确认: (这个方法也不能解决物理掉线问题,比如拔网线) /// /// /// public static bool IsSocketConnected(Socket client) { if (client != null) { bool blockingState = client.Blocking; try { byte[] tmp = new byte[1]; client.Blocking = false; client.Send(tmp, 0, 0); return true; } catch (SocketException e) { // 产生 10035 == WSAEWOULDBLOCK 错误,说明被阻止了,但是还是连接的 if (e.NativeErrorCode.Equals(10035)) return true; else return false; } finally { client.Blocking = blockingState; // 恢复状态 } } return true; } #endregion #region 数据转换 #region 字符串转Image /// /// 字符串转Image /// /// /// public static ImageSource StringToImag(string base64String) { if (string.IsNullOrEmpty(base64String)) return null; byte[] bytes = System.Convert.FromBase64String(base64String); System.IO.MemoryStream ms = new System.IO.MemoryStream(bytes); ImageSourceConverter imageSourceConverter = new ImageSourceConverter(); ImageSource source = null; source = (ImageSource)imageSourceConverter.ConvertFrom(ms); return source; } #endregion #region 转成数字类型 /// /// 转成数字类型 /// /// /// /// public static bool ParseToInt(string valueSource, out int valueTarget) { if (!int.TryParse(valueSource, out valueTarget)) { LoggerHelper.ErrorLog(string.Format("ParseToInt,value = {0}, 参数不是Int!!!", valueSource)); return false; } else { return true; } } #endregion #region 转成double类型 /// /// 转成double类型 /// /// /// /// public static bool ParseToDouble(string valueSource, out double valueTarget) { if (!double.TryParse(valueSource, out valueTarget)) { LoggerHelper.ErrorLog(string.Format("ParseToDouble,value = {0}, 参数不是double!!!", valueSource)); return false; } else { return true; } } #endregion #region 转成bool类型 /// /// 转成bool类型 /// /// /// /// public static bool ParseToBool(string valueSource, ref bool valueTarget) { if (!bool.TryParse(valueSource, out valueTarget)) { return false; } else { return true; } } #endregion #region 转成DateTime类型 /// /// 转成DateTime类型 /// /// /// /// public static bool ParseToDateTime(string valueSource, out DateTime valueTarget) { if (!DateTime.TryParse(valueSource, out valueTarget)) { LoggerHelper.ErrorLog(string.Format("ParseToDateTime,value = {0}, 参数不是DateTime!!!", valueSource)); return false; } else { return true; } } #endregion #endregion #region 根据行/列有效数量计算列的批次信息 /// /// 根据行/列有效数量计算列的批次信息 /// /// /// /// /// public static List> GetWellBatchInfo(List wells, int[] channels, DilutionDirectionEnum dilutionDirectionValue) { List> lstWellBatchInfo = new List>(); int oneGroupCnt = 0; // 从左到右 if (dilutionDirectionValue == DilutionDirectionEnum.LeftToRight) { // 一组数量先定义为枪头的数量 oneGroupCnt = channels.Length; // 384孔:16行 * 24列 for (int i = 1; i <= 24; i++) { var selWells = wells.Where(it => ComUtility.GetColNum(it.wellname) == i); if (selWells.Any()) { List colList = selWells.ToList(); // 一组数量取最小值 oneGroupCnt = Math.Min(oneGroupCnt, colList.Count); var groups = Enumerable.Range(0, (colList.Count + oneGroupCnt - 1) / oneGroupCnt) .Select((j, index) => colList.Skip(index * oneGroupCnt).Take(oneGroupCnt)).ToList(); foreach (var group in groups) { lstWellBatchInfo.Add(group.ToList()); } } } } // 从上到下 else if (dilutionDirectionValue == DilutionDirectionEnum.UpToDown) { // 384孔:16行 * 24列 for (int i = 1; i <= 24; i++) { var selWells = wells.Where(it => ComUtility.GetColNum(it.wellname) == i); if (selWells.Any()) { List colList = selWells.ToList(); // 一组数量取最小值 oneGroupCnt = 1; var groups = Enumerable.Range(0, (colList.Count + oneGroupCnt - 1) / oneGroupCnt) .Select((j, index) => colList.Skip(index * oneGroupCnt).Take(oneGroupCnt)).ToList(); foreach (var group in groups) { lstWellBatchInfo.Add(group.ToList()); } } } } // 从下到上 else if (dilutionDirectionValue == DilutionDirectionEnum.DownToUp) { // 384孔:16行 * 24列 for (int i = 1; i <= 24; i++) { var selWells = wells.Where(it => ComUtility.GetColNum(it.wellname) == i); if (selWells.Any()) { List colList = selWells.ToList(); colList.Reverse(); // 一组数量取最小值 oneGroupCnt = 1; var groups = Enumerable.Range(0, (colList.Count + oneGroupCnt - 1) / oneGroupCnt) .Select((j, index) => colList.Skip(index * oneGroupCnt).Take(oneGroupCnt)).ToList(); foreach (var group in groups) { lstWellBatchInfo.Add(group.ToList()); } } } } return lstWellBatchInfo; } #endregion #region 数据类型转换 /// /// 数据类型转换 /// /// /// /// public static object ToTypeConvert(string value, string type) { var sfsd = EnumManagement.GetALLEnum(); Dictionary dic = new Dictionary(); if (EnumManagement.ToEnum(type) == DataTypeEnum_Parameter.Varchar || EnumManagement.ToEnum(type) == DataTypeEnum_Parameter.Datetime || EnumManagement.ToEnum(type) == DataTypeEnum_Parameter.JSON) { return value; } else if (EnumManagement.ToEnum(type) == DataTypeEnum_Parameter.Int) { return Convert.ToInt32(value); } else if (EnumManagement.ToEnum(type) == DataTypeEnum_Parameter.Bool) { return Convert.ToBoolean(value); } else if (EnumManagement.ToEnum(type) == DataTypeEnum_Parameter.Double) { return Convert.ToDouble(value); } else if (EnumManagement.ToEnum(type) == DataTypeEnum_Parameter.USHORT) { return Convert.ToUInt16(value); } else if (EnumManagement.ToEnum(type) == DataTypeEnum_Parameter.BYTE) { return Convert.ToByte(value); } return dic; } #endregion #region RGB转Color /// /// RGB转Color /// /// /// public static Color RGBToColor(string strRGB) { Color color = Colors.WhiteSmoke; if (string.IsNullOrEmpty(strRGB)) { return color; } string[] strRgbArray = strRGB.Split(','); if (strRgbArray.Length < 3) { return color; } int[] nRgbArray = Array.ConvertAll(strRgbArray, int.Parse); color = Color.FromRgb((byte)nRgbArray[0], (byte)nRgbArray[1], (byte)nRgbArray[2]); return color; } #endregion #region 对相同属性名称值复制Value /// /// 对相同属性名称值复制Value /// /// 新对象 /// 原始对象 /// 原始对象 /// 是否只复制结构类型(包括string类型) /// public static D MapperStruct(S s) { D d = Activator.CreateInstance(); try { var Types = s.GetType();// 获得类型 var Typed = typeof(D); foreach (PropertyInfo sp in Types.GetProperties()) { foreach (PropertyInfo dp in Typed.GetProperties()) { if (dp.Name.Equals(sp.Name)) { dp.SetValue(d, sp.GetValue(s, null), null); } } } } catch (Exception ex) { throw ex; } return d; } #endregion #region 根据字符串分割成下拉值 /// /// 根据字符串分割成下拉值 /// /// /// public static ObservableCollection GetDropDownList(string value) { ObservableCollection dropDownList = new ObservableCollection(); string[] ChoiceModelTypes = value.Split(';'); for (int index = 0; index < ChoiceModelTypes.Length; index++) // 模型类型 { string[] modelType = ChoiceModelTypes[index].Split('-'); DropdownName dropdownName = new DropdownName(); dropdownName.dropdown_id = modelType[0]; dropdownName.dropdown_name = modelType[1]; dropDownList.Add(dropdownName); } return dropDownList; } #endregion #region 根据keyId名称查找方法节点属性 /// /// 根据keyId名称查找方法节点属性 /// /// /// /// public static MethodEx FindMethodExByKeyId(MethodEx mEx, string keyId) { if (mEx.tag != null && ((XImagingXhandler.XDAL.MethodBase)mEx.tag).keyId == keyId) { return mEx; } else { if (mEx.Children.Count > 0) { foreach (var m in mEx.Children) { MethodEx find = FindMethodExByKeyId(m, keyId); if (find != null) { return find; } } } if (mEx.SubMethod != null) { MethodEx find = FindMethodExByKeyId(mEx.SubMethod, keyId); if (find != null) { return find; } } else { return null; } } return null; } #endregion } }