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 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().Subscribe(u => //{ // CreateEventList(); //}); //CreateEventList(); //ChartDepthLayerCollection = new Rectangle3DCollection(); //ChartDepthLayerCollection.Add(GetRectangle(-300/Scale)); } public void CreateEventList() { if (!GlobalData.AppendEvent) { List 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 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 sp3List = new List(); //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; } } }