You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

241 lines
11 KiB
C#

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Txgy.EWS.Client.Common.Helpers;
using Txgy.EWS.Client.Common;
using Txgy.EWS.Client.Models;
using System.IO;
using Txgy.EWS.Client.Entity;
using Txgy.EWS.Client.PageModule.Services;
using Txgy.Microseismic.BaseLib.Models;
using Txgy.EWS.Client.PageModule.Common;
using OxyPlot.Axes;
using OxyPlot.Legends;
using OxyPlot.Series;
using OxyPlot;
using Prism.Ioc;
namespace Txgy.EWS.Client.PageModule.Views
{
/// <summary>
/// ReportDayListView.xaml 的交互逻辑
/// </summary>
public partial class ReportDayListView : UserControl
{
IFreeSql fsqlTencent = FreeSqlTencent.tencentRemoteMySQL;
ReportFreqImage reportImage = new ReportFreqImage();
CultureInfo culture = new CultureInfo("zh-CN");
byte[] dayFreqBytes = null;
byte[] dayMiddleEventPlanBytes = null;
byte[] dayMiddleEventStereoBytes = null;
public string dayFreqImagePath;
public int dayFreqImageWidth = 1485;
public int dayFreqImageHeight = 585;
public double MiddleEnergy = 1000;
public DateTime ReportStartTime;
public DateTime ReportEndTime;
public double ReportMinML;
public double ReportMaxML;
public int SearchCount;
public List<GridItemEventResult> SearchEvents;
IContainerProvider _conprovider;
public ReportDayListView(IContainerProvider containerProvider)
{
_conprovider = containerProvider;
InitializeComponent();
InitializePara();
}
public void InitializePara()
{
int yy = DateTime.Now.Year;
int mm = DateTime.Now.Month;
int ss = DateTime.Now.Day;
ReportStartTime = new DateTime(yy, mm, ss).AddDays(-1);
ReportMinML = -3.0;
ReportMaxML = 0;
dpSearchDate.SelectedDate = ReportStartTime;
dpSearchDate.DisplayDate = ReportStartTime;
nudMaxML.Value = ReportMaxML;
nudMinML.Value = ReportMinML;
tbMiddleEnergy.Text=MiddleEnergy.ToString();
}
private void btnExport_Click(object sender, RoutedEventArgs e)
{
//_conprovider.Resolve<StereogramView>().chart.SaveToFile("e:\\7.png", (int)gridChart.ActualWidth, (int)gridChart.ActualHeight);
//rsi.SaveToFile("e:\\7.png", (int)gridChart.ActualWidth, (int)gridChart.ActualHeight);
}
ReportStereogramImage rsi = new ReportStereogramImage();
private void btnSearch_Click(object sender, RoutedEventArgs e)
{
ReportStartTime = (DateTime)dpSearchDate.SelectedDate;
ReportMaxML=nudMaxML.Value;
ReportMinML=nudMinML.Value;
MiddleEnergy=double.Parse(tbMiddleEnergy.Text);
SearchEvents = SearchDayList();
if (SearchEvents!=null)
{
if (SearchEvents.Count>0)
{
btnExport.IsEnabled = true;
tbEventsCount.Text = SearchEvents.Count.ToString();
oxyplotDayFreq.Model = CreateDayFreqImage(SearchEvents, ReportStartTime, ReportStartTime.ToString("D", culture));
canvasPlan.Children.Clear();
ReportPlanImage rpi = new ReportPlanImage();
rpi.Draw(SearchEvents,canvasPlan.ActualWidth,canvasPlan.ActualHeight);
canvasPlan.Children.Add(rpi.host);
rsi=new ReportStereogramImage();
rsi.DrawStereoImage(SearchEvents);
gridChart.Children.Clear();
this.gridChart.Children.Add(rsi.lightChart);
//SaveImageToFile(this.gridChart, "e:\\p02.png");
}
}
}
public PlotModel CreateDayFreqImage(List<GridItemEventResult> events, DateTime statDate, string subTitle = "")
{
ReportFreqImage report = new ReportFreqImage();
var legend1 = new Legend();
legend1.LegendOrientation = LegendOrientation.Horizontal;
legend1.LegendPlacement = LegendPlacement.Inside;
legend1.LegendPosition = LegendPosition.TopRight;
legend1.LegendPadding = 0;
legend1.AllowUseFullExtent = true;
report.PlotLegend = legend1;
string plotTitle = "频度 - 能量变化趋势图";
string[] titles = new[] { "<负2级", "负2级至负1级", "负1级至负0.5级", "负0.5级以上" };
OxyColor strokeColor = OxyColors.Black;
OxyColor textColor = OxyColors.White;
LabelPlacement placement = LabelPlacement.Middle;
report.categoryAxes = new CategoryAxis { Position = AxisPosition.Left };
string[] categoryColors = new[] { "#052d6e", "#284a7e", "#ffa200", "#a66a00" };
for (int i = 0; i < 24; i++)
{
report.categoryAxes.Labels.Add((i + 1).ToString() + "时");
}
//Random rnd = new Random((int)DateTime.Now.Ticks);
for (int i = GlobalData.ReportEventLevelList.Count - 1; i >= 0; i--)
//for (int i = 0; i < 4; i++)
{
ReportEventLevel rel = GlobalData.ReportEventLevelList[i];
List<double> values = new List<double>();
for (int j = 0; j < 24; j++)
{
int ec = events.FindAll(es => DateTime.Parse(es.EventTime).Ticks >= statDate.AddHours(j).Ticks &&
DateTime.Parse(es.EventTime).Ticks < statDate.AddHours(j + 1).Ticks && es.ML >= rel.lowerbound && es.ML < rel.upperbound).Count;
values.Add(ec);
}
//report.AddSeries(titles[i], OxyColor.Parse(categoryColors[i]), OxyColor.Parse(categoryColors[i]), textColor, placement, values);
report.AddSeries(rel.describe, OxyColor.Parse(rel.color), OxyColor.Parse(rel.color), textColor, placement, values);
}
report.linearAxis = new LinearAxis
{
Position = AxisPosition.Bottom,
MinimumPadding = 0,
MaximumPadding = 0.5,
ExtraGridlines = new[] { 0.0 },
ExtraGridlineStyle = LineStyle.Solid,
ExtraGridlineColor = OxyColors.Black,
ExtraGridlineThickness = 1,
MajorGridlineStyle = LineStyle.Solid
};
report.SubTitle = subTitle;
report.CreateModeWithValues(plotTitle, OxyColors.White, true);
return report.plotModel;
//return report.ExportToBitmap(dayFreqImageHeight, dayFreqImageWidth);
//byte[] bytes = BitmapHelper.ConvertToBytes(report.ExportToBitmap(dayFreqImageHeight, dayFreqImageWidth));
}
public List<GridItemEventResult> SearchDayList()
{
List<RemoteRealtimeResultEntity> list = new List<RemoteRealtimeResultEntity>();
DateTime reportSearchStartDate = new DateTime(ReportStartTime.Year, ReportStartTime.Month, ReportStartTime.Day, 0, 0, 0);
list = fsqlTencent.Select<RemoteRealtimeResultEntity>()
.Where(pp => DateTime.Parse(pp.EventTime).Ticks >= reportSearchStartDate.Ticks &&
DateTime.Parse(pp.EventTime).Ticks < reportSearchStartDate.AddHours(24).Ticks && pp.ML >= ReportMinML && pp.ML <= ReportMaxML).ToList();
if (list != null)
{
List<GridItemEventResult> results = new List<GridItemEventResult>();
foreach (var item in list)
{
GridItemEventResult se = new GridItemEventResult(item, true);
string eventTimeStr = se.EventTime;
string datePath = eventTimeStr.Substring(0, 4) + eventTimeStr.Substring(5, 2) + eventTimeStr.Substring(8, 2);
string dataFilePath = GlobalConfig.ProjectConfig.MseedFilePath + "\\" + datePath + "\\";
string dataFileName = "HA." + eventTimeStr.Substring(0, 4) + eventTimeStr.Substring(5, 2)
+ eventTimeStr.Substring(8, 2) + eventTimeStr.Substring(10, 3)
+ eventTimeStr.Substring(14, 2) + eventTimeStr.Substring(17, 2) + ".01" + GlobalConfig.DataTypeString;
string jsonStr = ".json";
MmEvent curMmEvent = new MmEvent();
curMmEvent.EventTimeStr = eventTimeStr;
curMmEvent.X = se.X;
curMmEvent.Y = se.Y;
curMmEvent.RMS = se.RMS;
curMmEvent.DominantFreq = 15;
//查询事件Json文件是否已下载
if (File.Exists(dataFilePath + dataFileName + jsonStr))
{
FileInfo fileInfo = new FileInfo(dataFilePath + dataFileName + jsonStr);
if (fileInfo.Length > 1024)
{
EventFunc.ComputeFM(curMmEvent);
//目前提取的为半周期
curMmEvent.DominantFreq = GlobalData.GetDominFreq(eventTimeStr);
}
}
else
{
#region 同步方式
int res = new DownloadJsonFile().Download(eventTimeStr, dataFilePath, dataFileName + jsonStr, GlobalConfig.UseWaveDataTable);
if (res > -1)
{
FileInfo fileInfo2 = new FileInfo(dataFilePath + dataFileName + jsonStr);
if (fileInfo2.Length > 2000)
{
EventFunc.ComputeFM(curMmEvent);
//目前提取的为半周期
curMmEvent.DominantFreq = GlobalData.GetDominFreq(eventTimeStr);
}
}
#endregion
}
se.DominantFreq = (int)curMmEvent.DominantFreq;
se.SourceChara = (int)curMmEvent.FocalType;
se.Direction = curMmEvent.Direction;
se.SetEnergy();
results.Add(se);
}
return results;
}
return null;
}
public void SaveImageToFile(Grid grid,string fileName)
{
System.IO.FileStream fs = new System.IO.FileStream(fileName, System.IO.FileMode.Create);
RenderTargetBitmap bmp = new RenderTargetBitmap((int)grid.ActualWidth, (int)grid.ActualHeight, 96d, 96d, PixelFormats.Pbgra32);
bmp.Render(grid);
BitmapEncoder encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(bmp));
encoder.Save(fs);
fs.Close();
}
}
}