cloudflight
2024-06-04 252d49eda4ac2b61d0c72ee0c1839779f0ce1d3a
Hydraulic/Hydro.MapUI/Map/MapViewer.cs
@@ -119,7 +119,7 @@
            //if (!showToolBar) this.panel1.Visible = false;
        }
        public MapViewer()
        public MapViewer()
        {
            this.showToolBar = false;
@@ -127,10 +127,14 @@
            MapCenter = PointF.Empty;
            zoom = 1.0f;
            SetStyle(ControlStyles.SupportsTransparentBackColor, true);
            BackColor = Color.Transparent;
        }
        public void SetEditMode(bool isEditMode)
        {
            _IsEditMode = isEditMode;
        }
        private void MapViewer_Load(object sender, EventArgs e)
        {
@@ -161,9 +165,13 @@
            cb_Link_Colour.SelectedIndex = 0;
            map.Init(TC,new DrawDelegate[] { Draw, Draw, DrawH },new MouseDelegate[] { mapMouseDown, mapMouseMove, mapMouseUp, mapMouseWheel });
<<<<<<< HEAD
            map.Init(TC,new DrawDelegate[] { Draw, Draw, DrawBackGroud, DrawH },new MouseDelegate[] { mapMouseDown, mapMouseMove, mapMouseUp, mapMouseWheel });
=======
            map.Init(TC, new DrawDelegate[] { Draw, Draw, DrawH }, new MouseDelegate[] { mapMouseDown, mapMouseMove, mapMouseUp, mapMouseWheel });
>>>>>>> 0f2ff322746347b91941d936ee27067295e57c76
        }
@@ -175,7 +183,7 @@
        public bool LoadData(bool isDelCache = false)
        {
            if (_Template == null) return false;
            if (isDelCache || _Template.network == null)
            {
@@ -252,7 +260,7 @@
            bool reLoad = _Template == template;
            this._Template = template;
            this._ViewModel = viewMode;
            //if ( _Template?.Floors!=null)
            //{
@@ -295,7 +303,7 @@
                    SetMapInvalidate();
                }
            }
            刷新楼层ToolStripMenuItem_Click(1, new EventArgs());
            label_center.Text = $"center:({MapCenter.X.ToString("0.00")} ,{MapCenter.Y.ToString("0.00")})";
            label_zoom.Text = $"Zoom:{zoom.ToString("0.000")}";
