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