using DevExpress.Xpo.Helpers; using Yw.WinFrmUI.Bimface; namespace HStation.WinFrmUI { public partial class XhsProjectSimulationBimfaceCtrl : DevExpress.XtraEditors.XtraUserControl { public XhsProjectSimulationBimfaceCtrl() { InitializeComponent(); } /// /// 水力点击事件(包含左键和右键) /// public event Action HydroClickEvent; /// /// 水力点击事件(仅左键) /// public event Action HydroMouseLeftClickEvent; /// /// 加载完成事件 /// public event Action LoadCompletedEvent; //项目 private HStation.Vmo.XhsProjectVmo _project = null; //项目站 private HStation.Vmo.XhsProjectSiteVmo _projectSite = null; //获取水力信息方法 private Func _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.Instance .GetDefaultByObjectTypeAndObjectIDOfPurpose (HStation.Xhs.DataType.XhsProjectSite, _projectSite.ID, HStation.Xhs.Purpose.Simulation); if (relation == null) { return; } var bimfaceFile = await BLLFactory.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.GetAllVisuals(); 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.GetAllVisuals(); 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; /// /// 初始化数据 /// 仅支持调用一次 /// public async Task InitialData ( HStation.Vmo.XhsProjectVmo project, HStation.Vmo.XhsProjectSiteVmo projectSite, Func hydroInfoFunc ) { if (project == null) { return; } _project = project; _projectSite = projectSite; _hydroInfoFunc = hydroInfoFunc; if (_projectSite == null) { _projectSite = await BLLFactory.Instance.GetDefaultByProjectID(_project.ID); } var bimfaceInteropContainer = GetBimfaceInteropContainer(); this.Controls.Clear(); this.Controls.Add(bimfaceInteropContainer); await bimfaceInteropContainer.InitialContainer(); } #region 构件的显示与隐藏 /// /// 显示构件 /// public async Task ShowComponents(List elementIds) { if (_bimfaceInteropContainer == null) { return; } await _bimfaceInteropContainer.ShowComponents(elementIds); } /// /// 隐藏构件 /// public async Task HideComponents(List elementIds) { if (_bimfaceInteropContainer == null) { return; } await _bimfaceInteropContainer.HideComponents(elementIds); } /// /// 显示所有构件 /// public async Task ShowAllComponents() { if (_bimfaceInteropContainer == null) { return; } await _bimfaceInteropContainer.ShowAllComponents(); } #endregion #region 构件的半透明与取消 /// /// 半透明构件 /// /// 构件id列表 /// public async Task TranslucentComponents(List elementIds) { if (_bimfaceInteropContainer == null) { return; } await _bimfaceInteropContainer.TranslucentComponents(elementIds); } /// /// 取消构件半透明 /// /// 构件id列表 /// public async Task OpaqueComponents(List elementIds) { if (_bimfaceInteropContainer == null) { return; } await _bimfaceInteropContainer.OpaqueComponents(elementIds); } #endregion #region 构件的选中与取消 /// /// 设置选择的构件 /// /// public async Task SetSelectedComponents(List elements) { if (_bimfaceInteropContainer == null) { return; } await _bimfaceInteropContainer.SetSelectedComponents(elements); } /// /// 增加选择的构件 /// /// /// public async Task AddSelectedComponents(List elements) { if (_bimfaceInteropContainer == null) { return; } await _bimfaceInteropContainer.AddSelectedComponents(elements); } /// /// 移除选择的构件 /// /// /// public async Task RemoveSelectedComponents(List elements) { if (_bimfaceInteropContainer == null) { return; } await _bimfaceInteropContainer.RemoveSelectedComponents(elements); } /// /// 清除选择的构件 /// /// /// public async Task ClearSelectedComponents() { if (_bimfaceInteropContainer == null) { return; } await _bimfaceInteropContainer.ClearSelectedComponents(); } #endregion #region 缩放 /// /// 缩放至构件 /// public async Task ZoomToComponent(string elementId) { if (_bimfaceInteropContainer == null) { return; } await _bimfaceInteropContainer.ZoomToComponent(elementId); } /// /// 缩放至选择构件 /// public async Task ZoomToSelectedComponents() { if (_bimfaceInteropContainer == null) { return; } await _bimfaceInteropContainer.ZoomToSelectedComponents(); } /// /// 缩放至选择构件 /// public async Task ZoomAndSelectComponent(string elementId) { if (string.IsNullOrEmpty(elementId)) { return; } await _bimfaceInteropContainer.ZoomAndSelectComponents(new List() { elementId }); } /// /// 缩放至选择构件 /// public async Task ZoomAndSelectComponents(List elementIds) { await _bimfaceInteropContainer.ZoomAndSelectComponents(elementIds); } #endregion #region 强调构件 private const string _blinkColor = "#32D3A6";//强调构件颜色 private const double _blinkTransparency = 0.8d; //强调构件透明度 /// /// 设置强调构件 /// public async Task SetBlinkComponents(List elementIds, string color, double transparency) { await _bimfaceInteropContainer?.SetBlinkComponents(elementIds, color, transparency); } /// /// 设置强调构件 /// public async Task SetBlinkComponents(List elementIds) { await _bimfaceInteropContainer?.SetBlinkComponents(elementIds, _blinkColor, _blinkTransparency); } /// /// 清除强调构件 /// public async Task ClearBlinkComponents() { await _bimfaceInteropContainer?.ClearBlinkComponents(); } #endregion #region 构件着色 /// /// 设置强调构件 /// public async Task OverrideComponentsColor(List elementIds, string color, double transparency) { if (_bimfaceInteropContainer == null) { return; } await _bimfaceInteropContainer.OverrideComponentsColor(elementIds, color, transparency); } /// /// 恢复构件颜色 /// public async Task RestoreComponentsColor(List elementIds) { if (_bimfaceInteropContainer == null) { return; } await _bimfaceInteropContainer.RestoreComponentsColor(elementIds); } #endregion #region 业务计算自定义标签 /// /// 显示业务计算自定义标签 /// public async Task SetLogicCalcuCustomLabels(CalcuResult calcuResult) { var hydroInfo = _hydroInfoFunc?.Invoke(); if (hydroInfo == null) { return; } if (calcuResult == null) { return; } if (!calcuResult.Succeed) { await _bimfaceInteropContainer?.ClearLogicCalcuCustomLabels(); return; } var obj = new List(); var allParterList = hydroInfo.GetAllParters(); allParterList?.ForEach(x => { if (x is Yw.Model.HydroPumpInfo pump) { var hz = Math.Round(pump.RatedHz * pump.SpeedRatio); 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 LogicCalcuCustomLabel(); pumpCustomLabel.Id = pump.Code; pumpCustomLabel.Distance = 10000; pumpCustomLabel.Data = new List() { new LogicCalcuCustomLabelItem(){ Name="状态",Value=HydroLinkStatusHelper.GetStatusName(pump.LinkStatus),Unit=string.Empty}, new LogicCalcuCustomLabelItem(){ Name="频率",Value=hz.ToString(),Unit=string.Empty}, new LogicCalcuCustomLabelItem(){ Name="流量",Value=Math.Round(calcuPump.Flow,1).ToString(),Unit="m³/h"}, new LogicCalcuCustomLabelItem(){ Name="进口压力",Value=Math.Round(calcuPumpStart.Head,4).ToString(),Unit="m"}, new LogicCalcuCustomLabelItem(){ 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 LogicCalcuCustomLabel(); emitterCustomLabel.Id = emitter.Code; emitterCustomLabel.Distance = 10000; emitterCustomLabel.Data = new List() { new LogicCalcuCustomLabelItem(){ Name="流量",Value=Math.Round(calcuEmitter.Demand,1).ToString(),Unit="m³/h"}, new LogicCalcuCustomLabelItem(){ Name="压力",Value=Math.Round(calcuEmitter.Head,4).ToString(),Unit="m"} }; obj.Add(emitterCustomLabel); } }); await _bimfaceInteropContainer?.SetLogicCalcuCustomLabels(obj); } /// /// 清除业务计算自定义标签 /// public async Task ClearLogicCalcuCustomLabels() { await _bimfaceInteropContainer?.ClearLogicCalcuCustomLabels(); } #endregion #region 业务标注引线标签 /// /// 设置业务标注引线标签 /// public async Task SetLogicMarkLeadLabels(List obj) { await _bimfaceInteropContainer?.SetLogicMarkLeadLabels(obj); } /// /// 清除业务标注引线标签 /// public async Task ClearLogicMarkLeadLabels() { await _bimfaceInteropContainer?.ClearLogicMarkLeadLabels(); } #endregion #region 业务水流动画 /// /// 加载水流动画 /// public async Task LoadFlowEffect(LogicFlowEffect obj) { await _bimfaceInteropContainer?.LoadFlowEffect(obj); } /// /// 加载水流动画 /// public async Task LoadFlowEffect(List obj) { await _bimfaceInteropContainer?.LoadFlowEffectList(obj); } /// /// 更新水流动画 /// public async Task UpdateFlowEffect(LogicFlowEffect obj) { await _bimfaceInteropContainer?.UpdateFlowEffect(obj); } /// /// 更新水流动画 /// public async Task UpdateFlowEffectList(List obj) { await _bimfaceInteropContainer?.UpdateFlowEffectList(obj); } /// /// 卸载水流动画 /// public async Task UnloadFlowEffect() { await _bimfaceInteropContainer?.UnloadFlowEffect(); } /// /// 通过Id卸载水流动画 /// public async Task UnloadFlowEffectById(string Id) { await _bimfaceInteropContainer?.UnloadFlowEffectById(Id); } #endregion #region 连接构件颜色 private const string _linkComponentColor = "#008B00";//连接构件颜色 private const string _linkStartComponentColor = "#094EF7";//连接开始构件颜色 private const string _linkEndComponentColor = "#ECBF08";//连接结束构件颜色 private const double _linkComponentTransparency = 0.8; private List _linkComponentIds = null;//连接构件id列表 /// /// 设置连接构件颜色 /// public async Task SetLinkComponentsColor(List elementIds) { await RestoreLinkComponentsColor(); _linkComponentIds = elementIds; if (_linkComponentIds == null || _linkComponentIds.Count < 1) { return; } await _bimfaceInteropContainer?.OverrideComponentsColor(_linkComponentIds, _linkComponentColor, _linkComponentTransparency); } /// /// 恢复连接构件颜色 /// public async Task RestoreLinkComponentsColor() { if (_linkComponentIds == null || _linkComponentIds.Count < 1) { return; } await _bimfaceInteropContainer?.RestoreComponentsColor(_linkComponentIds); } /// /// 设置连接开始构件颜色 /// public async Task SetLinkStartComponentsColor(List elementIds) { if (elementIds == null || elementIds.Count < 1) { return; } if (_linkComponentIds == null) { _linkComponentIds = new List(); } _linkComponentIds.AddRange(elementIds); await _bimfaceInteropContainer?.OverrideComponentsColor(elementIds, _linkStartComponentColor, _linkComponentTransparency); } /// /// 设置连接结束构件颜色 /// public async Task SetLinkEndComponentsColor(List elementIds) { if (elementIds == null || elementIds.Count < 1) { return; } if (_linkComponentIds == null) { _linkComponentIds = new List(); } _linkComponentIds.AddRange(elementIds); await _bimfaceInteropContainer?.OverrideComponentsColor(elementIds, _linkEndComponentColor, _linkComponentTransparency); } #endregion #region 业务监测点 /// /// 设置业务监测点 /// public async Task SetLogicMonitors(List obj) { await _bimfaceInteropContainer?.SetLogicMonitors(obj); } /// /// 清除业务监测点 /// public async Task ClearLogicMonitors() { await _bimfaceInteropContainer?.ClearLogicMonitors(); } #endregion } }