Skip to content
Snippets Groups Projects
Select Git revision
  • b6d06dba46492bcfe330214f6a3b370d8ae5f523
  • master default protected
  • main
  • test-refactor-server-json
  • blender-v4.1-release
  • blender-v4.0-release
  • blender-v3.6-release
  • blender-v3.3-release
  • blender-v2.93-release
  • blender-v3.5-release
  • blender-v3.1-release
  • blender-v3.0-release
  • blender-v3.4-release
  • blender-v3.2-release
  • studio-sprite-fright
  • blender-v2.92-release
  • blender-v2.91-release
  • greasepencil-addon
  • blender-v2.90-release
  • blender-v2.83-release
  • blender-v2.82-release
  • v3.6.9
  • v3.3.16
  • v4.1.0
  • v4.1.1
  • v3.6.8
  • v3.3.15
  • v3.6.7
  • v3.3.14
  • v4.0.2
  • v4.0.1
  • v4.0.0
  • v3.6.5
  • v3.3.12
  • v3.6.4
  • v3.6.3
  • v3.3.11
  • v3.6.2
  • v3.3.10
  • v3.6.1
  • v3.3.9
41 results

mesh_index_select.py

Blame
  • mesh_index_select.py 6.34 KiB
    bl_info = {
        "name": "Select by index",
        "author": "liero",
        "version": (0, 2),
        "blender": (2, 55, 0),
        "api": 33333,
        "location": "View3D > Tool Shelf",
        "description": "Select mesh data by index / area / length / cursor",
        "category": "Mesh"}
    
    import bpy, mathutils
    from mathutils import Vector
    
    class SelVert(bpy.types.Operator):
        bl_idname = 'mesh.select_vert_index'
        bl_label = 'Verts'
        bl_description = 'Select vertices by index'
        bl_options = {'REGISTER', 'UNDO'}
    
        indice = bpy.props.FloatProperty(name='Selected', default=0, min=0, max=100, description='Percentage of selected edges', precision = 2, subtype = 'PERCENTAGE')
        delta = bpy.props.BoolProperty(name='Use Cursor', default=False, description='Select by Index / Distance to Cursor')
        flip = bpy.props.BoolProperty(name='Reverse Order', default=False, description='Reverse selecting order')
    
        @classmethod
        def poll(cls, context):
            return (context.object and context.object.type == 'MESH')
    
        def draw(self, context):
            layout = self.layout
            layout.prop(self,'indice', slider=True)
            layout.prop(self,'delta')
            layout.prop(self,'flip')
    
        def execute(self, context):
            obj = bpy.context.object
            mode = [a for a in bpy.context.tool_settings.mesh_select_mode]
            if mode != [True, False, False]:
                bpy.context.tool_settings.mesh_select_mode = [True, False, False]
            ver = obj.data.vertices
            loc = context.scene.cursor_location
            sel = []
            for v in ver:
                d = v.co - loc
                sel.append((d.length, v.index))
            sel.sort(reverse=self.flip)
            bpy.ops.object.mode_set()
            valor = round(len(sel) / 100 * self.indice)
            if self.delta:
                for i in range(len(sel[:valor])):
                    ver[sel[i][1]].select = True
            else:
                for i in range(len(sel[:valor])):
                    if self.flip:
                        ver[len(sel)-i-1].select = True
                    else:
                        ver[i].select = True
            bpy.ops.object.mode_set(mode='EDIT')
            return {'FINISHED'}
    
    class SelEdge(bpy.types.Operator):
        bl_idname = 'mesh.select_edge_index'
        bl_label = 'Edges'
        bl_description = 'Select edges by index'
        bl_options = {'REGISTER', 'UNDO'}
    
        indice = bpy.props.FloatProperty(name='Selected', default=0, min=0, max=100, description='Percentage of selected edges', precision = 2, subtype = 'PERCENTAGE')
        delta = bpy.props.BoolProperty(name='Use Edges Length', default=False, description='Select Edges by Index / Length')
        flip = bpy.props.BoolProperty(name='Reverse Order', default=False, description='Reverse selecting order')
    
        @classmethod
        def poll(cls, context):
            return (context.object and context.object.type == 'MESH')
    
        def draw(self, context):
            layout = self.layout
            layout.prop(self,'indice', slider=True)
            layout.prop(self,'delta')
            layout.prop(self,'flip')
    
        def execute(self, context):
            obj = bpy.context.object
            mode = [a for a in bpy.context.tool_settings.mesh_select_mode]
            if mode != [False, True, False]:
                bpy.context.tool_settings.mesh_select_mode = [False, True, False]
            ver = obj.data.vertices
            edg = obj.data.edges
            sel = []
            for e in edg:
                d = ver[e.vertices[0]].co - ver[e.vertices[1]].co
                sel.append((d.length, e.index))
            sel.sort(reverse=self.flip)
            bpy.ops.object.mode_set()
            valor = round(len(sel) / 100 * self.indice)
            if self.delta:
                for i in range(len(sel[:valor])):
                    edg[sel[i][1]].select = True
            else:
                for i in range(len(sel[:valor])):
                    if self.flip:
                        edg[len(sel)-i-1].select = True
                    else:
                        edg[i].select = True
            bpy.ops.object.mode_set(mode='EDIT')
            return {'FINISHED'}
    
    class SelFace(bpy.types.Operator):
        bl_idname = 'mesh.select_face_index'
        bl_label = 'Faces'
        bl_description = 'Select faces by index'
        bl_options = {'REGISTER', 'UNDO'}
    
        indice = bpy.props.FloatProperty(name='Selected', default=0, min=0, max=100, description='Percentage of selected faces', precision = 2, subtype = 'PERCENTAGE')
        delta = bpy.props.BoolProperty(name='Use Faces Area', default=False, description='Select Faces by Index / Area')
        flip = bpy.props.BoolProperty(name='Reverse Order', default=False, description='Reverse selecting order')
    
        @classmethod
        def poll(cls, context):
            return (context.object and context.object.type == 'MESH')
    
        def draw(self, context):
            layout = self.layout
            layout.prop(self,'indice', slider=True)
            layout.prop(self,'delta')
            layout.prop(self,'flip')
    
        def execute(self, context):
            obj = bpy.context.object
            mode = [a for a in bpy.context.tool_settings.mesh_select_mode]
            if mode != [False, False, True]:
                bpy.context.tool_settings.mesh_select_mode = [False, False, True]
            fac = obj.data.polygons
            sel = []
            for f in fac:
                sel.append((f.area, f.index))
            sel.sort(reverse=self.flip)
            print (sel)
            bpy.ops.object.mode_set()
            valor = round(len(sel) / 100 * self.indice)
            if self.delta:
                for i in range(len(sel[:valor])):
                    fac[sel[i][1]].select = True
            else:
                for i in range(len(sel[:valor])):
                    if self.flip:
                        fac[len(sel)-i-1].select = True
                    else:
                        fac[i].select = True
            bpy.ops.object.mode_set(mode='EDIT')
            return {'FINISHED'}
    
    class GUI(bpy.types.Panel):
        bl_label = 'Select mesh data'
        bl_space_type = 'VIEW_3D'
        bl_region_type = 'TOOLS'
    
        def draw(self, context):
            layout = self.layout
            row = layout.row(align=True)
            row.operator('mesh.select_vert_index')
            row.operator('mesh.select_edge_index')
            row.operator('mesh.select_face_index')
    
    def register():
        bpy.utils.register_class(SelVert)
        bpy.utils.register_class(SelEdge)
        bpy.utils.register_class(SelFace)
        bpy.utils.register_class(GUI)
    
    def unregister():
        bpy.utils.unregister_class(SelVert)
        bpy.utils.unregister_class(SelEdge)
        bpy.utils.unregister_class(SelFace)
        bpy.utils.unregister_class(GUI)
    
    if __name__ == '__main__':
        register()