lixiaojun
2024-11-16 366e8053d77db67dee65a31e3510d14901f14e11
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
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
    }
}