@@ -377,8 +385,8 @@
        #region 重绘函数
        bool _needPaintAll
        {
        bool _needPaintAll
        {
            get
            {
                return __needpaintall;
@@ -388,6 +396,9 @@
                __needpaintall = value;
            }
        }
<<<<<<< HEAD
=======
        //protected override void OnPaint(PaintEventArgs e)
        //{
        //    base.OnPaint(e);
@@ -491,7 +502,7 @@
        //        }
        //        if (_isSettingBackGroundPictur)
        //        {
        //            var _lastMousePosition = DragStartPos;
        //            // 绘制矩形
        //            var start = new PointF((float)Math.Min(mousePosition.X, _lastMousePosition.X), (float)Math.Min(mousePosition.Y, _lastMousePosition.Y));
@@ -523,6 +534,7 @@
        //    e.Graphics.DrawImage(buffer, 0, 0);
        //}
>>>>>>> 0f2ff322746347b91941d936ee27067295e57c76
        PointF[] getCurclePoints(int num)
        {
@@ -539,17 +551,20 @@
            return points;
        }
        private void timer_draw_Tick(object sender, EventArgs e)
        {
            _mouseHoverCheckFlag = true;
            if (_timerDraw)
            if (_timerDraw && map.Status==DrawingStatus.Ready)
            {
                this.map.Invalidate();
            _timerDraw = false;
                _timerDraw = false;
            }
        }
        protected override void OnResize(EventArgs e)
@@ -565,13 +580,13 @@
        #region 鼠标事件
        void mapMouseDown(MouseEventArgs e)
        {
            base.OnMouseDown(e);
            _ClickStartPos = new PointF(e.X, e.Y);
            DragStartPos= ScreenToMap(new PointF(e.X, e.Y));
            DragStartPos = ScreenToMap(new PointF(e.X, e.Y));
            mousePosition = _MousePosition = ScreenToMap(new PointF(e.X, e.Y));
            if (e.Button == MouseButtons.Left && _isInsertingObject)
            {
@@ -623,7 +638,7 @@
                }
                //移动
                if (selectedObjs.Count >= 1) //&& selectedObjs[0].isNode())
                if (_IsEditMode && selectedObjs.Count >= 1) //&& selectedObjs[0].isNode())
                {
                    List<NodeViewModel> nodes = selectedNodes;
                    foreach (NodeViewModel node in nodes)
@@ -752,7 +767,7 @@
                //    Math.Abs((int)DragStartPos.Y - (int)MP.Y));
                //DrawSelectionRect(selectionRect);
                needInvalidate = true;
            }
            else if (_isRotating)
            {
@@ -786,7 +801,7 @@
                // 遍历所有对象,找出范围内的对象
                PointF clickedPoint = new PointF(e.X, e.Y);  //ScreenToMap(new PointF(e.X, e.Y));
                var obj = GetObj_by_ScreenPoint(clickedPoint);
                if (hoveredObjs.Count > 0 && hoveredObjs[0] == obj || hoveredObjs.Count==0 && obj==null)
                if (hoveredObjs.Count > 0 && hoveredObjs[0] == obj || hoveredObjs.Count == 0 && obj == null)
                {
                    //needInvalidate = false;
                }
@@ -795,18 +810,18 @@
                    needInvalidate = true;
                    hoveredObjs.ForEach(o => o.Hovered = false);
                    hoveredObjs.Clear();
                    if (obj!=null)
                    if (obj != null)
                    {
                        obj.Hovered = true;
                        hoveredObjs.Add(obj);
                    }
                }
            }
            if (needInvalidate) this.SetMapInvalidate();
@@ -932,7 +947,8 @@
            }
            if  /*插入结构*/(e.Button == MouseButtons.Left && _isInsertingObject)
            {
                var net = _newTemplate.network;
                var net = _newTemplate.network;//clone
                var net0 = _newTemplate.network.DeepCopyByBin<MapViewNetWork>();
                List<NodeViewModel> nodes = _Nodes.Select(node => (NodeViewModel)node).ToList();
                float minDist = 100f;
                NodeViewModel minNode = null;
@@ -957,7 +973,7 @@
                    var p1 = (PointF3D)_undoOldValue;
                    var p2 = minNode.Position3D;
                    var dd = _newTemplate.OffSet;
                    //var dd = _newTemplate.OffSet;
                    dx = p2.X - p1.X;
                    dy = p2.Y - p1.Y;
                    dz = p2.Z - p1.Z;
@@ -988,7 +1004,7 @@
                var list = _Network.Add(net);
                var j = _Network.AddPipe(minNode, _OperaNode);
                j.Length = 0.0001f;
                //j.Length = 0.0001f;
                list.Add(j);
                _OperaNode = null;
                _NewNet.Clear();
@@ -1002,12 +1018,24 @@
                selectedObjs.AddRange(list);
                MapObjectExtensions.AddCommand(_Network, "Add", null, list);
                _isInsertingObject = false;
<<<<<<< HEAD
                _newTemplate.network = net0;
                _isInsertingObject = true;
                _undoOldValue = new PointF3D(0, 0, 0);
                _OperaNode = _newTemplate.network.Nodes.Find(node => node.ID == _newTemplate.Node1) as NodeViewModel;
=======
                //_OperaNode = null;
                //_Network.Nodes.AddRange(net.Nodes);
                //_Network.Links.AddRange(net.Links);
>>>>>>> 0f2ff322746347b91941d936ee27067295e57c76
                SetMapInvalidate();
                return;
            }
@@ -1047,8 +1075,6 @@
                NodeViewModel minNode = null;
                foreach (NodeViewModel node in nodes)
                {
                    PointF mapPos = WorldPointToMapPoint(node);
                    PointF currentPoint = MapToScreen(mapPos);
                    float currentDist = 0;
@@ -1074,6 +1100,10 @@
                    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);
                    var l = new List<IBaseViewModel>();
                    l.Add(_Network.AddPipe(_OperaNode, minNode));
                    if (l.Count > 0) MapObjectExtensions.AddCommand(_Network, "Add", null, l);
                    _OperaNode = null;
                    _NewNet.Clear();
                }
