Changeset View
Changeset View
Standalone View
Standalone View
rigify/rigs/limbs/arm.py
| import bpy, re | import bpy, re | ||||
| from ..widgets import create_hand_widget, create_gear_widget | from ..widgets import create_hand_widget, create_gear_widget | ||||
| from .ui import create_script | from .ui import create_script | ||||
| from .limb_utils import * | from .limb_utils import * | ||||
| from mathutils import Vector | from mathutils import Vector | ||||
| from ...utils import copy_bone, flip_bone, put_bone, create_cube_widget | from ...utils import copy_bone, put_bone | ||||
| from ...utils import strip_org, strip_mch, make_deformer_name, create_widget | from ...utils import strip_org, strip_mch | ||||
| from ...utils import create_circle_widget, create_sphere_widget, create_line_widget | from ...utils import create_circle_widget, create_sphere_widget, create_line_widget | ||||
| from ...utils import MetarigError, make_mechanism_name, org | from ...utils import make_mechanism_name | ||||
| from ...utils import create_limb_widget, connected_children_names | from ...utils import create_limb_widget, connected_children_names | ||||
| from ...utils import align_bone_y_axis, align_bone_x_axis, align_bone_z_axis | from ...utils import align_bone_x_axis, align_bone_z_axis | ||||
| from ...rig_ui_template import UTILITIES_RIG_ARM, REGISTER_RIG_ARM | |||||
| from ...utils import ControlLayersOption | |||||
| from rna_prop_ui import rna_idprop_ui_prop_get | from rna_prop_ui import rna_idprop_ui_prop_get | ||||
| from ..widgets import create_ikarrow_widget | from ..widgets import create_ikarrow_widget | ||||
| from math import trunc, pi | from math import trunc, pi | ||||
| extra_script = """ | extra_script = """ | ||||
| controls = [%s] | controls = [%s] | ||||
| ctrl = '%s' | ctrl = '%s' | ||||
| Show All 21 Lines | def __init__(self, obj, bone_name, params): | ||||
| )[:3] # The basic limb is the first 3 bones | )[:3] # The basic limb is the first 3 bones | ||||
| self.segments = params.segments | self.segments = params.segments | ||||
| self.bbones = params.bbones | self.bbones = params.bbones | ||||
| self.limb_type = params.limb_type | self.limb_type = params.limb_type | ||||
| self.rot_axis = params.rotation_axis | self.rot_axis = params.rotation_axis | ||||
| self.auto_align_extremity = params.auto_align_extremity | self.auto_align_extremity = params.auto_align_extremity | ||||
| # Assign values to tweak/FK layers props if opted by user | |||||
| if params.tweak_extra_layers: | |||||
| self.tweak_layers = list(params.tweak_layers) | |||||
| else: | |||||
| self.tweak_layers = None | |||||
| if params.fk_extra_layers: | |||||
| self.fk_layers = list(params.fk_layers) | |||||
| else: | |||||
| self.fk_layers = None | |||||
| def orient_org_bones(self): | def orient_org_bones(self): | ||||
| bpy.ops.object.mode_set(mode='EDIT') | bpy.ops.object.mode_set(mode='EDIT') | ||||
| eb = self.obj.data.edit_bones | eb = self.obj.data.edit_bones | ||||
| thigh = self.org_bones[0] | thigh = self.org_bones[0] | ||||
| org_bones = list( | org_bones = list( | ||||
| ▲ Show 20 Lines • Show All 194 Lines • ▼ Show 20 Lines | def create_tweak(self): | ||||
| # Ctrl bones Locks and Widgets | # Ctrl bones Locks and Widgets | ||||
| pb = self.obj.pose.bones | pb = self.obj.pose.bones | ||||
| for t in tweaks['ctrl']: | for t in tweaks['ctrl']: | ||||
| pb[t].lock_rotation = True, False, True | pb[t].lock_rotation = True, False, True | ||||
| pb[t].lock_scale = False, True, False | pb[t].lock_scale = False, True, False | ||||
| create_sphere_widget(self.obj, t, bone_transform_name=None) | create_sphere_widget(self.obj, t, bone_transform_name=None) | ||||
| if self.tweak_layers: | ControlLayersOption.TWEAK.assign(self.params, pb, tweaks['ctrl']) | ||||
| pb[t].bone.layers = self.tweak_layers | |||||
| return tweaks | return tweaks | ||||
| def create_def(self, tweaks): | def create_def(self, tweaks): | ||||
| org_bones = self.org_bones | org_bones = self.org_bones | ||||
| bpy.ops.object.mode_set(mode ='EDIT') | bpy.ops.object.mode_set(mode ='EDIT') | ||||
| eb = self.obj.data.edit_bones | eb = self.obj.data.edit_bones | ||||
| ▲ Show 20 Lines • Show All 263 Lines • ▼ Show 20 Lines | def create_fk(self, parent): | ||||
| pb = self.obj.pose.bones | pb = self.obj.pose.bones | ||||
| pb[ctrls[2]].lock_location = True, True, True | pb[ctrls[2]].lock_location = True, True, True | ||||
| create_limb_widget(self.obj, ctrls[0]) | create_limb_widget(self.obj, ctrls[0]) | ||||
| create_limb_widget(self.obj, ctrls[1]) | create_limb_widget(self.obj, ctrls[1]) | ||||
| create_circle_widget(self.obj, ctrls[2], radius=0.4, head_tail=0.0) | create_circle_widget(self.obj, ctrls[2], radius=0.4, head_tail=0.0) | ||||
| for c in ctrls: | ControlLayersOption.FK.assign(self.params, pb, ctrls) | ||||
| if self.fk_layers: | |||||
| pb[c].bone.layers = self.fk_layers | |||||
| return {'ctrl': ctrls, 'mch': mch} | return {'ctrl': ctrls, 'mch': mch} | ||||
| def org_parenting_and_switch(self, org_bones, ik, fk, parent): | def org_parenting_and_switch(self, org_bones, ik, fk, parent): | ||||
| bpy.ops.object.mode_set(mode='EDIT') | bpy.ops.object.mode_set(mode='EDIT') | ||||
| eb = self.obj.data.edit_bones | eb = self.obj.data.edit_bones | ||||
| # re-parent ORGs in a connected chain | # re-parent ORGs in a connected chain | ||||
| for i, o in enumerate(org_bones): | for i, o in enumerate(org_bones): | ||||
| ▲ Show 20 Lines • Show All 501 Lines • ▼ Show 20 Lines | def generate(self): | ||||
| # Create UI | # Create UI | ||||
| controls_string = ", ".join(["'" + x + "'" for x in controls]) | controls_string = ", ".join(["'" + x + "'" for x in controls]) | ||||
| script = create_script(bones, 'arm') | script = create_script(bones, 'arm') | ||||
| script += extra_script % (controls_string, bones['main_parent'], 'IK_follow', | script += extra_script % (controls_string, bones['main_parent'], 'IK_follow', | ||||
| 'pole_follow', 'pole_follow', 'root/parent', 'root/parent') | 'pole_follow', 'pole_follow', 'root/parent', 'root/parent') | ||||
| return [script] | return { | ||||
| 'script': [script], | |||||
| 'utilities': UTILITIES_RIG_ARM, | |||||
| 'register': REGISTER_RIG_ARM, | |||||
| 'noparent_bones': [bones['ik']['mch_hand'][i] for i in [0,1]], | |||||
| } | |||||
| def add_parameters(params): | def add_parameters(params): | ||||
| """ Add the parameters of this rig type to the | """ Add the parameters of this rig type to the | ||||
| RigifyParameters PropertyGroup | RigifyParameters PropertyGroup | ||||
| """ | """ | ||||
| items = [ | items = [ | ||||
| Show All 24 Lines | def add_parameters(params): | ||||
| params.bbones = bpy.props.IntProperty( | params.bbones = bpy.props.IntProperty( | ||||
| name = 'bbone segments', | name = 'bbone segments', | ||||
| default = 10, | default = 10, | ||||
| min = 1, | min = 1, | ||||
| description = 'Number of segments' | description = 'Number of segments' | ||||
| ) | ) | ||||
| # Setting up extra layers for the FK and tweak | # Setting up extra layers for the FK and tweak | ||||
| params.tweak_extra_layers = bpy.props.BoolProperty( | ControlLayersOption.FK.add_parameters(params) | ||||
| name = "tweak_extra_layers", | ControlLayersOption.TWEAK.add_parameters(params) | ||||
| default = True, | |||||
| description = "" | |||||
| ) | |||||
| params.tweak_layers = bpy.props.BoolVectorProperty( | |||||
| size = 32, | |||||
| description = "Layers for the tweak controls to be on", | |||||
| default = tuple( [ i == 1 for i in range(0, 32) ] ) | |||||
| ) | |||||
| # Setting up extra layers for the FK and tweak | |||||
| params.fk_extra_layers = bpy.props.BoolProperty( | |||||
| name = "fk_extra_layers", | |||||
| default = True, | |||||
| description = "" | |||||
| ) | |||||
| params.fk_layers = bpy.props.BoolVectorProperty( | |||||
| size = 32, | |||||
| description = "Layers for the FK controls to be on", | |||||
| default = tuple( [ i == 1 for i in range(0, 32) ] ) | |||||
| ) | |||||
| def parameters_ui(layout, params): | def parameters_ui(layout, params): | ||||
| """ Create the ui for the rig parameters.""" | """ Create the ui for the rig parameters.""" | ||||
| r = layout.row() | r = layout.row() | ||||
| r.prop(params, "rotation_axis") | r.prop(params, "rotation_axis") | ||||
| if 'auto' not in params.rotation_axis.lower(): | if 'auto' not in params.rotation_axis.lower(): | ||||
| r = layout.row() | r = layout.row() | ||||
| text = "Auto align Hand" | text = "Auto align Hand" | ||||
| r.prop(params, "auto_align_extremity", text=text) | r.prop(params, "auto_align_extremity", text=text) | ||||
| r = layout.row() | r = layout.row() | ||||
| r.prop(params, "segments") | r.prop(params, "segments") | ||||
| r = layout.row() | r = layout.row() | ||||
| r.prop(params, "bbones") | r.prop(params, "bbones") | ||||
| bone_layers = bpy.context.active_pose_bone.bone.layers[:] | ControlLayersOption.FK.parameters_ui(layout, params) | ||||
| ControlLayersOption.TWEAK.parameters_ui(layout, params) | |||||
| for layer in ['fk', 'tweak']: | |||||
| r = layout.row() | |||||
| r.prop(params, layer + "_extra_layers") | |||||
| r.active = params.tweak_extra_layers | |||||
| col = r.column(align=True) | |||||
| row = col.row(align=True) | |||||
| for i in range(8): | |||||
| icon = "NONE" | |||||
| if bone_layers[i]: | |||||
| icon = "LAYER_ACTIVE" | |||||
| row.prop(params, layer + "_layers", index=i, toggle=True, text="", icon=icon) | |||||
| row = col.row(align=True) | |||||
| for i in range(16, 24): | |||||
| icon = "NONE" | |||||
| if bone_layers[i]: | |||||
| icon = "LAYER_ACTIVE" | |||||
| row.prop(params, layer + "_layers", index=i, toggle=True, text="", icon=icon) | |||||
| col = r.column(align=True) | |||||
| row = col.row(align=True) | |||||
| for i in range(8, 16): | |||||
| icon = "NONE" | |||||
| if bone_layers[i]: | |||||
| icon = "LAYER_ACTIVE" | |||||
| row.prop(params, layer + "_layers", index=i, toggle=True, text="", icon=icon) | |||||
| row = col.row(align=True) | |||||
| for i in range(24, 32): | |||||
| icon = "NONE" | |||||
| if bone_layers[i]: | |||||
| icon = "LAYER_ACTIVE" | |||||
| row.prop(params, layer + "_layers", index=i, toggle=True, text="", icon=icon) | |||||
| def create_sample(obj): | def create_sample(obj): | ||||
| # generated by rigify.utils.write_metarig | # generated by rigify.utils.write_metarig | ||||
| bpy.ops.object.mode_set(mode='EDIT') | bpy.ops.object.mode_set(mode='EDIT') | ||||
| arm = obj.data | arm = obj.data | ||||
| bones = {} | bones = {} | ||||
| ▲ Show 20 Lines • Show All 417 Lines • Show Last 20 Lines | |||||