Created
April 6, 2016 23:23
-
-
Save awesomebytes/a3bc8729d0c1d0a9499172b9a77d2622 to your computer and use it in GitHub Desktop.
Executing meshlab from commandline reduce faces of a mesh iteratively
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
import sys | |
import os | |
import subprocess | |
# Script taken from doing the needed operation | |
# (Filters > Remeshing, Simplification and Reconstruction > | |
# Quadric Edge Collapse Decimation, with parameters: | |
# 0.9 percentage reduction (10%), 0.3 Quality threshold (70%) | |
# Target number of faces is ignored with those parameters | |
# conserving face normals, planar simplification and | |
# post-simplimfication cleaning) | |
# And going to Filter > Show current filter script | |
filter_script_mlx = """<!DOCTYPE FilterScript> | |
<FilterScript> | |
<filter name="Quadric Edge Collapse Decimation"> | |
<Param type="RichInt" value="1448" name="TargetFaceNum"/> | |
<Param type="RichFloat" value="0.9" name="TargetPerc"/> | |
<Param type="RichFloat" value="0.3" name="QualityThr"/> | |
<Param type="RichBool" value="false" name="PreserveBoundary"/> | |
<Param type="RichFloat" value="1" name="BoundaryWeight"/> | |
<Param type="RichBool" value="true" name="PreserveNormal"/> | |
<Param type="RichBool" value="false" name="PreserveTopology"/> | |
<Param type="RichBool" value="false" name="OptimalPlacement"/> | |
<Param type="RichBool" value="true" name="PlanarQuadric"/> | |
<Param type="RichBool" value="false" name="QualityWeight"/> | |
<Param type="RichBool" value="true" name="AutoClean"/> | |
<Param type="RichBool" value="false" name="Selected"/> | |
</filter> | |
</FilterScript> | |
""" | |
def create_tmp_filter_file(filename='filter_file_tmp.mlx'): | |
with open('/tmp/' + filename, 'w') as f: | |
f.write(filter_script_mlx) | |
return '/tmp/' + filename | |
def reduce_faces(in_file, out_file, | |
filter_script_path=create_tmp_filter_file()): | |
# Add input mesh | |
command = "meshlabserver -i " + in_file | |
# Add the filter script | |
command += " -s " + filter_script_path | |
# Add the output filename and output flags | |
command += " -o " + out_file + " -om vn fn" | |
# Execute command | |
print "Going to execute: " + command | |
output = subprocess.check_output(command, shell=True) | |
last_line = output.splitlines()[-1] | |
print "Done:" | |
print in_file + " > " + out_file + ": " + last_line | |
if __name__ == '__main__': | |
if len(sys.argv) < 3: | |
print "Usage:" | |
print sys.argv[0] + " /path/to/input_mesh num_iterations" | |
print "For example, reduce 10 times:" | |
print sys.argv[0] + " /home/myuser/mymesh.dae 10" | |
exit(0) | |
in_mesh = sys.argv[1] | |
filename = in_mesh.split('/')[-1] | |
num_iterations = int(sys.argv[2]) | |
folder_name = filename.replace('.', '_') | |
tmp_folder_name = '/tmp/' + folder_name + '_meshes/' | |
print "Input mesh: " + in_mesh + " (filename: " + filename + ")" | |
print "Num iterations: " + str(num_iterations) | |
print "Output folder: " + tmp_folder_name | |
try: | |
os.mkdir(tmp_folder_name) | |
except OSError as e: | |
print >> sys.stderr, "Exception creating folder for meshes: " + str(e) | |
exit(0) | |
for it in range(1, num_iterations): | |
if it == 1: | |
out_mesh = tmp_folder_name + folder_name + "_it" + str(it) + ".dae" | |
reduce_faces(in_mesh, out_mesh) | |
else: | |
out_mesh = tmp_folder_name + folder_name + "_it" + str(it) + ".dae" | |
reduce_faces(last_out_mesh, out_mesh) | |
last_out_mesh = out_mesh | |
print "Done reducing, find the files at: " + tmp_folder_name |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
here are some updates for python 3.6.2: https://gist.github.com/tylerlindell/7435ca2261e7c404ccc1241f18e483aa