lixiaojun
2025-04-18 86fdd2266700b4f80a2d8b05b6a79d31802a7231
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
namespace Yw.WpfUI.Hydro
{
    internal class LogicalValve3D : LogicalLink3D
    {
        /// <summary>
        /// 
        /// </summary>
        public LogicalValve3D() { }
 
        /// <summary>
        /// 
        /// </summary>
        public LogicalValve3D
            (
                ValveL3d vmo,
                LogicalStateHelper stateHelper,
                LogicalMaterialHelper materialHelper,
                LogicalOverrideColorHelper overrideColorHelper,
                LogicalOverrideOpacityHelper overrideOpacityHelper,
                LogicalOverrideVisibleHelper overrideVisibleHelper
            ) : base(vmo, stateHelper, materialHelper, overrideColorHelper, overrideOpacityHelper, overrideVisibleHelper)
        {
 
        }
 
        /// <summary>
        /// Vmo
        /// </summary>
        public new ValveL3d Vmo
        {
            get { return _vmo as ValveL3d; }
            set { _vmo = value; }
        }
 
        /// <summary>
        /// 更新材质
        /// </summary>
        public override void UpdateMaterial()
        {
            var htmlColor = Yw.Settings.HydroL3dParasHelper.HydroL3d.Logical.Link.Normal.HtmlColor;
            var opacity = 1.0d;
            var state = _stateHelper.GetState(this.Vmo);
            if (state.HasFlag(eLogicalState.Color))
            {
                htmlColor = _overrideColorHelper.GetColor(this.Vmo);
            }
            if (state.HasFlag(eLogicalState.Opacity))
            {
                opacity = _overrideOpacityHelper.GetOpacity(this.Vmo);
            }
            if (state.HasFlag(eLogicalState.Selection))
            {
                htmlColor = Yw.Settings.HydroL3dParasHelper.HydroL3d.Logical.Link.Selection.HtmlColor;
            }
            if (state.HasFlag(eLogicalState.Highlight))
            {
                htmlColor = Yw.Settings.HydroL3dParasHelper.HydroL3d.Logical.Link.Highlight.HtmlColor;
            }
            if (state.HasFlag(eLogicalState.Adding))
            {
                htmlColor = Yw.Settings.HydroL3dParasHelper.HydroL3d.Logical.Node.Adding.HtmlColor;
            }
            if (state.HasFlag(eLogicalState.Editing))
            {
                htmlColor = Yw.Settings.HydroL3dParasHelper.HydroL3d.Logical.Node.Editing.HtmlColor;
            }
            var material = _materialHelper.GetMaterial(htmlColor, opacity);
            this.Material = material;
        }
 
        /// <summary>
        /// 更新几何图形
        /// </summary>
        public override void UpdateGeometry()
        {
            var diameter = Yw.Settings.HydroL3dParasHelper.HydroL3d.Logical.Link.Normal.Diameter;
            var state = _stateHelper.GetState(this.Vmo);
            if (state.HasFlag(eLogicalState.Selection))
            {
                diameter = Yw.Settings.HydroL3dParasHelper.HydroL3d.Logical.Link.Selection.Diameter;
            }
            if (state.HasFlag(eLogicalState.Highlight))
            {
                diameter = Yw.Settings.HydroL3dParasHelper.HydroL3d.Logical.Link.Highlight.Diameter;
            }
 
            var sv = this.StartPosition.ToVector3D();
            var ev = this.EndPosition.ToVector3D();
            var center = (sv + ev) * 0.5d;
            var direction = (ev - sv);
            var length = direction.Length;
            direction.Normalize();
            var size = diameter * 1.5d;
            if (size > length * 0.7)
            {
                size = length * 0.7;
            }
 
            //阀门管道
            var builder = new MeshBuilder();
            builder.AddTube(
                path: new[] { this.StartPosition, this.EndPosition },
                diameter: diameter,  // 线直径(3D空间单位)
                thetaDiv: 8,    // 横截面细分度
                false
            );
 
            builder.AddBox(center.ToPoint3D(), size, size, size);
 
            var geometry = builder.ToMesh();
            this.MeshGeometry = geometry;
        }
 
        /// <summary>
        /// 更新变换矩阵
        /// </summary>
        public override void UpdateTransform()
        {
 
        }
 
 
 
 
    }
}