lixiaojun
2024-10-14 1e23cf9b1492df553021f43a873864cd2b047714
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
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
using DevExpress.Xpo.Helpers;
using Yw.WinFrmUI.Bimface;
 
namespace HStation.WinFrmUI
{
    public partial class XhsProjectSimulationBimfaceCtrl : DevExpress.XtraEditors.XtraUserControl
    {
        public XhsProjectSimulationBimfaceCtrl()
        {
            InitializeComponent();
        }
 
        /// <summary>
        /// 水力点击事件(包含左键和右键)
        /// </summary>
        public event Action<Yw.Model.HydroParterInfo> HydroClickEvent;
        /// <summary>
        /// 水力点击事件(仅左键)
        /// </summary>
        public event Action<Yw.Model.HydroParterInfo> HydroMouseLeftClickEvent;
        /// <summary>
        /// 加载完成事件
        /// </summary>
        public event Action LoadCompletedEvent;
 
        //项目
        private HStation.Vmo.XhsProjectVmo _project = null;
        //项目站
        private HStation.Vmo.XhsProjectSiteVmo _projectSite = null;
        //获取水力信息方法
        private Func<Yw.Model.HydroModelInfo> _hydroInfoFunc = null;
 
        //获取Bimface 交互容器
        private BimfaceInterop3dContainer GetBimfaceInteropContainer()
        {
            if (_bimfaceInteropContainer == null)
            {
                _bimfaceInteropContainer = new BimfaceInterop3dContainer();
                _bimfaceInteropContainer.Dock = DockStyle.Fill;
                _bimfaceInteropContainer.LoadCompletedEvent += async () =>
                {
                    if (_projectSite == null)
                    {
                        return;
                    }
 
                    var relation = await BLLFactory<Yw.BLL.BimfaceFileRelation>.Instance
                        .GetDefaultByObjectTypeAndObjectIDOfPurpose
                            (HStation.Xhs.DataType.XhsProjectSite, _projectSite.ID, HStation.Xhs.Purpose.Simulation);
                    if (relation == null)
                    {
                        return;
                    }
 
                    var bimfaceFile = await BLLFactory<Yw.BLL.BimfaceFile>.Instance.GetByID(relation.BimfaceFileID);
                    if (bimfaceFile == null)
                    {
                        return;
                    }
 
                    var viewToken = await BimfaceHelper.GetViewToken(bimfaceFile.BimfaceId);
                    if (string.IsNullOrEmpty(viewToken))
                    {
                        return;
                    }
                    await _bimfaceInteropContainer.LoadView(viewToken);
                };
                _bimfaceInteropContainer.LoadFailedEvent += () =>
                {
                    TipFormHelper.ShowError("三维模型容器加载失败");
                };
                _bimfaceInteropContainer.LoadViewCompletedEvent += () =>
                {
                    this.LoadCompletedEvent?.Invoke();
                };
                _bimfaceInteropContainer.LoadViewFailedEvent += (obj) =>
                {
                    TipFormHelper.ShowError($"三维模型加载失败");
                };
                _bimfaceInteropContainer.ClickInEvent += (obj) =>
                {
                    if (obj == null)
                    {
                        return;
                    }
                    if (this.HydroClickEvent != null)
                    {
                        var hydroInfo = _hydroInfoFunc?.Invoke();
                        if (hydroInfo == null)
                        {
                            return;
                        }
                        var allParterList = hydroInfo.GetAllParters();
                        var parter = allParterList?.Find(x => x.Code == obj.ObjectId);
                        this.HydroClickEvent.Invoke(parter);
                    }
                };
                _bimfaceInteropContainer.ClickOutEvent += (obj) =>
                {
                    this.HydroClickEvent?.Invoke(null);
                };
                _bimfaceInteropContainer.MouseLeftClickInEvent += (obj) =>
                {
                    if (obj == null)
                    {
                        return;
                    }
                    if (this.HydroMouseLeftClickEvent != null)
                    {
                        var hydroInfo = _hydroInfoFunc?.Invoke();
                        if (hydroInfo == null)
                        {
                            return;
                        }
                        var allParterList = hydroInfo.GetAllParters();
                        var parter = allParterList?.Find(x => x.Code == obj.ObjectId);
                        this.HydroMouseLeftClickEvent.Invoke(parter);
                    }
                };
                _bimfaceInteropContainer.MouseLeftClickOutEvent += (obj) =>
                {
                    this.HydroMouseLeftClickEvent?.Invoke(null);
                };
            }
            return _bimfaceInteropContainer;
        }
        //bimface 交互容器
        private BimfaceInterop3dContainer _bimfaceInteropContainer = null;
 
