using Arction.Wpf.ChartingMVVM; using Arction.Wpf.ChartingMVVM.Axes; using Arction.Wpf.ChartingMVVM.Series3D; using Arction.Wpf.ChartingMVVM.Views.View3D; using Prism.Mvvm; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Media; using Txgy.EWS.Client.Common; using Txgy.EWS.Client.PageModule.Models; using WW.Cad.Model.Entities; using WW.Cad.Model; using Color = System.Windows.Media.Color; using Colors = System.Windows.Media.Colors; using WW.Cad.IO; using Arction.Wpf.ChartingMVVM.Annotations; using Txgy.Microseismic.BaseLib.Models; using ACadSharp.Entities; using Txgy.EWS.Client.Common.MessageEvents; using Prism.Events; using System.Threading; using Arction.Wpf.ChartingMVVM.Titles; using Newtonsoft.Json.Linq; using System.Windows; using Action = System.Action; using SciColorMaps.Portable; using Txgy.EWS.Client.Models; namespace Txgy.EWS.Client.PageModule.ViewModels { public class PlanViewModel : BindableBase { public string eventLayerName = "地震事件"; public Color eventLayerColor = Colors.Red; public Color eventColor = Colors.Red; public Color eventTextColor = Colors.Blue; public double eventLayerLineWeight = 1; public double eventTextSize = 12; public string cnstLTypeName = "地震事件2"; public string CadFilePath { get; set; } public SizeDoubleXYZ EventSize; //LCPlanModel _lcModel; //public CadLineList cadLineList; public List ShowEvents; public List eventList; 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属性 private int _widthRS = 2000; public int WidthRS { get { return _widthRS; } set { SetProperty(ref _widthRS, value); } } private int _heightRS = 700; public int HeightRS { get { return _heightRS; } set { SetProperty(ref _heightRS, value); } } private int _depthRS = 2000; 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 = 0; public double HorizontalRotationRS { get { return _horizontalRotationRS; } set { SetProperty(ref _horizontalRotationRS, value); } } private double _verticalRotationRS = 90; public double VerticalRotationRS { get { return _verticalRotationRS; } set { //Console.WriteLine(value.ToString()); SetProperty(ref _verticalRotationRS, value); } } private double _distanceRS = 1300; public double DistanceRS { get { return _distanceRS; } set { //Console.WriteLine(value.ToString()); SetProperty(ref _distanceRS, value); } } private bool _clipDispaly = true; 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 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.Orthographic; public ProjectionType ProjectionTypeRS { get { return _projectionTypeRS; } set { SetProperty(ref _projectionTypeRS, value); } } private Fill _chartBackGround = new Fill(); private IEventAggregator _ea; public Fill ChartBackGround { get { return _chartBackGround; } set { SetProperty(ref _chartBackGround, value); } } public Light3DCollection Lights { get; set; } public Polygon3DCollection Polygons { get; set; } public PointLineSeries3DCollection ChartPointLineCollection { get; set; } public Annotation3DCollection ChartAnnotationCollection { get; set; } public List cadImage3DList { get; set; } #endregion public PlanViewModel(IEventAggregator ea) { //Color _color = Color.FromName(_colorName); CadFilePath = GlobalConfig.ProjectConfig.CadFileName; //_lcModel = new LCPlanModel(); _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)); Lights = View3D.CreateDefaultLights(); Lights[1].Location.SetValues((GlobalConfig.ProjectConfig.WorkArea.EMax - GlobalConfig.ProjectConfig.WorkArea.EMin) / 2f, 100, (GlobalConfig.ProjectConfig.WorkArea.NMax - GlobalConfig.ProjectConfig.WorkArea.NMin) / 2f); 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 = 0; //AxisXPri3D.Maximum = (GlobalConfig.ProjectConfig.WorkArea.EMax - GlobalConfig.ProjectConfig.WorkArea.EMin) / Scale; ////AxisXPri3D.MajorDiv = 0.5; //AxisXPri3D.Title.Text = "横轴"; //AxisXPri3D.LabelsVisible = true; //AxisXPri3D.LabelsColor = Colors.Black; //AxisXPri3D.Orientation = PlaneXAxis3D.XZ; //AxisXPri3D.Location = AxisXLocation3D.BottomFront; //AxisXPri3D.LabelsNumberFormat = "00000000"; //AxisYPri3D = new AxisY3D(); //AxisYPri3D.Minimum = (GlobalConfig.ProjectConfig.WorkArea.ZMin / Scale); //AxisYPri3D.Maximum = (GlobalConfig.ProjectConfig.WorkArea.ZMax / Scale); //AxisYPri3D.Reversed = true; //AxisYPri3D.LabelsColor = Colors.Black; ////AxisYPri3D.Visible = false; //AxisZPri3D = new AxisZ3D(); //AxisZPri3D.Minimum = 0; //AxisZPri3D.Maximum = (GlobalConfig.ProjectConfig.WorkArea.NMax - GlobalConfig.ProjectConfig.WorkArea.NMin) / Scale; ////AxisZPri3D.MajorDiv = 0.5; //AxisZPri3D.Title.Text = "纵轴"; //AxisZPri3D.Orientation = PlaneZAxis3D.XZ; //AxisZPri3D.Location = AxisZLocation3D.BottomRight; //AxisZPri3D.LabelsColor = Colors.Black; //AxisZPri3D.LabelsNumberFormat = "0000000"; AxisXPri3D = new AxisX3D(); AxisXPri3D.Maximum = GlobalConfig.ProjectConfig.WorkArea.EMax / Scale; AxisXPri3D.Minimum = GlobalConfig.ProjectConfig.WorkArea.EMin / Scale; //AxisXPri3D.Maximum = (GlobalConfig.ProjectConfig.WorkArea.EMax - GlobalConfig.ProjectConfig.WorkArea.EMin) / Scale; //AxisXPri3D.MajorDiv = 500; //AxisXPri3D.MajorDivCount = 1; AxisXPri3D.Title.Text = "横轴"; AxisXPri3D.Title.Visible = false; AxisXPri3D.LabelsColor = Colors.Black; AxisXPri3D.LabelsNumberFormat = "00000000"; AxisXPri3D.AutoFormatLabels = false; AxisXPri3D.Orientation = PlaneXAxis3D.XZ; AxisXPri3D.Location = AxisXLocation3D.TopFront; AxisYPri3D = new AxisY3D(); AxisYPri3D.Maximum = 30; AxisYPri3D.Minimum = 0; AxisYPri3D.Visible = false; AxisZPri3D = new AxisZ3D(); AxisZPri3D.Maximum = GlobalConfig.ProjectConfig.WorkArea.NMax / Scale; AxisZPri3D.Minimum = GlobalConfig.ProjectConfig.WorkArea.NMin / Scale; //AxisZPri3D.Maximum = (GlobalConfig.ProjectConfig.WorkArea.NMax - GlobalConfig.ProjectConfig.WorkArea.NMin) / Scale; //AxisZPri3D.MajorDiv = 500; //AxisZPri3D.MajorDivCount = 1; AxisZPri3D.Title.Text = "纵轴"; AxisZPri3D.Title.Visible = false; AxisZPri3D.LabelsColor = Colors.Black; AxisZPri3D.LabelsNumberFormat = "0000000"; AxisZPri3D.AutoFormatLabels = false; AxisZPri3D.Orientation = PlaneZAxis3D.XZ; AxisZPri3D.Location = AxisZLocation3D.TopRight; //Polygons = _lcModel.CreatePolygons(); ChartPointLineCollection = new PointLineSeries3DCollection(); ChartAnnotationCollection = new Annotation3DCollection(); CreateBackgroudByDwg(); EventSize = new SizeDoubleXYZ(GlobalConfig.eventDSize*20, GlobalConfig.eventDSize*20, GlobalConfig.eventDSize * 20); ShowEvents = new List(); _ea = ea; //this._ea.GetEvent().Subscribe(u => //{ // CreateEventList(); //}); //CreateEventList(); } public void CreateBackgroudByDwg() { cadImage3DList = new List(); DxfModel model = DwgReader.Read(CadFilePath); //try { Color color = Colors.Black; double lineWidth = 0.05; int lineStyle = 1; bool closeLine = true; foreach (var item in model.Layers) { if (item.Enabled) { //CadLinePropertyModel clpm = CadLineList.LineProperties.Find(lp => lp.Name == item.Name); CadLinePropertyModel clpm = null; if (clpm != null) { color = clpm.LineColor; lineWidth = clpm.LineWidth; closeLine = clpm.CloseLine; //Console.WriteLine($"名称:{item.Name}\t开关:{item.Enabled.ToString()}\t线宽:{item.LineWeight}\t线型:{item.LineType.Name}"); var entitys = model.Entities.Where(et => et.Layer.Name == item.Name); if (entitys != null) { foreach (var entity in entitys) { //if (entity.Layer.Name == "埋深线") //{ // Console.WriteLine("埋深线:"+entity.EntityType); //} //if (entity.Layer.Name=="巷道集合") //{ // Console.WriteLine(entity.EntityType); //} if (entity.EntityType == "POLYLINE") { List points = new List(); foreach (var point in ((DxfPolyline3D)entity).Vertices) { //double x = (point.X - GlobalConfig.BaseX) / Scale; //double y = (point.Y - GlobalConfig.BaseY) / Scale; double x = (point.X) / Scale; double y = (point.Y) / Scale; points.Add(new SeriesPoint3D(x, clpm.LayerHeight, y, color)); } cadImage3DList.Add(CreateDxfLwPolyline("cad-" + item.Name, entity.ToString() , false, lineStyle, lineWidth, points.ToArray(), closeLine)); } if (entity.EntityType == "LWPOLYLINE") { List points = new List(); foreach (var point in ((DxfLwPolyline)entity).Vertices) { //double x = (point.X - GlobalConfig.BaseX) / Scale; //double y = (point.Y - GlobalConfig.BaseY) / Scale; double x = (point.X) / Scale; double y = (point.Y) / Scale; points.Add(new SeriesPoint3D(x, clpm.LayerHeight, y, color)); } cadImage3DList.Add(CreateDxfLwPolyline("cad-" + item.Name, entity.ToString() , false, lineStyle, lineWidth, points.ToArray(), closeLine)); } if (entity.EntityType == "TEXT") { DxfText et = (DxfText)entity; //if (item.Name.Contains("台站")) //{ // ChartAnnotationCollection.Add(CreateDxfText(((DxfText)entity), "cad-text", 12, clpm.LayerHeight)); //} if (et.AlignmentPoint1.X >= GlobalConfig.ProjectConfig.WorkArea.EMin && et.AlignmentPoint1.X <= GlobalConfig.ProjectConfig.WorkArea.EMax && et.AlignmentPoint1.Y >= GlobalConfig.ProjectConfig.WorkArea.NMin && et.AlignmentPoint1.Y <= GlobalConfig.ProjectConfig.WorkArea.EMax) { //Console.WriteLine($"R:{((DxfText)entity).Color.R}\tG:{((DxfText)entity).Color.G}\tB:{((DxfText)entity).Color.B}"); ChartAnnotationCollection.Add(CreateDxfText(((DxfText)entity), "cad-text", 12, clpm.LayerHeight)); } } if (entity.EntityType== "MTEXT") { DxfMText et = (DxfMText)entity; //if (et.AlignmentPoint1.X >= GlobalConfig.ProjectConfig.WorkArea.EMin && // et.AlignmentPoint1.X <= GlobalConfig.ProjectConfig.WorkArea.EMax && // et.AlignmentPoint1.Y >= GlobalConfig.ProjectConfig.WorkArea.NMin && // et.AlignmentPoint1.Y <= GlobalConfig.ProjectConfig.WorkArea.EMax) { ChartAnnotationCollection.Add(CreateDxfMText(et, "cad-text", 12, clpm.LayerHeight)); } } } } //if (entitys != null) //{ // foreach (var entity in entitys) // { // if (entity.EntityType == "LWPOLYLINE" || (item.Name == "埋深線" && (entity.EntityType == "POLYLINE" || entity.EntityType == "HATCH"))) // { // List points = new List(); // //Console.WriteLine($"线宽:{item.LineWeight}\t颜色:{entity.Color.ToString()}"); // //if (item.Name == "埋深線") // //{ // // Console.WriteLine(entity.EntityType); // // if (entity.EntityType== "HATCH") // // { // // DxfHatch dh=(DxfHatch)entity; // // DxfText dt = new DxfText(); // // dt.Text=dh.Name; // // dt.AlignmentPoint1 = new WW.Math.Point3D(dh.ElevationPoint.X, dh.ElevationPoint.Y, 0); // // Console.WriteLine($"name:{dh.Name}\t{dh.ElevationPoint.X}\t{dh.ElevationPoint.Y}"); // // if (dt.AlignmentPoint1.X >= GlobalConfig.ProjectConfig.WorkArea.EMin && // // dt.AlignmentPoint1.X <= GlobalConfig.ProjectConfig.WorkArea.EMax && // // dt.AlignmentPoint1.Y >= GlobalConfig.ProjectConfig.WorkArea.NMin && // // dt.AlignmentPoint1.Y <= GlobalConfig.ProjectConfig.WorkArea.EMax) // // { // // ChartAnnotationCollection.Add(CreateDxfText(dt, "cad-text", 12, clpm.LayerHeight)); // // } // // } // // else // if (entity.EntityType == "POLYLINE") // { // foreach (var point in ((DxfPolyline3D)entity).Vertices) // { // //double x = (point.X - GlobalConfig.BaseX) / Scale; // //double y = (point.Y - GlobalConfig.BaseY) / Scale; // double x = (point.X) / Scale; // double y = (point.Y) / Scale; // points.Add(new SeriesPoint3D(x, clpm.LayerHeight, y, color)); // } // } // //} // else // { // foreach (var point in ((DxfLwPolyline)entity).Vertices) // { // //double x = (point.X - GlobalConfig.BaseX) / Scale; // //double y = (point.Y - GlobalConfig.BaseY) / Scale; // double x = (point.X) / Scale; // double y = (point.Y) / Scale; // points.Add(new SeriesPoint3D(x, clpm.LayerHeight, y, color)); // } // } // cadImage3DList.Add(CreateDxfLwPolyline("cad-" + item.Name, entity.ToString() // , false, lineStyle, lineWidth, points.ToArray(), closeLine)); // } // //if (entity.EntityType == "TEXT" && (item.Name == "等高线-20" // // || item.Name == "目标监测区" // // || item.Name == "N1100台站位置(设计位置)")) // //if (entity.EntityType == "TEXT" && GlobalConfig.DwgLayersDisplay.Contains(item.Name)) // if (entity.EntityType == "TEXT") // { // DxfText et = (DxfText)entity; // if (et.AlignmentPoint1.X >= GlobalConfig.ProjectConfig.WorkArea.EMin && // et.AlignmentPoint1.X <= GlobalConfig.ProjectConfig.WorkArea.EMax && // et.AlignmentPoint1.Y >= GlobalConfig.ProjectConfig.WorkArea.NMin && // et.AlignmentPoint1.Y <= GlobalConfig.ProjectConfig.WorkArea.EMax) // { // //Console.WriteLine($"R:{((DxfText)entity).Color.R}\tG:{((DxfText)entity).Color.G}\tB:{((DxfText)entity).Color.B}"); // ChartAnnotationCollection.Add(CreateDxfText(((DxfText)entity), "cad-text", 12, clpm.LayerHeight)); // } // } // } // //Console.WriteLine(entitys.Count()); //} //Console.WriteLine(item.Model.Entities.Count); } } } ChartPointLineCollection.AddRange(cadImage3DList); } //catch (Exception ex) //{ // Console.WriteLine(ex.Message); //} } 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.DisplayEvents.Count > 0) 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) { //if (item.Y>38397500 && item.Y<38398200) { //float sizeFactor = (float)(((4f + item.ML) / (4f)) * 0.6f) + 0.4f; float sizeFactor = (float)(((4f + item.ML) / (4f)) * 2f) + 0.1f; 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) / Scale, 20, (item.X) / Scale, ec, sizeFactor)); } } pls3d.AddPoints(sp3List.ToArray(), true); ChartPointLineCollection.Add(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; } 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 Annotation3D CreateDxfText(DxfText dxfText, string tag, double fontSize, double layerHeight) { Annotation3D at3d = new Annotation3D(); at3d.Tag = tag; at3d.Style = AnnotationStyle.Rectangle; at3d.AllowUserInteraction = false; at3d.BorderVisible = false; at3d.Shadow.Visible = false; at3d.Visible = true; at3d.Fill.Style = RectFillStyle.None; at3d.TextStyle.Color = Dc2Mc(dxfText.Color); at3d.TextStyle.Font = new WpfFont("微软雅黑", fontSize); at3d.Text = dxfText.Text; //at3d.TargetAxisValues = new PointDoubleXYZ((dxfText.AlignmentPoint1.X- GlobalConfig.BaseX)/Scale, 40, // (dxfText.AlignmentPoint1.Y- GlobalConfig.BaseY)/Scale); at3d.LocationCoordinateSystem = CoordinateSystem.AxisValues; at3d.LocationAxisValues.SetValues((dxfText.AlignmentPoint1.X) / Scale, layerHeight, (dxfText.AlignmentPoint1.Y) / Scale); //at3d.LocationAxisValues.SetValues((dxfText.AlignmentPoint1.X - GlobalConfig.BaseX) / Scale, layerHeight, // (dxfText.AlignmentPoint1.Y - GlobalConfig.BaseY) / Scale); at3d.Anchor.SetValues(0.5, 0.5); return at3d; } public Annotation3D CreateDxfMText(DxfMText dxfText, string tag, double fontSize, double layerHeight) { Annotation3D at3d = new Annotation3D(); at3d.Tag = tag; at3d.Style = AnnotationStyle.Rectangle; at3d.AllowUserInteraction = false; at3d.BorderVisible = false; at3d.Shadow.Visible = false; at3d.Visible = true; at3d.Fill.Style = RectFillStyle.None; at3d.TextStyle.Color = Colors.Blue; //at3d.TextStyle.Color = Dc2Mc(dxfText.Color); at3d.TextStyle.Font = new WpfFont("微软雅黑", fontSize); at3d.Text = dxfText.Text; at3d.LocationCoordinateSystem = CoordinateSystem.AxisValues; at3d.LocationAxisValues.SetValues((dxfText.InsertionPoint.X) / Scale, layerHeight, (dxfText.InsertionPoint.Y) / Scale); //at3d.LocationAxisValues.SetValues((dxfText.InsertionPoint.X - GlobalConfig.BaseX) / Scale, layerHeight, // (dxfText.InsertionPoint.Y - GlobalConfig.BaseY) / Scale); at3d.Anchor.SetValues(0.5, 0.5); return at3d; } /// /// dxfColor2MediaColor /// /// /// public static Color Dc2Mc(EntityColor en) { return Color.FromRgb(en.R, en.G, en.B); } } }