From 5fa6947054206e2e781eadd4effdcdf52eda28c4 Mon Sep 17 00:00:00 2001 From: cloudflight <cloudflight@126.com> Date: 星期二, 26 十二月 2023 11:02:28 +0800 Subject: [PATCH] 2023年12月26日 --- Hydro.MapBase/Map/MapViewer.cs | 1164 ++++++++++++++++++++++++++++++++------------------------- 1 files changed, 649 insertions(+), 515 deletions(-) diff --git a/Hydro.MapBase/Map/MapViewer.cs b/Hydro.MapBase/Map/MapViewer.cs index 381f32b..ea7fcb8 100644 --- a/Hydro.MapBase/Map/MapViewer.cs +++ b/Hydro.MapBase/Map/MapViewer.cs @@ -1,5 +1,5 @@ 锘�//using CloudWaterNetwork.Magnifier; -using CommonBase; +using Hydro.CommonBase; //using ConfigApp; //using DevExpress.Diagram.Core.Layout; //using DevExpress.DirectX.NativeInterop.Direct2D; @@ -22,6 +22,7 @@ using System.Numerics; using System.Reflection; using System.Runtime.CompilerServices; +using System.Runtime.InteropServices.WindowsRuntime; using System.Runtime.Remoting.Metadata; using System.Security.Cryptography; using System.Text; @@ -689,8 +690,8 @@ void Draw(Graphics bufferG, Template template) { if (template == null) return; - var _Nodes = template.network.Nodes; - var _Links = template.network.Links; + var _Nodes = template.network.Nodes.ViewNodes; + var _Links = template.network.Links.ViewLinks; var Cpoints = getCurclePoints(64).ToList(); @@ -722,6 +723,7 @@ Pen penChoosed = new Pen(Color.Purple, 5 * r); Pen pen_valveChoosed = new Pen(Color.Red, 5 * r); + Pen penClosed = new Pen(Color.OrangeRed, 2 * r); @@ -844,22 +846,6 @@ { if (link.Selected || _ShowValve) { - //var p1 = WorldPointToMapPoint(link.StartNode); - //var p2 = WorldPointToMapPoint(link.EndNode); - //var c = new PointF((p1.X + p2.X) / 2, (p1.Y + p2.Y) / 2); - //bufferG.DrawLines(link.Selected ? valveChoosed : pen, new PointF[] { p1, p2 }); - //PointF[] points = new PointF[] { - // getRotatePoint(c.X - 3 * r, c.Y + 3 * r,c,p1,p2), - // getRotatePoint(c.X - 3 * r, c.Y - 3 * r,c,p1,p2), - // getRotatePoint(c.X + 3 * r, c.Y +0 * r,c,p1,p2), - // getRotatePoint(c.X - 3 * r, c.Y + 3 * r,c,p1,p2), - // //getRotatePoint(c.X - 3 * r, c.Y + 3 * r,c,p1,p2), - - //}; - //bufferG.DrawLines(link.Selected ? valveChoosed : pen, points); - - - var c = new PointF((p1.X + p2.X) / 2, (p1.Y + p2.Y) / 2); //bufferG.DrawLine(link.Selected ? pen_valveChoosed : pen, p1, p2); @@ -876,7 +862,6 @@ // getRotatePoint(c.X + radius - radius, c.Y + radius, c, p1, p2), // getRotatePoint(c.X - radius - radius, c.Y + radius, c, p1, p2), // getRotatePoint(c.X - radius - radius, c.Y - radius, c, p1, p2), - //}; List<PointF> p = new List<PointF>(); Cpoints.ForEach(cp => p.Add(getRotatePoint(c.X + cp.X * radius - radius, c.Y + cp.Y * radius, c, p1, p2))); @@ -1408,7 +1393,7 @@ _isInsertingObject = true; _newTemplate = temp; _undoOldValue = new PointF3D(0, 0, 0); - _OperaNode = temp.network.Nodes.Find(node => node.ID == temp.Node1); + _OperaNode = temp.network.Nodes.Find(node => node.ID == temp.Node1) as NodeViewModel; //if (_OperaNode == null) _OperaNode=_NewNet.Nodes[0]; } @@ -1518,82 +1503,83 @@ bool isMouseMoved = Get_dist(_ClickStartPos, new PointF(e.X, e.Y)) > 10; bool isdoubleClick = (DateTime.Now - _lastMouseUp).TotalMilliseconds <= doubleClick_Delay; _lastMouseUp = DateTime.Now; - if (e.Button == MouseButtons.Middle || e.Button == MouseButtons.XButton2) + if /*妗嗛�夋斁澶�*/(ModifierKeys == Keys.Control && (e.Button == MouseButtons.Middle || e.Button == MouseButtons.XButton2)) { - if (ModifierKeys == Keys.Control) - { - _isDragging = false; + _isDragging = false; - this.Cursor = _lastCursor; + this.Cursor = _lastCursor; - mapOption0 = mapOption; - var _lastMousePosition = DragStartPos; + mapOption0 = mapOption; + var _lastMousePosition = DragStartPos; - List<IBaseViewModel> objs = new List<IBaseViewModel>(); - // 缁樺埗鐭╁舰 - var start = new Point((int)Math.Min(mousePosition.X, _lastMousePosition.X), (int)Math.Min(mousePosition.Y, _lastMousePosition.Y)); - var size = new Size((int)Math.Abs(_lastMousePosition.X - mousePosition.X), (int)Math.Abs(_lastMousePosition.Y - mousePosition.Y)); - var rectangle0 = new Rectangle(start, size); + List<IBaseViewModel> objs = new List<IBaseViewModel>(); + // 缁樺埗鐭╁舰 + var start = new Point((int)Math.Min(mousePosition.X, _lastMousePosition.X), (int)Math.Min(mousePosition.Y, _lastMousePosition.Y)); + var size = new Size((int)Math.Abs(_lastMousePosition.X - mousePosition.X), (int)Math.Abs(_lastMousePosition.Y - mousePosition.Y)); + var rectangle0 = new Rectangle(start, size); - var new_center = MapPointToWorldPoint(new PointF(start.X + size.Width / 2, start.Y + size.Height / 2)); + var new_center = MapPointToWorldPoint(new PointF(start.X + size.Width / 2, start.Y + size.Height / 2)); - this.MapCenter = new_center; - this.zoom = Math.Max(1.0f * Width / size.Width, 1.0f * Height / size.Height); + this.MapCenter = new_center; + this.zoom = Math.Max(1.0f * Width / size.Width, 1.0f * Height / size.Height); - if (recordView) MapObjectExtensions.AddCommand(mapOption, "Map", mapOption0, mapOption); + if (recordView) MapObjectExtensions.AddCommand(mapOption, "Map", mapOption0, mapOption); - label_center.Text = $"center锛�({MapCenter.X.ToString("0.000")} 锛寋MapCenter.Y.ToString("0.000")}锛�"; - label_zoom.Text = $"Zoom锛歿zoom.ToString("0.000")}"; - Invalidate(); - } - if (ModifierKeys == Keys.Shift) - { - _isDragging = false; - - this.Cursor = _lastCursor; - - - var _lastMousePosition = DragStartPos; - - List<IBaseViewModel> objs = new List<IBaseViewModel>(); - // 缁樺埗鐭╁舰 - var start = new Point((int)Math.Min(mousePosition.X, _lastMousePosition.X), (int)Math.Min(mousePosition.Y, _lastMousePosition.Y)); - var size = new Size((int)Math.Abs(_lastMousePosition.X - mousePosition.X), (int)Math.Abs(_lastMousePosition.Y - mousePosition.Y)); - var rectangle0 = new Rectangle(start, size); - for (int i = 0; i < _Nodes.Count; i++) - { - PointF p = WorldPointToMapPoint(_Nodes[i]); - if (rectangle0.Contains(p.ToPoint())) - { - //_Nodes[i].Selected = true; - //selectedObjs.Add(_Nodes[i]); - objs.Add(_Nodes[i]); - } - } - - for (int i = 0; i < _Links.Count; i++) - { - //PointF p = GetPointF(Pipes[i]); - if (rectangle0.Contains(_Links[i].Position.ToPoint())) - { - //_Links[i].Selected = true; - //selectedObjs.Add(_Links[i]); - objs.Add(_Links[i]); - } - } - Form_Magnifier fr = new Form_Magnifier(objs); - - fr.ShowDialog(); - } - else - { - if (recordView) MapObjectExtensions.AddCommand(mapOption, "Map", mapOption0, mapOption); - this.Cursor = _lastCursor; - _isPanning = false; - } - + label_center.Text = $"center锛�({MapCenter.X.ToString("0.000")} 锛寋MapCenter.Y.ToString("0.000")}锛�"; + label_zoom.Text = $"Zoom锛歿zoom.ToString("0.000")}"; + Invalidate(); + return; } - else if (e.Button == MouseButtons.Left && _isSettingBackGroundPictur == true) + if /*鏀惧ぇ闀�*/(ModifierKeys == Keys.Shift && (e.Button == MouseButtons.Middle || e.Button == MouseButtons.XButton2)) + { + _isDragging = false; + + this.Cursor = _lastCursor; + + + var _lastMousePosition = DragStartPos; + + List<IBaseViewModel> objs = new List<IBaseViewModel>(); + // 缁樺埗鐭╁舰 + var start = new Point((int)Math.Min(mousePosition.X, _lastMousePosition.X), (int)Math.Min(mousePosition.Y, _lastMousePosition.Y)); + var size = new Size((int)Math.Abs(_lastMousePosition.X - mousePosition.X), (int)Math.Abs(_lastMousePosition.Y - mousePosition.Y)); + var rectangle0 = new Rectangle(start, size); + for (int i = 0; i < _Nodes.Count; i++) + { + var node = _Nodes[i] as NodeViewModel; + PointF p = WorldPointToMapPoint(node); + if (rectangle0.Contains(p.ToPoint())) + { + //_Nodes[i].Selected = true; + //selectedObjs.Add(_Nodes[i]); + objs.Add(node); + } + } + + for (int i = 0; i < _Links.Count; i++) + { + var link = _Links[i] as LinkViewModel; + //PointF p = GetPointF(Pipes[i]); + if (rectangle0.Contains(link.Position.ToPoint())) + { + //_Links[i].Selected = true; + //selectedObjs.Add(_Links[i]); + objs.Add(link); + } + } + Form_Magnifier fr = new Form_Magnifier(objs); + + fr.ShowDialog(); + return; + } + if /*骞崇Щ瑙嗚*/(ModifierKeys == Keys.None && (e.Button == MouseButtons.Middle || e.Button == MouseButtons.XButton2)) + { + if (recordView) MapObjectExtensions.AddCommand(mapOption, "Map", mapOption0, mapOption); + this.Cursor = _lastCursor; + _isPanning = false; + return; + } + if /*璁剧疆鑳屾櫙*/(e.Button == MouseButtons.Left && _isSettingBackGroundPictur) { _Template.BackGroundPoint1 = BackGroudPicLeftPos; _Template.BackGroundPoint2 = MapPointToWorldPoint(mousePosition, _Template.BackGroundElev); @@ -1602,443 +1588,489 @@ mapOption.isShowPic = true; this.Cursor = _lastCursor; Invalidate(); + return; } - else if (e.Button == MouseButtons.Left) + if /*鎻掑叆缁撴瀯*/(e.Button == MouseButtons.Left && _isInsertingObject) { - if (_isInsertingObject) + var net = _newTemplate.network; + List<NodeViewModel> nodes = _Nodes.Select(node => (NodeViewModel)node).ToList(); + float minDist = 100f; + NodeViewModel minNode = null; + foreach (NodeViewModel node in nodes) { - var net = _newTemplate.network; - //_OperaNode = net.EndPoint; - //_OperaNode = _NewNet.Nodes.Find(node => node.ID == temp.Node2); - //if (_OperaNode == null) _OperaNode = _NewNet.Nodes[0]; - //PointF minPoint = new PointF(net.StartPoint.X, net.StartPoint.Y); - List<NodeViewModel> nodes = _Nodes; - float minDist = 100f; - NodeViewModel minNode = null; - foreach (NodeViewModel node in nodes) + + + PointF mapPos = WorldPointToMapPoint(node); + PointF currentPoint = MapToScreen(mapPos); + float currentDist = 0; + if (node != _OperaNode && (currentDist = Get_dist(new PointF(e.X, e.Y), currentPoint)) < 15f) { - - - PointF mapPos = WorldPointToMapPoint(node); - PointF currentPoint = MapToScreen(mapPos); - float currentDist = 0; - if (node != _OperaNode && (currentDist = Get_dist(new PointF(e.X, e.Y), currentPoint)) < 15f) - { - if (currentDist < minDist) currentDist = minDist; - minNode = node; - break; - } - } - float dx, dy, dz; - - if (ModifierKeys != Keys.Alt && minNode != null) - { - - var p1 = (PointF3D)_undoOldValue; - var p2 = minNode.Position3D; - var dd = _newTemplate.OffSet; - dx = p2.X - p1.X; - dy = p2.Y - p1.Y; - dz = p2.Z - p1.Z; - - - - } - else - { - _NewNet.Clear(); - _OperaNode = null; - _isInsertingObject = false; - this.Invalidate(); - return; - - var p1 = (PointF3D)_undoOldValue; - var p2 = _OperaNode.Position3D; - var dd = _newTemplate.OffSet; - dx = dd.X; //p2.X - p1.X; - dy = dd.Y;// p2.Y - p1.Y; - dz = dd.Z;// p2.Z - p1.Z; - - } - - - net.Nodes.ForEach(n => { n.Position3D = new PointF3D(n.X + dx, n.Y + dy, n.Elev + dz); }); - - var list = _Network.Add(net); - - var j = _Network.AddPipe(minNode, _OperaNode); - j.Length = 0.0001f; - list.Add(j); - _OperaNode = null; - _NewNet.Clear(); - - _Network.BuildRelation(); - - - selectedObjs.ForEach(o => o.Selected = false); - selectedObjs.Clear(); - - list.ForEach(m => m.Selected = true); - selectedObjs.AddRange(list); - - - - - - - - MapObjectExtensions.AddCommand(_Network, "Add", null, list); - _isInsertingObject = false; - - //_OperaNode = null; - //_Network.Nodes.AddRange(net.Nodes); - //_Network.Links.AddRange(net.Links); - Invalidate(); - } - else if (_isDrawingPolygon) - { - if (ModifierKeys != Keys.Shift) - { - _isDrawingPolygon = false; - if (polygonPoints.Count >= 3) - { - _Nodes.ForEach(n => - { - if (IsPointInPolygon(WorldPointToMapPoint(n), polygonPoints)) - { - selectedObjs.Add(n); - n.Selected = true; - } - }); - _Links.ForEach(n => - { - if (IsPointInPolygon(WorldPointToMapPoint(n.Position, n.Elev), polygonPoints)) - { - selectedObjs.Add(n); - n.Selected = true; - } - }); - - } - Invalidate(); - // 缁撴潫缁樺埗澶氳竟褰� + if (currentDist < minDist) currentDist = minDist; + minNode = node; + break; } } - else if (_isMovingObject) - { - if (isMouseMoved) - { - List<NodeViewModel> nodes = _Nodes; - float minDist = 100f; - NodeViewModel minNode = null; - foreach (NodeViewModel node in nodes) - { + float dx, dy, dz; - - PointF mapPos = WorldPointToMapPoint(node); - PointF currentPoint = MapToScreen(mapPos); - float currentDist = 0; - if (node != _OperaNode && (currentDist = Get_dist(new PointF(e.X, e.Y), currentPoint)) < 15f) - { - if (currentDist < minDist) currentDist = minDist; - minNode = node; - break; - } - } - - - if (ModifierKeys != Keys.Alt && minNode != null) - { - _isMovingObject = false; - var p1 = (PointF3D)_undoOldValue; - var p2 = minNode.Position3D; - var dd = _newTemplate.OffSet; - var dx = p2.X - p1.X; - var dy = p2.Y - p1.Y; - var dz = p2.Z - p1.Z; - selectedNodes.ForEach(n => { n.Position3D = new PointF3D(n.X + dx, n.Y + dy, n.Elev + dz); }); - List<PointF3D> newPositons = selectedNodes.Select(n => n.Position3D).ToList(); - List<PointF3D> oldPositons = newPositons.Select(n => new PointF3D(n.X - dx, n.Y - dy, n.Z - dz)).ToList(); - MapObjectExtensions.AddCommand(selectedNodes, "Position3D", oldPositons, newPositons); - _OperaNode = null; - _NewNet.Clear(); - } - else - { - _isMovingObject = false; - var p1 = (PointF3D)_undoOldValue; - var p2 = _OperaNode.Position3D; - var dd = _newTemplate.OffSet; - var dx = dd.X; //p2.X - p1.X; - var dy = dd.Y;// p2.Y - p1.Y; - var dz = dd.Z;// p2.Z - p1.Z; - selectedNodes.ForEach(n => { n.Position3D = new PointF3D(n.X + dx, n.Y + dy, n.Elev + dz); }); - List<PointF3D> newPositons = selectedNodes.Select(n => n.Position3D).ToList(); - List<PointF3D> oldPositons = newPositons.Select(n => new PointF3D(n.X - dx, n.Y - dy, n.Z - dz)).ToList(); - MapObjectExtensions.AddCommand(selectedNodes, "Position3D", oldPositons, newPositons); - _OperaNode = null; - _NewNet.Clear(); - } - - } - else - { - _isMovingObject = false; - var p1 = (PointF3D)_undoOldValue; - var p2 = _OperaNode.Position3D; - var dd = _newTemplate.OffSet; - var dx = dd.X; //p2.X - p1.X; - var dy = dd.Y;// p2.Y - p1.Y; - var dz = dd.Z;// p2.Z - p1.Z; - //selectedNodes.ForEach(n => { n.Position3D = new PointF3D(n.X + dx, n.Y + dy, n.Elev + dz); }); - //List<PointF3D> newPositons = selectedNodes.Select(n => n.Position3D).ToList(); - //List<PointF3D> oldPositons = newPositons.Select(n => new PointF3D(n.X - dx, n.Y - dy, n.Z - dz)).ToList(); - //MapObjectExtensions.AddCommand(selectedNodes, "Position3D", oldPositons, newPositons); - _OperaNode = null; - _NewNet.Clear(); - } - - - } - else if (_mouseState != MouseState.鏃�) - { - PointF p; - float z; - NodeViewModel n; - - switch (_mouseState) - { - case MouseState.鏂板鑺傜偣: - getPointAndHeight(e, out p, out z); - n = _Network.AddJunction(p, z); - MapObjectExtensions.AddCommand(_Network, "Add", null, new List<IBaseViewModel>() { n }); - break; - case MouseState.鏂板缓姘磋〃: - getPointAndHeight(e, out p, out z); - n = _Network.AddMeter(p); - MapObjectExtensions.AddCommand(_Network, "Add", null, new List<IBaseViewModel>() { n }); - break; - case MouseState.鏂板缓姘村簱: - getPointAndHeight(e, out p, out z); - n = _Network.AddReservoir(p); - MapObjectExtensions.AddCommand(_Network, "Add", null, new List<IBaseViewModel>() { n }); - break; - case MouseState.鏂板缓姘存睜: - getPointAndHeight(e, out p, out z); - n = _Network.AddTank(p); - MapObjectExtensions.AddCommand(_Network, "Add", null, new List<IBaseViewModel>() { n }); - break; - case MouseState.鏂板绠$嚎: - case MouseState.鏂板缓姘存车: - case MouseState.鏂板缓闃�闂�: - case MouseState.鏂板缓閲嶅鍣�: - if (_select_junction1 == null) - { - getPointAndHeight(e, out p, out z); - Set_junction1(e); - } - else - { - getPointAndHeight(e, _select_junction1, out p, out z); - var l = AddLink(e, isdoubleClick, p, z); - if (l.Count > 0) MapObjectExtensions.AddCommand(_Network, "Add", null, l); - } - break; - - - - - } - - - Invalidate(); - } - else if (isMouseMoved) + if (ModifierKeys != Keys.Alt && minNode != null) { - _isDragging = false; - Cursor = Cursors.Default; - var _lastMousePosition = DragStartPos; + var p1 = (PointF3D)_undoOldValue; + var p2 = minNode.Position3D; + var dd = _newTemplate.OffSet; + dx = p2.X - p1.X; + dy = p2.Y - p1.Y; + dz = p2.Z - p1.Z; - // 缁樺埗鐭╁舰 - var start = new PointF((float)Math.Min(mousePosition.X, _lastMousePosition.X), (float)Math.Min(mousePosition.Y, _lastMousePosition.Y)); - var size = new SizeF((float)Math.Abs(_lastMousePosition.X - mousePosition.X), (float)Math.Abs(_lastMousePosition.Y - mousePosition.Y)); - var rectangle0 = new RectangleF(start, size); - - if (ModifierKeys == Keys.Control) - { - - - - - for (int i = 0; i < _Nodes.Count; i++) - { - if (!_Nodes[i].Visible) continue; - PointF p = WorldPointToMapPoint(_Nodes[i]); - - if (RectangContain(rectangle0, p)) - { - if (selectedObjs.Contains(_Nodes[i])) - { - _Nodes[i].Selected = false; - selectedObjs.Remove(_Nodes[i]); - } - else - { - _Nodes[i].Selected = true; - selectedObjs.Add(_Nodes[i]); - } - - } - } - - for (int i = 0; i < _Links.Count; i++) - { - if (!_Links[i].Visible) continue; - PointF p = WorldPointToMapPoint(_Links[i].Position, _Links[i].Elev); - if (RectangContain(rectangle0, p)) - { - if (selectedObjs.Contains(_Links[i])) - { - _Links[i].Selected = false; - selectedObjs.Remove(_Links[i]); - } - else - { - _Links[i].Selected = true; - selectedObjs.Add(_Links[i]); - } - } - } - GlobalObject.PropertyForm.SetObjs(selectedObjs); - Invalidate(); - mousePosition = new PointF(0, 0); - } - else - { - selectedObjs.ForEach(obj => obj.Selected = false); - selectedObjs.Clear(); - for (int i = 0; i < _Nodes.Count; i++) - { - if (!_Nodes[i].Visible) continue; - PointF p = WorldPointToMapPoint(_Nodes[i]); - - if (RectangContain(rectangle0, p)) - { - _Nodes[i].Selected = true; - selectedObjs.Add(_Nodes[i]); - } - } - - for (int i = 0; i < _Links.Count; i++) - { - if (!_Links[i].Visible) continue; - PointF p = WorldPointToMapPoint(_Links[i].Position, _Links[i].Elev); - if (RectangContain(rectangle0, p)) - { - _Links[i].Selected = true; - selectedObjs.Add(_Links[i]); - } - } - GlobalObject.PropertyForm.SetObjs(selectedObjs); - Invalidate(); - mousePosition = new PointF(0, 0); - } } else { - _isDragging = false; + _NewNet.Clear(); + _OperaNode = null; + _isInsertingObject = false; + this.Invalidate(); + return; - // 閬嶅巻鎵�鏈夌偣锛屾壘鍑烘渶杩戠殑鐐� - PointF clickedPoint = new PointF(e.X, e.Y); //ScreenToMap(new PointF(e.X, e.Y)); - var obj = GetObj_by_ScreenPoint(clickedPoint); - bool isJunction = obj is NodeViewModel; - - - - if (ModifierKeys == Keys.Control) - { - if (obj != null) - { - if (selectedObjs.Contains(obj)) - { - obj.Selected = false; - selectedObjs.Remove(obj); - GlobalObject.PropertyForm.SetObjs(selectedObjs); - Invalidate(); - mousePosition = new PointF(0, 0); - } - else - { - obj.Selected = true; - selectedObjs.Add(obj); - GlobalObject.PropertyForm.SetObjs(selectedObjs); - Invalidate(); - mousePosition = new PointF(0, 0); - } - } - - } - else - { - if (obj != null) - { - //if (isJunction) - { - selectedObjs.ForEach(o => o.Selected = false); - selectedObjs.Clear(); - _OperaNode = null; - obj.Selected = true; - selectedObjs.Add(obj); - //Invalidate(); - //// 鏄剧ず璇ョ偣鐨勫睘鎬� - //ShowProperties(obj); - GlobalObject.PropertyForm.SetObjs(selectedObjs); - Invalidate(); - mousePosition = new PointF(0, 0); - } - //else - //{ - // ChoosedObjs.ForEach(o => o.Choosed = false); - // ChoosedObjs.Clear(); - // obj.Choosed = true; - // ChoosedObjs.Add(obj); - // Invalidate(); - // // 鏄剧ず璇ョ偣鐨勫睘鎬� - // ShowProperties(obj); - //} - } - else - { - - selectedObjs.ForEach(o => o.Selected = false); - selectedObjs.Clear(); - _OperaNode = null; - GlobalObject.PropertyForm.SetObjs(selectedObjs); - Invalidate(); - } - } + var p1 = (PointF3D)_undoOldValue; + var p2 = _OperaNode.Position3D; + var dd = _newTemplate.OffSet; + dx = dd.X; //p2.X - p1.X; + dy = dd.Y;// p2.Y - p1.Y; + dz = dd.Z;// p2.Z - p1.Z; } + net.Nodes.ForEach(n => { ((NodeViewModel)n).Position3D = new PointF3D(n.X + dx, n.Y + dy, n.Elev + dz); }); + + var list = _Network.Add(net); + + var j = _Network.AddPipe(minNode, _OperaNode); + j.Length = 0.0001f; + list.Add(j); + _OperaNode = null; + _NewNet.Clear(); + + _Network.BuildRelation(); + + selectedObjs.ForEach(o => o.Selected = false); + selectedObjs.Clear(); + + list.ForEach(m => m.Selected = true); + selectedObjs.AddRange(list); + + MapObjectExtensions.AddCommand(_Network, "Add", null, list); + _isInsertingObject = false; + + //_OperaNode = null; + //_Network.Nodes.AddRange(net.Nodes); + //_Network.Links.AddRange(net.Links); + Invalidate(); + return; + } + if /*澶氳竟褰㈤�夋嫨*/(_isDrawingPolygon && e.Button==MouseButtons.Left && ModifierKeys==Keys.None) + { + _isDrawingPolygon = false; + if (polygonPoints.Count >= 3) + { + _Nodes.ForEach(n0 => + { + var n = (NodeViewModel)n0; + if (IsPointInPolygon(WorldPointToMapPoint(n), polygonPoints)) + { + selectedObjs.Add(n); + n.Selected = true; + } + }); + _Links.ForEach(n0 => + { + var n = (LinkViewModel)n0; + if (IsPointInPolygon(WorldPointToMapPoint(n.Position, n.Elev), polygonPoints)) + { + selectedObjs.Add(n); + n.Selected = true; + } + }); + + } + Invalidate(); + // 缁撴潫缁樺埗澶氳竟褰� + return; + } + if /*绉诲姩瀵硅薄*/(_isMovingObject && isMouseMoved && e.Button == MouseButtons.Left) + { + List<NodeViewModel> nodes = _Nodes.Select(n => (NodeViewModel)n).ToList(); + float minDist = 100f; + NodeViewModel minNode = null; + foreach (NodeViewModel node in nodes) + { + + + PointF mapPos = WorldPointToMapPoint(node); + PointF currentPoint = MapToScreen(mapPos); + float currentDist = 0; + if (node != _OperaNode && (currentDist = Get_dist(new PointF(e.X, e.Y), currentPoint)) < 15f) + { + if (currentDist < minDist) currentDist = minDist; + minNode = node; + break; + } + } + + + if (ModifierKeys != Keys.Alt && minNode != null) + { + _isMovingObject = false; + var p1 = (PointF3D)_undoOldValue; + var p2 = minNode.Position3D; + var dd = _newTemplate.OffSet; + var dx = p2.X - p1.X; + var dy = p2.Y - p1.Y; + var dz = p2.Z - p1.Z; + selectedNodes.ForEach(n => { n.Position3D = new PointF3D(n.X + dx, n.Y + dy, n.Elev + dz); }); + List<PointF3D> newPositons = selectedNodes.Select(n => n.Position3D).ToList(); + List<PointF3D> oldPositons = newPositons.Select(n => new PointF3D(n.X - dx, n.Y - dy, n.Z - dz)).ToList(); + MapObjectExtensions.AddCommand(selectedNodes, "Position3D", oldPositons, newPositons); + _OperaNode = null; + _NewNet.Clear(); + } + else + { + _isMovingObject = false; + var p1 = (PointF3D)_undoOldValue; + var p2 = _OperaNode.Position3D; + var dd = _newTemplate.OffSet; + var dx = dd.X; //p2.X - p1.X; + var dy = dd.Y;// p2.Y - p1.Y; + var dz = dd.Z;// p2.Z - p1.Z; + selectedNodes.ForEach(n => { n.Position3D = new PointF3D(n.X + dx, n.Y + dy, n.Elev + dz); }); + List<PointF3D> newPositons = selectedNodes.Select(n => n.Position3D).ToList(); + List<PointF3D> oldPositons = newPositons.Select(n => new PointF3D(n.X - dx, n.Y - dy, n.Z - dz)).ToList(); + MapObjectExtensions.AddCommand(selectedNodes, "Position3D", oldPositons, newPositons); + _OperaNode = null; + _NewNet.Clear(); + } + return; + } + if /*鍙栨秷绉诲姩瀵硅薄*/(_isMovingObject && !isMouseMoved && e.Button == MouseButtons.Left) + { + _isMovingObject = false; + var p1 = (PointF3D)_undoOldValue; + var p2 = _OperaNode.Position3D; + var dd = _newTemplate.OffSet; + var dx = dd.X; //p2.X - p1.X; + var dy = dd.Y;// p2.Y - p1.Y; + var dz = dd.Z;// p2.Z - p1.Z; + //selectedNodes.ForEach(n => { n.Position3D = new PointF3D(n.X + dx, n.Y + dy, n.Elev + dz); }); + //List<PointF3D> newPositons = selectedNodes.Select(n => n.Position3D).ToList(); + //List<PointF3D> oldPositons = newPositons.Select(n => new PointF3D(n.X - dx, n.Y - dy, n.Z - dz)).ToList(); + //MapObjectExtensions.AddCommand(selectedNodes, "Position3D", oldPositons, newPositons); + _OperaNode = null; + _NewNet.Clear(); + return; + } + if /*鐗规畩鍔熻兘*/(_mouseState != MouseState.鏃� && e.Button == MouseButtons.Left) + { + PointF p; + float z; + NodeViewModel n; + + switch (_mouseState) + { + case MouseState.鏂板鑺傜偣: + getPointAndHeight(e, out p, out z); + n = _Network.AddJunction(p, z); + MapObjectExtensions.AddCommand(_Network, "Add", null, new List<IBaseViewModel>() { n }); + break; + case MouseState.鏂板缓姘磋〃: + getPointAndHeight(e, out p, out z); + n = _Network.AddMeter(p); + MapObjectExtensions.AddCommand(_Network, "Add", null, new List<IBaseViewModel>() { n }); + break; + case MouseState.鏂板缓姘村簱: + getPointAndHeight(e, out p, out z); + n = _Network.AddReservoir(p); + MapObjectExtensions.AddCommand(_Network, "Add", null, new List<IBaseViewModel>() { n }); + break; + case MouseState.鏂板缓姘存睜: + getPointAndHeight(e, out p, out z); + n = _Network.AddTank(p); + MapObjectExtensions.AddCommand(_Network, "Add", null, new List<IBaseViewModel>() { n }); + break; + case MouseState.鏂板绠$嚎: + case MouseState.鏂板缓姘存车: + case MouseState.鏂板缓闃�闂�: + case MouseState.鏂板缓閲嶅鍣�: + if (_select_junction1 == null) + { + getPointAndHeight(e, out p, out z); + Set_junction1(e); + } + else + { + getPointAndHeight(e, _select_junction1, out p, out z); + var l = AddLink(e, isdoubleClick, p, z); + if (l.Count > 0) MapObjectExtensions.AddCommand(_Network, "Add", null, l); + } + break; - //zoom *= (float)Math.Pow(2, e.Delta / 120.0 / 10.0); - //zoom = Math.Max(0.1f, Math.Min(10.0f, zoom)); + } - //center.X += e.Location.X / oldZoom - e.Location.X / zoom; - //center.Y += e.Location.Y / oldZoom - e.Location.Y / zoom; - label_center.Text = $"center锛�({MapCenter.X.ToString("0.000")} 锛寋MapCenter.Y.ToString("0.000")}锛�"; - label_zoom.Text = $"Zoom锛歿zoom.ToString("0.000")}"; Invalidate(); } - else if (e.Button == MouseButtons.Right) + if /*閿佸畾鐐归��*/(GlobalObject.LockSelect && !isMouseMoved && _mouseState == MouseState.鏃� && e.Button == MouseButtons.Left ) + { + _isDragging = false; + + // 閬嶅巻鎵�鏈夌偣锛屾壘鍑烘渶杩戠殑鐐� + PointF clickedPoint = new PointF(e.X, e.Y); //ScreenToMap(new PointF(e.X, e.Y)); + var obj = GetObj_by_ScreenPoint(clickedPoint); + bool isJunction = obj is NodeViewModel; + + if (obj != null) + { + GlobalObject.PropertyForm.SetObjs(new List<IBaseViewModel>() { obj }); + if (isJunction) _OperaNode = (NodeViewModel)obj; + mousePosition = new PointF(0, 0); + Invalidate(); + + } + else + { + GlobalObject.PropertyForm.SetObjs(new List<IBaseViewModel>() { }); + _OperaNode = null; + mousePosition = new PointF(0, 0); + Invalidate(); + } + return; + } + if /*閿佸畾妗嗛��*/(GlobalObject.LockSelect&& isMouseMoved && _mouseState == MouseState.鏃� && e.Button == MouseButtons.Left ) + { + _isDragging = false; + Cursor = Cursors.Default; + + var _lastMousePosition = DragStartPos; + + // 缁樺埗鐭╁舰 + var start = new PointF((float)Math.Min(mousePosition.X, _lastMousePosition.X), (float)Math.Min(mousePosition.Y, _lastMousePosition.Y)); + var size = new SizeF((float)Math.Abs(_lastMousePosition.X - mousePosition.X), (float)Math.Abs(_lastMousePosition.Y - mousePosition.Y)); + var rectangle0 = new RectangleF(start, size); + var selectedObjs = new List<IBaseViewModel>(); + for (int i = 0; i < _Nodes.Count; i++) + { + + var node = _Nodes[i] as NodeViewModel; + if (!node.Visible) continue; + PointF p = WorldPointToMapPoint(node); + + if (RectangContain(rectangle0, p)) + { + selectedObjs.Add(node); + + } + } + + for (int i = 0; i < _Links.Count; i++) + { + var link = _Links[i] as LinkViewModel; + if (!link.Visible) continue; + PointF p = WorldPointToMapPoint(link.Position, link.Elev); + if (RectangContain(rectangle0, p)) + { + selectedObjs.Add(link); + } + } + var findNode = selectedObjs.FindAll(o => o is NodeViewModel); + if (findNode.Count > 0) _OperaNode = findNode[0] as NodeViewModel; + + GlobalObject.PropertyForm.SetObjs(selectedObjs); + Invalidate(); + mousePosition = new PointF(0, 0); + return; + } + if /*鍙犲姞妗嗛��*/(isMouseMoved && _mouseState == MouseState.鏃� && e.Button == MouseButtons.Left && ModifierKeys == Keys.Control) + { + + _isDragging = false; + Cursor = Cursors.Default; + + var _lastMousePosition = DragStartPos; + + // 缁樺埗鐭╁舰 + var start = new PointF((float)Math.Min(mousePosition.X, _lastMousePosition.X), (float)Math.Min(mousePosition.Y, _lastMousePosition.Y)); + var size = new SizeF((float)Math.Abs(_lastMousePosition.X - mousePosition.X), (float)Math.Abs(_lastMousePosition.Y - mousePosition.Y)); + var rectangle0 = new RectangleF(start, size); + for (int i = 0; i < _Nodes.Count; i++) + { + + var node = _Nodes[i] as NodeViewModel; + if (!node.Visible) continue; + PointF p = WorldPointToMapPoint(node); + + if (RectangContain(rectangle0, p)) + { + if (selectedObjs.Contains(node)) + { + node.Selected = false; + selectedObjs.Remove(node); + } + else + { + node.Selected = true; + selectedObjs.Add(node); + } + + } + } + + for (int i = 0; i < _Links.Count; i++) + { + var link = _Links[i] as LinkViewModel; + if (!link.Visible) continue; + PointF p = WorldPointToMapPoint(link.Position, link.Elev); + if (RectangContain(rectangle0, p)) + { + if (selectedObjs.Contains(link)) + { + link.Selected = false; + selectedObjs.Remove(link); + } + else + { + link.Selected = true; + selectedObjs.Add(link); + } + } + } + GlobalObject.PropertyForm.SetObjs(selectedObjs); + Invalidate(); + mousePosition = new PointF(0, 0); + return; + } + if /*妗嗛��*/(isMouseMoved && _mouseState == MouseState.鏃� && e.Button == MouseButtons.Left && ModifierKeys == Keys.None) + { + _isDragging = false; + Cursor = Cursors.Default; + + var _lastMousePosition = DragStartPos; + + // 缁樺埗鐭╁舰 + var start = new PointF((float)Math.Min(mousePosition.X, _lastMousePosition.X), (float)Math.Min(mousePosition.Y, _lastMousePosition.Y)); + var size = new SizeF((float)Math.Abs(_lastMousePosition.X - mousePosition.X), (float)Math.Abs(_lastMousePosition.Y - mousePosition.Y)); + var rectangle0 = new RectangleF(start, size); + selectedObjs.ForEach(obj => obj.Selected = false); + selectedObjs.Clear(); + for (int i = 0; i < _Nodes.Count; i++) + { + var node = _Nodes[i] as NodeViewModel; + if (!node.Visible) continue; + PointF p = WorldPointToMapPoint(node); + + if (RectangContain(rectangle0, p)) + { + node.Selected = true; + selectedObjs.Add(node); + } + } + + for (int i = 0; i < _Links.Count; i++) + { + var link = _Links[i] as LinkViewModel; + + if (!link.Visible) continue; + PointF p = WorldPointToMapPoint(link.Position, link.Elev); + if (RectangContain(rectangle0, p)) + { + link.Selected = true; + selectedObjs.Add(link); + } + } + GlobalObject.PropertyForm.SetObjs(selectedObjs); + Invalidate(); + mousePosition = new PointF(0, 0); + return; + } + + if /*鐐归��*/(!isMouseMoved && _mouseState == MouseState.鏃� && e.Button == MouseButtons.Left && ModifierKeys==Keys.None) + { + _isDragging = false; + + // 閬嶅巻鎵�鏈夌偣锛屾壘鍑烘渶杩戠殑鐐� + PointF clickedPoint = new PointF(e.X, e.Y); //ScreenToMap(new PointF(e.X, e.Y)); + var obj = GetObj_by_ScreenPoint(clickedPoint); + bool isJunction = obj is NodeViewModel; + + if (obj != null) + { + selectedObjs.ForEach(o => o.Selected = false); + selectedObjs.Clear(); + obj.Selected = true; + selectedObjs.Add(obj); + GlobalObject.PropertyForm.SetObjs(selectedObjs); + _OperaNode = null; + + + Invalidate(); + mousePosition = new PointF(0, 0); + + + } + else + { + //GlobalObject.LockSelect + + selectedObjs.ForEach(o => o.Selected = false); + selectedObjs.Clear(); + GlobalObject.PropertyForm.SetObjs(selectedObjs); + + _OperaNode = null; + + Invalidate(); + } + return; + + + } + + if (/*鍙犲姞鐐归��*/!isMouseMoved && _mouseState == MouseState.鏃� && e.Button == MouseButtons.Left && ModifierKeys == Keys.Control) + { + _isDragging = false; + + // 閬嶅巻鎵�鏈夌偣锛屾壘鍑烘渶杩戠殑鐐� + PointF clickedPoint = new PointF(e.X, e.Y); //ScreenToMap(new PointF(e.X, e.Y)); + var obj = GetObj_by_ScreenPoint(clickedPoint); + bool isJunction = obj is NodeViewModel; + if (obj != null) + { + if (selectedObjs.Contains(obj)) + { + obj.Selected = false; + selectedObjs.Remove(obj); + GlobalObject.PropertyForm.SetObjs(selectedObjs); + + Invalidate(); + mousePosition = new PointF(0, 0); + } + else + { + obj.Selected = true; + selectedObjs.Add(obj); + GlobalObject.PropertyForm.SetObjs(selectedObjs); + Invalidate(); + mousePosition = new PointF(0, 0); + } + } + return; + } + + + if (e.Button == MouseButtons.Right) { if (_isRotating) { @@ -2101,23 +2133,25 @@ for (int i = 0; i < _Nodes.Count; i++) { - if (!_Nodes[i].Visible) continue; - PointF mapPos = WorldPointToMapPoint(_Nodes[i]); + var node = _Nodes[i] as NodeViewModel; + if (!node.Visible) continue; + PointF mapPos = WorldPointToMapPoint(node); PointF currentPoint = MapToScreen(mapPos); float dist = Get_dist(clickedPoint, currentPoint); if (dist < minDist && dist <= DistLimit) { minDist = dist; minIndex = i; - obj = _Nodes[i]; + obj = node; } } for (int i = 0; i < _Links.Count; i++) { - if (!_Links[i].Visible) continue; + var link= _Links[i] as LinkViewModel; + if (!link.Visible) continue; //float dist = (clickedPoint.X - Pipes[i].X) * (clickedPoint.X - Pipes[i].X) + // (clickedPoint.Y - Pipes[i].Y) * (clickedPoint.Y - Pipes[i].Y); - PointF mapPos = WorldPointToMapPoint(_Links[i].Position, _Links[i].Elev); + PointF mapPos = WorldPointToMapPoint(link.Position, link.Elev); PointF currentPoint = MapToScreen(mapPos); float dist = Get_dist(clickedPoint, currentPoint); if (dist < minDist && dist <= DistLimit) @@ -2125,7 +2159,7 @@ minDist = dist; minIndex = i; isJunction = false; - obj = _Links[i]; + obj = link; } } return obj; @@ -2309,7 +2343,7 @@ } private void 鍏ㄩ儴鏄剧ずToolStripMenuItem_Click(object sender, EventArgs e) { - _Nodes.ForEach(v => + _Nodes.Select(n=>(NodeViewModel)n).ToList() .ForEach(v => { if (!v.Visible) { @@ -2317,8 +2351,9 @@ v.Visible = true; } }); - _Links.ForEach(v => + _Links.Select(n => (LinkViewModel)n).ToList().ForEach(v0 => { + var v = (LinkViewModel)v0; if (!v.Visible) { MapObjectExtensions.AddCommand(v, "Visible", v.Visible, true); @@ -2578,8 +2613,8 @@ } else { - _Nodes.ForEach(o => o.Selected = false); - _Links.ForEach(o => o.Selected = false); + _Nodes.ForEach(o => ((NodeViewModel)o).Selected = false); + _Links.ForEach(o => ((LinkViewModel)o).Selected = false); selectedObjs.Clear(); Invalidate(); @@ -2595,8 +2630,8 @@ if (e.KeyCode == Keys.A && e.Modifiers == Keys.Control) { selectedObjs.Clear(); - _Nodes.ForEach(o => { o.Selected = true; selectedObjs.Add(o); }); - _Links.ForEach(o => { o.Selected = true; selectedObjs.Add(o); }); + _Nodes.ForEach(o => { ((NodeViewModel)o).Selected = true; selectedObjs.Add((NodeViewModel)o); }); + _Links.ForEach(o => { ((LinkViewModel)o).Selected = true; selectedObjs.Add((LinkViewModel)o); }); Invalidate(); } @@ -2777,6 +2812,7 @@ if (p.StartNode == obj) { p.StartNode = junc; + } else if (p.EndNode == obj) { @@ -2956,13 +2992,15 @@ MessageBox.Show("鍥寸粫閫変腑鑺傜偣杩涜涓夌淮缂╂斁锛岃鍦ㄥ睘鎬у垪琛ㄤ腑閫変腑涓�涓缉鏀句腑蹇冨璞�"); return; } - if (!(selectobjs[0] as IBaseViewModel).isNode()) + //if (!(selectobjs[0] as IBaseViewModel).isNode()) + var list = objs.FindAll(o => o.ID == selectobjs[0]); + if (list.Count>=1 && !list[0].isNode()) { MessageBox.Show("鍥寸粫閫変腑鑺傜偣杩涜涓夌淮缂╂斁锛岃鍦ㄥ睘鎬у垪琛ㄤ腑閫変腑涓�涓猍鑺傜偣绫籡缂╂斁涓績瀵硅薄"); return; } - NodeViewModel origin = selectobjs[0] as NodeViewModel; + NodeViewModel origin = list[0] as NodeViewModel; var nodes = objs.FindAll(o => o.isNode()).Select(o => o as NodeViewModel).ToList(); ToolStripMenuItem item = sender as ToolStripMenuItem; @@ -3022,7 +3060,8 @@ private void toolStripButton_鍒锋柊_Click(object sender, EventArgs e) { - LoadData(); + //LoadData(); + _Network.Calc(_Template.FullPath,"config_calc.wdb"); } public void 鍏抽榾鎼滅储ToolStripMenuItem_Click(object sender, EventArgs e) @@ -3709,7 +3748,7 @@ sb.AppendLine(";Node X-Coord Y-Coord"); _Nodes.ForEach(n => { - var p = WorldPointToMapPoint(n); + var p = WorldPointToMapPoint((NodeViewModel)n); sb.AppendLine($"{n.ID} {p.X} {p.Y}"); }); @@ -3832,8 +3871,8 @@ //} //net.Nodes.ForEach(o => o.Selected = false); //net.Links.ForEach(o => o.Selected = false); - selectedObjs.AddRange(net.Nodes); - selectedObjs.AddRange(net.Links); + selectedObjs.AddRange(net.Nodes.Select(n=>(NodeViewModel)n)); + selectedObjs.AddRange(net.Links.ViewLinks); //net.Nodes.ForEach(o => selectedNodes.); //net.Links.ForEach(o => o.Selected = false) ; var list = _Network.Add(net); @@ -4102,6 +4141,101 @@ } + private void 鏄剧ず姘存祦ToolStripMenuItem_Click(object sender, EventArgs e) + { + _Template.network.MapObjects.ForEach(o => o.Selected = false) ; + selectedObjs.Clear(); + _Template.network.Links.ForEach(link => + { + if (link.EN_FLOW != 0) + { + selectedObjs.Add(link); + link.Selected = true; + NodeViewModel node = link.StartNode; + node.Selected = true; + if (!selectedObjs.Contains(node)) selectedObjs.Add(node); + node = link.EndNode; + node.Selected = true; + if (!selectedObjs.Contains(node)) selectedObjs.Add(node); + + } + + }); + this.Invalidate(); + + } + + private void 鍏ㄩ�塗oolStripMenuItem_Click(object sender, EventArgs e) + { + selectedObjs.Clear(); + _Template.network.MapObjects.ForEach(o => + { + if (o.Visible) + { + o.Selected = true; + selectedObjs.Add(o); + } + + }); + this.Invalidate(); + + } + + private void 鍙嶉�塗oolStripMenuItem_Click(object sender, EventArgs e) + { + + _Template.network.MapObjects.ForEach(o => + { + if (o.Visible) + { + if (o.Selected) + { + o.Selected = false; + selectedObjs.Remove(o); + } + else + { + o.Selected = true; + selectedObjs.Add(o); + } + + } + + }); + this.Invalidate(); + } + + private void 鏄剧ず鐘舵�乀oolStripMenuItem_Click(object sender, EventArgs e) + { + _Template.mapOption._ShowStatus = true; + this.Invalidate(); + } + private void 闅愯棌鐘舵�乀oolStripMenuItem_Click(object sender, EventArgs e) + { + _Template.mapOption._ShowStatus = false; + this.Invalidate(); + + } + private void 鏄剧ず娴佸悜ToolStripMenuItem_Click(object sender, EventArgs e) + { + _Template.mapOption._ShowFlowDirection = true; + this.Invalidate(); + + + + } + private void 闅愯棌娴佸悜ToolStripMenuItem_Click(object sender, EventArgs e) + { + _Template.mapOption._ShowFlowDirection = false; + this.Invalidate(); + + + } + + + + + public class Prompt : Form { private static TextBox textBox; -- Gitblit v1.9.3