Advertisement
Guest User

Untitled

a guest
Jun 10th, 2020
898
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.05 KB | None | 0 0
  1. bl_info = {
  2.     "name": "Set Origin to Bottom Centre",
  3.     "description": "Adds \"Bottom Centre\" to the Set Origin's submenu.",
  4.     "author" : "batFINGER",
  5.     "version": (1, 0, 0),
  6.     "location": "View3D > Object > Set Origin",
  7.     "blender": (2, 80, 0),
  8.     "tracker_url": "https://blender.stackexchange.com/a/182082/66364",
  9.     "category": "Object",
  10. }
  11.  
  12. import bpy
  13. from bpy.props import EnumProperty
  14. from mathutils import Vector, Matrix
  15.  
  16. def origin_to_bottom(ob, matrix=Matrix()):
  17.     me = ob.data
  18.     mw = ob.matrix_world
  19.     local_verts = [matrix @ Vector(v[:]) for v in ob.bound_box]
  20.     o = sum(local_verts, Vector()) / 8
  21.     o.z = min(v.z for v in local_verts)
  22.     o = matrix.inverted() @ o
  23.     me.transform(Matrix.Translation(-o))
  24.  
  25.     mw.translation = mw @ o
  26.  
  27. def main(context, origin_type):
  28.     for ob in context.selected_objects:
  29.         if origin_type == 'BOTTOM_CENTRE':
  30.             origin_to_bottom(ob)
  31.         else:
  32.             print(f"Add code for {origin_type}")
  33.  
  34. class SimpleOperator(bpy.types.Operator):
  35.     """Tooltip"""
  36.     #bl_idname = "object.simple_operator"
  37.     bl_idname = "object.origin_set"  # override the old one
  38.     bl_label = "Simple Object Operator"
  39.  
  40.     def items():
  41.         items = []
  42.         rna = bpy.ops.object.origin_set.get_rna_type()
  43.         for i in rna.properties['type'].enum_items:
  44.             items.append((i.identifier, i.name, i.description))
  45.         items.append(('BOTTOM_CENTRE', "Bottom Centre", "Set origin to Bottom Centre"))
  46.         return items
  47.  
  48.     type : EnumProperty(items=items(), default='GEOMETRY_ORIGIN')
  49.  
  50.     @classmethod
  51.     def poll(cls, context):
  52.         return context.active_object is not None
  53.  
  54.     def execute(self, context):
  55.         main(context, self.type)
  56.         return {'FINISHED'}
  57.  
  58. def draw_menu(self, context):
  59.     self.layout.operator_menu_enum("object.simple_operator", "type")
  60.  
  61. def register():
  62.     #bpy.types.VIEW3D_MT_object.prepend(draw_menu)
  63.     bpy.utils.register_class(SimpleOperator)
  64.  
  65. def unregister():
  66.     bpy.utils.unregister_class(SimpleOperator)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement