32 lines
1010 B
Python
32 lines
1010 B
Python
|
|
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)
|