@@ -1148,7 +1178,7 @@
                    case MouseState.新建重复器:
                        if (_select_junction1 == null)
                        {
                            if (_mouseState==MouseState.新增立管)
                            if (_mouseState == MouseState.新增立管)
                            {
                                var m = ScreenToVMap(new PointF(e.X, e.Y));
                                z = m.Y;
@@ -1160,29 +1190,41 @@
                                getPointAndHeight(e, out p, out z);
                                Set_junction1(e);
                            }
                        }
                        else
                        {
                            if (_mouseState == MouseState.新增立管)
                            {
                                //需要把鼠标位置转换为立管的位置,获取鼠标位置的高程
                                var wPos = GetZZWorldPoint(_select_junction1.Position3D, _MousePosition, new Vector3(0, 0, 1));
                                //var m = ScreenToVMap(new PointF(e.X, e.Y));
                                //z = m.Y;
                                p = new PointF(wPos.X, wPos.Y);
                                var l = AddLink(new PointF( e.X,e.Y), true, p, wPos.Z);
                                var l = AddLink(new PointF(e.X, e.Y), isdoubleClick, p, wPos.Z);
                                if (l.Count > 0) MapObjectExtensions.AddCommand(_Network, "Add", null, l);
                            }
                            else
                            {
                                getPointAndHeight(e, _select_junction1, out p, out z);
                                var l = AddLink(new PointF(e.X, e.Y), isdoubleClick, p, z);
                                if (l.Count > 0) MapObjectExtensions.AddCommand(_Network, "Add", null, l);
                                if (mapOption.IsOrtho)
                                {
                                    var wPos = GetZZWorldPoint(_select_junction1.Position3D, _MousePosition, new Vector3(1, 1, 0));
                                    //getPointAndHeight(e, _select_junction1, out p, out z);
                                    p = new PointF(wPos.X, wPos.Y);
                                    var l = AddLink(new PointF(e.X, e.Y), isdoubleClick, p, wPos.Z);
                                    if (l.Count > 0) MapObjectExtensions.AddCommand(_Network, "Add", null, l);
                                }
                                else
                                {
                                    getPointAndHeight(e, _select_junction1, out p, out z);
                                    var l = AddLink(new PointF(e.X, e.Y), isdoubleClick, p, z);
                                    if (l.Count > 0) MapObjectExtensions.AddCommand(_Network, "Add", null, l);
                                }
                            }
                        }
                        break;
                }
@@ -1450,8 +1492,11 @@
                    if (!isMouseMoved)
                    {
                        右键_Menu.Show(this, e.Location);
                        转换为ToolStripMenuItem.Enabled = selectedNodes.Count > 0; //(selectedObjs.Count == 1);
                        删除ToolStripMenuItem.Enabled = selectedObjs.Count > 0;
                        删除ToolStripMenuItem1.Enabled = selectedObjs.Count > 0;
                    }
                    if (recordView) MapObjectExtensions.AddCommand(mapOption, "Map", mapOption0, mapOption);
