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.

438 lines
16 KiB
C#

using Arction.Wpf.ChartingMVVM.Axes;
using Arction.Wpf.ChartingMVVM;
using Arction.Wpf.ChartingMVVM.Series3D;
using Arction.Wpf.ChartingMVVM.Views.View3D;
using Prism.Events;
using Prism.Mvvm;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Color = System.Windows.Media.Color;
using Colors = System.Windows.Media.Colors;
using Txgy.EWS.Client.Common.MessageEvents;
using Txgy.EWS.Client.Common;
using Txgy.EWS.Client.PageModule.Models;
using Txgy.Microseismic.BaseLib.Models;
using Arction.Wpf.ChartingMVVM.Titles;
using System.Windows;
namespace Txgy.EWS.Client.PageModule.ViewModels
{
public class StereogramViewModel : BindableBase
{
private IEventAggregator _ea;
public Color eventLayerColor = Colors.Red;
public Color eventColor = Colors.Red;
public Color eventTextColor = Colors.Blue;
public double eventLayerLineWeight = 1;
public double eventSize = 10;
public double eventTextSize = 12;
private ChartTitle _chartTitle;
public ChartTitle ChartTitle
{
get { return _chartTitle; }
set
{
SetProperty(ref _chartTitle, value);
}
}
private double _scale = 1;
public double Scale
{
get { return _scale; }
set
{
SetProperty(ref _scale, value);
}
}
#region ***LightningChart属性***
public SizeDoubleXYZ EventSize;
private int _widthRS = 100;
public int WidthRS
{
get { return _widthRS; }
set
{
SetProperty(ref _widthRS, value);
}
}
private int _heightRS = 50;
public int HeightRS
{
get { return _heightRS; }
set
{
SetProperty(ref _heightRS, value);
}
}
private int _depthRS = 100;
public int DepthRS
{
get { return _depthRS; }
set
{
SetProperty(ref _depthRS, value);
}
}
private double _sideRotationRS = 0;
public double SideRotationRS
{
get { return _sideRotationRS; }
set
{
SetProperty(ref _sideRotationRS, value);
}
}
private double _horizontalRotationRS = -30;
public double HorizontalRotationRS
{
get { return _horizontalRotationRS; }
set
{
SetProperty(ref _horizontalRotationRS, value);
}
}
private double _verticalRotationRS = 30;
public double VerticalRotationRS
{
get { return _verticalRotationRS; }
set
{
//Console.WriteLine(value.ToString());
SetProperty(ref _verticalRotationRS, value);
}
}
private double _distanceRS = 200;
public double DistanceRS
{
get { return _distanceRS; }
set
{
//Console.WriteLine(value.ToString());
SetProperty(ref _distanceRS, value);
}
}
private bool _clipDispaly = false;
public bool ClipDispaly
{
get { return _clipDispaly; }
set
{
SetProperty(ref _clipDispaly, value);
}
}
private WallXZ _bottomWall;
public WallXZ BottomWall
{
get { return _bottomWall; }
set
{
SetProperty(ref _bottomWall, value);
}
}
private WallXZ _topWall;
public WallXZ TopWall
{
get { return _topWall; }
set
{
SetProperty(ref _topWall, value);
}
}
private WallYZ _leftWall;
public WallYZ LeftWall
{
get { return _leftWall; }
set
{
SetProperty(ref _leftWall, value);
}
}
private WallYZ _rightWall;
public WallYZ RightWall
{
get { return _rightWall; }
set
{
SetProperty(ref _rightWall, value);
}
}
private WallXY _frontWall;
public WallXY FrontWall
{
get { return _frontWall; }
set
{
SetProperty(ref _frontWall, value);
}
}
private WallXY _backWall;
public WallXY BackWall
{
get { return _backWall; }
set
{
SetProperty(ref _backWall, value);
}
}
private AxisX3D _axisXPri3D;
public AxisX3D AxisXPri3D
{
get { return _axisXPri3D; }
set
{
SetProperty(ref _axisXPri3D, value);
}
}
private AxisY3D _axisYPri3D;
public AxisY3D AxisYPri3D
{
get { return _axisYPri3D; }
set
{
SetProperty(ref _axisYPri3D, value);
}
}
private AxisZ3D _axisZPri3D;
public AxisZ3D AxisZPri3D
{
get { return _axisZPri3D; }
set
{
SetProperty(ref _axisZPri3D, value);
}
}
private ProjectionType _projectionTypeRS = ProjectionType.Perspective;
public ProjectionType ProjectionTypeRS
{
get { return _projectionTypeRS; }
set
{
SetProperty(ref _projectionTypeRS, value);
}
}
private Fill _chartBackGround = new Fill();
public Fill ChartBackGround
{
get { return _chartBackGround; }
set
{
SetProperty(ref _chartBackGround, value);
}
}
public List<PointLineSeries3D> eventList;
public Light3DCollection Lights { get; set; }
public PointLineSeries3DCollection ChartPointLineCollection { get; set; }
public Annotation3DCollection ChartAnnotationCollection { get; set; }
public Rectangle3DCollection ChartDepthLayerCollection { get; set; }
#endregion
public StereogramViewModel(IEventAggregator ea)
{
_ea = ea;
_chartBackGround.GradientFill = GradientFill.Solid;
_chartBackGround.GradientColor = Colors.White;
_chartTitle = new ChartTitle();
_chartTitle.Text = "三维视图";
_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));
Lights = View3D.CreateDefaultLights();
//WidthRS = (int)((GlobalConfig.ProjectConfig.WorkArea.EMax - GlobalConfig.ProjectConfig.WorkArea.EMin) / Scale);
//HeightRS = (int)((GlobalConfig.ProjectConfig.WorkArea.ZMax - GlobalConfig.ProjectConfig.WorkArea.ZMin) / Scale);
//DepthRS = (int)((GlobalConfig.ProjectConfig.WorkArea.NMax - GlobalConfig.ProjectConfig.WorkArea.NMin) / Scale);
AxisXPri3D = new AxisX3D();
//AxisXPri3D.Minimum = (GlobalConfig.ProjectConfig.WorkArea.EMin - GlobalConfig.BaseX) / Scale;
//AxisXPri3D.Maximum = (GlobalConfig.ProjectConfig.WorkArea.EMax - GlobalConfig.BaseX) / Scale;
//AxisXPri3D.MajorDiv = 0.5;
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.Minimum = (GlobalConfig.ProjectConfig.WorkArea.NMin - GlobalConfig.BaseY) / Scale;
//AxisZPri3D.Maximum = (GlobalConfig.ProjectConfig.WorkArea.NMax - GlobalConfig.BaseY) / Scale;
//AxisZPri3D.MajorDiv = 0.5;
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;
//Polygons = _lcModel.CreatePolygons();
ChartPointLineCollection = new PointLineSeries3DCollection();
ChartAnnotationCollection = new Annotation3DCollection();
//CreateBackgroudByDwg();
EventSize = new SizeDoubleXYZ(GlobalConfig.eventDSize, GlobalConfig.eventDSize, GlobalConfig.eventDSize);
//_ea = ea;
//this._ea.GetEvent<UpdateEventsMessage>().Subscribe(u =>
//{
// CreateEventList();
//});
//CreateEventList();
//ChartDepthLayerCollection = new Rectangle3DCollection();
//ChartDepthLayerCollection.Add(GetRectangle(-300/Scale));
}
public void CreateEventList()
{
if (!GlobalData.AppendEvent)
{
List<PointLineSeries3D> newCollection = ChartPointLineCollection.ToList();
Console.WriteLine(newCollection.Count);
newCollection.RemoveAll(x => x.Title.Text.Contains("微地震事件"));
Console.WriteLine(newCollection.Count);
ChartPointLineCollection.Clear();
ChartPointLineCollection.AddRange(newCollection);
ChartPointLineCollection.ToList().RemoveAll(x => x.Title.Text.Contains("微地震事件"));
}
if (GlobalData.SearchEvents.Count > 0)
{
eventList = new List<PointLineSeries3D>();
PointLineSeries3D pls3d = new PointLineSeries3D();
pls3d.Title.Text = "微地震事件";
pls3d.Tag = "mm-event";
pls3d.IndividualPointColors = true;
pls3d.IndividualPointSizes = true;
pls3d.LineVisible = false;
pls3d.AllowUserInteraction = true;
pls3d.PointsVisible = true;
pls3d.PointStyle.Shape3D = PointShape3D.Sphere;
pls3d.PointStyle.Size3D = EventSize;
List<SeriesPoint3D> sp3List = new List<SeriesPoint3D>();
//SeriesPoint3D[] sp3s = new SeriesPoint3D[GlobalData.EventResults.Count];
foreach (var item in GlobalData.SearchEvents)
{
float sizeFactor = (float)(((4f + item.ML) / (4f)) * 2f) + 0.1f;
//int colorIndex = (int)((item.Z - GlobalConfig.ProjectConfig.WorkArea.ZMin) / 100);
int colorIndex = (int)(((item.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((item.Y - GlobalConfig.BaseX) / Scale, (GlobalConfig.BaseZ - item.Z)/Scale, (item.X - GlobalConfig.BaseY) / Scale, ec, sizeFactor));
}
pls3d.AddPoints(sp3List.ToArray(), true);
ChartPointLineCollection.Add(pls3d);
//Application.Current.Dispatcher.BeginInvoke(new Action(() =>
// {
// ChartPointLineCollection.Add(pls3d);
// }));
//ChartPointLineCollection.Add(pls3d);
//ChartPointLineCollection.Add(new PointLineSeries3D());
//if (ChartPointLineCollection.IsFrozen)
//{
// Application.Current.Dispatcher.BeginInvoke(new Action(() =>
// {
// ChartPointLineCollection.Add(pls3d);
// }));
//}
//if (ChartPointLineCollection.CanFreeze)
//{
// ChartPointLineCollection.Freeze();
//}
//UpdateEvents(false);
}
}
public Rectangle3D GetRectangle(double depth)
{
//Rotated clipped plane
Rectangle3D r2 = new Rectangle3D();
r2.Center.SetValues(1, depth, 1);
r2.Size.Width = 50; //Set large enough, to reach over the walls
r2.Size.Height = 50;
r2.Fill.UseImage = false;
r2.Fill.Material.DiffuseColor = Color.FromArgb(150, 50, 50, 50);
r2.Rotation.SetValues(0, 0, 0);
r2.Highlight = Highlight.Simple;
return r2;
}
public static PointLineSeries3D CreateDxfLwPolyline(string tag, string title, bool allowUser, int lineStyle, double lineWidth, SeriesPoint3D[] points, bool closeLine)
{
PointLineSeries3D pls3d = new PointLineSeries3D();
pls3d.Tag = tag;
pls3d.Title.Text = title;
pls3d.MultiColorLine = true;
pls3d.AllowUserInteraction = allowUser;
pls3d.PointsVisible = false;
pls3d.LineStyle.LineOptimization = (LineOptimization)lineStyle;
pls3d.LineStyle.Width = lineWidth;
pls3d.Points = points;
pls3d.ClosedLine = closeLine;
return pls3d;
}
public PointLineSeries3D EventModel2Pls3d(MmEvent mm)
{
PointLineSeries3D pls3d = new PointLineSeries3D();
pls3d.Title.Text = mm.EventTimeStr;
pls3d.Tag = "mm-event";
pls3d.IndividualPointColors = true;
pls3d.IndividualPointSizes = true;
pls3d.LineVisible = false;
pls3d.AllowUserInteraction = true;
pls3d.PointsVisible = true;
pls3d.PointStyle.Shape3D = PointShape3D.Sphere;
pls3d.PointStyle.Size3D = EventSize;
return pls3d;
}
}
}