using DevExpress.Xpo; using DevExpress.XtraBars; using DevExpress.XtraEditors.Controls; using Ips.Library.Basic; using Ips.Library.Entity; using Ips.Sps.Emts; using Ips.Sps.IfeScans; using Ips.Sps.Maps; using Ips.Sps.Sats; using Ips.Sps.Tsks; using System.Data; namespace Ips.Sps.Sigs { public partial class SigListCtrl : DevExpress.XtraEditors.XtraUserControl { public SigListCtrl() { InitializeComponent(); } public string CtrlCaption { get => txtListCaption.Caption; set => txtListCaption.Caption = value; } private SignalCategory? SigCategory { get; set; } = null; private SignalType? SigType { get; set; } = null; private bool ShowEditBar { get; set; } = true; private bool ShowScanFreq { get; set; } = false; private IList SatList { get; set; } private IList EmtList { get; set; } private XPBaseCollection sigList { get; set; } private Session _session { get; set; } private string _defaultMainSatText, _defaultMainAdjaSatText; private TskAdCard _adCard; private List _adSatList { get { if (_adCard != null) { var adSatIds = _adCard.Channels.SelectMany(m => m.GetSatIds()).ToList(); var adSatList = SatList.Where(m => adSatIds.Contains(m.Oid)).ToList(); return adSatList; } return null; } } private int? _defaultMainSatId { get { if (_adCard != null && _adCard.Channels.IsNotNullOrEmpty() && _adSatList != null) { var satId = _adCard.Channels.OrderBy(m => m.ChNum).First().GetSatIds().FirstOrDefault(); return satId == 0 ? null : satId; } return null; } } private void grdSigList_Load(object sender, EventArgs e) { } public void SetSigProperties(SignalCategory? sigCategory, SignalType? sigType, bool showEditBar, bool showScanFreq, IList sats, IList emts) { SigCategory = sigCategory; SigType = sigType; ShowEditBar = showEditBar; ShowScanFreq = showScanFreq; SatList = sats; EmtList = emts; InitCtrl(); } public void SetDataSource(XPBaseCollection sigList) { _session = sigList.Session; this.sigList = sigList; bsSigList.DataSource = sigList; InitCtrl(); } public void SetAdCardInfo(TskAdCard adCard) { _adCard = adCard; } public void SetDefaultSatText(string mainSatText, string adjaSatsText) { mainSatEdit.NullText = _defaultMainSatText = mainSatText; adjaSatEdit.NullText = _defaultMainAdjaSatText = adjaSatsText; } private void InitCtrl() { btnScanAdd.Visibility = ShowScanFreq ? BarItemVisibility.Always : BarItemVisibility.Never; barSigEdit.Visible = ShowEditBar; gvSigList.OptionsBehavior.Editable = ShowEditBar; bsEmtList.DataSource = EmtList; bsSatList.DataSource = SatList; colOid.Visible = false; colSigType.Visible = false; if (!SigCategory.HasValue) { colSigFreq.Visible = false; colFreqStart.Visible = false; colFreqEnd.Visible = false; colFreqStep.Visible = false; } else { colSigCategory.Visible = false; colRemark.Visible = !ShowEditBar; switch (SigCategory.Value) { case Library.Entity.SignalCategory.TarSig: case Library.Entity.SignalCategory.RefSig: colFreqStart.Visible = false; colFreqEnd.Visible = false; colFreqStep.Visible = false; colSigFreqText.Visible = false; break; case Library.Entity.SignalCategory.SctSig: colSigFreqText.Visible = false; colSigFreq.Visible = false; colEmtId.Visible = false; break; } } switch (SigType) { case SignalType.NORMAL: break; case SignalType.DAMA: colSigLen.Visible = false; colEmtId.Visible = false; break; } } private void btnImport_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { SigSelectForm form = new SigSelectForm(SigCategory, SigType); if (form.ShowDialog() != DialogResult.OK || form.SelectSigList.IsNullOrEmpty()) return; if (bsSigList.ObjectType == typeof(TskSignal)) { var tskSigList = bsSigList.DataSource as XPCollection; var selectSigList = form.SelectSigList.Select(m => { var tskSig = TskSignal.CreateFrom(m, _session); if (tskSig.AdjaSatIds.IsNotNullOrWhitespace()) { var adjaSatIds = tskSig.AdjaSatIds.Split(",").Where(m => m.IsNotNullOrWhitespace()).Select(m => int.Parse(m)); adjaSatIds = adjaSatIds.Where(m => SatList.Any(sat => sat.Oid == m)); tskSig.AdjaSatIds = adjaSatIds.JoinAsString(","); } if (!tskSig.MainSatId.HasValue || !SatList.Any(m => m.Oid == tskSig.MainSatId)) { tskSig.MainSatId = null; } tskSig.SigCategory = SigCategory ?? Library.Entity.SignalCategory.TarSig; return tskSig; }).ToList(); tskSigList?.AddRange(selectSigList); } else if (bsSigList.ObjectType == typeof(Signal)) { var sigList = bsSigList.DataSource as XPCollection; sigList?.AddRange(form.SelectSigList); } } private void btnAdd_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { gvSigList.AddNewRow(); } private void btnDelete_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { var selectRows = gvSigList.GetSelectedRows(); if (selectRows.Length > 0) { gvSigList.DeleteSelectedRows(); } else if (gvSigList.FocusedRowHandle >= 0) { gvSigList.DeleteRow(gvSigList.FocusedRowHandle); } } private void sigRangeButtonEdit_ButtonClick(object sender, ButtonPressedEventArgs e) { var sig = gvSigList.GetFocusedRow() as SignalBasic; if (sig == null) return; if (e.Button.Kind == ButtonPredefines.Clear) { sig.HasRange = false; } else if (e.Button.Kind == ButtonPredefines.Ellipsis) { MapRangeSelectForm selectForm = new MapRangeSelectForm(); if (sig.HasRange) { selectForm.SelectRange = new GeoRange(sig.SigLon, sig.SigLat, sig.SigAlt, sig.LonRange, sig.LatRange); } if (selectForm.ShowDialog() != DialogResult.OK) return; if (selectForm.SelectRange != null) { var range = selectForm.SelectRange; SetSigRange(sig, range); } else { sig.HasRange = false; } } } private void SetSigRange(SignalBasic sig, GeoRange range) { sig.SigLon = range.Lon; sig.SigLat = range.Lat; sig.SigAlt = range.Alt; sig.LonRange = range.LonRange; sig.LatRange = range.LatRange; sig.HasRange = true; } private void gvSigList_InitNewRow(object sender, DevExpress.XtraGrid.Views.Grid.InitNewRowEventArgs e) { if (SigCategory.HasValue) { gvSigList.SetRowCellValue(e.RowHandle, colSigCategory, SigCategory); } if (SigType.HasValue) { gvSigList.SetRowCellValue(e.RowHandle, colSigType, SigType); } if (_adCard != null) { var adSatIds = _adCard.Channels.SelectMany(m => m.GetSatIds()).ToList(); var adSatList = SatList.Where(m => adSatIds.Contains(m.Oid)).ToList(); if (adSatList.IsNotNullOrEmpty()) { mainSatEdit.DataSource = adSatList; adjaSatEdit.DataSource = adSatList; } var defaultChannel = _adCard.Channels.FirstOrDefault(m => m.SatIds.IsNotNullOrWhitespace()); if (defaultChannel != null) { var defaultSatId = defaultChannel.GetSatIds()[0]; gvSigList.SetRowCellValue(e.RowHandle, colMainSatId, defaultSatId); } } } private void emtLookUpEdit_EditValueChanged(object sender, EventArgs e) { var arg = e as ChangingEventArgs; if (arg == null || arg.NewValue == null) return; var emt = emtLookUpEdit.GetDataSourceRowByKeyValue(arg.NewValue) as Emt; if (emt != null && emt.EmtType == EmtType.FixSation) { var sig = gvSigList.GetFocusedRow() as SignalBasic; SetSigRange(sig, new GeoRange(emt.Lon, emt.Lat, emt.Alt, 3, 3)); } } private void btnScanAdd_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { var form = new IfeScanForm() { StartPosition = FormStartPosition.CenterScreen }; form.BindSatList(_adSatList ?? SatList, _defaultMainSatId); form.SetAdCardInfo(_adCard); if (form.ShowDialog() == DialogResult.OK) { foreach (var item in form.SelectedFreq) { var model = Activator.CreateInstance(bsSigList.ObjectType, sigList.Session) as SignalBasic; model.MainSatId = form.SatId; model.SigFreq = item.SigFreq; model.BandWidth = item.BandWidth; model.SigLen = 10; if (_adCard != null) { var adjaSatIds = _adCard.Channels.SelectMany(m => m.GetSatIds()).WhereIf(form.SatId.HasValue, m => m != form.SatId).Distinct(); model.AdjaSatIds = adjaSatIds.JoinAsString(","); } sigList.BaseAdd(model); } } } private void gvSigList_CustomColumnDisplayText(object sender, DevExpress.XtraGrid.Views.Base.CustomColumnDisplayTextEventArgs e) { if (e.Column == colAdjaSatIds) { if (e.DisplayText.IsNullOrWhitespace()) { e.DisplayText = _defaultMainAdjaSatText.IfNullOrWhitespace("自动匹配"); } } else if (e.Column == colMainSatId) { if (e.DisplayText.IsNullOrWhitespace()) e.DisplayText = _defaultMainSatText.IfNullOrWhitespace("无"); } } private void btnSetGR_ItemClick(object sender, ItemClickEventArgs e) { SetGREditForm editForm = new SetGREditForm(); editForm.ShowDialog(); } private void gvSigList_RowClick(object sender, DevExpress.XtraGrid.Views.Grid.RowClickEventArgs e) { //参考信号不添加干扰信号 if (SigCategory.HasValue && SigCategory.Value == SignalCategory.RefSig) return; if (e.Button == MouseButtons.Right && e.Clicks == 1) { popSigMenu.ShowPopup(Cursor.Position); } } } }