154 lines
5.5 KiB
C#
154 lines
5.5 KiB
C#
using CaeMesh;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
#pragma warning disable IDE0130
|
|
|
|
namespace FileInOut.Output.Calculix
|
|
{
|
|
[Serializable]
|
|
internal class CalElement : CalculixKeyword
|
|
{
|
|
// Variables
|
|
protected string _elementType; // 单元类型
|
|
protected string _elementSetName; // 单元集合名称
|
|
protected List<FeElement> _elements; // 所有单元
|
|
protected ConvertPyramidsToEnum _convertPyramidsTo;
|
|
|
|
// Properties
|
|
|
|
// Constructor
|
|
public CalElement(CalElement calElement)
|
|
: this(calElement._elementType, calElement._elementSetName, calElement._elements,
|
|
calElement._convertPyramidsTo)
|
|
{
|
|
}
|
|
public CalElement(string elementType, string elementSetName, List<FeElement> elements)
|
|
: this(elementType, elementSetName, elements, ConvertPyramidsToEnum.Wedges)
|
|
{
|
|
}
|
|
public CalElement(string elementType, string elementSetName, List<FeElement> elements,
|
|
ConvertPyramidsToEnum convertPyramidsTo)
|
|
{
|
|
_convertPyramidsTo = convertPyramidsTo;
|
|
|
|
// Linear pyramids
|
|
if (elementType == "C3D5")
|
|
{
|
|
_elementSetName = elementSetName;
|
|
List<FeElement> collapsedElements = new List<FeElement>();
|
|
//
|
|
if (_convertPyramidsTo == ConvertPyramidsToEnum.Wedges)
|
|
{
|
|
_elementType = "C3D6";
|
|
//
|
|
foreach (var element in elements)
|
|
{
|
|
if (element is LinearPyramidElement lpe)
|
|
{
|
|
collapsedElements.Add(lpe.ConvertToWedge());
|
|
}
|
|
}
|
|
}
|
|
else // Hexahedrons
|
|
{
|
|
_elementType = "C3D8";
|
|
//
|
|
foreach (var element in elements)
|
|
{
|
|
if (element is LinearPyramidElement lpe)
|
|
{
|
|
collapsedElements.Add(lpe.ConvertToHex());
|
|
}
|
|
}
|
|
}
|
|
_elements = collapsedElements;
|
|
}
|
|
// Parabolic pyramids
|
|
else if (elementType == "C3D13")
|
|
{
|
|
_elementSetName = elementSetName;
|
|
List<FeElement> collapsedElements = new List<FeElement>();
|
|
//
|
|
if (_convertPyramidsTo == ConvertPyramidsToEnum.Wedges)
|
|
{
|
|
_elementType = "C3D15";
|
|
//
|
|
foreach (var element in elements)
|
|
{
|
|
if (element is ParabolicPyramidElement ppe)
|
|
{
|
|
collapsedElements.Add(ppe.ConvertToWedge());
|
|
}
|
|
}
|
|
}
|
|
else // Hexahedrons
|
|
{
|
|
_elementType = "C3D20";
|
|
//
|
|
foreach (var element in elements)
|
|
{
|
|
if (element is ParabolicPyramidElement ppe)
|
|
{
|
|
collapsedElements.Add(ppe.ConvertToHex());
|
|
}
|
|
}
|
|
}
|
|
_elements = collapsedElements;
|
|
}
|
|
else
|
|
{
|
|
_elementType = elementType;
|
|
_elementSetName = elementSetName;
|
|
_elements = elements;
|
|
}
|
|
}
|
|
|
|
|
|
// Methods
|
|
public override string GetKeywordString()
|
|
{
|
|
string elSet = "";
|
|
if (!string.IsNullOrEmpty(_elementSetName))
|
|
{
|
|
elSet = ", Elset=" + _elementSetName;
|
|
}
|
|
|
|
// ReSharper disable once UseStringInterpolation
|
|
return string.Format("*Element, Type={0}{1}{2}", _elementType, elSet, Environment.NewLine);
|
|
}
|
|
|
|
public override string GetDataString()
|
|
{
|
|
StringBuilder sb = new StringBuilder();
|
|
|
|
// Sort 按照ID对单元进行排序
|
|
List<FeElement> sortedElements = _elements.OrderBy(element => element.Id).ToList();
|
|
|
|
foreach (FeElement feElement in sortedElements)
|
|
{
|
|
sb.AppendFormat("{0}", feElement.Id);
|
|
|
|
int count = 1;
|
|
foreach (int nodeId in feElement.NodeIds)
|
|
{
|
|
count++;
|
|
if (count == 17) // 16 entries per line; 17th entry goes in new line
|
|
{
|
|
sb.Append(",");
|
|
sb.AppendLine();
|
|
sb.Append(nodeId);
|
|
}
|
|
else
|
|
{
|
|
sb.AppendFormat(", {0}", nodeId);
|
|
}
|
|
}
|
|
sb.AppendLine();
|
|
}
|
|
return sb.ToString();
|
|
}
|
|
}
|
|
}
|