191 lines
7.7 KiB
C#
191 lines
7.7 KiB
C#
|
|
using System;
|
|||
|
|
using System.Collections.Generic;
|
|||
|
|
using System.Linq;
|
|||
|
|
using System.Text;
|
|||
|
|
using System.Threading.Tasks;
|
|||
|
|
using CaeGlobals;
|
|||
|
|
|
|||
|
|
namespace CaeMesh
|
|||
|
|
{
|
|||
|
|
[Serializable]
|
|||
|
|
public class BasePart : FeGroup, IComparable<BasePart>
|
|||
|
|
{
|
|||
|
|
// Variables
|
|||
|
|
protected int _partId;
|
|||
|
|
protected PartType _partType;
|
|||
|
|
protected System.Drawing.Color _color;
|
|||
|
|
protected Type[] _elementTypes;
|
|||
|
|
protected VisualizationData _visualization;
|
|||
|
|
protected int[] _nodeLabels;
|
|||
|
|
protected bool _smoothShaded;
|
|||
|
|
protected BoundingBox _boundingBox;
|
|||
|
|
protected double[] _offset;
|
|||
|
|
protected PartMassProperties _massProperties;
|
|||
|
|
|
|||
|
|
[NonSerialized]
|
|||
|
|
protected VisualizationData _visualizationCopy; // temp copy while saving
|
|||
|
|
|
|||
|
|
|
|||
|
|
// Properties
|
|||
|
|
public int PartId { get { return _partId; } set { _partId = value; } }
|
|||
|
|
public PartType PartType { get { return _partType; } }
|
|||
|
|
public System.Drawing.Color Color
|
|||
|
|
{
|
|||
|
|
get { return _color; }
|
|||
|
|
set { _color = value; }
|
|||
|
|
}
|
|||
|
|
public Type[] ElementTypes { get { return _elementTypes; } }
|
|||
|
|
public VisualizationData Visualization { get { return _visualization; } set { _visualization = value; } }
|
|||
|
|
public VisualizationData VisualizationCopy { get { return _visualizationCopy; } set { _visualizationCopy = value; } }
|
|||
|
|
public int[] NodeLabels { get { return _nodeLabels; } set { _nodeLabels = value; } }
|
|||
|
|
public bool SmoothShaded { get { return _smoothShaded; } set { _smoothShaded = value; } }
|
|||
|
|
public BoundingBox BoundingBox { get { return _boundingBox; } set { _boundingBox = value; } }
|
|||
|
|
public double[] Offset { get { return _offset; } set { _offset = value; } }
|
|||
|
|
public PartMassProperties MassProperties { get { return _massProperties; } set { _massProperties = value; } }
|
|||
|
|
|
|||
|
|
|
|||
|
|
// Constructors
|
|||
|
|
public BasePart(string name, int partId, int[] nodeLabels, int[] elementLabels, Type[] elementTypes)
|
|||
|
|
: base(name, elementLabels)
|
|||
|
|
{
|
|||
|
|
_partId = partId;
|
|||
|
|
_nodeLabels = nodeLabels;
|
|||
|
|
_color = System.Drawing.Color.Gray;
|
|||
|
|
_elementTypes = elementTypes;
|
|||
|
|
_visualization = new VisualizationData();
|
|||
|
|
_visualizationCopy = null;
|
|||
|
|
_smoothShaded = false;
|
|||
|
|
_boundingBox = new BoundingBox();
|
|||
|
|
_offset = new double[3];
|
|||
|
|
_massProperties = new PartMassProperties(false);
|
|||
|
|
//
|
|||
|
|
if (IsSolid()) _partType = PartType.Solid;
|
|||
|
|
else if (IsShell()) _partType = PartType.Shell;
|
|||
|
|
else if (IsBeam()) _partType = PartType.Wire;
|
|||
|
|
else _partType = PartType.Unknown;
|
|||
|
|
}
|
|||
|
|
public BasePart(BasePart part)
|
|||
|
|
: base(part.Name, part.Labels.ToArray())
|
|||
|
|
{
|
|||
|
|
_partId = part.PartId;
|
|||
|
|
//
|
|||
|
|
_partType = part.PartType;
|
|||
|
|
//
|
|||
|
|
_color = part.Color;
|
|||
|
|
//
|
|||
|
|
_elementTypes = part.ElementTypes != null ? part.ElementTypes.ToArray() : null;
|
|||
|
|
//
|
|||
|
|
_visualization = part.Visualization.DeepCopy();
|
|||
|
|
//
|
|||
|
|
if (part.VisualizationCopy != null)
|
|||
|
|
_visualizationCopy = part.VisualizationCopy.DeepCopy();
|
|||
|
|
//
|
|||
|
|
_nodeLabels = part.NodeLabels != null ? part.NodeLabels.ToArray() : null;
|
|||
|
|
//
|
|||
|
|
_smoothShaded = part.SmoothShaded;
|
|||
|
|
//
|
|||
|
|
_boundingBox = part.BoundingBox.DeepClone();
|
|||
|
|
//
|
|||
|
|
if (part.Offset != null) _offset = part.Offset.ToArray();
|
|||
|
|
//
|
|||
|
|
_massProperties = part.MassProperties.DeepClone();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
// Methods
|
|||
|
|
private bool IsSolid()
|
|||
|
|
{
|
|||
|
|
if (_elementTypes == null) return false;
|
|||
|
|
//
|
|||
|
|
foreach (var type in _elementTypes)
|
|||
|
|
{
|
|||
|
|
if (type != typeof(LinearTetraElement) && type != typeof(LinearPyramidElement) &&
|
|||
|
|
type != typeof(LinearWedgeElement) && type != typeof(LinearHexaElement) &&
|
|||
|
|
type != typeof(ParabolicTetraElement) && type != typeof(ParabolicPyramidElement) &&
|
|||
|
|
type != typeof(ParabolicWedgeElement) && type != typeof(ParabolicHexaElement)) return false;
|
|||
|
|
}
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
private bool IsShell()
|
|||
|
|
{
|
|||
|
|
if (_elementTypes == null) return false;
|
|||
|
|
//
|
|||
|
|
foreach (var type in _elementTypes)
|
|||
|
|
{
|
|||
|
|
if (type != typeof(LinearTriangleElement) && type != typeof(LinearQuadrilateralElement) &&
|
|||
|
|
type != typeof(ParabolicTriangleElement) && type != typeof(ParabolicQuadrilateralElement)) return false;
|
|||
|
|
}
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
private bool IsBeam()
|
|||
|
|
{
|
|||
|
|
if (_elementTypes == null) return false;
|
|||
|
|
//
|
|||
|
|
foreach (var type in _elementTypes)
|
|||
|
|
{
|
|||
|
|
if (type != typeof(LinearBeamElement) && type != typeof(ParabolicBeamElement)) return false;
|
|||
|
|
}
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
public void SetPartType(PartType partType)
|
|||
|
|
{
|
|||
|
|
if (_partType == PartType.Shell && partType == PartType.SolidAsShell)
|
|||
|
|
{
|
|||
|
|
_partType = partType;
|
|||
|
|
}
|
|||
|
|
else if (_partType == PartType.Shell && partType == PartType.Shell)
|
|||
|
|
{
|
|||
|
|
_partType = partType;
|
|||
|
|
}
|
|||
|
|
else throw new NotSupportedException();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public virtual BasePart DeepCopy()
|
|||
|
|
{
|
|||
|
|
return new BasePart(this);
|
|||
|
|
}
|
|||
|
|
public virtual PartProperties GetProperties()
|
|||
|
|
{
|
|||
|
|
PartProperties properties = new PartProperties();
|
|||
|
|
properties.Name = Name;
|
|||
|
|
properties.PartType = _partType;
|
|||
|
|
properties.IsCADPart = false;
|
|||
|
|
properties.Color = _color;
|
|||
|
|
properties.NumberOfNodes = _nodeLabels.Length;
|
|||
|
|
properties.NumberOfElements = Labels.Length;
|
|||
|
|
properties.MassProperties = _massProperties;
|
|||
|
|
return properties;
|
|||
|
|
}
|
|||
|
|
public virtual void SetProperties(PartProperties properties)
|
|||
|
|
{
|
|||
|
|
Name = properties.Name;
|
|||
|
|
_color = properties.Color;
|
|||
|
|
}
|
|||
|
|
public virtual void RenumberVisualizationNodes(Dictionary<int, int> newIds)
|
|||
|
|
{
|
|||
|
|
_visualization.RenumberNodes(newIds);
|
|||
|
|
}
|
|||
|
|
public virtual void RenumberVisualizationElements(Dictionary<int, int> newIds)
|
|||
|
|
{
|
|||
|
|
_visualization.RenumberElements(newIds);
|
|||
|
|
}
|
|||
|
|
public virtual void RenumberVisualizationSurfaces(int[] orderedSurfaceIds)
|
|||
|
|
{
|
|||
|
|
_visualization.RenumberSurfaces(orderedSurfaceIds);
|
|||
|
|
}
|
|||
|
|
public virtual void RenumberVisualizationEdges(int[] orderedEdgesIds)
|
|||
|
|
{
|
|||
|
|
_visualization.RenumberEdges(orderedEdgesIds);
|
|||
|
|
}
|
|||
|
|
// Added for usage in graphs
|
|||
|
|
public int CompareTo(BasePart other)
|
|||
|
|
{
|
|||
|
|
if (_boundingBox.GetDiagonal() < other._boundingBox.GetDiagonal()) return 1;
|
|||
|
|
else if (_boundingBox.GetDiagonal() > other._boundingBox.GetDiagonal()) return -1;
|
|||
|
|
else return 0;
|
|||
|
|
//if (System.Diagnostics.Debugger.IsAttached) throw new NotImplementedException();
|
|||
|
|
//else return 0;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|