using Hydro.CommonBase; //using ConfigApp; using Hydro.MapView; //using DevExpress.XtraEditors; //using DevExpress.XtraGrid.Views.Base; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using static System.Windows.Forms.VisualStyles.VisualStyleElement; //using TRegion = Hydro.MapView.TRegion; namespace Hydro.MapUI { public partial class Form_EditFloors : Form { private List regions= new List(); private TRegion CurrentRegion { get { if (regions.Count == 0) { regions.Add(new TRegion()); UpdateRegionList(); } return regions[comboBox1.SelectedIndex]; } } private List floors { get { if (regions.Count == 0) { regions.Add(new TRegion()); UpdateRegionList(); } if (CurrentRegion != null) return CurrentRegion.Floors; return null; } set { if (regions.Count == 0) regions.Add(new TRegion()); regions[0].Floors = value; } } private Stack> undoStack; private Stack> redoStack; MapViewer map; public Form_EditFloors(List regions) { InitializeComponent(); //comboBox1.DataSource = this.regions; this.regions = regions; //floors = new List(); undoStack = new Stack>(); redoStack = new Stack>(); } private void Form_EditFloors_Load(object sender,EventArgs e) { UpdateRegionList(); lockEditing(false); this.FormBorderStyle = FormBorderStyle.FixedSingle; UpdateFloorList(); map = new MapViewer(); map.Location = new System.Drawing.Point(0, 0); //map.Size = new Size(500, 500); map.Dock = DockStyle.Fill; map.Lock2DView = true; //gen(); groupControl4.Controls.Add(map); //if (GlobalObject.PropertyForm == null) //{ // GlobalObject.PropertyForm = new PropertyForm(); // GlobalObject.PropertyForm.SetWindows(this); // GlobalObject.PropertyForm.Show(); //} if (GlobalObject.map == null) { GlobalObject.map = map; } } private void AddFloorButton_Click(object sender, EventArgs e) { Floor newFloor = new Floor(); newFloor.FloorIndex = floors.Count + 1; floors.Add(newFloor); UpdateFloorList(); FloorsListBox.SelectedItem = newFloor; //foreach (Floor f in FloorsListBox.Items) //{ // if (newFloor==f) // { // FloorsListBox.SelectedItem = newFloor; // break; // } //} } private void DeleteFloorButton_Click(object sender, EventArgs e) { if (FloorsListBox.SelectedIndex != -1) { int selectedIndex = FloorsListBox.SelectedIndex; Floor removedFloor = floors[selectedIndex]; floors.RemoveAt(selectedIndex); // Save the current state for undo undoStack.Push(new List(regions)); // Clear redo stack since a new operation is performed redoStack.Clear(); UpdateFloorList(); } } private void UpdateRegionList(string regionName=null) { comboBox1.Items.Clear(); foreach (TRegion region in regions) { comboBox1.Items.Add($"{region.Name}"); } if (comboBox1.Items.Count>0) { if (regionName==null) comboBox1.SelectedIndex = 0; else { comboBox1.SelectedIndex = comboBox1.Items.IndexOf(regionName); } } } private void UpdateFloorList() { FloorsListBox.Items.Clear(); foreach (Floor floor in floors) { FloorsListBox.Items.Add($"{floor.FloorIndex}楼"); } comboBox2.SelectedIndex=CurrentRegion.isDirectionUp ? 0 : 1; } private void UndoButton_Click(object sender, EventArgs e) { if (undoStack.Count > 0) { redoStack.Push(new List(regions)); regions = undoStack.Pop(); UpdateFloorList(); } } private void RedoButton_Click(object sender, EventArgs e) { if (redoStack.Count > 0) { undoStack.Push(new List(regions)); regions = redoStack.Pop(); UpdateFloorList(); } } private Floor copiedFloor; // 保存被复制的楼层 private void CopyFloorButton_Click(object sender, EventArgs e) { if (FloorsListBox.SelectedIndex != -1) { int selectedIndex = FloorsListBox.SelectedIndex; copiedFloor = new Floor(floors[selectedIndex]); } } private void PasteFloorButton_Click(object sender, EventArgs e) { if (copiedFloor != null) { floors.Add(new Floor(copiedFloor)); // Save the current state for undo undoStack.Push(new List(regions)); // Clear redo stack since a new operation is performed redoStack.Clear(); UpdateFloorList(); } } private void EditFloorButton_Click(object sender, EventArgs e) { if (FloorsListBox.SelectedIndex != -1) { lockEditing(); int selectedIndex = FloorsListBox.SelectedIndex; Floor selectedFloor = floors[selectedIndex]; // 显示并允许编辑楼层属性的组件 EditProperties(selectedFloor); } } private void lockEditing(bool state=true) { simpleButton4.Enabled = !state; FloorsListBox.Enabled = !state; SaveButton.Enabled = state; CancelButton.Enabled = state; simpleButton1.Enabled = state; FloorIndexTextBox.ReadOnly = !state; BackgroundImgTextBox.ReadOnly = !state; ElevTextBox.ReadOnly = !state; } private void FloorsListBox_Click(object sender, EventArgs e) { } private void EditProperties(Floor floor) { FloorIndexTextBox.Text = floor.FloorIndex.ToString(); BackgroundImgTextBox.Text = floor.TemplateID ?? ""; ElevTextBox.Text = floor.Elev.ToString(); //MapViewTextBox.Text = floor.MapView?.ToString() ?? ""; SaveButton.Visible = true; CancelButton.Visible = true; } private void SaveButton_Click(object sender, EventArgs e) { int selectedIndex = FloorsListBox.SelectedIndex; if (selectedIndex == -1 || selectedIndex >= floors.Count) return; Floor editedFloor = floors[selectedIndex]; //editedFloor.BackgroundImg = BackgroundImgTextBox.Text; editedFloor.TemplateID = BackgroundImgTextBox.Text; editedFloor.Elev = float.Parse(ElevTextBox.Text); //editedFloor.MapView = new MapDimensions(MapViewTextBox.Text); UpdateFloorList(); ClearProperties(); // Save the current state for undo undoStack.Push(new List(regions)); // Clear redo stack since a new operation is performed redoStack.Clear(); lockEditing(false); } private void SelectImageButton_Click(object sender, EventArgs e) { //OpenFileDialog openFileDialog = new OpenFileDialog(); //openFileDialog.Filter = "Image Files (*.jpg;*.jpeg;*.png;*.gif;*.bmp)|*.jpg;*.jpeg;*.png;*.gif;*.bmp"; //if (openFileDialog.ShowDialog() == DialogResult.OK) //{ // BackgroundImgTextBox.Text = openFileDialog.FileName; //} int selectedIndex = FloorsListBox.SelectedIndex; if (selectedIndex == -1 || selectedIndex >= floors.Count) return; Floor editedFloor = floors[selectedIndex]; 模板管理 fs = new 模板管理(true); if (fs.ShowDialog()==DialogResult.OK) { BackgroundImgTextBox.Text = fs.TemplateID; //editedFloor.TemplateID = fs.TemplateID; map.SetData(TemplateList.GetTemplate(fs.TemplateID)); } } private void CancelButton_Click(object sender, EventArgs e) { ClearProperties(); lockEditing(false); } private void ClearFloorsButton_Click(object sender, EventArgs e) { floors.Clear(); UpdateFloorList(); // Save the current state for undo undoStack.Push(new List(regions)); // Clear redo stack since a new operation is performed redoStack.Clear(); } private void ClearProperties() { FloorIndexTextBox.Text = ""; BackgroundImgTextBox.Text = ""; ElevTextBox.Text = ""; //MapViewTextBox.Text = ""; FloorIndexTextBox.Enabled = true; SaveButton.Visible = false; CancelButton.Visible = false; } private void 退出XToolStripMenuItem_Click(object sender, EventArgs e) { this.Close(); } private void GenerateFloorsButton_Click(object sender, EventArgs e) { // 隐藏错误标签 ErrorLabel.Visible = false; int minFloorIndex; int maxFloorIndex; float floorHeight; float minFloorElev; // 尝试解析文本框中的值 if (!int.TryParse(tb_minFloorIndex.Text, out minFloorIndex)) { ErrorLabel.Text = "最小层号必须是整数"; ErrorLabel.Visible = true; return; } if (!int.TryParse(tb_maxFloorIndex.Text, out maxFloorIndex)) { ErrorLabel.Text = "最大层号必须是整数"; ErrorLabel.Visible = true; return; } if (!float.TryParse(tb_Height.Text, out floorHeight)) { ErrorLabel.Text = "每层层高必须是数字"; ErrorLabel.Visible = true; return; } if (!float.TryParse(tb_minFloorElev.Text, out minFloorElev)) { ErrorLabel.Text = "最低层地面高程必须是数字"; ErrorLabel.Visible = true; return; } string tempID = BackgroundImgTextBox_q.Text; // 逐层生成楼层 for (int i = minFloorIndex; i <= maxFloorIndex; i++) { float floorElev = minFloorElev + (i - minFloorIndex) * floorHeight; Floor newFloor = new Floor(i, tempID, floorElev, null); floors.Add(newFloor); } // 更新楼层列表 UpdateFloorList(); } private void SelectImageButton_Click_q(object sender, EventArgs e) { //OpenFileDialog openFileDialog = new OpenFileDialog(); //openFileDialog.Filter = "Image Files (*.jpg;*.jpeg;*.png;*.gif;*.bmp)|*.jpg;*.jpeg;*.png;*.gif;*.bmp"; //if (openFileDialog.ShowDialog() == DialogResult.OK) //{ // BackgroundImgTextBox_q.Text = openFileDialog.FileName; //} //int selectedIndex = FloorsListBox.SelectedIndex; //if (selectedIndex == -1 || selectedIndex >= floors.Count) return; //Floor editedFloor = floors[selectedIndex]; 模板管理 fs = new 模板管理(true); if (fs.ShowDialog() == DialogResult.OK) { BackgroundImgTextBox_q.Text = fs.TemplateID; //editedFloor.TemplateID = fs.TemplateID; //map.SetData(TemplateList.GetTemplate(fs.TemplateID)); } } private void FloorsListBox_SelectedIndexChanged(object sender, EventArgs e) { if (FloorsListBox.SelectedIndex != -1) { int selectedIndex = FloorsListBox.SelectedIndex; Floor selectedFloor = floors[selectedIndex]; // 显示并允许编辑楼层属性的组件 EditProperties(selectedFloor); var template = TemplateList.GetTemplate(selectedFloor.TemplateID); ////if (template != null) //// this.map.SetData(template); } } private void simpleButton9_Click(object sender, EventArgs e) { InputBox inputBox = new InputBox(); string name= inputBox.ShowDialog(); if (name.Trim() !="" && name!=null) { var region = new TRegion() { Name = name }; if (regions.Find(r => r.Name == region.Name) != null) { MessageBox.Show($"名称重复[{region.Name}]"); return; } regions.Add(region); UpdateRegionList(region.Name); } } private void simpleButton10_Click(object sender, EventArgs e) { if (message.show("", "确认删除", MessageBoxButtons.YesNo)) { regions.RemoveAt(comboBox1.SelectedIndex); UpdateRegionList(); } } private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) { UpdateFloorList(); } private void InsertIntoNet_Click(object sender, EventArgs e) { int step = 1; int startIndex = 0; int endIndex = CurrentRegion.Floors.Count; if (!CurrentRegion.isDirectionUp) { step = -1; startIndex = CurrentRegion.Floors.Count - 1; endIndex = -1; } MapViewNetWork net = new MapViewNetWork(); Floor lastFloor = null; NodeViewModel lastPoint = null; NodeViewModel node1 = null; for(int i=startIndex; CurrentRegion.isDirectionUp?i < endIndex:i>endIndex;i+=step) { var floor = CurrentRegion.Floors[i]; if (floor.template.network==null) { floor.template.loadInpFile(); } var n= floor.template.network; var point = n.Nodes.Find(node => node.ID==floor.template.Node1); if (point == null) point = n.Nodes[0]; PointF3D p = new PointF3D(0- point.X, 0- point.Y, floor.Elev-point.Elev); n.Nodes.Select(node => (NodeViewModel)node).ToList().ForEach(node => { node.regionName = CurrentRegion.Name; }); n.Links.Select(link=>(LinkViewModel)link).ToList().ForEach(link => { link.regionName = CurrentRegion.Name; }); var list=net.Add(n, p,true); NodeViewModel CurrentPoint = (NodeViewModel)list[0]; if (lastPoint!=null) { var j=net.AddPipe(lastPoint, CurrentPoint); j.regionName = CurrentRegion.Name; } lastPoint = (NodeViewModel)list[0]; if (node1 == null) node1 = lastPoint; } Template temp=new Template(); temp.network = net; temp.Node1 = node1.ID; GlobalObject.map.InsertNet(temp); this.Close(); } private void comboBox2_SelectedIndexChanged(object sender, EventArgs e) { CurrentRegion.isDirectionUp = comboBox2.SelectedIndex == 0; } } }