167 lines
8.1 KiB
C#
167 lines
8.1 KiB
C#
|
|
using System;
|
|||
|
|
using System.Collections.Generic;
|
|||
|
|
using System.Linq;
|
|||
|
|
using System.Text;
|
|||
|
|
using System.Threading.Tasks;
|
|||
|
|
using System.ComponentModel;
|
|||
|
|
using DynamicTypeDescriptor;
|
|||
|
|
using CaeGlobals;
|
|||
|
|
|
|||
|
|
namespace CPSO
|
|||
|
|
{
|
|||
|
|
[Serializable]
|
|||
|
|
public class ViewSurfaceBehavior : ViewSurfaceInteractionProperty
|
|||
|
|
{
|
|||
|
|
// Variables
|
|||
|
|
private CaeModel.SurfaceBehavior _surfaceBehavior;
|
|||
|
|
private List<PressureOverclosureDataPoint> _points;
|
|||
|
|
|
|||
|
|
|
|||
|
|
// Properties
|
|||
|
|
[Browsable(false)]
|
|||
|
|
public override string Name
|
|||
|
|
{
|
|||
|
|
get { return "Surface Behavior"; }
|
|||
|
|
}
|
|||
|
|
//
|
|||
|
|
[Browsable(false)]
|
|||
|
|
public List<PressureOverclosureDataPoint> DataPoints { get { return _points; } set { _points = value; } }
|
|||
|
|
//
|
|||
|
|
[Browsable(false)]
|
|||
|
|
public override CaeModel.SurfaceInteractionProperty Base
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
int i = 0;
|
|||
|
|
double[][] pressureOverclosure = new double[_points.Count][];
|
|||
|
|
foreach (PressureOverclosureDataPoint point in _points)
|
|||
|
|
{
|
|||
|
|
pressureOverclosure[i] = new double[2];
|
|||
|
|
pressureOverclosure[i][0] = point.Pressure;
|
|||
|
|
pressureOverclosure[i][1] = point.Overclosure;
|
|||
|
|
i++;
|
|||
|
|
}
|
|||
|
|
_surfaceBehavior.PressureOverclosure = pressureOverclosure;
|
|||
|
|
//
|
|||
|
|
return _surfaceBehavior;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
//
|
|||
|
|
[Category("Data")]
|
|||
|
|
[OrderedDisplayName(0, 10, "Type")]
|
|||
|
|
[Description("Select the pressure-overclosure type for this surface bahavior.")]
|
|||
|
|
public CaeModel.PressureOverclosureEnum PressureOverclosureType
|
|||
|
|
{
|
|||
|
|
get { return _surfaceBehavior.PressureOverclosureType; }
|
|||
|
|
set { _surfaceBehavior.PressureOverclosureType = value; UpdateVisibility(); }
|
|||
|
|
}
|
|||
|
|
//
|
|||
|
|
[Category("Data")]
|
|||
|
|
[OrderedDisplayName(1, 10, "K")]
|
|||
|
|
[Description("Slope of the pressure-overclosure curve (usually 5 to 50 times the E modulus of the adjacent materials).")]
|
|||
|
|
[TypeConverter(typeof(StringForcePerVolumeConverter))]
|
|||
|
|
public double K { get { return _surfaceBehavior.K; } set { _surfaceBehavior.K = value; } }
|
|||
|
|
//
|
|||
|
|
[Category("Data")]
|
|||
|
|
[OrderedDisplayName(2, 10, "σ infinity")]
|
|||
|
|
[Description("Tension value for large clearances (about 0.25 % of the maximum expected von Mises stress).")]
|
|||
|
|
[TypeConverter(typeof(StringPressureConverter))]
|
|||
|
|
public double Sinf { get { return _surfaceBehavior.Sinf; } set { _surfaceBehavior.Sinf = value; } }
|
|||
|
|
//
|
|||
|
|
[Category("Data")]
|
|||
|
|
[OrderedDisplayName(3, 10, "c₀")]
|
|||
|
|
[Description("The value from which the maximum clearance is calculated for which a spring contact " +
|
|||
|
|
"element is generated. The default for c₀ is 0.001 (dimensionless). " +
|
|||
|
|
"Not needed for surface-to-surface contact.")]
|
|||
|
|
[TypeConverter(typeof(StringDoubleDefaultConverter))]
|
|||
|
|
public double C0_lin
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
CaeModel.SurfaceBehavior surfaceBehavior = new CaeModel.SurfaceBehavior();
|
|||
|
|
StringDoubleDefaultConverter.InitialValue = surfaceBehavior.C0;
|
|||
|
|
//
|
|||
|
|
return _surfaceBehavior.C0;
|
|||
|
|
}
|
|||
|
|
set { _surfaceBehavior.C0 = value; }
|
|||
|
|
}
|
|||
|
|
//
|
|||
|
|
[Category("Data")]
|
|||
|
|
[OrderedDisplayName(4, 10, "p₀")]
|
|||
|
|
[Description("The contact pressure at zero clerance (p₀ > 0).")]
|
|||
|
|
[TypeConverter(typeof(StringPressureConverter))]
|
|||
|
|
public double P0 { get { return _surfaceBehavior.P0; } set { _surfaceBehavior.P0 = value; } }
|
|||
|
|
//
|
|||
|
|
[Category("Data")]
|
|||
|
|
[OrderedDisplayName(5, 10, "c₀")]
|
|||
|
|
[Description("The clerance at which the contact pressure is decreased to 1 % of p₀ (c₀ > 0).")]
|
|||
|
|
[TypeConverter(typeof(StringLengthConverter))]
|
|||
|
|
public double C0_exp { get { return _surfaceBehavior.C0; } set { _surfaceBehavior.C0 = value; } }
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
// Constructors
|
|||
|
|
public ViewSurfaceBehavior(CaeModel.SurfaceBehavior surfaceBehavior)
|
|||
|
|
{
|
|||
|
|
_surfaceBehavior = surfaceBehavior;
|
|||
|
|
//
|
|||
|
|
_points = new List<PressureOverclosureDataPoint>();
|
|||
|
|
for (int i = 0; i < _surfaceBehavior.PressureOverclosure.Length; i++)
|
|||
|
|
{
|
|||
|
|
_points.Add(new PressureOverclosureDataPoint(_surfaceBehavior.PressureOverclosure[i][0],
|
|||
|
|
_surfaceBehavior.PressureOverclosure[i][1]));
|
|||
|
|
}
|
|||
|
|
//
|
|||
|
|
base.DynamicCustomTypeDescriptor = ProviderInstaller.Install(this);
|
|||
|
|
//
|
|||
|
|
UpdateVisibility();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void UpdateVisibility()
|
|||
|
|
{
|
|||
|
|
if (_surfaceBehavior.PressureOverclosureType == CaeModel.PressureOverclosureEnum.Hard)
|
|||
|
|
{
|
|||
|
|
DynamicCustomTypeDescriptor.GetProperty(nameof(K)).SetIsBrowsable(false);
|
|||
|
|
DynamicCustomTypeDescriptor.GetProperty(nameof(Sinf)).SetIsBrowsable(false);
|
|||
|
|
DynamicCustomTypeDescriptor.GetProperty(nameof(C0_lin)).SetIsBrowsable(false);
|
|||
|
|
DynamicCustomTypeDescriptor.GetProperty(nameof(P0)).SetIsBrowsable(false);
|
|||
|
|
DynamicCustomTypeDescriptor.GetProperty(nameof(C0_exp)).SetIsBrowsable(false);
|
|||
|
|
}
|
|||
|
|
else if (_surfaceBehavior.PressureOverclosureType == CaeModel.PressureOverclosureEnum.Linear)
|
|||
|
|
{
|
|||
|
|
DynamicCustomTypeDescriptor.GetProperty(nameof(K)).SetIsBrowsable(true);
|
|||
|
|
DynamicCustomTypeDescriptor.GetProperty(nameof(Sinf)).SetIsBrowsable(true);
|
|||
|
|
DynamicCustomTypeDescriptor.GetProperty(nameof(C0_lin)).SetIsBrowsable(true);
|
|||
|
|
DynamicCustomTypeDescriptor.GetProperty(nameof(P0)).SetIsBrowsable(false);
|
|||
|
|
DynamicCustomTypeDescriptor.GetProperty(nameof(C0_exp)).SetIsBrowsable(false);
|
|||
|
|
}
|
|||
|
|
else if (_surfaceBehavior.PressureOverclosureType == CaeModel.PressureOverclosureEnum.Exponential)
|
|||
|
|
{
|
|||
|
|
DynamicCustomTypeDescriptor.GetProperty(nameof(K)).SetIsBrowsable(false);
|
|||
|
|
DynamicCustomTypeDescriptor.GetProperty(nameof(Sinf)).SetIsBrowsable(false);
|
|||
|
|
DynamicCustomTypeDescriptor.GetProperty(nameof(C0_lin)).SetIsBrowsable(false);
|
|||
|
|
DynamicCustomTypeDescriptor.GetProperty(nameof(P0)).SetIsBrowsable(true);
|
|||
|
|
DynamicCustomTypeDescriptor.GetProperty(nameof(C0_exp)).SetIsBrowsable(true);
|
|||
|
|
}
|
|||
|
|
else if (_surfaceBehavior.PressureOverclosureType == CaeModel.PressureOverclosureEnum.Tabular)
|
|||
|
|
{
|
|||
|
|
DynamicCustomTypeDescriptor.GetProperty(nameof(K)).SetIsBrowsable(false);
|
|||
|
|
DynamicCustomTypeDescriptor.GetProperty(nameof(Sinf)).SetIsBrowsable(false);
|
|||
|
|
DynamicCustomTypeDescriptor.GetProperty(nameof(C0_lin)).SetIsBrowsable(false);
|
|||
|
|
DynamicCustomTypeDescriptor.GetProperty(nameof(P0)).SetIsBrowsable(false);
|
|||
|
|
DynamicCustomTypeDescriptor.GetProperty(nameof(C0_exp)).SetIsBrowsable(false);
|
|||
|
|
}
|
|||
|
|
else if (_surfaceBehavior.PressureOverclosureType == CaeModel.PressureOverclosureEnum.Tied)
|
|||
|
|
{
|
|||
|
|
DynamicCustomTypeDescriptor.GetProperty(nameof(K)).SetIsBrowsable(true);
|
|||
|
|
DynamicCustomTypeDescriptor.GetProperty(nameof(Sinf)).SetIsBrowsable(false);
|
|||
|
|
DynamicCustomTypeDescriptor.GetProperty(nameof(C0_lin)).SetIsBrowsable(false);
|
|||
|
|
DynamicCustomTypeDescriptor.GetProperty(nameof(P0)).SetIsBrowsable(false);
|
|||
|
|
DynamicCustomTypeDescriptor.GetProperty(nameof(C0_exp)).SetIsBrowsable(false);
|
|||
|
|
}
|
|||
|
|
else throw new NotSupportedException();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|