OSDN Git Service

fix bone connection.
[meshio/meshio.git] / swig / blender / pmd_import.py
index 2b2c056..074a898 100755 (executable)
@@ -29,6 +29,7 @@ This script imports a pmd into Blender for editing.
 1.4 20100623: fix constraint name.
 1.5 20100626: refactoring.
 1.6 20100629: sphere map.
+1.7 20100703: implement bone group.
 """
 
 MMD_SHAPE_GROUP_NAME='_MMD_SHAPE'
@@ -318,7 +319,8 @@ def __build(armature, b, p, parent):
             else:
                 print('diffurence with parent.tail and head', name)
 
-        bl.bone.setConnected(bone)
+        if b.type!=9:
+            bl.bone.setConnected(bone)
         # armature layer 2
         bl.bone.setLayerMask(bone, [0, 1])
     else:
@@ -338,14 +340,15 @@ def __build(armature, b, p, parent):
 
 
 def __importArmature(scene, l):
-    # build bone
     armature, armature_object=bl.armature.create()
+
+    # build bone
     bl.armature.makeEditable(armature_object)
     for b in l.bones:
         if not b.parent:
             __build(armature, b, None, None)
     bl.armature.update(armature)
-    bl.exitEditMode()
+    bl.enterObjectMode()
 
     # IK constraint
     pose = bl.object.getPose(armature_object)
@@ -371,7 +374,35 @@ def __importArmature(scene, l):
 
     bl.armature.makeEditable(armature_object)
     bl.armature.update(armature)
-    bl.exitEditMode()
+    bl.enterObjectMode()
+
+    if isBlender24():
+        pass
+    else:
+        # create bone group
+        for i, g in enumerate(l.bone_group_list):
+            name=englishmap.getEnglishBoneGroupName(g.getName().strip())
+            if not name:
+                name=g.getName()
+            bl.object.createBoneGroup(armature_object, name, "THEME%02d" % (i+1))
+
+        # assign bone to group
+        for b_index, g_index in l.bone_display_list:
+            # bone
+            b=l.bones[b_index]
+            bone_name=englishmap.getEnglishBoneName(b.getName())
+            if not bone_name:
+                bone_name=b.getName()
+            # group
+            g=l.bone_group_list[g_index-1]
+            group_name=englishmap.getEnglishBoneGroupName(g.getName().strip())
+            if not group_name:
+                group_name=g.getName()
+
+            # assign
+            pose.bones[bone_name].bone_group=pose.bone_groups[group_name]
+
+        bl.enterObjectMode()
 
     return armature_object