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