OSDN Git Service

update for blender2.53.
authorousttrue <ousttrue@gmail.com>
Sat, 24 Jul 2010 08:53:41 +0000 (17:53 +0900)
committerousttrue <ousttrue@gmail.com>
Sat, 24 Jul 2010 08:53:41 +0000 (17:53 +0900)
swig/blender/bl24.py
swig/blender/bl25.py
swig/blender/cp.py
swig/blender/mqo_export.py
swig/blender/mqo_import.py
swig/blender/pmd_export.py
swig/blender/pmd_import.py
swig/setup.py

index 9c28140..349e2db 100755 (executable)
@@ -27,6 +27,11 @@ def to_internal_encoding(fn):
             for v in args])
     return newfn
 
+def register():
+    pass
+
+def unregister():
+    pass
 
 SCENE=None
 def initialize(name, scene):
@@ -155,6 +160,11 @@ class object:
         return empty
 
     @staticmethod
+    def each():
+        for o in SCENE.objects:
+            yield o
+
+    @staticmethod
     def makeParent(parent, child):
         parent.makeParent([child])
 
@@ -615,4 +625,3 @@ class constraint:
     def isIKSolver(c):
         return c.type==Blender.Constraint.Type.IKSOLVER
 
-
index d0138b3..47b2465 100755 (executable)
@@ -18,6 +18,12 @@ if os.path.exists(os.path.dirname(sys.argv[0])+"/utf8"):
 else:
     INTERNAL_ENCODING=FS_ENCODING
 
+def register():
+    pass
+
+def unregister():
+    pass
+
 SCENE=None
 def initialize(name, scene):
     global SCENE
@@ -122,6 +128,11 @@ class object:
         return empty
 
     @staticmethod
+    def each():
+        for o in SCENE.objects:
+            yield o
+
+    @staticmethod
     def makeParent(parent, child):
         child.parent=parent
 
@@ -129,7 +140,7 @@ class object:
     def duplicate(o):
         global SCENE
         bpy.ops.object.select_all(action='DESELECT')
-        o.selected=True
+        o.select=True
         SCENE.objects.active=o
         bpy.ops.object.duplicate()
         dumy=SCENE.objects.active
@@ -149,12 +160,12 @@ class object:
 
     @staticmethod
     def select(o):
-        o.selected=True
+        o.select=True
 
     @staticmethod
     def activate(o):
         global SCENE
-        o.selected=True 
+        o.select=True 
         SCENE.objects.active=o
 
     @staticmethod
@@ -178,7 +189,7 @@ class object:
 
     @staticmethod
     def isVisible(o):
-        return o.restrict_view
+        return False if o.hide else True
 
     @staticmethod
     def getShapeKeys(o):
@@ -291,11 +302,14 @@ class texture:
         texture=bpy.data.textures.new(os.path.basename(path))
         texture.type='IMAGE'
         texture=texture.recast_type()
-        image=bpy.data.images.load(path)
-        texture.image=image
         texture.mipmap=True
         texture.interpolation=True
         texture.use_alpha=True
+        try:
+            image=bpy.data.images.load(path)
+        except SystemError:
+            image=bpy.data.images.new('Image')
+        texture.image=image
         return texture, image
 
     @staticmethod
@@ -303,7 +317,7 @@ class texture:
         if  t.type=="IMAGE":
             image=t.image
             if image:
-                return image.filename
+                return image.filepath
 
 
 class material:
@@ -357,7 +371,7 @@ class material:
                     image=texture.image
                     if not image:
                         continue
-                    yield image.filename
+                    yield image.filepath
 
     @staticmethod
     def eachEnalbeTexturePath(m):
@@ -368,7 +382,7 @@ class material:
                     image=texture.image
                     if not image:
                         continue
-                    yield image.filename
+                    yield image.filepath
 
 
 class mesh:
@@ -454,7 +468,7 @@ class mesh:
         enterObjectMode()
 
         for i in remove_vertices:
-            m.verts[i].selected=True
+            m.verts[i].select=True
 
         enterEditMode()
         bpy.ops.mesh.delete(type='VERT')
@@ -636,4 +650,3 @@ class constraint:
     def isIKSolver(c):
         return c.type=='IK'
 
