Files
wg_cpso/CPSO/Forms/24_Part/ViewPartProperties.cs

420 lines
18 KiB
C#
Raw Permalink Normal View History

2026-03-25 18:20:24 +08:00
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using CaeMesh;
using CaeGlobals;
using System.ComponentModel;
using DynamicTypeDescriptor;
using System.Drawing.Design;
namespace CPSO.Forms
{
[Serializable]
public class ViewPartProperties
{
// Variables
private PartProperties _partProperties;
private DynamicCustomTypeDescriptor _dctd = null;
// Properties
[Category("Data")]
[OrderedDisplayName(0, 10, "Name")]
[Description("Name of the part.")]
[Id(1, 1)]
public string Name { get { return _partProperties.Name; } set { _partProperties.Name = value; } }
//
[Category("Data")]
[OrderedDisplayName(1, 10, "Part type")]
[Description("Part type.")]
[Id(2, 1)]
public PartType PartType { get { return _partProperties.PartType; } }
//
[Category("Data")]
[OrderedDisplayName(2, 10, "Geometry")]
[Description("Geometry type.")]
[Id(3, 1)]
public string GeometryType { get { return _partProperties.IsCADPart ? "CAD" : "STL"; } }
//
[Category("Mesh")]
[OrderedDisplayName(0, 10, "Number of elements")]
[Description("Number of elements.")]
[Id(1, 2)]
public int NumberOfElements { get { return _partProperties.NumberOfElements; } }
//
[Category("Mesh")]
[OrderedDisplayName(1, 10, "Number of nodes")]
[Description("Number of nodes.")]
[Id(2, 2)]
public int NumberOfNodes { get { return _partProperties.NumberOfNodes; } }
//
[Category("Element type")]
[OrderedDisplayName(0, 20, "Linear triangle")]
[Description("Select the type of the linear triangular elements.")]
[Id(1, 3)]
public FeElementTypeLinearTria LinearTriaType
{
get { return _partProperties.LinearTriaType; }
set { _partProperties.LinearTriaType = value; }
}
//
[Category("Element type")]
[OrderedDisplayName(1, 20, "Parabolic triangle")]
[Description("Select the type of the parabolic triangular elements.")]
[Id(2, 3)]
public FeElementTypeParabolicTria ParabolicTriaType
{
get { return _partProperties.ParabolicTriaType; }
set { _partProperties.ParabolicTriaType = value; }
}
//
[Category("Element type")]
[OrderedDisplayName(2, 20, "Linear quadrilateral")]
[Description("Select the type of the linear quadrilateral elements.")]
[Id(3, 3)]
public FeElementTypeLinearQuad LinearQuadType
{
get { return _partProperties.LinearQuadType; }
set { _partProperties.LinearQuadType = value; }
}
//
[Category("Element type")]
[OrderedDisplayName(3, 20, "Parabolic quadrilateral")]
[Description("Select the type of the parabolic quadrilateral elements.")]
[Id(4, 3)]
public FeElementTypeParabolicQuad ParabolicQuadType
{
get { return _partProperties.ParabolicQuadType; }
set { _partProperties.ParabolicQuadType = value; }
}
//
[Category("Element type")]
[OrderedDisplayName(4, 20, "Linear tetrahedron")]
[Description("Select the type of the linear tetrahedron elements.")]
[Id(5, 3)]
public FeElementTypeLinearTetra LinearTetraType
{
get { return _partProperties.LinearTetraType; }
set { _partProperties.LinearTetraType = value; }
}
//
[Category("Element type")]
[OrderedDisplayName(5, 20, "Parabolic tetrahedron")]
[Description("Select the type of the parabolic tetrahedron elements.")]
[Id(6, 3)]
public FeElementTypeParabolicTetra ParabolicTetraType
{
get { return _partProperties.ParabolicTetraType; }
set { _partProperties.ParabolicTetraType = value; }
}
//
[Category("Element type")]
[OrderedDisplayName(6, 20, "Linear pyramid")]
[Description("Select the type of the linear pyramid elements.")]
[Id(7, 3)]
public FeElementTypeLinearPyramid LinearPyramidType
{
get { return _partProperties.LinearPyramidType; }
set { _partProperties.LinearPyramidType = value; }
}
//
[Category("Element type")]
[OrderedDisplayName(7, 20, "Parabolic pyramid")]
[Description("Select the type of the parabolic pyramid elements.")]
[Id(8, 3)]
public FeElementTypeParabolicPyramid ParabolicPyramidType
{
get { return _partProperties.ParabolicPyramidType; }
set { _partProperties.ParabolicPyramidType = value; }
}
//
[Category("Element type")]
[OrderedDisplayName(8, 20, "Linear wedge")]
[Description("Select the type of the linear wedge elements.")]
[Id(9, 3)]
public FeElementTypeLinearWedge LinearWedgeType
{
get { return _partProperties.LinearWedgeType; }
set { _partProperties.LinearWedgeType = value; }
}
//
[Category("Element type")]
[OrderedDisplayName(9, 20, "Parabolic wedge")]
[Description("Select the type of the parabolic wedge elements.")]
[Id(10, 3)]
public FeElementTypeParabolicWedge ParabolicWedgeType
{
get { return _partProperties.ParabolicWedgeType; }
set { _partProperties.ParabolicWedgeType = value; }
}
//
[Category("Element type")]
[OrderedDisplayName(10, 20, "Linear hexahedron")]
[Description("Select the type of the linear hexahedron elements.")]
[Id(11, 3)]
public FeElementTypeLinearHexa LinearHexaType
{
get { return _partProperties.LinearHexaType; }
set { _partProperties.LinearHexaType = value; }
}
//
[Category("Element type")]
[OrderedDisplayName(11, 20, "Parabolic hexahedron")]
[Description("Select the type of the parabolic hexahedron elements.")]
[Id(12, 3)]
public FeElementTypeParabolicHexa ParabolicHexaType
{
get { return _partProperties.ParabolicHexaType; }
set { _partProperties.ParabolicHexaType = value; }
}
//
[Category("Geometry")]
[OrderedDisplayName(0, 10, "Volume")]
[Description("Part volume.")]
[TypeConverter(typeof(StringVolumeUnknownConverter))]
[Id(1, 4)]
public double Volume
{
get
{
if (_partProperties.MassProperties.CenterOfMass != null)
return Math.Round(_partProperties.MassProperties.Volume, 6);
else return double.NaN;
}
}
//
[Category("Geometry")]
[OrderedDisplayName(0, 10, "Undeformed volume")]
[Description("Part undeformed volume.")]
[TypeConverter(typeof(StringVolumeUnknownConverter))]
[Id(1, 4)]
public double UndeformedVolume
{
get
{
if (_partProperties.MassProperties.CenterOfMass != null)
return Math.Round(_partProperties.MassProperties.Volume, 6);
else return double.NaN;
}
}
//
[Category("Geometry")]
[OrderedDisplayName(1, 10, "Area")]
[Description("Part area.")]
[TypeConverter(typeof(StringAreaUnknownConverter))]
[Id(2, 4)]
public double Area
{
get
{
if (_partProperties.MassProperties.CenterOfMass != null)
return Math.Round(_partProperties.MassProperties.Area, 6);
else return double.NaN;
}
}
//
[Category("Geometry")]
[OrderedDisplayName(1, 10, "Undeformed area")]
[Description("Part undeformed area.")]
[TypeConverter(typeof(StringAreaUnknownConverter))]
[Id(2, 4)]
public double UndeformedArea
{
get
{
if (_partProperties.MassProperties.CenterOfMass != null)
return Math.Round(_partProperties.MassProperties.Area, 6);
else return double.NaN;
}
}
//
[Category("Center of mass")]
[OrderedDisplayName(0, 10, "X")]
[Description("X coordinate of center of mass.")]
[TypeConverter(typeof(StringLengthUnknownConverter))]
[Id(1, 5)]
public double X
{
get
{
if (_partProperties.MassProperties.CenterOfMass != null)
return Math.Round(_partProperties.MassProperties.CenterOfMass[0], 6);
else return double.NaN;
}
}
//
[Category("Center of mass")]
[OrderedDisplayName(1, 10, "Y")]
[Description("Y coordinate of center of mass.")]
[TypeConverter(typeof(StringLengthUnknownConverter))]
[Id(2, 5)]
public double Y
{
get
{
if (_partProperties.MassProperties.CenterOfMass != null)
return Math.Round(_partProperties.MassProperties.CenterOfMass[1], 6);
else return double.NaN;
}
}
//
[Category("Center of mass")]
[OrderedDisplayName(2, 10, "Z")]
[Description("Z coordinate of center of mass.")]
[TypeConverter(typeof(StringLengthUnknownConverter))]
[Id(2, 5)]
public double Z
{
get
{
if (_partProperties.MassProperties.CenterOfMass != null)
return Math.Round(_partProperties.MassProperties.CenterOfMass[2], 6);
else return double.NaN;
}
}
[Category("Appearance")]
[OrderedDisplayName(0, 10, "Part color")]
[Description("Select part color.")]
[Editor(typeof(UserControls.ColorEditorEx), typeof(UITypeEditor))]
[Id(1, 6)]
public System.Drawing.Color Color
{
get { return _partProperties.Color; }
set
{
_partProperties.Color = System.Drawing.Color.FromArgb(Math.Max((byte)25, value.A), value);
}
}
// Constructors
public ViewPartProperties(PartProperties properties, ViewGeometryModelResults currentView,
Dictionary<Type, HashSet<string>> elementTypeNamesToRemove)
{
_partProperties = properties;
_dctd = ProviderInstaller.Install(this);
_dctd.CategorySortOrder = CustomSortOrder.AscendingById;
_dctd.PropertySortOrder = CustomSortOrder.AscendingById;
//
SetVisibility(currentView, elementTypeNamesToRemove);
}
// Methods
public PartProperties GetBase()
{
return _partProperties;
}
private void SetVisibility(ViewGeometryModelResults currentView, Dictionary<Type, HashSet<string>> elementTypeNamesToRemove)
{
bool solid = _partProperties.PartType == PartType.Solid || _partProperties.PartType == PartType.SolidAsShell ||
_partProperties.PartType == PartType.Compound;
//
_dctd.GetProperty(nameof(X)).SetIsBrowsable(!double.IsNaN(X));
_dctd.GetProperty(nameof(Y)).SetIsBrowsable(!double.IsNaN(Y));
_dctd.GetProperty(nameof(Z)).SetIsBrowsable(!double.IsNaN(Z));
//
bool visible;
if (currentView == ViewGeometryModelResults.Geometry)
{
_dctd.GetProperty(nameof(GeometryType)).SetIsBrowsable(true);
//
_dctd.GetProperty(nameof(Volume)).SetIsBrowsable(solid && !double.IsNaN(Volume));
_dctd.GetProperty(nameof(Area)).SetIsBrowsable(!solid && !double.IsNaN(Area));
_dctd.GetProperty(nameof(UndeformedVolume)).SetIsBrowsable(false);
_dctd.GetProperty(nameof(UndeformedArea)).SetIsBrowsable(false);
//
visible = _partProperties.PartType != PartType.Compound;
_dctd.GetProperty(nameof(NumberOfElements)).SetIsBrowsable(visible);
_dctd.GetProperty(nameof(NumberOfNodes)).SetIsBrowsable(visible);
_dctd.GetProperty(nameof(Color)).SetIsBrowsable(visible);
//
_dctd.GetProperty(nameof(LinearTriaType)).SetIsBrowsable(false);
_dctd.GetProperty(nameof(ParabolicTriaType)).SetIsBrowsable(false);
_dctd.GetProperty(nameof(LinearQuadType)).SetIsBrowsable(false);
_dctd.GetProperty(nameof(ParabolicQuadType)).SetIsBrowsable(false);
//
_dctd.GetProperty(nameof(LinearTetraType)).SetIsBrowsable(false);
_dctd.GetProperty(nameof(ParabolicTetraType)).SetIsBrowsable(false);
_dctd.GetProperty(nameof(LinearPyramidType)).SetIsBrowsable(false);
_dctd.GetProperty(nameof(ParabolicPyramidType)).SetIsBrowsable(false);
_dctd.GetProperty(nameof(LinearWedgeType)).SetIsBrowsable(false);
_dctd.GetProperty(nameof(ParabolicWedgeType)).SetIsBrowsable(false);
_dctd.GetProperty(nameof(LinearHexaType)).SetIsBrowsable(false);
_dctd.GetProperty(nameof(ParabolicHexaType)).SetIsBrowsable(false);
}
else if (currentView == ViewGeometryModelResults.Model)
{
_dctd.GetProperty(nameof(GeometryType)).SetIsBrowsable(false);
//
_dctd.GetProperty(nameof(Volume)).SetIsBrowsable(solid && !double.IsNaN(Volume));
_dctd.GetProperty(nameof(Area)).SetIsBrowsable(!solid && !double.IsNaN(Area));
_dctd.GetProperty(nameof(UndeformedVolume)).SetIsBrowsable(false);
_dctd.GetProperty(nameof(UndeformedArea)).SetIsBrowsable(false);
//
_dctd.GetProperty(nameof(NumberOfElements)).SetIsBrowsable(true);
_dctd.GetProperty(nameof(NumberOfNodes)).SetIsBrowsable(true);
//
Dictionary<Type, HashSet<string>> er = elementTypeNamesToRemove;
PartProperties pp = _partProperties;
//
ShowHide((int)pp.LinearTriaType, nameof(LinearTriaType), typeof(FeElementTypeLinearTria), er);
ShowHide((int)pp.ParabolicTriaType, nameof(ParabolicTriaType), typeof(FeElementTypeParabolicTria), er);
ShowHide((int)pp.LinearQuadType, nameof(LinearQuadType), typeof(FeElementTypeLinearQuad), er);
ShowHide((int)pp.ParabolicQuadType, nameof(ParabolicQuadType), typeof(FeElementTypeParabolicQuad), er);
// Solid
ShowHide((int)pp.LinearTetraType, nameof(LinearTetraType), typeof(FeElementTypeLinearTetra), er);
ShowHide((int)pp.ParabolicTetraType, nameof(ParabolicTetraType), typeof(FeElementTypeParabolicTetra), er);
ShowHide((int)pp.LinearPyramidType, nameof(LinearPyramidType), typeof(FeElementTypeLinearPyramid), er);
ShowHide((int)pp.ParabolicPyramidType, nameof(ParabolicPyramidType), typeof(FeElementTypeParabolicPyramid), er);
ShowHide((int)pp.LinearWedgeType, nameof(LinearWedgeType), typeof(FeElementTypeLinearWedge), er);
ShowHide((int)pp.ParabolicWedgeType, nameof(ParabolicWedgeType), typeof(FeElementTypeParabolicWedge), er);
ShowHide((int)pp.LinearHexaType, nameof(LinearHexaType), typeof(FeElementTypeLinearHexa), er);
ShowHide((int)pp.ParabolicHexaType, nameof(ParabolicHexaType), typeof(FeElementTypeParabolicHexa), er);
}
else if (currentView == ViewGeometryModelResults.Results)
{
_dctd.GetProperty(nameof(GeometryType)).SetIsBrowsable(false);
//
_dctd.GetProperty(nameof(Volume)).SetIsBrowsable(false);
_dctd.GetProperty(nameof(Area)).SetIsBrowsable(false);
_dctd.GetProperty(nameof(UndeformedVolume)).SetIsBrowsable(solid && !double.IsNaN(UndeformedVolume));
_dctd.GetProperty(nameof(UndeformedArea)).SetIsBrowsable(!solid && !double.IsNaN(UndeformedArea));
//
_dctd.GetProperty(nameof(NumberOfElements)).SetIsBrowsable(true);
_dctd.GetProperty(nameof(NumberOfNodes)).SetIsBrowsable(true);
//
_dctd.GetProperty(nameof(LinearTriaType)).SetIsBrowsable(false);
_dctd.GetProperty(nameof(ParabolicTriaType)).SetIsBrowsable(false);
_dctd.GetProperty(nameof(LinearQuadType)).SetIsBrowsable(false);
_dctd.GetProperty(nameof(ParabolicQuadType)).SetIsBrowsable(false);
//
_dctd.GetProperty(nameof(LinearTetraType)).SetIsBrowsable(false);
_dctd.GetProperty(nameof(ParabolicTetraType)).SetIsBrowsable(false);
_dctd.GetProperty(nameof(LinearPyramidType)).SetIsBrowsable(false);
_dctd.GetProperty(nameof(ParabolicPyramidType)).SetIsBrowsable(false);
_dctd.GetProperty(nameof(LinearWedgeType)).SetIsBrowsable(false);
_dctd.GetProperty(nameof(ParabolicWedgeType)).SetIsBrowsable(false);
_dctd.GetProperty(nameof(LinearHexaType)).SetIsBrowsable(false);
_dctd.GetProperty(nameof(ParabolicHexaType)).SetIsBrowsable(false);
}
}
private void ShowHide(int propertyElType, string propertyName, Type elType,
Dictionary<Type, HashSet<string>> elementTypeNamesToRemove)
{
HashSet<string> elementNames;
//
if (propertyElType != 0)
{
_dctd.GetProperty(propertyName).SetIsBrowsable(true);
if (elementTypeNamesToRemove.TryGetValue(elType, out elementNames))
_dctd.GetProperty(propertyName).RemoveStandardValues(elementNames);
}
else _dctd.GetProperty(propertyName).SetIsBrowsable(false);
}
}
}