Added ID hashing, added basic form of writing info to stl header.

master
Rostislav Lán 2 years ago
parent 939ba64791
commit 4efee4d38c

@ -5,4 +5,3 @@ opencv-python==4.7.0.72
scikit-image==0.19.3 scikit-image==0.19.3
scipy==1.9.3 scipy==1.9.3
stl==0.0.3 stl==0.0.3

@ -8,6 +8,7 @@ import argparse as ap
import sys import sys
import json import json
from os.path import exists from os.path import exists
import hashlib
# Libraries for image processing # Libraries for image processing
import numpy as np import numpy as np
@ -18,7 +19,6 @@ from stl import mesh
# Import custom image filter library # Import custom image filter library
import filters as flt import filters as flt
class app: class app:
def __init__(self): def __init__(self):
# Parse arguments from command line # Parse arguments from command line
@ -286,7 +286,7 @@ class app:
plt.show() plt.show()
self.save_stl() self.save_stl()
print(f"Saving model to ", self.stl_path, file=sys.stderr) print(f"Saving model to ", self.stl_filename, file=sys.stderr)
def prepare_heightmap(self): def prepare_heightmap(self):
'''Modify image values to get usable height/depth values. '''Modify image values to get usable height/depth values.
@ -327,18 +327,70 @@ class app:
self.meshgrid = np.meshgrid(x, y) self.meshgrid = np.meshgrid(x, y)
def write_stl_header(self):
'''Write stl header.
'''
# Truncate if necessary
if (len(self.param_string) > 80):
self.param_string = self.param_string[:80]
print("Warning: Parameter string too long, truncating", file=sys.stderr)
# Overwrite stl header (which is only 80 bytes)
print("Writing info to stl header", file=sys.stderr)
with open(self.stl_filename, "r+") as f:
f.write(self.param_string)
def get_ID(self): def get_ID(self):
'''Get unique ID for the model. '''Get unique ID for the model, used in filename and on the model backside.
Consists of pair input_file + preset_name. Also create parameter string for stl header, which is used to create ID using hash function SHA512.
''' '''
# TODO: somehow compress this to fit it onto the model # these are the same for all types of models
self.id = self.input_file.split("/")[-1].split(".")[0] + "_" + self.preset_name param_list = [self.input_file, str(self.dpi)]
# TODO: hash is not unique, find a better way
# TODO: stl file format has 80 chars for header, use that space to store info # add parameters specific to the model creation process
# python generates a random value for security reasons, it has to be turned off if self.args.config:
self.id = str(hash(self.id)) param_list.append(self.config_file)
#print(self.id) param_list.append(self.preset_name)
else:
# add filters with their params
filter_list = []
for i in range(len(self.filters)):
tmp_params = []
for j in self.params[i+1]:
if self.params[i+1][j] != None:
tmp_params.append(str(j[:3] + ":" + str(self.params[i+1][j])))
tmp_params = ",".join(tmp_params)
tmp = str(self.filters[i][0:3])
if tmp_params != "":
tmp = tmp + ";" + str(tmp_params)
filter_list.append(tmp)
filter_string = ">".join(filter_list)
param_list.append(filter_string)
# these are the same for all types of models
param_list.append(str(self.height_line))
param_list.append(str(self.height_base))
# add parameters specific to the model type
if self.mode == "curved":
param_list.append(str(self.curv_rate_x))
param_list.append(str(self.curv_rate_y))
if self.mode == "planar":
param_list.append("P")
if self.args.mirror:
param_list.append("M")
# string that will later be put inside the header of an stl file
self.param_string = "\\".join(param_list) + "\n"
# hash the param string to get unique ID, this will be put in filename and on the back of the model
# not using built-in hash function because it's seed cannot be set to constant number
# don't need to worry about collisions and security, just need a relatively unique ID
self.id = str(hashlib.sha512(self.param_string.encode('utf-8')).hexdigest())[:10]
def append_faces(self, faces, c): def append_faces(self, faces, c):
# Function to add faces to the list # Function to add faces to the list
@ -501,7 +553,7 @@ class app:
count = self.append_faces(faces, count) count = self.append_faces(faces, count)
self.create_stl_mesh(faces, vertices) self.create_stl_mesh(faces, vertices)
def make_stl_curved(self): def make_stl_curved(self):
'''Map fingerprint to finger model. '''Map fingerprint to finger model.
''' '''
@ -612,18 +664,10 @@ class app:
'''Save final mesh to stl file. '''Save final mesh to stl file.
''' '''
# TODO: add a hash function to create ID specific to # create output file name, save it and write header with file info
# input image + preset from config. file or from console + input params self.stl_filename = self.output_file.split(".")[0] + "_" + self.id + ".stl"
# TODO: add the full parameters and filters to a file inside output dir. self.stl_model.save(self.stl_filename)
# TODO: somehow add the full params to the stl file header if possible. self.write_stl_header()
# TODO: add the ID to backplate
# TODO: add the ID to stl file name
# for now only path + id(input filename + preset name) + .stl is used
# TODO: add output filename to the filename, hash the ID
# stl_filename = self.stl_path.rsplit("/")[0] + self.output_file.split("/"))[-1] + "_" + self.id + ".stl"
stl_filename = self.output_file.split(".")[0] + "_" + self.id + ".stl"
self.stl_model.save(stl_filename)
# run the application # run the application

Loading…
Cancel
Save