Monday, January 29, 2024

class to help with selecting vertices in Blender

this is a simple python class to help with different ways of selecting vertices. tested in Blender 2.79.

it allows for growing/shrinking/selecting linked vertices - which could be useful if wanted to do these operations when for example painting weights in weight paint mode. (there may be bugs so please modify/use at your own risk)


import bpy

class VertexSelector(object):
    """class to help with various ways of selecting vertices - tested in blender 2.79
    
    ex:
    vs = VertexSelector()
    vs.linked()
    #or
    #vs.more()
    #or
    #vs.less()
    """
    def __init__(self):
        pass
    def more(self):
        """grow selection
        """
        curMode = self._getMode()
        if curMode != "EDIT":
            self._enterMode(mode="EDIT")
        
        #do task
        bpy.ops.mesh.select_more()

        #return to previous mode
        self._enterMode(mode=curMode)
        
    def less(self):
        """lessen selection
        """
        curMode = self._getMode()
        if curMode != "EDIT":
            self._enterMode(mode="EDIT")
        
        #do task
        bpy.ops.mesh.select_less()

        #return to previous mode
        self._enterMode(mode=curMode)
    
    def linked(self):
        """select linked vertices
        """
        curMode = self._getMode()
        if curMode != "EDIT":
            self._enterMode(mode="EDIT")
        
        #do task
        bpy.ops.mesh.select_linked(delimit=set())

        #return to previous mode
        self._enterMode(mode=curMode)
        
    def _enterMode(self, mode="EDIT"):
        """enter given blender mode
        """
        curMode = self._getMode()
        if curMode != mode:
            #handle weight paint
            if mode in ["PAINT_WEIGHT", "WEIGHT_PAINT"]:
                bpy.ops.object.mode_set(mode="WEIGHT_PAINT", toggle=False)
                return
            #handle all other cases   
            bpy.ops.object.mode_set(mode=mode, toggle=False)
            
    def _getMode(self):
        return bpy.context.mode


Happy Scripting! and Happy Sketching!