using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Media; using System.Windows; using Txgy.EWS.Client.Models; using System.Windows.Controls; using WW.Cad.Model.Entities; using static WW.Cad.Model.Entities.DxfHatch.BoundaryPath; using WW.Cad.Model; using WW.Cad.IO; using System.Windows.Media.Imaging; using System.IO; using Prism.Mvvm; using static System.Net.Mime.MediaTypeNames; using Txgy.EWS.Client.Entity; using System.Diagnostics; namespace Txgy.EWS.Client.Common.Helpers { public class ReportPlanImage : BindableBase { public VisualHost host; string planImagePath; double width = 700; double height = 700; double canvasLeft = 60; double canvasTop = 50; double canvasRight = 50; double canvasBottom = 50; double canvasWidthRange = 2000; double canvasHeightRange = 2000; double gridTextSpacing = 500; public double unit = 100; public double fontSize = 12; public double stationSize = 20; public double stationFontSize = 10; double baseX = 39701000; double baseY = 4352000; double xDrawUnit = 1; double yDrawUnit = 1; double drawUnit = 1; Point _downPoint = new Point(0, 0); bool _isMoving = false; double left = 0, top = 0; public bool IsShowGridText = true; public bool IsShowGrid = true; public System.Windows.Media.Color BackGroundColor = System.Windows.Media.Colors.White; public Brush GridLineBrush = Brushes.Gray; public double GridLineWidth = 0.2; public Brush BrushStrikeSlip = Brushes.Black; public Brush BrushDipSlip = Brushes.Blue; public Brush BrushTensile = Brushes.Red; public Brush BrushEvent = Brushes.Green; public double EventSize = 5; public bool IsShowEvent = true; private string dwgFile; public string DwgFile { get { return dwgFile; } set { SetProperty(ref dwgFile, value); CreateCadLayersByDwg(); } } public List CadLayers { get; set; } public ReportPlanImage() { planImagePath = AppDomain.CurrentDomain.BaseDirectory + "\\resources\\planImageTemp.png"; host = new VisualHost(); baseX = GlobalConfig.ProjectConfig.WorkArea.EMin; baseY = GlobalConfig.ProjectConfig.WorkArea.NMin; canvasWidthRange = Math.Ceiling((GlobalConfig.ProjectConfig.WorkArea.EMax - GlobalConfig.ProjectConfig.WorkArea.EMin) / 100) * 100; canvasHeightRange = Math.Ceiling((GlobalConfig.ProjectConfig.WorkArea.NMax - GlobalConfig.ProjectConfig.WorkArea.NMin) / 100) * 100; gridTextSpacing = 500; width = 1600; height = 2000; xDrawUnit = (width - canvasLeft - canvasRight) / (double)canvasWidthRange; yDrawUnit = (height - canvasTop - canvasBottom) / (double)canvasHeightRange; drawUnit = xDrawUnit < yDrawUnit ? xDrawUnit : yDrawUnit; CadLayers = new List(); DwgFile = GlobalConfig.ProjectConfig.CadFileName; CreateCadLayersByDwg(); } public VisualHost DrawPlanClipToDrawVisual(List events, int w, int h) { double dpi = 96d; Draw(events); RenderTargetBitmap rtb = new RenderTargetBitmap(w, h, dpi, dpi, PixelFormats.Pbgra32); rtb.Render(host); BitmapEncoder encoder = new PngBitmapEncoder(); encoder.Frames.Add(BitmapFrame.Create(rtb)); using (Stream stm = File.Create(planImagePath)) { encoder.Save(stm); } ////当前为固定尺寸,待修改为动态尺寸 //int top = 0; //int left = 0; //int clipWidth = 0; //int clipHeight = 0; //if (w > h) //{ // left = (w - h) / 2; // clipWidth = h; // clipHeight = h; //} //else //{ // top = (h - w) / 2; // clipWidth = w; // clipHeight = w; //} ////int maxLen = w > h ? w : h; ////int minLen = w < h ? w : h; ////int clipWidth = w > h ? h : w; ////int clipHeight = w > h ? h : w; ////int top = (maxLen - minLen) / 2; //int clipWidth = w; //int clipHeight = h; //var bitmapImage = new BitmapImage(new Uri(planImagePath)); //var drawingVisual = new DrawingVisual(); //using (DrawingContext dc = drawingVisual.RenderOpen()) //{ // //dc.PushClip(new EllipseGeometry(new Point(30, 30), 20, 20)); // // 裁剪图片的 50x50 部分 // var croppedBitmap = new CroppedBitmap(bitmapImage, new Int32Rect(left, top, clipWidth, clipHeight)); // dc.DrawImage(croppedBitmap, new Rect(0, 0, clipWidth, clipHeight)); // //dc.Pop(); // //dc.DrawImage(bitmapImage, new Rect(100, 100, 500, 500)); //} //VisualHost vh = new VisualHost(); //vh.AddVisual(drawingVisual); return null; } public byte[] DrawPlanClipToBytes(List events) { double dpi = 96d; Draw(events); RenderTargetBitmap rtb = new RenderTargetBitmap((int)width, (int)height, dpi, dpi, PixelFormats.Pbgra32); rtb.Render(host); BitmapEncoder encoder = new PngBitmapEncoder(); encoder.Frames.Add(BitmapFrame.Create(rtb)); using (Stream stm = File.Create(planImagePath)) { encoder.Save(stm); } //当前为固定尺寸,待修改为动态尺寸 int clipWidth = 1496; int clipHeight = 1192; var bitmapImage = new BitmapImage(new Uri(planImagePath)); var drawingVisual = new DrawingVisual(); using (DrawingContext dc = drawingVisual.RenderOpen()) { //dc.PushClip(new EllipseGeometry(new Point(30, 30), 20, 20)); // 裁剪图片的 50x50 部分 var croppedBitmap = new CroppedBitmap(bitmapImage, new Int32Rect(57, 250, clipWidth, clipHeight)); dc.DrawImage(croppedBitmap, new Rect(0, 0, clipWidth, clipHeight)); //dc.Pop(); //dc.DrawImage(bitmapImage, new Rect(100, 100, 500, 500)); } //VisualHost vh = new VisualHost(); //vh.AddVisual(drawingVisual); RenderTargetBitmap bitmap = new RenderTargetBitmap(clipWidth, clipHeight, 96d, 96d, PixelFormats.Pbgra32); bitmap.Render(drawingVisual); ////保存图片 //BitmapEncoder encoder2 = new PngBitmapEncoder(); //encoder2.Frames.Add(BitmapFrame.Create(bitmap)); //using (Stream stm = File.Create("e:\\3.png")) //{ // encoder2.Save(stm); //} var bb = BitmapHelper.ConvertToBytes(bitmap); return bb; //动态尺寸 //double minX = events.Min(es => es.X); //double maxX = events.Max(es => es.X); //double minY = events.Min(es => es.Y); //double maxY = events.Max(es => es.Y); //if ((maxY - minY) > (maxX - minX)) //{ //} //else //{ //} //double heightCenter = (maxY - minY) / 2.0 + minY; //double drawTop = GlobalConfig.ProjectConfig.WorkArea.NMax - (heightCenter + 500); } public byte[] DrawPlanToBytes(List events) { TransformGroup transformGroup = new TransformGroup(); transformGroup.Children.Add(new ScaleTransform(2, 2)); transformGroup.Children.Add(new TranslateTransform(0, -150)); host.RenderTransform = transformGroup; Draw(events); RenderTargetBitmap bitmap = new RenderTargetBitmap((int)width, (int)height, 96d, 96d, PixelFormats.Pbgra32); bitmap.Render(host); //bitmap.d var bb = BitmapHelper.ConvertToBytes(bitmap); return bb; } public void Draw(List events) { if (host.visuals.Count > 0) { host.RemoveVisual(host.visuals[0]); } DrawingVisual visual = new DrawingVisual(); //if (events!=null) //{ // if (events.Count>0) // { // double minX= events.Min(es => es.X) - 100; // double maxX= events.Max(es => es.X) + 100; // double minY= events.Min(es => es.Y) - 100; // double maxY = events.Max(es => es.Y) + 100; // baseX = minX; // baseY = minY; // canvasWidthRange = Math.Ceiling((maxX - minX) / 100) * 100; // canvasHeightRange = Math.Ceiling((maxY - minY) / 100) * 100; // gridTextSpacing = 500; // xDrawUnit = (width - canvasLeft - canvasRight) / (double)canvasWidthRange; // yDrawUnit = (height - canvasTop - canvasBottom) / (double)canvasHeightRange; // drawUnit = xDrawUnit < yDrawUnit ? xDrawUnit : yDrawUnit; // } //} using (DrawingContext dc = visual.RenderOpen()) { //绘制背景色 Pen pen = new Pen(Brushes.White, 0); pen.Freeze(); dc.DrawRectangle(new SolidColorBrush(BackGroundColor), pen, new Rect(0, 0, width, height)); int xAxisCount = (int)Math.Ceiling(canvasHeightRange / unit); int yAxisCount = (int)Math.Ceiling(canvasWidthRange / unit); DrawGrid(dc, xAxisCount, yAxisCount, unit); DrawDwg(dc); if (IsShowEvent) { if (events != null) { if (events.Count > 0) { foreach (var item in events) { 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); System.Windows.Media.Color ec = GlobalConfig.eventDepthColor[colorIndex]; BrushEvent = new SolidColorBrush(ec); Pen eventPen = new Pen(BrushEvent, 0); eventPen.Freeze(); dc.DrawEllipse(BrushEvent, eventPen, new Point(canvasLeft + (item.X - baseX) * drawUnit, canvasTop + (canvasHeightRange - (item.Y - baseY)) * drawUnit), EventSize * sizeFactor, EventSize * sizeFactor); } } } } } host.AddVisual(visual); } public void DrawGierInTime(List events, double dw, double dh, int EventShowTotalSeconds, DateTime inTime) { width = dw; height = dh; xDrawUnit = (width - canvasLeft - canvasRight) / (double)canvasWidthRange; yDrawUnit = (height - canvasTop - canvasBottom) / (double)canvasHeightRange; drawUnit = xDrawUnit < yDrawUnit ? xDrawUnit : yDrawUnit; if (host.visuals.Count > 0) { while (host.visuals.Count > 0) { host.RemoveVisual(host.visuals[0]); } } //Debug.WriteLine("host cnt:" + host.visuals.Count); DrawingVisual visualbc = new DrawingVisual(); using (DrawingContext dc = visualbc.RenderOpen()) { int xAxisCount = (int)Math.Ceiling(canvasHeightRange / unit); int yAxisCount = (int)Math.Ceiling(canvasWidthRange / unit); DrawGrid(dc, xAxisCount, yAxisCount, unit); DrawDwg(dc); } host.AddVisual(visualbc); if (IsShowEvent) { if (events != null) { foreach (GridItemEventResult item in events) { TaggedVisual visualE = new TaggedVisual(); using (DrawingContext dc = visualE.RenderOpen()) { float sizeFactor = (float)(((4f + item.ML) / (10f)) * 10f) + 0.1f; //float sizeFactor = GlobalData.ReportEventLevelList.Where(rel => rel.lowerbound <= item.ML && rel.upperbound > item.ML).First().level; int colorIndex = (int)(((item.Z - GlobalConfig.ProjectConfig.WorkArea.ZMin) / Math.Abs(GlobalConfig.ProjectConfig.WorkArea.ZMax - GlobalConfig.ProjectConfig.WorkArea.ZMin)) * GlobalConfig.ColorCountDefault); System.Windows.Media.Color ec = GlobalConfig.eventDepthColor[colorIndex]; BrushEvent = new SolidColorBrush(ec); Pen eventPen = new Pen(BrushEvent, 0); eventPen.Freeze(); double px = item.X - baseX; double py = item.Y - baseY; double dx = canvasLeft + (item.X - baseX) * drawUnit; double dy = canvasTop + (canvasHeightRange - (item.Y - baseY)) * drawUnit; double dsize = EventSize * drawUnit * sizeFactor; //Debug.WriteLine($"--------px:{px}\tpy:{py}\tdx:{dx}\tdy:{dy}\tsize:{dsize}--------"); dc.DrawEllipse(BrushEvent, eventPen,new Point(dx, dy),dsize, dsize); } TaggedVisual.SetTag(visualE, item); host.AddVisual(visualE); } } } } //public void DrawGierInTime(List events, double dw, double dh, int EventShowTotalSeconds, DateTime inTime) //{ // width = dw; // height = dh; // xDrawUnit = (width - canvasLeft - canvasRight) / (double)canvasWidthRange; // yDrawUnit = (height - canvasTop - canvasBottom) / (double)canvasHeightRange; // drawUnit = xDrawUnit < yDrawUnit ? xDrawUnit : yDrawUnit; // //CadLayers = new List(); // //CreateCadLayersByDwg(); // if (host.visuals.Count > 0) // { // host.RemoveVisual(host.visuals[0]); // } // DrawingVisual visual = new DrawingVisual(); // using (DrawingContext dc = visual.RenderOpen()) // { // //绘制背景色 // Pen pen = new Pen(Brushes.White, 0); // pen.Freeze(); // dc.DrawRectangle(new SolidColorBrush(BackGroundColor), pen, // new Rect(0, 0, width, height)); // int xAxisCount = (int)Math.Ceiling(canvasHeightRange / unit); // int yAxisCount = (int)Math.Ceiling(canvasWidthRange / unit); // DrawGrid(dc, xAxisCount, yAxisCount, unit); // DrawDwg(dc); // if (IsShowEvent) // { // if (events != null) // { // if (events.Count > 0) // { // foreach (var item in events) // { // if ((DateTime.Parse(item.EventTime) - inTime).TotalSeconds < EventShowTotalSeconds) // { // float sizeFactor = (float)(((4f + item.ML) / (10f)) * 10f) + 0.1f; // //float sizeFactor = GlobalData.ReportEventLevelList.Where(rel => rel.lowerbound <= item.ML && rel.upperbound > item.ML).First().level; // int colorIndex = (int)(((item.Z - GlobalConfig.ProjectConfig.WorkArea.ZMin) // / Math.Abs(GlobalConfig.ProjectConfig.WorkArea.ZMax - GlobalConfig.ProjectConfig.WorkArea.ZMin)) // * GlobalConfig.ColorCountDefault); // System.Windows.Media.Color ec = GlobalConfig.eventDepthColor[colorIndex]; // BrushEvent = new SolidColorBrush(ec); // Pen eventPen = new Pen(BrushEvent, 0); // eventPen.Freeze(); // dc.DrawEllipse(BrushEvent, eventPen, // new Point(canvasLeft + (item.X - baseX) * drawUnit, canvasTop + (canvasHeightRange - (item.Y - baseY)) * drawUnit), // EventSize * drawUnit * sizeFactor, EventSize * drawUnit * sizeFactor); // } // } // } // } // } // } // host.AddVisual(visual); //} public void DrawGier(List events, double dw, double dh) { width = dw; height = dh; xDrawUnit = (width - canvasLeft - canvasRight) / (double)canvasWidthRange; yDrawUnit = (height - canvasTop - canvasBottom) / (double)canvasHeightRange; drawUnit = xDrawUnit < yDrawUnit ? xDrawUnit : yDrawUnit; if (host.visuals.Count > 0) { while (host.visuals.Count > 0) { host.RemoveVisual(host.visuals[0]); } } DrawingVisual visualbc = new DrawingVisual(); using (DrawingContext dc = visualbc.RenderOpen()) { int xAxisCount = (int)Math.Ceiling(canvasHeightRange / unit); int yAxisCount = (int)Math.Ceiling(canvasWidthRange / unit); DrawGrid(dc, xAxisCount, yAxisCount, unit); DrawDwg(dc); } host.AddVisual(visualbc); if (IsShowEvent) { if (events != null) { foreach (GridItemEventResult item in events) { TaggedVisual visualE = new TaggedVisual(); using (DrawingContext dc = visualE.RenderOpen()) { float sizeFactor = (float)(((4f + item.ML) / (10f)) * 10f) + 0.1f; //float sizeFactor = GlobalData.ReportEventLevelList.Where(rel => rel.lowerbound <= item.ML && rel.upperbound > item.ML).First().level; int colorIndex = (int)(((item.Z - GlobalConfig.ProjectConfig.WorkArea.ZMin) / Math.Abs(GlobalConfig.ProjectConfig.WorkArea.ZMax - GlobalConfig.ProjectConfig.WorkArea.ZMin)) * GlobalConfig.ColorCountDefault); System.Windows.Media.Color ec = GlobalConfig.eventDepthColor[colorIndex]; BrushEvent = new SolidColorBrush(ec); Pen eventPen = new Pen(BrushEvent, 0); eventPen.Freeze(); double px = item.X - baseX; double py = item.Y - baseY; double dx = canvasLeft + (item.X - baseX) * drawUnit; double dy = canvasTop + (canvasHeightRange - (item.Y - baseY)) * drawUnit; double dsize = EventSize * drawUnit * sizeFactor; //Debug.WriteLine($"--------px:{px}\tpy:{py}\tdx:{dx}\tdy:{dy}\tsize:{dsize}--------"); dc.DrawEllipse(BrushEvent, eventPen, new Point(dx, dy), dsize, dsize); } TaggedVisual.SetTag(visualE, item); host.AddVisual(visualE); } } } } public EventAinimationItem ConvertGierToEai(GridItemEventResult gier) { EventAinimationItem eai = new EventAinimationItem(); float sizeFactor = (float)(((4f + gier.ML) / (10f)) * 10f) + 0.1f; eai.Width = EventSize * drawUnit * sizeFactor; eai.Height = EventSize * drawUnit * sizeFactor; eai.OffsetX = canvasLeft + (gier.X - baseX) * drawUnit; eai.OffsetY = canvasTop + (canvasHeightRange - (gier.Y - baseY)) * drawUnit; int colorIndex = (int)(((gier.Z - GlobalConfig.ProjectConfig.WorkArea.ZMin) / Math.Abs(GlobalConfig.ProjectConfig.WorkArea.ZMax - GlobalConfig.ProjectConfig.WorkArea.ZMin)) * GlobalConfig.ColorCountDefault); System.Windows.Media.Color ec = GlobalConfig.eventDepthColor[colorIndex]; eai.Fill = new SolidColorBrush(ec); return eai; } public void DrawRRREInTime(List events, double dw, double dh, int EventShowTotalSeconds, DateTime inTime) { width = dw; height = dh; xDrawUnit = (width - canvasLeft - canvasRight) / (double)canvasWidthRange; yDrawUnit = (height - canvasTop - canvasBottom) / (double)canvasHeightRange; drawUnit = xDrawUnit < yDrawUnit ? xDrawUnit : yDrawUnit; //CadLayers = new List(); //CreateCadLayersByDwg(); if (host.visuals.Count > 0) { host.RemoveVisual(host.visuals[0]); } DrawingVisual visual = new DrawingVisual(); using (DrawingContext dc = visual.RenderOpen()) { //绘制背景色 Pen pen = new Pen(Brushes.White, 0); pen.Freeze(); dc.DrawRectangle(new SolidColorBrush(BackGroundColor), pen, new Rect(0, 0, width, height)); int xAxisCount = (int)Math.Ceiling(canvasHeightRange / unit); int yAxisCount = (int)Math.Ceiling(canvasWidthRange / unit); DrawGrid(dc, xAxisCount, yAxisCount, unit); DrawDwg(dc); if (IsShowEvent) { if (events != null) { if (events.Count > 0) { foreach (var item in events) { if ((DateTime.Parse(item.EventTime) - inTime).TotalSeconds < EventShowTotalSeconds) { float sizeFactor = (float)(((4f + item.ML) / (10f)) * 10f) + 0.1f; //float sizeFactor = GlobalData.ReportEventLevelList.Where(rel => rel.lowerbound <= item.ML && rel.upperbound > item.ML).First().level; int colorIndex = (int)(((item.Z - GlobalConfig.ProjectConfig.WorkArea.ZMin) / Math.Abs(GlobalConfig.ProjectConfig.WorkArea.ZMax - GlobalConfig.ProjectConfig.WorkArea.ZMin)) * GlobalConfig.ColorCountDefault); System.Windows.Media.Color ec = GlobalConfig.eventDepthColor[colorIndex]; BrushEvent = new SolidColorBrush(ec); Pen eventPen = new Pen(BrushEvent, 0); eventPen.Freeze(); dc.DrawEllipse(BrushEvent, eventPen, new Point(canvasLeft + (item.X - baseX) * drawUnit, canvasTop + (canvasHeightRange - (item.Y - baseY)) * drawUnit), EventSize * drawUnit * sizeFactor, EventSize * drawUnit * sizeFactor); } } } } } } host.AddVisual(visual); } public void DrawRRRE(List events, double dw, double dh) { width = dw; height = dh; xDrawUnit = (width - canvasLeft - canvasRight) / (double)canvasWidthRange; yDrawUnit = (height - canvasTop - canvasBottom) / (double)canvasHeightRange; drawUnit = xDrawUnit < yDrawUnit ? xDrawUnit : yDrawUnit; //CadLayers = new List(); //CreateCadLayersByDwg(); if (host.visuals.Count > 0) { host.RemoveVisual(host.visuals[0]); } DrawingVisual visual = new DrawingVisual(); using (DrawingContext dc = visual.RenderOpen()) { //绘制背景色 Pen pen = new Pen(Brushes.White, 0); pen.Freeze(); dc.DrawRectangle(new SolidColorBrush(BackGroundColor), pen, new Rect(0, 0, width, height)); int xAxisCount = (int)Math.Ceiling(canvasHeightRange / unit); int yAxisCount = (int)Math.Ceiling(canvasWidthRange / unit); DrawGrid(dc, xAxisCount, yAxisCount, unit); DrawDwg(dc); if (IsShowEvent) { if (events != null) { if (events.Count > 0) { foreach (var item in events) { float sizeFactor = (float)(((4f + item.ML) / (10f)) * 10f) + 0.1f; //float sizeFactor = GlobalData.ReportEventLevelList.Where(rel => rel.lowerbound <= item.ML && rel.upperbound > item.ML).First().level; int colorIndex = (int)(((item.Z - GlobalConfig.ProjectConfig.WorkArea.ZMin) / Math.Abs(GlobalConfig.ProjectConfig.WorkArea.ZMax - GlobalConfig.ProjectConfig.WorkArea.ZMin)) * GlobalConfig.ColorCountDefault); System.Windows.Media.Color ec = GlobalConfig.eventDepthColor[colorIndex]; BrushEvent = new SolidColorBrush(ec); Pen eventPen = new Pen(BrushEvent, 0); eventPen.Freeze(); dc.DrawEllipse(BrushEvent, eventPen, new Point(canvasLeft + (item.X - baseX) * drawUnit, canvasTop + (canvasHeightRange - (item.Y - baseY)) * drawUnit), EventSize * drawUnit * sizeFactor, EventSize * drawUnit * sizeFactor); } } } } } host.AddVisual(visual); } public void Draw(List events, double dw, double dh) { width = dw; height = dh; xDrawUnit = (width - canvasLeft - canvasRight) / (double)canvasWidthRange; yDrawUnit = (height - canvasTop - canvasBottom) / (double)canvasHeightRange; drawUnit = xDrawUnit < yDrawUnit ? xDrawUnit : yDrawUnit; //CadLayers = new List(); //CreateCadLayersByDwg(); if (host.visuals.Count > 0) { host.visuals.Clear(); //for (int i = 0; i < host.visuals.Count; i++) //{ // host.RemoveVisual(host.visuals[i]); //} } DrawingVisual visualbc = new DrawingVisual(); using (DrawingContext dc = visualbc.RenderOpen()) { int xAxisCount = (int)Math.Ceiling(canvasHeightRange / unit); int yAxisCount = (int)Math.Ceiling(canvasWidthRange / unit); DrawGrid(dc, xAxisCount, yAxisCount, unit); DrawDwg(dc); } host.AddVisual(visualbc); if (IsShowEvent) { if (events != null) { foreach (GridItemEventResult item in events) { TaggedVisual visualE = new TaggedVisual(); using (DrawingContext dc = visualE.RenderOpen()) { float sizeFactor = (float)(((4f + item.ML) / (10f)) * 10f) + 0.1f; //float sizeFactor = GlobalData.ReportEventLevelList.Where(rel => rel.lowerbound <= item.ML && rel.upperbound > item.ML).First().level; int colorIndex = (int)(((item.Z - GlobalConfig.ProjectConfig.WorkArea.ZMin) / Math.Abs(GlobalConfig.ProjectConfig.WorkArea.ZMax - GlobalConfig.ProjectConfig.WorkArea.ZMin)) * GlobalConfig.ColorCountDefault); System.Windows.Media.Color ec = GlobalConfig.eventDepthColor[colorIndex]; BrushEvent = new SolidColorBrush(ec); Pen eventPen = new Pen(BrushEvent, 0); eventPen.Freeze(); dc.DrawEllipse(BrushEvent, eventPen, new Point(canvasLeft + (item.X - baseX) * drawUnit, canvasTop + (canvasHeightRange - (item.Y - baseY)) * drawUnit), EventSize * drawUnit * sizeFactor, EventSize * drawUnit * sizeFactor); } TaggedVisual.SetTag(visualE, "event"); host.AddVisual(visualE); } } } //DrawingVisual visual = new DrawingVisual(); //using (DrawingContext dc = visual.RenderOpen()) //{ // //绘制背景色 // Pen pen = new Pen(Brushes.White, 0); // pen.Freeze(); // dc.DrawRectangle(new SolidColorBrush(BackGroundColor), pen, // new Rect(0, 0, width, height)); // int xAxisCount = (int)Math.Ceiling(canvasHeightRange / unit); // int yAxisCount = (int)Math.Ceiling(canvasWidthRange / unit); // DrawGrid(dc, xAxisCount, yAxisCount, unit); // DrawDwg(dc); // if (IsShowEvent) // { // if (events != null) // { // if (events.Count > 0) // { // foreach (var item in events) // { // float sizeFactor = (float)(((4f + item.ML) / (10f)) * 10f) + 0.1f; // //float sizeFactor = GlobalData.ReportEventLevelList.Where(rel => rel.lowerbound <= item.ML && rel.upperbound > item.ML).First().level; // int colorIndex = (int)(((item.Z - GlobalConfig.ProjectConfig.WorkArea.ZMin) // / Math.Abs(GlobalConfig.ProjectConfig.WorkArea.ZMax - GlobalConfig.ProjectConfig.WorkArea.ZMin)) // * GlobalConfig.ColorCountDefault); // System.Windows.Media.Color ec = GlobalConfig.eventDepthColor[colorIndex]; // BrushEvent = new SolidColorBrush(ec); // Pen eventPen = new Pen(BrushEvent, 0); // eventPen.Freeze(); // dc.DrawEllipse(BrushEvent, eventPen, // new Point(canvasLeft + (item.X - baseX) * drawUnit, canvasTop + (canvasHeightRange - (item.Y - baseY)) * drawUnit), // EventSize * drawUnit * sizeFactor, EventSize * drawUnit * sizeFactor); // } // } // } // } //} //host.AddVisual(visual); } //public void Draw(List events, double dw, double dh) //{ // width = dw; // height = dh; // xDrawUnit = (width - canvasLeft - canvasRight) / (double)canvasWidthRange; // yDrawUnit = (height - canvasTop - canvasBottom) / (double)canvasHeightRange; // drawUnit = xDrawUnit < yDrawUnit ? xDrawUnit : yDrawUnit; // //CadLayers = new List(); // //CreateCadLayersByDwg(); // if (host.visuals.Count > 0) // { // host.RemoveVisual(host.visuals[0]); // } // DrawingVisual visual = new DrawingVisual(); // using (DrawingContext dc = visual.RenderOpen()) // { // //绘制背景色 // Pen pen = new Pen(Brushes.White, 0); // pen.Freeze(); // dc.DrawRectangle(new SolidColorBrush(BackGroundColor), pen, // new Rect(0, 0, width, height)); // int xAxisCount = (int)Math.Ceiling(canvasHeightRange / unit); // int yAxisCount = (int)Math.Ceiling(canvasWidthRange / unit); // DrawGrid(dc, xAxisCount, yAxisCount, unit); // DrawDwg(dc); // if (IsShowEvent) // { // if (events != null) // { // if (events.Count > 0) // { // foreach (var item in events) // { // float sizeFactor = (float)(((4f + item.ML) / (10f)) * 10f) + 0.1f; // //float sizeFactor = GlobalData.ReportEventLevelList.Where(rel => rel.lowerbound <= item.ML && rel.upperbound > item.ML).First().level; // int colorIndex = (int)(((item.Z - GlobalConfig.ProjectConfig.WorkArea.ZMin) // / Math.Abs(GlobalConfig.ProjectConfig.WorkArea.ZMax - GlobalConfig.ProjectConfig.WorkArea.ZMin)) // * GlobalConfig.ColorCountDefault); // System.Windows.Media.Color ec = GlobalConfig.eventDepthColor[colorIndex]; // BrushEvent = new SolidColorBrush(ec); // Pen eventPen = new Pen(BrushEvent, 0); // eventPen.Freeze(); // dc.DrawEllipse(BrushEvent, eventPen, // new Point(canvasLeft + (item.X - baseX) * drawUnit, canvasTop + (canvasHeightRange - (item.Y - baseY)) * drawUnit), // EventSize * drawUnit * sizeFactor, EventSize * drawUnit * sizeFactor); // } // } // } // } // } // host.AddVisual(visual); //} private void DrawDwg(DrawingContext dc) { if (CadLayers != null) { foreach (var layer in CadLayers) { Pen layerPen = new Pen(new SolidColorBrush(layer.Color), layer.LineWidth); layerPen.Freeze(); foreach (var geo in layer.GeometryCollection) { if (geo.Visible == true) { if (layer.Color.R == 0 && layer.Color.G == 0 && layer.Color.B == 255) { //if (geo.originPoints[0].Y > 4031900) //{ // //Console.WriteLine(1); //} } geo.drawPoints = new Point[geo.originPoints.Count]; for (int i = 0; i < geo.drawPoints.Length; i++) { geo.drawPoints[i] = new Point(canvasLeft + (geo.originPoints[i].X - baseX) * drawUnit, canvasTop + (canvasHeightRange - (geo.originPoints[i].Y - baseY)) * drawUnit); } dc.DrawGeometry(new SolidColorBrush(layer.Color), layerPen, CadGeometry.CreateCadGeometry(geo.drawPoints, geo.IsClose, geo.IsFill)); } } foreach (var text in layer.TextCollection) { //if (!text.formattedText.Text.Contains("N")) //{ // text.drawPoint = new Point(canvasLeft + (text.origin.X - baseX) * drawUnit, // canvasTop + (canvasHeightRange - (text.origin.Y - baseY + text.formattedText.Height)) * drawUnit); // dc.DrawText(text.formattedText, text.drawPoint); //} //else if (text.Visible == true) { //Console.WriteLine(text.formattedText.Height+"\t"+drawUnit.ToString()); text.drawPoint = new Point(canvasLeft + (text.origin.X - baseX) * drawUnit, canvasTop + (canvasHeightRange - (text.origin.Y - baseY)) * drawUnit - text.formattedText.Height); dc.DrawText(text.formattedText, text.drawPoint); } } foreach (var line in layer.LineCollection) { if (line.Visible == true) { line.drawPoint0 = new Point(canvasLeft + (line.originPoint0.X - baseX) * drawUnit, canvasTop + (canvasHeightRange - (line.originPoint0.Y - baseY)) * drawUnit); line.drawPoint1 = new Point(canvasLeft + (line.originPoint1.X - baseX) * drawUnit, canvasTop + (canvasHeightRange - (line.originPoint1.Y - baseY)) * drawUnit); dc.DrawLine(layerPen, line.drawPoint0, line.drawPoint1); } } } } } private void DrawGrid(DrawingContext dc, int xLines, int yLines, double unit) { Point drawPoint = new Point(canvasLeft, canvasTop); int xWidth = (int)(drawUnit * canvasWidthRange); int ylength = (int)(drawUnit * canvasHeightRange); //int canLen= if (IsShowGrid) { System.Windows.Media.Pen normalPen = new System.Windows.Media.Pen(GridLineBrush, GridLineWidth); Pen drawPen = normalPen; Pen stressPen = new Pen(GridLineBrush, 0.5); //绘制X轴 for (int i = 0; i < xLines + 1; i++) { if ((i % (gridTextSpacing / unit)) == 0) { drawPen = stressPen; } else { drawPen = normalPen; } drawPen.Freeze(); dc.DrawLine(drawPen, new Point(drawPoint.X + 0, drawPoint.Y + i * drawUnit * unit), new Point(drawPoint.X + xWidth, drawPoint.Y + i * drawUnit * unit)); } //绘制Y轴 for (int i = 0; i < yLines + 1; i++) { if ((i % (gridTextSpacing / unit)) == 0) { drawPen = stressPen; } else { drawPen = normalPen; } dc.DrawLine(drawPen, new Point(drawPoint.X + i * drawUnit * unit, drawPoint.Y + 0), new Point(drawPoint.X + i * drawUnit * unit, drawPoint.Y + ylength)); } } //绘制网格文字 if (IsShowGridText) { string txtTmp = (baseX + unit).ToString("F0"); Typeface typeface = new Typeface(new FontFamily("Arial"), FontStyles.Normal, FontWeights.Normal, FontStretches.Normal); GlyphTypeface glyphTypeface; if (!typeface.TryGetGlyphTypeface(out glyphTypeface)) throw new InvalidOperationException("No glyphtypeface found"); ushort[] glyphIndexes = new ushort[txtTmp.Length]; double[] advanceWidths = new double[txtTmp.Length]; double totalWidth = 0; for (int n = 0; n < txtTmp.Length; n++) { ushort glyphIndex = glyphTypeface.CharacterToGlyphMap[txtTmp[n]]; glyphIndexes[n] = glyphIndex; double twidth = glyphTypeface.AdvanceWidths[glyphIndex] * fontSize; advanceWidths[n] = twidth; totalWidth += twidth; } for (int i = 0; i < xLines + 1; i++) { if (((i * unit) % gridTextSpacing) == 0) { string text = (baseY + i * unit - GlobalConfig.BaseY).ToString("F0"); FormattedText formattedText = new FormattedText(text, new System.Globalization.CultureInfo("zh-CN"), FlowDirection.RightToLeft, typeface, fontSize, Brushes.Black, 1 ); dc.DrawText(formattedText, new Point(drawPoint.X - 10, drawPoint.Y + (xLines - i) * drawUnit * unit - 6)); } //dc.DrawLine(pen, new Point(drawPoint.X + 0, drawPoint.Y + i * drawUnit * unit), new Point(drawPoint.X + xWidth, drawPoint.Y + i * drawUnit * unit)); } for (int i = 0; i < yLines + 1; i++) { if (((i * unit) % gridTextSpacing) == 0) { string text = (baseX + i * unit - GlobalConfig.BaseX).ToString("F0"); FormattedText formattedText = new FormattedText(text, new System.Globalization.CultureInfo("zh-CN"), FlowDirection.RightToLeft, typeface, fontSize, Brushes.Black, 1 ); dc.DrawText(formattedText, new Point(drawPoint.X + i * drawUnit * unit + totalWidth / 2.0, (xLines + 1) * drawUnit * unit + 20)); }//dc.DrawLine(pen, new Point(drawPoint.X + i * drawUnit * unit, height - canvasBottom + 10), new Point(drawPoint.X + i * drawUnit * unit, height - canvasBottom + 10)); } } } public void CreateCadLayersByDwg() { //string CadFilePath = GlobalConfig.ProjectConfig.CadFileName; DxfModel model = DwgReader.Read(DwgFile); List entityTpyeList = new List(); Typeface typeface = new Typeface(new FontFamily("宋体"), FontStyles.Normal, FontWeights.Normal, FontStretches.Normal); //try { foreach (var clc in GlobalConfig.CadLayerConfigs) { if (clc.isShow) { var ents = model.Entities.FindAll(et => et.Layer.Name == clc.name); CadLayer cadLayer = new CadLayer(clc.name, clc.lineColor, clc.linewidth); //if (clc.name=="巷道注记") //{ // Console.WriteLine("123"); //} foreach (var ent in ents) { List points = new List(); switch (ent.EntityType) { case "LINE": //if (clc.name.Contains("断层")) //{ // Console.WriteLine("In Line"); //} DxfLine line = (DxfLine)ent; if (line.Start.X >= GlobalConfig.ProjectConfig.WorkArea.EMin && line.End.X <= GlobalConfig.ProjectConfig.WorkArea.EMax && line.Start.Y >= GlobalConfig.ProjectConfig.WorkArea.NMin && line.End.Y <= GlobalConfig.ProjectConfig.WorkArea.EMax) { points.Add(new Point(line.Start.X, line.Start.Y)); points.Add(new Point(line.End.X, line.End.Y)); CadGeometry cadGeometry = new CadGeometry(); cadGeometry.originPoints = points; cadGeometry.IsClose = clc.lineClose; cadGeometry.IsFill = clc.isFill; cadGeometry.Visible = clc.isShow; cadLayer.GeometryCollection.Add(cadGeometry); } break; case "POLYLINE": //if (clc.name.Contains("断层")) //{ // Console.WriteLine(1); //} foreach (var point in ((DxfPolyline3D)ent).Vertices) { if (point.X >= GlobalConfig.ProjectConfig.WorkArea.EMin && point.X <= GlobalConfig.ProjectConfig.WorkArea.EMax && point.Y >= GlobalConfig.ProjectConfig.WorkArea.NMin && point.Y <= GlobalConfig.ProjectConfig.WorkArea.EMax) { //double x = canvasLeft + (point.X - baseX) * drawUnit; //double y = canvasTop + (canvasHeightRange - (point.Y - baseY)) * drawUnit; points.Add(new Point(point.X, point.Y)); } } if (points.Count > 0) { CadGeometry cadGeometry = new CadGeometry(); cadGeometry.originPoints = points; cadGeometry.IsClose = clc.lineClose; cadGeometry.IsFill = clc.isFill; cadGeometry.Visible = clc.isShow; //bool isFile = clc.name.Contains("台站") ? true : false; cadLayer.GeometryCollection.Add(cadGeometry); } break; case "LWPOLYLINE": //if (clc.name.Contains("断层")) //{ // Console.WriteLine(1); //} foreach (var point in ((DxfLwPolyline)ent).Vertices) { if (point.X >= GlobalConfig.ProjectConfig.WorkArea.EMin && point.X <= GlobalConfig.ProjectConfig.WorkArea.EMax && point.Y >= GlobalConfig.ProjectConfig.WorkArea.NMin && point.Y <= GlobalConfig.ProjectConfig.WorkArea.EMax) { //double x = canvasLeft + (point.X - baseX) * drawUnit; //double y = canvasTop + (canvasHeightRange - (point.Y - baseY)) * drawUnit; points.Add(new Point(point.X, point.Y)); } } if (points.Count > 0) { CadGeometry cadGeometry = new CadGeometry(); cadGeometry.originPoints = points; cadGeometry.IsClose = clc.lineClose; cadGeometry.IsFill = clc.isFill; cadGeometry.Visible = clc.isShow; cadLayer.GeometryCollection.Add(cadGeometry); } break; case "MTEXT": DxfMText met = (DxfMText)ent; //if (met.Text.Contains("16") && clc.name.Contains("台站")) //{ // Console.WriteLine(1); //} if (met.InsertionPoint.X >= GlobalConfig.ProjectConfig.WorkArea.EMin && met.InsertionPoint.X <= GlobalConfig.ProjectConfig.WorkArea.EMax && met.InsertionPoint.Y >= GlobalConfig.ProjectConfig.WorkArea.NMin && met.InsertionPoint.Y <= GlobalConfig.ProjectConfig.WorkArea.EMax) { //Console.WriteLine("mtext:"+met.Text); string text = met.Text; double yOff = 0; if (ent.Layer.Name.Contains("台站")) { yOff = 10; //Console.WriteLine(text); } FormattedText formattedText = new FormattedText(text, new System.Globalization.CultureInfo("zh-CN"), FlowDirection.RightToLeft, typeface, clc.fontSize, new SolidColorBrush(clc.lineColor), 1 ); formattedText.TextAlignment = TextAlignment.Right; //double x = canvasLeft + (met.InsertionPoint.X - baseX) * drawUnit; //double y = canvasTop + (canvasHeightRange - (met.InsertionPoint.Y - baseY)) * drawUnit; Point origin = new Point(met.InsertionPoint.X, met.InsertionPoint.Y - yOff); cadLayer.TextCollection.Add(new CadText(formattedText, origin, clc.isShow)); } break; case "TEXT": DxfText et = (DxfText)ent; 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) { string text = et.Text; //if (et.Text == "N2106") //{ // text = "北2106"; // Console.WriteLine(text); //} FormattedText formattedText = new FormattedText(text, new System.Globalization.CultureInfo("zh-CN"), FlowDirection.RightToLeft, typeface, clc.fontSize, new SolidColorBrush(clc.lineColor), 1 ); formattedText.TextAlignment = TextAlignment.Right; //double x = canvasLeft + (et.AlignmentPoint1.X - baseX) * drawUnit; //double y = canvasTop + (canvasHeightRange - (et.AlignmentPoint1.Y - baseY)) * drawUnit; Point origin = new Point(et.AlignmentPoint1.X, et.AlignmentPoint1.Y); cadLayer.TextCollection.Add(new CadText(formattedText, origin, clc.isShow)); } break; case "CIRCLE": DxfCircle dxfCircle = (DxfCircle)ent; //Console.WriteLine(1); break; case "HATCH": DxfHatch dxfHatch = (DxfHatch)ent; foreach (var point in dxfHatch.BoundaryPaths[0].Edges) { LineEdge lineEdge = (LineEdge)point; if (lineEdge.Start.X >= GlobalConfig.ProjectConfig.WorkArea.EMin && lineEdge.End.X <= GlobalConfig.ProjectConfig.WorkArea.EMax && lineEdge.Start.Y >= GlobalConfig.ProjectConfig.WorkArea.NMin && lineEdge.End.Y <= GlobalConfig.ProjectConfig.WorkArea.EMax) { //double x = canvasLeft + (lineEdge.Start.X - baseX) * drawUnit; //double y = canvasTop + (canvasHeightRange - (lineEdge.Start.Y - baseY)) * drawUnit; points.Add(new Point(lineEdge.Start.X, lineEdge.Start.Y)); //x = canvasLeft + (lineEdge.End.X - baseX) * drawUnit; //y = canvasTop + (canvasHeightRange - (lineEdge.End.Y - baseY)) * drawUnit; points.Add(new Point(lineEdge.End.X, lineEdge.End.Y)); } } if (points.Count > 0) { CadGeometry cadGeometry = new CadGeometry(); cadGeometry.originPoints = points; cadGeometry.IsClose = clc.lineClose; cadGeometry.IsFill = clc.isFill; cadGeometry.Visible = clc.isShow; cadLayer.GeometryCollection.Add(cadGeometry); } break; } } CadLayers.Add(cadLayer); } } } //catch (Exception ex) //{ // Console.WriteLine(ex.Message); //} } public PathGeometry CreateCadGeometry(List points, bool isClose, bool isFill) { PolyLineSegment lineSegment = new PolyLineSegment(); foreach (var item in points) { lineSegment.Points.Add(item); } PathSegmentCollection myPathSegmentCollection = new PathSegmentCollection(); myPathSegmentCollection.Add(lineSegment); PathFigure pathFigure = new PathFigure(); pathFigure.IsClosed = isClose; pathFigure.IsFilled = isFill; pathFigure.StartPoint = points[0]; pathFigure.Segments = myPathSegmentCollection; PathFigureCollection pthFigureCollection = new PathFigureCollection(); pthFigureCollection.Add(pathFigure); PathGeometry pthGeometry = new PathGeometry(); pthGeometry.Figures = pthFigureCollection; return pthGeometry; } } }