From 7cdfbc7fa91dd1a5d5240eb8602fa04725241264 Mon Sep 17 00:00:00 2001
From: cloudflight <cloudflight@126.com>
Date: 星期一, 06 五月 2024 02:29:51 +0800
Subject: [PATCH] feature:[未完成]操作优化、立管显示优化、复制操作优化、添加默认视角等; fix:复制问题修复

---
 Hydraulic/Hydro.MapUI/Map/MapViewer.cs |  249 ++++++++++++++++++++++++++++++++++++++-----------
 1 files changed, 194 insertions(+), 55 deletions(-)

diff --git a/Hydraulic/Hydro.MapUI/Map/MapViewer.cs b/Hydraulic/Hydro.MapUI/Map/MapViewer.cs
index c5744c6..13a6654 100644
--- a/Hydraulic/Hydro.MapUI/Map/MapViewer.cs
+++ b/Hydraulic/Hydro.MapUI/Map/MapViewer.cs
@@ -32,7 +32,7 @@
 using System.Threading.Tasks;
 using System.Windows.Forms;
 using System.Windows.Forms.DataVisualization.Charting;
-using static Hydro.Core.ObjectEnum;
+//using static Hydro.Core.ObjectEnum;
 using static Hydro.MapView.MapViewEnum;
 using static System.Net.Mime.MediaTypeNames;
 using static System.Windows.Forms.AxHost;
@@ -482,6 +482,11 @@
             //var n=new PointF((float)pointR.X - Z(z).X, (float)(pointR.Y - Z(z).Y));
             return pointT;
         }
+        private PointF WorldPointToMapPoint(PointF3D point, PointF3D offset = null)
+        {
+            return WorldPointToMapPoint(new PointF(point.X, point.Y), point.Z, offset);
+
+        }
         private PointF WorldPointToMapPoint(NodeViewModel junction, PointF3D offset = null)
         {
             PointF p;
@@ -502,9 +507,50 @@
             return list;
 
         }
+        /// <summary>
+        /// 鑾峰彇姝d氦鎶曞奖鍧愭爣,杩斿洖鐨勬槸涓栫晫鍧愭爣
+        /// </summary>
+        /// <param name="position3D">涓栫晫鍧愭爣</param>
+        /// <param name="mousePosition">鍦板浘鍧愭爣</param>
+        /// <param name="vector3">鎶曞奖鍚戦噺</param>
+        /// <returns></returns>
+        /// <exception cref="NotImplementedException"></exception>
+        private PointF3D GetZZWorldPoint(PointF3D position3D, PointF mousePosition, Vector3 vector3)
+        {
+            //鍋氫竴鏉¢�氳繃position3D鐨勫钩琛屼簬vector3鐨勭洿绾匡紝
+            if (vector3==new Vector3(0,0,1))
+            {
+                return GetLGWorldPoint(position3D, mousePosition);
+            }
+            else
+            {
+                return new PointF3D(0, 0, 0);
+            }
+        }
 
+        /// <summary>
+        /// 鑾峰彇姝d氦鎶曞奖鍧愭爣,杩斿洖鐨勬槸涓栫晫鍧愭爣
+        /// </summary>
+        /// <param name="position3D">涓栫晫鍧愭爣</param>
+        /// <param name="mousePosition">鍦板浘鍧愭爣</param>
+        /// <param name="vector3">鎶曞奖鍚戦噺</param>
+        /// <returns></returns>
+        /// <exception cref="NotImplementedException"></exception>
+        private PointF3D GetLGWorldPoint(PointF3D position3D, PointF p2)
+        {
+            double radian_fushi = 淇寮у害;
+            float sin = (float)Math.Sin(radian_fushi);
+            float cos = (float)Math.Cos(radian_fushi);
+            var p1 = WorldPointToMapPoint(position3D);
+            var dy=p2.Y - p1.Y;
+            float dz= dy/cos;
+            return new PointF3D(position3D.X, position3D.Y, position3D.Z+ dz);
 
-
+        }
+        private PointF MapPointToWorldPoint(PointF3D point)
+        { 
+            return MapPointToWorldPoint(new PointF(point.X, point.Y), point.Z);
+        }
         /// <summary>
         /// 鑾峰彇鍦板浘鎶曞奖鍧愭爣
         /// </summary>
