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.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; /// /// 初始化数据 /// 仅支持调用一次 /// 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 构件的显示与隐藏 /// /// 显示构件 /// /// 构件id列表 /// public async Task ShowComponents(List elementIds) { if (_bimfaceInteropContainer == null) { return; } await _bimfaceInteropContainer.ShowComponents(elementIds); } /// /// 隐藏构件 /// /// 构件id列表 /// 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 ZoomAndSelectComponents(List elementIds) { if (_bimfaceInteropContainer == null) { return; } await _bimfaceInteropContainer.ZoomAndSelectComponents(elementIds); } #endregion #region 强调构件 /// /// 设置强调构件 /// public async Task SetBlinkComponents(List elementIds, string color, double transparency) { if (_bimfaceInteropContainer == null) { return; } await _bimfaceInteropContainer.SetBlinkComponents(elementIds, color, transparency); } /// /// 清除强调构件 /// public async Task SetBlinkComponents() { if (_bimfaceInteropContainer == null) { return; } 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 SetBlinkComponents(List elementIds) { if (_bimfaceInteropContainer == null) { return; } await _bimfaceInteropContainer.RestoreComponentsColor(elementIds); } #endregion #region 自定义标签 /// /// 设置自定义标签 /// public async Task SetCustomLabels(List obj) { if (_bimfaceInteropContainer == null) { return; } await _bimfaceInteropContainer.SetCustomLabels(obj); } /// /// 清除自定义标签 /// public async Task ClearCustomLabels() { if (_bimfaceInteropContainer == null) { return; } await _bimfaceInteropContainer.ClearCustomLabels(); } #endregion #region 业务 #region 连接构件颜色 private const string _linkComponentColor = "#008B00"; private const double _linkComponentTransparency = 0.8; private List _linkComponentIds = null;//连接构件id列表 /// /// 设置连接构件颜色 /// public async Task SetLinkComponentsColor(List elementIds) { if (_linkComponentIds != null && _linkComponentIds.Count > 0) { await _bimfaceInteropContainer.RestoreComponentsColor(_linkComponentIds); } _linkComponentIds = elementIds; if (elementIds == null || elementIds.Count < 1) { return; } if (_bimfaceInteropContainer == null) { return; } await _bimfaceInteropContainer.OverrideComponentsColor(elementIds, _linkComponentColor, _linkComponentTransparency); } #endregion #region 设置Open构件颜色 private const string _openComponentColor = "#2E8B57"; private const double _openComponentTransparency = 0.8; private List _openComponentIds = null;//Open构件id列表 /// /// 设置Open构件颜色 /// public async Task SetOpenComponentsColor(List 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 自定义标签 /// /// 显示计算自定义标签 /// 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(); 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() { 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() { 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 #endregion } }