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;//
|
|
/// <summary>
|
/// 是否初始化
|
/// </summary>
|
public bool Initialized => _network != null;
|
|
|
/// <summary>
|
/// 初始化
|
/// </summary>
|
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 鼠标左键按下旋转
|
|
/// <summary>
|
/// 当鼠标左键按下时允许旋转
|
/// </summary>
|
[Browsable(true)]
|
[Description("当鼠标左键按下时允许旋转")]
|
[DefaultValue(true)]
|
public bool AllowRotateWhenMouseLeftDown
|
{
|
get => _allowRotateWhenMouseLeftDown;
|
set => _allowRotateWhenMouseLeftDown = value;
|
}
|
private bool _allowRotateWhenMouseLeftDown = true;
|
|
protected bool _hasMouseLeftDown = false;//鼠标左键是否按下
|
protected Point _mouseLeftDownRotatePoint;//鼠标左键按下旋转点
|
|
/// <summary>
|
/// 判断鼠标左键是否按下
|
/// </summary>
|
protected virtual bool HasMouseLeftDown(MouseEventArgs e)
|
{
|
if (e.Button == MouseButtons.Left)
|
{
|
_hasMouseLeftDown = true;
|
_mouseLeftDownRotatePoint = e.Location;
|
return true;
|
}
|
return false;
|
}
|
|
/// <summary>
|
/// 鼠标左键按下旋转
|
/// </summary>
|
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;
|
}
|
|
/// <summary>
|
/// 判断鼠标左键是否弹起
|
/// </summary>
|
protected virtual bool HasMouseLeftUp(MouseEventArgs e)
|
{
|
if (_hasMouseLeftDown)
|
{
|
_hasMouseLeftDown = false;
|
return true;
|
}
|
return false;
|
}
|
|
#endregion
|
|
#region 鼠标右键按下拖动
|
|
/// <summary>
|
/// 当鼠标右键按下时允许拖动
|
/// </summary>
|
[Browsable(true)]
|
[Description("当鼠标右键按下时允许拖动")]
|
[DefaultValue(true)]
|
public bool AllowMoveWhenMouseRightDown
|
{
|
get => _allowMoveWhenMouseRightDown;
|
set => _allowMoveWhenMouseRightDown = value;
|
}
|
private bool _allowMoveWhenMouseRightDown = true;
|
|
protected bool _hasMouseRightDown = false;//鼠标右键是否按下
|
protected Point _mouseRightDownMovePoint;//鼠标右键按下移动点
|
|
/// <summary>
|
/// 判断鼠标右键是否按下
|
/// </summary>
|
protected virtual bool HasMouseRightDown(MouseEventArgs e)
|
{
|
if (e.Button == MouseButtons.Right)
|
{
|
_hasMouseRightDown = true;
|
_mouseRightDownMovePoint = e.Location;
|
return true;
|
}
|
return false;
|
}
|
|
/// <summary>
|
/// 鼠标右键按下移动
|
/// </summary>
|
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;
|
}
|
|
/// <summary>
|
/// 判断鼠标左键是否弹起
|
/// </summary>
|
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
|
}
|
}
|