diff --git a/Plane.FormationCreator/Formation/CopterManager.cs b/Plane.FormationCreator/Formation/CopterManager.cs index 6f8e619..13a7818 100644 --- a/Plane.FormationCreator/Formation/CopterManager.cs +++ b/Plane.FormationCreator/Formation/CopterManager.cs @@ -631,7 +631,7 @@ namespace Plane.FormationCreator.Formation if ((username== supername) && (password== superpass) &&(DateTime.UtcNow < CopterCollection.Expire_SuperUser) ) { // NetLogined(supername, superDispname, -1, -1, LEVEL_ADMIN); - NetLogined(supername, superDispname,6, 50, LEVEL_NORMAL); + NetLogined(supername, superDispname,6, 300, LEVEL_NORMAL); VersionControl.SaveLogininfoToIni(supername, superpass, savepassword); //超级密码是否保存---不要就不保存 return; } diff --git a/Plane.FormationCreator/Formation/Extensions.cs b/Plane.FormationCreator/Formation/Extensions.cs index d4fab61..d56126c 100644 --- a/Plane.FormationCreator/Formation/Extensions.cs +++ b/Plane.FormationCreator/Formation/Extensions.cs @@ -53,6 +53,7 @@ namespace Plane.FormationCreator.Formation public static double DistanceTo(this ICopter copter, ICopter copter2) { return GeographyUtils.CalcDistance(copter.Latitude, copter.Longitude, copter.Altitude, copter2.Latitude, copter2.Longitude, copter2.Altitude); + //return GeographyUtils.CalcDistance_simple(copter.Latitude, copter.Longitude, copter.Altitude, copter2.Latitude, copter2.Longitude, copter2.Altitude); } public static double InPlaneDistanceTo(this ICopter copter, double targetLat, double targetLng) diff --git a/Plane.FormationCreator/Formation/FlightTaskManager.cs b/Plane.FormationCreator/Formation/FlightTaskManager.cs index 703c024..9b2e30b 100644 --- a/Plane.FormationCreator/Formation/FlightTaskManager.cs +++ b/Plane.FormationCreator/Formation/FlightTaskManager.cs @@ -541,6 +541,24 @@ namespace Plane.FormationCreator.Formation set { Set(nameof(OriginLng), ref _OriginLng, value); } } + private double _ObserverLat = 0; + public double ObserverLat + { + get { return _ObserverLat; } + set { Set(nameof(ObserverLat), ref _ObserverLat, value); } + } + + private double _ObserverLng = 0; + public double ObserverLng + { + get { return _ObserverLng; } + set { Set(nameof(ObserverLng), ref _ObserverLng, value); } + } + + + + + /// /// 起始点作为参考,设置起始点后飞行写入的数据将为相对坐标 /// @@ -767,6 +785,8 @@ namespace Plane.FormationCreator.Formation altitude: 0 ); //设置灯光为默认颜色 fc.LEDColor = CopterManager.CopterDefaultColor;// "000000"; + fc.LEDMode = 0; + fc.LEDInterval = 0; } } @@ -2626,6 +2646,7 @@ namespace Plane.FormationCreator.Formation Message.Show($"{DateTime.Now.ToString("HH:mm:ss")}:任务开始"); } + /* //设置模拟飞行更新间隔,都是I7配置下 int update_int = 50; //300以内50流畅 if ((_copterManager.Copters.Count() > 300) && ((_copterManager.Copters.Count() <= 500))) @@ -2634,7 +2655,7 @@ namespace Plane.FormationCreator.Formation update_int = 150; //极限了 500-1000可以用 foreach (var copter in _copterManager.Copters) copter.sim_update_int = update_int; - + */ await RunAsync(); diff --git a/Plane.FormationCreator/Formation/FlightTask_FlyTo.cs b/Plane.FormationCreator/Formation/FlightTask_FlyTo.cs index 612f920..d683e01 100644 --- a/Plane.FormationCreator/Formation/FlightTask_FlyTo.cs +++ b/Plane.FormationCreator/Formation/FlightTask_FlyTo.cs @@ -115,7 +115,7 @@ namespace Plane.FormationCreator.Formation } - private int RuningTaskRemaining = 0; + // private int RuningTaskRemaining = 0; private async Task FlyToTaskFlySingleCopterAsync(FlightTaskSingleCopterInfo info) { @@ -162,14 +162,15 @@ namespace Plane.FormationCreator.Formation } //发送目标航点1次 - await info.Copter.FlyToAsync(targetLat, targetLng, info.TargetAlt); + await info.Copter.FlyToAsync(targetLat, targetLng, info.TargetAlt, task.FlytoTime); // await Task.Delay(10).ConfigureAwait(false); dtNow = DateTime.Now; ts = dtNow - dtLastTime; - int sendFlyToTimes = 0; + // int sendFlyToTimes = 0; + /* //第0个任务为takeoff if (taskIndex > 0) { @@ -177,6 +178,7 @@ namespace Plane.FormationCreator.Formation if (prevTask.TaskType == FlightTaskType.FlyTo && prevTask.LoiterTime == 0) flyToTime += prevTask.RuningTaskRemaining; } + */ //while (!info.Copter.ArrivedTarget(info.TargetLat, info.TargetLng, info.TargetAlt)) //按航点飞 :所有Copter到达目标点开始飞下个航点 while (ts.TotalMilliseconds < (flyToTime + loiterTime)) //按时间轴飞:当前任务时间到达后自动飞往下个航点 diff --git a/Plane.FormationCreator/Formation/FlightTask_TakeOff.cs b/Plane.FormationCreator/Formation/FlightTask_TakeOff.cs index be5c14e..a9b9ec9 100644 --- a/Plane.FormationCreator/Formation/FlightTask_TakeOff.cs +++ b/Plane.FormationCreator/Formation/FlightTask_TakeOff.cs @@ -105,30 +105,20 @@ namespace Plane.FormationCreator.Formation //虚拟飞机5秒后不起飞会自动上锁 await copter.UnlockAsync(); - - for (int i = 0; i < 5; i++) // added by ZJF - { - await copter.TakeOffAsync(); - await Task.Delay(50).ConfigureAwait(false); - } - + await copter.TakeOffAsync(); var copterNextTask = _flightTaskManager.Tasks[TaskIndex + 1].SingleCopterInfos[copterIndex]; float takeOffAlt = copterNextTask.TargetAlt; - info.TargetLat = info.Copter.Latitude; info.TargetLng = info.Copter.Longitude; - - // for (int j = 0; j < 3; j++) - // { - await info.Copter.FlyToAsync(info.TargetLat, info.TargetLng, takeOffAlt); - // await Task.Delay(10).ConfigureAwait(false); - // } + FlightTask task = _flightTaskManager.CurrentRunningTask; + //开始往上飞 + await info.Copter.FlyToAsync(info.TargetLat, info.TargetLng, takeOffAlt, task.TakeOffTime- info.TakeOffWaitTime); //秒 //解锁起飞用暗紫色 info.Copter.LEDColor = CopterManager.CopterTakeoffColor; dtNow = DateTime.Now; ts = dtNow - dtLastTime; - FlightTask task = _flightTaskManager.CurrentRunningTask; + while (ts.TotalMilliseconds < task.TakeOffTime * 1000) { diff --git a/Plane.FormationCreator/ViewModels/CopterListViewModel.cs b/Plane.FormationCreator/ViewModels/CopterListViewModel.cs index 8ba2ceb..81d8d18 100644 --- a/Plane.FormationCreator/ViewModels/CopterListViewModel.cs +++ b/Plane.FormationCreator/ViewModels/CopterListViewModel.cs @@ -371,8 +371,11 @@ namespace Plane.FormationCreator.ViewModels id: id, name: id ); + if (_copterManager.FC_VER_NO >= 3) + copter.FlightControlMode = 1; + else copter.FlightControlMode = 0; //不再预先分配VID - // copter.VirtualId = _virtualCopterId; + // copter.VirtualId = _virtualCopterId; await copter.ConnectAsync(); await copter.GetCopterDataAsync(); _copterManager.CopterStatus.Add(false); @@ -473,6 +476,8 @@ namespace Plane.FormationCreator.ViewModels _lastVirtualCopterLocation = null; _flightTaskManager.OriginLat = 0; _flightTaskManager.OriginLng = 0; + _flightTaskManager.ObserverLat = 0; + _flightTaskManager.ObserverLng = 0; })); } } diff --git a/Plane.FormationCreator/ViewModels/MainViewModel.cs b/Plane.FormationCreator/ViewModels/MainViewModel.cs index 45adc9b..64819b3 100644 --- a/Plane.FormationCreator/ViewModels/MainViewModel.cs +++ b/Plane.FormationCreator/ViewModels/MainViewModel.cs @@ -317,6 +317,7 @@ namespace Plane.FormationCreator.ViewModels MapMode = 1; b2DMapMode = false; _flightTaskManager.TaskRun_2D = b2DMapMode; //3D模式模拟显示 + mainw.map3D.ResetCamera(); diff --git a/Plane.FormationCreator/ViewModels/View3DViewModel.cs b/Plane.FormationCreator/ViewModels/View3DViewModel.cs index 6b2ac6c..018e39e 100644 --- a/Plane.FormationCreator/ViewModels/View3DViewModel.cs +++ b/Plane.FormationCreator/ViewModels/View3DViewModel.cs @@ -93,6 +93,7 @@ namespace Plane.FormationCreator.ViewModels planeModel3Ds.Clear(); planeGroup.Children.Clear(); observationLatLng = null; + SelectTask(); } private void Copter_LocationChanged(object sender, EventArgs e) @@ -109,7 +110,31 @@ namespace Plane.FormationCreator.ViewModels } private Dictionary planeModel3Ds = new Dictionary(); - Tuple observationLatLng = null; + private Tuple observationLatLng = null; + + //得到观测位置 + //observationLatLng 观察点坐标,第一列的中间再往前2个中间距离) + //观测点的位置放到最后排飞机的中间位置 + private void getobservationpos() + { + observationLatLng = new Tuple(_flightTaskManager.ObserverLat, _flightTaskManager.ObserverLng); + /* + + //第一列到中间的距离 + float midColDistance = (_flightTaskManager.ColumnCount - 1) * _flightTaskManager.ColumnDistance / 2; + observationLatLng = GeographyUtils.CalcLatLngSomeMetersAway2D( + _flightTaskManager.OriginLat, + _flightTaskManager.OriginLng, + _flightTaskManager.Orientation + 90, + midColDistance); + observationLatLng = GeographyUtils.CalcLatLngSomeMetersAway2D( + observationLatLng.Item1, + observationLatLng.Item2, + _flightTaskManager.Orientation + 180, + midColDistance * 4); + */ + } + private void AddOrMove3DCopter(ICopter copter) { @@ -117,29 +142,16 @@ namespace Plane.FormationCreator.ViewModels //var copternum1 = _copterManager.Copters.FirstOrDefault(); if (_flightTaskManager.OriginLat == 0 || _flightTaskManager.OriginLng == 0) return; - - //第一列到中间的距离 - float midColDistance = (_flightTaskManager.ColumnCount - 1) * _flightTaskManager.ColumnDistance / 2; - + //得到观测位置 if (observationLatLng == null) { - observationLatLng = GeographyUtils.CalcLatLngSomeMetersAway2D( - _flightTaskManager.OriginLat, - _flightTaskManager.OriginLng, - _flightTaskManager.Orientation + 90, - midColDistance); - observationLatLng = GeographyUtils.CalcLatLngSomeMetersAway2D( - observationLatLng.Item1, - observationLatLng.Item2, - _flightTaskManager.Orientation + 180, - midColDistance * 2); + getobservationpos(); } + + //没有这架飞机就加入 if (!planeModel3Ds.ContainsKey(copter)) { - - //观测点的位置放到最后排飞机的中间位置 - var meshBuilderwaypoint = new MeshBuilder(false, false); //meshBuilderwaypoint.AddTriangle(new Point3D(-0.1, -0.1, 0), new Point3D(0.1, -0.1, 0), new Point3D(0, 0.2, 0)); @@ -147,12 +159,13 @@ namespace Plane.FormationCreator.ViewModels meshBuilderwaypoint.AddSphere(new Point3D(0, 0, 0), 0.3* _copterManager.scale3d); var meshwaypoint = meshBuilderwaypoint.ToMesh(true); + //离观测点距离y double y = GeographyUtils.CalcDistance(0, observationLatLng.Item1, 0, 0, copter.Latitude, 0) / 2; if (observationLatLng.Item1 > copter.Latitude) y = -y; - + //离观测点距离x double x = GeographyUtils.CalcDistance(observationLatLng.Item2, 0, 0, copter.Longitude, 0, 0) / 2; if (observationLatLng.Item2 > copter.Longitude) x = -x; - + //离观测点距离z double z = copter.Altitude + 0.1; x *= _copterManager.scale3d; @@ -167,8 +180,9 @@ namespace Plane.FormationCreator.ViewModels { Geometry = meshwaypoint, Transform = new TranslateTransform3D(x, y, z), - Material = MaterialHelper.CreateMaterial(color), - BackMaterial = MaterialHelper.CreateMaterial(color) + Material = new DiffuseMaterial(new SolidColorBrush(color)), + //Material = MaterialHelper.CreateMaterial(color), + // BackMaterial = MaterialHelper.CreateMaterial(color) }; planeModel3Ds.Add(copter, model3D); @@ -177,7 +191,7 @@ namespace Plane.FormationCreator.ViewModels //有飞机在视图里就移动位置 else { - + //计算和观测点的相对位置 double y = GeographyUtils.CalcDistance(0, observationLatLng.Item1, 0, 0, copter.Latitude, 0) / 2; if (observationLatLng.Item1 > copter.Latitude) y = -y; @@ -188,30 +202,45 @@ namespace Plane.FormationCreator.ViewModels x = Math.Round(x, 2);//按照四舍五入的国际标准 y = Math.Round(y, 2); double z = Math.Round(copter.Altitude / 2, 2); - - GeometryModel3D panle3D = planeModel3Ds[copter]; x *= _copterManager.scale3d; - y *= _copterManager.scale3d; - z *= _copterManager.scale3d; + y *= _copterManager.scale3d; + z *= _copterManager.scale3d; + + //移动飞机到新位置 + GeometryModel3D panle3D = planeModel3Ds[copter]; + if (x != panle3D.Transform.Value.OffsetX || y != panle3D.Transform.Value.OffsetY || z != panle3D.Transform.Value.OffsetZ) { - panle3D.Transform = new TranslateTransform3D(x, y, z); + var trans = panle3D.Transform as TranslateTransform3D; + trans.OffsetX = x; + trans.OffsetY = y; + trans.OffsetZ = z; } + //设置灯光 + Color color; if (copter.LEDColor != null && copter.LEDColor != "") { color = (Color)ColorConverter.ConvertFromString("#" + copter.LEDColor); panle3D.Material = MaterialHelper.CreateMaterial(color); - panle3D.BackMaterial = MaterialHelper.CreateMaterial(color); + // panle3D.BackMaterial = MaterialHelper.CreateMaterial(color); } - //else - // color = (Color)ColorConverter.ConvertFromString("#" + CopterManager.CopterDefaultColor); + /* + // Color color; + if (copter.LEDShowColor != null) + { + Color currcolor = System.Windows.Media.Color.FromArgb( + copter.LEDShowColor.A, copter.LEDShowColor.R, copter.LEDShowColor.G, copter.LEDShowColor.B); + { + ((panle3D.Material as DiffuseMaterial).Brush as SolidColorBrush).Color = currcolor; + } } - - //Message.Show("添加3D飞机:" + copter.Name); + */ + } + } @@ -222,16 +251,12 @@ namespace Plane.FormationCreator.ViewModels waypointGroup.Children.Clear(); if (_flightTaskManager.SelectedTaskIndex > 0) { - //观测点的位置放到最后排飞机的中间位置 - Tuple observationLatLng; - //列的中间位置 - float midDistance = (_flightTaskManager.ColumnCount - 1) * _flightTaskManager.ColumnDistance / 2; - - observationLatLng = GeographyUtils.CalcLatLngSomeMetersAway2D( - _flightTaskManager.OriginLat, _flightTaskManager.OriginLng, _flightTaskManager.Orientation + 90, midDistance); - observationLatLng = GeographyUtils.CalcLatLngSomeMetersAway2D( - observationLatLng.Item1, observationLatLng.Item2, _flightTaskManager.Orientation + 180, midDistance * 2); + //得到观测位置 + if (observationLatLng == null) + { + getobservationpos(); + } //modelGroup.Children.Clear(); diff --git a/Plane.FormationCreator/Views/MapView.xaml.cs b/Plane.FormationCreator/Views/MapView.xaml.cs index bc2fe8e..2e20f30 100644 --- a/Plane.FormationCreator/Views/MapView.xaml.cs +++ b/Plane.FormationCreator/Views/MapView.xaml.cs @@ -185,6 +185,19 @@ namespace Plane.FormationCreator.Views originalMarker.Position = gmap.FromLocalToLatLng((int)wpPos.X, (int)wpPos.Y); //MapLayer.SetPosition(original, gmap.ViewportPointToLocation(wpPos)); } + + + if (observerMarker != null && gmap.Markers.Contains(observerMarker)) + { + PointLatLng location = new LatLng(_flightTaskManager.ObserverLat, _flightTaskManager.ObserverLng).ToGCJ02(); + GPoint wpPos = gmap.FromLatLngToLocal(location); + //Point wpPos = gmap.LocationToViewportPoint(location); + wpPos.X -= (long)ORIGIN_RADIUS; + wpPos.Y -= (long)ORIGIN_RADIUS; + observerMarker.Position = gmap.FromLocalToLatLng((int)wpPos.X, (int)wpPos.Y); + //MapLayer.SetPosition(original, gmap.ViewportPointToLocation(wpPos)); + } + }; GMapMarker rectangleMarker = null; @@ -278,6 +291,9 @@ namespace Plane.FormationCreator.Views gmap.MouseMove += new MouseEventHandler(OriginalMove); gmap.MouseLeftButtonUp += new MouseButtonEventHandler(OriginalMouseUp); + + gmap.MouseMove += new MouseEventHandler(observerMove); + gmap.MouseLeftButtonUp += new MouseButtonEventHandler(observerMouseUp); } private CopterManager _copterManager = ServiceLocator.Current.GetInstance(); @@ -288,6 +304,7 @@ namespace Plane.FormationCreator.Views const string COPTER_TAG = "Copter"; const string WAYPOINT_TAG = "Waypoint"; const string ORIGINALPOINT_TAG = "Originalpoint"; + const string OBSERVER_TAG = "Observerpoint"; public void Refresh() { @@ -337,6 +354,8 @@ namespace Plane.FormationCreator.Views private void Copter_LocationChanged(object sender, EventArgs e) { + if (!_flightTaskManager.TaskRun_2D) return; //不在3D模式运行直接退出 + var copter = sender as ICopter; if (App.Current.CheckAccess()) { @@ -444,7 +463,8 @@ namespace Plane.FormationCreator.Views // } } - + GMapMarker observerMarker = null; + Microsoft.Expression.Shapes.RegularPolygon observer = null; GMapMarker originalMarker = null; Microsoft.Expression.Shapes.RegularPolygon original = null; const double ORIGIN_RADIUS = 12; @@ -483,8 +503,131 @@ namespace Plane.FormationCreator.Views _flightTaskManager.OriginLng = location.Lng; original.MouseLeftButtonDown += new MouseButtonEventHandler(OriginalMouseDown); + ///加入或者改变观测点用于3D模拟 + + if (gmap.Markers.Contains(observerMarker)) + gmap.Markers.Remove(observerMarker); + observer = new Microsoft.Expression.Shapes.RegularPolygon + { + Tag = OBSERVER_TAG, + Fill = new SolidColorBrush(Color.FromArgb(200, 3, 155, 3)), + Stroke = new SolidColorBrush(Color.FromArgb(200, 3, 80, 238)), + StrokeThickness = 1, + Width = ORIGIN_RADIUS *2, + Height = ORIGIN_RADIUS * 2, + InnerRadius = 1, + PointCount = 6, + }; + + if (_flightTaskManager.ObserverLat == 0) + { + Tuple observationLatLng = null; + + + //第一列到中间的距离 + float midColDistance = (_flightTaskManager.ColumnCount - 1) * _flightTaskManager.ColumnDistance / 2; + observationLatLng = GeographyUtils.CalcLatLngSomeMetersAway2D( + _flightTaskManager.OriginLat, + _flightTaskManager.OriginLng, + _flightTaskManager.Orientation + 90, + midColDistance); + observationLatLng = GeographyUtils.CalcLatLngSomeMetersAway2D( + observationLatLng.Item1, + observationLatLng.Item2, + _flightTaskManager.Orientation + 180, + midColDistance * 4); + + + _flightTaskManager.ObserverLat = observationLatLng.Item1; + _flightTaskManager.ObserverLng = observationLatLng.Item2; + } + + //_flightTaskManager.ObserverLat = _flightTaskManager.OriginLat; + //_flightTaskManager.ObserverLng = _flightTaskManager.OriginLng; + + PointLatLng Observerlocation = new LatLng(_flightTaskManager.ObserverLat, _flightTaskManager.ObserverLng).ToGCJ02(); + GPoint opoint = gmap.FromLatLngToLocal(Observerlocation); + + opoint.X -= (long)ORIGIN_RADIUS; + opoint.Y -= (long)ORIGIN_RADIUS; + + + mapLocation = gmap.FromLocalToLatLng((int)opoint.X, (int)opoint.Y); + + observerMarker = new GMapMarker(mapLocation); + observerMarker.ZIndex = 200; + observerMarker.Shape = observer; + observerDrag = false; + observer.MouseLeftButtonDown += new MouseButtonEventHandler(observerMouseDown); + + + gmap.Markers.Add(observerMarker); + + } + private bool observerDrag = false; + double observerX = 0; + double observerY = 0; + + + private void observerMouseDown(object sender, MouseButtonEventArgs e) + { + observerDrag = true; + + gmap.CanDragMap = false; + var originPoint = e.GetPosition(gmap); + observerX = originPoint.X; + observerX = originPoint.Y; + + var posInObject = e.GetPosition(observer); + wpOffsetX = posInObject.X; + wpOffsetY = posInObject.Y; + } + + private void observerMove(object sender, MouseEventArgs e) + { + if (observerDrag) + { + Point eventPos = e.GetPosition(gmap); + var leftTopPos = new Point(eventPos.X - wpOffsetX, eventPos.Y - wpOffsetY); + observerMarker.Position = gmap.FromLocalToLatLng((int)leftTopPos.X, (int)leftTopPos.Y); + //MapLayer.SetPosition(original, map.ViewportPointToLocation(leftTopPos)); + } + + } + + private void observerMouseUp(object sender, MouseButtonEventArgs e) + { + if (observerDrag) + { + Point eventPos = e.GetPosition(gmap); + var centrePos = new Point(eventPos.X - wpOffsetX + ORIGIN_RADIUS, eventPos.Y - wpOffsetY + ORIGIN_RADIUS); + PointLatLng location = gmap.FromLocalToLatLng((int)centrePos.X, (int)centrePos.Y); + _flightTaskManager.ObserverLat = location.Lat; + _flightTaskManager.ObserverLng = location.Lng; + // original.ToolTip = location.ToString(); + //Clipboard.SetDataObject(string.Format("{0},{1}", location.Lat, location.Lng), true); + observerDrag = false; + gmap.CanDragMap = true; + } + } + + + + + + + + + + + + + + + + private bool originaDrag = false; double originX = 0; double originY = 0; diff --git a/Plane.FormationCreator/Views/View3D.xaml.cs b/Plane.FormationCreator/Views/View3D.xaml.cs index 537efd7..b6f5052 100644 --- a/Plane.FormationCreator/Views/View3D.xaml.cs +++ b/Plane.FormationCreator/Views/View3D.xaml.cs @@ -39,7 +39,7 @@ namespace Plane.FormationCreator.Views } - private void ResetCamera() + public void ResetCamera() { // view3d.CameraController.CameraPosition = new Point3D(0, 40, 1); // view3d.CameraController.CameraUpDirection = new Vector3D(0, -1, 10); @@ -49,10 +49,12 @@ namespace Plane.FormationCreator.Views var camera = view3d.Camera as PerspectiveCamera; camera.Position = new Point3D(0, 0, 1); - //用于180度 - camera.LookDirection = new Vector3D(-0.025, -0.911, 0.411); + //用于朝向180度 + // camera.LookDirection = new Vector3D(-0.025, -0.911, 0.411); + //用于朝向9度 + camera.LookDirection = new Vector3D(0, 1, 0.8); camera.UpDirection = new Vector3D(0.011, 0.411, 0.912); - + //用于0度 //camera.LookDirection = new Vector3D(0, 1, 0); //camera.UpDirection = new Vector3D(0,0, 1);