        /// <summary>
        /// 初始化数据
        /// 仅支持调用一次
        /// </summary>
        public async Task InitialData
            (
                HStation.Vmo.XhsProjectVmo project,
                HStation.Vmo.XhsProjectSiteVmo projectSite,
                Func<Yw.Model.HydroModelInfo> hydroInfoFunc
            )
        {
            if (project == null)
            {
                return;
            }
            _project = project;
            _projectSite = projectSite;
            _hydroInfoFunc = hydroInfoFunc;
            if (_projectSite == null)
            {
                _projectSite = await BLLFactory<HStation.BLL.XhsProjectSite>.Instance.GetDefaultByProjectID(_project.ID);
            }
            var bimfaceInteropContainer = GetBimfaceInteropContainer();
            this.Controls.Clear();
            this.Controls.Add(bimfaceInteropContainer);
            await bimfaceInteropContainer.InitialContainer();
        }
 
 
        #region 构件的显示与隐藏
 
        /// <summary>
        /// 显示构件
        /// </summary>
        /// <param name="elementIds">构件id列表</param>
        /// <returns></returns>
        public async Task ShowComponents(List<string> elementIds)
        {
            if (_bimfaceInteropContainer == null)
            {
                return;
            }
            await _bimfaceInteropContainer.ShowComponents(elementIds);
        }
 
        /// <summary>
        /// 隐藏构件
        /// </summary>
        /// <param name="elementIds">构件id列表</param>
        /// <returns></returns>
        public async Task HideComponents(List<string> elementIds)
        {
            if (_bimfaceInteropContainer == null)
            {
                return;
            }
            await _bimfaceInteropContainer.HideComponents(elementIds);
        }
 
        /// <summary>
        /// 显示所有构件
        /// </summary>
        /// <returns></returns>
        public async Task ShowAllComponents()
        {
            if (_bimfaceInteropContainer == null)
            {
                return;
            }
            await _bimfaceInteropContainer.ShowAllComponents();
        }
 
        #endregion
 
        #region 构件的半透明与取消
 
        /// <summary>
        /// 半透明构件
        /// </summary>
        /// <param name="elementIds">构件id列表</param>
        /// <returns></returns>
        public async Task TranslucentComponents(List<string> elementIds)
        {
            if (_bimfaceInteropContainer == null)
            {
                return;
            }
            await _bimfaceInteropContainer.TranslucentComponents(elementIds);
        }
 
        /// <summary>
        /// 取消构件半透明
        /// </summary>
        /// <param name="elementIds">构件id列表</param>
        /// <returns></returns>
        public async Task OpaqueComponents(List<string> elementIds)
        {
            if (_bimfaceInteropContainer == null)
            {
                return;
            }
            await _bimfaceInteropContainer.OpaqueComponents(elementIds);
        }
 
        #endregion
 
        #region 构件的选中与取消
 
        /// <summary>
        /// 设置选择的构件
        /// </summary>
        /// <returns></returns>
        public async Task SetSelectedComponents(List<string> elements)
        {
            if (_bimfaceInteropContainer == null)
            {
                return;
            }
            await _bimfaceInteropContainer.SetSelectedComponents(elements);
        }
 
        /// <summary>
        /// 增加选择的构件
        /// </summary>
        /// <param name="elements"></param>
        /// <returns></returns>
        public async Task AddSelectedComponents(List<string> elements)
        {
            if (_bimfaceInteropContainer == null)
            {
                return;
            }
            await _bimfaceInteropContainer.AddSelectedComponents(elements);
        }
 
        /// <summary>
        /// 移除选择的构件
        /// </summary>
        /// <param name="elements"></param>
        /// <returns></returns>
        public async Task RemoveSelectedComponents(List<string> elements)
        {
            if (_bimfaceInteropContainer == null)
            {
                return;
            }
            await _bimfaceInteropContainer.RemoveSelectedComponents(elements);
        }
 
        /// <summary>
        /// 清除选择的构件
        /// </summary>
        /// <param name="elements"></param>
        /// <returns></returns>
        public async Task ClearSelectedComponents()
        {
            if (_bimfaceInteropContainer == null)
            {
                return;
            }
            await _bimfaceInteropContainer.ClearSelectedComponents();
        }
 
        #endregion
 
        #region 缩放
 
        /// <summary>
        /// 缩放至构件
        /// </summary>
        public async Task ZoomToComponent(string elementId)
        {
            if (_bimfaceInteropContainer == null)
            {
                return;
            }
            await _bimfaceInteropContainer.ZoomToComponent(elementId);
        }
 
        /// <summary>
        /// 缩放至选择构件
        /// </summary>
        public async Task ZoomToSelectedComponents()
        {
            if (_bimfaceInteropContainer == null)
            {
                return;
            }
            await _bimfaceInteropContainer.ZoomToSelectedComponents();
        }
 
