Keyframes fast selection

Question

Hi there!

Following this video from Wayne: https://www.youtube.com/watch?v=nmg21jX9IpE

I finished my blocking but when I key every second frame to get the animation down to twos (roughly at the 5 minute mark from his video), the keys don't remain selected. I think it's actually from the recent updates to Blender 4.2 or 4.3... 

Any suggestions to make the selection of every other keyframe less painful?

1 love
Reply
  • Dwayne Savage(dillenbata3) replied

    One more time, I swear I am human. 

    Try selecting the a few keyframes then use shift+r to repeat the pattern of selection. I don't know if blender will detect that pattern but that's all I've got.

    1 love
  • Nathi Tappan(nathitappan) replied

    Lol... I'll take your word for it Dwayne.

    That was a great idea, but unfortunately it didn't pan out. I did it manually, it was only 8 seconds of animation. But if anyone knows the way, let me know... cause I definitely don't want to do it again if I can avoid it.

    1 love
  • Dwayne Savage(dillenbata3) replied

    Sorry about that, but Everytime I tried to post it kept telling me I wasn't human. 

    1 love
  • Dwayne Savage(dillenbata3) replied

    Found a solution: https://blender.stackexchange.com/questions/264754/how-to-deselect-one-keyframe-every-nth-on-a-multiple-objects-selection

    You have to enable Developer extra and then use F3 to search for Deselect. It has every 2, every 3, and every 4. I've tested on 4.2 and 4.4 and seems to work fine. If I find the time I'll see if I can link the operations to a menu. 

    1 love
  • Dwayne Savage(dillenbata3) replied

    ***Edit*** Forgot to mention I added to the select menu on the dopesheet editor.

    Well, that was surprisingly easy. I just added an append to the register and a remove in the unregister.

    bpy.types.DOPESHEET_MT_select.append(menu_func)
    bpy.types.DOPESHEET_MT_select.remove(menu_func)

    So the whole script is:

    bl_info = {
        "name": "Partial Deselect",
        "blender": (3, 0, 0),
        "category": "Object",
    }
    
    import bpy
    def main(context, nthkey=2):         for action in bpy.data.actions:             for channel in action.fcurves:                 for key in channel.keyframe_points.values()[0::nthkey]:                     key.select_control_point = False                     key.select_left_handle = False                     key.select_right_handle = False
    class ChannelSelect4Key(bpy.types.Operator):     """Partial deSelect""" # Use this as a tooltip for menu items and buttons.     bl_idname = "anim.channel_select_4th"     bl_label = "DeSelect 1 keyframe every 4 keys"     bl_options = {'REGISTER', 'UNDO'} # Enable undo for the operator.     def execute(self, context):         main(context, 4)         return {'FINISHED'}
    class ChannelSelect3Key(bpy.types.Operator):     """Partial deSelect""" # Use this as a tooltip for menu items and buttons.     bl_idname = "anim.channel_select_3th"     bl_label = "DeSelect 1 keyframe every 3 keys"     bl_options = {'REGISTER', 'UNDO'} # Enable undo for the operator.     def execute(self, context):         main(context, 3)         return {'FINISHED'}
    class ChannelSelect2Key(bpy.types.Operator):     '''Select odd keys for selected channels in the dopesheet'''     bl_idname = "anim.channel_select_2nd"     bl_label = "DeSelect 1 keyframe every 2 keys (even)"     bl_options = {'REGISTER', 'UNDO'} # Enable undo for the operator.     def execute(self, context):         main(context, 2)         return {'FINISHED'}
    def menu_func(self, context):     self.layout.operator(ChannelSelect4Key.bl_idname)     self.layout.operator(ChannelSelect3Key.bl_idname)     self.layout.operator(ChannelSelect2Key.bl_idname)
    def register():     bpy.utils.register_class(ChannelSelect4Key)     bpy.utils.register_class(ChannelSelect3Key)     bpy.utils.register_class(ChannelSelect2Key)     bpy.types.DOPESHEET_MT_select.append(menu_func)
    def unregister():     bpy.utils.unregister_class(ChannelSelect4Key)     bpy.utils.unregister_class(ChannelSelect3Key)     bpy.utils.unregister_class(ChannelSelect2Key)     bpy.types.DOPESHEET_MT_select.remove(menu_func)
    if __name__ == "__main__":     register()

    Or you can download and install as an addon.

    https://drive.google.com/drive/folders/0B5x4OjbuDbY5fmxRWXprNTItWEVFMmhhTFRCSkFlZ2RuS2YwcW4wMHhQQW04ekdPV25aVms?resourcekey=0-PQxdYmfIoaVYZ96YbJtmnw&usp=sharing

    1 love
  • Nathi Tappan(nathitappan) replied

    Wow! Incredible! Thank you Dwayne, I'll test it out right away!!

    1 love
  • Dwayne Savage(dillenbata3) replied
    No problem. I didn't really do anything other than added the append to menu. They already had everything else. I'd give credit, but I can't figure out where the posters name/ID is on stack exchange. 
    1 love