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.

253 lines
11 KiB
C#

using Arction.Wpf.Charting;
using Arction.Wpf.Charting.Axes;
using Arction.Wpf.Charting.Series3D;
using Arction.Wpf.Charting.Views.View3D;
using Aspose.Cells.Charts;
using OxyPlot;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.ComTypes;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using Txgy.EWS.Client.Models;
namespace Txgy.EWS.Client.Common.Helpers
{
public class ReportStereogramImage : IDisposable
{
string stereoImagePath;
List<PointLineSeries3D> eventList;
public LightningChart lightChart = new LightningChart();
View3D view3D = new View3D();
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;
public ReportStereogramImage()
{
stereoImagePath = AppDomain.CurrentDomain.BaseDirectory + "\\resources\\stereoImageTemp.png";
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;
lightChart = new LightningChart();
lightChart.ChartBackground = new Fill() { GradientFill = GradientFill.Solid, GradientColor = Colors.White };
lightChart.BeginUpdate();
lightChart.ActiveView = ActiveView.View3D;
lightChart.Name = "StereogramImage";
lightChart.Title.Text = "三维视图";
lightChart.View3D.ZoomPanOptions.AllowWheelZoom = false;
lightChart.View3D.ZoomPanOptions.AxisWheelAction = AxisWheelAction.None;
lightChart.View3D.Lights = (List<Light3D>)View3D.CreateDefaultLights();
lightChart.View3D.Dimensions = new SizeDoubleXYZ(_widthRS, _heightRS, _depthRS);
lightChart.View3D.Camera = new Camera3D() { RotationX = _verticalRotationRS, RotationY = _horizontalRotationRS, RotationZ = _sideRotationRS };
lightChart.View3D.OrientationArrows = new OrientationArrowsOptions3D() { ArrowLength = 50, Visible = true };
lightChart.View3D.ClipContents = true;
//lightChart.View3D.PointLineSeries3D = ChartPointLineCollection;
//lightChart.View3D.Annotations = ChartAnnotationCollection;
lightChart.View3D.WallOnBottom = _bottomWall;
lightChart.View3D.WallOnTop = _topWall;
lightChart.View3D.WallOnLeft = _leftWall;
lightChart.View3D.WallOnRight = _rightWall;
lightChart.View3D.WallOnFront = _frontWall;
lightChart.View3D.WallOnBack = _backWall;
lightChart.View3D.XAxisPrimary3D = _axisXPri3D;
lightChart.View3D.YAxisPrimary3D = _axisYPri3D;
lightChart.View3D.ZAxisPrimary3D = _axisZPri3D;
lightChart.EndUpdate();
//lightChart.SaveToStream(mStream, TargetImageFormat.Png, 1000, 1000);
//byte[] data = new byte[mStream.Length];
//BitmapImage bimage= BitmapHelper.ConvertToBitmap(data);
//BitmapEncoder encoder = new JpegBitmapEncoder();
//encoder.Frames.Add(BitmapFrame.Create(bimage));
//string file1 = @"c:\png.jpg";
//using (Stream stm = File.Create(file1))
//{
// encoder.Save(stm);
//}
//lightChart.SaveToFile("e:\\6.png",1000,1000);
}
public void SaveImage()
{
BitmapEncoder encoder = new JpegBitmapEncoder();
encoder.Frames.Add(lightChart.CaptureToBitmap());
string file1 = @"e:\png.jpg";
using (Stream stm = File.Create(file1))
{
encoder.Save(stm);
}
}
public void DrawStereoImage(List<GridItemEventResult> events)
{
lightChart.BeginUpdate();
View3D v = lightChart.View3D;
v.PointLineSeries3D.Clear();
PointLineSeries3D plsEvent3d = new PointLineSeries3D(v, 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;
////plsEvent3d.AddPoints(sp3List.ToArray(), false);
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();
v.PointLineSeries3D.Add(plsEvent3d);
lightChart.EndUpdate();
}
public byte[] DrawStereoImageToBytes(List<GridItemEventResult> events)
{
lightChart.BeginUpdate();
View3D v = lightChart.View3D;
v.PointLineSeries3D.Clear();
PointLineSeries3D plsEvent3d = new PointLineSeries3D(v, 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();
v.PointLineSeries3D.Add(plsEvent3d);
lightChart.EndUpdate();
//lightChart.SaveToFile(stereoImagePath);
MemoryStream mStream = new MemoryStream();
lightChart.SaveToStream(mStream);
BinaryReader br = new BinaryReader(mStream);
return br.ReadBytes((int)mStream.Length);
}
public void SaveToFile(string fileName, int width, int height)
{
lightChart.SaveToFile(fileName, width, height);
}
public void Dispose()
{
if (lightChart != null)
{
lightChart.Dispose();
lightChart = null;
}
}
}
}