diff options
Diffstat (limited to 'space_view3d_pie_menus/pie_origin.py')
-rw-r--r-- | space_view3d_pie_menus/pie_origin.py | 183 |
1 files changed, 177 insertions, 6 deletions
diff --git a/space_view3d_pie_menus/pie_origin.py b/space_view3d_pie_menus/pie_origin.py index 377be27f..53448db2 100644 --- a/space_view3d_pie_menus/pie_origin.py +++ b/space_view3d_pie_menus/pie_origin.py @@ -19,10 +19,10 @@ # <pep8 compliant> bl_info = { - "name": "Hotkey: 'Alt Shift O'", + "name": "Hotkey: 'Ctrl Alt X'", "description": "Origin Snap/Place Menu", "author": "pitiwazou, meta-androcto", - "version": (0, 1, 1), + "version": (0, 1, 2), "blender": (2, 80, 0), "location": "3D View", "warning": "", @@ -57,7 +57,6 @@ class PIE_OT_PivotToSelection(Operator): return {'FINISHED'} - # Pivot to Bottom class PIE_OT_PivotBottom(Operator): bl_idname = "object.pivotobottom" @@ -72,6 +71,39 @@ class PIE_OT_PivotBottom(Operator): return obj is not None and obj.type == "MESH" def execute(self, context): + bpy.ops.object.transform_apply(location=True, rotation=True, scale=True) + bpy.ops.object.origin_set(type='ORIGIN_GEOMETRY') + o = context.active_object + init = 0 + for x in o.data.vertices: + if init == 0: + a = x.co.z + init = 1 + elif x.co.z < a: + a = x.co.z + + for x in o.data.vertices: + x.co.z -= a + + o.location.z += a + + return {'FINISHED'} + + +# Pivot to Bottom +class PIE_OT_PivotBottom_edit(Operator): + bl_idname = "object.pivotobottom_edit" + bl_label = "Pivot To Bottom" + bl_description = ("Set the Pivot Point To Lowest Point\n" + "Needs an Active Object of the Mesh type") + bl_options = {'REGISTER', 'UNDO'} + + @classmethod + def poll(cls, context): + obj = context.active_object + return obj is not None and obj.type == "MESH" + + def execute(self, context): bpy.ops.object.mode_set(mode='OBJECT') bpy.ops.object.transform_apply(location=True, rotation=True, scale=True) bpy.ops.object.origin_set(type='ORIGIN_GEOMETRY') @@ -93,6 +125,118 @@ class PIE_OT_PivotBottom(Operator): return {'FINISHED'} +# Pivot to Cursor Edit Mode +class PIE_OT_PivotToCursor_edit(Operator): + bl_idname = "object.pivot2cursor_edit" + bl_label = "Pivot To Cursor" + bl_description = "Pivot Point To Cursor" + bl_options = {'REGISTER', 'UNDO'} + + @classmethod + def poll(cls, context): + return context.active_object is not None + + def execute(self, context): + bpy.ops.object.mode_set(mode='OBJECT') + bpy.ops.object.origin_set(type='ORIGIN_CURSOR') + bpy.ops.object.mode_set(mode='EDIT') + + return {'FINISHED'} + + +# Origin to Center of Mass Edit Mode +class PIE_OT_OriginToMass_edit(Operator): + bl_idname = "object.origintomass_edit" + bl_label = "Origin" + bl_description = "Origin to Center of Mass" + bl_options = {'REGISTER', 'UNDO'} + + @classmethod + def poll(cls, context): + return context.active_object is not None + + def execute(self, context): + bpy.ops.object.mode_set(mode='OBJECT') + bpy.ops.object.origin_set(type='ORIGIN_CENTER_OF_MASS', center='MEDIAN') + bpy.ops.object.mode_set(mode='EDIT') + + return {'FINISHED'} + + +# Origin to Geometry Edit Mode +class PIE_OT_OriginToGeometry_edit(Operator): + bl_idname = "object.origintogeometry_edit" + bl_label = "Origin to Geometry" + bl_description = "Origin to Geometry" + bl_options = {'REGISTER', 'UNDO'} + + @classmethod + def poll(cls, context): + return context.active_object is not None + + def execute(self, context): + bpy.ops.object.mode_set(mode='OBJECT') + bpy.ops.object.origin_set(type='ORIGIN_GEOMETRY', center='MEDIAN') + bpy.ops.object.mode_set(mode='EDIT') + + return {'FINISHED'} + + +# Origin to Geometry Edit Mode +class PIE_OT_GeometryToOrigin_edit(Operator): + bl_idname = "object.geometrytoorigin_edit" + bl_label = "Geometry to Origin" + bl_description = "Geometry to Origin" + bl_options = {'REGISTER', 'UNDO'} + + @classmethod + def poll(cls, context): + return context.active_object is not None + + def execute(self, context): + bpy.ops.object.mode_set(mode='OBJECT') + bpy.ops.object.origin_set(type='GEOMETRY_ORIGIN', center='MEDIAN') + bpy.ops.object.mode_set(mode='EDIT') + + return {'FINISHED'} + + +# Origin To Selected Edit Mode # +def vfeOrigin_pie(context): + try: + cursorPositionX = context.scene.cursor.location[0] + cursorPositionY = context.scene.cursor.location[1] + cursorPositionZ = context.scene.cursor.location[2] + bpy.ops.view3d.snap_cursor_to_selected() + bpy.ops.object.mode_set() + bpy.ops.object.origin_set(type='ORIGIN_CURSOR', center='MEDIAN') + bpy.ops.object.mode_set(mode='EDIT') + context.scene.cursor.location[0] = cursorPositionX + context.scene.cursor.location[1] = cursorPositionY + context.scene.cursor.location[2] = cursorPositionZ + return True + except: + return False + + +class PIE_OT_SetOriginToSelected_edit(Operator): + bl_idname = "object.setorigintoselected_edit" + bl_label = "Set Origin to Selected" + bl_description = "Set Origin to Selected" + + @classmethod + def poll(cls, context): + return (context.area.type == "VIEW_3D" and context.active_object is not None) + + def execute(self, context): + check = vfeOrigin_pie(context) + if not check: + self.report({"ERROR"}, "Set Origin to Selected could not be performed") + return {'CANCELLED'} + + return {'FINISHED'} + + # Pie Origin/Pivot - Shift + S class PIE_MT_OriginPivot(Menu): bl_idname = "ORIGIN_MT_pivotmenu" @@ -102,12 +246,12 @@ class PIE_MT_OriginPivot(Menu): layout = self.layout obj = context.object pie = layout.menu_pie() - if obj and obj.type == 'MESH': + if obj and obj.type == 'MESH' and obj.mode in {'OBJECT'}: # 4 - LEFT pie.operator("object.origin_set", text="Origin to Center of Mass", icon='NONE').type = 'ORIGIN_CENTER_OF_MASS' # 6 - RIGHT - pie.operator("object.origin_set", text="Origin To 3D Cursor", + pie.operator("object.origin_set", text="Origin to Cursor", icon='PIVOT_CURSOR').type = 'ORIGIN_CURSOR' # 2 - BOTTOM pie.operator("object.pivotobottom", text="Origin to Bottom", @@ -122,6 +266,27 @@ class PIE_MT_OriginPivot(Menu): pie.operator("object.origin_set", text="Origin To Geometry", icon='NONE').type = 'ORIGIN_GEOMETRY' + + elif obj and obj.type == 'MESH' and obj.mode in {'EDIT'}: + # 4 - LEFT + pie.operator("object.origintomass_edit", text="Origin to Center of Mass", + icon='NONE') + # 6 - RIGHT + pie.operator("object.pivot2cursor_edit", text="Origin to Cursor", + icon='PIVOT_CURSOR') + # 2 - BOTTOM + pie.operator("object.pivotobottom_edit", text="Origin to Bottom", + icon='TRIA_DOWN') + # 8 - TOP + pie.operator("object.setorigintoselected_edit", text="Origin To Selected", + icon='SNAP_INCREMENT') + # 7 - TOP - LEFT + pie.operator("object.geometrytoorigin_edit", text="Geometry To Origin", + icon='NONE') + # 9 - TOP - RIGHT + pie.operator("object.origintogeometry_edit", text="Origin To Geometry", + icon='NONE') + else: # 4 - LEFT pie.operator("object.origin_set", text="Origin to Center of Mass", @@ -144,6 +309,12 @@ classes = ( PIE_MT_OriginPivot, PIE_OT_PivotToSelection, PIE_OT_PivotBottom, + PIE_OT_PivotToCursor_edit, + PIE_OT_OriginToMass_edit, + PIE_OT_PivotBottom_edit, + PIE_OT_OriginToGeometry_edit, + PIE_OT_GeometryToOrigin_edit, + PIE_OT_SetOriginToSelected_edit ) addon_keymaps = [] @@ -157,7 +328,7 @@ def register(): if wm.keyconfigs.addon: # Origin/Pivot km = wm.keyconfigs.addon.keymaps.new(name='3D View Generic', space_type='VIEW_3D') - kmi = km.keymap_items.new('wm.call_menu_pie', 'O', 'PRESS', shift=True, alt=True) + kmi = km.keymap_items.new('wm.call_menu_pie', 'X', 'PRESS', ctrl=True, alt=True) kmi.properties.name = "ORIGIN_MT_pivotmenu" addon_keymaps.append((km, kmi)) |