using Yw.Model;
using Yw.WinFrmUI.Bimface;
namespace HStation.WinFrmUI
{
///
/// 水流动画辅助类
///
public class SimulationFlowEffectHelper
{
///
///
///
public SimulationFlowEffectHelper(SimulationVisualListHelper visualListHelper, ISimulationFlowEffectView view)
{
_visualListHelper = visualListHelper;
_views = new List() { view };
}
private SimulationVisualListHelper _visualListHelper = null;//可见列表辅助类
private List _views = null;//视图列表
private HydroCalcuResult _calcuResult = null;//计算结果
///
/// 可见性
///
public bool Visible
{
get { return _visible; }
set { _visible = value; }
}
private bool _visible = false;
///
/// 项列表
///
public List Items
{
get { return _items; }
private set { _items = value; }
}
private List _items = null;
///
/// 初始化数据
///
public void InitialData(HydroCalcuResult calcuResult)
{
_calcuResult = calcuResult;
var allCalcuResultVisualDict = calcuResult?.GetVisualDict();
_visualListHelper.HydroInfo.Pipes?.ForEach(x => InitialItem(x, allCalcuResultVisualDict));
}
//初始化项
private void InitialItem(HydroVisualInfo visual, Dictionary allCalcuResultVisualDict)
{
var item = CreateItem(visual, allCalcuResultVisualDict);
if (item != null)
{
if (this.Items == null)
{
this.Items = new List();
}
this.Items.Add(item);
}
}
//创建项
private LogicFlowEffect CreateItem(HydroVisualInfo visual, Dictionary allCalcuResultVisualDict = null)
{
if (visual == null)
{
return default;
}
LogicFlowEffect item = null;
switch (visual.Catalog)
{
case Yw.Hydro.ParterCatalog.Pipe:
{
var pipe = visual as HydroPipeInfo;
item = new LogicFlowEffect();
item.Id = pipe.Code;
item.Rotation = 90;
item.SpeedX = 0.1;
//if (pipe.FlowDirectionX == Yw.Hydro.FlowDirection.None)
//{
// item.SpeedX = 0;
//}
//else if (pipe.FlowDirectionX == Yw.Hydro.FlowDirection.Positive)
//{
// item.SpeedX = 0.1;
//}
//else
//{
// item.SpeedX = -0.1;
//}
//if (pipe.FlowDirectionY == Yw.Hydro.FlowDirection.None)
//{
// item.SpeedY = 0;
//}
//else if (pipe.FlowDirectionY == Yw.Hydro.FlowDirection.Positive)
//{
// item.SpeedY = 0.1;
//}
//else
//{
// item.SpeedY = -0.1;
//}
var calcuLinkResult = allCalcuResultVisualDict?.GetValue(pipe.Code) as HydroCalcuLinkResult;
if (calcuLinkResult != null)
{
if (calcuLinkResult.CalcuVelocity < 0)
{
item.SpeedX = -item.SpeedX;
}
}
}
break;
default: break;
}
return item;
}
///
/// 设置
///
public void Set()
{
if (this.Visible)
{
_views?.ForEach(async x => await x.LoadFlowEffect(this.Items));
}
else
{
_views?.ForEach(async x => await x.UnloadFlowEffect());
}
}
///
/// 设置
///
public void Set(HydroVisualInfo visual)
{
if (visual == null)
{
return;
}
var oldItem = this.Items?.Find(x => x.Id == visual.Code);
if (oldItem != null)
{
if (this.Items != null)
{
this.Items.Remove(oldItem);
}
this.Items?.Remove(oldItem);
}
var allCalcuResultVisualDict = _calcuResult?.GetVisualDict();
var newItem = CreateItem(visual, allCalcuResultVisualDict);
if (newItem != null)
{
if (this.Items != null)
{
this.Items.Add(newItem);
}
}
if (this.Visible)
{
if (newItem != null)
{
_views?.ForEach(async x => await x.UpdateFlowEffect(newItem));
}
}
}
}
}