73 lines
2.0 KiB
C#
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;
|
|
}
|
|
} |