        /// <summary>
        /// 缩放至选择构件
        /// </summary>
        public async Task ZoomAndSelectComponents(List<string> elementIds)
        {
            if (_bimfaceInteropContainer == null)
            {
                return;
            }
            await _bimfaceInteropContainer.ZoomAndSelectComponents(elementIds);
        }
 
        #endregion
 
        #region 强调构件
 
        /// <summary>
        /// 设置强调构件
        /// </summary>
        public async Task SetBlinkComponents(List<string> elementIds, string color, double transparency)
        {
            if (_bimfaceInteropContainer == null)
            {
                return;
            }
            await _bimfaceInteropContainer.SetBlinkComponents(elementIds, color, transparency);
        }
 
        /// <summary>
        /// 清除强调构件
        /// </summary>
        public async Task SetBlinkComponents()
        {
            if (_bimfaceInteropContainer == null)
            {
                return;
            }
            await _bimfaceInteropContainer.ClearBlinkComponents();
        }
 
        #endregion
 
        #region 构件着色
 
        /// <summary>
        /// 设置强调构件
        /// </summary>
        public async Task OverrideComponentsColor(List<string> elementIds, string color, double transparency)
        {
            if (_bimfaceInteropContainer == null)
            {
                return;
            }
            await _bimfaceInteropContainer.OverrideComponentsColor(elementIds, color, transparency);
        }
 
        /// <summary>
        /// 恢复构件颜色
        /// </summary>
        public async Task SetBlinkComponents(List<string> elementIds)
        {
            if (_bimfaceInteropContainer == null)
            {
                return;
            }
            await _bimfaceInteropContainer.RestoreComponentsColor(elementIds);
        }
 
        #endregion
 
        #region 自定义标签
 
        /// <summary>
        /// 设置自定义标签
        /// </summary>
        public async Task SetCustomLabels(List<CustomLabel> obj)
        {
            if (_bimfaceInteropContainer == null)
            {
                return;
            }
            await _bimfaceInteropContainer.SetCustomLabels(obj);
        }
 
        /// <summary>
        /// 清除自定义标签
        /// </summary>
        public async Task ClearCustomLabels()
        {
            if (_bimfaceInteropContainer == null)
            {
                return;
            }
            await _bimfaceInteropContainer.ClearCustomLabels();
        }
 
        #endregion
 
        #region 引线标签
 
        /// <summary>
        /// 设置引线标签
        /// </summary>
        public async Task SetLeadLabels(List<LeadLabel> obj)
        {
            await _bimfaceInteropContainer?.SetLeadLabels(obj);
        }
 
        /// <summary>
        /// 清除引线标签
        /// </summary>
        public async Task ClearLeadLabels()
        {
            await _bimfaceInteropContainer?.ClearLeadLabels();
        }
 
        #endregion
 
        #region 业务
 
 
        #region 连接构件颜色
 
        private const string _linkComponentColor = "#008B00";//连接构件颜色
        private const string _linkStartComponentColor = "#094EF7";//连接开始构件颜色
        private const string _linkEndComponentColor = "#ECBF08";//连接结束构件颜色
        private const double _linkComponentTransparency = 0.8;
        private List<string> _linkComponentIds = null;//连接构件id列表
 
        /// <summary>
        /// 设置连接构件颜色
        /// </summary>
        public async Task SetLinkComponentsColor(List<string> elementIds)
        {
            await RestoreLinkComponentsColor();
            _linkComponentIds = elementIds;
            if (_linkComponentIds == null || _linkComponentIds.Count < 1)
            {
                return;
            }
            await _bimfaceInteropContainer?.OverrideComponentsColor(_linkComponentIds, _linkComponentColor, _linkComponentTransparency);
        }
 
        /// <summary>
        /// 恢复连接构件颜色
        /// </summary>
        public async Task RestoreLinkComponentsColor()
        {
            if (_linkComponentIds == null || _linkComponentIds.Count < 1)
            {
                return;
            }
            await _bimfaceInteropContainer?.RestoreComponentsColor(_linkComponentIds);
        }
 
        /// <summary>
        /// 设置连接开始构件颜色
        /// </summary>
        public async Task SetLinkStartComponentsColor(List<string> elementIds)
        {
            if (elementIds == null || elementIds.Count < 1)
            {
                return;
            }
            if (_linkComponentIds == null)
            {
                _linkComponentIds = new List<string>();
            }
            _linkComponentIds.AddRange(elementIds);
            await _bimfaceInteropContainer?.OverrideComponentsColor(elementIds, _linkStartComponentColor, _linkComponentTransparency);
        }
 
