using Yw.Untity; namespace Yw.WinFrmUI.HydroL3d { public partial class NetworkPanel : DevExpress.XtraEditors.XtraUserControl { public NetworkPanel() { InitializeComponent(); this.openGLControl1.MouseWheel += openGLControl1_MouseWheel; this.propertyGridControl1.CellValueChanged += PropertyGridControl1_CellValueChanged; } private Network _network = null;//管网 private NetworkParas _paras = null;//参数 private float _zoom = 1f;//缩放 private float _rotationX = 0.0f;//x旋转角度 private float _rotationY = 0.0f;//y旋转角度 private float _viewPortX = 0f;// private float _viewPortY = 0f;// /// /// 是否初始化 /// public bool Initialized => _network != null; /// /// 初始化 /// public virtual void Initial(Network network) { _network = network; _paras = _network.GetParas(); InitialParas(); this.propertyGridControl1.SelectedObject = _paras; } //初始化参数 private void InitialParas() { _zoom = _paras.Scale.X; _rotationX = _paras.Rotation.X; _rotationY = _paras.Rotation.Y; _viewPortX = 0f; _viewPortY = 0f; } private void PropertyGridControl1_CellValueChanged(object sender, DevExpress.XtraVerticalGrid.Events.CellValueChangedEventArgs e) { InitialParas(); this.openGLControl1.Refresh(); } //OpenGL 初始化 private void openGLControl1_OpenGLInitialized(object sender, EventArgs e) { OpenGL gl = openGLControl1.OpenGL; gl.ClearColor(214 / 255f, 224 / 255f, 235 / 255f, 0); } //OpenGL 绘制 private void openGLControl1_OpenGLDraw(object sender, RenderEventArgs args) { if (!Initialized) { return; } OpenGL gl = openGLControl1.OpenGL; //启用深度测试 gl.Enable(OpenGL.GL_DEPTH_TEST); //清除深度缓存 gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT); // 设置视口 gl.Viewport((int)_viewPortX, (int)_viewPortY, this.openGLControl1.Width, this.openGLControl1.Height); // 设置当前矩阵模式,对投影矩阵应用随后的矩阵操作 gl.MatrixMode(OpenGL.GL_PROJECTION); // 重置当前指定的矩阵为单位矩阵,将当前的用户坐标系的原点移到了屏幕中心 gl.LoadIdentity(); // 创建透视投影变换 gl.Perspective(_paras.Perspective.Fovy, _paras.Perspective.Aspect, _paras.Perspective.Near, _paras.Perspective.Far); //gl.LoadIdentity(); //gl.Ortho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0); gl.LookAt(_paras.LookAt.Eye.X, _paras.LookAt.Eye.Y, _paras.LookAt.Eye.Z, _paras.LookAt.Center.X, _paras.LookAt.Center.Y, _paras.LookAt.Center.Z, _paras.LookAt.Up.X, _paras.LookAt.Up.Y, _paras.LookAt.Up.Z); // 设置当前矩阵为模型视图矩阵 gl.MatrixMode(OpenGL.GL_MODELVIEW); //重置当前指定的矩阵为单位矩阵,将当前的用户坐标系的原点移到了屏幕中心 gl.LoadIdentity(); //平移 gl.Translate(_paras.Translation.X, _paras.Translation.Y, _paras.Translation.Z); //将z轴向上 //gl.Rotate(90f, 1f, 0f, 0f); //旋转 gl.Rotate(_rotationX, 1, 0, 0); gl.Rotate(_rotationY, 0, 1, 0); //缩放 gl.Scale(_zoom, _zoom, _zoom); _network.Draw(gl); //float[] minCorner = { _paras.BoundingBox.Min.X, _paras.BoundingBox.Min.Y, _paras.BoundingBox.Min.Z }; //float[] maxCorner = { _paras.BoundingBox.Max.X, _paras.BoundingBox.Max.Y, _paras.BoundingBox.Max.Z }; //gl.Begin(OpenGL.GL_POINT); //gl.Vertex(minCorner[0], minCorner[1], minCorner[2]); //gl.End(); //gl.Begin(OpenGL.GL_POINT); //gl.Vertex(maxCorner[0], maxCorner[1], maxCorner[2]); //gl.End(); //gl.Begin(OpenGL.GL_LINE_LOOP); //// 绘制底面 //gl.Vertex(minCorner[0], minCorner[1], minCorner[2]); //gl.Vertex(maxCorner[0], minCorner[1], minCorner[2]); //gl.Vertex(maxCorner[0], maxCorner[1], minCorner[2]); //gl.Vertex(minCorner[0], maxCorner[1], minCorner[2]); //// 绘制顶面 //gl.Vertex(minCorner[0], minCorner[1], maxCorner[2]); //gl.Vertex(maxCorner[0], minCorner[1], maxCorner[2]); //gl.Vertex(maxCorner[0], maxCorner[1], maxCorner[2]); //gl.Vertex(minCorner[0], maxCorner[1], maxCorner[2]); //// 连接底面和顶面的边 //gl.Vertex(minCorner[0], minCorner[1], minCorner[2]); //gl.Vertex(minCorner[0], minCorner[1], maxCorner[2]); //gl.Vertex(maxCorner[0], minCorner[1], minCorner[2]); //gl.Vertex(maxCorner[0], minCorner[1], maxCorner[2]); //gl.Vertex(maxCorner[0], maxCorner[1], minCorner[2]); //gl.Vertex(maxCorner[0], maxCorner[1], maxCorner[2]); //gl.Vertex(minCorner[0], maxCorner[1], minCorner[2]); //gl.Vertex(minCorner[0], maxCorner[1], maxCorner[2]); //gl.End(); gl.Flush(); //强制刷新 } //Resize private void openGLControl1_Resized(object sender, EventArgs e) { if (!Initialized) { return; } _paras.Perspective.Aspect = (float)this.openGLControl1.Width / (float)this.openGLControl1.Height; _viewPortX = 0f; _viewPortY = 0f; } #region 鼠标左键按下旋转 /// /// 当鼠标左键按下时允许旋转 /// [Browsable(true)] [Description("当鼠标左键按下时允许旋转")] [DefaultValue(true)] public bool AllowRotateWhenMouseLeftDown { get => _allowRotateWhenMouseLeftDown; set => _allowRotateWhenMouseLeftDown = value; } private bool _allowRotateWhenMouseLeftDown = true; protected bool _hasMouseLeftDown = false;//鼠标左键是否按下 protected Point _mouseLeftDownRotatePoint;//鼠标左键按下旋转点 /// /// 判断鼠标左键是否按下 /// protected virtual bool HasMouseLeftDown(MouseEventArgs e) { if (e.Button == MouseButtons.Left) { _hasMouseLeftDown = true; _mouseLeftDownRotatePoint = e.Location; return true; } return false; } /// /// 鼠标左键按下旋转 /// protected virtual bool MouseLeftDownRotate(MouseEventArgs e) { if (_hasMouseLeftDown) { if (this.AllowRotateWhenMouseLeftDown) { if (this.Initialized) { int deltaX = e.X - _mouseLeftDownRotatePoint.X; int deltaY = e.Y - _mouseLeftDownRotatePoint.Y; _rotationX += deltaY * 0.1f; _rotationY += deltaX * 0.1f; _mouseLeftDownRotatePoint = e.Location; return true; } } } return false; } /// /// 判断鼠标左键是否弹起 /// protected virtual bool HasMouseLeftUp(MouseEventArgs e) { if (_hasMouseLeftDown) { _hasMouseLeftDown = false; return true; } return false; } #endregion #region 鼠标右键按下拖动 /// /// 当鼠标右键按下时允许拖动 /// [Browsable(true)] [Description("当鼠标右键按下时允许拖动")] [DefaultValue(true)] public bool AllowMoveWhenMouseRightDown { get => _allowMoveWhenMouseRightDown; set => _allowMoveWhenMouseRightDown = value; } private bool _allowMoveWhenMouseRightDown = true; protected bool _hasMouseRightDown = false;//鼠标右键是否按下 protected Point _mouseRightDownMovePoint;//鼠标右键按下移动点 /// /// 判断鼠标右键是否按下 /// protected virtual bool HasMouseRightDown(MouseEventArgs e) { if (e.Button == MouseButtons.Right) { _hasMouseRightDown = true; _mouseRightDownMovePoint = e.Location; return true; } return false; } /// /// 鼠标右键按下移动 /// protected virtual bool MouseRightDownMove(MouseEventArgs e) { if (_hasMouseRightDown) { if (this.AllowMoveWhenMouseRightDown) { if (this.Initialized) { int deltaX = e.X - _mouseRightDownMovePoint.X; int deltaY = e.Y - _mouseRightDownMovePoint.Y; _viewPortX += deltaX; _viewPortY -= deltaY; _mouseRightDownMovePoint = e.Location; return true; } } } return false; } /// /// 判断鼠标左键是否弹起 /// protected virtual bool HasMouseRightUp(MouseEventArgs e) { if (_hasMouseRightDown) { _hasMouseRightDown = false; return true; } return false; } #endregion #region 鼠标事件 private void openGLControl1_MouseDown(object sender, MouseEventArgs e) { HasMouseLeftDown(e); HasMouseRightDown(e); } private void openGLControl1_MouseMove(object sender, MouseEventArgs e) { var list = this.openGLControl1.OpenGL.UnProject(e.X, e.Y, 0); this.labelControl1.Text = DoubleListHelper.ToString(list); var hasMouseLeftDownRotate = MouseLeftDownRotate(e); var hasMouseRightDownMove = MouseRightDownMove(e); if (hasMouseLeftDownRotate || hasMouseRightDownMove) { this.openGLControl1.Invalidate(); } } private void openGLControl1_MouseUp(object sender, MouseEventArgs e) { var hasMouseLeftUp = HasMouseLeftUp(e); var hasMouseRightUp = HasMouseRightUp(e); if (hasMouseLeftUp || hasMouseRightUp) { this.openGLControl1.Invalidate(); } } private void openGLControl1_MouseHover(object sender, EventArgs e) { if (!Initialized) { return; } var pt = this.openGLControl1.PointToClient(MousePosition); var list = this.openGLControl1.OpenGL.UnProject(pt.X, this.openGLControl1.Height - pt.Y, 0); var wpt = new Point3d(list[0], list[1], list[2]); var list1 = _network.Hover(wpt); if (list1 != null && list1.Count > 0) { } } private void openGLControl1_MouseDoubleClick(object sender, MouseEventArgs e) { if (!Initialized) { return; } if (e.Button == MouseButtons.Left) { InitialParas(); this.openGLControl1.Invalidate(); } } private void openGLControl1_MouseClick(object sender, MouseEventArgs e) { } private void openGLControl1_MouseWheel(object sender, MouseEventArgs e) { if (e.Delta > 0) { _zoom *= 1.1f; } else { _zoom /= 1.1f; } this.openGLControl1.Refresh(); } #endregion } }