7 from Blender import Mathutils
14 FS_ENCODING=sys.getfilesystemencoding()
15 if os.path.exists(os.path.dirname(sys.argv[0])+"/utf8"):
16 INTERNAL_ENCODING='utf-8'
18 INTERNAL_ENCODING=FS_ENCODING
20 def to_internal_encoding(fn):
22 decorator for fix string encoding
26 v.encode(INTERNAL_ENCODING) if isinstance(v, unicode) else v
37 def initialize(name, scene):
42 mode_edit = Blender.Window.EditMode()
44 Blender.Window.EditMode(0)
51 # Blender.Window.EditMode(1)
55 res=Blender.Draw.PupMenu(msg + "%t|OK")
59 Blender.Window.EditMode(1)
61 def enterObjectMode():
62 Blender.Window.EditMode(0)
65 Blender.Window.PoseMode(1)
67 def createVector(x, y, z):
68 return Mathutils.Vector(x, y, z)
78 def __init__(self, path, encoding):
80 path: file path to open
81 encoding: text encoding to write
84 self.io=open(path, "wb")
85 self.encoding=encoding
97 class ProgressBar(object):
101 __slots__=['base', 'start', 'progress',]
102 def __init__(self, base):
103 print("#### %s ####" % base)
105 self.start=Blender.sys.time()
106 self.set('<start>', 0)
107 Blender.Window.WaitCursor(1)
109 def advance(self, message, progress):
110 self.progress+=float(progress)
113 def set(self, message, progress):
114 self.progress=float(progress)
117 @to_internal_encoding
118 def _print(self, message):
119 print(message.decode(INTERNAL_ENCODING))
120 message="%s: %s" % (self.base, message)
121 Blender.Window.DrawProgressBar(self.progress, message)
125 message='finished in %.2f sec' % (Blender.sys.time()-self.start)
126 self.set(message, 1.0)
127 Blender.Window.WaitCursor(0)
130 def progress_start(base):
132 progressBar=ProgressBar(base)
134 def progress_finish():
138 def progress_print(message, progress=0.05):
140 progressBar.advance(message, progress)
142 def progress_set(message, progress):
144 progressBar.set(message, progress)
155 @to_internal_encoding
156 def createEmpty(name):
158 empty=SCENE.objects.new("Empty")
164 for o in SCENE.objects:
168 def makeParent(parent, child):
169 parent.makeParent([child])
173 new_mesh, new_object=mesh.create(o.name.decode(INTERNAL_ENCODING))
174 # not apply modifiers
175 new_mesh.getFromObject(o.name, 1)
177 #o.setMatrix(o.matrixWorld)
178 return new_mesh, new_object
183 SCENE.objects.unlink(o)
187 return o.getData(mesh=True)
197 SCENE.objects.active=o
202 return SCENE.objects.active
206 for o in bpy.data.scenes.active.objects:
210 def setLayerMask(o, layers):
212 for i, enable in enumerate(layers):
219 return o.restrictDisplay
223 return o.getData(mesh=True).key.blocks
226 @to_internal_encoding
227 def addShapeKey(o, name):
228 mesh=o.getData(mesh=True)
230 block=mesh.key.blocks[-1]
236 return o.getData(mesh=True).key
239 def pinShape(o, enable):
243 def setActivateShapeKey(o, index):
251 @to_internal_encoding
252 def addVertexGroup(o, name):
253 o.getData(mesh=True).addVertGroup(name)
256 @to_internal_encoding
257 def assignVertexGroup(o, name, index, weight):
258 o.getData(mesh=True).assignVertsToGroup(name,
259 [index], weight, Blender.Mesh.AssignModes.ADD)
262 def getVertexGroupNames(o):
263 return o.getData(mesh=True).getVertGroupNames()
266 @to_internal_encoding
267 def getVertexGroup(o, name):
269 for index in o.getData(mesh=True).getVertsFromGroup(name):
270 indices.append(index)
274 def createBoneGroup(o, name, color_set='DEFAULT'):
278 bpy.ops.pose.group_add()
280 pose=object.getPose(o)
281 g=pose.active_bone_group
283 g.color_set=color_set
287 return object.getPose(o).bone_groups
292 def addMirror(mesh_object):
293 return mesh_object.modifiers.append(Blender.Modifier.Types.MIRROR)
296 def addArmature(mesh_object, armature_object):
297 mod=mesh_object.modifiers.append(Blender.Modifier.Types.ARMATURE)
298 mod[Blender.Modifier.Settings.OBJECT] = armature_object
299 mod[Blender.Modifier.Settings.ENVELOPES] = False
302 def hasType(mesh_object, type_name):
303 for mod in mesh_object.modifiers:
304 if mod.name.upper()==type_name.upper():
308 def isType(m, type_name):
309 return m.name.upper()==type_name.upper()
312 def getArmatureObject(m):
313 return m[Blender.Modifier.Settings.OBJECT]
318 def assign(b, index, pos):
322 def getByIndex(b, index):
332 @to_internal_encoding
335 image = Blender.Image.Load(path)
338 texture = Blender.Texture.New(path)
339 texture.type = Blender.Texture.Types.IMAGE
340 texture.image = image
341 texture.imageFlags|=Blender.Texture.ImageFlags.USEALPHA
342 return texture, image
348 return image.getFilename()
353 @to_internal_encoding
355 m = Blender.Material.New(name)
359 def get(material_name):
360 return Blender.Material.Get(material_name)
363 def addTexture(m, texture, enable=True):
368 m.mode = m.mode | Blender.Material.Modes.TEXFACE
369 m.setTexture(i, texture, Blender.Texture.TexCo.UV)
371 m.setTexture(i, texture)
372 material.setUseTexture(m, i, False)
376 def getTexture(m, index):
377 return m.textures[index].tex
381 return len(m.getTextures())>0
384 def setUseTexture(m, index, enable):
385 enabledTextures=set(m.enabledTextures)
387 enabledTextures.add(index)
389 enabledTextures.remove(index)
390 m.enabledTextures=list(enabledTextures)
393 def eachTexturePath(m, dirname):
394 for texture in m.getTextures():
395 if texture and texture.tex and texture.tex.getImage():
396 image=texture.tex.getImage()
399 yield image.getFilename()
402 def eachEnalbeTexturePath(m, dirname):
403 for i, texture in enumerate(m.getTextures()):
404 if (i in m.enabledTextures) and texture and texture.tex and texture.tex.getImage():
405 image=texture.tex.getImage()
408 yield image.getFilename()
413 @to_internal_encoding
417 o=SCENE.objects.new(m, name)
421 def addGeometry(m, vertices, faces):
422 m.verts.extend(vertices)
423 new_faces=m.faces.extend(faces,
438 m.addUVLayer('NewUV')
441 def hasFaceUV(m, i, face):
442 return len(face.uv)>0
445 def getFaceUV(m, i, face, count=3):
449 def setFaceUV(m, i, face, uv_array, image):
450 face.uv=[Mathutils.Vector(uv[0], uv[1]) for uv in uv_array]
455 def vertsDelete(m, remove_vertices):
456 m.verts.delete(remove_vertices)
459 def setSmooth(m, smoothing):
460 m.mode |= Blender.Mesh.Modes.AUTOSMOOTH
461 m.degr=int(smoothing)
465 def recalcNormals(mesh_object):
466 m=mesh_object.getData(mesh=True)
474 def addMaterial(m, material):
475 m.materials+=[material]
478 def getMaterial(m, index):
479 return m.materials[index]
488 def setNormal(v, normal):
489 v.no=Mathutils.Vector(*normal)
498 def getVertexCount(face):
502 def getVertices(face):
503 return [v.index for v in face.v]
506 def getIndices(face):
507 return [face.verts[0].index, face.verts[1].index, face.verts[2].index]
510 def setMaterial(face, material_index):
511 face.mat=material_index
514 def getMaterialIndex(face):
518 def setNormal(face, normal):
526 def setSmooth(face, isSmooth):
527 face.smooth=1 if isSmooth else 0
534 armature = Blender.Armature.New()
535 armature_object = SCENE.objects.new(armature)
538 armature_object.drawMode = (
539 armature_object.drawMode | Blender.Object.DrawModes.XRAY)
541 armature.drawType = Blender.Armature.OCTAHEDRON
542 armature.drawNames=True
543 armature.envelopes = False
544 armature.vertexGroups = True
545 armature.mirrorEdit = True
547 return armature, armature_object
550 def makeEditable(armature_object):
552 armature_object.getData().makeEditable()
555 def createIkConstraint(armature_object, p_bone, effector_name, ik):
556 cSetting = Blender.Constraint.Settings
558 constraint = p_bone.constraints.append(Blender.Constraint.Type.IKSOLVER)
559 constraint[cSetting.CHAINLEN]=len(ik.children)
560 constraint[cSetting.TARGET]=armature_object
561 constraint[cSetting.USETIP]=False
562 constraint[cSetting.BONE]=effector_name
563 # not used. place folder when export.
564 constraint[cSetting.ROTWEIGHT]=ik.weight
565 constraint[cSetting.ITERATIONS]=ik.iterations * 10
569 @to_internal_encoding
570 def createBone(armature_object, name):
571 bone=Blender.Armature.Editbone()
573 armature_object.bones[name]=bone
577 def update(armature):
583 def setConnected(bone):
584 bone.options+=[Blender.Armature.CONNECTED]
588 return Blender.Armature.CONNECTED in b.options
591 def setLayerMask(bone, layers):
593 for i, enable in enumerate(layers):
600 return b.head['ARMATURESPACE'][0:3]
604 return b.tail['ARMATURESPACE'][0:3]
610 return c[Blender.Constraint.Settings.CHAINLEN]
614 return c[Blender.Constraint.Settings.BONE]
618 return c[Blender.Constraint.Settings.ITERATIONS]
621 def ikRotationWeight(c):
622 return c[Blender.Constraint.Settings.ROTWEIGHT]
626 return c.type==Blender.Constraint.Type.IKSOLVER