@@ -695,11 +741,24 @@
                 }
                 if (_isPainting)
                 {
-                    using (var pen = new Pen(Color.Black, 1 * r))
+                    if (_mouseState == MouseState.鏂板绔嬬)
                     {
-                        pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash;
-                        bufferG.DrawLine(pen, WorldPointToMapPoint(_select_junction1), _MousePosition);
+                        var wPos=GetZZWorldPoint(_select_junction1.Position3D, _MousePosition,new Vector3(0,0,1));
+                        using (var pen = new Pen(Color.Black, 1 * r))
+                        {
+                            pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash;
+                            bufferG.DrawLine(pen, WorldPointToMapPoint(_select_junction1), WorldPointToMapPoint(wPos));
+                        }
                     }
+                    else
+                    {
+                        using (var pen = new Pen(Color.Black, 1 * r))
+                        {
+                            pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash;
+                            bufferG.DrawLine(pen, WorldPointToMapPoint(_select_junction1), _MousePosition);
+                        }
+                    }
+                    
                 }
                 if (_isDrawingPolygon && polygonPoints.Count > 0)
                 {
@@ -747,6 +806,8 @@
 
         }
 
+        
+
         PointF[] getCurclePoints(int num)
         {
             PointF[] points = new PointF[num + 1];
@@ -780,7 +841,7 @@
             //    var fl = template.Floors.Find(f => f.FloorIndex == this.mapOption.ShowFloor);
             //    var fl_1 = template.Floors.Find(f => f.FloorIndex == this.mapOption.ShowFloor+1);
             //    if (fl!=null)
-            //    {
+            //    {st
             //        minElve = fl.Elev;
 
             //        maxElve = fl_1!=null ? fl_1.Elev : float.MaxValue;
@@ -857,7 +918,13 @@
                     {
                         pen0.Color = penClosed.Color = getLinkColor(_LinkColour, link);
                     }
-                    Pen pen = link.Status == Hydro.Core.ObjectEnum.StatusType.CLOSED ? penClosed : pen0;
+                   
+                    Pen pen = pen0;
+#if DEBUG
+#else
+                    if (_Template != null && _Template.mapOption._ShowStatus && link.Status == Hydro.Core.ObjectEnum.StatusType.CLOSED) pen = penClosed;
+#endif
+
                     if (link.Hovered) pen = penHovered;
                     float zoomAtMin = 0;
                     for (int i = 0; i < diametersZoom.Count; i++)
@@ -1109,49 +1176,46 @@
                         break;
                     }
                     if (zoomAtMin >= zoom) continue;
+                    //if(node.ID == _StartPoint)
+                    //{
+                    //    var whiteRect = new RectangleF(rectangle.X - 4 * pr, rectangle.Y - 4 * pr, rectangle.Width + 8 * pr, rectangle.Height + 8 * pr);
+                    //    bufferG.FillEllipse(whiteBrush, whiteRect);
 
-                    if (node.ID == _StartPoint || node == _OperaNode)
+                    //    whiteRect = new RectangleF(rectangle.X + 2 * pr, rectangle.Y + 2 * pr, rectangle.Width - 4 * pr, rectangle.Height - 4 * pr);
+                    //    bufferG.DrawEllipse(node.Selected ? penChoosed : pen, whiteRect);
+
+                    //    whiteRect = new RectangleF(rectangle.X - 4 * pr, rectangle.Y - 4 * pr, rectangle.Width + 8 * pr, rectangle.Height + 8 * pr);
+                    //    bufferG.DrawEllipse(node.Selected ? penChoosed : pen, whiteRect);
+                    //}
+                    //else 
+                    if ( node == _OperaNode)
                     {
-                        //bufferG.DrawEllipse(junction.Choosed ? penChoosed : pen, rectangle);
                         var whiteRect = new RectangleF(rectangle.X - 4 * pr, rectangle.Y - 4 * pr, rectangle.Width + 8 * pr, rectangle.Height + 8 * pr);
                         bufferG.FillEllipse(whiteBrush, whiteRect);
 
                         whiteRect = new RectangleF(rectangle.X + 2 * pr, rectangle.Y + 2 * pr, rectangle.Width - 4 * pr, rectangle.Height - 4 * pr);
                         bufferG.DrawEllipse(node.Selected ? penChoosed : pen, whiteRect);
 
-
                         whiteRect = new RectangleF(rectangle.X - 4 * pr, rectangle.Y - 4 * pr, rectangle.Width + 8 * pr, rectangle.Height + 8 * pr);
                         bufferG.DrawEllipse(node.Selected ? penChoosed : pen, whiteRect);
-
-                        //bufferG.DrawEllipse(junction.Choosed ? penChoosed : pen, rectangle);
-
                     }
