def save_obj(self, path, update_normals=True):
if update_normals:<EOL><INDENT>self.update_normals()<EOL><DEDENT>vectors_key_list = []<EOL>vectors_list = []<EOL>normals_key_list = []<EOL>normals_list = []<EOL>triangle_list = []<EOL>for i, vector in enumerate(self.vectors):<EOL><INDENT>one_triangle = []<EOL>for j in range(<NUM_LIT:3>):<EOL><INDENT>v_key = "<STR_LIT:U+002C>".join(map(str, self.vectors[i][j][:<NUM_LIT:3>]))<EOL>if v_key in vectors_key_list:<EOL><INDENT>v_index = vectors_key_list.index(v_key)<EOL><DEDENT>else:<EOL><INDENT>v_index = len(vectors_key_list)<EOL>vectors_key_list.append(v_key)<EOL>vectors_list.append(self.vectors[i][j][:<NUM_LIT:3>])<EOL><DEDENT>one_triangle.append(v_index + <NUM_LIT:1>)<EOL><DEDENT>n_key = "<STR_LIT:U+002C>".join(map(str, self.normals[i][:<NUM_LIT:3>]))<EOL>if n_key in normals_key_list:<EOL><INDENT>n_index = normals_key_list.index(n_key)<EOL><DEDENT>else:<EOL><INDENT>n_index = len(normals_key_list)<EOL>normals_key_list.append(n_key)<EOL>normals_list.append(self.normals[i][:<NUM_LIT:3>])<EOL><DEDENT>triangle_list.append((one_triangle, n_index + <NUM_LIT:1>))<EOL><DEDENT>with open(path, "<STR_LIT:wb>") as fh:<EOL><INDENT>print("<STR_LIT>".format(__title__, __version__), file=fh)<EOL>print("<STR_LIT>".format(datetime.datetime.now()), file=fh)<EOL>print("<STR_LIT>".format(__url__), file=fh)<EOL>print("<STR_LIT>", file=fh)<EOL>for v in vectors_list:<EOL><INDENT>print("<STR_LIT>".format(v[<NUM_LIT:0>], v[<NUM_LIT:1>], v[<NUM_LIT:2>]), file=fh)<EOL><DEDENT>for vn in normals_list:<EOL><INDENT>print("<STR_LIT>".format(vn[<NUM_LIT:0>], vn[<NUM_LIT:1>], vn[<NUM_LIT:2>]), file=fh)<EOL><DEDENT>for t in triangle_list:<EOL><INDENT>faces = t[<NUM_LIT:0>]<EOL>normal = t[<NUM_LIT:1>]<EOL>print("<STR_LIT>".format(<EOL>faces[<NUM_LIT:0>], normal,<EOL>faces[<NUM_LIT:1>], normal,<EOL>faces[<NUM_LIT:2>], normal,<EOL>), file=fh)<EOL><DEDENT><DEDENT>
Save data with OBJ format
        :param stl path:
        :param bool update_normals: