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