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