lixiaojun
昨天 531e3b2f09ebf2e6df44e6803e7fa06073ba2c3d
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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
namespace Yw.WpfUI.Hydro
{
    /// <summary>
    /// 小管网绘制3D
    /// </summary>
    internal class SmallDraw3D : ModelVisual3D
    {
        /// <summary>
        /// 
        /// </summary>
        public SmallDraw3D(SmallInputL3d input, eDrawModeL3d drawMode)
        {
            _input = input;
            _drawMode = drawMode;
            Initialize();
        }
 
        private readonly SmallInputL3d _input = null;//输入
        private readonly eDrawModeL3d _drawMode;//绘制模式
        private VisualStateObject _stateObject = null;//状态对象
        private NodeDraw3D _baseNode3d = null;//基准节点元素
        private List<NodeDraw3D> _allNode3ds = null;//所有节点元素集合
        private List<LinkDraw3D> _alllLink3ds = null;//所有管段元素集合
 
        /// <summary>
        /// 所有可见元素
        /// </summary>
        public List<VisualDraw3D> Visual3ds
        {
            get
            {
                return this.Children.Select(x => x as VisualDraw3D).ToList();
            }
        }
 
        //初始化
        private void Initialize()
        {
            InitializeStateObject();
            InitializeVisual3D();
        }
 
        //初始化状态对象
        private void InitializeStateObject()
        {
            _stateObject = new VisualStateObject();
            _stateObject.HtmlColor = Yw.Settings.HydroL3dParasHelper.HydroL3d.Small.HtmlColor;
            _stateObject.Opacity = Yw.Settings.HydroL3dParasHelper.HydroL3d.Small.Opacity;
            _stateObject.Scale = Yw.Settings.HydroL3dParasHelper.HydroL3d.Small.Scale;
            _stateObject.Visible = Yw.Settings.HydroL3dParasHelper.HydroL3d.Small.Visible;
        }
 
        //初始化可见元素
        private void InitializeVisual3D()
        {
            var bp = _input.BaseNode.Position.ToPoint3D();//基准点
            var scale = _input.Scale;//缩放系数
            var vector = _input.Vector.ToVector3D();//方向
            var angle = _input.Angle;//旋转角度
            var tp = new Point3D(0, 0, 0);//目标点
            this.Children.Clear();
            _allNode3ds = new List<NodeDraw3D>();
            foreach (var node in _input.Nodes)
            {
                var pt = node.Position.ToPoint3D();
                pt = pt.ScalePoint(bp, scale.X, scale.Y, scale.Z);
                pt = pt.RotatePoint(bp, vector, angle);
                pt = pt.TranslatePoint(bp, tp);
                node.Position = pt.ToPointL3d();
 
                var node3d = (NodeDraw3D)DrawCreateHelper.Create(node, _drawMode);
                node3d.LoadState(eVisualState.Small, _stateObject);
                node3d.UpdateVisual3D();
                if (node == _input.BaseNode)
                {
                    _baseNode3d = node3d;
                }
                _allNode3ds.Add(node3d);
                this.Children.Add(node3d);
            }
            _alllLink3ds = new List<LinkDraw3D>();
            foreach (var link in _input.Links)
            {
                var link3d = (LinkDraw3D)DrawCreateHelper.Create(link, _drawMode);
                link3d.LoadState(eVisualState.Small, _stateObject);
                link3d.UpdateVisual3D();
                _alllLink3ds.Add(link3d);
                this.Children.Add(link3d);
            }
        }
 
        /// <summary>
        /// 更新平移量
        /// </summary>
        public void UpdateTransform(Point3D pt)
        {
            this.Transform = new TranslateTransform3D(pt.X, pt.Y, pt.Z);
        }
 
        /// <summary>
        /// 关闭
        /// </summary>
        public List<VisualDraw3D> Close(NodeDraw3D snapNode)
        {
            var pt = snapNode.GetPosition();
            if (!pt.HasValue)
            {
                return default;
            }
            this.Children.Clear();
            var list = new List<VisualDraw3D>();
            foreach (var node3d in _allNode3ds)
            {
                node3d.UnloadState(eVisualState.Small);
                node3d.Offset(pt.Value.ToVector3D());
                node3d.UpdateVisual3D();
                if (node3d != _baseNode3d)
                {
                    list.Add(node3d);
                }
            }
            foreach (var link3d in _alllLink3ds)
            {
                link3d.UnloadState(eVisualState.Small);
                if (link3d.Visual.StartNode == _baseNode3d.Visual)
                {
                    link3d.Visual.StartNode = snapNode.Visual;
                }
                if (link3d.Visual.EndNode == _baseNode3d.Visual)
                {
                    link3d.Visual.EndNode = snapNode.Visual;
                }
                link3d.UpdatePositions();
                link3d.UpdateVisual3D();
                list.Add(link3d);
            }
            return list;
        }
 
        /// <summary>
        /// 关闭
        /// </summary>
        public void Close()
        {
            this.Children.Clear();
        }
 
 
 
    }
}