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
}
}