@@ -1492,7 +1537,7 @@
        IBaseViewModel GetObj_by_ScreenPoint(PointF clickedPoint, float DistLimit = 15f)
        {
            float minDist = float.MaxValue;
            int minIndex = -1;
            bool isJunction = true;
            IBaseViewModel obj = null;
@@ -1541,9 +1586,9 @@
            float minDist = float.MaxValue;
            int minIndex = -1;
            IBaseViewModel obj = null;
            List < IBaseViewModel > objs = new List<IBaseViewModel>();
            List<IBaseViewModel> objs = new List<IBaseViewModel>();
            for (int i = 0; i < _Nodes.Count; i++)
            {
                var node = _Nodes[i] as NodeViewModel;
@@ -1572,7 +1617,7 @@
                //float dist = Get_dist(clickedPoint, currentPoint);
                if (dist < minDist && dist <= DistLimit)
                {
                    objs.Add(link);
                }
@@ -1678,10 +1723,10 @@
        }
        private void 默认视角ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            mapOption0 = mapOption.Copy();
            InitCenter();
            RotationF = 45;
            Rotation = -45;
@@ -1804,8 +1849,8 @@
            {
                _Template = new Template();
                _Template.network = new MapViewNetWork();
                //_Template.network.use_old = false;
                // 获取选中文件的文件路径
                string filePath = openFileDialog.FileName;
@@ -1895,7 +1940,7 @@
        #region 绘图工具
        public void toolStripButton_新建节点_Click(object sender, EventArgs e)
        {
            _mouseState = MouseState.新增节点;
@@ -1906,6 +1951,55 @@
        {
            _mouseState = MouseState.无;
            Cursor = Cursors.Default;
            if (_isPainting)
            {
                _select_junction1 = null;
                _isPainting = false;
                SetMapInvalidate();
            }
            else if (_isDragging)
            {
                _isDragging = false;
                SetMapInvalidate();
            }
            else if (_isPanning)
            {
                _isPanning = false;
                SetMapInvalidate();
            }
            else if (_isRotating)
            {
                Rotation = Rotation0;
                _isRotating = false;
                SetMapInvalidate();
            }
            else if (_isMovingObject)
            {
                _NewNet.Clear();
                _isMovingObject = false;
                SetMapInvalidate();
            }
            else if (_mouseState != MouseState.无)
            {
                _mouseState = MouseState.无;
                Cursor = Cursors.Default;
            }
            else if (_isInsertingObject)
            {
                _NewNet.Clear();
                _isInsertingObject = false;
                _OperaNode = null;
                SetMapInvalidate();
            }
            else
            {
                _Nodes.ForEach(o => ((NodeViewModel)o).Selected = false);
                _Links.ForEach(o => ((LinkViewModel)o).Selected = false);
                selectedObjs.Clear();
                SetMapInvalidate();
            }
        }
        public void toolStripButton_新建管线_Click(object sender, EventArgs e)
@@ -1913,7 +2007,7 @@
            _mouseState = MouseState.新增管线;
            Cursor = Cursors.Cross;
        }
        public void toolStripButton_新建立管_Click(object sender,EventArgs e)
        public void toolStripButton_新建立管_Click(object sender, EventArgs e)
        {
            _mouseState = MouseState.新增立管;
            Cursor = Cursors.Cross;
@@ -1936,7 +2030,7 @@
                    l.Add(_select_junction2);
                }
                if (_mouseState == MouseState.新增管线 || _mouseState==MouseState.新增立管)
                if (_mouseState == MouseState.新增管线 || _mouseState == MouseState.新增立管)
                    l.Add(_Network.AddPipe(_select_junction1, _select_junction2));
                else if (_mouseState == MouseState.新建阀门)
                    l.Add(_Network.AddValve(_select_junction1, _select_junction2));
@@ -2057,7 +2151,7 @@
            }
            if (e.KeyCode == Keys.Delete)
            if (_IsEditMode && e.KeyCode == Keys.Delete)
            {
                DeleteChoosedObj();
            }
@@ -2069,29 +2163,29 @@
                SetMapInvalidate();
            }
            if (e.KeyCode == Keys.C && e.Modifiers == Keys.Control)
            if (_IsEditMode && e.KeyCode == Keys.C && e.Modifiers == Keys.Control)
            {
                复制ToolStripMenuItem_Click(1, new EventArgs());
            }
            if (e.KeyCode == Keys.V && e.Modifiers == Keys.Control)
            if (_IsEditMode && e.KeyCode == Keys.V && e.Modifiers == Keys.Control)
            {
                _ClickStartPos = Cursor.Position;
                粘贴ToolStripMenuItem1_Click(1, new EventArgs());
            }
            if (e.KeyCode == Keys.D1 && e.Modifiers == Keys.Control)
            if (_IsEditMode && e.KeyCode == Keys.D1 && e.Modifiers == Keys.Control)
            {
                南北对齐ToolStripMenuItem_Click(1, new EventArgs());
            }
            if (e.KeyCode == Keys.Oemtilde && e.Modifiers == Keys.Control)
            if (_IsEditMode && e.KeyCode == Keys.Oemtilde && e.Modifiers == Keys.Control)
            {
                东西对齐ToolStripMenuItem_Click(1, new EventArgs());
            }
            if (e.KeyCode == Keys.D2 && e.Modifiers == Keys.Control)
            if (_IsEditMode && e.KeyCode == Keys.D2 && e.Modifiers == Keys.Control)
            {
                竖直对齐ToolStripMenuItem_Click(1, new EventArgs());
            }
            if (e.KeyCode == Keys.D3 && e.Modifiers == Keys.Control)
            if (_IsEditMode && e.KeyCode == Keys.D3 && e.Modifiers == Keys.Control)
            {
                自动对齐ToolStripMenuItem_Click(1, new EventArgs());
            }
