|  |  |  |  | using Aspose.Cells; | 
					
						
							|  |  |  |  | using EWS.FocalMechanism.Model; | 
					
						
							|  |  |  |  | using Newtonsoft.Json; | 
					
						
							|  |  |  |  | using Newtonsoft.Json.Converters; | 
					
						
							|  |  |  |  | using System; | 
					
						
							|  |  |  |  | using System.Collections.Generic; | 
					
						
							|  |  |  |  | using System.Data; | 
					
						
							|  |  |  |  | using System.Diagnostics; | 
					
						
							|  |  |  |  | using System.Drawing; | 
					
						
							|  |  |  |  | using System.Globalization; | 
					
						
							|  |  |  |  | using System.IO; | 
					
						
							|  |  |  |  | using System.Linq; | 
					
						
							|  |  |  |  | using System.Runtime.Remoting.Contexts; | 
					
						
							|  |  |  |  | using System.Security.Policy; | 
					
						
							|  |  |  |  | using System.Text; | 
					
						
							|  |  |  |  | using System.Threading.Tasks; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | namespace Txgy.Microseismic.BaseLib | 
					
						
							|  |  |  |  | { | 
					
						
							|  |  |  |  |     public static class PublicConfig | 
					
						
							|  |  |  |  |     { | 
					
						
							|  |  |  |  |         /// <summary> | 
					
						
							|  |  |  |  |         /// 设备整体灵敏度 | 
					
						
							|  |  |  |  |         /// </summary> | 
					
						
							|  |  |  |  |         public const double KW = 833760427.0; | 
					
						
							|  |  |  |  |         /// <summary> | 
					
						
							|  |  |  |  |         /// 波形截取长度(点数) | 
					
						
							|  |  |  |  |         /// </summary> | 
					
						
							|  |  |  |  |         public const int WaveCutLen = 1000; | 
					
						
							|  |  |  |  |         public static string timeFormatStr = "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFF"; | 
					
						
							|  |  |  |  |         public static ProjectConfigModel ProjectConfig { get; set; } | 
					
						
							|  |  |  |  |         public static FmGrid fmGrid { get; set; } | 
					
						
							|  |  |  |  |         public static int StationCount; | 
					
						
							|  |  |  |  |         public static void ReadConfig() | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             IsoDateTimeConverter timeFormat = new IsoDateTimeConverter(); | 
					
						
							|  |  |  |  |             timeFormat.DateTimeFormat = timeFormatStr; | 
					
						
							|  |  |  |  |             IFormatProvider ifp = new CultureInfo("zh-CN", true); | 
					
						
							|  |  |  |  |             string jsonText; | 
					
						
							|  |  |  |  |             using (System.IO.StreamReader sr = new System.IO.StreamReader(AppDomain.CurrentDomain.BaseDirectory + "\\resources\\config.json")) | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 jsonText = sr.ReadToEnd(); | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |             //string jsonText=new System.IO.StreamReader("config.json").ReadToEnd(); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             ProjectConfig = JsonConvert.DeserializeObject<ProjectConfigModel>(jsonText); | 
					
						
							|  |  |  |  |             SetConfig(); | 
					
						
							|  |  |  |  |             ProjectConfig.StationDic = CreateStationFromCSV(AppDomain.CurrentDomain.BaseDirectory + "\\resources\\" + ProjectConfig.StationFile); | 
					
						
							|  |  |  |  |             StationCount = ProjectConfig.StationDic.Count; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             fmGrid = CreateFMGrid(ProjectConfig); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             //string[] sds= ProjectConfig.Stations.Split(','); | 
					
						
							|  |  |  |  |             //ProjectConfig.StationDic = new Dictionary<string, StationModel>(); | 
					
						
							|  |  |  |  |             //foreach (var item in sds) | 
					
						
							|  |  |  |  |             //{ | 
					
						
							|  |  |  |  |             //    StationModel sm=new StationModel(); | 
					
						
							|  |  |  |  |             //    sm.Name = item.ToString(); | 
					
						
							|  |  |  |  |             //    ProjectConfig.StationDic.Add(item,sm); | 
					
						
							|  |  |  |  |             //} | 
					
						
							|  |  |  |  |             //foreach (var item in ProjectConfig.StationDic) | 
					
						
							|  |  |  |  |             //{ | 
					
						
							|  |  |  |  |             //    Console.WriteLine(item.Key); | 
					
						
							|  |  |  |  |             //} | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             //Console.WriteLine(ProjectConfig.Stations); | 
					
						
							|  |  |  |  |             //Console.WriteLine(ProjectConfig.WorkArea.WorkAreaName); | 
					
						
							|  |  |  |  |             //Console.WriteLine(ProjectConfig.StartTime.ToString()); | 
					
						
							|  |  |  |  |             //Console.WriteLine(ProjectConfig.MseedFilePath); | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  |         public static void SetConfig() | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             if (!Directory.Exists(ProjectConfig.MseedFilePath)) | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 Directory.CreateDirectory(ProjectConfig.MseedFilePath); | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             if (File.Exists(ProjectConfig.TxtFilePath)) | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 // Console.WriteLine(File.GetAttributes(ProjectConfig.CacheFilePath).ToString()); | 
					
						
							|  |  |  |  |                 File.SetAttributes(ProjectConfig.TxtFilePath, FileAttributes.Hidden); | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |             else | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 Directory.CreateDirectory(ProjectConfig.TxtFilePath); | 
					
						
							|  |  |  |  |                 File.SetAttributes(ProjectConfig.TxtFilePath, FileAttributes.Hidden); | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  |         public static void SaveConfig() | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  |         public static Dictionary<string, StationModel> CreateStationFromCSV(string fn) | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             Dictionary<string, StationModel> stations = new Dictionary<string, StationModel>(); | 
					
						
							|  |  |  |  |             Aspose.Cells.TxtLoadOptions lo = new TxtLoadOptions(); | 
					
						
							|  |  |  |  |             lo.Encoding = Encoding.Default;//设置编码方式 | 
					
						
							|  |  |  |  |             Workbook workbook = new Workbook(fn, lo); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             //配置读取文件的类型(CSV) | 
					
						
							|  |  |  |  |             workbook.FileFormat = FileFormatType.CSV;//可在此配置Excel文件类型 | 
					
						
							|  |  |  |  |             Worksheet worksheet = workbook.Worksheets[0];//默认第一个Sheet页 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             Cells cells = worksheet.Cells; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             //读取到DataTable中             | 
					
						
							|  |  |  |  |             DataTable dt = cells.ExportDataTableAsString(0, 0, cells.MaxDataRow + 1, cells.MaxColumn + 1, true); | 
					
						
							|  |  |  |  |             for (int i = 0; i < dt.Rows.Count; i++) | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 DataRow row = dt.Rows[i]; | 
					
						
							|  |  |  |  |                 StationModel model = new StationModel(); | 
					
						
							|  |  |  |  |                 model.Name = row[1].ToString(); | 
					
						
							|  |  |  |  |                 model.E = double.Parse(row[2].ToString()); | 
					
						
							|  |  |  |  |                 model.N = double.Parse(row[3].ToString()); | 
					
						
							|  |  |  |  |                 model.Z = double.Parse(row[4].ToString()); | 
					
						
							|  |  |  |  |                 model.Sens = double.Parse(row[5].ToString()); | 
					
						
							|  |  |  |  |                 model.BeginUseTime = DateTime.Parse(row[6].ToString()); | 
					
						
							|  |  |  |  |                 model.StopUseTime = DateTime.Parse(row[7].ToString()); | 
					
						
							|  |  |  |  |                 stations.Add(model.Name, model); | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |             //释放资源          | 
					
						
							|  |  |  |  |             workbook = null; | 
					
						
							|  |  |  |  |             worksheet = null; | 
					
						
							|  |  |  |  |             return stations; | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         public static FmGrid CreateFMGrid(ProjectConfigModel projectConfigModel) | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             FmGrid fg = new FmGrid(); | 
					
						
							|  |  |  |  |             fg.xmax = projectConfigModel.WorkArea.EMax - projectConfigModel.WorkArea.EMin; | 
					
						
							|  |  |  |  |             fg.ymax = projectConfigModel.WorkArea.NMax - projectConfigModel.WorkArea.NMin; | 
					
						
							|  |  |  |  |             fg.xmin = 0; | 
					
						
							|  |  |  |  |             fg.ymin = 0; | 
					
						
							|  |  |  |  |             fg.StationCount = projectConfigModel.StationDic.Count; | 
					
						
							|  |  |  |  |             fg.StationList = new List<FMStation>(); | 
					
						
							|  |  |  |  |             int sc = 0; | 
					
						
							|  |  |  |  |             foreach (var item in projectConfigModel.StationDic) | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 fg.StationList.Add(new FMStation(sc, item.Key, item.Value.E - projectConfigModel.WorkArea.EMin, | 
					
						
							|  |  |  |  |                     item.Value.N - projectConfigModel.WorkArea.NMin)); | 
					
						
							|  |  |  |  |                 sc++; | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |             fg.initZeroCenter(); | 
					
						
							|  |  |  |  |             fg.computeDistance(); | 
					
						
							|  |  |  |  |             return fg; | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         public static void MSeed2Asc(string filePath, string savePath) | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             using (Process compiler = new Process()) | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 compiler.StartInfo.FileName = "mseed2ascii.exe"; | 
					
						
							|  |  |  |  |                 compiler.StartInfo.Arguments = filePath + " -o " + savePath; | 
					
						
							|  |  |  |  |                 compiler.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; | 
					
						
							|  |  |  |  |                 compiler.Start(); | 
					
						
							|  |  |  |  |                 compiler.WaitForExit(); | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  |         public static List<WaveDataModel> CreateWaveModelFromText(string fn) | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             List<WaveDataModel> waveDataModelRows = new List<WaveDataModel>(); | 
					
						
							|  |  |  |  |             string[] allRows; | 
					
						
							|  |  |  |  |             using (StreamReader sr = new StreamReader(fn)) | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 allRows = sr.ReadToEnd().Trim().Split(new char[] { '\n' }); | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |             WaveHeader wh = new WaveHeader(allRows[0]); | 
					
						
							|  |  |  |  |             int rk = 0; | 
					
						
							|  |  |  |  |             string curRow = allRows[0]; | 
					
						
							|  |  |  |  |             while (rk < allRows.Length) | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 curRow = allRows[rk]; | 
					
						
							|  |  |  |  |                 if (curRow.Contains("TIME")) | 
					
						
							|  |  |  |  |                 { | 
					
						
							|  |  |  |  |                     WaveDataModel waveModel = new WaveDataModel(); | 
					
						
							|  |  |  |  |                     waveModel.waveHeader = new WaveHeader(curRow); | 
					
						
							|  |  |  |  |                     waveModel.Points = new List<int>(); | 
					
						
							|  |  |  |  |                     rk++; | 
					
						
							|  |  |  |  |                     int nk = 0; | 
					
						
							|  |  |  |  |                     for (int i = 0; i < wh.Samples; i++) | 
					
						
							|  |  |  |  |                     { | 
					
						
							|  |  |  |  |                         if ((rk + i) >= allRows.Length) | 
					
						
							|  |  |  |  |                         { | 
					
						
							|  |  |  |  |                             break; | 
					
						
							|  |  |  |  |                         } | 
					
						
							|  |  |  |  |                         if (allRows[rk + i].Contains("TIME")) | 
					
						
							|  |  |  |  |                         { | 
					
						
							|  |  |  |  |                             rk = rk + i; | 
					
						
							|  |  |  |  |                             break; | 
					
						
							|  |  |  |  |                         } | 
					
						
							|  |  |  |  |                         int cd = int.Parse(allRows[rk + i].Trim()); | 
					
						
							|  |  |  |  |                         waveModel.Points.Add(cd); | 
					
						
							|  |  |  |  |                         nk++; | 
					
						
							|  |  |  |  |                         //rk++; | 
					
						
							|  |  |  |  |                     } | 
					
						
							|  |  |  |  |                     int cz = wh.Samples - waveModel.Points.Count; | 
					
						
							|  |  |  |  |                     if (cz > 0) | 
					
						
							|  |  |  |  |                     { | 
					
						
							|  |  |  |  |                         for (int jk = 0; jk < cz; jk++) | 
					
						
							|  |  |  |  |                         { | 
					
						
							|  |  |  |  |                             waveModel.Points.Add(waveModel.Points.Count - 1); | 
					
						
							|  |  |  |  |                         } | 
					
						
							|  |  |  |  |                         waveDataModelRows.Add(waveModel); | 
					
						
							|  |  |  |  |                     } | 
					
						
							|  |  |  |  |                     else | 
					
						
							|  |  |  |  |                     { | 
					
						
							|  |  |  |  |                         waveDataModelRows.Add(waveModel); | 
					
						
							|  |  |  |  |                         rk += nk; | 
					
						
							|  |  |  |  |                     } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |                 } | 
					
						
							|  |  |  |  |                 else | 
					
						
							|  |  |  |  |                 { | 
					
						
							|  |  |  |  |                     rk++; | 
					
						
							|  |  |  |  |                 } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |             return waveDataModelRows; | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  |         public static int GetWaveMaxAmpIndex(WaveDataModel wdm, DateTime eventTime) | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             int startPoint = (int)(eventTime - wdm.waveHeader.StartTime).TotalMilliseconds / 2; | 
					
						
							|  |  |  |  |             int readLen = WaveCutLen; | 
					
						
							|  |  |  |  |             if (startPoint + WaveCutLen > wdm.Points.Count) | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 readLen = wdm.Points.Count - startPoint; | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |             int[] tmpArr = new int[readLen]; | 
					
						
							|  |  |  |  |             Array.ConstrainedCopy(wdm.Points.ToArray(), startPoint, tmpArr, 0, readLen); | 
					
						
							|  |  |  |  |             int maxValue = 0; | 
					
						
							|  |  |  |  |             int maxIndex = 0; | 
					
						
							|  |  |  |  |             for (int t = 0; t < tmpArr.Length; t++) | 
					
						
							|  |  |  |  |             { | 
					
						
							|  |  |  |  |                 if (Math.Abs(tmpArr[t]) > maxValue) | 
					
						
							|  |  |  |  |                 { | 
					
						
							|  |  |  |  |                     maxValue = Math.Abs(tmpArr[t]); | 
					
						
							|  |  |  |  |                     maxIndex = t; | 
					
						
							|  |  |  |  |                 } | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |             return maxIndex + startPoint; | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         public static double PointsAngleTool(PointF p1, PointF p2) | 
					
						
							|  |  |  |  |         { | 
					
						
							|  |  |  |  |             //int positionInfo = 0; | 
					
						
							|  |  |  |  |             double angleOfLine = Math.Atan2((p2.Y - p1.Y), (p2.X - p1.X)) * 180 / Math.PI;//计算两点的正切值并获取角度 | 
					
						
							|  |  |  |  |             //if (angleOfLine > -45 && angleOfLine < 45)//右 | 
					
						
							|  |  |  |  |             //{ | 
					
						
							|  |  |  |  |             //    positionInfo = 1; | 
					
						
							|  |  |  |  |             //} | 
					
						
							|  |  |  |  |             //else if (angleOfLine > 135 && angleOfLine < -135)//左 | 
					
						
							|  |  |  |  |             //{ | 
					
						
							|  |  |  |  |             //    positionInfo = 2; | 
					
						
							|  |  |  |  |             //} | 
					
						
							|  |  |  |  |             //else if (angleOfLine > 45 && angleOfLine < 135)//上 | 
					
						
							|  |  |  |  |             //{ | 
					
						
							|  |  |  |  |             //    positionInfo = 3; | 
					
						
							|  |  |  |  |             //} | 
					
						
							|  |  |  |  |             //else if (angleOfLine > -135 && angleOfLine < -45)//下 | 
					
						
							|  |  |  |  |             //{ | 
					
						
							|  |  |  |  |             //    positionInfo = 4; | 
					
						
							|  |  |  |  |             //} | 
					
						
							|  |  |  |  |             return angleOfLine; | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  | } |