Skip to content
Snippets Groups Projects
blender_utils.py 2.41 KiB
Newer Older
  • Learn to ignore specific revisions
  • Campbell Barton's avatar
    Campbell Barton committed
    # ##### BEGIN GPL LICENSE BLOCK #####
    #
    #  This program is free software; you can redistribute it and/or
    #  modify it under the terms of the GNU General Public License
    #  as published by the Free Software Foundation; either version 2
    #  of the License, or (at your option) any later version.
    #
    #  This program is distributed in the hope that it will be useful,
    #  but WITHOUT ANY WARRANTY; without even the implied warranty of
    #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    #  GNU General Public License for more details.
    #
    #  You should have received a copy of the GNU General Public License
    #  along with this program; if not, write to the Free Software Foundation,
    #  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
    #
    # ##### END GPL LICENSE BLOCK #####
    
    # <pep8 compliant>
    
    
    import bpy
    
    
    def create_and_link_mesh(name, faces, points):
        '''
        Create a blender mesh and object called name from a list of
        *points* and *faces* and link it in the current scene.
        '''
    
        mesh = bpy.data.meshes.new(name)
        mesh.from_pydata(points, [], faces)
    
        ob = bpy.data.objects.new(name, mesh)
        bpy.context.scene.objects.link(ob)
    
        # update mesh to allow proper display
    
        mesh.update_tag()
    
    
    
    def faces_from_mesh(ob, apply_modifier=False, triangulate=True):
        '''
        From an object, return a generator over a list of faces.
    
        Each faces is a list of his vertexes. Each vertex is a tuple of
        his coordinate.
    
        apply_modifier
            Apply the preview modifier to the returned liste
    
        triangulate
            Split the quad into two triangles
        '''
    
        # get the modifiers
    
        try:
            mesh = ob.create_mesh(bpy.context.scene,
                                    apply_modifier, "PREVIEW")
        except SystemError:
            return ()
    
        if triangulate:
            # From a list of faces, return the face triangulated if needed.
            def iter_face_index():
                for face in mesh.faces:
                    vertices = face.vertices[:]
                    if len(vertices) == 4:
                        yield vertices[0], vertices[1], vertices[2]
                        yield vertices[2], vertices[3], vertices[0]
                    else:
                        yield vertices
        else:
            def iter_face_index():
                for face in mesh.faces:
                    yield face.vertices[:]
    
        return ([(mesh.vertices[index].co * ob.matrix_world)[:]
    
                 for index in indexes] for indexes in iter_face_index())