-
index accde24..971459e 100644 (file)
@@ -12,17 +12,19 @@ DST_24=[
 MAP_25={
         "bl24.py": "bl24.py",
         "bl25.py": "bl25.py",
-        "mqo_import.py": "import_scene_mqo.py",
-        "mqo_export.py": "export_scene_mqo.py",
-        "pmd_import.py": "import_scene_pmd.py",
-        "pmd_export.py": "export_scene_pmd.py",
+        "mqo_import.py": "io_import_scene_mqo.py",
+        "mqo_export.py": "io_export_scene_mqo.py",
+        "pmd_import.py": "io_import_scene_pmd.py",
+        "pmd_export.py": "io_export_scene_pmd.py",
         }
 
 DST_25=[
-        "T:/Blender/blender-2.5-alpha2-win32/.blender/scripts/io",
-        "T:/Blender/bf-blender/build2.5/bin/Debug/.blender/scripts/io",
-        "T:/Blender/bf-blender/build2.5git/bin/Release/.blender/scripts/io",
-        "T:/Blender/1340_Release/Release/.blender/scripts/io",
+        #"T:/Blender/blender-2.5-alpha2-win32/.blender/scripts/io",
+        #"T:/Blender/bf-blender/build2.5/bin/Debug/.blender/scripts/io",
+        #"T:/Blender/bf-blender/build2.5git/bin/Release/.blender/scripts/io",
+        #"T:/Blender/1340_Release/Release/.blender/scripts/io",
+        "T:/Blender/bf-blender/build2.5git/bin/Release/2.53/scripts/addons",
+        "T:/Blender/blender-2.53-beta-windows32/2.53/scripts/addons",
         "io",
         ]
 
index 5199baa..f7f2b73 100644 (file)
@@ -9,7 +9,7 @@ Tooltip: 'Save as Metasequoia MQO File'
 """
 __author__= 'ousttrue'
 __url__ = ["http://gunload.web.fc2.com/blender/"]
-__version__= '0.3 2010/06/06'
+__version__= '2.0'
 __bpydoc__ = """\
 This script is an exporter to MQO file format.
 
@@ -22,14 +22,52 @@ Run this script from "File->Export" menu.
 0.3 20100606: integrate 2.4 and 2.5.
 0.4 20100626: refactoring.
 0.5 20100710: add [apply_modifier] option(2.5 only).
+0.6 20100714: remove shape_key when apply_modifier. fix material.
+2.0 20100724: update for Blender2.53.
 """
 
+bl_addon_info = {
+        'category': 'Import/Export',
+        'name': 'Export: Metasequioa Model Format (.mqo)',
+        'author': 'ousttrue',
+        'version': '2.0',
+        'blender': (2, 5, 3),
+        'location': 'File > Export',
+        'description': 'Export to the Metasequioa Model Format (.mqo)',
+        'warning': '', # used for warning icon and text in addons panel
+        'wiki_url': 'http://sourceforge.jp/projects/meshio/wiki/FrontPage',
+        }
+
 import os
 import sys
 
 def isBlender24():
     return sys.version_info[0]<3
 
+
+class MQOMaterial(object):
+    __slots__=[
+            'name', 'shader', 'r', 'g', 'b', 'a',
+            'dif', 'amb', 'emi',
+            ]
+    def __init__(self, name, shader=3):
+        self.name=name
+        self.shader=shader
+        self.r=0.5
+        self.g=0.5
+        self.b=0.5
+        self.a=1
+        self.dif=1
+        self.amb=0
+        self.emi=0
+
+    def __str__(self):
+        return "\"%s\" shader(%d) col(%f %f %f %f) dif(%f) amb(%f) emi(%f)" % (
+                self.name, self.shader, self.r, self.g, self.b, self.a,
+                self.dif, self.amb, self.emi
+                )
+
+
 if isBlender24():
     # for 2.4
     import Blender
@@ -40,8 +78,12 @@ if isBlender24():
     import bl24 as bl
 
     def materialToMqo(m):
-        return "\"%s\" shader(3) col(%f %f %f %f)" % (
-                m.name, m.rgbCol[0], m.rgbCol[1], m.rgbCol[2], m.alpha)
+        material=MQOMaterial(m.name, 3)
+        material.r=m.rgbCol[0]
+        material.g=m.rgbCol[1]
+        material.b=m.rgbCol[2]
+        material.a=m.alpha
+        return material
 
 else:
     # for 2.5
@@ -51,10 +93,14 @@ else:
     import bl25 as bl
 
     def materialToMqo(m):
-        return "\"%s\" shader(3) col(%f %f %f %f)" % (
-                m.name, 
-                m.diffuse_color[0], m.diffuse_color[1], m.diffuse_color[2], 
-                m.alpha)
+        material=MQOMaterial(m.name, 3)
+        material.r=m.diffuse_color[0]
+        material.g=m.diffuse_color[1]
+        material.b=m.diffuse_color[2]
+        material.a=m.alpha
+        material.amb=m.ambient
+        material.emi=m.emit
+        return material
 
 def apply_transform(vec, matrix):
     x, y, z = vec
@@ -162,7 +208,7 @@ class MqoExporter(object):
         # each material    
         io.write("Material %d {\r\n" % (len(self.materials)))
         for m in self.materials:
-            io.write(materialToMqo(m))
+            io.write(str(materialToMqo(m)))
             # ToDo separated alpha texture
             for filename in bl.material.eachTexturePath(m):
                 if len(dirname)>0 and filename.startswith(dirname):
@@ -207,6 +253,9 @@ class MqoExporter(object):
             bpy.ops.object.location_apply()
             # apply modifier
             if self.apply_modifier:
+                # remove shape key
+                while bl.object.hasShapeKey(copyObj):
+                    bpy.ops.object.shape_key_remove()
                 for m in [m for m in copyObj.modifiers]:
                     if m.type=='SOLIDFY':
                         continue
@@ -296,19 +345,9 @@ else:
 
         # List of operator properties, the attributes will be assigned
         # to the class instance from the operator settings before calling.
-
-        path = bpy.props.StringProperty(
-                name="File Path",
-                description="File path used for exporting the MQO file",
-                maxlen= 1024,
-                default= ""
-                )
-        filename = bpy.props.StringProperty(
-                name="File Name", 
-                description="Name of the file.")
-        directory = bpy.props.StringProperty(
-                name="Directory", 
-                description="Directory of the file.")
+        filepath = bpy.props.StringProperty()
+        filename = bpy.props.StringProperty()
+        directory = bpy.props.StringProperty()
 
         scale = bpy.props.FloatProperty(
                 name="Scale", 
@@ -321,15 +360,9 @@ else:
                 description="Would apply modifiers", 
                 default=False)
 
-        check_existing = bpy.props.BoolProperty(
-                name="Check Existing",
-                description="Check and warn on overwriting existing files",
-                default=True,
-                options=set('HIDDEN'))
-
         def execute(self, context):
             execute_25(
-                    self.properties.path, 
+                    self.properties.filepath, 
                     context.scene, 
                     self.properties.scale,
                     self.properties.apply_modifier)
@@ -342,10 +375,12 @@ else:
 
     # register menu
     def menu_func(self, context): 
-        #default_path=bpy.data.filename.replace(".blend", ".mqo")
+        default_path=bpy.data.filepath.replace(".blend", ".mqo")
         self.layout.operator(
                 EXPORT_OT_mqo.bl_idname, 
-                text="Metasequoia (.mqo)")#.path=default_path
+                text="Metasequoia (.mqo)",
+                icon='PLUGIN'
+                ).filepath=default_path
 
     def register():
         bpy.types.register(EXPORT_OT_mqo)
index 630501e..b111ad0 100644 (file)
@@ -8,7 +8,7 @@ Tooltip: 'Import from Metasequoia file format (.mqo)'
 """\r
 __author__=['ousttrue']\r
 __url__ = ["http://gunload.web.fc2.com/blender/"]\r
-__version__= '0.6 2010/05/05'\r
+__version__= '2.0'\r
 __bpydoc__= '''\\r
 \r
 MQO Importer\r
@@ -23,8 +23,21 @@ This script imports a mqo into Blender for editing.
 0.7 20100606: integrate 2.4 and 2.5.\r
 0.8 20100619: fix multibyte object name.\r
 0.9 20100626: refactoring.\r
+2.0 20100724: update for Blender2.53.\r
 '''\r
 \r
+bl_addon_info = {\r
+        'category': 'Import/Export',\r
+        'name': 'Import: Metasequioa Model Format (.mqo)',\r
+        'author': 'ousttrue',\r
+        'version': '2.0',\r
+        'blender': (2, 5, 3),\r
+        'location': 'File > Import',\r
+        'description': 'Import from the Metasequioa Model Format (.mqo)',\r
+        'warning': '', # used for warning icon and text in addons panel\r
+        'wiki_url': 'http://sourceforge.jp/projects/meshio/wiki/FrontPage',\r
+        }\r
+\r
 import os\r
 import sys\r
 \r
@@ -60,7 +73,6 @@ if isBlender24():
 else:\r
     # for 2.5\r
     import bpy\r
-    from bpy.props import *\r
 \r
     # wrapper\r
     import bl25 as bl\r
@@ -654,19 +666,11 @@ else:
 \r
         # List of operator properties, the attributes will be assigned\r
         # to the class instance from the operator settings before calling.\r
+        filepath = bpy.props.StringProperty()\r
+        filename = bpy.props.StringProperty()\r
+        directory = bpy.props.StringProperty()\r
 \r
-        path = StringProperty(\r
-                name="File Path", \r
-                description="File path used for importing the MQO file", \r
-                maxlen= 1024, default= "")\r
-        filename = StringProperty(\r
-                name="File Name", \r
-                description="Name of the file.")\r
-        directory = StringProperty(\r
-                name="Directory", \r
-                description="Directory of the file.")\r
-\r
-        scale = FloatProperty(\r
+        scale = bpy.props.FloatProperty(\r
                 name="Scale", \r
                 description="Scale the MQO by this value", \r
                 min=0.0001, max=1000000.0, \r
@@ -674,7 +678,7 @@ else:
 \r
         def execute(self, context):\r
             execute_25(\r
-                    self.properties.path, \r
+                    self.properties.filepath, \r
                     context.scene, \r
                     self.properties.scale)\r
             return 'FINISHED'\r
@@ -689,7 +693,9 @@ else:
     def menu_func(self, context): \r
         self.layout.operator(\r
                 IMPORT_OT_mqo.bl_idname, \r
-                text="Metasequoia (.mqo)")\r
+                text="Metasequoia (.mqo)",\r
+                icon='PLUGIN'\r
+                )\r
 \r
     def register():\r
         bpy.types.register(IMPORT_OT_mqo)\r
index 67ff836..2e246c9 100644 (file)
@@ -7,7 +7,7 @@
  Tooltip: 'Export PMD file for MikuMikuDance.'
 """
 __author__= ["ousttrue"]
-__version__= "1.6"
+__version__= "2.0"
 __url__=()
 __bpydoc__="""
 pmd Importer
@@ -24,10 +24,27 @@ This script exports a pmd model.
 1.5 20100629: sphere map.
 1.6 20100710: toon texture & bone group.
 1.7 20100711: separate vertex with normal or uv.
+2.0 20100724: update for Blender2.53.
 """
 
+bl_addon_info = {
+        'category': 'Import/Export',
+        'name': 'Export: MikuMikuDance Model Format (.pmd)',
+        'author': 'ousttrue',
+        'version': '2.0',
+        'blender': (2, 5, 3),
+        'location': 'File > Export',
+        'description': 'Export to the MikuMikuDance Model Format (.pmd)',
+        'warning': '', # used for warning icon and text in addons panel
+        'wiki_url': 'http://sourceforge.jp/projects/meshio/wiki/FrontPage',
+        }
+
 MMD_SHAPE_GROUP_NAME='_MMD_SHAPE'
+MMD_MB_NAME='mb_name'
+MMD_MB_COMMENT='mb_comment'
+MMD_COMMENT='comment'
 BASE_SHAPE_NAME='Basis'
+RIGID_NAME='rigid_name'
 RIGID_SHAPE_TYPE='rigid_shape_type'
 RIGID_PROCESS_TYPE='rigid_process_type'
 RIGID_BONE_NAME='rigid_bone_name'
@@ -97,7 +114,6 @@ if isBlender24():
 else:
     # for 2.5
     import bpy
-    from bpy.props import *
     import mathutils
 
     # wrapper
@@ -314,16 +330,12 @@ class IKSolver(object):
 
 
 class OneSkinMesh(object):
-    __slots__=['scene', 'vertexArray', 'morphList', 
-            'rigidbodies',
-            'constraints',
-            ]
-    def __init__(self, scene):
+    __slots__=['vertexArray', 'morphList', 'rigidbodies', 'constraints', ]
+    def __init__(self):
         self.vertexArray=VertexArray()
         self.morphList=[]
         self.rigidbodies=[]
         self.constraints=[]
-        self.scene=scene
 
     def __str__(self):
         return "<OneSkinMesh %s, morph:%d>" % (
@@ -331,7 +343,7 @@ class OneSkinMesh(object):
                 len(self.morphList))
 
     def addMesh(self, obj):
-        if bl.object.isVisible(obj):
+        if not bl.object.isVisible(obj):
             return
         self.__mesh(obj)
         self.__skin(obj)
@@ -494,29 +506,27 @@ class OneSkinMesh(object):
 
         # メッシュのコピーを生成してオブジェクトの行列を適用する
         copyMesh, copyObj=bl.object.duplicate(obj)
-        if len(copyMesh.verts)==0:
-            return
-        # apply transform
-        copyObj.scale=obj.scale
-        bpy.ops.object.scale_apply()
-        copyObj.rotation_euler=obj.rotation_euler
-        bpy.ops.object.rotation_apply()
-        copyObj.location=obj.location
-        bpy.ops.object.location_apply()
-        # apply modifier
-        for m in [m for m in copyObj.modifiers]:
-            if m.type=='SOLIDFY':
-                continue
-            elif m.type=='ARMATURE':
-                continue
-            elif m.type=='MIRROR':
-                bpy.ops.object.modifier_apply(modifier=m.name)
-            else:
-                print(m.type)
-
-        weightMap, secondWeightMap=self.__getWeightMap(copyObj, copyMesh)
-        self.__processFaces(obj.name, copyMesh, weightMap, secondWeightMap)
+        if len(copyMesh.verts)>0:
+            # apply transform
+            copyObj.scale=obj.scale
+            bpy.ops.object.scale_apply()
+            copyObj.rotation_euler=obj.rotation_euler
+            bpy.ops.object.rotation_apply()
+            copyObj.location=obj.location
+            bpy.ops.object.location_apply()
+            # apply modifier
+            for m in [m for m in copyObj.modifiers]:
+                if m.type=='SOLIDFY':
+                    continue
+                elif m.type=='ARMATURE':
+                    continue
+                elif m.type=='MIRROR':
+                    bpy.ops.object.modifier_apply(modifier=m.name)
+                else:
+                    print(m.type)
 
+            weightMap, secondWeightMap=self.__getWeightMap(copyObj, copyMesh)
+            self.__processFaces(obj.name, copyMesh, weightMap, secondWeightMap)
         bl.object.delete(copyObj)
 
     def createEmptyBasicSkin(self):
@@ -628,7 +638,7 @@ class OneSkinMesh(object):
 class Bone(object):
     __slots__=['index', 'name', 'ik_index',
             'pos', 'tail', 'parent_index', 'tail_index', 'type', 'isConnect']
-    def __init__(self, name, pos, tail):
+    def __init__(self, name, pos, tail, isConnect):
         self.index=-1
         self.name=name
         self.pos=pos
@@ -636,7 +646,7 @@ class Bone(object):
         self.parent_index=None
         self.tail_index=None
         self.type=0
-        self.isConnect=False
+        self.isConnect=isConnect
         self.ik_index=0
 
     def __eq__(self, rhs):
@@ -678,20 +688,12 @@ class BoneBuilder(object):
         # get bones
         ####################
         for b in armature.bones.values():
-            if b.name=='center':
-                # root bone
-                bone=Bone(b.name, 
-                        bl.bone.getHeadLocal(b),
-                        bl.bone.getTailLocal(b))
-                self.__addBone(bone)
-                self.__getBone(bone, b)
-
-        for b in armature.bones.values():
-            if not b.parent and b.name!='center':
+            if not b.parent:
                 # root bone
                 bone=Bone(b.name, 
                         bl.bone.getHeadLocal(b),
-                        bl.bone.getTailLocal(b))
+                        bl.bone.getTailLocal(b),
+                        False)
                 self.__addBone(bone)
                 self.__getBone(bone, b)
 
@@ -811,6 +813,7 @@ class BoneBuilder(object):
                 if b.type==6 or b.type==7:
                     # fix tail bone
                     parent=self.bones[b.parent_index]
+                    #print('parnet', parent.name)
                     parent.tail_index=b.index
 
         for b in self.bones:
@@ -842,11 +845,13 @@ class BoneBuilder(object):
         for i, c in enumerate(b.children):
             bone=Bone(c.name, 
                     bl.bone.getHeadLocal(c),
-                    bl.bone.getTailLocal(c))
+                    bl.bone.getTailLocal(c),
+                    bl.bone.isConnected(c))
             self.__addBone(bone)
             if parent:
                 bone.parent_index=parent.index
-                if i==0:
+                #if i==0:
+                if bone.isConnect or (not parent.tail_index and parent.tail==bone.pos):
                     parent.tail_index=bone.index
             self.__getBone(bone, c)
 
@@ -858,33 +863,43 @@ class BoneBuilder(object):
 
 class PmdExporter(object):
 
-    def setup(self, scene):
+    __slots__=[
+            'armatureObj',
+            'oneSkinMesh',
+            'englishName',
+            'englishComment',
+            'name',
+            'comment',
+            'skeleton',
+            ]
+    def setup(self):
         self.armatureObj=None
-        self.scene=scene
 
         # 木構造を構築する
         object_node_map={}
-        for o in scene.objects:
+        for o in bl.object.each():
             object_node_map[o]=Node(o)
-        for o in scene.objects:
-        #for node in object_node_map.values():
+        for o in bl.object.each():
             node=object_node_map[o]
             if node.o.parent:
                 object_node_map[node.o.parent].children.append(node)
 
         # ルートを得る
-        root=object_node_map[scene.objects.active]
+        root=object_node_map[bl.object.getActive()]
+        o=root.o
+        self.englishName=o.name
+        self.englishComment=o[MMD_COMMENT] if MMD_COMMENT in o else 'blender export\n'
+        self.name=o[MMD_MB_NAME] if MMD_MB_NAME in o else 'Blenderエクスポート'
+        self.comment=o[MMD_MB_COMMENT] if MMD_MB_COMMENT in o else 'Blnderエクスポート\n'
 
         # ワンスキンメッシュを作る
-        self.oneSkinMesh=OneSkinMesh(scene)
+        self.oneSkinMesh=OneSkinMesh()
         self.__createOneSkinMesh(root)
         bl.message(self.oneSkinMesh)
         if len(self.oneSkinMesh.morphList)==0:
             # create emtpy skin
             self.oneSkinMesh.createEmptyBasicSkin()
 
-        self.name=root.o.name
-
         # skeleton
         self.skeleton=BoneBuilder()
         self.skeleton.build(self.armatureObj)
@@ -908,10 +923,10 @@ class PmdExporter(object):
         for child in node.children:
             self.__createOneSkinMesh(child)
 
-    def write(self, path, scene):
+    def write(self, path):
         io=pmd.IO()
-        io.name=self.name
-        io.comment="blender export"
+        io.setName(toCP932(self.name))
+        io.setComment(toCP932(self.comment))
         io.version=1.0
 
         # 頂点
@@ -1064,15 +1079,18 @@ class PmdExporter(object):
         #assert(len(io.bones)==len(io.bone_display_list)+1)
 
         # English
-        io.setEnglishName(toCP932("blender export\n"))
-        io.setEnglishComment(toCP932("blender export comment"))
+        io.setEnglishName(toCP932(self.englishName))
+        io.setEnglishComment(toCP932(self.englishComment))
 
         # toon
         toonMeshObject=None
-        for o in scene.objects:
-            if o.name.startswith(TOON_TEXTURE_OBJECT):
-                toonMeshObject=o
-                break
+        for o in bl.object.each():
+            try:
+                if o.name.startswith(TOON_TEXTURE_OBJECT):
+                    toonMeshObject=o
+            except:
+                p(o.name)
+            break
         if toonMeshObject:
             toonMesh=bl.object.getData(toonMeshObject)
             toonMaterial=bl.mesh.getMaterial(toonMesh, 0)
@@ -1089,9 +1107,11 @@ class PmdExporter(object):
         # rigid body
         rigidNameMap={}
         for i, obj in enumerate(self.oneSkinMesh.rigidbodies):
+            name=obj[RIGID_NAME] if RIGID_NAME in obj else obj.name
+            print(name)
             rigidBody=io.addRigidBody()
-            rigidBody.setName(obj.name.encode('cp932'))
-            rigidNameMap[obj.name]=i
+            rigidBody.setName(name.encode('cp932'))
+            rigidNameMap[name]=i
             boneIndex=boneNameMap[obj[RIGID_BONE_NAME]]
             if boneIndex==0:
                 boneIndex=0xFFFF
@@ -1165,24 +1185,23 @@ class PmdExporter(object):
         return io.write(path)
 
 
-def __execute(filename, scene):
-    if not scene.objects.active:
+def __execute(filename):
+    active=bl.object.getActive()
+    if not active:
         print("abort. no active object.")
         return
-
-    active=bl.object.getActive()
     exporter=PmdExporter()
-    exporter.setup(scene)
-    exporter.write(filename, scene)
+    exporter.setup()
+    print(exporter)
+    exporter.write(filename)
     bl.object.activate(active)
 
 
 if isBlender24():
     # for 2.4
     def execute_24(filename):
-        scene = bpy.data.scenes.active
-        bl.initialize('pmd_export', scene)
-        __execute(filename.decode(bl.INTERNAL_ENCODING), scene)
+        bl.initialize('pmd_export', bpy.data.scenes.active)
+        __execute(filename.decode(bl.INTERNAL_ENCODING))
         bl.finalize()
 
     Blender.Window.FileSelector(
@@ -1194,7 +1213,7 @@ else:
     # for 2.5
     def execute_25(filename, scene):
         bl.initialize('pmd_export', scene)
-        __execute(filename, scene)
+        __execute(filename)
         bl.finalize()
 
     # operator
@@ -1205,29 +1224,13 @@ else:
 
         # List of operator properties, the attributes will be assigned
         # to the class instance from the operator settings before calling.
-
-        path = StringProperty(
-                name="File Path",
-                description="File path used for exporting the PMD file",
-                maxlen= 1024,
-                default= ""
-                )
-        filename = StringProperty(
-                name="File Name", 
-                description="Name of the file.")
-        directory = StringProperty(
-                name="Directory", 
-                description="Directory of the file.")
-
-        check_existing = BoolProperty(
-                name="Check Existing",
-                description="Check and warn on overwriting existing files",
-                default=True,
-                options=set('HIDDEN'))
+        filepath = bpy.props.StringProperty()
+        filename = bpy.props.StringProperty()
+        directory = bpy.props.StringProperty()
 
         def execute(self, context):
             execute_25(
-                    self.properties.path, 
+                    self.properties.filepath, 
                     context.scene
                     )
             return 'FINISHED'
@@ -1239,10 +1242,12 @@ else:
 
     # register menu
     def menu_func(self, context): 
-        #default_path=bpy.data.filename.replace(".blend", ".pmd")
+        default_path=bpy.data.filepath.replace(".blend", ".pmd")
         self.layout.operator(
                 EXPORT_OT_pmd.bl_idname, 
-                text="Miku Miku Dance Model(.pmd)")#.path=default_path
+                text="Miku Miku Dance Model(.pmd)",
+                icon='PLUGIN'
+                ).filepath=default_path
 
     def register():
         bpy.types.register(EXPORT_OT_pmd)
index 0dd29a1..a6996be 100755 (executable)
@@ -7,7 +7,7 @@
  Tooltip: 'Import PMD file for MikuMikuDance.'
 """
 __author__= ["ousttrue"]
-__version__= "1.8"
+__version__= "2.0"
 __url__=()
 __bpydoc__="""
 pmd Importer
@@ -31,10 +31,27 @@ This script imports a pmd into Blender for editing.
 1.6 20100629: sphere map.
 1.7 20100703: implement bone group.
 1.8 20100710: implement toon texture.
+1.9 20100718: keep model name, comment.
+2.0 20100724: update for Blender2.53.
 """
+bl_addon_info = {
+        'category': 'Import/Export',
+        'name': 'Import: MikuMikuDance Model Format (.pmd)',
+        'author': 'ousttrue',
+        'version': '2.0',
+        'blender': (2, 5, 3),
+        'location': 'File > Import',
+        'description': 'Import from the MikuMikuDance Model Format (.pmd)',
+        'warning': '', # used for warning icon and text in addons panel
+        'wiki_url': 'http://sourceforge.jp/projects/meshio/wiki/FrontPage',
+        }
 
 MMD_SHAPE_GROUP_NAME='_MMD_SHAPE'
+MMD_MB_NAME='mb_name'
+MMD_MB_COMMENT='mb_comment'
+MMD_COMMENT='comment'
 BASE_SHAPE_NAME='Basis'
+RIGID_NAME='rigid_name'
 RIGID_SHAPE_TYPE='rigid_shape_type'
 RIGID_PROCESS_TYPE='rigid_process_type'
 RIGID_BONE_NAME='rigid_bone_name'
@@ -122,7 +139,6 @@ if isBlender24():
 else:
     # for 2.5
     import bpy
-    from bpy.props import *
     import mathutils
 
     # wrapper
@@ -686,10 +702,8 @@ def __importConstraints(io):
     print("create constraint")
     container=bl.object.createEmpty('Constraints')
     layer=[
-            True, False, False, False, False, False, False, False,
-            False, False, False, False, False, False, False, False,
-            False, False, False, False, False, False, False, False,
-            False, False, False, False, False, False, False, False,
+        True, False, False, False, False, False, False, False, False, False,
+        False, False, False, False, False, False, False, False, False, False,
             ]
     material=bl.material.create('constraint')
     material.diffuse_color=(1, 0, 0)
@@ -736,14 +750,12 @@ def __importRigidBodies(io):
 
     container=bl.object.createEmpty('RigidBodies')
     layer=[
-            True, False, False, False, False, False, False, False,
-            False, False, False, False, False, False, False, False,
-            False, False, False, False, False, False, False, False,
-            False, False, False, False, False, False, False, False,
+        True, False, False, False, False, False, False, False, False, False,
+        False, False, False, False, False, False, False, False, False, False,
             ]
     material=bl.material.create('rigidBody')
     rigidMeshes=[]
-    for rigid in io.rigidbodies:
+    for i, rigid in enumerate(io.rigidbodies):
         if rigid.boneIndex==0xFFFF:
             # no reference bone
             bone=io.bones[0]
@@ -779,7 +791,8 @@ def __importRigidBodies(io):
         mesh=bl.object.getData(meshObject)
         rigidMeshes.append(meshObject)
         bl.mesh.addMaterial(mesh, material)
-        meshObject.name=rigid.getName()
+        meshObject.name='r_%d' % i
+        meshObject[RIGID_NAME]=rigid.getName()
         #meshObject.draw_transparent=True
         #meshObject.draw_wire=True
         meshObject.max_draw_type='WIRE'
@@ -828,6 +841,9 @@ def _execute(filename):
     if len(model_name)==0:
         model_name=io.getName()
     root=bl.object.createEmpty(model_name)
+    root[MMD_MB_NAME]=io.getName()
+    root[MMD_MB_COMMENT]=io.getComment()
+    root[MMD_COMMENT]=io.getEnglishComment()
 
     # toon textures
     tex_dir=os.path.dirname(filename)
@@ -886,21 +902,13 @@ else:
 
         # List of operator properties, the attributes will be assigned
         # to the class instance from the operator settings before calling.
-
-        path = StringProperty(
-                name="File Path", 
-                description="File path used for importing the PMD file", 
-                maxlen= 1024, default= "")
-        filename = StringProperty(
-                name="File Name", 
-                description="Name of the file.")
-        directory = StringProperty(
-                name="Directory", 
-                description="Directory of the file.")
+        filepath = bpy.props.StringProperty()
+        filename = bpy.props.StringProperty()
+        directory = bpy.props.StringProperty()
 
         def execute(self, context):
             bl.initialize('pmd_import', context.scene)
-            _execute(self.properties.path)
+            _execute(self.properties.filepath)
             bl.finalize()
             return 'FINISHED'
 
@@ -912,7 +920,9 @@ else:
     # register menu
     def menu_func(self, context): 
         self.layout.operator(IMPORT_OT_pmd.bl_idname, 
-                text="MikuMikuDance model (.pmd)")
+                text="MikuMikuDance model (.pmd)",
+                icon='PLUGIN'
+                )
 
     def register():
         bpy.types.register(IMPORT_OT_pmd)
index b5b6277..4304e92 100644 (file)
@@ -64,7 +64,7 @@ else:
 for i in range(len(ext_modules)+1):
     try:
         setup(name="meshio",
-                version='0.14',
+                version='1.00',
                 description='polygon mesh io utilities',
                 author='ousttrue',
                 author_email='ousttrue@gmail.com',