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#

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();
}
}
}