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.
Txgy.EWS.Client/Txgy.EWS.Client.PageModule/Views/EarlyWarningView.xaml.cs

1098 lines
52 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using Prism.Events;
using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Threading;
using Txgy.EWS.Client.Common;
using Txgy.EWS.Client.Common.MessageEvents;
using Txgy.EWS.Client.FocalMechanism.Core;
using Txgy.EWS.Client.FocalMechanism.Model;
using Txgy.EWS.Client.PageModule.Models;
using Txgy.Microseismic.BaseLib.Models;
using Unity;
using static WW.Cad.Model.Entities.DxfHatch.BoundaryPath;
using WW.Cad.Model.Entities;
using WW.Cad.Model;
using Color = System.Windows.Media.Color;
using WW.Cad.IO;
using System.Diagnostics;
using Txgy.EWS.Client.Common.Helpers;
using Txgy.EWS.Client.Models;
using Txgy.EWS.Client.Entity;
using System.Threading.Tasks;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Txgy.Controls;
namespace Txgy.EWS.Client.PageModule.Views
{
/// <summary>
/// EarlyWarningView.xaml 的交互逻辑
/// </summary>
public partial class EarlyWarningView : UserControl
{
Dispatcher _dispatcher;
private readonly IEventAggregator _ea;
private VisualHost host;
public TransformGroup transGroup;
private delegate void HandleDataGeneratedDelegate(List<GridItemEventResult> results, double dw, double dh, int ts, DateTime inTime);
/// <summary>
/// Delegate for data generation.
/// </summary>
private HandleDataGeneratedDelegate _handleDataGenerated;
public List<EventAinimationElement> eventAinimationElements = new List<EventAinimationElement>();
double eaiRadis = 10;
int EventShowTotalSeconds = 86400;
double width = 700;
double height = 700;
double canvasLeft = 80;
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 = 3;
public ProcessCore pCore { get; set; }
public Factory factory { get; set; }
public FMMap fmMap { get; set; }
public MmEvent curMmEvent { get; set; }
public bool IsShowEvent = true;
private double _scale = 1;
public double Scale
{
get { return _scale; }
set
{
_scale = value;
}
}
public List<CadLayer> CadLayers { get; set; }
ReportPlanImage rpi = new ReportPlanImage();
public EarlyWarningView(IUnityContainer unityContainer, IEventAggregator ea)
{
InitializeComponent();
_ea = ea;
_dispatcher = unityContainer.Resolve<Dispatcher>();
//rpi.DrawPlanClipToDrawVisual(mes, (int)rView.canvasPlan.ActualWidth, (int)rView.canvasPlan.ActualHeight);
rpi.Draw(null, canvas.Width, canvas.Height);
//host = new VisualHost();
canvas.Children.Add(rpi.host);
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 = canvas.Width;
height = canvas.Height;
xDrawUnit = (width - canvasLeft - canvasRight) / (double)canvasWidthRange;
yDrawUnit = (height - canvasTop - canvasBottom) / (double)canvasHeightRange;
drawUnit = xDrawUnit < yDrawUnit ? xDrawUnit : yDrawUnit;
//if (xUnit < yUnit) drawUnit = yUnit;
CadLayers = new List<CadLayer>();
//CreateBackgroudByDwg();
this.SizeChanged += SystemMonitor_SizeChanged;
transGroup = new TransformGroup();
transGroup.Children.Add(new ScaleTransform(1, 1));
transGroup.Children.Add(new TranslateTransform(-380, 0));
canvas.RenderTransform = transGroup;
//事件时限秒数
EventShowTotalSeconds = int.Parse(System.Configuration.ConfigurationManager.AppSettings["EventShowTotalSeconds"].ToString());
_handleDataGenerated = new HandleDataGeneratedDelegate(rpi.DrawGierInTime);
//更新接收到的事件到平面图
this._ea.GetEvent<UpdateReceivedEventMessage>().Subscribe(u =>
{
_dispatcher.Invoke(_handleDataGenerated, GlobalData.ReceivedEvents, canvas.ActualWidth, canvas.ActualHeight, EventShowTotalSeconds, DateTime.Now);
});
//开始监控
//this._ea.GetEvent<StartRunMonitorMessage>().Subscribe(() =>
//{
// _dispatcher.Invoke(_handleDataGenerated, GlobalData.ReceivedEvents, canvas.ActualWidth, canvas.ActualHeight, EventShowTotalSeconds, DateTime.Now);
//});
//触发事件闪动动画
this._ea.GetEvent<SelectAlarmEventMessage>().Subscribe(aem =>
{
ClickEventInListStoryBoard(aem, 3);
});
//GridItemEventResult gier = new GridItemEventResult();
//gier.EventID = 53459;
//gier.EventTime = "2023-04-23T00:14:16.037";
//gier.X = 38398017;
//gier.Y = 4030418;
//gier.Z = 709.6;
//gier.ML = -1.66;
//gier.Energy = 1500;
//Task.Delay(TimeSpan.FromSeconds(3)).ContinueWith(t =>
//{
// CreateStoryBoard(gier, 5);
//}, TaskScheduler.FromCurrentSynchronizationContext());
//this._ea.GetEvent<UpdateEventsMessage>().Subscribe(u =>
//{
// Draw();
//});
//Draw();
//this._ea.GetEvent<UpdateEventsMessage>().Subscribe(u =>
//{
// //_dispatcher.Invoke(_handleDataGenerated);
//});
}
//点击事件列表动画效果
public void ClickEventInListStoryBoard(GridItemEventResult gier, int Repeat)
{
EventAinimationItem eai = rpi.ConvertGierToEai(gier);
EventAinimationElement eae = new EventAinimationElement();
eae.EllName = "ell" + gier.EventID.ToString();
eae.GStopName = "gstop" + gier.EventID.ToString();
var haveElement = this.canvas.FindName(eae.EllName);
if (haveElement == null)
{
if (eventAinimationElements.Count > 20)
{
eventAinimationElements.RemoveAt(0);
}
eventAinimationElements.Add(eae);
var myCircle = new Ellipse();
myCircle.Name = eae.EllName;
myCircle.Width = eaiRadis * 2;
myCircle.Height = eaiRadis * 2;
myCircle.Fill = Brushes.Blue;
myCircle.Stroke = new SolidColorBrush(System.Windows.Media.Colors.Red);
myCircle.StrokeThickness = 2;
TranslateTransform ttf = new TranslateTransform(eai.OffsetX - eaiRadis, eai.OffsetY - eaiRadis);//事件位置
myCircle.RenderTransform = ttf;
//myCircle.ToolTip = string.Format("发震时刻:{0}\n东{1},北:{2},深度:{3}\n震级{4}ml能量{5}J",
// gier.EventTime, Math.Round(gier.X, 2), Math.Round(gier.Y, 2), Math.Round(gier.Z, 2), Math.Round(gier.ML, 2), gier.Energy);
myCircle.Opacity = 0;
this.canvas.Children.Add(myCircle);
var sb = new Storyboard();
sb.Name = eae.EllName;
sb.Completed += ((s, e) =>
{
var ellipse = this.canvas.FindName(eae.EllName) as Ellipse;
this.canvas.Children.Remove(ellipse);
this.canvas.UnregisterName(eae.EllName);
this.canvas.UnregisterName(eae.GStopName);
});
//sb.Completed += OnStoryboardCompleted;
this.canvas.RegisterName(eae.EllName, myCircle);
DoubleAnimation ellda = new DoubleAnimation();
ellda.From = 0.2;//此处值设置0-1会有不同的呈现效果
ellda.To = 1;
ellda.Duration = new Duration(TimeSpan.FromSeconds(2));
ellda.BeginTime = TimeSpan.FromSeconds(0);//推迟动画开始时间 等轨迹连接到圆时 开始播放圆的呈现动画
ellda.FillBehavior = FillBehavior.HoldEnd;
Storyboard.SetTargetName(ellda, eae.EllName);
Storyboard.SetTargetProperty(ellda, new PropertyPath(Ellipse.OpacityProperty));
sb.Children.Add(ellda);
//圆呈放射状
RadialGradientBrush rgBrush = new RadialGradientBrush();
GradientStop gStop0 = new GradientStop(Color.FromArgb(255, 0, 0, 0), 0);
//此为控制点 color的a值设为0 off值走0-1 透明部分向外放射 初始设为255是为了初始化效果 开始不呈放射状 等跑动的点运动到城市的圆后 color的a值才设为0开始呈现放射动画
GradientStop gStopT = new GradientStop(Color.FromArgb(255, 0, 0, 0), 0);
GradientStop gStop1 = new GradientStop(Color.FromArgb(255, 0, 0, 0), 1);
rgBrush.GradientStops.Add(gStop0);
rgBrush.GradientStops.Add(gStopT);
rgBrush.GradientStops.Add(gStop1);
myCircle.OpacityMask = rgBrush;
this.canvas.RegisterName(eae.GStopName, gStopT);
//跑动的点达到城市的圆时 控制点由不透明变为透明 color的a值设为0 动画时间为0
ColorAnimation ca = new ColorAnimation();
ca.To = Color.FromArgb(0, 0, 0, 0);
ca.Duration = new Duration(TimeSpan.FromSeconds(0));
ca.BeginTime = TimeSpan.FromSeconds(0);
ca.FillBehavior = FillBehavior.HoldEnd;
Storyboard.SetTargetName(ca, eae.GStopName);
Storyboard.SetTargetProperty(ca, new PropertyPath(GradientStop.ColorProperty));
sb.Children.Add(ca);
//点达到城市的圆时 呈现放射状动画 控制点的off值走0-1 透明部分向外放射
DoubleAnimation eda = new DoubleAnimation();
eda.To = 1;
eda.Duration = new Duration(TimeSpan.FromSeconds(2));
//eda.RepeatBehavior = RepeatBehavior.Forever;
eda.RepeatBehavior = new RepeatBehavior(Repeat);
eda.BeginTime = TimeSpan.FromSeconds(0);
Storyboard.SetTargetName(eda, eae.GStopName);
Storyboard.SetTargetProperty(eda, new PropertyPath(GradientStop.OffsetProperty));
sb.Children.Add(eda);
sb.Begin(canvas);
}
}
public void ClickEventInPlanStoryBoard(GridItemEventResult gier, int Repeat)
{
EventAinimationItem eai = rpi.ConvertGierToEai(gier);
EventAinimationElement eae = new EventAinimationElement();
eae.EllName = "ell" + gier.EventID.ToString();
eae.GStopName = "gstop" + gier.EventID.ToString();
var haveElement = this.canvas.FindName(eae.EllName);
if (haveElement == null)
{
if (eventAinimationElements.Count > 20)
{
eventAinimationElements.RemoveAt(0);
}
eventAinimationElements.Add(eae);
var myCircle = new Ellipse();
myCircle.Name = eae.EllName;
//大小
myCircle.Width = eaiRadis * 1.2;
myCircle.Height = eaiRadis * 1.2;
myCircle.Fill = Brushes.Blue;
myCircle.Stroke = new SolidColorBrush(System.Windows.Media.Colors.Red);
myCircle.StrokeThickness = 2;
//事件位置
TranslateTransform ttf = new TranslateTransform(eai.OffsetX - eaiRadis*0.6, eai.OffsetY - eaiRadis*0.6);
myCircle.RenderTransform = ttf;
//myCircle.ToolTip = string.Format("发震时刻:{0}\n东{1},北:{2},深度:{3}\n震级{4}ml能量{5}J",
// gier.EventTime, Math.Round(gier.X, 2), Math.Round(gier.Y, 2), Math.Round(gier.Z, 2), Math.Round(gier.ML, 2), gier.Energy);
myCircle.Opacity = 0;
this.canvas.Children.Add(myCircle);
var sb = new Storyboard();
sb.Name = eae.EllName;
sb.Completed += ((s, e) =>
{
var ellipse = this.canvas.FindName(eae.EllName) as Ellipse;
this.canvas.Children.Remove(ellipse);
this.canvas.UnregisterName(eae.EllName);
this.canvas.UnregisterName(eae.GStopName);
});
//sb.Completed += OnStoryboardCompleted;
this.canvas.RegisterName(eae.EllName, myCircle);
DoubleAnimation ellda = new DoubleAnimation();
ellda.From = 0.2;//此处值设置0-1会有不同的呈现效果
ellda.To = 1;
ellda.Duration = new Duration(TimeSpan.FromSeconds(2));
ellda.BeginTime = TimeSpan.FromSeconds(0);//推迟动画开始时间 等轨迹连接到圆时 开始播放圆的呈现动画
ellda.FillBehavior = FillBehavior.HoldEnd;
Storyboard.SetTargetName(ellda, eae.EllName);
Storyboard.SetTargetProperty(ellda, new PropertyPath(Ellipse.OpacityProperty));
sb.Children.Add(ellda);
//圆呈放射状
RadialGradientBrush rgBrush = new RadialGradientBrush();
GradientStop gStop0 = new GradientStop(Color.FromArgb(255, 0, 0, 0), 0);
//此为控制点 color的a值设为0 off值走0-1 透明部分向外放射 初始设为255是为了初始化效果 开始不呈放射状 等跑动的点运动到城市的圆后 color的a值才设为0开始呈现放射动画
GradientStop gStopT = new GradientStop(Color.FromArgb(255, 0, 0, 0), 0);
GradientStop gStop1 = new GradientStop(Color.FromArgb(255, 0, 0, 0), 1);
rgBrush.GradientStops.Add(gStop0);
rgBrush.GradientStops.Add(gStopT);
rgBrush.GradientStops.Add(gStop1);
myCircle.OpacityMask = rgBrush;
this.canvas.RegisterName(eae.GStopName, gStopT);
//跑动的点达到城市的圆时 控制点由不透明变为透明 color的a值设为0 动画时间为0
ColorAnimation ca = new ColorAnimation();
ca.To = Color.FromArgb(0, 0, 0, 0);
ca.Duration = new Duration(TimeSpan.FromSeconds(0));
ca.BeginTime = TimeSpan.FromSeconds(0);
ca.FillBehavior = FillBehavior.HoldEnd;
Storyboard.SetTargetName(ca, eae.GStopName);
Storyboard.SetTargetProperty(ca, new PropertyPath(GradientStop.ColorProperty));
sb.Children.Add(ca);
//点达到城市的圆时 呈现放射状动画 控制点的off值走0-1 透明部分向外放射
DoubleAnimation eda = new DoubleAnimation();
eda.To = 1;
eda.Duration = new Duration(TimeSpan.FromSeconds(2));
//eda.RepeatBehavior = RepeatBehavior.Forever;
eda.RepeatBehavior = new RepeatBehavior(Repeat);
eda.BeginTime = TimeSpan.FromSeconds(0);
Storyboard.SetTargetName(eda, eae.GStopName);
Storyboard.SetTargetProperty(eda, new PropertyPath(GradientStop.OffsetProperty));
sb.Children.Add(eda);
sb.Begin(canvas);
}
}
private void OnStoryboardCompleted(object sender, EventArgs e)
{
//var sb = sender as Storyboard;
//this.canvas.FindName
var ellipse = this.canvas.FindName("ell") as Ellipse;
//this.canvas.UnregisterName("ell");
//this.canvas.UnregisterName("e");
this.canvas.Children.Remove(ellipse);
}
private void RemoveAinimationElement(EventAinimationElement eae)
{
var ellipse = this.canvas.FindName(eae.EllName) as Ellipse;
this.canvas.UnregisterName(eae.EllName);
this.canvas.UnregisterName(eae.GStopName);
this.canvas.Children.Remove(ellipse);
}
public void Draw()
{
if (host.visuals.Count > 0)
{
host.RemoveVisual(host.visuals[0]);
}
DrawingVisual visual = new DrawingVisual();
//Application.Current.Dispatcher.Invoke(() =>
//{
using (DrawingContext dc = visual.RenderOpen())
{
//绘制背景色
Pen pen = new Pen(Brushes.White, 0);
//pen.Freeze();
dc.DrawRectangle(new SolidColorBrush(BackGroundColor), pen,
new Rect(canvasLeft, canvasTop, width - canvasLeft - canvasRight, height - canvasTop - canvasBottom));
int xAxisCount = (int)Math.Ceiling(canvasHeightRange / unit);
int yAxisCount = (int)Math.Ceiling(canvasWidthRange / unit);
DrawGrid(dc, xAxisCount, yAxisCount, unit);
DrawDwg(dc);
if (IsShowEvent)
{
if (GlobalData.AlarmEvents != null)
{
if (GlobalData.AlarmEvents.Count > 0)
{
foreach (var item in GlobalData.AlarmEvents)
{
//如果事件时间在24小时内显示
if ((DateTime.Parse(item.EventTime) - DateTime.Now).TotalSeconds < EventShowTotalSeconds)
{
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];
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 CreateBackgroudByDwg()
{
string CadFilePath = GlobalConfig.ProjectConfig.CadFileName;
DxfModel model = DwgReader.Read(CadFilePath);
List<string> entityTpyeList = new List<string>();
Typeface typeface = new Typeface(new FontFamily("Arial"),
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);
foreach (var ent in ents)
{
List<Point> points = new List<Point>();
//if (!entityTpyeList.Contains(ent.EntityType))
//{
// entityTpyeList.Add(ent.EntityType);
// Console.WriteLine(ent.EntityType);
//}
switch (ent.EntityType)
{
case "POLYLINE":
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(x, y));
}
}
if (points.Count > 0)
{
//bool isFile = clc.name.Contains("台站") ? true : false;
//cadLayer.GeometryCollection.Add(CreateCadGeometry(points, clc.lineClose, clc.isFill));
}
break;
case "LWPOLYLINE":
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(x, y));
}
}
if (points.Count > 0)
{
//cadLayer.GeometryCollection.Add(CreateCadGeometry(points, clc.lineClose, clc.isFill));
}
break;
case "MTEXT":
DxfMText met = (DxfMText)ent;
//if (met.Text.Contains("16") && clc.name.Contains("台站"))
//{
// //Console.WriteLine(1);
//}
//不显示工区号如N1103
//if (met.Text.Contains("N"))
//{
// break;
//}
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)
{
string text = met.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(x, y);
cadLayer.TextCollection.Add(new CadText(formattedText, origin));
}
break;
case "TEXT":
DxfText et = (DxfText)ent;
//if (et.Text.Contains("N") && clc.name.Contains("台站"))
//{
//不显示工区号如N1103
//}
//if (et.Text.Contains("N"))
//{
// break;
//}
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;
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(x, y);
cadLayer.TextCollection.Add(new CadText(formattedText, origin));
}
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.st. >= 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 + (lineEdge.Start.X - baseX) * drawUnit;
double y = canvasTop + (canvasHeightRange - (lineEdge.Start.Y - baseY)) * drawUnit;
points.Add(new Point(x, y));
x = canvasLeft + (lineEdge.End.X - baseX) * drawUnit;
y = canvasTop + (canvasHeightRange - (lineEdge.End.Y - baseY)) * drawUnit;
points.Add(new Point(x, y));
}
}
if (points.Count > 0)
{
//cadLayer.GeometryCollection.Add(CreateCadGeometry(points, clc.lineClose, clc.isFill));
}
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;
}
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)
{
//dc.DrawGeometry(new SolidColorBrush(layer.Color), layerPen, geo.DrawGeometry);
}
foreach (var text in layer.TextCollection)
{
dc.DrawText(text.formattedText, text.drawPoint);
}
foreach (var line in layer.LineCollection)
{
dc.DrawLine(layerPen, line.drawPoint0, line.drawPoint1);
}
}
}
}
private void Canvas_MouseWheel(object sender, MouseWheelEventArgs e)
{
width = this.mainView.ActualWidth + e.Delta;
height = this.mainView.ActualHeight + e.Delta;
if (height < 400) height = 400;
if (width < 400) width = 400;
this.mainView.Width = width;
this.mainView.Height = height;
//xDrawUnit = (width - canvasLeft - canvasRight) / (double)canvasWidthRange;
//yDrawUnit = (height - canvasTop - canvasBottom) / (double)canvasHeightRange;
//drawUnit = xDrawUnit < yDrawUnit ? xDrawUnit : yDrawUnit;
//this.mainView.SetValue(Canvas.LeftProperty, (this.RenderSize.Width - this.mainView.Width) / 2);
Control ctl = sender as Control;
System.Windows.Point point = e.GetPosition(ctl);
//滚轮滚动时控制 放大的倍数,没有固定的值,可以根据需要修改。
double scale = e.Delta * 0.001;
ZoomImage(transGroup, point, scale);
e.Handled = true;
}
//对控件进行缩放。
private void ZoomImage(TransformGroup group, Point point, double scale)
{
Point pointToContent = group.Inverse.Transform(point);
ScaleTransform scaleT = group.Children[0] as ScaleTransform;
if (scaleT.ScaleX + scale < 1) return;
scaleT.ScaleX += scale;
scaleT.ScaleY += scale;
TranslateTransform translateT = group.Children[1] as TranslateTransform;
translateT.X = -1 * ((pointToContent.X * scaleT.ScaleX) - point.X);
translateT.Y = -1 * ((pointToContent.Y * scaleT.ScaleY) - point.Y);
}
/// <summary>
/// 绘制张性
/// </summary>
/// <param name="dc"></param>
/// <param name="center"></param>
/// <param name="angle"></param>
private void DrawTensile(DrawingContext dc, Point center, double angle, Brush brush)
{
Point drawCenter = new Point(center.X + canvasLeft, center.Y + canvasTop);
RotateTransform _rotateTrans = new RotateTransform();
_rotateTrans.Angle = angle;
_rotateTrans.CenterX = drawCenter.X;
_rotateTrans.CenterY = drawCenter.Y;
double LRadis = 10;
double WRadis = 5;
EllipseGeometry ellipseGeometry = new EllipseGeometry(new Point(drawCenter.X, canvasTop + center.Y), LRadis, WRadis);
LineGeometry line = new LineGeometry(new Point(drawCenter.X - LRadis, drawCenter.Y), new Point(drawCenter.X + LRadis, drawCenter.Y));
ellipseGeometry.Transform = _rotateTrans;
line.Transform = _rotateTrans;
Pen pen = new Pen(brush, 1.5);
pen.Freeze();
dc.DrawGeometry(Brushes.Transparent, pen, ellipseGeometry);
dc.DrawGeometry(Brushes.Transparent, pen, line);
}
/// <summary>
/// 绘制倾滑
/// </summary>
private void DrawDipSlip(DrawingContext dc, Point center, double angle, Brush brush)
{
Point drawCenter = new Point(center.X + canvasLeft, center.Y + canvasTop);
RotateTransform _rotateTrans = new RotateTransform();
_rotateTrans.Angle = angle;
_rotateTrans.CenterX = drawCenter.X;
_rotateTrans.CenterY = drawCenter.Y;
double len = 10;
Point p1 = new Point(drawCenter.X - len, drawCenter.Y);
Point p2 = new Point(drawCenter.X - len, drawCenter.Y - 4);
Point p3 = new Point(drawCenter.X + len, drawCenter.Y - 4);
Point p4 = new Point(drawCenter.X + len, drawCenter.Y);
Point p5 = new Point(drawCenter.X + 2, drawCenter.Y);
Point p6 = new Point(drawCenter.X + 2, drawCenter.Y + len);
Point p7 = new Point(drawCenter.X - 4, drawCenter.Y + 4.5);
Point p8 = new Point(drawCenter.X - 2, drawCenter.Y + 4.5);
Point p9 = new Point(drawCenter.X - 2, drawCenter.Y);
PolyLineSegment lineSegment = new PolyLineSegment();
lineSegment.Points.Add(p1);
lineSegment.Points.Add(p2);
lineSegment.Points.Add(p3);
lineSegment.Points.Add(p4);
lineSegment.Points.Add(p5);
lineSegment.Points.Add(p6);
lineSegment.Points.Add(p7);
lineSegment.Points.Add(p8);
lineSegment.Points.Add(p9);
PathFigure pathFigure = new PathFigure();
pathFigure.IsClosed = true;
pathFigure.IsFilled = true;
pathFigure.StartPoint = p1;
PathSegmentCollection myPathSegmentCollection = new PathSegmentCollection();
myPathSegmentCollection.Add(lineSegment);
pathFigure.Segments = myPathSegmentCollection;
PathFigureCollection pthFigureCollection = new PathFigureCollection();
pthFigureCollection.Add(pathFigure);
PathGeometry pthGeometry = new PathGeometry();
pthGeometry.Figures = pthFigureCollection;
pthGeometry.Transform = _rotateTrans;
Pen pen = new Pen(Brushes.White, 0);
pen.Freeze();
dc.DrawGeometry(brush, pen, pthGeometry);
//PolyLineSegment polyLineSegment= new PolyLineSegment()
}
/// <summary>
/// 绘制走滑
/// </summary>
/// <param name="dc"></param>
/// <param name="center"></param>
/// <param name="angle"></param>
/// <param name="brush"></param>
private void DrawStrikeSlip(DrawingContext dc, Point center, double angle, Brush brush)
{
Point drawCenter = new Point(center.X + canvasLeft, center.Y + canvasTop);
RotateTransform _rotateTrans = new RotateTransform();
_rotateTrans.Angle = angle;
_rotateTrans.CenterX = canvasLeft + center.X;
_rotateTrans.CenterY = canvasTop + center.Y;
//上箭头
Point p1 = new Point(drawCenter.X - 9, drawCenter.Y - 2);
Point p2 = new Point(drawCenter.X - 9, drawCenter.Y - 5);
Point p3 = new Point(drawCenter.X + 3, drawCenter.Y - 5);
Point p4 = new Point(drawCenter.X + 3, drawCenter.Y - 9);
Point p5 = new Point(drawCenter.X + 9, drawCenter.Y - 2);
PolyLineSegment lineSegment = new PolyLineSegment();
lineSegment.Points.Add(p1);
lineSegment.Points.Add(p2);
lineSegment.Points.Add(p3);
lineSegment.Points.Add(p4);
lineSegment.Points.Add(p5);
PathFigure pathFigure = new PathFigure();
pathFigure.IsClosed = true;
pathFigure.IsFilled = true;
pathFigure.StartPoint = p1;
PathSegmentCollection myPathSegmentCollection = new PathSegmentCollection();
myPathSegmentCollection.Add(lineSegment);
pathFigure.Segments = myPathSegmentCollection;
PathFigureCollection pthFigureCollection = new PathFigureCollection();
pthFigureCollection.Add(pathFigure);
PathGeometry pthGeometry = new PathGeometry();
pthGeometry.Figures = pthFigureCollection;
pthGeometry.Transform = _rotateTrans;
Pen pen = new Pen(Brushes.White, 0);
pen.Freeze();
dc.DrawGeometry(brush, pen, pthGeometry);
//下箭头
Point xp1 = new Point(drawCenter.X - 9, drawCenter.Y + 2);
Point xp2 = new Point(drawCenter.X + 9, drawCenter.Y + 2);
Point xp3 = new Point(drawCenter.X + 9, drawCenter.Y + 5);
Point xp4 = new Point(drawCenter.X - 3, drawCenter.Y + 5);
Point xp5 = new Point(drawCenter.X - 3, drawCenter.Y + 9);
PolyLineSegment lineSegment2 = new PolyLineSegment();
lineSegment2.Points.Add(xp1);
lineSegment2.Points.Add(xp2);
lineSegment2.Points.Add(xp3);
lineSegment2.Points.Add(xp4);
lineSegment2.Points.Add(xp5);
PathFigure pathFigure2 = new PathFigure();
pathFigure2.IsClosed = true;
pathFigure2.IsFilled = true;
pathFigure2.StartPoint = xp1;
PathSegmentCollection myPathSegmentCollection2 = new PathSegmentCollection();
pathFigure2.Segments = myPathSegmentCollection2;
myPathSegmentCollection2.Add(lineSegment2);
PathFigureCollection pthFigureCollection2 = new PathFigureCollection();
pthFigureCollection2.Add(pathFigure2);
PathGeometry pthGeometry2 = new PathGeometry();
pthGeometry2.Figures = pthFigureCollection2;
pthGeometry2.Transform = _rotateTrans;
dc.DrawGeometry(brush, pen, pthGeometry2);
}
/// <summary>
/// 绘制台站
/// </summary>
/// <param name="dc"></param>
/// <param name="center"></param>
/// <param name="text"></param>
/// <param name="size"></param>
/// <param name="brush"></param>
/// <exception cref="InvalidOperationException"></exception>
private void DrawStation(DrawingContext dc, Point center, string text, double size, Brush brush)
{
Point drawCenter = new Point(center.X + canvasLeft, center.Y + canvasTop);
Rect rect = new Rect(drawCenter.X - size / 2.0, drawCenter.Y - size / 2.0, size, size);
Pen stationPen = new Pen(brush, 1);
stationPen.Freeze();
dc.DrawRectangle(Brushes.Transparent, stationPen, rect);
FormattedText formattedText = new FormattedText(text,
new System.Globalization.CultureInfo("zh-CN"),
FlowDirection.LeftToRight,
new Typeface("Arail"),
stationFontSize, brush, 1
);
dc.DrawText(formattedText, new Point(drawCenter.X - size / 2.0 + 1, drawCenter.Y - size / 2.0 + 5));
}
/// <summary>
/// 绘制网格
/// </summary>
/// <param name="dc"></param>
/// <param name="xLines"></param>
/// <param name="yLines"></param>
/// <param name="unit"></param>
/// <param name="pen"></param>
/// <exception cref="InvalidOperationException"></exception>
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).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).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, height - canvasBottom + 5));
}//dc.DrawLine(pen, new Point(drawPoint.X + i * drawUnit * unit, height - canvasBottom + 10), new Point(drawPoint.X + i * drawUnit * unit, height - canvasBottom + 10));
}
}
}
bool isSelectEvent = false;
private void Canvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
tip.IsOpen = false;
if (!isSelectEvent)
{
isSelectEvent = true;
}
e.Handled = true;
}
private void Canvas_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
if (isSelectEvent)
{
// 获取鼠标点击的位置
Point point = e.GetPosition(canvas);
//Debug.WriteLine(point.ToString());
// 使用GetVisual方法获取点击的DrawingVisual
DrawingVisual visual = rpi.host.GetVisual(point);
if (visual != null)
{
GridItemEventResult gier = (GridItemEventResult)TaggedVisual.GetTag(visual);
ClickEventInPlanStoryBoard(gier, 1);
tip.Placement = System.Windows.Controls.Primitives.PlacementMode.MousePoint;
tip.Content = string.Format("发震时刻:{0}\n东{1},北:{2},海拔:{3}m\n震级{4}ml能量{5}J",
gier.EventTime, Math.Round(gier.X, 2), Math.Round(gier.Y, 2), Math.Round(gier.Z, 2), Math.Round(gier.ML, 2), gier.Energy);
// logic for Show/Hide:
tip.Visibility = isSelectEvent ? Visibility.Visible : Visibility.Collapsed;
// Be open constantly while mouse-moving:
tip.IsOpen = true;
}
else
{
isSelectEvent = false;
tip.Visibility = isSelectEvent ? Visibility.Visible : Visibility.Collapsed;
tip.IsOpen = isSelectEvent;
}
}
// 防止事件进一步冒泡
e.Handled = true;
}
private void Canvas_MouseMove(object sender, MouseEventArgs e)
{
if (_isMoving)
{
Point currentPoint = e.GetPosition(sender as Canvas);
TranslateTransform tt = transGroup.Children[1] as TranslateTransform;
this.DoImageMove(tt, currentPoint);
e.Handled = true;
}
}
Point previousMousePoint;
private void DoImageMove(TranslateTransform transform, Point position)
{
transform.X += position.X - this.previousMousePoint.X;
transform.Y += position.Y - this.previousMousePoint.Y;
this.previousMousePoint = position;
}
private ListBoxItem _lastSelectedItem;
private void myListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
//if (ReceivedEventListBox.SelectedItem == null && _lastSelectedItem != null)
//{
// // Restore the last selected item if nothing is selected
// _lastSelectedItem.IsSelected = true;
//}
//else
//{
// // Update the last selected item
// _lastSelectedItem = ReceivedEventListBox.SelectedItem as ListBoxItem;
//}
}
private void right_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
_downPoint = e.GetPosition(sender as Canvas);
this.previousMousePoint = _downPoint;
//left = double.Parse(this.mainView.GetValue(Canvas.LeftProperty).ToString());
//top = double.Parse(this.mainView.GetValue(Canvas.TopProperty).ToString());
_isMoving = true;
(sender as Canvas).CaptureMouse();
e.Handled = true;
}
private void right_MouseRightButtonUp(object sender, MouseButtonEventArgs e)
{
_isMoving = false;
(sender as Canvas).ReleaseMouseCapture();
//
e.Handled = true;
}
private void right_MouseLeave(object sender, MouseEventArgs e)
{
if (isSelectEvent)
{
tip.Visibility = Visibility.Collapsed;
isSelectEvent = false;
e.Handled = true;
}
}
private void SystemMonitor_SizeChanged(object sender, SizeChangedEventArgs e)
{
this.mainView.SetValue(Canvas.LeftProperty, (this.RenderSize.Width - this.mainView.ActualWidth) / 2);
width = canvas.Width;
height = canvas.Height;
}
}
public struct EventAinimationElement
{
public string EllName { get; set; }
public string GStopName { get; set; }
}
}