方便批量编辑航点

[MainWindow.xaml.cs]增加键盘wsad调整多个选中航点
[CopterListViewModel.cs]增加多个航点编辑的对齐和均分按钮,目前支持0度和90度(水平和垂直),以后考虑任意角度
[CopterListView.xaml]增加按钮的界面
This commit is contained in:
pxzleo 2017-03-12 03:55:43 +08:00
parent fda55a6e45
commit 09126211a1
3 changed files with 333 additions and 5 deletions

View File

@ -42,7 +42,7 @@ namespace Plane.FormationCreator
}
private CopterManager _copterManager = ServiceLocator.Current.GetInstance<CopterManager>();
private FlightTaskManager _flightTaskManager= ServiceLocator.Current.GetInstance<FlightTaskManager>();
private void ShowConnectDialog(ConnectWindow loginWindow = null)
{
//var result = await this.ShowLoginAsync("登录", "请输入您的帐户 ID 和密码");
@ -104,6 +104,7 @@ namespace Plane.FormationCreator
bool isledon;
switch (e.Key)
{
//开关SHOWLED
case Key.C:
{
@ -121,6 +122,32 @@ namespace Plane.FormationCreator
case Key.W:
case Key.S:
{
if (_flightTaskManager.CurrentRunningTask==null )
{
var selectedCopter = _copterManager.SelectedCopters.FirstOrDefault();
bool copterisselect;
for (int i = 0; i < _flightTaskManager.SelectedTask.SingleCopterInfos.Count; i++)
{
copterisselect = false;
selectedCopter = _flightTaskManager.SelectedTask.SingleCopterInfos[i].Copter;
foreach (var capter in _copterManager.SelectedCopters)
{
if (capter == selectedCopter)
copterisselect = true;
}
if (copterisselect)
{
_flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLat+= e.Key == Key.W ? 0.00001 : -0.00001;
}
}
break;
}
var copters = _copterManager.AcceptingControlCopters;
await Task.WhenAll(copters.Select(async copter =>
{
@ -139,6 +166,47 @@ namespace Plane.FormationCreator
case Key.A:
case Key.D:
{
if (_flightTaskManager.CurrentRunningTask == null)
{
var selectedCopter = _copterManager.SelectedCopters.FirstOrDefault();
bool copterisselect;
for (int i = 0; i < _flightTaskManager.SelectedTask.SingleCopterInfos.Count; i++)
{
copterisselect = false;
selectedCopter = _flightTaskManager.SelectedTask.SingleCopterInfos[i].Copter;
foreach (var capter in _copterManager.SelectedCopters)
{
if (capter == selectedCopter)
copterisselect = true;
}
if (copterisselect)
{
_flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLng += e.Key == Key.D ? 0.00001 : -0.00001;
}
}
break;
}
var copters = _copterManager.AcceptingControlCopters;
await Task.WhenAll(copters.Select(async copter =>
{

View File

@ -46,11 +46,11 @@ namespace Plane.FormationCreator.ViewModels
{
get
{
return _AddVirtualCopterCommand ?? (_AddVirtualCopterCommand = new RelayCommand<int>(async count =>
return _AddVirtualCopterCommand ?? (_AddVirtualCopterCommand = new RelayCommand<int>(async addcount =>
{
var center = _mapManager.Center;
string id;
for (int i = 0; i < count; ++i, ++_virtualCopterId)
for (int i = 0; i < addcount; ++i, ++_virtualCopterId)
{
id = _virtualCopterId.ToString();
_lastVirtualCopterLocation =
@ -96,5 +96,251 @@ namespace Plane.FormationCreator.ViewModels
}));
}
}
private ICommand _AverageCommand;
public ICommand AverageCommand
{
get
{
return _AverageCommand ?? (_AverageCommand = new RelayCommand<int>(async alignmentLine =>
{
double maxlat = 0;
double tlat = 0;
double minlat = 0;
double maxlng = 0;
double minlng = 0;
double tlng = 0;
double avgl=0;
if (alignmentLine == 0)
{
var selectedCopter = _copterManager.SelectedCopters.FirstOrDefault();
bool copterisselect;
int selectednumber = _copterManager.SelectedCopters.Count()-1;
for (int i = 0; i < _flightTaskManager.SelectedTask.SingleCopterInfos.Count; i++)
{
copterisselect = false;
selectedCopter = _flightTaskManager.SelectedTask.SingleCopterInfos[i].Copter;
foreach (var capter in _copterManager.SelectedCopters)
{
if (capter == selectedCopter)
copterisselect = true;
}
if (copterisselect)
{
tlng = _flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLng;
if (minlng == 0)
minlng = tlng;
if (tlng > maxlng)
maxlng = tlng;
else if (tlng < minlng)
minlng = tlng;
}
}
avgl = (maxlng - minlng) / selectednumber;
int coptnum = 0;
for (int i = 0; i < _flightTaskManager.SelectedTask.SingleCopterInfos.Count; i++)
{
copterisselect = false;
selectedCopter = _flightTaskManager.SelectedTask.SingleCopterInfos[i].Copter;
foreach (var capter in _copterManager.SelectedCopters)
{
if (capter == selectedCopter)
copterisselect = true;
}
if (copterisselect)
{
_flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLng= minlng+ avgl*coptnum;
coptnum++;
}
}
}
if (alignmentLine == 90)
{
var selectedCopter = _copterManager.SelectedCopters.FirstOrDefault();
bool copterisselect;
int selectednumber = _copterManager.SelectedCopters.Count() - 1;
for (int i = 0; i < _flightTaskManager.SelectedTask.SingleCopterInfos.Count; i++)
{
copterisselect = false;
selectedCopter = _flightTaskManager.SelectedTask.SingleCopterInfos[i].Copter;
foreach (var capter in _copterManager.SelectedCopters)
{
if (capter == selectedCopter)
copterisselect = true;
}
if (copterisselect)
{
tlat = _flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLat;
if (minlat == 0)
minlat = tlat;
if (tlat > maxlat)
maxlat = tlat;
else if (tlat < minlat)
minlat = tlat;
}
}
avgl = (maxlat - minlat) / selectednumber;
int coptnum = 0;
for (int i = 0; i < _flightTaskManager.SelectedTask.SingleCopterInfos.Count; i++)
{
copterisselect = false;
selectedCopter = _flightTaskManager.SelectedTask.SingleCopterInfos[i].Copter;
foreach (var capter in _copterManager.SelectedCopters)
{
if (capter == selectedCopter)
copterisselect = true;
}
if (copterisselect)
{
_flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLat = minlat + avgl * coptnum;
coptnum++;
}
}
}
await Task.Delay(100); // 如果不等待一段时间,很可能会再触发 DataStreamReceived 事件导致飞行器重新出现在地图上。
}));
}
}
private ICommand _AlignmentCommand;
public ICommand AlignmentCommand
{
get
{
return _AlignmentCommand ?? (_AlignmentCommand = new RelayCommand<int>(async alignmentLine =>
{
double maxlat = 0;
double tlat = 0;
double maxlng = 0;
double tlng = 0;
if (alignmentLine == 0)
{
var selectedCopter = _copterManager.SelectedCopters.FirstOrDefault();
bool copterisselect;
for (int i = 0; i < _flightTaskManager.SelectedTask.SingleCopterInfos.Count; i++)
{
copterisselect = false;
selectedCopter = _flightTaskManager.SelectedTask.SingleCopterInfos[i].Copter;
foreach (var capter in _copterManager.SelectedCopters)
{
if (capter == selectedCopter)
copterisselect = true;
}
if (copterisselect)
{
tlat = _flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLat;
if (tlat > maxlat)
maxlat = tlat;
}
}
for (int i = 0; i < _flightTaskManager.SelectedTask.SingleCopterInfos.Count; i++)
{
copterisselect = false;
selectedCopter = _flightTaskManager.SelectedTask.SingleCopterInfos[i].Copter;
foreach (var capter in _copterManager.SelectedCopters)
{
if (capter == selectedCopter)
copterisselect = true;
}
if (copterisselect)
{
_flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLat = maxlat;
}
}
}
if (alignmentLine == 90)
{
var selectedCopter = _copterManager.SelectedCopters.FirstOrDefault();
bool copterisselect;
for (int i = 0; i < _flightTaskManager.SelectedTask.SingleCopterInfos.Count; i++)
{
copterisselect = false;
selectedCopter = _flightTaskManager.SelectedTask.SingleCopterInfos[i].Copter;
foreach (var capter in _copterManager.SelectedCopters)
{
if (capter == selectedCopter)
copterisselect = true;
}
if (copterisselect)
{
tlng = _flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLng;
if (tlng > maxlng)
maxlng = tlng;
}
}
for (int i = 0; i < _flightTaskManager.SelectedTask.SingleCopterInfos.Count; i++)
{
copterisselect = false;
selectedCopter = _flightTaskManager.SelectedTask.SingleCopterInfos[i].Copter;
foreach (var capter in _copterManager.SelectedCopters)
{
if (capter == selectedCopter)
copterisselect = true;
}
if (copterisselect)
{
_flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLng = maxlng;
}
}
}
await Task.Delay(100); // 如果不等待一段时间,很可能会再触发 DataStreamReceived 事件导致飞行器重新出现在地图上。
}));
}
}
}
}

View File

@ -55,16 +55,30 @@
<StackPanel Grid.Row="1"
Orientation="Horizontal">
<TextBox x:Name="txtVirtualCopterCount"
Width="100"
Width="35"
Margin="0,0,5,0"
Text="3"
VerticalContentAlignment="Center" />
<Button Content="添加虚拟飞行器"
<Button Content="添加虚拟"
VerticalContentAlignment="Center"
Command="{Binding AddVirtualCopterCommand}"
CommandParameter="{Binding ElementName=txtVirtualCopterCount, Path=Text}" />
<Button Content="清除"
Command="{Binding ClearCoptersCommand}" />
<TextBox x:Name="txtAlignmentLine"
Width="30"
Margin="0,0,5,0"
Text="0"
VerticalContentAlignment="Center" />
<Button Content="对齐"
Command="{Binding AlignmentCommand}"
CommandParameter="{Binding ElementName=txtAlignmentLine, Path=Text}"/>
<Button Content="均分"
Command="{Binding AverageCommand}"
CommandParameter="{Binding ElementName=txtAlignmentLine, Path=Text}"/>
</StackPanel>
</Grid>