[Blender 2.8] Select sub-object mode

polycounter lvl 5
Offline / Send Message
Justo polycounter lvl 5
I downloaded Blender 2.8 last week and was looking into adding my own scripts to custom keyboard hotkeys, but there are gaps in my understanding that the Blender documentation, or these conversations I found, isn't explaining well enough to a dumbass like me. 

If I use these three code lines, I can call the subobject mode of an object like I want.

import bpy
bpy.ops.object.editmode_toggle()
bpy.ops.mesh.select_mode(type="EDGE")

So now I want to be able to put this into an addon package of scripts, or at least as an addon, so I can choose in Preferences>Keymap a keyboard shortcut for this command. Thing is, apparently the syntax doesnt work like this if I want to install these code lines, because I get compiler errors. I tried modifying them, but I still can't find the solution after several tries and hours of searching. Can someone tell me what am I missing?  

bl_info = {
"name": "Work Macro", "category": "Object", } import bpy class WorkMacro(bpy.types.Operator): """Work Macro""" bl_idname = "object.work_macro" bl_label = "Work Macro" bl_options = {'REGISTER', 'UNDO'} def execute(self, context): for o in sel: obj = bpy.data.objects.get(o) if obj: obj.select_set(True) bpy.ops.mesh.select_mode(type="EDGE") return {'FINISHED'} # store keymaps here to access after registration addon_keymaps = [] def register(): bpy.utils.register_class(WorkMacro) # handle the keymap wm = bpy.context.window_manager km = wm.keyconfigs.addon.keymaps.new(name='Object Mode', space_type='EMPTY') kmi = km.keymap_items.new(WorkMacro.bl_idname, 'NUMPAD_0', 'PRESS', ctrl=False, shift=False) addon_keymaps.append(km) def unregister(): bpy.utils.unregister_class(WorkMacro) # handle the keymap wm = bpy.context.window_manager for km in addon_keymaps: wm.keyconfigs.addon.keymaps.remove(km) # clear the list del addon_keymaps[:] if __name__ == "__main__": register()

Replies

  • RN
    Offline / Send Message
    RN interpolator
        def execute(self, context):
    for o in sel: obj = bpy.data.objects.get(o) if obj: obj.select_set(True) bpy.ops.mesh.select_mode(type="EDGE")

    return {'FINISHED'}
    The indentation is wrong, the "def execute(...)" starts one indent level, so everything below it, up to the "return {'FINISHED'}", should have the same indentation. The "return" line is correct, the rest isn't.

  • RN
    Offline / Send Message
    RN interpolator
    Wow, code pasting in this forum is totally messed up.
    Anyway, the correct indentation is this:
            def execute(self, context):
    for o in sel:
    obj = bpy.data.objects.get(o)
    if obj:
    obj.select_set(True)
    bpy.ops.mesh.select_mode(type="EDGE")
    return {'FINISHED'}
    Python doesn't use curly brackets, like C++ or Javascript do, to know when a block scope starts/ends, it only relies on indentation. 
    You should use a text editor that supports automatic indentation, something like Notepad++ (Windows only).

  • Justo
    Offline / Send Message
    Justo polycounter lvl 5
    @RN Hey Rafael, thanks for replying. Yeah, I learned the hard way how much indentation matters for these scripts. I was able to get what I wanted and way more with maxivz's new Blender tools that he released last week.
Sign In or Register to comment.