Files
wg_cpso/RBFMorphing/ElementSet.cs
2026-03-25 18:20:24 +08:00

73 lines
2.0 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using CaeMesh;
namespace RBFMorphing
{
[Serializable]
public class ElementSet : AbstractClass
{
[NonSerialized]
private readonly FeMesh _mesh;
[NonSerialized]
private List<int> _cache;
public ElementSet(FeMesh mesh, FeElementSet elementSet) : base(EnumMorphMethod.ElementSet)
{
if (mesh == null || elementSet == null)
throw new ArgumentNullException(nameof(ElementSet));
if (!mesh.ElementSets.ContainsKey(elementSet.Name))
throw new ArgumentException(nameof(ElementSet));
_mesh = mesh;
_cache = new List<int>();
if (mesh.ElementSets.ContainsKey(elementSet.Name))
{
_name = elementSet.Name;
MakeCache();
}
}
internal void MakeCache()
{
_cache.Clear();
HashSet<int> nodeIds = new HashSet<int>();
if (_mesh.ElementSets.TryGetValue(_name, out var elementSet))
{
foreach (var id in elementSet.Labels)
{
if (!_mesh.Elements.TryGetValue(id, out var element))
continue;
foreach (var v in element.NodeIds)
{
nodeIds.Add(v);
}
}
}
_cache.AddRange(nodeIds.ToList());
}
public override List<FeNode> GetNodes()
{
List<FeNode> nodes = new List<FeNode>();
foreach (var id in _cache.Where(x => _mesh.Nodes.ContainsKey(x)))
{
_mesh.Nodes.TryGetValue(id, out var node);
nodes.Add(node);
}
return nodes;
}
public override int[] Labels => _cache?.ToArray();
public override int Length => _cache?.Count ?? 0;
}
}