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.

1162 lines
58 KiB
C#

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<CadLayer> 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<CadLayer>();
DwgFile = GlobalConfig.ProjectConfig.CadFileName;
CreateCadLayersByDwg();
}
public VisualHost DrawPlanClipToDrawVisual(List<GridItemEventResult> 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<GridItemEventResult> 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<GridItemEventResult> 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<GridItemEventResult> 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<GridItemEventResult> 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<GridItemEventResult> 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<CadLayer>();
// //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<GridItemEventResult> 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<RemoteRealtimeResultEntity> 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<CadLayer>();
//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<RemoteRealtimeResultEntity> 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<CadLayer>();
//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<GridItemEventResult> 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<CadLayer>();
//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<GridItemEventResult> 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<CadLayer>();
// //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<string> entityTpyeList = new List<string>();
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<Point> points = new List<Point>();
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<Point> 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;
}
}
}