using Arction.Wpf.Charting; using Arction.Wpf.Charting.Axes; using Arction.Wpf.Charting.SeriesXY; using Arction.Wpf.Charting.Views.ViewXY; using mseedChart.Core; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.IO; using System.Linq; namespace mseedChart.MainModule.Models { public class WavesModel { public List CreateYAxisChart(List stationModels, LightningChart curChart) { List axisYList = new List(); foreach (var item in stationModels) { AxisY axisYZ = new AxisY(curChart.ViewXY); //添加Z分量波形 if (item.dz.Count > 0) { axisYZ.SetRange(item.dz.Min(), item.dz.Max()); } axisYZ.Title.Text = string.Format("Ch{0}.Z", item.Name); axisYList.Add(axisYZ); //添加N分量波形 AxisY axisYN = new AxisY(curChart.ViewXY); if (item.dn.Count > 0) { axisYN.SetRange(item.dn.Min(), item.dn.Max()); } axisYN.Title.Text = string.Format("Ch{0}.N", item.Name); axisYList.Add(axisYN); //添加E分量波形 AxisY axisYE = new AxisY(curChart.ViewXY); if (item.de.Count > 0) { axisYE.SetRange(item.de.Min(), item.de.Max()); } axisYE.Title.Text = string.Format("Ch{0}.E", item.Name); axisYList.Add(axisYE); } return axisYList; } public List GetSampleDataSeriesPingPu(List stationModels, LightningChart curChart, AxisX xAxes, List axisY, double samplingFrequency) { List sampleList = new List(); for (int i = 0; i < stationModels.Count; i++) { //Bug,在波形数据少于台站数量时,出现错误 if (i < axisY.Count) { } //Z SampleDataSeries seriesZ = new SampleDataSeries(curChart.ViewXY, xAxes, axisY[i * 3]); seriesZ.ShowInLegendBox = true; seriesZ.Title.Text = axisY[i * 3].Title.Text; seriesZ.SampleFormat = SampleFormat.DoubleFloat; //series.LineStyle.Color = DefaultColors.SeriesForBlackBackgroundWpf[i % DefaultColors.SeriesForBlackBackgroundWpf.Length]; seriesZ.LineStyle.Color = System.Windows.Media.Colors.Blue; seriesZ.SamplingFrequency = samplingFrequency; seriesZ.FirstSampleTimeStamp = 1.0 / samplingFrequency; seriesZ.LineStyle.Width = 1; seriesZ.LineStyle.AntiAliasing = LineAntialias.None; seriesZ.ScrollModePointsKeepLevel = 1; seriesZ.ScrollingStabilizing = true; seriesZ.AllowUserInteraction = false; //Set custom colored palette System.Windows.Media.Color colorEdge = ChartTools.CalcGradient(seriesZ.LineStyle.Color, System.Windows.Media.Colors.Gray, 50); System.Windows.Media.Color colorCenter = seriesZ.LineStyle.Color; //seriesZ.ValueRangePalette.Steps.Clear(); //Remove existing palette steps //seriesZ.ValueRangePalette.Steps.Add(new PaletteStep(seriesZ.ValueRangePalette, colorEdge, -100)); //seriesZ.ValueRangePalette.Steps.Add(new PaletteStep(seriesZ.ValueRangePalette, colorCenter, 0)); //seriesZ.ValueRangePalette.Steps.Add(new PaletteStep(seriesZ.ValueRangePalette, colorEdge, 100)); sampleList.Add(seriesZ); //E SampleDataSeries seriesE = new SampleDataSeries(curChart.ViewXY, xAxes, axisY[i * 3 + 1]); seriesE.ShowInLegendBox = true; seriesE.Title.Text = axisY[i * 3+1].Title.Text; seriesE.SampleFormat = SampleFormat.DoubleFloat; //series.LineStyle.Color = DefaultColors.SeriesForBlackBackgroundWpf[i % DefaultColors.SeriesForBlackBackgroundWpf.Length]; seriesE.LineStyle.Color = System.Windows.Media.Colors.Red; seriesE.SamplingFrequency = samplingFrequency; seriesE.FirstSampleTimeStamp = 1.0 / samplingFrequency; seriesE.LineStyle.Width = 1; seriesE.LineStyle.AntiAliasing = LineAntialias.None; seriesE.ScrollModePointsKeepLevel = 1; seriesE.ScrollingStabilizing = true; seriesE.AllowUserInteraction = false; //Set custom colored palette //System.Windows.Media.Color colorEdge = ChartTools.CalcGradient(series.LineStyle.Color, System.Windows.Media.Colors.Black, 50); //System.Windows.Media.Color colorCenter = series.LineStyle.Color; //seriesE.ValueRangePalette.Steps.Clear(); //Remove existing palette steps //seriesE.ValueRangePalette.Steps.Add(new PaletteStep(seriesE.ValueRangePalette, colorEdge, -100)); //seriesE.ValueRangePalette.Steps.Add(new PaletteStep(seriesE.ValueRangePalette, colorCenter, 0)); //seriesE.ValueRangePalette.Steps.Add(new PaletteStep(seriesE.ValueRangePalette, colorEdge, 100)); sampleList.Add(seriesE); //N SampleDataSeries seriesN = new SampleDataSeries(curChart.ViewXY, xAxes, axisY[i * 3 + 2]); seriesN.ShowInLegendBox = true; seriesN.Title.Text = axisY[i * 3 + 2].Title.Text; seriesN.SampleFormat = SampleFormat.DoubleFloat; //series.LineStyle.Color = DefaultColors.SeriesForBlackBackgroundWpf[i % DefaultColors.SeriesForBlackBackgroundWpf.Length]; seriesN.LineStyle.Color = System.Windows.Media.Colors.Green; seriesN.SamplingFrequency = samplingFrequency; seriesN.FirstSampleTimeStamp = 1.0 / samplingFrequency; seriesN.LineStyle.Width = 1; seriesN.LineStyle.AntiAliasing = LineAntialias.None; seriesN.ScrollModePointsKeepLevel = 1; seriesN.ScrollingStabilizing = true; seriesN.AllowUserInteraction = false; //Set custom colored palette //System.Windows.Media.Color colorEdge = ChartTools.CalcGradient(series.LineStyle.Color, System.Windows.Media.Colors.Black, 50); //System.Windows.Media.Color colorCenter = series.LineStyle.Color; //seriesN.ValueRangePalette.Steps.Clear(); //Remove existing palette steps //seriesN.ValueRangePalette.Steps.Add(new PaletteStep(seriesN.ValueRangePalette, colorEdge, -100)); //seriesN.ValueRangePalette.Steps.Add(new PaletteStep(seriesN.ValueRangePalette, colorCenter, 0)); //seriesN.ValueRangePalette.Steps.Add(new PaletteStep(seriesN.ValueRangePalette, colorEdge, 100)); sampleList.Add(seriesN); } return sampleList; } public List CreateAxisYEventTime(MmEvent mmEvent, ViewXY chartV) { for (int i = 0; i< chartV.YAxes.Count; i++) { // lineCollection.Lines[i] = new SegmentLine(1+i, chartV.YAxes[0].Minimum, 1+i, chartV.YAxes[0].Maximum); LineCollection lineCollection = new LineCollection() { AssignXAxisIndex = 0, AssignYAxisIndex = i, Lines = new SegmentLine[] { new SegmentLine(0.5 * i, chartV.YAxes[i].Minimum, 0.5 * i, chartV.YAxes[i].Maximum) }, ShowInLegendBox = false }; PointLineSeries pointLine = new PointLineSeries() { PointsVisible = true, AssignXAxisIndex = 0, AssignYAxisIndex = i, ShowInLegendBox = false, Points = new SeriesPoint[] { new SeriesPoint(0.5 * i, (chartV.YAxes[i].Minimum+ chartV.YAxes[i].Maximum)/2) }, }; // var value= chartV.YAxes[i].ValueToCoord(chartV.YAxes[i].Minimum); chartV.PointLineSeries.Add(pointLine); lineCollection.LineStyle.Color= System.Windows.Media.Colors.Red; chartV.LineCollections.Add(lineCollection); } return new List(); } public MmEvent Json2MmEvent(string jsonFile) { using (StreamReader sr = System.IO.File.OpenText(jsonFile)) { MmEvent mmEvent = new MmEvent(); mmEvent.JsonFile = jsonFile; string filePath = System.IO.Path.GetDirectoryName(jsonFile); string fileName = System.IO.Path.GetFileNameWithoutExtension(jsonFile).TrimEnd('B').TrimEnd('A'); string ascName = filePath + "\\" + fileName + ".txt"; mmEvent.AsciiFile = ascName; JsonTextReader reader = new JsonTextReader(sr); JArray jArray = (JArray)JToken.ReadFrom(reader); //解析普通属性和数组混合的Json文件 //数组0是普通属性集合 JObject jobj = (JObject)jArray[0]; string dateStr = jobj["otime"].ToString(); mmEvent.EventTime = DateTime.Parse(dateStr); mmEvent.EventTimeStr = dateStr; mmEvent.X = double.Parse(jobj["lon"].ToString()); mmEvent.Y = double.Parse(jobj["lat"].ToString()); mmEvent.Z = double.Parse(jobj["depth"].ToString()); mmEvent.ML = double.Parse(jobj["ml"].ToString()); mmEvent.RMS = double.Parse(jobj["rms"].ToString()); mmEvent.SetEnergy(); mmEvent.DominantFreq = 15; mmEvent.Phases = new Dictionary(); List DominantFreqlist = new List(); JArray phaseArr = JArray.FromObject(jobj["phases"]); List DominantFreqList = new List(); for (int i = 0; i < phaseArr.Count; i++) { if (phaseArr[i]["first_motion_direct"] != null) { mmEvent.Phases.Add(phaseArr[i]["id"].ToString().Substring(3, 3), int.Parse(phaseArr[i]["first_motion_direct"].ToString())); } if (phaseArr[i]["fmd_semi_period"] != null) { DominantFreqlist.Add(double.Parse(phaseArr[i]["fmd_semi_period"].ToString())); } } if (DominantFreqlist.Count > 0) { if (DominantFreqlist.Count > 3) { double min = DominantFreqlist.Min(); double max = DominantFreqlist.Max(); DominantFreqlist.Remove(min); DominantFreqlist.Remove(max); mmEvent.DominantFreq = DominantFreqlist.Sum() / (double)DominantFreqlist.Count; } else { mmEvent.DominantFreq = 0; } } return mmEvent; } //return null; } public MmEvent Json2MmEventWithPara(string jsonFile) { using (StreamReader sr = System.IO.File.OpenText(jsonFile)) { MmEvent mmEvent = new MmEvent(); mmEvent.JsonFile = jsonFile; string filePath = System.IO.Path.GetDirectoryName(jsonFile); string fileName = System.IO.Path.GetFileNameWithoutExtension(jsonFile).TrimEnd('B').TrimEnd('A'); //fileName=fileName.TrimEnd('B'); //fileName.TrimEnd('A'); string ascName = filePath + "\\" + fileName + ".txt"; mmEvent.AsciiFile = ascName; JsonTextReader reader = new JsonTextReader(sr); JArray jArray = (JArray)JToken.ReadFrom(reader); //解析普通属性和数组混合的Json文件 //数组0是普通属性集合 JObject jobj = (JObject)jArray[0]; string dateStr = jobj["otime"].ToString(); //LocalSqLiteServerAccess localSqLiteServerAccess = new LocalSqLiteServerAccess(); //int selectResult = localSqLiteServerAccess.SelectWithTime(dateStr); int selectResult = 1; if (selectResult < 1) { return null; } else { mmEvent.Phases = new Dictionary(); List Semiperiodlist = new List(); JArray phaseArr = JArray.FromObject(jobj["phases"]); List DominantFreqList = new List(); for (int i = 0; i < phaseArr.Count; i++) { if (phaseArr[i]["first_motion_direct"] != null) { mmEvent.Phases.Add(phaseArr[i]["id"].ToString().Substring(3, 3), int.Parse(phaseArr[i]["first_motion_direct"].ToString())); } if (phaseArr[i]["fmd_semi_period"] != null) { Semiperiodlist.Add(double.Parse(phaseArr[i]["fmd_semi_period"].ToString())); } } if (Semiperiodlist.Count > 0) { if (Semiperiodlist.Count > 3) { double min = Semiperiodlist.Min(); double max = Semiperiodlist.Max(); Semiperiodlist.Remove(min); Semiperiodlist.Remove(max); mmEvent.DominantFreq = Semiperiodlist.Sum() / (double)Semiperiodlist.Count; } else { mmEvent.DominantFreq = 0; } } JArray ampsArr = JArray.FromObject(jobj["amps"]); List ampsArrList = new List(); for (int i = 0; i < ampsArr.Count; i++) { if (ampsArr[i]["amp"] != null) { ampsArrList.Add(float.Parse(ampsArr[i]["amp"].ToString())); } } MmEvent.SetAmp(ampsArrList); return mmEvent; } } } } }