def get_boundary(mesh): # From trails """ Create triangulation boundary """ import Part import itertools as itools from collections import Counter from ast import literal_eval facet_pidx = mesh.Topology[1] edges = itools.chain(*(itools.permutations(pidx, 2) for pidx in facet_pidx)) count = Counter((str(edge) for edge in edges)) double_boundary = list((literal_eval(k) for k, v in count.items() if v == 1)) boundary = double_boundary[:1] for candidate in double_boundary[1:]: if candidate in boundary or candidate[::-1] in boundary: pass else: boundary.append(candidate) def mkEdge(p1, p2): return Part.makeLine((p1.x, p1.y, p1.z), (p2.x, p2.y, p2.z)) points = mesh.Points edges = [] for p1, p2 in boundary: edges.append(mkEdge(points[p1], points[p2])) wires = [] for opening in Part.sortEdges(edges): wires.append(Part.Wire(opening)) return Part.makeCompound(wires)