CM3D2 Converter.misc_DATA_PT_vertex_groups
1# 「プロパティ」エリア → 「メッシュデータ」タブ → 「頂点グループ」パネル 2import re 3import bpy 4from . import common 5from . import compat 6 7 8# メニュー等に項目追加 9def menu_func(self, context): 10 ob = context.active_object 11 if not ob or len(ob.vertex_groups) == 0 and ob.type != 'MESH': 12 return 13 14 flag = False 15 for vertex_group in ob.vertex_groups: 16 if not flag and re.search(r'[_ ]([rRlL])[_ ]', vertex_group.name): 17 flag = True 18 if not flag and vertex_group.name.count('*') == 1: 19 if re.search(r'\.([rRlL])$', vertex_group.name): 20 flag = True 21 if flag: 22 col = self.layout.column(align=True) 23 col.label(text="CM3D2用 頂点グループ名変換", icon_value=common.kiss_icon()) 24 row = col.row(align=True) 25 row.operator('object.decode_cm3d2_vertex_group_names', icon='BLENDER', text="CM3D2 → Blender") 26 row.operator('object.encode_cm3d2_vertex_group_names', icon_value=common.kiss_icon(), text="Blender → CM3D2") 27 break 28 29 30@compat.BlRegister() 31class CNV_OT_decode_cm3d2_vertex_group_names(bpy.types.Operator): 32 bl_idname = 'object.decode_cm3d2_vertex_group_names' 33 bl_label = "頂点グループ名をCM3D2用→Blender用に変換" 34 bl_description = "CM3D2で使われてるボーン名(頂点グループ名)をBlenderで左右対称編集できるように変換します" 35 bl_options = {'REGISTER', 'UNDO'} 36 37 @classmethod 38 def poll(cls, context): 39 import re 40 ob = context.active_object 41 if ob and ob.type == 'MESH': 42 if ob.vertex_groups.active: 43 for vg in ob.vertex_groups: 44 if re.search(r'[_ ]([rRlL])[_ ]', vg.name): 45 return True 46 return False 47 48 def execute(self, context): 49 ob = context.active_object 50 me = ob.data 51 convert_count = 0 52 context.window_manager.progress_begin(0, len(ob.vertex_groups)) 53 for vg_index, vg in enumerate(ob.vertex_groups[:]): 54 context.window_manager.progress_update(vg_index) 55 vg_name = common.decode_bone_name(vg.name) 56 if vg_name != vg.name: 57 if vg_name in ob.vertex_groups: 58 target_vg = ob.vertex_groups[vg_name] 59 for vert in me.vertices: 60 try: 61 weight = vg.weight(vert.index) 62 except: 63 weight = 0.0 64 try: 65 target_weight = target_vg.weight(vert.index) 66 except: 67 target_weight = 0.0 68 if 0.0 < weight + target_weight: 69 target_vg.add([vert.index], weight + target_weight, 'REPLACE') 70 ob.vertex_groups.remove(vg) 71 else: 72 vg.name = vg_name 73 convert_count += 1 74 if convert_count == 0: 75 self.report(type={'WARNING'}, message="変換できる名前が見つかりませんでした") 76 else: 77 self.report(type={'INFO'}, message="頂点グループ名をBlender用に変換しました") 78 context.window_manager.progress_end() 79 return {'FINISHED'} 80 81 82@compat.BlRegister() 83class CNV_OT_encode_cm3d2_vertex_group_names(bpy.types.Operator): 84 bl_idname = 'object.encode_cm3d2_vertex_group_names' 85 bl_label = "頂点グループ名をBlender用→CM3D2用に変換" 86 bl_description = "CM3D2で使われてるボーン名(頂点グループ名)に戻します" 87 bl_options = {'REGISTER', 'UNDO'} 88 89 @classmethod 90 def poll(cls, context): 91 ob = context.active_object 92 if ob and ob.type == 'MESH' and ob.vertex_groups.active: 93 for vg in ob.vertex_groups: 94 if vg.name.count('*') == 1 and re.search(r'\.([rRlL])$', vg.name): 95 return True 96 return False 97 98 def execute(self, context): 99 ob = context.active_object 100 me = ob.data 101 convert_count = 0 102 context.window_manager.progress_begin(0, len(ob.vertex_groups)) 103 for vg_index, vg in enumerate(ob.vertex_groups[:]): 104 context.window_manager.progress_update(vg_index) 105 vg_name = common.encode_bone_name(vg.name) 106 if vg_name != vg.name: 107 if vg_name in ob.vertex_groups: 108 target_vg = ob.vertex_groups[vg_name] 109 for vert in me.vertices: 110 try: 111 weight = vg.weight(vert.index) 112 except: 113 weight = 0.0 114 115 try: 116 target_weight = target_vg.weight(vert.index) 117 except: 118 target_weight = 0.0 119 if 0.0 < weight + target_weight: 120 target_vg.add([vert.index], weight + target_weight, 'REPLACE') 121 ob.vertex_groups.remove(vg) 122 else: 123 vg.name = vg_name 124 convert_count += 1 125 if convert_count == 0: 126 self.report(type={'WARNING'}, message="変換できる名前が見つかりませんでした") 127 else: 128 self.report(type={'INFO'}, message="頂点グループ名をCM3D2用に戻しました") 129 context.window_manager.progress_end() 130 return {'FINISHED'}
@compat.BlRegister()
class
CNV_OT_decode_cm3d2_vertex_group_names31@compat.BlRegister() 32class CNV_OT_decode_cm3d2_vertex_group_names(bpy.types.Operator): 33 bl_idname = 'object.decode_cm3d2_vertex_group_names' 34 bl_label = "頂点グループ名をCM3D2用→Blender用に変換" 35 bl_description = "CM3D2で使われてるボーン名(頂点グループ名)をBlenderで左右対称編集できるように変換します" 36 bl_options = {'REGISTER', 'UNDO'} 37 38 @classmethod 39 def poll(cls, context): 40 import re 41 ob = context.active_object 42 if ob and ob.type == 'MESH': 43 if ob.vertex_groups.active: 44 for vg in ob.vertex_groups: 45 if re.search(r'[_ ]([rRlL])[_ ]', vg.name): 46 return True 47 return False 48 49 def execute(self, context): 50 ob = context.active_object 51 me = ob.data 52 convert_count = 0 53 context.window_manager.progress_begin(0, len(ob.vertex_groups)) 54 for vg_index, vg in enumerate(ob.vertex_groups[:]): 55 context.window_manager.progress_update(vg_index) 56 vg_name = common.decode_bone_name(vg.name) 57 if vg_name != vg.name: 58 if vg_name in ob.vertex_groups: 59 target_vg = ob.vertex_groups[vg_name] 60 for vert in me.vertices: 61 try: 62 weight = vg.weight(vert.index) 63 except: 64 weight = 0.0 65 try: 66 target_weight = target_vg.weight(vert.index) 67 except: 68 target_weight = 0.0 69 if 0.0 < weight + target_weight: 70 target_vg.add([vert.index], weight + target_weight, 'REPLACE') 71 ob.vertex_groups.remove(vg) 72 else: 73 vg.name = vg_name 74 convert_count += 1 75 if convert_count == 0: 76 self.report(type={'WARNING'}, message="変換できる名前が見つかりませんでした") 77 else: 78 self.report(type={'INFO'}, message="頂点グループ名をBlender用に変換しました") 79 context.window_manager.progress_end() 80 return {'FINISHED'}
def
execute(self, context):
49 def execute(self, context): 50 ob = context.active_object 51 me = ob.data 52 convert_count = 0 53 context.window_manager.progress_begin(0, len(ob.vertex_groups)) 54 for vg_index, vg in enumerate(ob.vertex_groups[:]): 55 context.window_manager.progress_update(vg_index) 56 vg_name = common.decode_bone_name(vg.name) 57 if vg_name != vg.name: 58 if vg_name in ob.vertex_groups: 59 target_vg = ob.vertex_groups[vg_name] 60 for vert in me.vertices: 61 try: 62 weight = vg.weight(vert.index) 63 except: 64 weight = 0.0 65 try: 66 target_weight = target_vg.weight(vert.index) 67 except: 68 target_weight = 0.0 69 if 0.0 < weight + target_weight: 70 target_vg.add([vert.index], weight + target_weight, 'REPLACE') 71 ob.vertex_groups.remove(vg) 72 else: 73 vg.name = vg_name 74 convert_count += 1 75 if convert_count == 0: 76 self.report(type={'WARNING'}, message="変換できる名前が見つかりませんでした") 77 else: 78 self.report(type={'INFO'}, message="頂点グループ名をBlender用に変換しました") 79 context.window_manager.progress_end() 80 return {'FINISHED'}
Inherited Members
- bpy_types.Operator
- as_keywords
- poll_message_set
- builtins.bpy_struct
- keys
- values
- items
- get
- pop
- as_pointer
- keyframe_insert
- keyframe_delete
- driver_add
- driver_remove
- is_property_set
- property_unset
- is_property_readonly
- is_property_overridable_library
- property_overridable_library_set
- path_resolve
- path_from_id
- type_recast
- bl_rna_get_subclass_py
- bl_rna_get_subclass
- id_properties_ensure
- id_properties_clear
- id_properties_ui
- id_data
@compat.BlRegister()
class
CNV_OT_encode_cm3d2_vertex_group_names83@compat.BlRegister() 84class CNV_OT_encode_cm3d2_vertex_group_names(bpy.types.Operator): 85 bl_idname = 'object.encode_cm3d2_vertex_group_names' 86 bl_label = "頂点グループ名をBlender用→CM3D2用に変換" 87 bl_description = "CM3D2で使われてるボーン名(頂点グループ名)に戻します" 88 bl_options = {'REGISTER', 'UNDO'} 89 90 @classmethod 91 def poll(cls, context): 92 ob = context.active_object 93 if ob and ob.type == 'MESH' and ob.vertex_groups.active: 94 for vg in ob.vertex_groups: 95 if vg.name.count('*') == 1 and re.search(r'\.([rRlL])$', vg.name): 96 return True 97 return False 98 99 def execute(self, context): 100 ob = context.active_object 101 me = ob.data 102 convert_count = 0 103 context.window_manager.progress_begin(0, len(ob.vertex_groups)) 104 for vg_index, vg in enumerate(ob.vertex_groups[:]): 105 context.window_manager.progress_update(vg_index) 106 vg_name = common.encode_bone_name(vg.name) 107 if vg_name != vg.name: 108 if vg_name in ob.vertex_groups: 109 target_vg = ob.vertex_groups[vg_name] 110 for vert in me.vertices: 111 try: 112 weight = vg.weight(vert.index) 113 except: 114 weight = 0.0 115 116 try: 117 target_weight = target_vg.weight(vert.index) 118 except: 119 target_weight = 0.0 120 if 0.0 < weight + target_weight: 121 target_vg.add([vert.index], weight + target_weight, 'REPLACE') 122 ob.vertex_groups.remove(vg) 123 else: 124 vg.name = vg_name 125 convert_count += 1 126 if convert_count == 0: 127 self.report(type={'WARNING'}, message="変換できる名前が見つかりませんでした") 128 else: 129 self.report(type={'INFO'}, message="頂点グループ名をCM3D2用に戻しました") 130 context.window_manager.progress_end() 131 return {'FINISHED'}
def
execute(self, context):
99 def execute(self, context): 100 ob = context.active_object 101 me = ob.data 102 convert_count = 0 103 context.window_manager.progress_begin(0, len(ob.vertex_groups)) 104 for vg_index, vg in enumerate(ob.vertex_groups[:]): 105 context.window_manager.progress_update(vg_index) 106 vg_name = common.encode_bone_name(vg.name) 107 if vg_name != vg.name: 108 if vg_name in ob.vertex_groups: 109 target_vg = ob.vertex_groups[vg_name] 110 for vert in me.vertices: 111 try: 112 weight = vg.weight(vert.index) 113 except: 114 weight = 0.0 115 116 try: 117 target_weight = target_vg.weight(vert.index) 118 except: 119 target_weight = 0.0 120 if 0.0 < weight + target_weight: 121 target_vg.add([vert.index], weight + target_weight, 'REPLACE') 122 ob.vertex_groups.remove(vg) 123 else: 124 vg.name = vg_name 125 convert_count += 1 126 if convert_count == 0: 127 self.report(type={'WARNING'}, message="変換できる名前が見つかりませんでした") 128 else: 129 self.report(type={'INFO'}, message="頂点グループ名をCM3D2用に戻しました") 130 context.window_manager.progress_end() 131 return {'FINISHED'}
Inherited Members
- bpy_types.Operator
- as_keywords
- poll_message_set
- builtins.bpy_struct
- keys
- values
- items
- get
- pop
- as_pointer
- keyframe_insert
- keyframe_delete
- driver_add
- driver_remove
- is_property_set
- property_unset
- is_property_readonly
- is_property_overridable_library
- property_overridable_library_set
- path_resolve
- path_from_id
- type_recast
- bl_rna_get_subclass_py
- bl_rna_get_subclass
- id_properties_ensure
- id_properties_clear
- id_properties_ui
- id_data