Source code for svcco.utils.remeshing.remesh
# Remeshing utility based on MMG executables
import os
import stat
import platform
import subprocess
import pyvista as pv
import io
import sys
filepath = os.path.abspath(__file__)
dirpath = os.path.dirname(filepath)
[docs]def remesh_surface(pv_polydata_object,auto=True,hausd=0.01,verbosity=1):
_mesh_ = pv.PolyData(pv_polydata_object.points,pv_polydata_object.faces)
pv.save_meshio("tmp.mesh",_mesh_)
if platform.system() == 'Windows':
_EXE_ = dirpath+os.sep+"Windows"+os.sep+"mmgs_O3.exe"
elif platform.system() == "Linux":
_EXE_ = dirpath+os.sep+"Linux"+os.sep+"mmgs_O3"
elif platform.system() == "Darwin":
_EXE_ = dirpath+os.sep+"Mac"+os.sep+"mmgs_O3"
devnull = open(os.devnull, 'w')
if verbosity == 0:
try:
subprocess.check_call([_EXE_,"tmp.mesh","-hausd",str(hausd),"-v",str(verbosity)],stdout=devnull,stderr=devnull)
except:
os.chmod(_EXE_,stat.S_IXUSR|stat.S_IXGRP|stat.S_IXOTH)
subprocess.check_call([_EXE_,"tmp.mesh","-hausd",str(hausd),"-v",str(verbosity)],stdout=devnull,stderr=devnull)
else:
try:
subprocess.check_call([_EXE_,"tmp.mesh","-hausd",str(hausd),"-v",str(verbosity)])
except:
os.chmod(_EXE_,stat.S_IXUSR|stat.S_IXGRP|stat.S_IXOTH)
subprocess.check_call([_EXE_,"tmp.mesh","-hausd",str(hausd),"-v",str(verbosity)])
clean_medit("tmp.o.mesh")
remeshed = pv.read("tmp.o.mesh")
remeshed_surface = remeshed.extract_surface()
remeshed_surface.triangulate(inplace=True)
remeshed_surface.clear_data()
os.remove("tmp.mesh")
os.remove("tmp.o.sol")
os.remove("tmp.o.mesh")
return remeshed_surface
[docs]def clean_medit(filename):
file = open(filename)
lines = file.readlines()
file.close()
keywords_index = []
for i,s in enumerate(lines):
if s[0].isnumeric():
pass
elif s[0] == '-':
pass
elif s[0] == '\n':
pass
elif s[0] == '\n':
pass
else:
keywords_index.append(i)
new_file = open(filename,'w+')
new_lines = []
for i,o in enumerate(keywords_index):
if lines[o] == 'RequiredVertices\n':
pass
elif lines[o] == 'Ridges\n':
pass
elif lines[o] == 'Tangents\n':
pass
elif lines[o] == 'TangentAtVertices\n':
pass
else:
if o == keywords_index[-1]:
new_lines.append(lines[o])
else:
new_lines.extend(lines[o:keywords_index[i+1]])
new_file.writelines(new_lines)
new_file.close()