cloudflight
2023-12-26 5fa6947054206e2e781eadd4effdcdf52eda28c4
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 全选ToolStripMenuItem_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 反选ToolStripMenuItem_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 显示状态ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            _Template.mapOption._ShowStatus = true;
            this.Invalidate();
        }
        private void 隐藏状态ToolStripMenuItem_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;