How to create a shortcut for a custom script

Hello all,
I wrote a very simple script, it just toggle between wire/textured display mode of the selected/edited object.
The script is this:

import bpy

myob = bpy.context.active_object

if (myob.draw_type == 'WIRE'):
    myob.draw_type = 'TEXTURED'
else:
    myob.draw_type = 'WIRE'

My question is where I have to put the script, so I can use it also with other scenes, and how to create a shortcut to it in order to speed up things.
Thanks in advance.

make this an operator by deriving the bpy.types.Operator class and add keymapping, example:

import bpy
bl_info = {
    "name": "Manipulator Hotkeys",
    "description": "Bind manipulator modes to keys",
    "author": "CoDEmanX",
    "version": (0, 1),
    "warning": "Rougly written, hope it works.",
    "category": "3D View"
    }
    
class VIEW3D_OT_manipulator_toggle(bpy.types.Operator):
    '''Toggle manipulator mode in 3D View space'''
    bl_idname = "view3d.manipulator_toggle"
    bl_label = "Manipulator Set Mode"
    
    @classmethod
    def poll(cls, context):
        return True
        #return context.space_data.type == 'VIEW_3D'
        
    def execute(self, context):
        
        # Could use context.space_data instead, but works from console etc. this way
        for a in context.screen.areas:
            if a.type == 'VIEW_3D':
                for sp in a.spaces:
                    if sp.type == 'VIEW_3D':
                        sp.show_manipulator = True
                        
                        t = sp.use_manipulator_translate
                        r = sp.use_manipulator_rotate
                        sp.use_manipulator_translate = \
                        sp.use_manipulator_rotate = \
                        sp.use_manipulator_scale = False
                        if t:
                            sp.use_manipulator_rotate = True
                        elif r:
                            sp.use_manipulator_scale = True
                        else:
                            sp.use_manipulator_translate = True
        
        return {'FINISHED'}
        
def register():
    bpy.utils.register_class(VIEW3D_OT_manipulator_toggle)
    
    kc = bpy.context.window_manager.keyconfigs.addon
    if kc:
        km = kc.keymaps.new(name="3D View", space_type="VIEW_3D")
        kmi = km.keymap_items.new('view3d.manipulator_toggle', 'NUMPAD_MINUS', 'PRESS', shift=True)
        # Could pass settings to operator properties here
        #kmi.properties.mode = (False, True, False)
        
def unregister():
    bpy.utils.unregister_class(VIEW3D_OT_manipulator_toggle)
    kc = bpy.context.window_manager.keyconfigs.addon
    if kc:
        km = kc.keymaps["3D View"]
        for kmi in km.keymap_items:
            if kmi.idname == 'view3d.manipulator_toggle':
                km.keymap_items.remove(kmi)
                break
                
if __name__ == "__main__":
    register()

Hi CoDEmanX,
I’m trying to modify your code, just starting from the beginning, but when I install the addon, I cannot turn it on:

import bpy
bl_info = {
	"name": "tkmk Wire Toggle",
	"description": "Toggle between wire and textured mode for selected objects",
	"author": "Thinkinmonkey",
	"version": (1, 0),
	"blender": (2, 63, 0),
	"category": "Object"}

class OBJECT_tkmk_wireToggle(bpy.types.Operator):
	bl_idname = "object.tkmk_wireToggle"
	bl_label = "Wire Textured toggle"

	def execute(self, context):
# Does the main code go here, right?
		return {'FINISHED'}


def register():
	bpy.utils.register_class(OBJECT_tkmk_wireToggle)

def unregister():
	bpy.utils.unregister_class(OBJECT_tkmk_wireToggle)

if __name__ == "__main__":
	register()

What’s wrong?
Thanks again.


import bpy

bl_info = {
    "name": "tkmk Wire Toggle",
    "description": "Toggle between wire and textured mode for selected objects",
    "author": "Thinkinmonkey, CoDEmanX",
    "version": (1, 0),
    "category": "Object"
    }
    
class OBJECT_OT_drawtype_toggle(bpy.types.Operator):
    '''Toggle manipulator mode in 3D View space'''
    bl_idname = "object.drawtype_toggle"
    bl_label = "Manipulator Set Mode"
    
    @classmethod
    def poll(cls, context):
        return context.active_object
        
    def execute(self, context):
        
        ob = context.active_object

        if ob.draw_type == 'WIRE':
            ob.draw_type = 'TEXTURED'
        else:
            ob.draw_type = 'WIRE'
        
        return {'FINISHED'}
        
def register():
    bpy.utils.register_class(OBJECT_OT_drawtype_toggle)
    
    kc = bpy.context.window_manager.keyconfigs.addon
    if kc:
        km = kc.keymaps.new(name="3D View", space_type="VIEW_3D")
        kmi = km.keymap_items.new('object.drawtype_toggle', 'Q', 'PRESS', alt=True)
        # Could pass settings to operator properties here
        #kmi.properties.mode = (False, True, False)
        
def unregister():
    bpy.utils.unregister_class(OBJECT_OT_drawtype_toggle)
    kc = bpy.context.window_manager.keyconfigs.addon
    if kc:
        km = kc.keymaps["3D View"]
        for kmi in km.keymap_items:
            if kmi.idname == 'object.drawtype_toggle':
                km.keymap_items.remove(kmi)
                break
                
if __name__ == "__main__":
    register()

this works :slight_smile:

hotkey is Alt+Q but you can change it of course

Thanks a lot CoDEmanX for the code and explanations.

just if people wonder: we talked on IRC

poll() gets called before execute() gets called. if it returns true, execute() will be executed, but if it returns false, it won’t

i let it return the active object, which means: if there is active_object, then execute, otherwise don’t

After deleting an object, active_object will be None.

If you use the hotkey / operator without the poll(), you’ll get errors, 'cause active_object is None and you’ll get follow up errors like NoneType object has no property “draw_type”

You’re very kind!