# Listing 5-1. Simple Add-On Template bl_info = { "name": "Simple Add-on Template", "author": "Chris Conlan", "location": "View3D > Tools > Simple Addon", "version": (1, 0, 0), "blender": (2, 7, 8), "description": "Starting point for new add-ons.", "wiki_url": "http://example.com", "category": "Development" } # Custom modules are imported here # See end of chapter example for suggested protocol import bpy # Panels, buttons, operators, menus, and # functions are all declared in this area # A simple Operator class class SimpleOperator(bpy.types.Operator): bl_idname = "object.simple_operator" bl_label = "Print an Encouraging Message" def execute(self, context): print("\n\n####################################################") print("# Add-on and Simple Operator executed successfully!") print("# " + context.scene.encouraging_message) print("####################################################") return {'FINISHED'} @classmethod def register(cls): print("Registered class: %s " % cls.bl_label) # Register properties related to the class here bpy.types.Scene.encouraging_message = bpy.props.StringProperty( name="", description="Message to print to user", default="Have a nice day!") @classmethod def unregister(cls): print("Unregistered class: %s " % cls.bl_label) # Delete parameters related to the class here del bpy.types.Scene.encouraging_message # A simple button and input field in the Tools panel class SimplePanel(bpy.types.Panel): bl_space_type = "VIEW_3D" bl_region_type = "TOOLS" bl_category = "Simple Addon" bl_label = "Call Simple Operator" bl_context = "objectmode" def draw(self, context): self.layout.operator("object.simple_operator", text="Print Encouraging Message") self.layout.prop(context.scene, 'encouraging_message') @classmethod def register(cls): print("Registered class: %s " % cls.bl_label) # Register properties related to the class here. @classmethod def unregister(cls): print("Unregistered class: %s " % cls.bl_label) # Delete parameters related to the class here def register(): # Implicitly register objects inheriting bpy.types in current file and scope #bpy.utils.register_module(__name__) # Or explicitly register objects bpy.utils.register_class(SimpleOperator) bpy.utils.register_class(SimplePanel) print("%s registration complete\n" % bl_info.get('name')) def unregister(): # Always unregister in reverse order to prevent error due to # interdependencies # Explicitly unregister objects # bpy.utils.unregister_class(SimpleOperator) # bpy.utils.unregister_class(SimplePanel) # Or unregister objects inheriting bpy.types in current file and scope bpy.utils.unregister_module(__name__) print("%s unregister complete\n" % bl_info.get('name')) # Only called during development with 'Text Editor -> Run Script' # When distributed as plugin, Blender will directly # and call register() and unregister() if __name__ == "__main__": try: unregister() except Exception as e: # Catch failure to unregister explicitly print(e) pass register()