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();
|
}
|
|
|
|
}
|
}
|