File size: 2,361 Bytes
10f2621 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | import numpy as np
from numpy.linalg import norm
import pymesh
"""
Modified from:
fixmesh.py - MaSIF
Pablo Gainza - LPDI STI EPFL 2019
"""
"""
fixmesh.py: Regularize a protein surface mesh.
- based on code from the PyMESH documentation.
"""
def fix_mesh(mesh, resolution, detail="normal"):
bbox_min, bbox_max = mesh.bbox;
diag_len = norm(bbox_max - bbox_min);
if detail == "normal":
target_len = diag_len * 5e-3;
elif detail == "high":
target_len = diag_len * 2.5e-3;
elif detail == "low":
target_len = diag_len * 1e-2;
target_len = resolution
#print("Target resolution: {} mm".format(target_len));
# PGC 2017: Remove duplicated vertices first
mesh, _ = pymesh.remove_duplicated_vertices(mesh, 0.001)
count = 0;
print("Removing degenerated triangles")
mesh, __ = pymesh.remove_degenerated_triangles(mesh, 100);
mesh, __ = pymesh.split_long_edges(mesh, target_len);
num_vertices = mesh.num_vertices;
while True:
mesh, __ = pymesh.collapse_short_edges(mesh, 1e-6);
mesh, __ = pymesh.collapse_short_edges(mesh, target_len,
preserve_feature=True);
mesh, __ = pymesh.remove_obtuse_triangles(mesh, 150.0, 100);
if mesh.num_vertices == num_vertices:
break;
num_vertices = mesh.num_vertices;
#print("#v: {}".format(num_vertices));
count += 1;
if count > 10: break;
mesh = pymesh.resolve_self_intersection(mesh);
mesh, __ = pymesh.remove_duplicated_faces(mesh);
#mesh = pymesh.compute_outer_hull(mesh);
############ Added by Oscar Mendez Lucio ##############
mesh = pymesh.compute_outer_hull(mesh, all_layers=True);
num_nodes = [i.num_nodes for i in mesh]
mesh = mesh[np.argmax(num_nodes)]
############################################################
mesh, __ = pymesh.remove_duplicated_faces(mesh);
mesh, __ = pymesh.remove_obtuse_triangles(mesh, 179.0, 5);
mesh, __ = pymesh.remove_isolated_vertices(mesh);
mesh, _ = pymesh.remove_duplicated_vertices(mesh, 0.001)
############ Added by Oscar Mendez Lucio ##############
mesh = pymesh.separate_mesh(mesh)
num_nodes = [i.num_nodes for i in mesh]
mesh = mesh[np.argmax(num_nodes)]
############################################################
return mesh
|