using CaeMesh; using CaeModel; using System; using System.Collections.Generic; using System.Linq; using System.Text; #pragma warning disable IDE0130 /* * 2025-8-27 by Luke */ namespace FileInOut.Output.Calculix { [Serializable] internal class CalNode : CalculixKeyword { // Variables private IDictionary _referencePoints; private IDictionary _nodes; private Dictionary _additionalNodes; private ModelSpaceEnum _modelSpace; private IDictionary _referencePointsNodeIds; private Dictionary _deformations; // Constructor public CalNode(FeModel model, List additionalNodes, IDictionary referencePointsNodeIds, Dictionary deformations) { _referencePoints = model.Mesh.ReferencePoints; _nodes = model.Mesh.Nodes; _additionalNodes = new Dictionary(); foreach (var node in additionalNodes) { _additionalNodes.Add(node.Id, node); } _modelSpace = model.Properties.ModelSpace; _referencePointsNodeIds = referencePointsNodeIds; _deformations = deformations; } // Properties // Methods public override string GetKeywordString() { return "*Node" + Environment.NewLine; } public override string GetDataString() { StringBuilder sb = new StringBuilder(); // Nodes WriteNodes(sb, _nodes); // 附加节点 WriteNodes(sb, _additionalNodes); // 参照点 FeReferencePoint rp; foreach (var entry in _referencePointsNodeIds) { if (_modelSpace == ModelSpaceEnum.ThreeD) { if (_referencePoints.TryGetValue(entry.Key, out rp)) { sb.AppendFormat("{0}, {1:E8}, {2:E8}, {3:E8}", entry.Value[0], rp.X.Value, rp.Y.Value, rp.Z.Value).AppendLine(); sb.AppendFormat("{0}, {1:E8}, {2:E8}, {3:E8}", entry.Value[1], rp.X.Value, rp.Y.Value, rp.Z.Value).AppendLine(); } else { sb.AppendFormat("{0}, {1:E8}, {2:E8}, {3:E8}", entry.Value[0], 0, 0, 0).AppendLine(); } } else if (_modelSpace.IsTwoD()) { if (_referencePoints.TryGetValue(entry.Key, out rp)) { sb.AppendFormat("{0}, {1:E8}, {2:E8}", entry.Value[0], rp.X.Value, rp.Y.Value).AppendLine(); sb.AppendFormat("{0}, {1:E8}, {2:E8}", entry.Value[1], rp.X.Value, rp.Y.Value).AppendLine(); } else { sb.AppendFormat("{0}, {1:E8}, {2:E8}", entry.Value[0], 0, 0).AppendLine(); } } else { throw new NotSupportedException(); } } return sb.ToString(); } // private void WriteNodes(StringBuilder sb, IDictionary nodes) { // 先对节点进行排序 List sortedIds = nodes.Keys.ToList(); sortedIds.Sort(); foreach (int nodeId in sortedIds) { var node = nodes[nodeId]; // 得到网格的变形量 if (_deformations != null && _deformations.TryGetValue(nodeId, out var def)) { node.X += def[0]; node.Y += def[1]; node.Z += def[2]; } // 输出 if (_modelSpace == ModelSpaceEnum.ThreeD) { sb.AppendFormat("{0}, {1:E8}, {2:E8}, {3:E8}", node.Id, node.X, node.Y, node.Z).AppendLine(); } else if (_modelSpace.IsTwoD()) { sb.AppendFormat("{0}, {1:E8}, {2:E8}", node.Id, node.X, node.Y).AppendLine(); } else { throw new NotSupportedException(); } } } } }