Rework: Proportional Editing Pie #3

Merged
Demeter Dzadik merged 2 commits from demeters_branch into main 2024-08-21 02:30:19 +02:00
Showing only changes of commit 1c48ab2622 - Show all commits

View File

@ -3,291 +3,31 @@
# SPDX-License-Identifier: GPL-2.0-or-later
from bpy.types import (
Menu,
Operator,
)
from bpy.types import Menu, Operator
from bpy.props import StringProperty
from .hotkeys import register_hotkey
# Proportional Edit Object
class PIE_OT_ProportionalEditObj(Operator):
bl_idname = "proportional_obj.active"
bl_label = "Proportional Edit Object"
class PIE_OT_set_proportional_falloff(Operator):
"""Enable proportional editing and set the falloff curve"""
bl_idname = "object.set_proportional_falloff"
bl_label = "Set Proportional Editing Falloff"
bl_options = {'REGISTER', 'UNDO'}
falloff_shape: StringProperty()
def execute(self, context):
ts = context.tool_settings
if ts.use_proportional_edit_objects is True:
ts.use_proportional_edit_objects = False
elif ts.use_proportional_edit_objects is False:
if context.mode == 'OBJECT':
ts.use_proportional_edit_objects = True
else:
ts.use_proportional_edit = True
ts.proportional_edit_falloff = self.falloff_shape
return {'FINISHED'}
class PIE_OT_ProportionalSmoothObj(Operator):
bl_idname = "proportional_obj.smooth"
bl_label = "Proportional Smooth Object"
bl_options = {'REGISTER', 'UNDO'}
def execute(self, context):
ts = context.tool_settings
if ts.use_proportional_edit_objects is False:
ts.use_proportional_edit_objects = True
ts.proportional_edit_falloff = 'SMOOTH'
if ts.proportional_edit_falloff != 'SMOOTH':
ts.proportional_edit_falloff = 'SMOOTH'
return {'FINISHED'}
class PIE_OT_ProportionalSphereObj(Operator):
bl_idname = "proportional_obj.sphere"
bl_label = "Proportional Sphere Object"
bl_options = {'REGISTER', 'UNDO'}
def execute(self, context):
ts = context.tool_settings
if ts.use_proportional_edit_objects is False:
ts.use_proportional_edit_objects = True
ts.proportional_edit_falloff = 'SPHERE'
if ts.proportional_edit_falloff != 'SPHERE':
ts.proportional_edit_falloff = 'SPHERE'
return {'FINISHED'}
class PIE_OT_ProportionalRootObj(Operator):
bl_idname = "proportional_obj.root"
bl_label = "Proportional Root Object"
bl_options = {'REGISTER', 'UNDO'}
def execute(self, context):
ts = context.tool_settings
if ts.use_proportional_edit_objects is False:
ts.use_proportional_edit_objects = True
ts.proportional_edit_falloff = 'ROOT'
if ts.proportional_edit_falloff != 'ROOT':
ts.proportional_edit_falloff = 'ROOT'
return {'FINISHED'}
class PIE_OT_ProportionalSharpObj(Operator):
bl_idname = "proportional_obj.sharp"
bl_label = "Proportional Sharp Object"
bl_options = {'REGISTER', 'UNDO'}
def execute(self, context):
ts = context.tool_settings
if ts.use_proportional_edit_objects is False:
ts.use_proportional_edit_objects = True
ts.proportional_edit_falloff = 'SHARP'
if ts.proportional_edit_falloff != 'SHARP':
ts.proportional_edit_falloff = 'SHARP'
return {'FINISHED'}
class PIE_OT_ProportionalLinearObj(Operator):
bl_idname = "proportional_obj.linear"
bl_label = "Proportional Linear Object"
bl_options = {'REGISTER', 'UNDO'}
def execute(self, context):
ts = context.tool_settings
if ts.use_proportional_edit_objects is False:
ts.use_proportional_edit_objects = True
ts.proportional_edit_falloff = 'LINEAR'
if ts.proportional_edit_falloff != 'LINEAR':
ts.proportional_edit_falloff = 'LINEAR'
return {'FINISHED'}
class PIE_OT_ProportionalConstantObj(Operator):
bl_idname = "proportional_obj.constant"
bl_label = "Proportional Constant Object"
bl_options = {'REGISTER', 'UNDO'}
def execute(self, context):
ts = context.tool_settings
if ts.use_proportional_edit_objects is False:
ts.use_proportional_edit_objects = True
ts.proportional_edit_falloff = 'CONSTANT'
if ts.proportional_edit_falloff != 'CONSTANT':
ts.proportional_edit_falloff = 'CONSTANT'
return {'FINISHED'}
class PIE_OT_ProportionalRandomObj(Operator):
bl_idname = "proportional_obj.random"
bl_label = "Proportional Random Object"
bl_options = {'REGISTER', 'UNDO'}
def execute(self, context):
ts = context.tool_settings
if ts.use_proportional_edit_objects is False:
ts.use_proportional_edit_objects = True
ts.proportional_edit_falloff = 'RANDOM'
if ts.proportional_edit_falloff != 'RANDOM':
ts.proportional_edit_falloff = 'RANDOM'
return {'FINISHED'}
class PIE_OT_ProportionalInverseSquareObj(Operator):
bl_idname = "proportional_obj.inversesquare"
bl_label = "Proportional Random Object"
bl_options = {'REGISTER', 'UNDO'}
def execute(self, context):
ts = context.tool_settings
if ts.use_proportional_edit_objects is False:
ts.use_proportional_edit_objects = True
ts.proportional_edit_falloff = 'INVERSE_SQUARE'
if ts.proportional_edit_falloff != 'INVERSE_SQUARE':
ts.proportional_edit_falloff = 'INVERSE_SQUARE'
return {'FINISHED'}
# Proportional Edit Edit Mode
class PIE_OT_ProportionalEditEdt(Operator):
bl_idname = "proportional_edt.active"
bl_label = "Proportional Edit EditMode"
bl_options = {'REGISTER', 'UNDO'}
def execute(self, context):
ts = context.tool_settings
ts.use_proportional_edit ^= 1
return {'FINISHED'}
class PIE_OT_ProportionalConnectedEdt(Operator):
bl_idname = "proportional_edt.connected"
bl_label = "Proportional Connected EditMode"
bl_options = {'REGISTER', 'UNDO'}
def execute(self, context):
ts = context.tool_settings
ts.use_proportional_connected ^= 1
return {'FINISHED'}
class PIE_OT_ProportionalProjectedEdt(Operator):
bl_idname = "proportional_edt.projected"
bl_label = "Proportional projected EditMode"
bl_options = {'REGISTER', 'UNDO'}
def execute(self, context):
ts = context.tool_settings
ts.use_proportional_projected ^= 1
return {'FINISHED'}
class PIE_OT_ProportionalSmoothEdt(Operator):
bl_idname = "proportional_edt.smooth"
bl_label = "Proportional Smooth EditMode"
bl_options = {'REGISTER', 'UNDO'}
def execute(self, context):
ts = context.tool_settings
ts.use_proportional_edit = True
ts.proportional_edit_falloff = 'SMOOTH'
return {'FINISHED'}
class PIE_OT_ProportionalSphereEdt(Operator):
bl_idname = "proportional_edt.sphere"
bl_label = "Proportional Sphere EditMode"
bl_options = {'REGISTER', 'UNDO'}
def execute(self, context):
ts = context.tool_settings
ts.use_proportional_edit = True
ts.proportional_edit_falloff = 'SPHERE'
return {'FINISHED'}
class PIE_OT_ProportionalRootEdt(Operator):
bl_idname = "proportional_edt.root"
bl_label = "Proportional Root EditMode"
bl_options = {'REGISTER', 'UNDO'}
def execute(self, context):
ts = context.tool_settings
ts.use_proportional_edit = True
ts.proportional_edit_falloff = 'ROOT'
return {'FINISHED'}
class PIE_OT_ProportionalSharpEdt(Operator):
bl_idname = "proportional_edt.sharp"
bl_label = "Proportional Sharp EditMode"
bl_options = {'REGISTER', 'UNDO'}
def execute(self, context):
ts = context.tool_settings
ts.use_proportional_edit = True
ts.proportional_edit_falloff = 'SHARP'
return {'FINISHED'}
class PIE_OT_ProportionalLinearEdt(Operator):
bl_idname = "proportional_edt.linear"
bl_label = "Proportional Linear EditMode"
bl_options = {'REGISTER', 'UNDO'}
def execute(self, context):
ts = context.tool_settings
ts.use_proportional_edit = True
ts.proportional_edit_falloff = 'LINEAR'
return {'FINISHED'}
class PIE_OT_ProportionalConstantEdt(Operator):
bl_idname = "proportional_edt.constant"
bl_label = "Proportional Constant EditMode"
bl_options = {'REGISTER', 'UNDO'}
def execute(self, context):
ts = context.tool_settings
ts.use_proportional_edit = True
ts.proportional_edit_falloff = 'CONSTANT'
return {'FINISHED'}
class PIE_OT_ProportionalRandomEdt(Operator):
bl_idname = "proportional_edt.random"
bl_label = "Proportional Random EditMode"
bl_options = {'REGISTER', 'UNDO'}
def execute(self, context):
ts = context.tool_settings
ts.use_proportional_edit = True
ts.proportional_edit_falloff = 'RANDOM'
return {'FINISHED'}
class PIE_OT_ProportionalInverseSquareEdt(Operator):
bl_idname = "proportional_edt.inversesquare"
bl_label = "Proportional Inverese Square EditMode"
bl_options = {'REGISTER', 'UNDO'}
def execute(self, context):
ts = context.tool_settings
ts.use_proportional_edit = True
ts.proportional_edit_falloff = 'INVERSE_SQUARE'
return {'FINISHED'}
# Pie ProportionalEditObj - O
class PIE_MT_ProportionalObj(Menu):
class PIE_MT_proportional_edit_obj(Menu):
bl_idname = "PIE_MT_proportional_obj"
bl_label = "Proportional Editing Pie"
@ -295,11 +35,11 @@ class PIE_MT_ProportionalObj(Menu):
layout = self.layout
pie = layout.menu_pie()
# 4 - LEFT
pie.operator("proportional_obj.smooth", text="Smooth", icon='SMOOTHCURVE')
pie.operator("object.set_proportional_falloff", text="Smooth", icon='SMOOTHCURVE').falloff_shape='SMOOTH'
# 6 - RIGHT
pie.operator("proportional_obj.sphere", text="Sphere", icon='SPHERECURVE')
pie.operator("object.set_proportional_falloff", text="Sphere", icon='SPHERECURVE').falloff_shape='SPHERE'
# 2 - BOTTOM
pie.operator("proportional_obj.linear", text="Linear", icon='LINCURVE')
pie.operator("object.set_proportional_falloff", text="Linear", icon='LINCURVE').falloff_shape='LINEAR'
# 8 - TOP
pie.prop(
context.tool_settings,
@ -307,55 +47,51 @@ class PIE_MT_ProportionalObj(Menu):
text="Proportional On/Off",
)
# 7 - TOP - LEFT
pie.operator("proportional_obj.root", text="Root", icon='ROOTCURVE')
pie.operator("object.set_proportional_falloff", text="Root", icon='ROOTCURVE').falloff_shape='ROOT'
# 9 - TOP - RIGHT
pie.operator(
"proportional_obj.inversesquare",
"object.set_proportional_falloff",
text="Inverse Square",
icon='INVERSESQUARECURVE',
)
).falloff_shape='INVERSE_SQUARE'
# 1 - BOTTOM - LEFT
pie.operator("proportional_obj.sharp", text="Sharp", icon='SHARPCURVE')
pie.operator("object.set_proportional_falloff", text="Sharp", icon='SHARPCURVE').falloff_shape='SHARP'
# 3 - BOTTOM - RIGHT
pie.menu("PIE_MT_proportional_moreob", text="More", icon='LINCURVE')
pie.menu("PIE_MT_proportional_moreob", text="More...", icon='THREE_DOTS')
# Pie ProportionalEditEdt - O
class PIE_MT_ProportionalEdt(Menu):
class PIE_MT_proportional_edit_mesh(Menu):
bl_idname = "PIE_MT_proportional_edt"
bl_label = "Proportional Editing Pie"
def draw(self, context):
ts = context.tool_settings
layout = self.layout
pie = layout.menu_pie()
# 4 - LEFT
pie.operator("proportional_edt.smooth", text="Smooth", icon='SMOOTHCURVE')
pie.operator("object.set_proportional_falloff", text="Smooth", icon='SMOOTHCURVE').falloff_shape='SMOOTH'
# 6 - RIGHT
pie.operator("proportional_edt.sphere", text="Sphere", icon='SPHERECURVE')
pie.operator("object.set_proportional_falloff", text="Sphere", icon='SPHERECURVE').falloff_shape='SPHERE'
# 2 - BOTTOM
pie.operator(
"proportional_edt.inversesquare",
"object.set_proportional_falloff",
text="Inverse Square",
icon='INVERSESQUARECURVE',
)
).falloff_shape='INVERSE_SQUARE'
# 8 - TOP
pie.operator(
"proportional_edt.active", text="Proportional On/Off", icon='PROP_ON'
)
pie.prop(ts, "use_proportional_edit", text="Toggle Proportional", icon='PROP_ON')
# 7 - TOP - LEFT
pie.operator("proportional_edt.connected", text="Connected", icon='PROP_CON')
pie.prop(ts, "use_proportional_connected", text="Toggle Connected", icon='PROP_CON')
# 9 - TOP - RIGHT
pie.operator(
"proportional_edt.projected", text="Projected", icon='PROP_PROJECTED'
)
pie.prop(ts, "use_proportional_projected", text="Toggle Projected", icon='PROP_PROJECTED')
# 1 - BOTTOM - LEFT
pie.operator("proportional_edt.root", text="Root", icon='ROOTCURVE')
pie.operator("object.set_proportional_falloff", text="Root", icon='ROOTCURVE').falloff_shape='ROOT'
# 3 - BOTTOM - RIGHT
pie.menu("PIE_MT_proportional_more", text="More", icon='LINCURVE')
pie.menu("PIE_MT_proportional_more", text="More...", icon='THREE_DOTS')
# Pie ProportionalEditEdt - O
class PIE_MT_ProportionalMore(Menu):
class PIE_MT_proportional_edit_mesh_more(Menu):
bl_idname = "PIE_MT_proportional_more"
bl_label = "More Falloff Shapes"
@ -363,14 +99,13 @@ class PIE_MT_ProportionalMore(Menu):
layout = self.layout
pie = layout.menu_pie()
box = pie.split().column()
box.operator("proportional_edt.sharp", text="Sharp", icon='SHARPCURVE')
box.operator("proportional_edt.linear", text="Linear", icon='LINCURVE')
box.operator("proportional_edt.constant", text="Constant", icon='NOCURVE')
box.operator("proportional_edt.random", text="Random", icon='RNDCURVE')
box.operator("object.set_proportional_falloff", text="Sharp", icon='SHARPCURVE').falloff_shape='SHARP'
box.operator("object.set_proportional_falloff", text="Linear", icon='LINCURVE').falloff_shape='LINEAR'
box.operator("object.set_proportional_falloff", text="Constant", icon='NOCURVE').falloff_shape='CONSTANT'
box.operator("object.set_proportional_falloff", text="Random", icon='RNDCURVE').falloff_shape='RANDOM'
# Pie ProportionalEditEdt2
class PIE_MT_proportionalmoreob(Menu):
class PIE_MT_proportional_edit_obj_more(Menu):
bl_idname = "PIE_MT_proportional_moreob"
bl_label = "Proportional Falloffs"
@ -378,35 +113,16 @@ class PIE_MT_proportionalmoreob(Menu):
layout = self.layout
pie = layout.menu_pie()
box = pie.split().column()
box.operator("proportional_obj.constant", text="Constant", icon='NOCURVE')
box.operator("proportional_obj.random", text="Random", icon='RNDCURVE')
box.operator("object.set_proportional_falloff", text="Constant", icon='NOCURVE').falloff_shape='CONSTANT'
box.operator("object.set_proportional_falloff", text="Random", icon='RNDCURVE').falloff_shape='RANDOM'
registry = (
PIE_OT_ProportionalEditObj,
PIE_OT_ProportionalSmoothObj,
PIE_OT_ProportionalSphereObj,
PIE_OT_ProportionalRootObj,
PIE_OT_ProportionalSharpObj,
PIE_OT_ProportionalLinearObj,
PIE_OT_ProportionalConstantObj,
PIE_OT_ProportionalRandomObj,
PIE_OT_ProportionalInverseSquareObj,
PIE_OT_ProportionalEditEdt,
PIE_OT_ProportionalConnectedEdt,
PIE_OT_ProportionalProjectedEdt,
PIE_OT_ProportionalSmoothEdt,
PIE_OT_ProportionalSphereEdt,
PIE_OT_ProportionalRootEdt,
PIE_OT_ProportionalSharpEdt,
PIE_OT_ProportionalLinearEdt,
PIE_OT_ProportionalConstantEdt,
PIE_OT_ProportionalRandomEdt,
PIE_OT_ProportionalInverseSquareEdt,
PIE_MT_ProportionalObj,
PIE_MT_ProportionalEdt,
PIE_MT_ProportionalMore,
PIE_MT_proportionalmoreob,
PIE_OT_set_proportional_falloff,
PIE_MT_proportional_edit_obj,
PIE_MT_proportional_edit_mesh,
PIE_MT_proportional_edit_mesh_more,
PIE_MT_proportional_edit_obj_more,
)
@ -419,7 +135,7 @@ def register():
)
register_hotkey(
'wm.call_menu_pie',
op_kwargs={'name': 'PIE_MT_proportional_obj'},
op_kwargs={'name': 'PIE_MT_proportional_edt'},
hotkey_kwargs={'type': "O", 'value': "PRESS", 'shift': True},
key_cat="Mesh",
)