        /// <summary>
        /// 设置连接结束构件颜色
        /// </summary>
        public async Task SetLinkEndComponentsColor(List<string> elementIds)
        {
            if (elementIds == null || elementIds.Count < 1)
            {
                return;
            }
            if (_linkComponentIds == null)
            {
                _linkComponentIds = new List<string>();
            }
            _linkComponentIds.AddRange(elementIds);
            await _bimfaceInteropContainer?.OverrideComponentsColor(elementIds, _linkEndComponentColor, _linkComponentTransparency);
        }
 
        #endregion
 
        #region 设置Open构件颜色
 
        private const string _openComponentColor = "#2E8B57";
        private const double _openComponentTransparency = 0.8;
        private List<string> _openComponentIds = null;//Open构件id列表
 
        /// <summary>
        /// 设置Open构件颜色
        /// </summary>
        public async Task SetOpenComponentsColor(List<string> elementIds)
        {
            if (_openComponentIds != null && _openComponentIds.Count > 0)
            {
                await _bimfaceInteropContainer.RestoreComponentsColor(_openComponentIds);
            }
            _openComponentIds = elementIds;
            if (elementIds == null || elementIds.Count < 1)
            {
                return;
            }
            if (_bimfaceInteropContainer == null)
            {
                return;
            }
            await _bimfaceInteropContainer.OverrideComponentsColor(elementIds, _openComponentColor, _openComponentTransparency);
        }
 
        #endregion
 
        #region 自定义标签
 
        /// <summary>
        /// 显示计算自定义标签
        /// </summary>
        public async Task ShowCalcuCustomLabels(CalcuResult calcuResult)
        {
            var hydroInfo = _hydroInfoFunc?.Invoke();
            if (hydroInfo == null)
            {
                return;
            }
            if (calcuResult == null)
            {
                return;
            }
            if (!calcuResult.Succeed)
            {
                await _bimfaceInteropContainer.ClearCustomLabels();
                return;
            }
            var obj = new List<CustomLabel>();
            var allParterList = hydroInfo.GetAllParters();
            allParterList?.ForEach(x =>
            {
                if (x is Yw.Model.HydroPumpInfo pump)
                {
                    double? speed = pump.RatedN;
                    if (speed.HasValue)
                    {
                        if (pump.SpeedRatio.HasValue)
                        {
                            speed = speed.Value * pump.SpeedRatio.Value;
                        }
                    }
                    var calcuPump = calcuResult.LinkList.Find(x => x.Id == pump.Code);
                    var calcuPumpStart = calcuResult.NodeList.Find(x => x.Id == pump.StartCode);
                    var calcuPumpEnd = calcuResult.NodeList.Find(x => x.Id == pump.EndCode);
                    var pumpCustomLabel = new CustomLabel();
                    pumpCustomLabel.Id = pump.Code;
                    pumpCustomLabel.Data = new List<CustomLabelItem>()
                    {
                        new CustomLabelItem(){ Name="状态",Value=HydroLinkStatusHelper.GetStatusName(pump.LinkStatus),Unit=string.Empty},
                        new CustomLabelItem(){ Name="转速",Value=speed?.ToString(),Unit="r/min"},
                        new CustomLabelItem(){ Name="流量",Value=Math.Round(calcuPump.Flow,1).ToString(),Unit="m³/h"},
                        new CustomLabelItem(){ Name="进口压力",Value=Math.Round(calcuPumpStart.Head,4).ToString(),Unit="m"},
                        new CustomLabelItem(){ Name="出口压力",Value=Math.Round(calcuPumpEnd.Head,4).ToString(),Unit="m"},
                    };
                    obj.Add(pumpCustomLabel);
                }
                else if (x is Yw.Model.HydroEmitterInfo emitter)
                {
                    var calcuEmitter = calcuResult.NodeList.Find(x => x.Id == emitter.Code);
                    var emitterCustomLabel = new CustomLabel();
                    emitterCustomLabel.Id = emitter.Code;
                    emitterCustomLabel.Data = new List<CustomLabelItem>()
                    {
                        new CustomLabelItem(){ Name="流量",Value=Math.Round(calcuEmitter.Demand,1).ToString(),Unit="m³/h"},
                        new CustomLabelItem(){ Name="压力",Value=Math.Round(calcuEmitter.Head,4).ToString(),Unit="m"}
                    };
                    obj.Add(emitterCustomLabel);
                }
            });
            if (_bimfaceInteropContainer == null)
            {
                return;
            }
            await _bimfaceInteropContainer.SetCustomLabels(obj);
        }
 
        #endregion
 
        #region 标注
 
 
 
        #endregion
 
        #endregion
 
 
 
    }
}