@@ -2101,7 +2195,7 @@
        private void MapViewer_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (ctrlPressed && e.KeyChar == 'Z' - 64)
            if (_IsEditMode && ctrlPressed && e.KeyChar == 'Z' - 64)
            {
                // 执行相应的操作
                buttonUndo_Click(sender, e);
@@ -2110,7 +2204,7 @@
                // 防止默认操作
                e.Handled = true;
            }
            if (ctrlPressed && e.KeyChar == 'Y' - 64)
            if (_IsEditMode && ctrlPressed && e.KeyChar == 'Y' - 64)
            {
                // 执行相应的操作
                buttonRedo_Click(sender, e);
@@ -2131,14 +2225,14 @@
        }
        private void MapViewer_PreKeyPress(object sender, PreviewKeyDownEventArgs e)
        {
            if (e.Control && e.KeyCode == Keys.Z)
            if (_IsEditMode && e.Control && e.KeyCode == Keys.Z)
            {
                ctrlPressed = true;
                // 防止默认操作
                e.IsInputKey = true;
            }
            if (e.Control && e.KeyCode == Keys.Y)
            if (_IsEditMode && e.Control && e.KeyCode == Keys.Y)
            {
                ctrlPressed = true;
                // 防止默认操作
@@ -2286,7 +2380,7 @@
        {
            _IsEditMode = !_IsEditMode;
            //toolStripComboBox_浏览模式.Text = isEditMode ? "编辑模式" : "浏览模式";
            LoadData(true);
            //LoadData(true);
        }
        private void 浏览模式ToolStripMenuItem_Click(object sender, EventArgs e)
@@ -2294,7 +2388,7 @@
            var obj = sender as ToolStripItem;
            _IsEditMode = obj.Text == "编辑模式";
            //toolStripComboBox_浏览模式.Text = isEditMode ? "编辑模式" : "浏览模式";
            LoadData(true);
            //LoadData(true);
        }
        #endregion
@@ -2448,7 +2542,7 @@
        private void 缩放ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            var objs = GlobalObject.PropertyForm.selectionSet.selectedObjects;
            var list = objs.FindAll(o => o is NodeViewModel); //GlobalObject.PropertyForm.listBox1.SelectedItems;
            if (list.Count <= 0) return;
@@ -2522,12 +2616,12 @@
        }
        public void toolStripButton_计算_Click(object sender, EventArgs e)
        {
            //LoadData();
            _Network.Calc(_Template.FullPath, GlobalPath.configPath+ "config_calc.wdb");
            _Network.Calc(_Template.FullPath, GlobalPath.configPath + "config_calc.wdb");
        }
        public void 关阀搜索ToolStripMenuItem_Click(object sender, EventArgs e)
@@ -2803,7 +2897,7 @@
        //    }
        //}
        private void TraversePipeNetworkALL(LinkViewModel startLink, HashSet<NodeViewModel> visitedNodes = null,int direction=0)
        private void TraversePipeNetworkALL(LinkViewModel startLink, HashSet<NodeViewModel> visitedNodes = null, int direction = 0)
        {
            Queue<LinkViewModel> queue = new Queue<LinkViewModel>();
@@ -3188,6 +3282,59 @@
            }
        }
        /// <summary>
        /// 批量一键生成楼层模型
        /// </summary>
        public void BatchInsertNet(Template temp)
        {
            var nodes = _Nodes.Where(c => c.Elev > 0).Select(node => (NodeViewModel)node).ToList();
            _undoOldValue = new PointF3D(0, 0, 0);
            _OperaNode = temp.network.Nodes.Find(node => node.ID == temp.Node1) as NodeViewModel;
            //foreach (var item in nodes)
            if (nodes.Any())
            {
                for (var i = 0; i < nodes.Count(); i++)
                {
                    var net = temp.network.DeepCopy();
                    float dx, dy, dz;
                    var p1 = (PointF3D)_undoOldValue;
                    var p2 = nodes[i].Position3D;
                    var dd = temp.OffSet;
                    dx = p2.X - p1.X;
                    dy = p2.Y - p1.Y;
                    dz = 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(nodes[i], _OperaNode);
                    //j.Length = 0.0001f;
                    //list.Add(j);
                    _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);
                }
                _OperaNode = null;
                //_OperaNode = null;
                //_Network.Nodes.AddRange(net.Nodes);
                //_Network.Links.AddRange(net.Links);
                SetMapInvalidate();
            }
        }
        private void 以当前视角另存ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (_Template == null) return;
