lixiaojun
8 天以前 0329c48a57f33a4c94e44c5e4d3d3c116184986f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
namespace Yw.WpfUI.Hydro
{
    /// <summary>
    /// 抽象公告文本辅助类
    /// </summary>
    internal class LogicalBillboardTextHelper
    {
        /// <summary>
        /// 
        /// </summary>
        public LogicalBillboardTextHelper(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<string, BillboardTextVisual3D> _cache = new();//缓存
 
        /// <summary>
        /// 设置
        /// </summary>
        public void Set(List<TextL3d> items)
        {
            Clear();
            items?.ForEach(x => AddTextVisual3D(x));
        }
 
        /// <summary>
        /// 清理
        /// </summary>
        public void Clear()
        {
            if (_cache.Count > 0)
            {
                foreach (var item in _cache)
                {
                    _viewport.Children.Remove(item.Value);
                }
                _cache.Clear();
            }
        }
 
        /// <summary>
        /// 更新
        /// </summary>
        public void Update(TextL3d 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);
            }
        }
 
        /// <summary>
        /// 更新
        /// </summary>
        public void Update(List<TextL3d> items)
        {
            items?.ForEach(x => Update(x));
        }
 
 
        //添加公告牌文本
        private void AddTextVisual3D(TextL3d 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(TextL3d item)
        {
            if (item == null)
            {
                return default;
            }
            var logicalVisual = _viewport.Children.OfType<LogicalVisual3D>()
                .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;
        }
 
 
 
 
 
 
 
    }
}