using CaeMesh; using System; using System.Collections.Generic; using System.Linq; namespace CaeKnowledge { public class MeshTools { public static double Distance(double x1, double y1, double z1, double x2, double y2, double z2) { return Math.Sqrt(Math.Pow(x1 - x2, 2) + Math.Pow(y1 - y2, 2) + Math.Pow(z1 - z2, 2)); } private static double Distance(FeNode n1, FeNode n2) { return Math.Sqrt(Math.Pow(n1.X - n2.X, 2) + Math.Pow(n1.Y - n2.Y, 2) + Math.Pow(n1.Z - n2.Z, 2)); } public static List GetClosestNodes(FeMesh mesh, FeNode _base, double minimum) { var list = new List(); foreach (var node in mesh.Nodes.Values) { var dist = Distance(node, _base); if (dist < minimum) list.Add(node); } return list; } public static List GetClosestElements(FeMesh mesh, FeNode _base, double minimum) { var list = new List(); foreach (var element in mesh.Elements.Values) { var nodes = (from id in element.NodeIds select mesh.Nodes[id]).ToList(); if (nodes.All(node => Distance(node, _base) < minimum)) { list.Add(element); } } return list; } public static List GetClosestNodesInNodeSet(FeMesh mesh, string nodeSetName, FeNode _base, double minimum) { if (!mesh.NodeSets.TryGetValue(nodeSetName, out var nodeSet)) return null; var nodes = (from id in nodeSet.Labels select mesh.Nodes[id]).ToList(); var list = new List(); nodes.ForEach(node => { if (Distance(node, _base) < minimum) list.Add(node); }); return list; } public static List> FindAllElements(FeMesh mesh, string nodeSetName) { if (!mesh.NodeSets.TryGetValue(nodeSetName, out var nodeSet)) return null; var list = new List>(); foreach (var element in from element in mesh.Elements.Values.OfType() select element) { // 四面体单元 foreach (var faceName in new[] { FeFaceName.S1, FeFaceName.S2, FeFaceName.S3, FeFaceName.S4 }) { var ids = element.GetNodeIdsFromFaceName(faceName); if (ids.All(x => nodeSet.Labels.Contains(x))) list.Add(new Tuple(element, faceName)); } } return list; } public static List GetClosestFaces(FeMesh mesh, string nodeSetName, FeNode _base, double minimum) { var nodes = (from x in GetClosestNodesInNodeSet(mesh, nodeSetName, _base, minimum) select x.Id).ToList(); if (nodes.Count == 0) return null; var allElements = FindAllElements(mesh, nodeSetName); if (allElements == null || allElements.Count == 0) return null; var list = new List(); foreach (var (element, faceName) in allElements) { var ids = element.GetNodeIdsFromFaceName(faceName); if (!ids.Any(x => nodes.Contains(x))) continue; var label = element.Id * 10 + (int)faceName - 1; list.Add(label); } list.Sort(); return list; } public static List FindSurfaceAllFaces(string srfName, FeMesh mesh) { if (!mesh.Surfaces.TryGetValue(srfName, out var surface)) return null; var faceIds = surface.FaceIds; return (from faceId in faceIds let elemId = faceId / 10 let faceTag = faceId % 10 + 1 let element = mesh.Elements[elemId] let faceName = (FeFaceName)faceTag select new FeFace(element, faceName)).ToList(); } } }