lixiaojun
6 天以前 035610ac56ce25ba473472774d08525cbb5a6532
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
namespace Yw.WpfUI.Hydro
{
    /// <summary>
    /// 抽象3D水流方向
    /// </summary>
    internal class LogicalFlowDirection3D : MeshGeometryVisual3D, IDisposable
    {
        /// <summary>
        /// 
        /// </summary>
        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;//材质辅助类
 
        /// <summary>
        /// 正向
        /// </summary>
        public bool Positive
        {
            get { return _positive; }
            set { _positive = value; }
        }
        private bool _positive = true;
 
        /// <summary>
        /// 更新材质
        /// </summary>
        public void UpdateMaterial()
        {
            var htmlColor = Yw.Settings.HydroL3dParasHelper.HydroL3d.Logical.Flow.Direction.HtmlColor;
            var color = htmlColor.ToMediaColor();
            this.Material = _materialHelper.GetMaterial(color);
        }
 
        /// <summary>
        /// 更新几何图形
        /// </summary>
        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;
        }
 
        /// <summary>
        /// 更新可见性
        /// </summary>
        public void UpdateVisibility()
        {
            this.Visible = _link.Visible;
        }
 
        /// <summary>
        /// 更新可见元素
        /// </summary>
        public void UpdateVisual()
        {
            this.UpdateMaterial();
            this.UpdateGeometry();
            this.UpdateVisibility();
        }
 
        //处理可见事件
        private void OnVisualChanged()
        {
            this.UpdateVisual();
        }
 
        /// <summary>
        /// 释放
        /// </summary>
        public void Dispose()
        {
            _link.VisualChangedEvent -= OnVisualChanged;
        }
 
    }
}