-                    else if (node.ID == _EndPoint)
-                    {
+                    //else if (node.ID == _EndPoint)//鏈�涓嶅埄鐐�
+                    //{
+                    //    //甯垜缁樺埗涓�涓埧瀛�,涓婅竟鏄笁瑙掑舰锛屼笅杈规槸鐭╁舰
 
-                        var whiteRect = new RectangleF(rectangle.X - 4 * pr, rectangle.Y - 4 * pr, rectangle.Width + 8 * pr, rectangle.Height + 8 * pr);
-                        bufferG.FillEllipse(whiteBrush, whiteRect);
+                    //    var p1 = new PointF((float)p.X - 4 * pr, (float)p.Y - 2 * pr);
+                    //    var p2 = new PointF((float)p.X + 4 * pr, (float)p.Y - 2 * pr);
+                    //    var p3 = new PointF((float)p.X, (float)p.Y - 4 * pr);
+                    //    bufferG.DrawPolygon(node.Selected ? penChoosed : pen, new PointF[] { p1,p2,p3});
 
-                        whiteRect = new RectangleF(rectangle.X - 4 * pr, rectangle.Y - 4 * pr, rectangle.Width + 8 * pr, rectangle.Height + 8 * pr);
-                        bufferG.DrawEllipse(node.Selected ? penChoosed : pen, whiteRect);
+                    //    var whiteRect = new RectangleF(rectangle.X - 4 * pr, rectangle.Y - 4 * pr, rectangle.Width + 8 * pr, rectangle.Height + 8 * pr);
+                    //    bufferG.FillEllipse(whiteBrush, whiteRect);
 
-                        //whiteRect = new RectangleF(rectangle.X + 2 * pr, rectangle.Y + 2 * pr, rectangle.Width - 4 * pr, rectangle.Height - 4 * pr);
-                        //bufferG.DrawEllipse(junction.Choosed ? penChoosed : pen, whiteRect);
+                    //    whiteRect = new RectangleF(rectangle.X - 4 * pr, rectangle.Y - 4 * pr, rectangle.Width + 8 * pr, rectangle.Height + 8 * pr);
+                    //    bufferG.DrawEllipse(node.Selected ? penChoosed : pen, whiteRect);
 
-                        var p1 = new PointF(rectangle.X + 2 * pr, rectangle.Y + 2 * pr);
-                        var p2 = new PointF(p1.X + 6 * pr, p1.Y + 6 * pr);
-                        bufferG.DrawLine(node.Selected ? penChoosed : pen, p1, p2);
-                        p1 = new PointF(rectangle.X + 2 * pr, rectangle.Y + 8 * pr);
-                        p2 = new PointF(p1.X + 6 * pr, p1.Y - 6 * pr);
-                        bufferG.DrawLine(node.Selected ? penChoosed : pen, p1, p2);
 
-                        //bufferG.FillEllipse(junction.Choosed ? brushChoosed : brush, rectangle);
-                        //var whiteRect = new RectangleF(rectangle.X + 1 * pr, rectangle.Y + 1 * pr, rectangle.Width - 2 * pr, rectangle.Height - 2 * pr);
-                        //bufferG.FillEllipse(whiteBrush, whiteRect);
-
-                        //whiteRect = new RectangleF(rectangle.X - 2 * pr, rectangle.Y - 2 * pr, rectangle.Width + 4 * pr, rectangle.Height + 4 * pr);
-                        //bufferG.DrawEllipse(junction.Choosed ? penChoosed : pen, whiteRect);
-                    }
+                    //}
                     else if (node is TankViewModel)
                     {
                         pr *= 2;
@@ -1202,7 +1266,11 @@
                 Brush brush = pen.Brush;
                 //鑾峰彇_Nodes涓嚜鐢辨按鍘嬫渶灏忕殑鑺傜偣
                 var node = _Nodes.Where(n => n is JunctionViewModel || n is MeterViewModel && n.EN_PRESSURE != float.NaN).OrderBy(n => n.EN_PRESSURE).FirstOrDefault();
-                if (node != null)
+                //鍒ゆ柇node.EN_PRESSURE涓嶆槸float.NaN
+
+                
+
+                if (node != null && !float.IsNaN( node.EN_PRESSURE))
                 {
 
                     //if (node.Elev < minElve || node.Elev >= maxElve) continue;
@@ -1236,12 +1304,23 @@
                     }
 
 
+                    //var whiteRect = new RectangleF(rectangle.X - 4 * pr, rectangle.Y - 4 * pr, rectangle.Width + 8 * pr, rectangle.Height + 8 * pr);
+                    //bufferG.FillEllipse(whiteBrush, whiteRect);
+
+                    //whiteRect = new RectangleF(rectangle.X + 2 * pr, rectangle.Y + 2 * pr, rectangle.Width - 4 * pr, rectangle.Height - 4 * pr);
+                    //bufferG.DrawEllipse(node.Selected ? penChoosed : pen, whiteRect);
+
+
+                    //whiteRect = new RectangleF(rectangle.X - 4 * pr, rectangle.Y - 4 * pr, rectangle.Width + 8 * pr, rectangle.Height + 8 * pr);
+                    //bufferG.DrawEllipse(node.Selected ? penChoosed : pen, whiteRect);
+
+                    var p1 = new PointF((float)p.X - 4 * pr, (float)p.Y - 2 * pr);
+                    var p2 = new PointF((float)p.X + 4 * pr, (float)p.Y - 2 * pr);
+                    var p3 = new PointF((float)p.X, (float)p.Y - 4 * pr);
+                    bufferG.DrawPolygon(node.Selected ? penChoosed : pen, new PointF[] { p1, p2, p3 });
+
                     var whiteRect = new RectangleF(rectangle.X - 4 * pr, rectangle.Y - 4 * pr, rectangle.Width + 8 * pr, rectangle.Height + 8 * pr);
                     bufferG.FillEllipse(whiteBrush, whiteRect);
-
-                    whiteRect = new RectangleF(rectangle.X + 2 * pr, rectangle.Y + 2 * pr, rectangle.Width - 4 * pr, rectangle.Height - 4 * pr);
-                    bufferG.DrawEllipse(node.Selected ? penChoosed : pen, whiteRect);
-
 
                     whiteRect = new RectangleF(rectangle.X - 4 * pr, rectangle.Y - 4 * pr, rectangle.Width + 8 * pr, rectangle.Height + 8 * pr);
                     bufferG.DrawEllipse(node.Selected ? penChoosed : pen, whiteRect);
@@ -1432,7 +1511,7 @@
 
         }
 
