def test_stl_io_02_nan(self): lines = ('solid testsphere\n' ' facet normal -0.13 -0.13 -0.98\n' ' outer loop\n' ' vertex 1.50000 1.50000 0.00000\n' ' vertex 1.50000 1.11177 0.05111\n' ' vertex 1.11177 1.50000 0.05111\n' ' endloop\n' ' endfacet\n' ' facet normal 0.13 0.13 -0.98\n' ' outer loop\n' ' vertex 1.50000 1.50000 0.00000\n' ' vertex 1.50000 1.88823 0.05111\n' ' vertex 1.88823 1.50000 0.05111\n' ' endloop\n' ' endfacet\n' ' facet normal 0.13 0.13 -0.98\n' ' outer loop\n' ' vertex 0.00000 0.00000 0.00000\n' ' vertex 0.00000 0.00000 0.00000\n' ' vertex 0.00000 0.00000 0.00000\n' ' endloop\n' ' endfacet\n' 'endsolid\n') log = get_logger(level='warning') stl_filename = os.path.join(TEST_PATH, 'tris.stl') stl_out_filename = os.path.join(TEST_PATH, 'tris_out.stl') stl_bin_filename = os.path.join(TEST_PATH, 'tris_bin.stl') with open(stl_filename, 'w') as stl_file: stl_file.write(lines) stl = read_stl(stl_filename, log=log, debug=False) stl._get_normals_data(stl.elements) with self.assertRaises(RuntimeError): stl.write_stl(stl_out_filename, is_binary=False) stl.write_stl(stl_out_filename, is_binary=False, stop_on_failure=False) stl_out = read_stl(stl_out_filename, log=log, debug=False) stl.write_stl(stl_bin_filename, is_binary=True) stl.write_stl(stl_bin_filename, is_binary=True, normalize_normal_vectors=True) stl_bin = read_stl(stl_bin_filename, log=log, debug=False) assert len(stl.nodes) == 7, 'nodes=%s' % len(stl.nodes) assert len(stl.elements) == 3, 'nelements=%s' % len(stl.elements) assert len( stl_out.elements) == 3, 'nelements=%s' % len(stl_out.elements) assert len( stl_bin.elements) == 3, 'nelements=%s' % len(stl_bin.elements) os.remove(stl_filename) os.remove(stl_out_filename) os.remove(stl_bin_filename)
def test_stl_io_01(self): lines = ( 'solid testsphere\n' ' facet normal -0.13 -0.13 -0.98\n' ' outer loop\n' ' vertex 1.50000 1.50000 0.00000\n' ' vertex 1.50000 1.11177 0.05111\n' ' vertex 1.11177 1.50000 0.05111\n' ' endloop\n' ' endfacet\n' ' facet normal 0.13 0.13 -0.98\n' ' outer loop\n' ' vertex 1.50000 1.50000 0.00000\n' ' vertex 1.50000 1.88823 0.05111\n' ' vertex 1.88823 1.50000 0.05111\n' ' endloop\n' ' endfacet\n' 'endsolid\n' ) stl_filename = os.path.join(test_path, 'tris.stl') with open(stl_filename, 'w') as stl_file: stl_file.write(lines) stl = read_stl(stl_filename, log=None, debug=False) #stl = STL(log=None, debug=False) #stl.read_stl(stl_filename) assert len(stl.nodes) == 6, 'nodes=%s' % len(stl.nodes) assert len(stl.elements) == 2, 'nelements=%s' % len(stl.elements) os.remove(stl_filename)
def main(): import os import pyNastran pkg_path = pyNastran.__path__[0] stl_filename = os.path.join(pkg_path, 'converters', 'stl', 'sphere.stl') stl = read_stl(stl_filename) #XYZ Global = (2.0035907914418716, 1.3287668328026303, 2.873731014735773) #NodeID = 142; xyz=(1.88823, 1.5, 2.94889) #lineNo=2110 annotate_cell_picker() #XYZ Global = (1.9419959964242275, 1.141259948469464, 2.869267723165781) #NodeID = 141; xyz=(1.93018, 1.02165, 2.85504) #lineNo=2110 annotate_cell_picker() #XYZ Global = (2.1320656653448338, 1.4367816967143772, 2.83778333777658) #NodeID = 137; xyz=(2.25, 1.5, 2.79904) # nids = [142, 137, 141] # 2.0035907914418716, 1.3287668328026303, 2.873731014735773 points = np.array([ [2.0035907914418716, 1.3287668328026303, 2.873731014735773], [2.25, 1.5, 2.79904], [2.25, 1.5, 2.79903], ], dtype='float32') pa = points[0, :] pb = points[1, :] out_points = project_points_onto_stl(stl, points) out_points2 = project_line_onto_stl(stl, pa, pb, npoints=11)
def main(): import os import pyNastran pkg_path = pyNastran.__path__[0] stl_filename = os.path.join(pkg_path, 'converters', 'stl', 'sphere.stl') stl = read_stl(stl_filename) #XYZ Global = (2.0035907914418716, 1.3287668328026303, 2.873731014735773) #NodeID = 142; xyz=(1.88823, 1.5, 2.94889) #lineNo=2110 annotate_cell_picker() #XYZ Global = (1.9419959964242275, 1.141259948469464, 2.869267723165781) #NodeID = 141; xyz=(1.93018, 1.02165, 2.85504) #lineNo=2110 annotate_cell_picker() #XYZ Global = (2.1320656653448338, 1.4367816967143772, 2.83778333777658) #NodeID = 137; xyz=(2.25, 1.5, 2.79904) # nids = [142, 137, 141] # 2.0035907914418716, 1.3287668328026303, 2.873731014735773 points = np.array([ [2.0035907914418716, 1.3287668328026303, 2.873731014735773], [2.25, 1.5, 2.79904], [2.25, 1.5, 2.79903], ], dtype='float32') pa = points[0, :] pb = points[1, :] out_points = project_points_onto_stl(stl, points) out_points2 = project_line_onto_stl(stl, pa, pb, npoints=11)
def test_stl_io_01(self): lines = ('solid testsphere\n' ' facet normal -0.13 -0.13 -0.98\n' ' outer loop\n' ' vertex 1.50000 1.50000 0.00000\n' ' vertex 1.50000 1.11177 0.05111\n' ' vertex 1.11177 1.50000 0.05111\n' ' endloop\n' ' endfacet\n' ' facet normal 0.13 0.13 -0.98\n' ' outer loop\n' ' vertex 1.50000 1.50000 0.00000\n' ' vertex 1.50000 1.88823 0.05111\n' ' vertex 1.88823 1.50000 0.05111\n' ' endloop\n' ' endfacet\n' 'endsolid\n') stl_filename = os.path.join(test_path, 'tris.stl') with open(stl_filename, 'w') as stl_file: stl_file.write(lines) stl = read_stl(stl_filename, log=None, debug=False) #stl = STL(log=None, debug=False) #stl.read_stl(stl_filename) assert len(stl.nodes) == 6, 'nodes=%s' % len(stl.nodes) assert len(stl.elements) == 2, 'nelements=%s' % len(stl.elements) os.remove(stl_filename)
def load_stl_geometry(self, stl_filename, name='main', plot=True): #print("load_stl_geometry...") skip_reading = self.gui._remove_old_geometry(stl_filename) if skip_reading: return model = read_stl(stl_filename, remove_elements_with_bad_normals=True, log=self.gui.log, debug=False) #self.model_type = model.model_type nodes = model.nodes elements = model.elements normals = model.get_normals(elements, stop_on_failure=False) areas = model.get_area(elements, stop_on_failure=False) #nnormals = model.get_normals_at_nodes(elements) self.gui.nnodes = nodes.shape[0] self.gui.nelements = elements.shape[0] self.gui.log.info('nnodes=%s nelements=%s' % (self.gui.nnodes, self.gui.nelements)) grid = self.gui.grid grid.Allocate(self.gui.nelements, 1000) points = numpy_to_vtk_points(nodes) self.gui.nid_map = {} #elem.SetNumberOfPoints(nnodes) assert nodes is not None unused_nnodes = nodes.shape[0] xmax, ymax, zmax = nodes.max(axis=0) xmin, ymin, zmin = nodes.min(axis=0) self.gui.log.info('xmax=%s xmin=%s' % (xmax, xmin)) self.gui.log.info('ymax=%s ymin=%s' % (ymax, ymin)) self.gui.log.info('zmax=%s zmin=%s' % (zmax, zmin)) dim_max = max(xmax - xmin, ymax - ymin, zmax - zmin) self.gui.create_global_axes(dim_max) etype = 5 # vtkTriangle().GetCellType() create_vtk_cells_of_constant_element_type(grid, elements, etype) grid.SetPoints(points) grid.Modified() if hasattr(grid, 'Update'): # pragma: no cover grid.Update() # loadSTLResults - regions/loads self.gui.scalarBar.VisibilityOff() self.gui.scalarBar.Modified() cases = OrderedDict() self.gui.isubcase_name_map = {} ID = 1 form, cases, node_ids, element_ids = self._fill_stl_case( cases, ID, elements, nodes, normals, areas) self.gui.node_ids = node_ids self.gui.element_ids = element_ids self.gui._finish_results_io2(form, cases)
def test_tetgen_geometry_02(self): log = get_logger(level='warning') regenerate_files = False if regenerate_files: # pragma: no cover from pyNastran.converters.stl.stl import read_stl model = read_stl(os.path.join(STL_PATH, 'sphere.stl')) #model.flip_normals() model.write_stl('tetgen_test.stl') del model os.system('tetgen.exe -pqcvVqY tetgen_test.stl') test = TetgenGUI() test.log = log base = os.path.join(model_path, 'tetgen_test.1') test.model.load_tetgen_geometry(base + '.smesh') test.model.load_tetgen_geometry(base + '.ele') model2 = read_tetgen(base, dimension_flag=2, log=None, debug=False) model2.write_nastran(base + '.bdf') model3 = read_tetgen(base, dimension_flag=3, log=None, debug=False) model3.write_nastran(base + '.bdf') #base = 'tetgen_test_flipped.1' #m.read_tetgen(base + '.node', base + '.smesh', base + '.ele', dimension_flag=3) #m.write_nastran(base + '.bdf') os.remove(base + '.bdf')
def test_stl_io_01(self): lines = ('solid testsphere\n' ' facet normal -0.13 -0.13 -0.98\n' ' outer loop\n' ' vertex 1.50000 1.50000 0.00000\n' ' vertex 1.50000 1.11177 0.05111\n' ' vertex 1.11177 1.50000 0.05111\n' ' endloop\n' ' endfacet\n' ' facet normal 0.13 0.13 -0.98\n' ' outer loop\n' ' vertex 1.50000 1.50000 0.00000\n' ' vertex 1.50000 1.88823 0.05111\n' ' vertex 1.88823 1.50000 0.05111\n' ' endloop\n' ' endfacet\n' 'endsolid\n') log = get_logger(level='warning') #stl_filename = os.path.join(TEST_PATH, 'tris.stl') stl_filename = 'tris1.stl' with open(stl_filename, 'w') as stl_file: stl_file.write(lines) stl = read_stl(stl_filename, log=log, debug=False) stl.get_normals_at_nodes() scale = 1.0 stl.scale_nodes(scale) stl.shift_nodes(0., 0., 0.) stl.log.info('end of shift') axes = 'xy' stl.flip_axes(axes, scale) stl.flip_axes(axes, scale) # flip back stl.log.info('end of flip') #stl = STL(log=None, debug=False) #stl.read_stl(stl_filename) assert len(stl.nodes) == 6, 'nodes=%s' % len(stl.nodes) assert len(stl.elements) == 2, 'nelements=%s' % len(stl.elements) xyz = 'y' tol = 0.00001 stl.log.info('mirror') stl.create_mirror_model(xyz, tol) assert len(stl.nodes) == 12, 'nodes=%s' % len(stl.nodes) assert len(stl.elements) == 4, 'nelements=%s' % len(stl.elements) stl.log.info('end of mirror') stl_filename2 = 'tris2.stl' stl_filename3 = 'tris3.stl' shutil.copyfile(stl_filename, stl_filename2) if os.path.exists(stl_filename3): os.remove(stl_filename3) argv = ['format_converter', 'stl', 'tris*.stl', 'stl', stl_filename3] cmd_line_format_converter(argv=argv, quiet=True) os.remove(stl_filename) os.remove(stl_filename2) os.remove(stl_filename3)
def test_stl_io_02(self): lines = ('solid testsphere\n' ' facet normal -0.13 -0.13 -0.98\n' ' outer loop\n' ' vertex 1.50000 1.50000 0.00000\n' ' vertex 1.50000 1.11177 0.05111\n' ' vertex 1.11177 1.50000 0.05111\n' ' endloop\n' ' endfacet\n' ' facet normal 0.13 0.13 -0.98\n' ' outer loop\n' ' vertex 1.50000 1.50000 0.00000\n' ' vertex 1.50000 1.88823 0.05111\n' ' vertex 1.88823 1.50000 0.05111\n' ' endloop\n' ' endfacet\n' 'endsolid\n') log = get_logger(level='warning') stl_filename = os.path.join(test_path, 'tris.stl') stl_out_filename = os.path.join(test_path, 'tris_out.stl') stl_bin_filename = os.path.join(test_path, 'tris_bin.stl') with open(stl_filename, 'w') as stl_file: stl_file.write(lines) stl = read_stl(stl_filename, log=log, debug=False) stl.write_stl(stl_out_filename, is_binary=False) stl_out = read_stl(stl_out_filename, log=log, debug=False) stl.write_stl(stl_bin_filename, is_binary=True) stl.write_stl(stl_bin_filename, is_binary=True, normalize_normal_vectors=True) stl_bin = read_stl(stl_bin_filename, log=log, debug=False) assert len(stl.nodes) == 6, 'nodes=%s' % len(stl.nodes) assert len(stl.elements) == 2, 'nelements=%s' % len(stl.elements) os.remove(stl_filename) os.remove(stl_out_filename)
def test_stl_io_02(self): lines = ( 'solid testsphere\n' ' facet normal -0.13 -0.13 -0.98\n' ' outer loop\n' ' vertex 1.50000 1.50000 0.00000\n' ' vertex 1.50000 1.11177 0.05111\n' ' vertex 1.11177 1.50000 0.05111\n' ' endloop\n' ' endfacet\n' ' facet normal 0.13 0.13 -0.98\n' ' outer loop\n' ' vertex 1.50000 1.50000 0.00000\n' ' vertex 1.50000 1.88823 0.05111\n' ' vertex 1.88823 1.50000 0.05111\n' ' endloop\n' ' endfacet\n' 'endsolid\n' ) stl_filename = os.path.join(test_path, 'tris.stl') stl_out_filename = os.path.join(test_path, 'tris_out.stl') stl_bin_filename = os.path.join(test_path, 'tris_bin.stl') with open(stl_filename, 'w') as f: f.write(lines) stl = read_stl(stl_filename, log=None, debug=False) stl.write_stl(stl_out_filename, is_binary=False) stl_out = read_stl(stl_out_filename, log=None, debug=False) stl.write_stl(stl_bin_filename, is_binary=True) stl.write_stl(stl_bin_filename, is_binary=True, normalize_normal_vectors=True) stl_bin = read_stl(stl_bin_filename, log=None, debug=False) assert len(stl.nodes) == 6, 'nodes=%s' % len(stl.nodes) assert len(stl.elements) == 2, 'nelements=%s' % len(stl.elements) os.remove(stl_filename) os.remove(stl_out_filename)
def stl_to_cart3d(stl_filename, cart3d_filename=None, log=None, debug=False, is_binary=False, float_fmt='%6.7f'): """ Converts a Cart3D object to STL format. Parameters ---------- stl_filename : str / STL() str : path to the input STL file STL() : an STL object cart3d_filename : str; default=None str : path to the output Cart3D file (or None to skip) log : log a logger object (or None) debug : bool; default=False True/False (used if log is not defined) is_binary : bool; default=False should the cart3d file be binary float_fmt : str; default='6.7f' the cart3d node precision Returns ------- stl : STL() an STL object """ if isinstance(stl_filename, string_types): stl = read_stl(stl_filename, log=log, debug=debug) elif isinstance(stl_filename, STL): stl = stl_filename else: raise TypeError('stl_filename must be a string or STL; type=%s' % type(stl_filename)) cart3d = Cart3D(log=log, debug=debug) cart3d.nodes = stl.nodes + 1 cart3d.elements = stl.elements + 1 nelements = len(stl.elements) cart3d.regions = np.zeros(nelements, dtype='int32') if cart3d_filename: cart3d.write_cart3d(cart3d_filename, is_binary=is_binary, float_fmt=float_fmt) return cart3d
def test_tetgen_geometry_02(self): log = get_logger(level='warning') regenerate_files = False if regenerate_files: # pragma: no cover from pyNastran.converters.stl.stl import read_stl model = read_stl(os.path.join(STL_PATH, 'sphere.stl')) #model.flip_normals() model.write_stl('tetgen_test.stl') del model os.system('tetgen.exe -pqcvVqY tetgen_test.stl') test = TetgenGUI() test.log = log base = os.path.join(model_path, 'tetgen_test.1') test.load_tetgen_geometry(base + '.smesh') test.load_tetgen_geometry(base + '.ele')
def test_stl_io_01(self): lines = ( 'solid testsphere\n' ' facet normal -0.13 -0.13 -0.98\n' ' outer loop\n' ' vertex 1.50000 1.50000 0.00000\n' ' vertex 1.50000 1.11177 0.05111\n' ' vertex 1.11177 1.50000 0.05111\n' ' endloop\n' ' endfacet\n' ' facet normal 0.13 0.13 -0.98\n' ' outer loop\n' ' vertex 1.50000 1.50000 0.00000\n' ' vertex 1.50000 1.88823 0.05111\n' ' vertex 1.88823 1.50000 0.05111\n' ' endloop\n' ' endfacet\n' 'endsolid\n' ) log = get_logger(level='warning') stl_filename = os.path.join(TEST_PATH, 'tris.stl') with open(stl_filename, 'w') as stl_file: stl_file.write(lines) stl = read_stl(stl_filename, log=log, debug=False) stl.get_normals_at_nodes() scale = 1.0 stl.scale_nodes(scale) stl.shift_nodes(0., 0., 0.) axes = 'xy' stl.flip_axes(axes, scale) stl.flip_axes(axes, scale) # flip back #stl = STL(log=None, debug=False) #stl.read_stl(stl_filename) assert len(stl.nodes) == 6, 'nodes=%s' % len(stl.nodes) assert len(stl.elements) == 2, 'nelements=%s' % len(stl.elements) xyz = 'y' tol = 0.00001 stl.create_mirror_model(xyz, tol) assert len(stl.nodes) == 12, 'nodes=%s' % len(stl.nodes) assert len(stl.elements) == 4, 'nelements=%s' % len(stl.elements) os.remove(stl_filename)
def stl_to_cart3d(stl_filename, cart3d_filename=None, log=None, debug=False, is_binary=False, float_fmt='%6.7f'): """ Converts a Cart3D object to STL format. Parameters ---------- stl_filename : str / STL() str : path to the input STL file STL() : an STL object cart3d_filename : str; default=None str : path to the output Cart3D file (or None to skip) log : log a logger object (or None) debug : bool; default=False True/False (used if log is not defined) is_binary : bool; default=False should the cart3d file be binary float_fmt : str; default='6.7f' the cart3d node precision Returns ------- stl : STL() an STL object """ if isinstance(stl_filename, string_types): stl = read_stl(stl_filename, log=log, debug=debug) elif isinstance(stl_filename, STL): stl = stl_filename else: raise TypeError('stl_filename must be a string or STL; type=%s' % type(stl_filename)) cart3d = Cart3D(log=log, debug=debug) cart3d.nodes = stl.nodes + 1 cart3d.elements = stl.elements + 1 nelements = len(stl.elements) cart3d.regions = np.zeros(nelements, dtype='int32') if cart3d_filename: cart3d.write_cart3d(cart3d_filename, is_binary=is_binary, float_fmt=float_fmt) return cart3d
def load_user_geom(fname, encoding='latin1'): """ Loads a file of the form: # all supported cards # - GRID # - BAR # - TRI # - QUAD # # doesn't support: # - solid elements # - element properties # - custom colors # - coordinate systems # - materials # - loads # - results # id x y z GRID, 1, 0.2, 0.3, 0.3 GRID, 2, 1.2, 0.3, 0.3 GRID, 3, 2.2, 0.3, 0.3 GRID, 4, 5.2, 0.3, 0.3 grid, 5, 5.2, 1.3, 2.3 # case insensitive # ID, nodes BAR, 1, 1, 2 # eid, n1,n2,n3,n4 TRI, 2, 1, 2, 3 # this is a comment # eid, n1,n2,n3,n4 QUAD, 3, 1, 5, 3, 4 QUAD, 4, 1, 2, 3, 4 # this is after a blank line """ if fname.lower().endswith('.stl'): stl_filename = fname stl = read_stl(stl_filename) nnodes = stl.nodes.shape[0] ntris = stl.elements.shape[0] grid_ids = np.arange(1, nnodes + 1, dtype='int32') xyz = stl.nodes eids = np.arange(1, ntris + 1, dtype='int32') tris = np.vstack([eids, stl.elements.T + 1]).T #tris = stl.elements + 1 #print(tris) quads = np.array([], dtype='int32') bars = np.array([], dtype='int32') return grid_ids, xyz, bars, tris, quads with open(_filename(fname), 'r', encoding=encoding) as user_geom: lines = user_geom.readlines() grid_ids = [] xyz = [] bars = [] tris = [] quads = [] #lines2 = [] for line in lines: line2 = line.strip().split('#')[0].upper() if line2: sline = line2.split(',') if line2.startswith('GRID'): assert len(sline) == 5, sline grid_ids.append(sline[1]) xyz.append(sline[2:]) elif line2.startswith('BAR'): assert len(sline) == 4, sline bars.append(sline[1:]) elif line2.startswith('TRI'): assert len(sline) == 5, sline tris.append(sline[1:]) elif line2.startswith('QUAD'): assert len(sline) == 6, sline quads.append(sline[1:]) else: self.log.warning(sline) grid_ids = np.array(grid_ids, dtype='int32') xyz = np.array(xyz, dtype='float32') tris = np.array(tris, dtype='int32') quads = np.array(quads, dtype='int32') bars = np.array(bars, dtype='int32') return grid_ids, xyz, bars, tris, quads
def load_stl_geometry(self, stl_filename, name='main', plot=True): #print("load_stl_geometry...") skip_reading = self._remove_old_geometry(stl_filename) if skip_reading: return model = read_stl(stl_filename, log=self.log, debug=False) #self.model_type = model.model_type nodes = model.nodes elements = model.elements normals = model.get_normals(elements, stop_on_failure=False) areas = model.get_area(elements, stop_on_failure=False) #nnormals = model.get_normals_at_nodes(elements) self.nnodes = nodes.shape[0] self.nelements = elements.shape[0] self.log.info('nnodes=%s nelements=%s' % (self.nnodes, self.nelements)) grid = self.grid grid.Allocate(self.nelements, 1000) #self.gridResult.SetNumberOfComponents(self.nelements) points = numpy_to_vtk_points(nodes) self.nid_map = {} #elem.SetNumberOfPoints(nnodes) if 0: fraction = 1. / self.nnodes # so you can color the nodes by ID for nid, node in sorted(iteritems(nodes)): self.gridResult.InsertNextValue(nid * fraction) #print str(element) #elem = vtk.vtkVertex() #elem.GetPointIds().SetId(0, i) #self.aQuadGrid.InsertNextCell(elem.GetCellType(), elem.GetPointIds()) #vectorResult.InsertTuple3(0, 0.0, 0.0, 1.0) assert nodes is not None nnodes = nodes.shape[0] xmax, ymax, zmax = nodes.max(axis=0) xmin, ymin, zmin = nodes.min(axis=0) self.log.info('xmax=%s xmin=%s' % (xmax, xmin)) self.log.info('ymax=%s ymin=%s' % (ymax, ymin)) self.log.info('zmax=%s zmin=%s' % (zmax, zmin)) dim_max = max(xmax - xmin, ymax - ymin, zmax - zmin) self.create_global_axes(dim_max) etype = 5 # vtkTriangle().GetCellType() create_vtk_cells_of_constant_element_type(grid, elements, etype) grid.SetPoints(points) grid.Modified() if hasattr(grid, 'Update'): grid.Update() self.log_info("updated grid") # loadSTLResults - regions/loads self.scalarBar.VisibilityOff() self.scalarBar.Modified() cases = {} self.isubcase_name_map = {} ID = 1 form, cases = self._fill_stl_case(cases, ID, elements, nodes, normals, areas) self._finish_results_io2(form, cases)
def stl_reshape(data): if '--xy' not in data: data['--xy'] = False if '--yz' not in data: data['--yz'] = False if '--xz' not in data: data['--xz'] = False if '--scale' not in data: data['--scale'] = None if '--xscale' not in data: data['--xscale'] = None if '--yscale' not in data: data['--yscale'] = None if '--zscale' not in data: data['--zscale'] = None if '<xshift>' not in data: data['<xshift>'] = None if '<yshift>' not in data: data['<yshift>'] = None if '<zshift>' not in data: data['<zshift>'] = None if '--stats' not in data: data['--stats'] = None if '--mirror' not in data: data['--mirror'] = None if '--flip_normals' not in data: data['--flip_normals'] = None in_stl_filename = data['<in_stl_filename>'] out_stl_filename = data['<out_stl_filename>'] assert in_stl_filename != out_stl_filename stl = read_stl(in_stl_filename) if data['<fmt>'] in ['False', False]: is_binary = True fmt = None else: fmt = data['<fmt>'] is_binary = False print('is_binary=%s' % is_binary) if data['--xy'] or data['--yz'] or data['--xz']: scale = 1. if data['--scale'] is not None: scale = float(data['--scale']) if data['--xy']: assert data['--yz'] is False assert data['--xz'] is False axes = 'xy' elif data['--yz']: assert data['--xy'] is False assert data['--xz'] is False axes = 'yz' elif data['--xz']: assert data['--xy'] is False assert data['--yz'] is False axes = 'xz' #print('flip_axes = %r' % axes) #print(data) stl.flip_axes(axes, scale) elif data['--xscale'] or data['--yscale'] or data['--zscale']: xscale = 1. yscale = 1. zscale = 1. if data['--xscale'] is not None: xscale = float(data['--xscale'].strip("'")) if data['--yscale'] is not None: yscale = float(data['--yscale'].strip("'")) if data['--zscale'] is not None: zscale = float(data['--zscale'].strip("'")) x = deepcopy(stl.nodes[:, 0]) y = deepcopy(stl.nodes[:, 1]) z = deepcopy(stl.nodes[:, 2]) stl.nodes[:, 0] = x * xscale stl.nodes[:, 1] = y * yscale stl.nodes[:, 2] = z * zscale elif data['<xshift>'] or data['<yshift>'] or data['<zshift>']: xshift = 1. yshift = 1. zshift = 1. if data['<xshift>'] is not None: if isinstance(xshift, str): xshift = float(data['<xshift>'].strip("'")) else: xshift = float(data['<xshift>']) if data['<yshift>'] is not None: if isinstance(xshift, str): yshift = float(data['<yshift>'].strip("'")) else: yshift = float(data['<yshift>']) if data['<zshift>'] is not None: if isinstance(xshift, str): zshift = float(data['<zshift>'].strip("'")) else: zshift = float(data['<zshift>']) print('delta = (%s, %s, %s)' % (xshift, yshift, zshift)) stl.nodes[:, 0] += xshift stl.nodes[:, 1] += yshift stl.nodes[:, 2] += zshift elif data['--scale']: scale = float(data['--scale']) stl.nodes *= scale elif data['--stats']: xmax, ymax, zmax = stl.nodes.max(axis=0) xmin, ymin, zmin = stl.nodes.min(axis=0) print('xyz_max = (%g, %g, %g)' % (xmax, ymax, zmax)) print('xyz_min = (%g, %g, %g)' % (xmin, ymin, zmin)) return elif data['--mirror']: #plane = data['plane'] #assert plane in ['xy', 'yz', 'xz'], 'plane=%r' % plane xyz = data['<xyz>'] tol = float(data['<tol>']) stl.create_mirror_model(xyz, tol) elif data['--flip_normals']: stl.flip_normals() else: raise RuntimeError('unsupported reshape...data=%s' % data) stl.write_stl(out_stl_filename, is_binary=is_binary, float_fmt=fmt)