272 lines
13 KiB
C#
272 lines
13 KiB
C#
|
|
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;
|
|||
|
|
|
|||
|
|
namespace CPSO.Forms
|
|||
|
|
{
|
|||
|
|
public enum DefaultMeshSizeTypeEnum
|
|||
|
|
{
|
|||
|
|
Absolute,
|
|||
|
|
Relative
|
|||
|
|
}
|
|||
|
|
public class ViewMeshingParameters : ViewMeshSetupItem
|
|||
|
|
{
|
|||
|
|
// Variables
|
|||
|
|
protected bool _settingsView;
|
|||
|
|
protected MeshingParameters _parameters;
|
|||
|
|
|
|||
|
|
|
|||
|
|
// Properties
|
|||
|
|
[Category("Data")]
|
|||
|
|
[OrderedDisplayName(0, 10, "Name")]
|
|||
|
|
[Description("Name of the mesh setup item.")]
|
|||
|
|
[Id(1, 1)]
|
|||
|
|
public override string Name { get { return _parameters.Name; } set { _parameters.Name = value; } }
|
|||
|
|
//
|
|||
|
|
[Category("Data")]
|
|||
|
|
[OrderedDisplayName(1, 10, "Mesh settings")]
|
|||
|
|
[Description("Turn on advanced mesh settings.")]
|
|||
|
|
[Id(2, 1)]
|
|||
|
|
public bool AdvancedView
|
|||
|
|
{
|
|||
|
|
get { return _parameters.AdvancedView; }
|
|||
|
|
set
|
|||
|
|
{
|
|||
|
|
_parameters.AdvancedView = value;
|
|||
|
|
if (_parameters.AdvancedView == false) _parameters.RelativeSize = _parameters.DefaultSizeIsRelative;
|
|||
|
|
//
|
|||
|
|
UpdateVisibility();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
//
|
|||
|
|
[Category("Region")]
|
|||
|
|
[OrderedDisplayName(0, 10, "Region type")]
|
|||
|
|
[Description("Select the region type for the creation of the mesh setup item.")]
|
|||
|
|
[Id(1, 2)]
|
|||
|
|
public override string RegionType { get { return _regionType; } set { _regionType = value; } }
|
|||
|
|
//
|
|||
|
|
[Category("Mesh size")]
|
|||
|
|
[OrderedDisplayName(0, 10, "Mesh size definition")]
|
|||
|
|
[Description("Select the mesh size definition.")]
|
|||
|
|
[Id(1, 3)]
|
|||
|
|
public bool Relative
|
|||
|
|
{
|
|||
|
|
get { return _parameters.RelativeSize; }
|
|||
|
|
set
|
|||
|
|
{
|
|||
|
|
_parameters.RelativeSize = value;
|
|||
|
|
UpdateVisibility();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
//
|
|||
|
|
[Category("Mesh size")]
|
|||
|
|
[OrderedDisplayName(1, 10, "Max element factor")]
|
|||
|
|
[Description("The relative factor for the maximum element size in regard to the bounding box diagonal.")]
|
|||
|
|
[Id(2, 3)]
|
|||
|
|
public virtual double FactorMax { get { return _parameters.FactorMax; } set { _parameters.FactorMax = value; } }
|
|||
|
|
//
|
|||
|
|
[Category("Mesh size")]
|
|||
|
|
[OrderedDisplayName(2, 10, "Min element factor")]
|
|||
|
|
[Description("The relative factor for the minimum element size in regard to the bounding box diagonal.")]
|
|||
|
|
[Id(3, 3)]
|
|||
|
|
public virtual double FactorMin { get { return _parameters.FactorMin; } set { _parameters.FactorMin = value; } }
|
|||
|
|
//
|
|||
|
|
[Category("Mesh size")]
|
|||
|
|
[OrderedDisplayName(3, 10, "Max element size")]
|
|||
|
|
[Description("The value for the maximum element size.")]
|
|||
|
|
[TypeConverter(typeof(StringLengthConverter))]
|
|||
|
|
[Id(4, 3)]
|
|||
|
|
public virtual double MaxH { get { return _parameters.MaxH; } set { _parameters.MaxH = value; } }
|
|||
|
|
//
|
|||
|
|
[Category("Mesh size")]
|
|||
|
|
[OrderedDisplayName(4, 10, "Min element size")]
|
|||
|
|
[Description("The value for the minimum element size.")]
|
|||
|
|
[TypeConverter(typeof(StringLengthConverter))]
|
|||
|
|
[Id(5, 3)]
|
|||
|
|
public virtual double MinH { get { return _parameters.MinH; } set { _parameters.MinH = value; } }
|
|||
|
|
//
|
|||
|
|
[Category("Mesh size")]
|
|||
|
|
[OrderedDisplayName(5, 10, "Grading")]
|
|||
|
|
[Description("The value of the mesh grading (0 => uniform mesh; 1 => aggressive local grading).")]
|
|||
|
|
[TypeConverter(typeof(StringDoubleConverter))]
|
|||
|
|
[Id(6, 3)]
|
|||
|
|
public double Grading { get { return _parameters.Grading; } set { _parameters.Grading = value; } }
|
|||
|
|
//
|
|||
|
|
[Category("Mesh size")]
|
|||
|
|
[OrderedDisplayName(6, 10, "Elements per edge")]
|
|||
|
|
[Description("Number of elements to generate per edge of the geometry.")]
|
|||
|
|
[TypeConverter(typeof(StringDoubleConverter))]
|
|||
|
|
[Id(7, 3)]
|
|||
|
|
public double ElementsPerEdge { get { return _parameters.ElementsPerEdge; } set { _parameters.ElementsPerEdge = value; } }
|
|||
|
|
//
|
|||
|
|
[Category("Mesh size")]
|
|||
|
|
[OrderedDisplayName(7, 10, "Elements per curvature")]
|
|||
|
|
[Description("Number of elements to generate per curvature radius.")]
|
|||
|
|
[TypeConverter(typeof(StringDoubleConverter))]
|
|||
|
|
[Id(8, 3)]
|
|||
|
|
public double ElementsPerCurve { get { return _parameters.ElementsPerCurve; } set { _parameters.ElementsPerCurve = value; } }
|
|||
|
|
// Hausdorff factor
|
|||
|
|
[Category("Mesh size")]
|
|||
|
|
[OrderedDisplayName(8, 10, "Hausdorff factor")]
|
|||
|
|
[Description("The relative factor for the Hausdorff distance in regard to the bounding box diagonal.")]
|
|||
|
|
[Id(9, 3)]
|
|||
|
|
public double FactorHausdorff { get { return _parameters.FactorHausdorff; } set { _parameters.FactorHausdorff = value; } }
|
|||
|
|
// Maximal Hausdorff distance for the boundaries approximation.
|
|||
|
|
[Category("Mesh size")]
|
|||
|
|
[OrderedDisplayName(9, 10, "Hausdorff")]
|
|||
|
|
[Description("Maximal Hausdorff distance for the boundaries approximation. " +
|
|||
|
|
"A value of 0.01 is a suitable value for an object of size 1 in each direction.")]
|
|||
|
|
[TypeConverter(typeof(StringLengthConverter))]
|
|||
|
|
[Id(10, 3)]
|
|||
|
|
public double Hausdorff { get { return _parameters.Hausdorff; } set { _parameters.Hausdorff = value; } }
|
|||
|
|
//
|
|||
|
|
//
|
|||
|
|
[Category("Mesh optimization")]
|
|||
|
|
[OrderedDisplayName(0, 10, "Optimize steps 2D")]
|
|||
|
|
[Description("Number of optimize steps to use for 2-D mesh optimization.")]
|
|||
|
|
[Id(1, 4)]
|
|||
|
|
public int OptimizeSteps2D { get { return _parameters.OptimizeSteps2D; } set { _parameters.OptimizeSteps2D = value; } }
|
|||
|
|
//
|
|||
|
|
[Category("Mesh optimization")]
|
|||
|
|
[OrderedDisplayName(1, 10, "Optimize steps 3D")]
|
|||
|
|
[Description("Number of optimize steps to use for 3-D mesh optimization.")]
|
|||
|
|
[Id(2, 4)]
|
|||
|
|
public int OptimizeSteps3D { get { return _parameters.OptimizeSteps3D; } set { _parameters.OptimizeSteps3D = value; } }
|
|||
|
|
//
|
|||
|
|
//
|
|||
|
|
[Category("Mesh type")]
|
|||
|
|
[OrderedDisplayName(0, 10, "Second order")]
|
|||
|
|
[Description("Create second order elements.")]
|
|||
|
|
[Id(1, 5)]
|
|||
|
|
public bool SecondOrder
|
|||
|
|
{
|
|||
|
|
get {return _parameters.SecondOrder;}
|
|||
|
|
set
|
|||
|
|
{
|
|||
|
|
_parameters.SecondOrder = value;
|
|||
|
|
UpdateVisibility();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
//
|
|||
|
|
[Category("Mesh type")]
|
|||
|
|
[OrderedDisplayName(1, 10, "Midside nodes on geometry")]
|
|||
|
|
[Description("Create midside nodes on geometry.")]
|
|||
|
|
[Id(2, 5)]
|
|||
|
|
public bool MidsideNodesOnGeometry { get { return _parameters.MidsideNodesOnGeometry; } set { _parameters.MidsideNodesOnGeometry = value; } }
|
|||
|
|
//
|
|||
|
|
[Category("Mesh type")]
|
|||
|
|
[OrderedDisplayName(2, 10, "Quad-dominated mesh")]
|
|||
|
|
[Description("Use quad-dominated mesh for shell parts.")]
|
|||
|
|
[Id(3, 5)]
|
|||
|
|
public bool QuadDominated { get { return _parameters.QuadDominated; } set { _parameters.QuadDominated = value; } }
|
|||
|
|
//
|
|||
|
|
//
|
|||
|
|
[Category("Mesh operations")]
|
|||
|
|
[OrderedDisplayName(0, 10, "Split compound mesh")]
|
|||
|
|
[Description("Split compound part mesh to unconnected part meshes.")]
|
|||
|
|
[Id(1, 6)]
|
|||
|
|
public bool SplitCompoundMesh
|
|||
|
|
{
|
|||
|
|
get { return _parameters.SplitCompoundMesh; }
|
|||
|
|
set { _parameters.SplitCompoundMesh = value; }
|
|||
|
|
}
|
|||
|
|
//
|
|||
|
|
[Category("Mesh operations")]
|
|||
|
|
[OrderedDisplayName(1, 10, "Merge compound parts")]
|
|||
|
|
[Description("Merge compound part mesh to a single mesh part.")]
|
|||
|
|
[Id(2, 6)]
|
|||
|
|
public bool MergeCompoundParts
|
|||
|
|
{
|
|||
|
|
get { return _parameters.MergeCompoundParts; }
|
|||
|
|
set { _parameters.MergeCompoundParts = value; }
|
|||
|
|
}
|
|||
|
|
//
|
|||
|
|
[Category("Mesh operations")]
|
|||
|
|
[OrderedDisplayName(2, 10, "Keep model edges")]
|
|||
|
|
[Description("Select Yes to keep and No to ignore the model edges.")]
|
|||
|
|
[Id(3, 6)]
|
|||
|
|
public bool KeepModelEdges { get { return _parameters.KeepModelEdges; } set { _parameters.KeepModelEdges = value; } }
|
|||
|
|
|
|||
|
|
|
|||
|
|
// Constructors
|
|||
|
|
public ViewMeshingParameters(MeshingParameters parameters)
|
|||
|
|
: this(parameters, parameters.RelativeSize)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
public ViewMeshingParameters(MeshingParameters parameters, bool defaultSizeIsRelative)
|
|||
|
|
: this(parameters, defaultSizeIsRelative, parameters.AdvancedView)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
public ViewMeshingParameters(MeshingParameters parameters, bool defaultSizeIsRelative, bool advancedView)
|
|||
|
|
{
|
|||
|
|
_parameters = parameters;
|
|||
|
|
_parameters.AdvancedView = advancedView;
|
|||
|
|
_parameters.DefaultSizeIsRelative = defaultSizeIsRelative;
|
|||
|
|
//
|
|||
|
|
_dctd = ProviderInstaller.Install(this);
|
|||
|
|
InitializeRegion();
|
|||
|
|
// Category sorting
|
|||
|
|
_dctd.CategorySortOrder = CustomSortOrder.AscendingById;
|
|||
|
|
_dctd.PropertySortOrder = CustomSortOrder.AscendingById; // seems not to work
|
|||
|
|
// Now lets display Yes/No instead of True/False
|
|||
|
|
_dctd.RenameBooleanProperty(nameof(AdvancedView), "Advanced", "Basic");
|
|||
|
|
_dctd.RenameBooleanProperty(nameof(Relative), "Relative", "Absolute");
|
|||
|
|
_dctd.RenameBooleanPropertyToYesNo(nameof(SecondOrder));
|
|||
|
|
_dctd.RenameBooleanPropertyToYesNo(nameof(MidsideNodesOnGeometry));
|
|||
|
|
_dctd.RenameBooleanPropertyToYesNo(nameof(QuadDominated));
|
|||
|
|
_dctd.RenameBooleanPropertyToYesNo(nameof(SplitCompoundMesh));
|
|||
|
|
_dctd.RenameBooleanPropertyToYesNo(nameof(MergeCompoundParts));
|
|||
|
|
_dctd.RenameBooleanPropertyToYesNo(nameof(KeepModelEdges));
|
|||
|
|
//
|
|||
|
|
UpdateVisibility();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
// Methods
|
|||
|
|
public override MeshSetupItem GetBase()
|
|||
|
|
{
|
|||
|
|
return _parameters;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
protected void UpdateVisibility()
|
|||
|
|
{
|
|||
|
|
bool advanced = _parameters.AdvancedView || _settingsView;
|
|||
|
|
_dctd.GetProperty(nameof(Relative)).SetIsBrowsable(advanced);
|
|||
|
|
//
|
|||
|
|
bool visible = (_parameters.RelativeSize && advanced) || _settingsView;
|
|||
|
|
_dctd.GetProperty(nameof(FactorMax)).SetIsBrowsable(visible);
|
|||
|
|
_dctd.GetProperty(nameof(FactorMin)).SetIsBrowsable(visible);
|
|||
|
|
_dctd.GetProperty(nameof(MaxH)).SetIsBrowsable(!visible);
|
|||
|
|
_dctd.GetProperty(nameof(MinH)).SetIsBrowsable(!visible);
|
|||
|
|
//
|
|||
|
|
visible = (_parameters.UseMmg && _parameters.RelativeSize) || _settingsView;
|
|||
|
|
_dctd.GetProperty(nameof(FactorHausdorff)).SetIsBrowsable(visible); // mmg only
|
|||
|
|
//
|
|||
|
|
_dctd.GetProperty(nameof(Grading)).SetIsBrowsable(!_parameters.UseMmg && advanced);
|
|||
|
|
_dctd.GetProperty(nameof(ElementsPerEdge)).SetIsBrowsable(!_parameters.UseMmg);
|
|||
|
|
_dctd.GetProperty(nameof(ElementsPerCurve)).SetIsBrowsable(!_parameters.UseMmg);
|
|||
|
|
_dctd.GetProperty(nameof(Hausdorff)).SetIsBrowsable(_parameters.UseMmg && !_parameters.RelativeSize); // mmg only
|
|||
|
|
_dctd.GetProperty(nameof(OptimizeSteps2D)).SetIsBrowsable(!_parameters.UseMmg && advanced);
|
|||
|
|
_dctd.GetProperty(nameof(OptimizeSteps3D)).SetIsBrowsable(!_parameters.UseMmg && advanced);
|
|||
|
|
_dctd.GetProperty(nameof(SecondOrder)).SetIsBrowsable(true);
|
|||
|
|
_dctd.GetProperty(nameof(MidsideNodesOnGeometry)).SetIsBrowsable(!_parameters.UseMmg && advanced);
|
|||
|
|
_dctd.GetProperty(nameof(QuadDominated)).SetIsBrowsable(!_parameters.UseMmg && advanced);
|
|||
|
|
_dctd.GetProperty(nameof(SplitCompoundMesh)).SetIsBrowsable(!_parameters.UseMmg && advanced);
|
|||
|
|
_dctd.GetProperty(nameof(MergeCompoundParts)).SetIsBrowsable(!_parameters.UseMmg && advanced);
|
|||
|
|
_dctd.GetProperty(nameof(KeepModelEdges)).SetIsBrowsable(_parameters.UseMmg || _settingsView); // mmg only
|
|||
|
|
// To show/hide the MediumNodesOnGeometry property
|
|||
|
|
if (!_parameters.UseMmg)
|
|||
|
|
{
|
|||
|
|
_dctd.GetProperty(nameof(MidsideNodesOnGeometry)).SetIsBrowsable(_parameters.SecondOrder && advanced);
|
|||
|
|
_dctd.PropertySortOrder = CustomSortOrder.AscendingById;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|