@@ -3247,7 +3394,7 @@
            {
                var objs = selectedObjs.FindAll(o => o is LinkViewModel).Select(o => o as LinkViewModel).ToList();
                if (objs.Count == 0) selectedObjs.FindAll(o => o is NodeViewModel).Select(o => o as NodeViewModel).ToList().ForEach(o=>objs.AddRange(o.Links.Select(l=>l as LinkViewModel).ToList()));
                if (objs.Count == 0) selectedObjs.FindAll(o => o is NodeViewModel).Select(o => o as NodeViewModel).ToList().ForEach(o => objs.AddRange(o.Links.Select(l => l as LinkViewModel).ToList()));
                //objs去掉重复的元素
                objs = objs.Distinct().ToList();
                var visitedNodes = new HashSet<NodeViewModel>();
@@ -3264,21 +3411,21 @@
            {
                var objs = selectedObjs.FindAll(o => o is LinkViewModel).Select(o => o as LinkViewModel).ToList();
                if (objs.Count == 0) selectedObjs.FindAll(o => o is NodeViewModel).Select(o => o as NodeViewModel).ToList().ForEach(o =>
                if (objs.Count == 0) selectedObjs.FindAll(o => o is NodeViewModel).Select(o => o as NodeViewModel).ToList().ForEach(o =>
                {
                    objs.AddRange(o.Links.Select(oo => oo as LinkViewModel).ToList().FindAll(oo=>oo.StartNode==o?oo.EN_FLOW>0:oo.EN_FLOW<0));
                    objs.AddRange(o.Links.Select(oo => oo as LinkViewModel).ToList().FindAll(oo => oo.StartNode == o ? oo.EN_FLOW > 0 : oo.EN_FLOW < 0));
                });
                //objs去掉重复的元素
                objs = objs.Distinct().ToList();
                var visitedNodes = new HashSet<NodeViewModel>();
                objs.ForEach(o => TraversePipeNetworkALL(o, visitedNodes,1));
                objs.ForEach(o => TraversePipeNetworkALL(o, visitedNodes, 1));
                this.SetMapInvalidate();
            }
        }
        public void 复制ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if(hoveredObjs.Count<=0 || !(hoveredObjs[0] is NodeViewModel))
            if (hoveredObjs.Count <= 0 || !(hoveredObjs[0] is NodeViewModel))
            {
                MessageBox.Show("请将鼠标悬停在一个节点对象上,作为基准点");
                return;
@@ -3288,7 +3435,7 @@
                MessageBox.Show("请选择要复制的对象");
                return;
            }
            _OperaNode = hoveredObjs[0] as NodeViewModel;
            MapViewNetWork net = new MapViewNetWork();
@@ -3313,29 +3460,62 @@
        public void 粘贴ToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            {
                var net = new MapViewNetWork();
                string json = Clipboard.GetText();
                net.ReadFromJson(json);
                PointF minPoint = new PointF(net.StartPoint.X, net.StartPoint.Y);
                if (net.StartPoint == null) return;
                string SID = net.StartPoint.ID;
                net.StartPoint = net.Nodes.Find(n => n.ID == SID);
                PointF3D minPoint = net.StartPoint.Position3D;// new PointF(net.StartPoint.X, net.StartPoint.Y);
                Point controlLocation = this.PointToScreen(new Point(0, 0));
                int offsetX = Cursor.Position.X - controlLocation.X;
                int offsetY = Cursor.Position.Y - controlLocation.Y;
                var position = new Point(offsetX, offsetY);
                net.BuildRelation();
                var basePoint = MapPointToWorldPoint(ScreenToMap(position, net.StartPoint.Elev), net.StartPoint.Elev);
                net.Nodes.ForEach(obj =>
                //var basePoint = MapPointToWorldPoint(ScreenToMap(position, net.StartPoint.Elev), net.StartPoint.Elev);
                var mPos = _MousePosition;
                if (hoveredObjs.Count > 0 && hoveredObjs[0] is NodeViewModel minNode)
                {
                    obj.X = obj.X + basePoint.X - minPoint.X;
                    obj.Y = obj.Y + basePoint.Y - minPoint.Y;
                });
                selectedObjs.ForEach(o => o.Selected = false);
                selectedObjs.Clear();
                selectedObjs.AddRange(net.Nodes.Select(n => (NodeViewModel)n));
                selectedObjs.AddRange(net.Links.ViewLinks);
                var list = _Network.Add(net);
                MapObjectExtensions.AddCommand(_Network, "Add", null, list);
                SetMapInvalidate();
                    var basePoint = minNode.Position3D;
                    net.Nodes.ForEach(obj =>
                    {
                        obj.X = obj.X + basePoint.X - minPoint.X;
                        obj.Y = obj.Y + basePoint.Y - minPoint.Y;
                        obj.Elev = obj.Elev + basePoint.Z - minPoint.Z;
                    });
                    selectedObjs.ForEach(o => o.Selected = false);
                    selectedObjs.Clear();
                    selectedObjs.AddRange(net.Nodes.Select(n => (NodeViewModel)n));
                    selectedObjs.AddRange(net.Links.ViewLinks);
                    var list = _Network.Add(net, null, false, minNode);
                    net.BuildRelation();
                    //list.Add(_Network.AddPipe(Snode, minNode));
                    MapObjectExtensions.AddCommand(_Network, "Add", null, list);
                    SetMapInvalidate();
                }
                else
                {
                    var basePoint = MapPointToWorldPoint(_MousePosition, net.StartPoint.Elev);
                    net.Nodes.ForEach(obj =>
                    {
                        obj.X = obj.X + basePoint.X - minPoint.X;
                        obj.Y = obj.Y + basePoint.Y - minPoint.Y;
                    });
                    selectedObjs.ForEach(o => o.Selected = false);
                    selectedObjs.Clear();
                    selectedObjs.AddRange(net.Nodes.Select(n => (NodeViewModel)n));
                    selectedObjs.AddRange(net.Links.ViewLinks);
                    var list = _Network.Add(net);
                    net.BuildRelation();
                    MapObjectExtensions.AddCommand(_Network, "Add", null, list);
                    SetMapInvalidate();
                }
            }
        }
        private void 增量保存ToolStripMenuItem_Click(object sender, EventArgs e)