-        #endregion
+#endregion
 
 
         #region 榧犳爣浜嬩欢
@@ -1679,7 +1758,7 @@
 
 
             }
-            else
+            //else
             /*鍒ゆ柇鏄惁瑙︾鍒板璞�*/
             {
                 // 閬嶅巻鎵�鏈夊璞�,鎵惧嚭鑼冨洿鍐呯殑瀵硅薄
@@ -1687,7 +1766,7 @@
                 var obj = GetObj_by_ScreenPoint(clickedPoint);
                 if (hoveredObjs.Count > 0 && hoveredObjs[0] == obj || hoveredObjs.Count==0 && obj==null)
                 {
-                    needInvalidate = false;
+                    //needInvalidate = false;
                 }
                 else
                 {
@@ -2066,19 +2145,22 @@
                             if (_mouseState == MouseState.鏂板绔嬬)
                             {
                                 //闇�瑕佹妸榧犳爣浣嶇疆杞崲涓虹珛绠$殑浣嶇疆锛岃幏鍙栭紶鏍囦綅缃殑楂樼▼
-
-
-                                var m = ScreenToVMap(new PointF(e.X, e.Y));
-                                z = m.Y;
-                                p = new PointF(_select_junction1.X, _select_junction1.Y);
+                                
+                                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(e, true, 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(e, isdoubleClick, p, z);
+                                if (l.Count > 0) MapObjectExtensions.AddCommand(_Network, "Add", null, l);
 
                             }
-                            var l = AddLink(e, isdoubleClick, p, z);
-                            if (l.Count > 0) MapObjectExtensions.AddCommand(_Network, "Add", null, l);
+                            
                         }
                         break;
                 }
@@ -2496,7 +2578,7 @@
         private int _lastMouseY;
         #endregion
 
-        #endregion 涓�銆佸叏灞�
+#endregion 涓�銆佸叏灞�
 
         #region 浜屻�佸伐鍏锋爮
 
@@ -2572,7 +2654,19 @@
 
             Invalidate();
         }
