Exemple #1
0
    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)
Exemple #2
0
    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)
Exemple #3
0
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)
Exemple #4
0
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)
Exemple #5
0
    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)
Exemple #6
0
    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')
Exemple #8
0
    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)
Exemple #9
0
    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)
Exemple #10
0
    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)
Exemple #11
0
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
Exemple #12
0
    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')
Exemple #13
0
    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
Exemple #15
0
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
Exemple #16
0
    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)
Exemple #17
0
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)