lixiaojun
6 天以前 059775ffcf3daa5bbb97725cfbdac3ead03fcb70
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>
    /// 抽象3D水泵
    /// </summary>
    internal class LogicalPump3D : LogicalLink3D
    {
        /// <summary>
        /// 
        /// </summary>
        public LogicalPump3D() { }
 
        /// <summary>
        /// 
        /// </summary>
        public LogicalPump3D
            (
                PumpL3d vmo,
                LogicalStateHelper stateHelper,
                LogicalMaterialHelper materialHelper,
                LogicalOverrideColorHelper overrideColorHelper,
                LogicalOverrideOpacityHelper overrideOpacityHelper,
                LogicalOverrideVisibleHelper overrideVisibleHelper
            ) : base(vmo, stateHelper, materialHelper, overrideColorHelper, overrideOpacityHelper, overrideVisibleHelper)
        {
 
        }
 
        /// <summary>
        /// Vmo
        /// </summary>
        public new PumpL3d Vmo
        {
            get { return _vmo as PumpL3d; }
            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();
 
            //水泵管道
            MeshBuilder builder = new MeshBuilder();
            builder.AddTube(
                path: new[] { this.StartPosition, this.EndPosition },
                diameter: diameter,  // 线直径(3D空间单位)
                thetaDiv: 8,    // 横截面细分度
                false
            );
 
            // 水泵主体(圆柱形)
            var pumpCenter = sv + direction * (length * 0.5d);
            builder.AddCylinder(
                p1: (pumpCenter - direction * (length * 0.3d)).ToPoint3D(),
                p2: (pumpCenter + direction * (length * 0.3d)).ToPoint3D(),
                diameter: diameter * 1.5d,
                thetaDiv: 16);
 
            var geometry = builder.ToMesh();
            this.MeshGeometry = geometry;
 
        }
 
 
        /// <summary>
        /// 更新变换矩阵
        /// </summary>
        public override void UpdateTransform()
        {
 
        }
 
 
 
    }
}