OSDN Git Service

change rigid name and constraint name
[meshio/pymeshio.git] / blender25-meshio / import_pmd.py
index 8d396f0..ea634c4 100644 (file)
@@ -7,7 +7,7 @@
  Tooltip: 'Import PMD file for MikuMikuDance.'
 """
 __author__= ["ousttrue"]
-__version__= "2.4"
+__version__= "2.5"
 __url__=()
 __bpydoc__="""
 pmd Importer
@@ -37,6 +37,7 @@ This script imports a pmd into Blender for editing.
 2.2 20101005: update for Blender2.54.
 2.3 20101228: update for Blender2.55.
 2.4 20110429: update for Blender2.57b.
+2.5 20110522: implement RigidBody and Constraint.
 """
 bl_addon_info = {
         'category': 'Import/Export',
@@ -68,7 +69,7 @@ RIGID_LINEAR_DAMPING='rigid_linear_damping'
 RIGID_ANGULAR_DAMPING='rigid_angular_damping'
 RIGID_RESTITUTION='rigid_restitution'
 RIGID_FRICTION='rigid_friction'
-CONSTRAINT_NAME='constraint_name'
+CONSTRAINT_NAME='const_name'
 CONSTRAINT_A='const_a'
 CONSTRAINT_B='const_b'
 CONSTRAINT_POS_MIN='const_pos_min'
@@ -94,8 +95,9 @@ try:
 except ImportError:
     # full python
     from .pymeshio import englishmap
-    from .pymeshio import mmd as pmd
-    pmd.IO=pmd.PMDLoader
+    #from .pymeshio import mmd as pmd
+    #pmd.IO=pmd.PMDLoader
+    from .pymeshio import pmd
 
 # for 2.5
 import bpy
@@ -166,21 +168,21 @@ def to_radian(degree):
 
 def get_bone_name(l, index):
     if index==0xFFFF:
-        return l.bones[0].getName()
+        return l.bones[0]._name
 
     if index < len(l.bones):
-        name=englishmap.getEnglishBoneName(l.bones[index].getName())
+        name=englishmap.getEnglishBoneName(l.bones[index]._name)
         if name:
             return name
-        return l.bones[index].getName()
+        return l.bones[index]._name
     print('invalid bone index', index)
-    return l.bones[0].getName()
+    return l.bones[0]._name
 
 
 def get_group_name(g):
-    group_name=englishmap.getEnglishBoneGroupName(g.getName().strip())
+    group_name=englishmap.getEnglishBoneGroupName(g._name.strip())
     if not group_name:
-        group_name=g.getName().strip()
+        group_name=g._name.strip()
     return group_name
 
 
@@ -188,9 +190,8 @@ def __importToonTextures(io, tex_dir):
     mesh, meshObject=bl.mesh.create(TOON_TEXTURE_OBJECT)
     material=bl.material.create(TOON_TEXTURE_OBJECT)
     bl.mesh.addMaterial(mesh, material)
-    for i in range(10):
-        t=io.getToonTexture(i)
-        path=os.path.join(tex_dir, t.getName())
+    for toon in (io.toon_textures._toon_textures[i] for i in range(10)):
+        path=os.path.join(tex_dir, toon)
         texture, image=bl.texture.create(path)
         bl.material.addTexture(material, texture, False)
     return meshObject, material
@@ -233,38 +234,34 @@ def __importShape(obj, l, vertex_map):
             continue
 
         # name
-        name=englishmap.getEnglishSkinName(s.getName())
+        name=englishmap.getEnglishSkinName(s._name)
         if not name:
-            name=s.getName()
+            name=s._name
 
         # 25
         new_shape_key=bl.object.addShapeKey(obj, name)
 
         for index, offset in zip(s.indices, s.pos_list):
             try:
-                vertex_index=vertex_map[base.indices[index]]
-                bl.shapekey.assign(new_shape_key, vertex_index,
-                        mesh.vertices[vertex_index].co+
-                        bl.createVector(*convert_coord(offset)))
+                base_index=base.indices[index]
             except IndexError as msg:
+                print(name)
                 print(msg)
-                print(index, len(base.indices), len(vertex_map))
-                print(len(mesh.vertices))
-                print(base.indices[index])
-                print(vertex_index)
-                break
-            except KeyError:
-                #print 'this mesh not has shape vertices'
-                break
+                print("invalid index %d/%d" % (index, len(base.indices)))
+                continue
+            vertex_index=vertex_map[base_index]
+            bl.shapekey.assign(new_shape_key, vertex_index,
+                    mesh.vertices[vertex_index].co+
+                    bl.createVector(*convert_coord(offset)))
 
     # select base shape
     bl.object.setActivateShapeKey(obj, 0)
 
 
 def __build(armature, b, p, parent):
-    name=englishmap.getEnglishBoneName(b.getName())
+    name=englishmap.getEnglishBoneName(b._name)
     if not name:
-        name=b.getName()
+        name=b._name
 
     bone=bl.armature.createBone(armature, name)
 
@@ -319,9 +316,9 @@ def __importArmature(l):
     pose = bl.object.getPose(armature_object)
     for ik in l.ik_list:
         target=l.bones[ik.target]
-        name = englishmap.getEnglishBoneName(target.getName())
+        name = englishmap.getEnglishBoneName(target._name)
         if not name:
-            name=target.getName()
+            name=target._name
         p_bone = pose.bones[name]
         if not p_bone:
             print('not found', name)
@@ -330,9 +327,9 @@ def __importArmature(l):
             print('over MAX_CHAINLEN', ik, len(ik.children))
             continue
         effector_name=englishmap.getEnglishBoneName(
-                l.bones[ik.index].getName())
+                l.bones[ik.index]._name)
         if not effector_name:
-            effector_name=l.bones[ik.index].getName()
+            effector_name=l.bones[ik.index]._name
 
         constraint=bl.armature.createIkConstraint(armature_object,
                 p_bone, effector_name, ik)
@@ -350,9 +347,9 @@ def __importArmature(l):
     for b_index, g_index in l.bone_display_list:
         # bone
         b=l.bones[b_index]
-        bone_name=englishmap.getEnglishBoneName(b.getName())
+        bone_name=englishmap.getEnglishBoneName(b._name)
         if not bone_name:
-            bone_name=b.getName()
+            bone_name=b._name
         # group
         g=l.bone_group_list[g_index-1]
         group_name=get_group_name(g)
@@ -388,7 +385,7 @@ def __import16MaerialAndMesh(meshObject, l,
         material=createPmdMaterial(m, material_index)
 
         # main texture
-        texture_name=m.getTexture()
+        texture_name=m._texture
         if texture_name!='':
             for i, t in enumerate(texture_name.split('*')):
                 if t in textureMap:
@@ -622,7 +619,7 @@ def __importMaterialAndMesh(io, tex_dir, toon_material):
 def __importConstraints(io):
     print("create constraint")
     container=bl.object.createEmpty('Constraints')
-    layer=[
+    layers=[
         True, False, False, False, False, False, False, False, False, False,
         False, False, False, False, False, False, False, False, False, False,
             ]
@@ -632,25 +629,25 @@ def __importConstraints(io):
     for i, c in enumerate(io.constraints):
         bpy.ops.mesh.primitive_uv_sphere_add(
                 segments=8,
-                rings=4,
+                ring_count=4,
                 size=0.1,
                 location=(c.pos.x, c.pos.z, c.pos.y),
-                layer=layer
+                layers=layers
                 )
         meshObject=bl.object.getActive()
         constraintMeshes.append(meshObject)
         mesh=bl.object.getData(meshObject)
         bl.mesh.addMaterial(mesh, material)
-        meshObject.name='c_%d' % i
+        meshObject.name='c_%03d' % i
         #meshObject.draw_transparent=True
         #meshObject.draw_wire=True
-        meshObject.max_draw_type='SOLID'
+        meshObject.draw_type='SOLID'
         rot=c.rot
         meshObject.rotation_euler=(-rot.x, -rot.z, -rot.y)
 
-        meshObject[CONSTRAINT_NAME]=c.getName()
-        meshObject[CONSTRAINT_A]=io.rigidbodies[c.rigidA].getName()
-        meshObject[CONSTRAINT_B]=io.rigidbodies[c.rigidB].getName()
+        meshObject[CONSTRAINT_NAME]=c._name
+        meshObject[CONSTRAINT_A]=io.rigidbodies[c.rigidA]._name
+        meshObject[CONSTRAINT_B]=io.rigidbodies[c.rigidB]._name
         meshObject[CONSTRAINT_POS_MIN]=VtoV(c.constraintPosMin)
         meshObject[CONSTRAINT_POS_MAX]=VtoV(c.constraintPosMax)
         meshObject[CONSTRAINT_ROT_MIN]=VtoV(c.constraintRotMin)
@@ -668,7 +665,7 @@ def __importRigidBodies(io):
     print("create rigid bodies")
 
     container=bl.object.createEmpty('RigidBodies')
-    layer=[
+    layers=[
         True, False, False, False, False, False, False, False, False, False,
         False, False, False, False, False, False, False, False, False, False,
             ]
@@ -685,21 +682,21 @@ def __importRigidBodies(io):
         if rigid.shapeType==pmd.SHAPE_SPHERE:
             bpy.ops.mesh.primitive_ico_sphere_add(
                     location=(pos.x, pos.z, pos.y),
-                    layer=layer
+                    layers=layers
                     )
             bpy.ops.transform.resize(
                     value=(rigid.w, rigid.w, rigid.w))
         elif rigid.shapeType==pmd.SHAPE_BOX:
             bpy.ops.mesh.primitive_cube_add(
                     location=(pos.x, pos.z, pos.y),
-                    layer=layer
+                    layers=layers
                     )
             bpy.ops.transform.resize(
                     value=(rigid.w, rigid.d, rigid.h))
         elif rigid.shapeType==pmd.SHAPE_CAPSULE:
-            bpy.ops.mesh.primitive_tube_add(
+            bpy.ops.mesh.primitive_cylinder_add(
                     location=(pos.x, pos.z, pos.y),
-                    layer=layer
+                    layers=layers
                     )
             bpy.ops.transform.resize(
                     value=(rigid.w, rigid.w, rigid.h))
@@ -710,11 +707,11 @@ def __importRigidBodies(io):
         mesh=bl.object.getData(meshObject)
         rigidMeshes.append(meshObject)
         bl.mesh.addMaterial(mesh, material)
-        meshObject.name='r_%d' % i
-        meshObject[RIGID_NAME]=rigid.getName()
+        meshObject.name='r_%03d' % i
+        meshObject[RIGID_NAME]=rigid._name
         #meshObject.draw_transparent=True
         #meshObject.draw_wire=True
-        meshObject.max_draw_type='WIRE'
+        meshObject.draw_type='WIRE'
         rot=rigid.rotation
         meshObject.rotation_euler=(-rot.x, -rot.z, -rot.y)
 
@@ -722,9 +719,9 @@ def __importRigidBodies(io):
         meshObject[RIGID_SHAPE_TYPE]=rigid.shapeType
         meshObject[RIGID_PROCESS_TYPE]=rigid.processType
 
-        bone_name = englishmap.getEnglishBoneName(bone.getName())
+        bone_name = englishmap.getEnglishBoneName(bone._name)
         if not bone_name:
-            bone_name=bone.getName()
+            bone_name=bone._name
         meshObject[RIGID_BONE_NAME]=bone_name
 
         meshObject[RIGID_GROUP]=rigid.group
@@ -756,13 +753,13 @@ def _execute(filepath=""):
     bl.progress_set('loaded', 0.1)
 
     # create root object
-    model_name=io.getEnglishName()
+    model_name=io._english_name
     if len(model_name)==0:
-        model_name=io.getName()
+        model_name=io._name
     root=bl.object.createEmpty(model_name)
-    root[MMD_MB_NAME]=io.getName()
-    root[MMD_MB_COMMENT]=io.getComment()
-    root[MMD_COMMENT]=io.getEnglishComment()
+    root[MMD_MB_NAME]=io._name
+    root[MMD_MB_COMMENT]=io._comment
+    root[MMD_COMMENT]=io._english_comment
 
     # toon textures
     tex_dir=os.path.dirname(filepath)