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
32 def initialize(name, scene):
37 mode_edit = Blender.Window.EditMode()
39 Blender.Window.EditMode(0)
46 # Blender.Window.EditMode(1)
50 res=Blender.Draw.PupMenu(msg + "%t|OK")
54 Blender.Window.EditMode(1)
56 def enterObjectMode():
57 Blender.Window.EditMode(0)
60 Blender.Window.PoseMode(1)
62 def createVector(x, y, z):
63 return Mathutils.Vector(x, y, z)
73 def __init__(self, path, encoding):
75 path: file path to open
76 encoding: text encoding to write
79 self.io=open(path, "wb")
80 self.encoding=encoding
92 class ProgressBar(object):
96 __slots__=['base', 'start', 'progress',]
97 def __init__(self, base):
98 print("#### %s ####" % base)
100 self.start=Blender.sys.time()
101 self.set('<start>', 0)
102 Blender.Window.WaitCursor(1)
104 def advance(self, message, progress):
105 self.progress+=float(progress)
108 def set(self, message, progress):
109 self.progress=float(progress)
112 @to_internal_encoding
113 def _print(self, message):
114 print(message.decode(INTERNAL_ENCODING))
115 message="%s: %s" % (self.base, message)
116 Blender.Window.DrawProgressBar(self.progress, message)
120 message='finished in %.2f sec' % (Blender.sys.time()-self.start)
121 self.set(message, 1.0)
122 Blender.Window.WaitCursor(0)
125 def progress_start(base):
127 progressBar=ProgressBar(base)
129 def progress_finish():
133 def progress_print(message, progress=0.05):
135 progressBar.advance(message, progress)
137 def progress_set(message, progress):
139 progressBar.set(message, progress)
150 @to_internal_encoding
151 def createEmpty(name):
153 empty=SCENE.objects.new("Empty")
158 def makeParent(parent, child):
159 parent.makeParent([child])
163 new_mesh, new_object=mesh.create(o.name.decode(INTERNAL_ENCODING))
164 # not apply modifiers
165 new_mesh.getFromObject(o.name, 1)
167 #o.setMatrix(o.matrixWorld)
168 return new_mesh, new_object
173 SCENE.objects.unlink(o)
177 return o.getData(mesh=True)
187 SCENE.objects.active=o
192 return SCENE.objects.active
196 for o in bpy.data.scenes.active.objects:
200 def setLayerMask(o, layers):
202 for i, enable in enumerate(layers):
209 return o.restrictDisplay
213 return o.getData(mesh=True).key.blocks
216 @to_internal_encoding
217 def addShapeKey(o, name):
218 mesh=o.getData(mesh=True)
220 block=mesh.key.blocks[-1]
226 return o.getData(mesh=True).key
229 def pinShape(o, enable):
233 def setActivateShapeKey(o, index):
241 @to_internal_encoding
242 def addVertexGroup(o, name):
243 o.getData(mesh=True).addVertGroup(name)
246 @to_internal_encoding
247 def assignVertexGroup(o, name, index, weight):
248 o.getData(mesh=True).assignVertsToGroup(name,
249 [index], weight, Blender.Mesh.AssignModes.ADD)
252 def getVertexGroupNames(o):
253 return o.getData(mesh=True).getVertGroupNames()
256 @to_internal_encoding
257 def getVertexGroup(o, name):
259 for index in o.getData(mesh=True).getVertsFromGroup(name):
260 indices.append(index)
264 def createBoneGroup(o, name, color_set='DEFAULT'):
268 bpy.ops.pose.group_add()
270 pose=object.getPose(o)
271 g=pose.active_bone_group
273 g.color_set=color_set
277 return object.getPose(o).bone_groups
282 def addMirror(mesh_object):
283 return mesh_object.modifiers.append(Blender.Modifier.Types.MIRROR)
286 def addArmature(mesh_object, armature_object):
287 mod=mesh_object.modifiers.append(Blender.Modifier.Types.ARMATURE)
288 mod[Blender.Modifier.Settings.OBJECT] = armature_object
289 mod[Blender.Modifier.Settings.ENVELOPES] = False
292 def hasType(mesh_object, type_name):
293 for mod in mesh_object.modifiers:
294 if mod.name.upper()==type_name.upper():
298 def isType(m, type_name):
299 return m.name.upper()==type_name.upper()
302 def getArmatureObject(m):
303 return m[Blender.Modifier.Settings.OBJECT]
308 def assign(b, index, pos):
312 def getByIndex(b, index):
322 @to_internal_encoding
325 image = Blender.Image.Load(path)
328 texture = Blender.Texture.New(path)
329 texture.type = Blender.Texture.Types.IMAGE
330 texture.image = image
331 texture.imageFlags|=Blender.Texture.ImageFlags.USEALPHA
332 return texture, image
338 return image.getFilename()
343 @to_internal_encoding
345 m = Blender.Material.New(name)
349 def get(material_name):
350 return Blender.Material.Get(material_name)
353 def addTexture(m, texture, enable=True):
358 m.mode = m.mode | Blender.Material.Modes.TEXFACE
359 m.setTexture(i, texture, Blender.Texture.TexCo.UV)
361 m.setTexture(i, texture)
362 material.setUseTexture(m, i, False)
366 def getTexture(m, index):
367 return m.textures[index].tex
371 return len(m.getTextures())>0
374 def setUseTexture(m, index, enable):
375 enabledTextures=set(m.enabledTextures)
377 enabledTextures.add(index)
379 enabledTextures.remove(index)
380 m.enabledTextures=list(enabledTextures)
383 def eachTexturePath(m, dirname):
384 for texture in m.getTextures():
385 if texture and texture.tex and texture.tex.getImage():
386 image=texture.tex.getImage()
389 yield image.getFilename()
392 def eachEnalbeTexturePath(m, dirname):
393 for i, texture in enumerate(m.getTextures()):
394 if (i in m.enabledTextures) and texture and texture.tex and texture.tex.getImage():
395 image=texture.tex.getImage()
398 yield image.getFilename()
403 @to_internal_encoding
407 o=SCENE.objects.new(m, name)
411 def addGeometry(m, vertices, faces):
412 m.verts.extend(vertices)
413 new_faces=m.faces.extend(faces,
428 m.addUVLayer('NewUV')
431 def hasFaceUV(m, i, face):
432 return len(face.uv)>0
435 def getFaceUV(m, i, face, count=3):
439 def setFaceUV(m, i, face, uv_array, image):
440 face.uv=[Mathutils.Vector(uv[0], uv[1]) for uv in uv_array]
445 def vertsDelete(m, remove_vertices):
446 m.verts.delete(remove_vertices)
449 def setSmooth(m, smoothing):
450 m.mode |= Blender.Mesh.Modes.AUTOSMOOTH
451 m.degr=int(smoothing)
455 def recalcNormals(mesh_object):
456 m=mesh_object.getData(mesh=True)
464 def addMaterial(m, material):
465 m.materials+=[material]
468 def getMaterial(m, index):
469 return m.materials[index]
478 def setNormal(v, normal):
479 v.no=Mathutils.Vector(*normal)
488 def getVertexCount(face):
492 def getVertices(face):
493 return [v.index for v in face.v]
496 def getIndices(face):
497 return [face.verts[0].index, face.verts[1].index, face.verts[2].index]
500 def setMaterial(face, material_index):
501 face.mat=material_index
504 def getMaterialIndex(face):
508 def setNormal(face, normal):
516 def setSmooth(face, isSmooth):
517 face.smooth=1 if isSmooth else 0
524 armature = Blender.Armature.New()
525 armature_object = SCENE.objects.new(armature)
528 armature_object.drawMode = (
529 armature_object.drawMode | Blender.Object.DrawModes.XRAY)
531 armature.drawType = Blender.Armature.OCTAHEDRON
532 armature.drawNames=True
533 armature.envelopes = False
534 armature.vertexGroups = True
535 armature.mirrorEdit = True
537 return armature, armature_object
540 def makeEditable(armature_object):
542 armature_object.getData().makeEditable()
545 def createIkConstraint(armature_object, p_bone, effector_name, ik):
546 cSetting = Blender.Constraint.Settings
548 constraint = p_bone.constraints.append(Blender.Constraint.Type.IKSOLVER)
549 constraint[cSetting.CHAINLEN]=len(ik.children)
550 constraint[cSetting.TARGET]=armature_object
551 constraint[cSetting.USETIP]=False
552 constraint[cSetting.BONE]=effector_name
553 # not used. place folder when export.
554 constraint[cSetting.ROTWEIGHT]=ik.weight
555 constraint[cSetting.ITERATIONS]=ik.iterations * 10
559 @to_internal_encoding
560 def createBone(armature_object, name):
561 bone=Blender.Armature.Editbone()
563 armature_object.bones[name]=bone
567 def update(armature):
573 def setConnected(bone):
574 bone.options+=[Blender.Armature.CONNECTED]
578 return Blender.Armature.CONNECTED in b.options
581 def setLayerMask(bone, layers):
583 for i, enable in enumerate(layers):
590 return b.head['ARMATURESPACE'][0:3]
594 return b.tail['ARMATURESPACE'][0:3]
600 return c[Blender.Constraint.Settings.CHAINLEN]
604 return c[Blender.Constraint.Settings.BONE]
608 return c[Blender.Constraint.Settings.ITERATIONS]
611 def ikRotationWeight(c):
612 return c[Blender.Constraint.Settings.ROTWEIGHT]
616 return c.type==Blender.Constraint.Type.IKSOLVER