namespace Yw.WpfUI.Hydro
{
///
/// 抽象3D水流方向
///
internal class LogicalFlowDirection3D : MeshGeometryVisual3D, IDisposable
{
///
///
///
public LogicalFlowDirection3D
(
LogicalLink3D link,
LogicalMaterialHelper materialHelper,
bool positive = true
)
{
_link = link;
_link.VisualChangedEvent += OnVisualChanged;
_materialHelper = materialHelper;
_positive = positive;
UpdateVisual();
}
private readonly LogicalLink3D _link;//管段
private readonly LogicalMaterialHelper _materialHelper;//材质辅助类
///
/// 正向
///
public bool Positive
{
get { return _positive; }
set { _positive = value; }
}
private bool _positive = true;
///
/// 更新材质
///
public void UpdateMaterial()
{
var htmlColor = Yw.Settings.HydroL3dParasHelper.HydroL3d.Logical.Flow.Direction.HtmlColor;
var color = htmlColor.ToMediaColor();
this.Material = _materialHelper.GetMaterial(color);
}
///
/// 更新几何图形
///
public void UpdateGeometry()
{
var diameter = Yw.Settings.HydroL3dParasHelper.HydroL3d.Logical.Link.Normal.Diameter;
var center = _link.StartPosition + (_link.EndPosition - _link.StartPosition) / 2d;
var start = _link.StartPosition + (center - _link.StartPosition) / 2d;
var end = center + (_link.EndPosition - center) / 2d;
var builder = new MeshBuilder();
if (this.Positive)
{
builder.AddArrow(start, end, diameter);
}
else
{
builder.AddArrow(end, start, diameter);
}
var geometry = builder.ToMesh();
this.MeshGeometry = geometry;
}
///
/// 更新可见性
///
public void UpdateVisibility()
{
this.Visible = _link.Visible;
}
///
/// 更新可见元素
///
public void UpdateVisual()
{
this.UpdateMaterial();
this.UpdateGeometry();
this.UpdateVisibility();
}
//处理可见事件
private void OnVisualChanged()
{
this.UpdateVisual();
}
///
/// 释放
///
public void Dispose()
{
_link.VisualChangedEvent -= OnVisualChanged;
}
}
}