def write_stl_file(a_shape, filename, mode="ascii", linear_deflection=0.9, angular_deflection=0.5): """ export the shape to a STL file Be careful, the shape first need to be explicitely meshed using BRepMesh_IncrementalMesh a_shape: the topods_shape to export filename: the filename mode: optional, "ascii" by default. Can either be "binary" linear_deflection: optional, default to 0.001. Lower, more occurate mesh angular_deflection: optional, default to 0.5. Lower, more accurate_mesh """ assert not a_shape.IsNull() assert mode in ["ascii", "binary"] if os.path.isfile(filename): print("Warning: %s file already exists and will be replaced" % filename) # first mesh the shape mesh = BRepMesh_IncrementalMesh(a_shape, linear_deflection, False, angular_deflection, True) #mesh.SetDeflection(0.05) mesh.Perform() assert mesh.IsDone() stl_exporter = StlAPI_Writer() if mode == "ascii": stl_exporter.SetASCIIMode(True) else: # binary, just set the ASCII flag to False stl_exporter.SetASCIIMode(False) stl_exporter.Write(a_shape, filename) assert os.path.isfile(filename)
def getStl(g, step=0.6): global geom_counter geom_counter = geom_counter + 1 name_base = "./tmp_g_" + str(fem_counter) stl_file = name_base + ".stl" mesh = BRepMesh_IncrementalMesh(g, step) mesh.Perform() stl_exporter = StlAPI_Writer() stl_exporter.SetASCIIMode( True) # change to False if you need binary export stl_exporter.Write(g, stl_file) return stl_file
def save_to_stl(shapes, dirpath=Path.home()): assert isinstance(shapes, list) try: os.makedirs(Path(dirpath)) except OSError as e: if e.errno != errno.EEXIST: raise stl_writer = StlAPI_Writer() stl_writer.SetASCIIMode(True) for index, shape in enumerate(shapes): filepath = Path(dirpath, "combined_shape_" + str(index + 1) + ".stl") stl_writer.Write(shape, str(filepath))
def write_stl_file(a_shape, filename, mode="ascii", linear_deflection=0.9, angular_deflection=0.5): """export the shape to a STL file Be careful, the shape first need to be explicitly meshed using BRepMesh_IncrementalMesh a_shape: the topods_shape to export filename: the filename mode: optional, "ascii" by default. Can either be "binary" linear_deflection: optional, default to 0.001. Lower, more occurate mesh angular_deflection: optional, default to 0.5. Lower, more accurate_mesh """ if a_shape.IsNull(): raise AssertionError("Shape is null.") if mode not in ["ascii", "binary"]: raise AssertionError("mode should be either ascii or binary") if os.path.isfile(filename): print(f"Warning: {filename} already exists and will be replaced") # first mesh the shape mesh = BRepMesh_IncrementalMesh(a_shape, linear_deflection, False, angular_deflection, True) # mesh.SetDeflection(0.05) mesh.Perform() if not mesh.IsDone(): raise AssertionError("Mesh is not done.") stl_exporter = StlAPI_Writer() if mode == "ascii": stl_exporter.SetASCIIMode(True) else: # binary, just set the ASCII flag to False stl_exporter.SetASCIIMode(False) stl_exporter.Write(a_shape, filename) if not os.path.isfile(filename): raise IOError("File not written to disk.")
def write_stl(shape, filename, definition=0.1): from OCC.Core.StlAPI import StlAPI_Writer import os directory = os.path.split(__name__)[0] stl_output_dir = os.path.abspath(directory) assert os.path.isdir(stl_output_dir) stl_file = os.path.join(stl_output_dir, filename) stl_writer = StlAPI_Writer() stl_writer.SetASCIIMode(False) from OCC.Core.BRepMesh import BRepMesh_IncrementalMesh mesh = BRepMesh_IncrementalMesh(shape, definition) mesh.Perform() assert mesh.IsDone() stl_writer.Write(shape, stl_file) assert os.path.isfile(stl_file) return stl_file
def stp2stl(filename, fileIODir, linDeflection=0.1, angDeflection=0.1, solidOnly=True): # make sure the path exists otherwise OCE get confused assert os.path.isdir(fileIODir) nameBase = filename.split('.')[0] stpName = os.path.abspath(os.path.join(fileIODir, nameBase + '.stp')) modelShp = read_step_file(stpName) if solidOnly: solids = list(Topo(modelShp).solids()) modelShp = solids[0] mesh = BRepMesh_IncrementalMesh(modelShp, linDeflection) mesh.Perform() assert mesh.IsDone() # set the directory where to output the stlName = os.path.abspath(os.path.join(fileIODir, nameBase + '.stl')) stl_exporter = StlAPI_Writer() stl_exporter.SetASCIIMode(True) # change to False if you need binary export stl_exporter.Write(modelShp, stlName) # make sure the program was created assert os.path.isfile(stlName)
def plot(self, plot_file=None, save_fig=False): """ Method to plot a file. If `plot_file` is not given it plots `self.shape`. :param string plot_file: the filename you want to plot. :param bool save_fig: a flag to save the figure in png or not. If True the plot is not shown. :return: figure: matlplotlib structure for the figure of the chosen geometry :rtype: matplotlib.pyplot.figure """ if plot_file is None: shape = self.shape plot_file = self.infile else: shape = self.load_shape_from_file(plot_file) stl_writer = StlAPI_Writer() # Do not switch SetASCIIMode() from False to True. stl_writer.SetASCIIMode(False) # Necessary to write to STL [to check] stl_mesh = BRepMesh_IncrementalMesh(shape, 0.01) stl_mesh.Perform() f = stl_writer.Write(shape, 'aux_figure.stl') # Create a new plot figure = pyplot.figure() axes = mplot3d.Axes3D(figure) # Load the STL files and add the vectors to the plot stl_mesh = mesh.Mesh.from_file('aux_figure.stl') os.remove('aux_figure.stl') axes.add_collection3d( mplot3d.art3d.Poly3DCollection(stl_mesh.vectors / 1000)) # Get the limits of the axis and center the geometry max_dim = np.array([\ np.max(stl_mesh.vectors[:, :, 0]) / 1000,\ np.max(stl_mesh.vectors[:, :, 1]) / 1000,\ np.max(stl_mesh.vectors[:, :, 2]) / 1000]) min_dim = np.array([\ np.min(stl_mesh.vectors[:, :, 0]) / 1000,\ np.min(stl_mesh.vectors[:, :, 1]) / 1000,\ np.min(stl_mesh.vectors[:, :, 2]) / 1000]) max_lenght = np.max(max_dim - min_dim) axes.set_xlim(\ -.6 * max_lenght + (max_dim[0] + min_dim[0]) / 2,\ .6 * max_lenght + (max_dim[0] + min_dim[0]) / 2) axes.set_ylim(\ -.6 * max_lenght + (max_dim[1] + min_dim[1]) / 2,\ .6 * max_lenght + (max_dim[1] + min_dim[1]) / 2) axes.set_zlim(\ -.6 * max_lenght + (max_dim[2] + min_dim[2]) / 2,\ .6 * max_lenght + (max_dim[2] + min_dim[2]) / 2) # Show the plot to the screen if not save_fig: pyplot.show() else: figure.savefig(plot_file.split('.')[0] + '.png') return figure
def write_stl(shape, filepath): assert isinstance(filepath, Path) stl_writer = StlAPI_Writer() stl_writer.SetASCIIMode(True) stl_writer.Write(copy.deepcopy(shape), str(filepath))