| | |
| | | |
| | | //if (!showToolBar) this.panel1.Visible = false; |
| | | } |
| | | public MapViewer() |
| | | public MapViewer() |
| | | { |
| | | |
| | | this.showToolBar = false; |
| | |
| | | |
| | | MapCenter = PointF.Empty; |
| | | zoom = 1.0f; |
| | | |
| | | |
| | | SetStyle(ControlStyles.SupportsTransparentBackColor, true); |
| | | BackColor = Color.Transparent; |
| | | |
| | | } |
| | | public void SetEditMode(bool isEditMode) |
| | | { |
| | | _IsEditMode= isEditMode; |
| | | } |
| | | _IsEditMode = isEditMode; |
| | | } |
| | | private void MapViewer_Load(object sender, EventArgs e) |
| | | { |
| | | this.panel1.Visible = _showToolBar; |
| | |
| | | |
| | | cb_Link_Colour.SelectedIndex = 0; |
| | | |
| | | map.Init(TC,new DrawDelegate[] { Draw, Draw, DrawH },new MouseDelegate[] { mapMouseDown, mapMouseMove, mapMouseUp, mapMouseWheel }); |
| | | map.Init(TC, new DrawDelegate[] { Draw, Draw, DrawH }, new MouseDelegate[] { mapMouseDown, mapMouseMove, mapMouseUp, mapMouseWheel }); |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | } |
| | |
| | | |
| | | public bool LoadData(bool isDelCache = false) |
| | | { |
| | | |
| | | |
| | | if (_Template == null) return false; |
| | | if (isDelCache || _Template.network == null) |
| | | { |
| | |
| | | bool reLoad = _Template == template; |
| | | this._Template = template; |
| | | this._ViewModel = viewMode; |
| | | |
| | | |
| | | |
| | | //if ( _Template?.Floors!=null) |
| | | //{ |
| | |
| | | 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")}"; |
| | |
| | | |
| | | #region 重绘函数 |
| | | |
| | | bool _needPaintAll |
| | | { |
| | | bool _needPaintAll |
| | | { |
| | | get |
| | | { |
| | | return __needpaintall; |
| | |
| | | // } |
| | | // if (_isSettingBackGroundPictur) |
| | | // { |
| | | |
| | | |
| | | // var _lastMousePosition = DragStartPos; |
| | | // // 绘制矩形 |
| | | // var start = new PointF((float)Math.Min(mousePosition.X, _lastMousePosition.X), (float)Math.Min(mousePosition.Y, _lastMousePosition.Y)); |
| | |
| | | return points; |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | private void timer_draw_Tick(object sender, EventArgs e) |
| | | { |
| | | _mouseHoverCheckFlag = true; |
| | |
| | | |
| | | |
| | | #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) |
| | | { |
| | |
| | | // Math.Abs((int)DragStartPos.Y - (int)MP.Y)); |
| | | //DrawSelectionRect(selectionRect); |
| | | needInvalidate = true; |
| | | |
| | | |
| | | } |
| | | else if (_isRotating) |
| | | { |
| | |
| | | // 遍历所有对象,找出范围内的对象 |
| | | 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; |
| | | } |
| | |
| | | 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(); |
| | |
| | | //_OperaNode = null; |
| | | //_Network.Nodes.AddRange(net.Nodes); |
| | | //_Network.Links.AddRange(net.Links); |
| | | |
| | | |
| | | SetMapInvalidate(); |
| | | return; |
| | | } |
| | |
| | | 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(); |
| | | } |
| | |
| | | case MouseState.新建重复器: |
| | | if (_select_junction1 == null) |
| | | { |
| | | if (_mouseState==MouseState.新增立管) |
| | | if (_mouseState == MouseState.新增立管) |
| | | { |
| | | var m = ScreenToVMap(new PointF(e.X, e.Y)); |
| | | z = m.Y; |
| | |
| | | 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), isdoubleClick, 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 |
| | |
| | | } |
| | | else |
| | | { |
| | | getPointAndHeight(e, _select_junction1, out p, out z); |
| | | var l = AddLink(new PointF(e.X, e.Y), isdoubleClick, p,z); |
| | | 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; |
| | | } |
| | |
| | | if (!isMouseMoved) |
| | | { |
| | | 右键_Menu.Show(this, e.Location); |
| | | |
| | | 转换为ToolStripMenuItem.Enabled = selectedNodes.Count > 0; //(selectedObjs.Count == 1); |
| | | |
| | | 转换为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); |
| | |
| | | IBaseViewModel GetObj_by_ScreenPoint(PointF clickedPoint, float DistLimit = 15f) |
| | | { |
| | | float minDist = float.MaxValue; |
| | | |
| | | |
| | | int minIndex = -1; |
| | | bool isJunction = true; |
| | | IBaseViewModel obj = null; |
| | |
| | | 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; |
| | |
| | | //float dist = Get_dist(clickedPoint, currentPoint); |
| | | if (dist < minDist && dist <= DistLimit) |
| | | { |
| | | |
| | | |
| | | |
| | | objs.Add(link); |
| | | } |
| | |
| | | } |
| | | private void 默认视角ToolStripMenuItem_Click(object sender, EventArgs e) |
| | | { |
| | | |
| | | |
| | | |
| | | mapOption0 = mapOption.Copy(); |
| | | |
| | | |
| | | InitCenter(); |
| | | RotationF = 45; |
| | | Rotation = -45; |
| | |
| | | { |
| | | _Template = new Template(); |
| | | _Template.network = new MapViewNetWork(); |
| | | |
| | | |
| | | |
| | | |
| | | //_Template.network.use_old = false; |
| | | // 获取选中文件的文件路径 |
| | | string filePath = openFileDialog.FileName; |
| | |
| | | #region 绘图工具 |
| | | |
| | | |
| | | |
| | | |
| | | public void toolStripButton_新建节点_Click(object sender, EventArgs e) |
| | | { |
| | | _mouseState = MouseState.新增节点; |
| | |
| | | _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; |
| | |
| | | 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)); |
| | |
| | | |
| | | 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; |
| | |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | 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) |
| | |
| | | |
| | | // } |
| | | //} |
| | | 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>(); |
| | |
| | | } |
| | | } |
| | | |
| | | /// <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; |
| | |
| | | { |
| | | |
| | | 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>(); |
| | |
| | | { |
| | | |
| | | 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; |
| | |
| | | MessageBox.Show("请选择要复制的对象"); |
| | | return; |
| | | } |
| | | |
| | | |
| | | _OperaNode = hoveredObjs[0] as NodeViewModel; |
| | | |
| | | MapViewNetWork net = new MapViewNetWork(); |
| | |
| | | public void 粘贴ToolStripMenuItem1_Click(object sender, EventArgs e) |
| | | { |
| | | { |
| | | |
| | | |
| | | var net = new MapViewNetWork(); |
| | | string json = Clipboard.GetText(); |
| | | net.ReadFromJson(json); |
| | | if (net.StartPoint == null) return; |
| | | string SID = net.StartPoint.ID; |
| | | net.StartPoint=net.Nodes.Find(n => n.ID == SID); |
| | | 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; |
| | |
| | | net.BuildRelation(); |
| | | //var basePoint = MapPointToWorldPoint(ScreenToMap(position, net.StartPoint.Elev), net.StartPoint.Elev); |
| | | var mPos = _MousePosition; |
| | | if (hoveredObjs.Count>0 && hoveredObjs[0] is NodeViewModel minNode) |
| | | if (hoveredObjs.Count > 0 && hoveredObjs[0] is NodeViewModel minNode) |
| | | { |
| | | |
| | | |
| | | var basePoint = minNode.Position3D; |
| | | net.Nodes.ForEach(obj => |
| | | { |
| | |
| | | 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); |
| | | var list = _Network.Add(net, null, false, minNode); |
| | | net.BuildRelation(); |
| | | //list.Add(_Network.AddPipe(Snode, minNode)); |
| | | MapObjectExtensions.AddCommand(_Network, "Add", null, list); |
| | |
| | | SetMapInvalidate(); |
| | | } |
| | | |
| | | |
| | | |
| | | } |
| | | } |
| | | private void 增量保存ToolStripMenuItem_Click(object sender, EventArgs e) |
| | |
| | | } |
| | | 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) |
| | |
| | | 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)) |
| | |
| | | { |
| | | _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.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(); |
| | | } |
| | |
| | | |
| | | private void 楼层管理ToolStripMenuItem_Click(object sender, EventArgs e) |
| | | { |
| | | if (_Template.Regions==null) |
| | | if (_Template.Regions == null) |
| | | { |
| | | _Template.Regions = new List<TRegion>(); |
| | | } |
| | |
| | | form_EditFloors.Show(this); |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | #endregion |
| | | } |
| | | } |