namespace Yw.WpfUI.Hydro
{
///
/// 抽象引线标签辅助类
///
internal class LogicalBillboardLeadLabelHelper
{
///
///
///
public LogicalBillboardLeadLabelHelper(HelixViewport3D viewport)
{
_viewport = viewport;
}
private readonly HelixViewport3D _viewport = null;//三维组件
private readonly double _fontSize = 12;//字体大小
private readonly Brush _foregroud = Brushes.Black;//前景色
private readonly Brush _background = Brushes.Transparent;//背景色
private readonly Brush _borderbrush = Brushes.Transparent;//边框色
private readonly Dictionary _cache = new();//缓存
///
/// 设置
///
public void Set(List items)
{
Clear();
items?.ForEach(x => AddTextVisual3D(x));
}
///
/// 清理
///
public void Clear()
{
if (_cache.Count > 0)
{
foreach (var item in _cache)
{
_viewport.Children.Remove(item.Value);
}
_cache.Clear();
}
}
///
/// 更新
///
public void Update(LogicalTextL3d item)
{
if (item == null)
{
return;
}
if (_cache.ContainsKey(item.Id))
{
var billboardText = _cache[item.Id];
if (billboardText != null)
{
billboardText.Text = item.Text;
}
}
else
{
AddTextVisual3D(item);
}
}
///
/// 更新
///
public void Update(List items)
{
items?.ForEach(x => Update(x));
}
//添加公告牌文本
private void AddTextVisual3D(LogicalTextL3d item)
{
if (!_cache.ContainsKey(item.Id))
{
var billboardText = CreateTextVisual3D(item);
if (billboardText != null)
{
_cache.Add(item.Id, billboardText);
_viewport.Children.Add(billboardText);
}
}
}
//创建公告牌文本
private BillboardTextVisual3D CreateTextVisual3D(LogicalTextL3d item)
{
if (item == null)
{
return default;
}
var logicalVisual = _viewport.Children.OfType()
.Where(x => x.Vmo.Id == item.Id).FirstOrDefault();
if (logicalVisual == null)
{
return default;
}
var bounds = Visual3DHelper.FindBounds(logicalVisual, Transform3D.Identity);
var position = bounds.GetCenter();
var billboardText = new BillboardTextVisual3D();
billboardText.Text = item.Text;
billboardText.Foreground = _foregroud;
billboardText.Background = _background;
billboardText.BorderBrush = _borderbrush;
billboardText.FontSize = _fontSize;
billboardText.Padding = new Thickness(2);
billboardText.Position = position;
billboardText.HorizontalAlignment = HorizontalAlignment.Left;
billboardText.VerticalAlignment = VerticalAlignment.Bottom;
return billboardText;
}
}
}