using Hydro.MapView; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Drawing.Imaging; using System.Linq; using System.Runtime.CompilerServices; using System.Security.Policy; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using static Hydro.MapView.MapViewEnum; using Hydro.MapView.Common; using DevExpress.XtraEditors; using System.Threading; namespace Hydro.MapUI { public partial class PropertyForm : UserControl { private IBaseViewModel _selectedObject; private MapObjectType _selectedType= MapObjectType.全部; private List selectionSets; public SelectionSet selectionSet=new SelectionSet(); private Form fr = null; public PropertyForm() { InitializeComponent(); } public void SetEnabled(bool isReadOnly) { _isEnable = isReadOnly; } public void SetWindows(Form mg) { if (mg.WindowState == FormWindowState.Maximized) { //this.StartPosition = FormStartPosition.Manual; //设置窗体位置由程序控制 this.Height = mg.Height-50; this.Location = new Point(mg.Left + mg.Width -this.Width, mg.Top+50); //设置新窗体位置,当前窗体的右侧(X轴方向) } else { //this.StartPosition = FormStartPosition.Manual; //设置窗体位置由程序控制 this.Height = mg.Height; this.Location = new Point(mg.Left + mg.Width - 15, mg.Top); //设置新窗体位置,当前窗体的右侧(X轴方向) } fr = mg; //GlobalObject.PropertyForm.Show(); } public Form GetWindow() { return this.fr; } public void SetObj(object o) { propertyGrid.SelectedObject = o; this.Text= o.GetType().Name; } public void SetObj(IBaseViewModel selectedObject) { _selectedObject = selectedObject; if (_selectedObject is JunctionViewModel junc) { _selectedType = MapObjectType.节点; propertyGrid.SelectedObject = junc; } else if (_selectedObject is ReservoirViewModel reser) { _selectedType = MapObjectType.水池; propertyGrid.SelectedObject = reser; } else if (_selectedObject is TankViewModel tank) { _selectedType = MapObjectType.水池; propertyGrid.SelectedObject =tank; } else if (_selectedObject is PipeViewModel pipe) { _selectedType = MapObjectType.管线; propertyGrid.SelectedObject = pipe; } else if (_selectedObject is RepeaterViewModel repeater) { _selectedType = MapObjectType.重复器; propertyGrid.SelectedObject = repeater; } else if (_selectedObject is ValveViewModel valve) { _selectedType = MapObjectType.水池; propertyGrid.SelectedObject = valve; } else { _selectedType = MapObjectType.全部; propertyGrid.SelectedObject = selectedObject; } switch (_selectedType) { case MapObjectType.节点: Text = "节点 Properties"; break; case MapObjectType.水库: Text = "水库 Properties"; break; case MapObjectType.水池: Text = "水池 Properties"; break; case MapObjectType.管线: Text = "管线 Properties"; break; case MapObjectType.阀门: Text = "阀门 Properties"; break; case MapObjectType.重复器: Text = "重复器 Properties"; break; } } public void SetNet(MapViewNetWork net) { selectionSet.net = net; } public void SetObjs(List selectedObjects) { if (selectedObjects == null) return; selectedObjects.RemoveAll(obj => obj == null); selectedObjects.ForEach(obj => { if (obj.Tags==null) { obj.Tags = new TagList(); } }); selectionSet.selectedObjects = selectedObjects.ToList(); if (selectedObjects.Count ==1) SetObj(selectedObjects[0]); else ShowProperties(selectedObjects); if (selectionSet.OnlyViewSelected) RefreshListBox(); } private void PropertyForm_Load_1(object sender, EventArgs e) { foreach (var item in Enum.GetValues(typeof(MapObjectType))) { //comboBox_type.Properties.Items.Add(item); } //comboBox_type.SelectedIndex = 0; selectionSets = new List(); selectionSet = new SelectionSet(); //listBox1.DataSource = selectionSet.View; //listBox1.DisplayMember = "IDType"; } private void comboBox_type_SelectedIndexChanged(object sender, EventArgs e) { RefreshListBox(); } void RefreshListBox() { if (selectionSet == null) return; //string txt = comboBox_type.SelectedItem.ToString(); //MapObjectType selectedType = (MapObjectType)Enum.Parse(typeof(MapObjectType), txt); // 使用 LINQ 查询筛选选择集 //selectionSet.filterType = selectedType; //selectionSet.FilterString = textBox_search.Text; //listBox1.SelectedIndexChanged -= listBox1_SelectedIndexChanged; //listBox1.DisplayMember = "ID"; //// 重新绑定选择集列表 //listBox1.DataSource = selectionSet.View; //listBox1.DataSource = null; //listBox1.DisplayMember = "IDType"; //listBox1.DataSource = selectionSet.View; //listBox1.SelectedIndexChanged += listBox1_SelectedIndexChanged; } private void listBox1_SelectedIndexChanged(object sender, EventArgs e) { //if (listBox1.SelectedItems.Count == 0) //{ // return; //} //else if (listBox1.SelectedItems.Count == 1) //{ // var objID = listBox1.SelectedItems[0]; // var findlist = selectionSet.net.MapObjects.FindAll(o => o.ID == objID); // if (findlist.Count <= 0) return; // IBaseViewModel mapObject = findlist[0];// selectionSet.selectedObjects.Find(obj => obj.ID == ((MapObject)listBox1.SelectedItems[0]).ID); // if (mapObject != null) SetObj(mapObject); // GlobalObject.map.selectedObjs.ForEach(o => o.Selected = false); ; // GlobalObject.map.selectedObjs.Clear(); // GlobalObject.map.selectedObjs.Add(mapObject); // mapObject.Selected = true; // GlobalObject.map.SetInvalidated(); //} //else //{ // List list = new List(); // foreach (var o in listBox1.SelectedItems) // { // var objID = listBox1.SelectedItems[0]; // IBaseViewModel mapObject = selectionSet.net.MapObjects.FindAll(obj => obj.ID == objID)[0]; // list.Add(mapObject); // } // ShowProperties(list); // GlobalObject.map.selectedObjs.ForEach(o => o.Selected = false); ; // GlobalObject.map.selectedObjs.Clear(); // list.ForEach(o => o.Selected = true); // GlobalObject.map.selectedObjs.AddRange(list); // GlobalObject.map.SetInvalidated(); //} } private void listBox1_DoubleClick(object sender, EventArgs e) { //if (listBox1.SelectedItems.Count == 1) //{ // //IBaseViewModel mapObject = (IBaseViewModel)listBox1.SelectedItems[0]; // var objID = listBox1.SelectedItems[0]; // IBaseViewModel mapObject = selectionSet.net.MapObjects.FindAll(obj => obj.ID == objID)[0]; // GlobalObject.map.setCenter (mapObject); // GlobalObject.map.SetInvalidated(); //} } private void PropertyForm_FormClosing(object sender, FormClosingEventArgs e) { e.Cancel = true; this.Hide(); } bool _isEnable = true; private static Dictionary> _selectedObjectsDict = new Dictionary>(); private void propertyGrid_PropertyValueChanged(object s, PropertyValueChangedEventArgs e) { //foreach (var item in listBox1.SelectedItems) //{ // var mapObject = selectionSet.selectedObjects.Find(obj => obj.ID == ((MapObject)item).ID); // if (e.ChangedItem.Label == " 批次编号 ") // { // mapObject.Level = (int)e.ChangedItem.Value; // } //} if (!_isEnable) { MessageBox.Show("当前状态的修改将不会被保存","重复器展开中"); _isEnable = true; } //object firstObj = selectionSet.selectedObjects.First(); //if (_selectedObjectsDict[firstObj].Contains(e.ChangedItem.Label)) //{ // foreach (var obj in selectionSet.selectedObjects) // { // var props = TypeDescriptor.GetProperties(obj); // foreach (PropertyDescriptor prop in props) // { // if (prop.Name == e.ChangedItem.Label) // { // prop.SetValue(obj, e.ChangedItem.Value); // break; // } // } // } //} GlobalObject.map.SetMapInvalidate(); } public void ShowProperties(IEnumerable selectedObjects) { IBaseViewModel[] objs = null; try { if (selectedObjects!=null) objs= selectedObjects.ToArray(); } catch { return; } propertyGrid.SelectedObjects = objs; } private void textBox_search_TextChanged(object sender, EventArgs e) { RefreshListBox(); } private void checkBox_OnlyShowSelected_CheckedChanged(object sender, EventArgs e) { //selectionSet.OnlyViewSelected = checkBox_OnlyShowSelected.Checked; RefreshListBox(); } private void label_lock_Click(object sender, EventArgs e) { var label_lock = (LabelControl)sender; GlobalObject.LockSelect=!GlobalObject.LockSelect; if (GlobalObject.LockSelect) { label_lock.BackColor = Color.Blue; label_lock.Text = "🔒"; } else { label_lock.BackColor = Color.Green; label_lock.Text = "🔓"; } } private void label_filter_Click(object sender, EventArgs e) { var label_lock = (LabelControl)sender; TagList tags = new TagList(); foreach (var item in selectionSet.selectedObjects) { tags.AddRange(item.Tags); } var t = tags.Distinct().ToList(); tags.Clear(); tags.AddRange(t); var form = new FormFilter(tags); if (form.ShowDialog() == DialogResult.OK) { selectionSet.FilterTags = form.Tags; selectionSet.rules = form.rules; GlobalObject.ApplyFilter=selectionSet.FilterTags.Count > 0 || selectionSet.rules.Count > 0; if (GlobalObject.ApplyFilter) { label_lock.BackColor = Color.Blue; label_lock.Text = "⏬"; } else { label_lock.BackColor = Color.Green; label_lock.Text = "🔽"; } RefreshListBox(); } } private void PropertyForm_KeyDown(object sender, KeyEventArgs e) { //Ctrl+A,则选中当前listbox中的所有项 if (e.Control && e.KeyCode == Keys.A) { //for (int i = 0; i < listBox1.Items.Count; i++) //{ // listBox1.SetSelected(i, true); //} } } private void 全选ToolStripMenuItem_Click(object sender, EventArgs e) { //listBox1.SelectedIndexChanged -= listBox1_SelectedIndexChanged; //for (int i = 0; i < listBox1.Items.Count; i++) //{ // listBox1.SetSelected(i, true); //} //listBox1.SelectedIndexChanged += listBox1_SelectedIndexChanged; //this.propertyGrid.SelectedObjects =selectionSet. CurrentSelectedObjects?.ToArray(); //GlobalObject.map.selectedObjs.ForEach(o => o.Selected = false); //if (selectionSet.CurrentSelectedObjects!=null) //{ // GlobalObject.map.selectedObjs.AddRange(selectionSet.CurrentSelectedObjects); // selectionSet.CurrentSelectedObjects.ForEach(o => // { // o.Selected = true; // }); //} //GlobalObject.map.Invalidate(); } private void listBox1_MouseDown(object sender, MouseEventArgs e) { //if (e.Button == MouseButtons.Right) //{ // if (listBox1.SelectedItems.Count > 0) // { // contextMenuStrip1.Show(listBox1, e.Location); // } //} } } public class SelectionSet { public string Name; public MapObjectType filterType=MapObjectType.全部; public string FilterString { get; set; } = ""; public TagList FilterTags { get; set; } = new TagList(); public List> rules = new List>(); public List FilterTypes = new List(); public MapViewNetWork net { get; set; } = null; public bool OnlyViewSelected { get; set; } = true; public List selectedObjects=new List(); public List CurrentSelectedObjects=new List(); public List View { get { List originList; List list; List list_result=new List(); if (!OnlyViewSelected && net != null) { originList = net.MapObjects; } else { originList = selectedObjects; } if (filterType == MapObjectType.全部) { list = originList; } else { var filteredSets = from obj in originList where obj.GetType() == filterType.GetObjType() select obj; list = filteredSets?.ToList(); } if (FilterString!=null && FilterString!="") { list = list?.FindAll(o => o.ID.IndexOf(FilterString) >= 0); } if (FilterTags.Count>0)//使用表达式,对结果进行筛选 { foreach (var tag in FilterTags) { var filteredSets = from obj in list where obj.Tags.Contains(tag) select obj; list = filteredSets?.ToList(); } } if(rules.Count>0) { foreach (var rule in rules) { var filteredSets = from obj in list where rule(obj) select obj; list = filteredSets?.ToList(); } } CurrentSelectedObjects = list; list_result = list.Select(o => o.ID).ToList(); return list_result; } } } }