namespace Yw.WpfUI.Hydro { /// /// 抽象3D水泵 /// internal class LogicalPump3D : LogicalLink3D { /// /// /// public LogicalPump3D() { } /// /// /// public LogicalPump3D ( PumpL3d vmo, LogicalStateHelper stateHelper, LogicalMaterialHelper materialHelper, LogicalOverrideColorHelper overrideColorHelper, LogicalOverrideOpacityHelper overrideOpacityHelper, LogicalOverrideVisibleHelper overrideVisibleHelper ) : base(vmo, stateHelper, materialHelper, overrideColorHelper, overrideOpacityHelper, overrideVisibleHelper) { } /// /// Vmo /// public new PumpL3d Vmo { get { return _vmo as PumpL3d; } set { _vmo = value; } } /// /// 更新材质 /// 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; } /// /// 更新几何图形 /// 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; } /// /// 更新变换矩阵 /// public override void UpdateTransform() { } } }