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 _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(); if (mesh.ElementSets.ContainsKey(elementSet.Name)) { _name = elementSet.Name; MakeCache(); } } internal void MakeCache() { _cache.Clear(); HashSet nodeIds = new HashSet(); 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 GetNodes() { List nodes = new List(); 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; } }