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