加入导入飞机位置选项

导出以前只是经纬差,改为距离差
加入文件标识和版本目前为2.0
加入文件飞机数量和实际数量不一致提醒
修改灯光设计的按钮在选中1架时会报错的bug
This commit is contained in:
xu 2020-05-06 03:13:51 +08:00
parent c27138d0e3
commit f0ef8134d5
3 changed files with 155 additions and 24 deletions

View File

@ -104,11 +104,17 @@
Command="{Binding ImportTasksCommand}"/> Command="{Binding ImportTasksCommand}"/>
<StackPanel VerticalAlignment="Center" Margin="0,8,0,8" Grid.Row="1" Grid.Column="1" Orientation="Horizontal"> <StackPanel VerticalAlignment="Center" Margin="0,8,0,8" Grid.Row="1" Grid.Column="1" Orientation="Horizontal">
<TextBlock Foreground="#969696" VerticalAlignment="Center" Text="起始步骤:"/> <TextBlock Foreground="#969696" VerticalAlignment="Center" Text="起始步骤:"/>
<TextBox VerticalAlignment="Bottom" Width="40" <TextBox VerticalAlignment="Center" Width="40" Margin="0,0,5,0"
Text="{Binding txtStarindex, UpdateSourceTrigger=PropertyChanged}"/> Text="{Binding txtStarindex, UpdateSourceTrigger=PropertyChanged}"/>
<TextBlock Foreground="#969696" VerticalAlignment="Center" Text="截止:"/> <TextBlock Foreground="#969696" VerticalAlignment="Center" Text="截止:"/>
<TextBox VerticalAlignment="Bottom" Width="40" <TextBox VerticalAlignment="Center" Width="40" Margin="0,0,5,0"
Text="{Binding txtendindex, UpdateSourceTrigger=PropertyChanged}"/> Text="{Binding txtendindex, UpdateSourceTrigger=PropertyChanged}"/>
<CheckBox Content="飞机位置" Grid.Column="1" Margin="0,8,0,8" Foreground="#969696"
IsChecked="{Binding isimpCopterLoc}" />
</StackPanel> </StackPanel>
<Button BorderThickness="1" BorderBrush="#FFFFFF" Content="导入分组信息" Margin="25,8,0,8" Grid.Row="2" <Button BorderThickness="1" BorderBrush="#FFFFFF" Content="导入分组信息" Margin="25,8,0,8" Grid.Row="2"
Command="{Binding ImportGroupCommand}"/> Command="{Binding ImportGroupCommand}"/>

View File