+        private void 榛樿瑙嗚ToolStripMenuItem_Click(object sender, EventArgs e)
+        {
+       
 
+            mapOption0 = mapOption.Copy();
+            
+            InitCenter();
+            RotationF = 45;
+            Rotation = -45;
+            MapObjectExtensions.AddCommand(mapOption, "Map", mapOption0, mapOption);
+
+            Invalidate();
+        }
         private void 璁句负闅愯棌ToolStripMenuItem_Click(object sender, EventArgs e)
         {
             selectedObjs.ForEach(v =>
@@ -4160,9 +4254,18 @@
         }
         public void 澶嶅埗ToolStripMenuItem_Click(object sender, EventArgs e)
         {
-            if (selectedObjs.Count <= 0) return;
-            if (selectedNodes.Count <= 0) return;
-            _OperaNode = selectedNodes[0];
+            if(hoveredObjs.Count<=0 || !(hoveredObjs[0] is NodeViewModel))
+            {
+                MessageBox.Show("璇峰皢榧犳爣鎮仠鍦ㄤ竴涓妭鐐瑰璞′笂,浣滀负鍩哄噯鐐�");
+                return;
+            }
+            if (selectedObjs.Count <= 0 || selectedNodes.Count <= 0)
+            {
+                MessageBox.Show("璇烽�夋嫨瑕佸鍒剁殑瀵硅薄");
+                return;
+            }
+           
+            _OperaNode = hoveredObjs[0] as NodeViewModel;
 
             MapViewNetWork net = new MapViewNetWork();
             net.StartPoint = _OperaNode;
@@ -4235,7 +4338,7 @@
         }
         private void 璁句负鍏抽棴ToolStripMenuItem_Click(object sender, EventArgs e)
         {
-            selectedObjs.ForEach(obj => { if (obj is LinkViewModel link) link.Status = StatusType.CLOSED; });
+            selectedObjs.ForEach(obj => { if (obj is LinkViewModel link) link.Status =Hydro.Core.ObjectEnum. StatusType.CLOSED; });
             Invalidate();
         }
         private void 鏄剧ず鍏ㄩ儴妤煎眰ToolStripMenuItem_Click(object sender, EventArgs e)
@@ -4602,6 +4705,26 @@
         Colour _NodeColour = null;
         Colour _LinkColour = null;
         private List<IBaseViewModel> hoveredObjs=new List<IBaseViewModel>();
+        private bool __isOrtho = true;
+        private bool _isOrtho
+        {
+            get
+            {
+                return __isOrtho;
+            }
+            set
+            {
+                __isOrtho = value;
+                if (__isOrtho)
+                {
+                    label_ZZ.Text = "姝d氦妯″紡:寮�";
+                }
+                else
+                {
+                    label_ZZ.Text = "姝d氦妯″紡:鍏�";
+                }
+            }
+        }
 
         private void cb_Node_Colour_Click(object sender, EventArgs e)
         {
@@ -4661,7 +4784,23 @@
             this.Invalidate();
         }
 
-        
+        private void label_ZZ_Click(object sender, EventArgs e)
+        {
+            //姝d氦妯″紡鐨勫叏灞�鍙橀噺寮�鍏�
+            _isOrtho = !_isOrtho;
+        }
+
+        private void 妤煎眰绠$悊ToolStripMenuItem_Click(object sender, EventArgs e)
+        {
+            if (_Template.Regions==null)
+            {
+                _Template.Regions = new List<TRegion>();
+            }
+            Form_EditFloors form_EditFloors = new Form_EditFloors(_Template.Regions);
+            form_EditFloors.Show(this);
+        }
+
+       
 
         public class Prompt : Form
         {

--
Gitblit v1.9.3