OSDN Git Service

fix bone group name.
[meshio/meshio.git] / swig / blender / bl24.py
index 0bdd6e7..034d461 100755 (executable)
@@ -17,6 +17,17 @@ if os.path.exists(os.path.dirname(sys.argv[0])+"/utf8"):
 else:
     INTERNAL_ENCODING=FS_ENCODING
 
+def to_internal_encoding(fn):
+    '''
+    decorator for fix string encoding
+    '''
+    def newfn(*args):
+        return fn(*[
+            v.encode(INTERNAL_ENCODING) if isinstance(v, unicode) else v 
+            for v in args])
+    return newfn
+
+
 SCENE=None
 def initialize(name, scene):
     global SCENE
@@ -34,6 +45,7 @@ def finalize():
     #if mode_edit: 
     #    Blender.Window.EditMode(1)
 
+@to_internal_encoding
 def message(msg):
     res=Blender.Draw.PupMenu(msg + "%t|OK")
     print(res)
@@ -41,9 +53,12 @@ def message(msg):
 def enterEditMode():
     Blender.Window.EditMode(1)
 
-def exitEditMode():
+def enterObjectMode():
     Blender.Window.EditMode(0)
 
+def enterPoseMode():
+    Blender.Window.PoseMode(1)
+
 def createVector(x, y, z):
     return Mathutils.Vector(x, y, z)
 
@@ -94,11 +109,10 @@ class ProgressBar(object):
         self.progress=float(progress)
         self._print(message)
 
+    @to_internal_encoding
     def _print(self, message):
-        print(message)
+        print(message.decode(INTERNAL_ENCODING))
         message="%s: %s" % (self.base, message)
-        if message.__class__ is unicode:
-            message=message.encode(FS_ENCODING)
         Blender.Window.DrawProgressBar(self.progress, message)
 
     def finish(self):
@@ -133,6 +147,7 @@ class scene:
 
 class object:
     @staticmethod
+    @to_internal_encoding
     def createEmpty(name):
         global SCENE
         empty=SCENE.objects.new("Empty")
@@ -198,11 +213,12 @@ class object:
         return o.getData(mesh=True).key.blocks
 
     @staticmethod
+    @to_internal_encoding
     def addShapeKey(o, name):
         mesh=o.getData(mesh=True)
         mesh.insertKey()
         block=mesh.key.blocks[-1]
-        block.name=name.encode(INTERNAL_ENCODING)
+        block.name=name
         return block
 
     @staticmethod
@@ -222,10 +238,12 @@ class object:
         return o.getPose()
 
     @staticmethod
+    @to_internal_encoding
     def addVertexGroup(o, name):
         o.getData(mesh=True).addVertGroup(name)
 
     @staticmethod
+    @to_internal_encoding
     def assignVertexGroup(o, name, index, weight):
         o.getData(mesh=True).assignVertsToGroup(name, 
                 [index], weight, Blender.Mesh.AssignModes.ADD)
@@ -235,12 +253,25 @@ class object:
         return o.getData(mesh=True).getVertGroupNames()
 
     @staticmethod
+    @to_internal_encoding
     def getVertexGroup(o, name):
         indices=[]
         for index in o.getData(mesh=True).getVertsFromGroup(name):
             indices.append(index)
         return indices
 
+    @staticmethod
+    def createBoneGroup(o, name, color_set='DEFAULT'):
+        # create group
+        object.activate(o)
+        enterPoseMode()
+        bpy.ops.pose.group_add()
+        # set name
+        pose=object.getPose(o)
+        g=pose.active_bone_group
+        g.name=name
+        g.color_set=color_set
+
 
 class modifier:
     @staticmethod
@@ -284,9 +315,13 @@ class shapekey:
 
 class texture:
     @staticmethod
+    @to_internal_encoding
     def create(path):
-        image = Blender.Image.Load(path.encode(INTERNAL_ENCODING))
-        texture = Blender.Texture.New(path.encode(INTERNAL_ENCODING))
+        try:
+            image = Blender.Image.Load(path)
+        except IOError:
+            image = None
+        texture = Blender.Texture.New(path)
         texture.type = Blender.Texture.Types.IMAGE
         texture.image = image
         texture.imageFlags|=Blender.Texture.ImageFlags.USEALPHA
@@ -295,6 +330,7 @@ class texture:
 
 class material:
     @staticmethod
+    @to_internal_encoding
     def create(name):
         m = Blender.Material.New(name)
         return m
@@ -304,41 +340,52 @@ class material:
         return Blender.Material.Get(material_name)
 
     @staticmethod
-    def addTexture(material, texture):
-        material.mode = material.mode | Blender.Material.Modes.TEXFACE
-        material.setTexture(0, texture, Blender.Texture.TexCo.UV)
+    def addTexture(m, texture, enable=True):
+        for i in xrange(10):
+            if m.textures[i]:
+                continue
+            if enable:
+                m.mode = m.mode | Blender.Material.Modes.TEXFACE
+                m.setTexture(i, texture, Blender.Texture.TexCo.UV)
+            else:
+                m.setTexture(i, texture)
+                material.setUseTexture(m, i, False)
+            return i
+
+    @staticmethod
+    def getTexture(m, index):
+        return m.textures[index]
+
+    @staticmethod
+    def hasTexture(m):
+        return len(m.getTextures())>0
 
     @staticmethod
-    def hasTexture(material):
-        return len(material.getTextures())>0
+    def setUseTexture(m, index, enable):
+        enable_textures=set(m.enabledTextures)
+        if enable:
+            enabledTextures.add(index)
+        else;
+            enabledTextures.remove(index)
+        m.enabledTextures=list(enabledTextures)
 
     @staticmethod
-    def getTexturePath(m, dirname):
-        tex=""
-        aplane=""
-        # texture
+    def eachTexturePath(m, dirname):
         for texture in m.getTextures():
             if texture and texture.tex and texture.tex.getImage():
                 image=texture.tex.getImage()
                 if not image:
                     continue
-                imagePath=Blender.sys.expandpath(image.getFilename())
-                if len(dirname)>0 and imagePath.startswith(dirname):
-                    # 相対パスに変換する
-                    imagePath=imagePath[len(dirname)+1:len(imagePath)]
-                if texture.mtCol>0:
-                    tex=" tex(\"%s\")" % imagePath
-                elif texture.mtAlpha>0:
-                    aplane=" aplane(\"%s\")" % imagePath
-        return tex, aplane
+                yield image.getFilename()
 
 
 class mesh:
     @staticmethod
+    @to_internal_encoding
     def create(name):
         global SCENE
         m=Blender.Mesh.New()
-        o=SCENE.objects.new(m, name.encode(INTERNAL_ENCODING))
+        o=SCENE.objects.new(m, name)
         return m, o
 
     @staticmethod
@@ -482,9 +529,10 @@ class armature:
         return constraint
 
     @staticmethod
+    @to_internal_encoding
     def createBone(armature_object, name):
         bone=Blender.Armature.Editbone()
-        bone.name=name.encode(INTERNAL_ENCODING)
+        bone.name=name
         armature_object.bones[name]=bone
         return bone