@ -17,6 +17,7 @@ using Plane.Geography;
using Plane.FormationCreator.Views; using Plane.FormationCreator.Views;
using System.Windows; using System.Windows;
using Plane.Collections; using Plane.Collections;
using Plane.Copters;
namespace Plane.FormationCreator.ViewModels namespace Plane.FormationCreator.ViewModels
{ {
@ -297,6 +298,22 @@ namespace Plane.FormationCreator.ViewModels
set { Set(nameof(OnlyImpotWaypointS), ref _OnlyImpotWaypointS, value); } set { Set(nameof(OnlyImpotWaypointS), ref _OnlyImpotWaypointS, value); }
} }
//导入飞机的位置
private bool _isimpCopterLoc =true;
public bool isimpCopterLoc
{
get { return _isimpCopterLoc; }
set { Set(nameof(isimpCopterLoc), ref _isimpCopterLoc, value); }
}
//导出飞机和航点等
private ICommand _ExportTasksCommand; private ICommand _ExportTasksCommand;
public ICommand ExportTasksCommand public ICommand ExportTasksCommand
{ {
@ -309,7 +326,7 @@ namespace Plane.FormationCreator.ViewModels
Alert.Show("作为参照的原点未设置,无法导出相对位置!", "提示"); Alert.Show("作为参照的原点未设置,无法导出相对位置!", "提示");
return; return;
} }
bool isToMeter = false;
var dialog = new SaveFileDialog var dialog = new SaveFileDialog
{ {
DefaultExt = "fcgm", DefaultExt = "fcgm",
@ -319,11 +336,16 @@ namespace Plane.FormationCreator.ViewModels
{ {
IEnumerable<object> taskObject; IEnumerable<object> taskObject;
string extension = Path.GetExtension(dialog.FileName); string extension = Path.GetExtension(dialog.FileName);
if (extension == ".fcgm") isToMeter = (extension == ".fcgm");
if (isToMeter)
taskObject = _flightTaskManager.ExportTasksToMeter(); taskObject = _flightTaskManager.ExportTasksToMeter();
else else
taskObject = _flightTaskManager.ExportTasks(); taskObject = _flightTaskManager.ExportTasks();
string exportedText; string exportedText;
if (OnlyImpotWaypointS) if (OnlyImpotWaypointS)
@ -333,11 +355,15 @@ namespace Plane.FormationCreator.ViewModels
else else
{ {
var groupObject = _groupManager.ExportGroups(); var groupObject = _groupManager.ExportGroups();
var locateObject = ExportLocate(); var locateObject = ExportLocate(isToMeter);
object obj = new object obj = new
{ {
ID="flycube.com",
ver = "2.0",
coptercount = _copterManager.Copters.Count,
taskcount = _flightTaskManager.Tasks.Count,
groups = groupObject, groups = groupObject,
locate = locateObject, locate = locateObject,
tasks = taskObject tasks = taskObject
@ -354,21 +380,41 @@ namespace Plane.FormationCreator.ViewModels
} }
} }
private List<object> ExportLocate() private List<object> ExportLocate(bool isToMeter)
{ {
List<object> locateList = new List<object>(); List<object> locateList = new List<object>();
foreach (var copter in _copterManager.Copters) foreach (var copter in _copterManager.Copters)
{ {
double[] locate = new double[3]; double[] locate = new double[3];
locate[0] = copter.Latitude - _flightTaskManager.OriginLat;
locate[1] = copter.Longitude - _flightTaskManager.OriginLng; if (isToMeter)
{
double x = GeographyUtils.CalcDistance(_flightTaskManager.OriginLat, _flightTaskManager.OriginLng, 0,
_flightTaskManager.OriginLat, copter.Longitude, 0);
if (copter.Longitude < _flightTaskManager.OriginLng) x = -x;
double y = GeographyUtils.CalcDistance(_flightTaskManager.OriginLat, _flightTaskManager.OriginLng, 0,
copter.Latitude, _flightTaskManager.OriginLng, 0);
if (copter.Latitude < _flightTaskManager.OriginLat) y = -y;
locate[0] = x;
locate[1] = y;
}
else
{
//为了和老版本兼容
locate[1] = copter.Longitude - _flightTaskManager.OriginLng;
locate[0] = copter.Latitude - _flightTaskManager.OriginLat;
}
locate[2] = copter.GroundAlt; locate[2] = copter.GroundAlt;
locateList.Add(locate); locateList.Add(locate);
} }
return locateList; return locateList;
} }
private int _txtStarindex = 0; private int _txtStarindex = 0;
public int txtStarindex public int txtStarindex
{ {
@ -383,6 +429,7 @@ namespace Plane.FormationCreator.ViewModels
set { Set(nameof(txtendindex), ref _txtendindex, value); } set { Set(nameof(txtendindex), ref _txtendindex, value); }
} }
//导入航点
private ICommand _ImportTasksCommand; private ICommand _ImportTasksCommand;
public ICommand ImportTasksCommand public ICommand ImportTasksCommand
{ {
@ -404,7 +451,8 @@ namespace Plane.FormationCreator.ViewModels
{ {
string extension = Path.GetExtension(dialog.FileName);
bool isMeter = extension == ".fcgm";
int _startindex = txtStarindex; int _startindex = txtStarindex;
int _endindex = txtendindex; int _endindex = txtendindex;
@ -414,10 +462,31 @@ namespace Plane.FormationCreator.ViewModels
dynamic taskinfo = null; dynamic taskinfo = null;
if (importInfo is Newtonsoft.Json.Linq.JObject) if (importInfo is Newtonsoft.Json.Linq.JObject)
{ {
int ? filecoptercount = importInfo.coptercount;
string ver = importInfo.ver;
string ID = importInfo.ID;
if ((ID!=null)&&(ID!="flycube.com"))
{
Alert.Show($"文件格式不正确", "提示");
return;
}
if ((filecoptercount != null)&&(filecoptercount != _copterManager.Copters.Count ))
{
Alert.Show($"导入的飞机数量不符!导入飞机{filecoptercount},实际飞机{ _copterManager.Copters.Count}", "提示");
return;
}
taskinfo = importInfo.tasks; taskinfo = importInfo.tasks;
if (importInfo.locate != null) if (importInfo.locate != null)
{ {
ImportCoptersLocate(importInfo.locate); //老版本无论是fcgm还是fcg格式这个地方都存的经纬差新版fcgm才用米为单位保存
if ((ver != null) && (ver == "2.0"))
ImportCoptersLocate(importInfo.locate, isMeter);
else
ImportCoptersLocate(importInfo.locate, false);
} }
if (importInfo.groups != null) if (importInfo.groups != null)
{ {
@ -431,8 +500,7 @@ namespace Plane.FormationCreator.ViewModels
//int task Newtonsoft.Json.Linq.JArray //int task Newtonsoft.Json.Linq.JArray
string extension = Path.GetExtension(dialog.FileName);
bool isMeter = extension == ".fcgm";
if ((txtStarindex == 0) && (txtendindex == 0)) if ((txtStarindex == 0) && (txtendindex == 0))
@ -525,16 +593,54 @@ namespace Plane.FormationCreator.ViewModels
})); }));
} }
} }
private void ImportCoptersLocate(dynamic coptersLocate) private void ImportCoptersLocate(dynamic coptersLocate,bool isMeter)
{ {
//if (Newtonsoft.Json.Linq.JArray) //if (Newtonsoft.Json.Linq.JArray)
try try
{ {
int index = 0; int index = 0;
bool loadxyLocate = isimpCopterLoc;
foreach (var locate in coptersLocate) foreach (var locate in coptersLocate)
{ {
_copterManager.Copters[index].GroundAlt = Convert.ToSingle(locate[2]); _copterManager.Copters[index].GroundAlt = Convert.ToSingle(locate[2]);
//虚拟飞机将读入保存时的位置
if (loadxyLocate&&(_copterManager.Copters[index] is FakeCopter))
{
var fc = _copterManager.Copters[index] as FakeCopter;
if (isMeter)
{
Tuple<double, double> observationLatLng = null;
observationLatLng = GeographyUtils.CalcLatLngSomeMetersAway2D(
_flightTaskManager.OriginLat,
_flightTaskManager.OriginLng,
90,
Convert.ToSingle(locate[0]));
double TargetLng = observationLatLng.Item2;
observationLatLng = GeographyUtils.CalcLatLngSomeMetersAway2D(
_flightTaskManager.OriginLat,
_flightTaskManager.OriginLng,
0,
Convert.ToSingle(locate[1]));
double TargetLat = observationLatLng.Item1;
fc.SetProperties(
latitude: TargetLat,
longitude: TargetLng
);
}else
{
double TargetLng = _flightTaskManager.OriginLng + Convert.ToSingle(locate[1]);
double TargetLat = _flightTaskManager.OriginLat + Convert.ToSingle(locate[0]);
fc.SetProperties(
latitude:TargetLat,
longitude: TargetLng
);
}
}
index++; index++;
} }

View File

@ -1774,7 +1774,8 @@ public ICommand VerticlAlignmentCommand
{ {
float CopterDirection =90- (float)BeltDirection ; float CopterDirection =90- (float)BeltDirection ;
if (_copterManager.SelectedCopters.Count() <= 0) //必须大于1架
if (_copterManager.SelectedCopters.Count() <= 1)
return; return;
//旋转飞机矩阵 //旋转飞机矩阵
@ -1893,7 +1894,8 @@ public ICommand VerticlAlignmentCommand
{ {
return _SetStrokesLampCommamd ?? (_SetStrokesLampCommamd = new RelayCommand(async () => return _SetStrokesLampCommamd ?? (_SetStrokesLampCommamd = new RelayCommand(async () =>
{ {
if (_copterManager.SelectedCopters.Count() <= 0) //必须大于1架
if (_copterManager.SelectedCopters.Count() <= 1)
return; return;
@ -1949,7 +1951,7 @@ public ICommand VerticlAlignmentCommand
#region #region
private double _GradientRampTime = 10; private double _GradientRampTime = 1;
public double GradientRampTime public double GradientRampTime
{ {
get { return _GradientRampTime; } get { return _GradientRampTime; }
@ -2106,8 +2108,12 @@ public ICommand VerticlAlignmentCommand
LEDInfo endLed = new LEDInfo(); LEDInfo endLed = new LEDInfo();
endLed.LEDMode = 0; endLed.LEDMode = 0;
endLed.Delay = AlignmentTime - leddelay; endLed.Delay = AlignmentTime - leddelay;
endLed.LEDRGB = copterInfo.LEDInfos[copterInfo.LEDInfos.Count - 1].LEDRGB; if (copterInfo.LEDInfos.Count > 0)
copterInfo.AddLEDInfo(endLed); endLed.LEDRGB = copterInfo.LEDInfos[copterInfo.LEDInfos.Count - 1].LEDRGB;
else
endLed.LEDRGB = "FFFFFF";
copterInfo.AddLEDInfo(endLed);
} }
} }
})); }));
@ -2131,8 +2137,8 @@ public ICommand VerticlAlignmentCommand
{ {
float CopterDirection = 90 - (float)GradualDirection; float CopterDirection = 90 - (float)GradualDirection;
//渐变需要2架以上
if (_copterManager.SelectedCopters.Count() <= 0) if (_copterManager.SelectedCopters.Count() <= 1)
return; return;
//旋转飞机矩阵 //旋转飞机矩阵
@ -2184,9 +2190,22 @@ public ICommand VerticlAlignmentCommand
LEDInfo led = new LEDInfo(); LEDInfo led = new LEDInfo();
led.LEDMode = 0; led.LEDMode = 0;
led.Delay = GradientRampTime; led.Delay = GradientRampTime;
led.LEDRGB = "000000";
//led.LEDRGB = Convert.ToString(R, 16) + Convert.ToString(G, 16) + Convert.ToString(B, 16); //led.LEDRGB = Convert.ToString(R, 16) + Convert.ToString(G, 16) + Convert.ToString(B, 16);
led.LEDRGB = R.ToString("X2") + G.ToString("X2") + B.ToString("X2");
try
{
led.LEDRGB = R.ToString("X2") + G.ToString("X2") + B.ToString("X2");
}
catch (Exception)
{
//throw;
}
copterInfo.AddLEDInfo(led); copterInfo.AddLEDInfo(led);
} }