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
337 @to_internal_encoding
339 m = Blender.Material.New(name)
343 def get(material_name):
344 return Blender.Material.Get(material_name)
347 def addTexture(m, texture, enable=True):
352 m.mode = m.mode | Blender.Material.Modes.TEXFACE
353 m.setTexture(i, texture, Blender.Texture.TexCo.UV)
355 m.setTexture(i, texture)
356 material.setUseTexture(m, i, False)
360 def getTexture(m, index):
361 return m.textures[index].tex
365 return len(m.getTextures())>0
368 def setUseTexture(m, index, enable):
369 enabledTextures=set(m.enabledTextures)
371 enabledTextures.add(index)
373 enabledTextures.remove(index)
374 m.enabledTextures=list(enabledTextures)
377 def eachTexturePath(m, dirname):
378 for texture in m.getTextures():
379 if texture and texture.tex and texture.tex.getImage():
380 image=texture.tex.getImage()
383 yield image.getFilename()
388 @to_internal_encoding
392 o=SCENE.objects.new(m, name)
396 def addGeometry(m, vertices, faces):
397 m.verts.extend(vertices)
398 new_faces=m.faces.extend(faces,
413 m.addUVLayer('NewUV')
416 def hasFaceUV(m, i, face):
417 return len(face.uv)>0
420 def getFaceUV(m, i, face, count=3):
424 def setFaceUV(m, i, face, uv_array, image):
425 face.uv=[Mathutils.Vector(uv[0], uv[1]) for uv in uv_array]
430 def vertsDelete(m, remove_vertices):
431 m.verts.delete(remove_vertices)
434 def setSmooth(m, smoothing):
435 m.mode |= Blender.Mesh.Modes.AUTOSMOOTH
436 m.degr=int(smoothing)
440 def recalcNormals(mesh_object):
441 m=mesh_object.getData(mesh=True)
449 def addMaterial(m, material):
450 m.materials+=[material]
455 def setNormal(mvert, normal):
456 mvert.no=Mathutils.Vector(*normal)
459 def setUv(mvert, uv):
465 def getVertexCount(face):
469 def getVertices(face):
470 return [v.index for v in face.v]
473 def getIndices(face):
474 return [face.verts[0].index, face.verts[1].index, face.verts[2].index]
477 def setMaterial(face, material_index):
478 face.mat=material_index
481 def getMaterialIndex(face):
485 def setNormal(face, normal):
493 def setSmooth(face, isSmooth):
494 face.smooth=1 if isSmooth else 0
501 armature = Blender.Armature.New()
502 armature_object = SCENE.objects.new(armature)
505 armature_object.drawMode = (
506 armature_object.drawMode | Blender.Object.DrawModes.XRAY)
508 armature.drawType = Blender.Armature.OCTAHEDRON
509 armature.drawNames=True
510 armature.envelopes = False
511 armature.vertexGroups = True
512 armature.mirrorEdit = True
514 return armature, armature_object
517 def makeEditable(armature_object):
519 armature_object.getData().makeEditable()
522 def createIkConstraint(armature_object, p_bone, effector_name, ik):
523 cSetting = Blender.Constraint.Settings
525 constraint = p_bone.constraints.append(Blender.Constraint.Type.IKSOLVER)
526 constraint[cSetting.CHAINLEN]=len(ik.children)
527 constraint[cSetting.TARGET]=armature_object
528 constraint[cSetting.USETIP]=False
529 constraint[cSetting.BONE]=effector_name
530 # not used. place folder when export.
531 constraint[cSetting.ROTWEIGHT]=ik.weight
532 constraint[cSetting.ITERATIONS]=ik.iterations * 10
536 @to_internal_encoding
537 def createBone(armature_object, name):
538 bone=Blender.Armature.Editbone()
540 armature_object.bones[name]=bone
544 def update(armature):
550 def setConnected(bone):
551 bone.options+=[Blender.Armature.CONNECTED]
555 return Blender.Armature.CONNECTED in b.options
558 def setLayerMask(bone, layers):
560 for i, enable in enumerate(layers):
567 return b.head['ARMATURESPACE'][0:3]
571 return b.tail['ARMATURESPACE'][0:3]
577 return c[Blender.Constraint.Settings.CHAINLEN]
581 return c[Blender.Constraint.Settings.BONE]
585 return c[Blender.Constraint.Settings.ITERATIONS]
588 def ikRotationWeight(c):
589 return c[Blender.Constraint.Settings.ROTWEIGHT]
593 return c.type==Blender.Constraint.Type.IKSOLVER