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 { // 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 newIds) { _visualization.RenumberNodes(newIds); } public virtual void RenumberVisualizationElements(Dictionary 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; } } }