@@ -3362,7 +3542,7 @@
        }
        private void 设为关闭ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            selectedObjs.ForEach(obj => { if (obj is LinkViewModel link) link.Status =Hydro.Core.ObjectEnum. StatusType.CLOSED; });
            selectedObjs.ForEach(obj => { if (obj is LinkViewModel link) link.Status = Hydro.Core.ObjectEnum.StatusType.CLOSED; });
            SetMapInvalidate();
        }
        private void 显示全部楼层ToolStripMenuItem_Click(object sender, EventArgs e)
@@ -3676,11 +3856,11 @@
                string tagstring = i.ToString() + "楼";
                if (tags.Contains(tagstring))
                {
                    var item=ToolStripMenuItem_Floor.DropDownItems.Add(i.ToString() + "楼");
                    var item = ToolStripMenuItem_Floor.DropDownItems.Add(i.ToString() + "楼");
                    item.Click += (oo, ee) =>
                    {
                        mapobjects.ForEach(o =>
                        {
                            if (o.Tags.Contains(tagstring))
@@ -3719,30 +3899,30 @@
        {
            _isShowDirection = !_isShowDirection;
        }
        bool _isShowDirection=false;
        bool _isShowDirection = false;
        private void 颜色分级管理ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Form_Colour form_Colour = new Form_Colour(_Template.Colours);
            Form_Colour form_Colour = new Form_Colour(_Template.Colours,_Template);
            form_Colour.Show(this);
        }
      private bool __needpaintall=false;
        private bool __needpaintall = false;
        private void cb_Link_Colour_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (_Template == null) return;
            var type = cb_Link_Colour.SelectedItem==null?ColourType.管线流量:(ColourType)cb_Link_Colour.SelectedItem;
            var type = cb_Link_Colour.SelectedItem == null ? ColourType.管线流量 : (ColourType)cb_Link_Colour.SelectedItem;
            mapOption.ColourLink = type;
            this.SetMapInvalidate();
        }
        private void cb_Node_Colour_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (_Template == null) return;
            var type = cb_Node_Colour.SelectedItem==null?ColourType.节点自由压力:(ColourType)cb_Node_Colour.SelectedItem;
            var type = cb_Node_Colour.SelectedItem == null ? ColourType.节点自由压力 : (ColourType)cb_Node_Colour.SelectedItem;
            mapOption.ColourNode = type;
            this.SetMapInvalidate();
        }
@@ -3755,7 +3935,7 @@
        private void 楼层管理ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (_Template.Regions==null)
            if (_Template.Regions == null)
            {
                _Template.Regions = new List<TRegion>();
            }
@@ -3763,9 +3943,9 @@
            form_EditFloors.Show(this);
        }
        #endregion
    }
}