Source code for aerocaps.stl.stl_generator
import typing
import numpy as np
from aerocaps.geom import Surface
[docs]
class STLGenerator:
"""
Reference: https://www.loc.gov/preservation/digital/formats/fdd/fdd000506.shtml
"""
[docs]
def __init__(self, geoms: typing.List[Surface], Nu: int = 50, Nv: int = 50):
self.geoms = geoms
self.Nu = Nu
self.Nv = Nv
def generate(self, file_name: str):
with open(file_name, "w") as stl_file:
stl_file.write("solid aerocaps\n")
for geom in self.geoms:
point_array = geom.evaluate_grid(self.Nu, self.Nv)
for i in range(point_array.shape[0] - 1):
for j in range(point_array.shape[1] - 1):
vertex_1 = point_array[i, j, :]
vertex_2 = point_array[i + 1, j, :]
vertex_3 = point_array[i, j + 1, :]
vertex_4 = point_array[i + 1, j + 1, :]
normal_1 = np.cross(vertex_2 - vertex_1, vertex_3 - vertex_1)
normal_2 = np.cross(vertex_3 - vertex_4, vertex_2 - vertex_4)
stl_file.write(f"facet normal {normal_1[0]} {normal_1[1]} {normal_1[2]}\n")
stl_file.write(f" outer loop\n")
stl_file.write(f" vertex {vertex_1[0]} {vertex_1[1]} {vertex_1[2]}\n")
stl_file.write(f" vertex {vertex_2[0]} {vertex_2[1]} {vertex_2[2]}\n")
stl_file.write(f" vertex {vertex_3[0]} {vertex_3[1]} {vertex_3[2]}\n")
stl_file.write(f" endloop\n")
stl_file.write(f"endfacet\n")
stl_file.write(f"facet normal {normal_2[0]} {normal_2[1]} {normal_2[2]}\n")
stl_file.write(f" outer loop\n")
stl_file.write(f" vertex {vertex_4[0]} {vertex_4[1]} {vertex_4[2]}\n")
stl_file.write(f" vertex {vertex_2[0]} {vertex_2[1]} {vertex_2[2]}\n")
stl_file.write(f" vertex {vertex_3[0]} {vertex_3[1]} {vertex_3[2]}\n")
stl_file.write(f" endloop\n")
stl_file.write(f"endfacet\n")
stl_file.write("endsolid aerocaps\n")