Files

154 lines
5.5 KiB
C#
Raw Permalink Normal View History

2026-03-25 18:20:24 +08:00
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();
}
}
}