예제 #1
0
    def _add_user_geometry(self, csv_filename: str, name: str,
                           color: List[float]) -> None:
        """
        helper method for ``on_load_user_geom``

        A custom geometry can be the pyNastran custom form or an STL

        """
        if name in self.gui.geometry_actors:
            msg = 'Name: %s is already in geometry_actors\nChoose a different name.' % name
            raise ValueError(msg)
        if len(name) == 0:
            msg = 'Invalid Name: name=%r' % name
            raise ValueError(msg)

        point_name = name + '_point'
        geom_name = name + '_geom'

        grid_ids, xyz, bars, tris, quads = load_user_geom(csv_filename,
                                                          self.gui.log,
                                                          encoding='latin1')
        nbars = len(bars)
        ntris = len(tris)
        nquads = len(quads)
        nelements = nbars + ntris + nquads
        self.gui.create_alternate_vtk_grid(point_name,
                                           color=color,
                                           opacity=1.0,
                                           point_size=5,
                                           representation='point')

        if nelements > 0:
            nid_map = {}
            i = 0
            for nid in grid_ids:
                nid_map[nid] = i
                i += 1
            self.gui.create_alternate_vtk_grid(geom_name,
                                               color=color,
                                               opacity=1.0,
                                               line_width=5,
                                               representation='toggle')

        # allocate
        nnodes = len(grid_ids)
        #self.alt_grids[point_name].Allocate(npoints, 1000)
        #if nelements > 0:
        #self.alt_grids[geom_name].Allocate(npoints, 1000)

        alt_grid = self.gui.alt_grids[point_name]
        geom_grid = self.gui.alt_grids[geom_name]

        add_user_geometry(alt_grid, geom_grid, xyz, nid_map, nnodes, bars,
                          tris, quads, nelements, nbars, ntris, nquads)

        # create actor/mapper
        self._add_alt_geometry(alt_grid, point_name)
        if nelements > 0:
            self._add_alt_geometry(geom_grid, geom_name)
예제 #2
0
 def test_gui_custom_geom_01(self):
     """tests custom_geom.csv"""
     csv_filename = os.path.join(MODEL_PATH, 'custom_geom.csv')
     load_user_geom(csv_filename)
예제 #3
0
    def _add_user_geometry(self, csv_filename, name, color):
        """
        helper method for ``on_load_user_geom``

        A custom geometry can be the pyNastran custom form or an STL
        """
        if name in self.gui.geometry_actors:
            msg = 'Name: %s is already in geometry_actors\nChoose a different name.' % name
            raise ValueError(msg)
        if len(name) == 0:
            msg = 'Invalid Name: name=%r' % name
            raise ValueError(msg)

        point_name = name + '_point'
        geom_name = name + '_geom'

        grid_ids, xyz, bars, tris, quads = load_user_geom(csv_filename, self.gui.log,
                                                          encoding='latin1')
        nbars = len(bars)
        ntris = len(tris)
        nquads = len(quads)
        nelements = nbars + ntris + nquads
        self.gui.create_alternate_vtk_grid(point_name, color=color, opacity=1.0,
                                           point_size=5, representation='point')

        if nelements > 0:
            nid_map = {}
            i = 0
            for nid in grid_ids:
                nid_map[nid] = i
                i += 1
            self.gui.create_alternate_vtk_grid(geom_name, color=color, opacity=1.0,
                                               line_width=5, representation='toggle')

        # allocate
        nnodes = len(grid_ids)
        #self.alt_grids[point_name].Allocate(npoints, 1000)
        #if nelements > 0:
            #self.alt_grids[geom_name].Allocate(npoints, 1000)

        # set points
        points = numpy_to_vtk_points(xyz, dtype='<f')

        if nelements > 0:
            alt_grid = self.gui.alt_grids[point_name]
            geom_grid = self.gui.alt_grids[geom_name]
            for i in range(nnodes):
                elem = vtk.vtkVertex()
                elem.GetPointIds().SetId(0, i)
                alt_grid.InsertNextCell(elem.GetCellType(), elem.GetPointIds())
                geom_grid.InsertNextCell(elem.GetCellType(), elem.GetPointIds())
        else:
            for i in range(nnodes):
                elem = vtk.vtkVertex()
                elem.GetPointIds().SetId(0, i)
                alt_grid.InsertNextCell(elem.GetCellType(), elem.GetPointIds())
        if nbars:
            for i, bar in enumerate(bars[:, 1:]):
                g1 = nid_map[bar[0]]
                g2 = nid_map[bar[1]]
                elem = vtk.vtkLine()
                elem.GetPointIds().SetId(0, g1)
                elem.GetPointIds().SetId(1, g2)
                geom_grid.InsertNextCell(elem.GetCellType(), elem.GetPointIds())

        if ntris:
            for i, tri in enumerate(tris[:, 1:]):
                g1 = nid_map[tri[0]]
                g2 = nid_map[tri[1]]
                g3 = nid_map[tri[2]]
                elem = vtk.vtkTriangle()
                elem.GetPointIds().SetId(0, g1)
                elem.GetPointIds().SetId(1, g2)
                elem.GetPointIds().SetId(2, g3)
                geom_grid.InsertNextCell(5, elem.GetPointIds())

        if nquads:
            for i, quad in enumerate(quads[:, 1:]):
                g1 = nid_map[quad[0]]
                g2 = nid_map[quad[1]]
                g3 = nid_map[quad[2]]
                g4 = nid_map[quad[3]]
                elem = vtk.vtkQuad()
                point_ids = elem.GetPointIds()
                point_ids.SetId(0, g1)
                point_ids.SetId(1, g2)
                point_ids.SetId(2, g3)
                point_ids.SetId(3, g4)
                geom_grid.InsertNextCell(9, elem.GetPointIds())

        alt_grid.SetPoints(points)
        if nelements > 0:
            self.gui.alt_grids[geom_name].SetPoints(points)

        # create actor/mapper
        self._add_alt_geometry(alt_grid, point_name)
        if nelements > 0:
            self._add_alt_geometry(geom_grid, geom_name)