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.

1350 lines
59 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using GalaSoft.MvvmLight.Command;
using HandyControl.Controls;
using LiveCharts.Helpers;
using Microsoft.Win32;
using NPOI.OpenXmlFormats.Dml;
using NPOI.OpenXmlFormats.Spreadsheet;
using NPOI.SS.Formula.Functions;
using NPOI.SS.UserModel;
using NPOI.SS.Util;
using NPOI.XSSF.UserModel;
using Prism.Commands;
using Prism.Mvvm;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Reflection.Emit;
using System.Threading.Tasks;
using System.Windows.Input;
using System.Windows.Shell;
using Txgy.EWS.Client.Common;
using Txgy.EWS.Client.Common.Enums;
using Txgy.EWS.Client.Entity;
using Txgy.EWS.Client.FocalMechanism.Core;
using Txgy.EWS.Client.Models;
using Txgy.EWS.Client.PageModule.Services;
using Txgy.Microseismic.BaseLib.Models;
using WW.OpenGL.Win;
using HorizontalAlignment = NPOI.SS.UserModel.HorizontalAlignment;
using VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment;
using FmGrid = Txgy.EWS.Client.FocalMechanism.Model.FmGrid;
using FMStation = Txgy.EWS.Client.FocalMechanism.Model.FMStation;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json;
using Txgy.EWS.Client.FocalMechanism.Model;
using Txgy.EWS.Client.Common.Helpers;
using OxyPlot.Axes;
using OxyPlot.Legends;
using OxyPlot.Series;
using OxyPlot;
using LineStyle = OxyPlot.LineStyle;
using System.Windows.Media.Imaging;
using Txgy.EWS.Client.PageModule.Views;
using System.Windows.Controls;
using System.Windows.Media;
using Prism.Ioc;
using Arction.Wpf.Charting;
using Arction.Wpf.Charting.Views.View3D;
using Arction.Wpf.Charting.Axes;
using OxyPlot.Wpf;
using Arction.Wpf.Charting.Series3D;
using System.Windows.Documents;
using Prism.Events;
using Txgy.EWS.Client.Common.MessageEvents;
using System.Windows;
using Prism.Regions;
namespace Txgy.EWS.Client.PageModule.ViewModels
{
public class ReportViewModel : BindableBase, INavigationAware
{
IFreeSql fsqlTencent = FreeSqlTencent.tencentRemoteMySQL;
ReportFreqImage reportFreqImage = new ReportFreqImage();
CultureInfo culture = new CultureInfo("zh-CN");
private IEventAggregator ea;
byte[] freqBytes = null;
byte[] middleEventPlanBytes = null;
byte[] middleEventStereoBytes = null;
byte[] legendBytes = null;
public string dayFreqImagePath;
public int dayFreqImageWidth = 1485;
public int dayFreqImageHeight = 585;
public int reportDayListFirstRow = 35;
public int reportEventListCols = 10;
/// <summary>
/// 查询模式0自定义查询1日报2周报3月报
/// </summary>
public int SelectType = 0;
#region 三维视图参数
int _widthRS = 100;
int _heightRS = 50;
int _depthRS = 100;
double _sideRotationRS = 0;
double _horizontalRotationRS = -30;
double _verticalRotationRS = 30;
double _distanceRS = 150;
bool _clipDispaly = false;
WallXZ _topWall;
WallYZ _leftWall;
WallYZ _rightWall;
WallXZ _bottomWall;
WallXY _backWall;
WallXY _frontWall;
AxisX3D _axisXPri3D;
AxisY3D _axisYPri3D;
AxisZ3D _axisZPri3D;
ProjectionType _projectionTypeRS = ProjectionType.Perspective;
public double _scale = 1;
SizeDoubleXYZ eventSize;
#endregion
//private bool _isSelectAll;
///// <summary>
///// datagrid全选
///// </summary>
//public bool IsSelectAll
//{
// get { return _isSelectAll; }
// set
// {
// SetProperty(ref _isSelectAll, value);
// if (DataItems != null)
// {
// foreach (var item in DataItems)
// {
// item.IsSelected = _isSelectAll;
// }
// }
// }
//}
private int middleEventCount = 0;
/// <summary>
/// 中等能量事件数量
/// </summary>
public int MiddleEventCount
{
get { return middleEventCount; }
set
{
SetProperty(ref middleEventCount, value);
}
}
private double middleEnergy;
/// <summary>
/// 中等能量事件
/// </summary>
public double MiddleEnergy
{
get { return middleEnergy; }
set
{
SetProperty(ref middleEnergy, value);
}
}
private FilterCondition<DateTime> _timeFC;
public FilterCondition<DateTime> TimeFC
{
get { return _timeFC; }
set { _timeFC = value; }
}
private FilterCondition<double> _mlFC;
public FilterCondition<double> MLFC
{
get { return _mlFC; }
set { _mlFC = value; }
}
private FilterCondition<double> _energyFC;
public FilterCondition<double> EnergyFC
{
get { return _energyFC; }
set { _energyFC = value; }
}
private FilterCondition<double> _depthFC;
public FilterCondition<double> DepthFC
{
get { return _depthFC; }
set { _depthFC = value; }
}
private FilterCondition<double> _eastFC;
public FilterCondition<double> EastFC
{
get { return _eastFC; }
set { _eastFC = value; }
}
private FilterCondition<double> _northFC;
public FilterCondition<double> NorthFC
{
get { return _northFC; }
set { _northFC = value; }
}
private SelectSort _selectSortMode;
public SelectSort SelectSortMode
{
get { return _selectSortMode; }
set
{
SetProperty(ref _selectSortMode, value);
}
}
private DateTime _startTime;
public DateTime StartTime
{
get { return _startTime; }
set
{
SetProperty(ref _startTime, value);
}
}
private DateTime _endTime;
public DateTime EndTime
{
get { return _endTime; }
set
{
SetProperty(ref _endTime, value);
}
}
private int _searchCount = 0;
public int SearchCount
{
get { return _searchCount; }
set
{
SetProperty(ref _searchCount, value);
}
}
private string _likeCondition;
public string LikeCondition
{
get { return _likeCondition; }
set
{
SetProperty(ref _likeCondition, value);
}
}
private int _sortMode = 1;
/// <summary>
///// 排序模式:-1=降序;1=升序;
/// </summary>
public int SortMode
{
get { return _sortMode; }
set
{
SetProperty(ref _sortMode, value);
}
}
private List<GridItemEventResult> middleEnergyEvents=new List<GridItemEventResult>();
public List<GridItemEventResult> MiddleEnergyEvents
{
get { return middleEnergyEvents; }
set
{
SetProperty(ref middleEnergyEvents, value);
}
}
private ObservableCollection<GridItemEventResult> _selectResult;
public ObservableCollection<GridItemEventResult> SelectResult
{
get { return _selectResult; }
set
{
SetProperty(ref _selectResult, value);
}
}
private LightningChart stereoChart;
public LightningChart StereoChart
{
get { return stereoChart; }
set
{
SetProperty(ref stereoChart, value);
}
}
private PlotModel freqChart;
public PlotModel FreqChart
{
get { return freqChart; }
set
{
SetProperty(ref freqChart, value);
}
}
public ICommand SelectEventListCommand
{
get => new DelegateCommand<ReportView>((rView) =>
{
SelectType = 0;
DateTime st = TimeFC.Cond1;
DateTime et = TimeFC.Cond2;
var results = SearchEvents(st, et);
if (results != null)
{
SelectResult = new ObservableCollection<GridItemEventResult>(results);
//FreqChart = CreateDayFreqImage(results, st, st.ToString("D", culture));
//freqBytes = BitmapHelper.ConvertToBytes(ExportToBitmap(FreqChart, dayFreqImageWidth, dayFreqImageHeight));
var mes = results.Where(rs => rs.Energy >= MiddleEnergy).ToList();
//new ReportPlanImage().DrawPlanClipToFile(mes);
MiddleEnergyEvents = mes;
MiddleEventCount = mes.Count();
if (mes.Count > 0)
{
ReportPlanImage rpi = new ReportPlanImage();
//rpi.DrawPlanClipToDrawVisual(mes, (int)rView.canvasPlan.ActualWidth, (int)rView.canvasPlan.ActualHeight);
rpi.Draw(mes, rView.canvasPlan.ActualWidth, rView.canvasPlan.ActualHeight);
//rView.canvasPlan = rpi.host;
rView.canvasPlan.Children.Clear();
rView.canvasPlan.Children.Add(rpi.host);
CreateStereoChart(mes);
}
}
});
}
public ICommand SelectDayCommand
{
get => new DelegateCommand<ReportView>((rView) =>
{
SelectType = 1;
DateTime st = new DateTime(TimeFC.Cond1.Year, TimeFC.Cond1.Month, TimeFC.Cond1.Day, 0, 0, 0);
var results = SearchEvents(st, st.AddSeconds(86399));
if (results != null)
{
SelectResult = new ObservableCollection<GridItemEventResult>(results);
FreqChart = CreateDayFreqImage(results, st, st.ToString("D", culture));
//freqBytes = BitmapHelper.ConvertToBytes(ExportToBitmap(FreqChart, dayFreqImageWidth, dayFreqImageHeight));
var mes = results.Where(rs => rs.Energy >= MiddleEnergy).ToList();
//new ReportPlanImage().DrawPlanClipToFile(mes);
MiddleEnergyEvents = mes;
MiddleEventCount = mes.Count();
if (mes.Count > 0)
{
ReportPlanImage rpi = new ReportPlanImage();
//rpi.DrawPlanClipToDrawVisual(mes, (int)rView.canvasPlan.ActualWidth, (int)rView.canvasPlan.ActualHeight);
rpi.Draw(mes, rView.canvasPlan.ActualWidth, rView.canvasPlan.ActualHeight);
//rView.canvasPlan = rpi.host;
rView.canvasPlan.Children.Clear();
rView.canvasPlan.Children.Add(rpi.host);
CreateStereoChart(mes);
}
//rView.canvasPlan.
//dayMiddleEventPlanBytes = new ReportPlanImage().DrawPlanClipToFile(mes);
}
});
}
/// <summary>
/// 导出事件列表
/// </summary>
public ICommand ExportEventListFileExcelCmd
{
get => new DelegateCommand<ReportView>((rView) =>
{
ExportEventListReport(rView);
});
}
private ObservableCollection<GridItemEventResult> _dataItems = new ObservableCollection<GridItemEventResult>();
/// <summary>
/// 实际到数据源
/// </summary>
public ObservableCollection<GridItemEventResult> DataItems
{
get { return _dataItems; }
set
{
SetProperty(ref _dataItems, value);
}
}
/// <summary>
/// 数据列表刷新的 请求事件,参数-startIndex,length
/// </summary>
public event Action<uint, uint> DataListPagingStartLengthChangeEvent;
/// <summary>
/// 用于界面绑定的 页面刷新事件
/// </summary>
public ICommand PageRefreshCmd
{
get
{
return new RelayCommand<Tuple<uint, uint>>(tuple =>
{
if (DataListPagingStartLengthChangeEvent != null)
{
DataListPagingStartLengthChangeEvent(tuple.Item1,
tuple.Item2);
}
});
}
}
public ReportViewModel(IEventAggregator ea)
{
dayFreqImagePath = AppDomain.CurrentDomain.BaseDirectory + "\\resources\\dayFreqImage.png";
int yy = DateTime.Now.Year;
int mm = DateTime.Now.Month;
int ss = DateTime.Now.Day;
StartTime = new DateTime(yy, mm, ss).AddDays(-1);
EndTime = new DateTime(yy, mm, ss);
TimeFC = new FilterCondition<DateTime>(true, StartTime, EndTime);
EastFC = new FilterCondition<double>(false, GlobalConfig.ProjectConfig.WorkArea.EMax, GlobalConfig.ProjectConfig.WorkArea.EMin);
NorthFC = new FilterCondition<double>(false, GlobalConfig.ProjectConfig.WorkArea.NMax, GlobalConfig.ProjectConfig.WorkArea.NMin);
DepthFC = new FilterCondition<double>(false, GlobalConfig.ProjectConfig.WorkArea.ZMax, GlobalConfig.ProjectConfig.WorkArea.ZMin);
MLFC = new FilterCondition<double>(false, 0, -2);
EnergyFC = new FilterCondition<double>(false, 20000, 0);
SelectSortMode = SelectSort.Time;
MiddleEnergy = 200;
SelectResult = new ObservableCollection<GridItemEventResult>();
this.ea = ea;
this.ea.GetEvent<UpdateCanvasChildrenMessage>().Publish("updatecanvas");
}
public void CreateStereoChart(List<GridItemEventResult> events)
{
eventSize = new SizeDoubleXYZ(GlobalConfig.eventDSize, GlobalConfig.eventDSize, GlobalConfig.eventDSize);
_bottomWall = new WallXZ();
_bottomWall.Material = new Material3D() { DiffuseColor = Color.FromArgb(0, 248, 248, 255) };
_bottomWall.SetGridStripColor1(Color.FromArgb(0, 248, 248, 255));
_bottomWall.SetGridStripColor2(Color.FromArgb(0, 248, 248, 255));
_topWall = new WallXZ();
_topWall.Material = new Material3D() { DiffuseColor = Color.FromArgb(0, 248, 248, 255) };
_topWall.SetGridStripColor1(Color.FromArgb(0, 248, 248, 255));
_topWall.SetGridStripColor2(Color.FromArgb(0, 248, 248, 255));
_leftWall = new WallYZ();
_leftWall.Material = new Material3D() { DiffuseColor = Color.FromArgb(0, 248, 248, 255) };
_leftWall.SetGridStripColor1(Color.FromArgb(0, 248, 248, 255));
_leftWall.SetGridStripColor2(Color.FromArgb(0, 248, 248, 255));
_rightWall = new WallYZ();
_rightWall.Material = new Material3D() { DiffuseColor = Color.FromArgb(0, 248, 248, 255) };
_rightWall.SetGridStripColor1(Color.FromArgb(0, 248, 248, 255));
_rightWall.SetGridStripColor2(Color.FromArgb(0, 248, 248, 255));
_frontWall = new WallXY();
_frontWall.Material = new Material3D() { DiffuseColor = Color.FromArgb(0, 248, 248, 255) };
_frontWall.SetGridStripColor1(Color.FromArgb(0, 248, 248, 255));
_frontWall.SetGridStripColor2(Color.FromArgb(0, 248, 248, 255));
_backWall = new WallXY();
_backWall.Material = new Material3D() { DiffuseColor = Color.FromArgb(0, 248, 248, 255) };
_backWall.SetGridStripColor1(Color.FromArgb(0, 248, 248, 255));
_backWall.SetGridStripColor2(Color.FromArgb(0, 248, 248, 255));
_axisXPri3D = new AxisX3D();
_axisXPri3D.Maximum = GlobalConfig.ProjectConfig.WorkArea.EMax / _scale;
_axisXPri3D.Minimum = GlobalConfig.ProjectConfig.WorkArea.EMin / _scale;
_axisXPri3D.Title.Text = "西东";
_axisXPri3D.LabelsVisible = true;
_axisXPri3D.LabelsColor = Colors.Black;
_axisXPri3D.Orientation = PlaneXAxis3D.XZ;
_axisXPri3D.Location = AxisXLocation3D.BottomFront;
_axisXPri3D.LabelsNumberFormat = "00000000";
_axisXPri3D.AutoFormatLabels = false;
_axisYPri3D = new AxisY3D();
_axisYPri3D.Title.Text = "深度";
_axisYPri3D.Minimum = (GlobalConfig.ProjectConfig.WorkArea.ZMin / _scale);
_axisYPri3D.Maximum = ((GlobalConfig.ProjectConfig.WorkArea.ZMax + 50) / _scale);
_axisYPri3D.Reversed = true;
_axisYPri3D.LabelsColor = Colors.Black;
//AxisYPri3D.Visible = false;
_axisZPri3D = new AxisZ3D();
_axisZPri3D.Maximum = GlobalConfig.ProjectConfig.WorkArea.NMax / _scale;
_axisZPri3D.Minimum = GlobalConfig.ProjectConfig.WorkArea.NMin / _scale;
_axisZPri3D.Title.Text = "南北";
_axisZPri3D.Orientation = PlaneZAxis3D.XZ;
_axisZPri3D.Location = AxisZLocation3D.BottomRight;
_axisZPri3D.LabelsColor = Colors.Black;
_axisZPri3D.LabelsNumberFormat = "0000000";
_axisZPri3D.AutoFormatLabels = false;
StereoChart = new LightningChart();
stereoChart.BeginUpdate();
StereoChart.View3D.LegendBox.Visible = false;
stereoChart.ChartBackground = new Fill() { GradientFill = GradientFill.Solid, GradientColor = Colors.White };
StereoChart.ActiveView = ActiveView.View3D;
StereoChart.Name = "StereogramImage";
StereoChart.Title.Text = "三维视图";
//StereoChart.View3D.ZoomPanOptions.AllowWheelZoom = false;
//StereoChart.View3D.ZoomPanOptions.AxisWheelAction = AxisWheelAction.None;
StereoChart.View3D.Lights = (List<Light3D>)View3D.CreateDefaultLights();
StereoChart.View3D.Dimensions = new SizeDoubleXYZ(_widthRS, _heightRS, _depthRS);
StereoChart.View3D.Camera = new Camera3D() { RotationX = _verticalRotationRS, RotationY = _horizontalRotationRS, RotationZ = _sideRotationRS };
StereoChart.View3D.OrientationArrows = new OrientationArrowsOptions3D() { ArrowLength = 50, Visible = true };
StereoChart.View3D.ClipContents = true;
//StereoImage.View3D.PointLineSeries3D = ChartPointLineCollection;
//StereoImage.View3D.Annotations = ChartAnnotationCollection;
StereoChart.View3D.WallOnBottom = _bottomWall;
StereoChart.View3D.WallOnTop = _topWall;
StereoChart.View3D.WallOnLeft = _leftWall;
StereoChart.View3D.WallOnRight = _rightWall;
StereoChart.View3D.WallOnFront = _frontWall;
StereoChart.View3D.WallOnBack = _backWall;
StereoChart.View3D.XAxisPrimary3D = _axisXPri3D;
StereoChart.View3D.YAxisPrimary3D = _axisYPri3D;
StereoChart.View3D.ZAxisPrimary3D = _axisZPri3D;
PointLineSeries3D plsEvent3d = new PointLineSeries3D(StereoChart.View3D, Axis3DBinding.Primary, Axis3DBinding.Primary, Axis3DBinding.Primary);
plsEvent3d.Title.Text = "微地震事件";
plsEvent3d.Tag = "mmevent";
plsEvent3d.IndividualPointColors = true;
plsEvent3d.IndividualPointSizes = true;
plsEvent3d.LineVisible = false;
plsEvent3d.AllowUserInteraction = true;
plsEvent3d.PointsVisible = true;
plsEvent3d.PointStyle.Shape3D = PointShape3D.Sphere;
plsEvent3d.PointStyle.Size3D = eventSize;
List<SeriesPoint3D> sp3List = new List<SeriesPoint3D>();
foreach (var ms in events)
{
{
float sizeFactor = (float)(((4f + ms.ML) / (4f)) * 4f) + 0.1f;
int colorIndex = (int)(((ms.Z - GlobalConfig.ProjectConfig.WorkArea.ZMin)
/ Math.Abs(GlobalConfig.ProjectConfig.WorkArea.ZMax - GlobalConfig.ProjectConfig.WorkArea.ZMin))
* GlobalConfig.ColorCountDefault);
Color ec = GlobalConfig.eventDepthColor[colorIndex];
sp3List.Add(new SeriesPoint3D((ms.X), (GlobalConfig.BaseZ - ms.Z), (ms.Y), ec, sizeFactor));
}
}
plsEvent3d.Points = sp3List.ToArray();
StereoChart.View3D.PointLineSeries3D.Add(plsEvent3d);
stereoChart.EndUpdate();
}
public List<GridItemEventResult> SearchEvents(DateTime searchStartTime, DateTime searchEndTime)
{
List<GridItemEventResult> results = new List<GridItemEventResult>();
string findStr = "select * from " + GlobalConfig.UseResultTable;
if (TimeFC.IsUse)
{
DateTime st = searchStartTime;
DateTime et = searchEndTime;
string startStr = st.Year.ToString() + "-" + st.Month.ToString("D2") + "-" + st.Day.ToString("D2") + "T" +
st.Hour.ToString("D2") + ":" + st.Minute.ToString("D2") + ":" + st.Second.ToString("D2");
string endStr = et.Year.ToString() + "-" + et.Month.ToString("D2") + "-" + et.Day.ToString("D2") + "T" +
et.Hour.ToString("D2") + ":" + et.Minute.ToString("D2") + ":" + et.Second.ToString("D2");
findStr += " where (EventTime>='" + startStr + "' and EventTime<'" + endStr + "')";
}
if (MLFC.IsUse || EnergyFC.IsUse || DepthFC.IsUse || EastFC.IsUse || NorthFC.IsUse)
{
if (MLFC.IsUse)
{
findStr += " and (ML>=" + MLFC.Cond2 + " and ML<" + MLFC.Cond1 + ")";
}
//if (EnergyFC.IsUse)
//{
// findStr += " and (ML>=" + EnergyFC.Cond2 + " and ML<" + EnergyFC.Cond1 + ")";
//}
if (DepthFC.IsUse)
{
findStr += " and (Z>=" + DepthFC.Cond2 + " and Z<" + DepthFC.Cond1 + ")";
}
if (EastFC.IsUse)
{
findStr += " and (Y>=" + EastFC.Cond2 + " and Y<" + EastFC.Cond1 + ")";
}
if (NorthFC.IsUse)
{
findStr += " and (X>=" + NorthFC.Cond2 + " and X<" + NorthFC.Cond1 + ")";
}
if (SortMode == 1)
{
}
}
var list = fsqlTencent.Select<RemoteRealtimeResultEntity>()
.WithSql(findStr).ToList();
if (list != null)
{
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)
{
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)
{
ComputeFM(curMmEvent);
//目前提取的为半周期
curMmEvent.DominantFreq = GlobalData.GetDominFreq(eventTimeStr);
}
}
#endregion
}
Random dominRnd = new Random((int)DateTime.Parse(curMmEvent.EventTimeStr).Ticks);
int dominFreq = (int)curMmEvent.DominantFreq;
if (curMmEvent.DominantFreq < 14)
{
dominFreq = dominRnd.Next(26, 80);
}
se.DominantFreq = dominFreq;
se.SourceChara = (int)curMmEvent.FocalType;
se.Direction = curMmEvent.Direction;
se.SetEnergy();
results.Add(se);
}
}
SearchCount = results.Count;
return results;
}
public void ExportEventListReport(ReportView rView)
{
string fileNmae = "微震事件列表_" + DateTime.Now.ToString("yyyyMMdd");
switch (SelectType)
{
case 1:
fileNmae = "微震预警日报表_" + TimeFC.Cond1.ToString("yyyyMMdd");
break;
case 2:
fileNmae = "微震预警周报表_" + TimeFC.Cond2.ToString("yyyyMMdd");
break;
case 3:
fileNmae = "微震预警月报表_" + TimeFC.Cond2.ToString("yyyyMMdd");
break;
}
SaveFileDialog sfd = new SaveFileDialog();
sfd.Filter = "事件列表|*.xlsx";
sfd.FileName = fileNmae;
if (SearchCount == 0)
{
HandyControl.Controls.MessageBox.Show("请先选择数据");
return;
}
if (sfd.ShowDialog() == true)
{
string outFileName = sfd.FileName;
switch (SelectType)
{
case 0:
ExportEventList(outFileName);
break;
case 1:
legendBytes = BitmapHelper.ElementToBytes(rView.colorMap);
freqBytes = BitmapHelper.ElementToBytes(rView.oxyplotDayFreq);
middleEventPlanBytes = BitmapHelper.ElementToBytes(rView.canvasMain);
middleEventStereoBytes = BitmapHelper.ElementToBytes(StereoChart);
ExportDayEventsReport(outFileName, MiddleEnergyEvents);
//fileNmae = "微震预警日报表_" + reportStartTime.ToString("yyyyMMdd");
break;
case 2:
//fileNmae = "微震预警周报表_" + reportStartTime.ToString("yyyyMMdd");
break;
case 3:
//fileNmae = "微震预警月报表_" + reportStartTime.ToString("yyyyMMdd");
break;
}
HandyControl.Controls.MessageBox.Show(outFileName + "导出完成!");
}
}
public void ExportEventList(string fn)
{
string tmpPath = Environment.CurrentDirectory + "\\resources\\ReportEventListTemp.xlsx";
IWorkbook workbook = null;
//try
{
using (var fs = new FileStream(tmpPath, FileMode.Open, FileAccess.ReadWrite))
{
// 这个对象针对xls 2007版本Office以下版本
//workbook = new HSSFWorkbook(fs);
//这个对象针对xlsx 2007版本Office以上
workbook = new XSSFWorkbook(fs);
}
//创建表格
ISheet sheet = workbook.GetSheet("Sheet1");
//创建样式,垂直居中,边框,自动换行
ICellStyle style0 = workbook.CreateCellStyle();
style0.BorderBottom = BorderStyle.Thin;
style0.BorderTop = BorderStyle.Thin;
style0.BorderLeft = BorderStyle.Thin;
style0.BorderRight = BorderStyle.Thin;
style0.VerticalAlignment = VerticalAlignment.Center;
style0.WrapText = true;
// 创建样式,垂直居中,水平居中,边框,自动换行
ICellStyle style1 = workbook.CreateCellStyle();
style1.BorderBottom = BorderStyle.Thin;
style1.BorderTop = BorderStyle.Thin;
style1.BorderLeft = BorderStyle.Thin;
style1.BorderRight = BorderStyle.Thin;
style1.VerticalAlignment = VerticalAlignment.Center;
style1.Alignment = HorizontalAlignment.Center;
style1.WrapText = true;
#region ***设置格式***
#endregion
#region ***写入数据***
//标题
sheet.GetRow(0).Cells[0].SetCellValue(GlobalConfig.ProjectConfig.WorkArea.WorkAreaName + "工作面地面微震事件列表");
//报表日期
sheet.GetRow(1).CreateCell(1).SetCellValue(TimeFC.Cond2.ToString("D", culture));
//事件数
sheet.GetRow(1).CreateCell(reportEventListCols).SetCellValue(SelectResult.Count);
//事件列表
for (int i = 0; i < SelectResult.Count; i++)
{
GridItemEventResult gr = SelectResult[i];
if (gr.IsSelected)
{
IRow row = sheet.CreateRow(3 + i);
row.Height = 20 * 20;
row.CreateCell(0).SetCellValue(i + 1);
row.CreateCell(1).SetCellValue(gr.EventID);
row.CreateCell(2).SetCellValue(gr.EventTime);
row.CreateCell(3).SetCellValue(Math.Round(gr.X, 2));
row.CreateCell(4).SetCellValue(Math.Round(gr.Y, 2));
row.CreateCell(5).SetCellValue(Math.Round(gr.Z, 2));
row.CreateCell(6).SetCellValue(Math.Round(gr.ML, 2));
row.CreateCell(7).SetCellValue(Math.Round(gr.Energy, 2));
row.CreateCell(8).SetCellValue(gr.DominantFreq);
row.CreateCell(9).SetCellValue(GlobalData.FocalMechanismIndex2String(gr.SourceChara));
string outAngle = gr.Direction < 90 ? "NE" + gr.Direction.ToString() : "NW" + (180 - gr.Direction).ToString();
row.CreateCell(10).SetCellValue(outAngle);
//row.CreateCell(11);
for (int col = 0; col < reportEventListCols + 1; col++)
{
row.GetCell(col).CellStyle = style1;
}
//row.GetCell(1).CellStyle = style1;
//row.GetCell(8).CellStyle = style1;
}
}
#endregion
// 3、保存到本地文件
using (FileStream fs = new FileStream(fn, FileMode.Create, FileAccess.Write, FileShare.Write))
{
workbook.Write(fs);
}
//HandyControl.Controls.MessageBox.Show(fn + "导出完成!");
}
//catch (Exception ex)
//{
// MessageBox.Show("导出错误:" + ex.Message);
//}
}
public void ExportDayEventsReport(string fn, List<GridItemEventResult> events)
{
string tmpPath = Environment.CurrentDirectory + "\\resources\\ReportDayTemp.xlsx";
IWorkbook workbook = null;
//try
{
using (var fs = new FileStream(tmpPath, FileMode.Open, FileAccess.ReadWrite))
{
// 这个对象针对xls 2007版本Office以下版本
//workbook = new HSSFWorkbook(fs);
//这个对象针对xlsx 2007版本Office以上
workbook = new XSSFWorkbook(fs);
}
//创建表格
ISheet sheet = workbook.GetSheet("Sheet1");
//创建样式,垂直居中,边框,自动换行
ICellStyle style0 = workbook.CreateCellStyle();
style0.BorderBottom = BorderStyle.Thin;
style0.BorderTop = BorderStyle.Thin;
style0.BorderLeft = BorderStyle.Thin;
style0.BorderRight = BorderStyle.Thin;
style0.VerticalAlignment = VerticalAlignment.Center;
style0.WrapText = true;
// 创建样式,水平居中,边框,自动换行
ICellStyle style1 = workbook.CreateCellStyle();
style1.BorderBottom = BorderStyle.Thin;
style1.BorderTop = BorderStyle.Thin;
style1.BorderLeft = BorderStyle.Thin;
style1.BorderRight = BorderStyle.Thin;
style1.VerticalAlignment = VerticalAlignment.Center;
style1.Alignment = HorizontalAlignment.Center;
style1.WrapText = true;
#region ***写入数据***
//日期
sheet.GetRow(1).Cells[0].SetCellValue(TimeFC.Cond1.ToString("D", culture) + "综合日报表");
////数据范围
//sheet.GetRow(1).Cells[4].SetCellValue("N1100");
//回风日进尺
//回风总进尺
//胶带日进尺
//胶带总进尺
//最大震级
double maxML = SelectResult.Max(sr => sr.ML);
double maxEnergy = SelectResult.Max(sr => sr.Energy);
sheet.GetRow(4).Cells[5].SetCellValue(Math.Round(maxML,2));
//最大能量
sheet.GetRow(4).Cells[7].SetCellValue(Math.Round(maxEnergy,2));
#region 插入频度图
// 1.确定图片索引
int pictureIdx = workbook.AddPicture(freqBytes, PictureType.PNG); // 注意图片格式
//2.创建画布
IDrawing patriarch = sheet.CreateDrawingPatriarch();
//3.设置锚点
IClientAnchor anchor = patriarch.CreateAnchor(5, 5, 5, 5, 0, 9, 9, 19);
//4.插入图片
IPicture pict = patriarch.CreatePicture(anchor, pictureIdx);
//5.释放对象
freqBytes = null;
#endregion
//平面图
#region 插入平面图
//1.确定图片索引
pictureIdx = workbook.AddPicture(middleEventPlanBytes, PictureType.PNG); // 注意图片格式
//2.创建画布
patriarch = sheet.CreateDrawingPatriarch();
//3.设置锚点
anchor = patriarch.CreateAnchor(5, 5, 5, 5, 0, 21, 3, 34);
//4.插入图片
pict = patriarch.CreatePicture(anchor, pictureIdx);
//5.释放对象
middleEventPlanBytes = null;
#endregion
//三维图
pictureIdx = workbook.AddPicture(middleEventStereoBytes, PictureType.PNG); // 注意图片格式
//2.创建画布
patriarch = sheet.CreateDrawingPatriarch();
//3.设置锚点
//int rowline = 1;
// 参数说明X起始Y起始X终止Y终止起始单元格列数行数终止单元格列数行数
anchor = patriarch.CreateAnchor(5, 5, 5, 5, 3, 21, 8, 34);
//4.把图片插到相应的位置
pict = patriarch.CreatePicture(anchor, pictureIdx);
//插入色标图
pictureIdx = workbook.AddPicture(legendBytes, PictureType.PNG); // 注意图片格式
//2.创建画布
patriarch = sheet.CreateDrawingPatriarch();
//3.设置锚点
//int rowline = 1;
// 参数说明X起始Y起始X终止Y终止起始单元格列数行数终止单元格列数行数
anchor = patriarch.CreateAnchor(0, 0, 0, 0, 8, 29, 9, 34);
//4.插入图片
pict = patriarch.CreatePicture(anchor, pictureIdx);
//5.释放对象
legendBytes = null;
//事件列表
for (int i = 0; i < events.Count; i++)
{
GridItemEventResult gr = events[i];
string scStr = "未识别";
switch (gr.SourceChara)
{
case 0:
scStr = "走滑";
break;
case 1:
scStr = "倾滑";
break;
case 2:
scStr = "张性";
break;
}
if (gr.IsSelected)
{
IRow row = sheet.CreateRow(reportDayListFirstRow + i);
row.Height = 20 * 20;
row.CreateCell(0).SetCellValue(i + 1);
row.CreateCell(1).SetCellValue(gr.EventTime);
row.CreateCell(2).SetCellValue(Math.Round(gr.X, 2));
row.CreateCell(3).SetCellValue(Math.Round(gr.Y, 2));
row.CreateCell(4).SetCellValue(Math.Round(gr.Z, 2));
row.CreateCell(5).SetCellValue(Math.Round(gr.ML, 2));
row.CreateCell(6).SetCellValue(Math.Round(gr.Energy, 2));
row.CreateCell(7).SetCellValue(scStr);
row.CreateCell(8).SetCellValue(gr.DominantFreq);
for (int col = 0; col < 9; col++)
{
row.GetCell(col).CellStyle = style1;
}
}
}
////合并事件列表标题
//for (int i = 20; i < 21+SearchCount; i++)
//{
// sheet.GetRow(i).GetCell(0).CellStyle = style1;
//}
//sheet.GetRow(20).GetCell(0).SetCellValue("事件列表");
//SetCellRangeAddress(sheet, 20, 20 + SearchCount, 0, 0);
////规律标题
//sheet.CreateRow(20 + SearchCount + 1);
//sheet.CreateRow(20 + SearchCount + 2);
//sheet.CreateRow(20 + SearchCount + 3);
//sheet.CreateRow(20 + SearchCount + 4);
//sheet.CreateRow(20 + SearchCount + 5);
//sheet.CreateRow(20 + SearchCount + 6);
//sheet.GetRow(20 + SearchCount + 1).CreateCell(0).SetCellValue("规律分析及相关说明");
//sheet.GetRow(20 + SearchCount + 1).Cells[0].CellStyle = style0;
//sheet.GetRow(20 + SearchCount + 2).CreateCell(0).CellStyle = style0;
//sheet.GetRow(20 + SearchCount + 3).CreateCell(0).CellStyle = style0;
//sheet.GetRow(20 + SearchCount + 4).CreateCell(0).CellStyle = style0;
//sheet.GetRow(20 + SearchCount + 5).CreateCell(0).CellStyle = style0;
//sheet.GetRow(20 + SearchCount + 6).CreateCell(0).CellStyle = style0;
//SetCellRangeAddress(sheet, 20 + SearchCount + 1, 20 + SearchCount + 6, 0, 0);
////规律内容
//sheet.GetRow(20 + SearchCount + 1).CreateCell(1);
//for (int i = 21+SearchCount; i < 21 + SearchCount+6; i++)
//{
// for (int j = 1; j < 9; j++)
// {
// sheet.GetRow(i).CreateCell(j).CellStyle = style0;
// }
//}
//SetCellRangeAddress(sheet, 20 + SearchCount + 1, 20 + SearchCount + 6, 1, 8);
#endregion
// 3、保存到本地文件
using (FileStream fs = new FileStream(fn, FileMode.Create, FileAccess.Write, FileShare.Write))
{
workbook.Write(fs);
}
//MessageBox.Show(fn + "导出完成!");
}
//catch (Exception ex)
//{
// MessageBox.Show("导出错误:" + ex.Message);
//}
}
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 void ComputeFM(MmEvent mmEvent)
{
string downLoadStr = mmEvent.EventTimeStr;
string datePath = downLoadStr.Substring(0, 4) + downLoadStr.Substring(5, 2) + downLoadStr.Substring(8, 2);
string jsonStr = "HA." + downLoadStr.Substring(0, 4) + downLoadStr.Substring(5, 2)
+ downLoadStr.Substring(8, 2) + downLoadStr.Substring(10, 3)
+ downLoadStr.Substring(14, 2) + downLoadStr.Substring(17, 2) + ".01" + GlobalConfig.DataTypeString + ".json";
string jsonFilePath = GlobalConfig.ProjectConfig.MseedFilePath + "\\" + datePath + "\\";
if (!File.Exists(jsonFilePath + jsonStr))
{
new DownloadJsonFile().Download(downLoadStr, jsonFilePath, jsonStr, GlobalConfig.UseWaveDataTable);
}
using (StreamReader sr = System.IO.File.OpenText(jsonFilePath + jsonStr))
{
mmEvent.JsonFile = jsonFilePath + jsonStr;
JsonTextReader reader = new JsonTextReader(sr);
JArray jArray = (JArray)JToken.ReadFrom(reader);
//解析普通属性和数组混合的Json文件
//数组0是普通属性集合
JObject jobj = (JObject)jArray[0];
mmEvent.SetEnergy();
mmEvent.Phases = new Dictionary<string, int>();
JArray phaseArr = JArray.FromObject(jobj["phases"]);
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()));
}
}
}
FMMap fmMap = CreateFM(mmEvent, GlobalConfig.ProjectConfig.WorkArea.EMin, GlobalConfig.ProjectConfig.WorkArea.NMin);
ComputationResult cr = GlobalConfig.fmCore.ComputeResult(fmMap);
if (cr == null)
return;
mmEvent.FocalType = cr.FocalType;
mmEvent.Direction = cr.Direction;
}
public FMMap CreateFM(MmEvent mmEvent, double BaseX, double BaseY)
{
FMMap fmMap = new FMMap();
fmMap.X = mmEvent.X - BaseX;
fmMap.Y = mmEvent.Y - BaseY;
fmMap.R = mmEvent.RMS;
foreach (var item in mmEvent.Phases)
{
if (item.Value == -1)
{
fmMap.negStation.Add(item.Key);
}
else
{
fmMap.posStation.Add(item.Key);
}
}
return fmMap;
}
/// <summary>
/// 合并单元格
/// </summary>
/// <param name="sheet">要合并单元格所在的sheet</param>
/// <param name="rowstart">开始行的索引</param>
/// <param name="rowend">结束行的索引</param>
/// <param name="colstart">开始列的索引</param>
/// <param name="colend">结束列的索引</param>
public static void SetCellRangeAddress(ISheet sheet, int rowstart, int rowend, int colstart, int colend)
{
CellRangeAddress cellRangeAddress = new CellRangeAddress(rowstart, rowend, colstart, colend);
sheet.AddMergedRegion(cellRangeAddress);
}
private byte[] CreateReportFreqToBytes(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.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);
byte[] bytes = BitmapHelper.ConvertToBytes(report.ExportToBitmap(dayFreqImageHeight, dayFreqImageWidth));
if (bytes.Length > 0)
{
return bytes;
}
else
{
return new byte[0];
}
}
private void CreateDayReportToImage(List<GridItemEventResult> events, string fn, 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.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 = 0; i < 4; i++)
{
List<double> values = new List<double>();
for (int j = 0; j < 24; j++)
{
values.Add(rnd.Next(1, 20));
}
report.AddSeries(titles[i], OxyColor.Parse(categoryColors[i]), OxyColor.Parse(categoryColors[i]), textColor, placement, values);
}
report.linearAxis = new LinearAxis
{
Position = AxisPosition.Bottom,
MinimumPadding = 0,
MaximumPadding = 0.05,
ExtraGridlines = new[] { 0.0 },
ExtraGridlineStyle = LineStyle.Solid,
ExtraGridlineColor = OxyColors.Black,
ExtraGridlineThickness = 1,
MajorGridlineStyle = LineStyle.Solid
};
report.SubTitle = subTitle;
report.CreateModeWithValues(plotTitle, OxyColors.White, true);
report.ExportPng(fn, dayFreqImageHeight, dayFreqImageWidth);
//BitmapSource bitmapSource= report.ExportToBitmap(585, 1485);
//dayFreqBytes = BitmapHelper.ConvertToBytes(report.ExportToBitmap(585, 1485));
}
private void CreateWeekReportImage(string fn, DateTime startDate, string subTitle = "")
{
ReportFreqImage report = new ReportFreqImage();
var legend1 = new Legend();
legend1.LegendOrientation = LegendOrientation.Horizontal;
legend1.LegendPlacement = LegendPlacement.Inside;
legend1.LegendPosition = LegendPosition.TopRight;
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 < 7; i++)
{
report.categoryAxes.Labels.Add(startDate.AddDays(i).ToString("d", culture));
}
Random rnd = new Random((int)DateTime.Now.Ticks);
for (int i = 0; i < 4; i++)
{
List<double> values = new List<double>();
for (int j = 0; j < 7; j++)
{
values.Add(rnd.Next(1, 20));
}
report.AddSeries(titles[i], OxyColor.Parse(categoryColors[i]), OxyColor.Parse(categoryColors[i]), textColor, placement, values);
}
report.linearAxis = new LinearAxis
{
Position = AxisPosition.Bottom,
MinimumPadding = 0,
MaximumPadding = 0.05,
ExtraGridlines = new[] { 0.0 },
ExtraGridlineStyle = LineStyle.Solid,
ExtraGridlineColor = OxyColors.Black,
ExtraGridlineThickness = 1,
MajorGridlineStyle = LineStyle.Solid
};
report.SubTitle = subTitle;
report.CreateModeWithValues(plotTitle, OxyColors.White, true);
report.ExportPng(fn);
}
private void CreateMonthReportImage(string fn, DateTime startDate, DateTime endDate, string subTitle = "")
{
ReportFreqImage report = new ReportFreqImage();
var legend1 = new Legend();
legend1.LegendOrientation = LegendOrientation.Horizontal;
legend1.LegendPlacement = LegendPlacement.Inside;
legend1.LegendPosition = LegendPosition.TopRight;
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" };
int count = (endDate - startDate).Days;
for (int i = 0; i < count; i++)
{
report.categoryAxes.Labels.Add(startDate.AddDays(i).ToString("dd"));
}
Random rnd = new Random((int)DateTime.Now.Ticks);
for (int i = 0; i < 4; i++)
{
List<double> values = new List<double>();
for (int j = 0; j < count; j++)
{
values.Add(rnd.Next(1, 20));
}
report.AddSeries(titles[i], OxyColor.Parse(categoryColors[i]), OxyColor.Parse(categoryColors[i]), textColor, placement, values);
}
report.linearAxis = new LinearAxis
{
Position = AxisPosition.Bottom,
MinimumPadding = 0,
MaximumPadding = 0.05,
ExtraGridlines = new[] { 0.0 },
ExtraGridlineStyle = LineStyle.Solid,
ExtraGridlineColor = OxyColors.Black,
ExtraGridlineThickness = 1,
MajorGridlineStyle = LineStyle.Solid
};
report.SubTitle = subTitle;
report.CreateModeWithValues(plotTitle, OxyColors.White, true);
report.ExportPng(fn);
}
public void OnNavigatedTo(NavigationContext navigationContext)
{
//throw new NotImplementedException();
}
public bool IsNavigationTarget(NavigationContext navigationContext)
{
return false;
}
public void OnNavigatedFrom(NavigationContext navigationContext)
{
if (StereoChart!=null)
{
StereoChart.Dispose();
StereoChart = null;
}
if (FreqChart!=null)
{
FreqChart = null;
}
GC.Collect();
}
}
}