using Prism.Events; using System; using System.Collections; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Data; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using Txgy.EWS.Client.Common; using Txgy.EWS.Client.Common.MessageEvents; using Txgy.Microseismic.BaseLib.Models; using WW.Cad.Model.Entities; using WW.Cad.Model; using Colors = System.Windows.Media.Colors; using Color = System.Windows.Media.Color; using WW.Cad.IO; using System.Windows.Media.Media3D; using Arction.Wpf.ChartingMVVM; using System.Windows.Threading; using Unity; using Arction.Wpf.ChartingMVVM.Series3D; using Txgy.EWS.Client.FocalMechanism.Core; using Txgy.EWS.Client.FocalMechanism.Model; using Txgy.EWS.Client.IBLL; using Txgy.EWS.Client.PageModule.Models; using Txgy.EWS.Client.Entity; using Newtonsoft.Json.Linq; using Newtonsoft.Json; using static WW.Cad.Model.Entities.DxfHatch.BoundaryPath; using System.IO; using System.Windows.Media; using FmGrid = Txgy.EWS.Client.FocalMechanism.Model.FmGrid; using FMStation = Txgy.EWS.Client.FocalMechanism.Model.FMStation; using Txgy.EWS.Client.PageModule.Services; using Txgy.EWS.Client.Common.Helpers; using Txgy.EWS.Client.Models; using Arction.Wpf.Charting; using System.Windows.Media.Animation; using System.Diagnostics; namespace Txgy.EWS.Client.PageModule.Views { /// /// PlanView.xaml 的交互逻辑 /// public partial class PlanView : UserControl { Dispatcher _dispatcher; private readonly IEventAggregator _ea; private readonly ISearchMsEventBLL searchMsEventBLL; IFreeSql fsqlSqLite = FreeSqlLocalSqLite.freeLocalSqLite; //private readonly IRemoteDownloadDataBLL remoteDownloadDataBLL; private delegate void HandleDataGeneratedDelegate(List results,double dw,double dh); /// /// Delegate for data generation. /// private HandleDataGeneratedDelegate _handleDataGenerated; private VisualHost host; public TransformGroup transGroup; 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; } } ReportPlanImage rpi = new ReportPlanImage(); public List eventAinimationElements = new List(); public List CadLayers { get; set; } double eaiRadis = 10; public PlanView(IUnityContainer unityContainer, IEventAggregator ea, EventListView elv) { InitializeComponent(); _ea = ea; _dispatcher = unityContainer.Resolve(); width = canvas.Width; height = canvas.Height; //rpi.DrawPlanClipToDrawVisual(mes, (int)rView.canvasPlan.ActualWidth, (int)rView.canvasPlan.ActualHeight); rpi.DrawGier(null, width, height); canvas.Children.Add(rpi.host); _handleDataGenerated = new HandleDataGeneratedDelegate(rpi.DrawGier); transGroup = new TransformGroup(); transGroup.Children.Add(new ScaleTransform(1.05, 1.05)); transGroup.Children.Add(new TranslateTransform(250, -50)); canvas.RenderTransform = transGroup; this.EventListContent.Content = elv; this._ea.GetEvent().Subscribe(u => { _dispatcher.Invoke(_handleDataGenerated, u, width, height); }); rpi.DrawGier(GlobalData.QueryEventList, width, height); //触发事件闪动动画 this._ea.GetEvent().Subscribe(aem => { CreateStoryBoard(aem, 3); }); } public void CreateStoryBoard(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); } } private void ShowEventFocalMechanism(MmEvent curEvent) { FracturePoint r1 = new FracturePoint(0, 0); FracturePoint r2 = new FracturePoint(0, 0); //MmEvent CurMmEvent = (MmEvent)obj; SetEventPhases(curEvent); //fmMap = CreateFM(CurMmEvent); ComputeFM(curEvent); //switch (curEvent.FocalType) //{ // case FocalMechanismType.strikeSlip: // FractureLine strikeSlipLine1 = new FractureLine(); // //strikeSlipLine1.p1 = new FracturePoint((float)((float)CurMmEvent.X - EAxisMin + lineStep), (float)(CurMmEvent.Y - lineLen - NAxisMin)); // //strikeSlipLine1.p2 = new FracturePoint((float)((float)CurMmEvent.X - EAxisMin + lineStep), (float)(CurMmEvent.Y + lineLen - NAxisMin)); // //r1 = PointRotate(new FracturePoint((float)(CurMmEvent.X - EAxisMin), (float)(CurMmEvent.Y - NAxisMin)), strikeSlipLine1.p1, CurMmEvent.Direction); // //r2 = PointRotate(new FracturePoint((float)(CurMmEvent.X - EAxisMin), (float)(CurMmEvent.Y - NAxisMin)), strikeSlipLine1.p2, CurMmEvent.Direction); // //strikeSlipLine1.p1 = new FracturePoint((float)(r1.X), (float)(r1.Y)); // //strikeSlipLine1.p2 = new FracturePoint((float)(r2.X), (float)(r2.Y)); // //this.PlotModel.Annotations.Add(CreateStrikeSlipModel(strikeSlipLine1)); // //FractureLine strikeSlipLine2 = new FractureLine(); // //strikeSlipLine2.p1 = new FracturePoint((float)((float)CurMmEvent.X - EAxisMin - lineStep), (float)(CurMmEvent.Y - lineLen - NAxisMin)); // //strikeSlipLine2.p2 = new FracturePoint((float)((float)CurMmEvent.X - EAxisMin - lineStep), (float)(CurMmEvent.Y + lineLen - NAxisMin)); // //r1 = PointRotate(new FracturePoint((float)(CurMmEvent.X - EAxisMin), (float)(CurMmEvent.Y - NAxisMin)), strikeSlipLine2.p1, CurMmEvent.Direction); // //r2 = PointRotate(new FracturePoint((float)(CurMmEvent.X - EAxisMin), (float)(CurMmEvent.Y - NAxisMin)), strikeSlipLine2.p2, CurMmEvent.Direction); // //strikeSlipLine2.p1 = new FracturePoint((float)(r1.X), (float)(r1.Y)); // //strikeSlipLine2.p2 = new FracturePoint((float)(r2.X), (float)(r2.Y)); // //this.PlotModel.Annotations.Add(CreateStrikeSlipModel(strikeSlipLine2)); // break; // case FocalMechanismType.dipSlip: // FractureLine dipSlipLine = new FractureLine(); // //dipSlipLine.p1 = new FracturePoint((float)((float)CurMmEvent.X - EAxisMin), (float)(CurMmEvent.Y - lineLen - NAxisMin)); // //dipSlipLine.p2 = new FracturePoint((float)((float)CurMmEvent.X - EAxisMin), (float)(CurMmEvent.Y + lineLen - NAxisMin)); // //r1 = PointRotate(new FracturePoint((float)(CurMmEvent.X - EAxisMin), (float)(CurMmEvent.Y - NAxisMin)), dipSlipLine.p1, CurMmEvent.Direction); // //r2 = PointRotate(new FracturePoint((float)(CurMmEvent.X - EAxisMin), (float)(CurMmEvent.Y - NAxisMin)), dipSlipLine.p2, CurMmEvent.Direction); // //dipSlipLine.p1 = new FracturePoint((float)(r1.X), (float)(r1.Y)); // //dipSlipLine.p2 = new FracturePoint((float)(r2.X), (float)(r2.Y)); // //this.PlotModel.Annotations.Add(CreateDipSlipModel(dipSlipLine)); // break; // case FocalMechanismType.tensile: // //this.PlotModel.Annotations.Add(CreateTensileModel(CurMmEvent, EAxisMin, NAxisMin)); // //FractureLine tensileLine = new FractureLine(); // //tensileLine.p1 = new FracturePoint((float)((float)CurMmEvent.X - EAxisMin), (float)(CurMmEvent.Y - lineLen - NAxisMin)); // //tensileLine.p2 = new FracturePoint((float)((float)CurMmEvent.X - EAxisMin), (float)(CurMmEvent.Y + lineLen - NAxisMin)); // //r1 = PointRotate(new FracturePoint((float)(CurMmEvent.X - EAxisMin), (float)(CurMmEvent.Y - NAxisMin)), tensileLine.p1, CurMmEvent.Direction); // //r2 = PointRotate(new FracturePoint((float)(CurMmEvent.X - EAxisMin), (float)(CurMmEvent.Y - NAxisMin)), tensileLine.p2, CurMmEvent.Direction); // //tensileLine.p1 = new FracturePoint((float)(r1.X), (float)(r1.Y)); // //tensileLine.p2 = new FracturePoint((float)(r2.X), (float)(r2.Y)); // //this.PlotModel.Annotations.Add(CreateLineModel(tensileLine)); // break; // case FocalMechanismType.unknown: // strikeSlipLine1 = new FractureLine(); // //strikeSlipLine1.p1 = new FracturePoint((float)((float)CurMmEvent.X - EAxisMin + lineStep), (float)(CurMmEvent.Y - lineLen - NAxisMin)); // //strikeSlipLine1.p2 = new FracturePoint((float)((float)CurMmEvent.X - EAxisMin + lineStep), (float)(CurMmEvent.Y + lineLen - NAxisMin)); // //r1 = PointRotate(new FracturePoint((float)(CurMmEvent.X - EAxisMin), (float)(CurMmEvent.Y - NAxisMin)), strikeSlipLine1.p1, CurMmEvent.Direction); // //r2 = PointRotate(new FracturePoint((float)(CurMmEvent.X - EAxisMin), (float)(CurMmEvent.Y - NAxisMin)), strikeSlipLine1.p2, CurMmEvent.Direction); // //strikeSlipLine1.p1 = new FracturePoint((float)(r1.X), (float)(r1.Y)); // //strikeSlipLine1.p2 = new FracturePoint((float)(r2.X), (float)(r2.Y)); // //this.PlotModel.Annotations.Add(CreateStrikeSlipModel(strikeSlipLine1)); // //strikeSlipLine2 = new FractureLine(); // //strikeSlipLine2.p1 = new FracturePoint((float)((float)CurMmEvent.X - EAxisMin - lineStep), (float)(CurMmEvent.Y - lineLen - NAxisMin)); // //strikeSlipLine2.p2 = new FracturePoint((float)((float)CurMmEvent.X - EAxisMin - lineStep), (float)(CurMmEvent.Y + lineLen - NAxisMin)); // //r1 = PointRotate(new FracturePoint((float)(CurMmEvent.X - EAxisMin), (float)(CurMmEvent.Y - NAxisMin)), strikeSlipLine2.p1, CurMmEvent.Direction); // //r2 = PointRotate(new FracturePoint((float)(CurMmEvent.X - EAxisMin), (float)(CurMmEvent.Y - NAxisMin)), strikeSlipLine2.p2, CurMmEvent.Direction); // //strikeSlipLine2.p1 = new FracturePoint((float)(r1.X), (float)(r1.Y)); // //strikeSlipLine2.p2 = new FracturePoint((float)(r2.X), (float)(r2.Y)); // //this.PlotModel.Annotations.Add(CreateStrikeSlipModel(strikeSlipLine2)); // break; // default: // break; //} } public void CheckJsonFile(string eventTiemStr) { string downLoadStr = eventTiemStr; string datePath = downLoadStr.Substring(0, 4) + downLoadStr.Substring(5, 2) + downLoadStr.Substring(8, 2); string jsonStr = "HA." + downLoadStr.Substring(0, 4) + downLoadStr.Substring(5, 2) + downLoadStr.Substring(8, 2) + downLoadStr.Substring(10, 3) + downLoadStr.Substring(14, 2) + downLoadStr.Substring(17, 2) + ".01" + GlobalConfig.DataTypeString + ".json"; string jsonFilePath = GlobalConfig.ProjectConfig.MseedFilePath + "\\" + datePath + "\\" + jsonStr; } public void SetEventPhases(MmEvent mmEvent) { string downLoadStr = mmEvent.EventTimeStr; string datePath = downLoadStr.Substring(0, 4) + downLoadStr.Substring(5, 2) + downLoadStr.Substring(8, 2); string jsonStr = "HA." + downLoadStr.Substring(0, 4) + downLoadStr.Substring(5, 2) + downLoadStr.Substring(8, 2) + downLoadStr.Substring(10, 3) + downLoadStr.Substring(14, 2) + downLoadStr.Substring(17, 2) + ".01" + GlobalConfig.DataTypeString + ".json"; string jsonFilePath = GlobalConfig.ProjectConfig.MseedFilePath + "\\" + datePath + "\\"; if (!File.Exists(jsonFilePath + jsonStr)) { new DownloadJsonFile().Download(downLoadStr, jsonFilePath, jsonStr, GlobalConfig.UseWaveDataTable); } using (StreamReader sr = System.IO.File.OpenText(jsonFilePath + jsonStr)) { mmEvent.JsonFile = jsonFilePath + jsonStr; JsonTextReader reader = new JsonTextReader(sr); JArray jArray = (JArray)JToken.ReadFrom(reader); //解析普通属性和数组混合的Json文件 //数组0是普通属性集合 JObject jobj = (JObject)jArray[0]; mmEvent.SetEnergy(); //mmEvent.DominantFreq = 15; mmEvent.Phases = new Dictionary(); //List DominantFreqlist = new List(); JArray phaseArr = JArray.FromObject(jobj["phases"]); //List DominantFreqList = new List(); for (int i = 0; i < phaseArr.Count; i++) { if (phaseArr[i]["first_motion_direct"] != null) { mmEvent.Phases.Add(phaseArr[i]["id"].ToString().Substring(3, 3), int.Parse(phaseArr[i]["first_motion_direct"].ToString())); } } } } public void ComputeFM(MmEvent mmEvent) { string downLoadStr = mmEvent.EventTimeStr; string datePath = downLoadStr.Substring(0, 4) + downLoadStr.Substring(5, 2) + downLoadStr.Substring(8, 2); string jsonStr = "HA." + downLoadStr.Substring(0, 4) + downLoadStr.Substring(5, 2) + downLoadStr.Substring(8, 2) + downLoadStr.Substring(10, 3) + downLoadStr.Substring(14, 2) + downLoadStr.Substring(17, 2) + ".01" + GlobalConfig.DataTypeString + ".json"; string jsonFilePath = GlobalConfig.ProjectConfig.MseedFilePath + "\\" + datePath + "\\"; if (!File.Exists(jsonFilePath + jsonStr)) { new DownloadJsonFile().Download(downLoadStr, jsonFilePath, jsonStr, GlobalConfig.UseWaveDataTable); } using (StreamReader sr = System.IO.File.OpenText(jsonFilePath + jsonStr)) { mmEvent.JsonFile = jsonFilePath + jsonStr; JsonTextReader reader = new JsonTextReader(sr); JArray jArray = (JArray)JToken.ReadFrom(reader); //解析普通属性和数组混合的Json文件 //数组0是普通属性集合 JObject jobj = (JObject)jArray[0]; mmEvent.SetEnergy(); mmEvent.Phases = new Dictionary(); JArray phaseArr = JArray.FromObject(jobj["phases"]); for (int i = 0; i < phaseArr.Count; i++) { if (phaseArr[i]["first_motion_direct"] != null) { mmEvent.Phases.Add(phaseArr[i]["id"].ToString().Substring(3, 3), int.Parse(phaseArr[i]["first_motion_direct"].ToString())); } } } fmMap = CreateFM(mmEvent, GlobalConfig.ProjectConfig.WorkArea.EMin, GlobalConfig.ProjectConfig.WorkArea.NMin); ComputationResult cr = pCore.ComputeResult(fmMap); if (cr == null) return; mmEvent.FocalType = cr.FocalType; mmEvent.Direction = cr.Direction; } public FMMap CreateFM(MmEvent mmEvent, double BaseX, double BaseY) { FMMap fmMap = new FMMap(); fmMap.X = mmEvent.X - BaseX; fmMap.Y = mmEvent.Y - BaseY; fmMap.R = mmEvent.RMS; foreach (var item in mmEvent.Phases) { if (item.Value == -1) { fmMap.negStation.Add(item.Key); } else { fmMap.posStation.Add(item.Key); } } return fmMap; } public void Draw() { 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(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.SearchEvents != null) { if (GlobalData.SearchEvents.Count>0) { foreach (var item in GlobalData.SearchEvents) { float sizeFactor = (float)(((4f + item.ML) / (4f)) * 2f) + 0.1f; int colorIndex = (int)(((item.Z - GlobalConfig.ProjectConfig.WorkArea.ZMin) / 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 entityTpyeList = new List(); 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); if (clc.name=="已完成巷道") { //Console.WriteLine(1); } foreach (var ent in ents) { List points = new List(); //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)); points.Add(new Point(point.X, point.Y)); } } if (points.Count > 0) { //if (clc.name.Contains("台站")) //{ // Console.WriteLine(1); //} bool isFill = clc.name.Contains("台站") ? true : false; cadLayer.GeometryCollection.Add(new CadGeometry { drawPoints = points.ToArray(), IsClose = clc.lineClose, IsFill = isFill }); //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(new CadGeometry { drawPoints = points.ToArray(), IsClose = clc.lineClose, IsFill = clc.isFill }); //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); //} 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 fText = new FormattedText(text, new System.Globalization.CultureInfo("zh-CN"), FlowDirection.RightToLeft, typeface, clc.fontSize, new SolidColorBrush(clc.lineColor), 1 ); fText.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=fText,drawPoint=origin}); } break; case "TEXT": DxfText et = (DxfText)ent; //if (et.Text.Contains("16") && clc.name.Contains("台站")) //{ // Console.WriteLine(1); //} 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 fText = new FormattedText(text, new System.Globalization.CultureInfo("zh-CN"), FlowDirection.RightToLeft, typeface, clc.fontSize, new SolidColorBrush(clc.lineColor), 1 ); fText.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 = fText, drawPoint = 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(new CadGeometry { drawPoints = points.ToArray(), IsClose = clc.lineClose, IsFill = clc.isFill }); //cadLayer.GeometryCollection.Add(CreateCadGeometry(points, clc.lineClose, clc.isFill)); } break; } } CadLayers.Add(cadLayer); } } } //catch (Exception ex) //{ // Console.WriteLine(ex.Message); //} } public void SetFacotry(double XMax, double YMax, Dictionary StationDic) { FmGrid fmGrid = new FmGrid(); fmGrid.xmin = 0; fmGrid.xmax = XMax; fmGrid.ymin = 0; fmGrid.ymax = YMax; fmGrid.StationCount = StationDic.Count; fmGrid.StationList = new List(); int sc = 0; foreach (var item in StationDic) { fmGrid.StationList.Add(new FMStation(sc, item.Key, item.Value.E - baseX, item.Value.N - baseY)); sc++; } fmGrid.initZeroCenter(); fmGrid.computeDistance(); pCore = new ProcessCore(fmGrid); factory = new Factory(fmGrid); } 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; } 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) { PathGeometry pg = CadGeometry.CreateCadGeometry(geo.drawPoints, geo.IsClose, geo.IsFill); dc.DrawGeometry(new SolidColorBrush(layer.Color), layerPen, pg); } 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 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); } /// /// 绘制倾滑 /// 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() } /// /// 绘制走滑 /// /// /// /// /// 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); } /// /// 绘制台站 /// /// /// /// /// /// /// 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)); } /// /// 绘制网格 /// /// /// /// /// /// /// 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)); } } } private void Canvas_MouseWheel(object sender, MouseWheelEventArgs e) { width = this.mainView.ActualWidth + e.Delta; height = this.mainView.ActualHeight + e.Delta; if (height < 700) height = 700; if (width < 700) width = 700; this.mainView.Width = width; this.mainView.Height = height; //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); } 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 position = e.GetPosition(canvas); //Debug.WriteLine($"mouse point:{position.ToString()}\tcanvas width:{canvas.ActualWidth}\tcanvas height:{canvas.ActualHeight}"); //// 检查鼠标坐标是否在按钮的布局矩形之外 //if (position.X < 0 || position.Y < 0 || // position.X > canvas.ActualWidth || position.Y > canvas.ActualHeight) //{ // tip.Visibility = Visibility.Collapsed; // 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 void Canvas_MouseRightButtonDown(object sender, MouseButtonEventArgs e) { _downPoint = e.GetPosition(sender as Canvas); this.previousMousePoint = _downPoint; _isMoving = true; (sender as Canvas).CaptureMouse(); e.Handled = true; } private void Canvas_MouseRightButtonUp(object sender, MouseButtonEventArgs e) { _isMoving = false; (sender as Canvas).ReleaseMouseCapture(); 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; } private void Canvas_MouseLeave(object sender, MouseEventArgs e) { if (isSelectEvent) { tip.Visibility = Visibility.Collapsed; isSelectEvent = false; e.Handled = true; } } 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); } } #region bak_20230228 //private IEventAggregator _ea; //Dispatcher _dispatcher; //// Delegates //private delegate void HandleDataGeneratedDelegate(); ///// ///// Delegate for data generation. ///// //private HandleDataGeneratedDelegate _handleDataGenerated; //public SizeDoubleXYZ EventSize; //public PlanView(IUnityContainer unityContainer, IEventAggregator ea) //{ // InitializeComponent(); // _ea = ea; // _dispatcher = unityContainer.Resolve(); // _handleDataGenerated = new HandleDataGeneratedDelegate(PutSamplesToChart); // EventSize = new SizeDoubleXYZ(GlobalConfig.eventDSize * 10, GlobalConfig.eventDSize * 10, GlobalConfig.eventDSize * 10); // this._ea.GetEvent().Subscribe(u => // { // _dispatcher.Invoke(_handleDataGenerated); // }); // _dispatcher.Invoke(_handleDataGenerated); //} //private void PutSamplesToChart() //{ // //(Application.Current. as EarlyWarningView).chart.Add(item); // //Type type = Type.GetType("Txgy.EWS.Client.PageModule.Views.EarlyWarningView"); // //LightningChart lChart = (Activator.CreateInstance(type) as EarlyWarningView).chart; // this.chart.BeginUpdate(); // List sp3List = new List(); // foreach (var ms in GlobalData.AlarmEvents) // { // { // float sizeFactor = (float)(((4f + ms.ML) / (4f)) * 6f) + 0.1f; // int colorIndex = (int)(((ms.Z - GlobalConfig.ProjectConfig.WorkArea.ZMin) // / Math.Abs(GlobalConfig.ProjectConfig.WorkArea.ZMax - GlobalConfig.ProjectConfig.WorkArea.ZMin)) // * GlobalConfig.ColorCountDefault); // Color ec = GlobalConfig.eventDepthColor[colorIndex]; // sp3List.Add(new SeriesPoint3D((ms.X), 20, (ms.Y), ec, sizeFactor)); // } // } // PointLineSeries3D plsEvent3d = new PointLineSeries3D(); // plsEvent3d.Title.Text = "微地震事件"; // plsEvent3d.Tag = "mmevent"; // plsEvent3d.IndividualPointColors = true; // plsEvent3d.IndividualPointSizes = true; // plsEvent3d.LineVisible = false; // plsEvent3d.AllowUserInteraction = true; // plsEvent3d.PointsVisible = true; // plsEvent3d.PointStyle.Shape3D = PointShape3D.Sphere; // plsEvent3d.PointStyle.Size3D = EventSize; // plsEvent3d.AddPoints(sp3List.ToArray(), false); // //ChartPointLineCollection.Add(plsEvent3d); // //Console.WriteLine(ChartPointLineCollection.Count); // this.chart.View3D.PointLineSeries3D.Add(plsEvent3d); // this.chart.EndUpdate(); //} #endregion } }