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)
57 Blender.Window.EditMode(0)
59 def createVector(x, y, z):
60 return Mathutils.Vector(x, y, z)
70 def __init__(self, path, encoding):
72 path: file path to open
73 encoding: text encoding to write
76 self.io=open(path, "wb")
77 self.encoding=encoding
89 class ProgressBar(object):
93 __slots__=['base', 'start', 'progress',]
94 def __init__(self, base):
95 print("#### %s ####" % base)
97 self.start=Blender.sys.time()
98 self.set('<start>', 0)
99 Blender.Window.WaitCursor(1)
101 def advance(self, message, progress):
102 self.progress+=float(progress)
105 def set(self, message, progress):
106 self.progress=float(progress)
109 @to_internal_encoding
110 def _print(self, message):
111 print(message.decode(INTERNAL_ENCODING))
112 message="%s: %s" % (self.base, message)
113 Blender.Window.DrawProgressBar(self.progress, message)
117 message='finished in %.2f sec' % (Blender.sys.time()-self.start)
118 self.set(message, 1.0)
119 Blender.Window.WaitCursor(0)
122 def progress_start(base):
124 progressBar=ProgressBar(base)
126 def progress_finish():
130 def progress_print(message, progress=0.05):
132 progressBar.advance(message, progress)
134 def progress_set(message, progress):
136 progressBar.set(message, progress)
147 @to_internal_encoding
148 def createEmpty(name):
150 empty=SCENE.objects.new("Empty")
155 def makeParent(parent, child):
156 parent.makeParent([child])
160 new_mesh, new_object=mesh.create(o.name.decode(INTERNAL_ENCODING))
161 # not apply modifiers
162 new_mesh.getFromObject(o.name, 1)
164 #o.setMatrix(o.matrixWorld)
165 return new_mesh, new_object
170 SCENE.objects.unlink(o)
174 return o.getData(mesh=True)
184 SCENE.objects.active=o
189 return SCENE.objects.active
193 for o in bpy.data.scenes.active.objects:
197 def setLayerMask(o, layers):
199 for i, enable in enumerate(layers):
206 return o.restrictDisplay
210 return o.getData(mesh=True).key.blocks
213 @to_internal_encoding
214 def addShapeKey(o, name):
215 mesh=o.getData(mesh=True)
217 block=mesh.key.blocks[-1]
223 return o.getData(mesh=True).key
226 def pinShape(o, enable):
230 def setActivateShapeKey(o, index):
238 @to_internal_encoding
239 def addVertexGroup(o, name):
240 o.getData(mesh=True).addVertGroup(name)
243 @to_internal_encoding
244 def assignVertexGroup(o, name, index, weight):
245 o.getData(mesh=True).assignVertsToGroup(name,
246 [index], weight, Blender.Mesh.AssignModes.ADD)
249 def getVertexGroupNames(o):
250 return o.getData(mesh=True).getVertGroupNames()
253 @to_internal_encoding
254 def getVertexGroup(o, name):
256 for index in o.getData(mesh=True).getVertsFromGroup(name):
257 indices.append(index)
263 def addMirror(mesh_object):
264 return mesh_object.modifiers.append(Blender.Modifier.Types.MIRROR)
267 def addArmature(mesh_object, armature_object):
268 mod=mesh_object.modifiers.append(Blender.Modifier.Types.ARMATURE)
269 mod[Blender.Modifier.Settings.OBJECT] = armature_object
270 mod[Blender.Modifier.Settings.ENVELOPES] = False
273 def hasType(mesh_object, type_name):
274 for mod in mesh_object.modifiers:
275 if mod.name.upper()==type_name.upper():
279 def isType(m, type_name):
280 return m.name.upper()==type_name.upper()
283 def getArmatureObject(m):
284 return m[Blender.Modifier.Settings.OBJECT]
289 def assign(b, index, pos):
293 def getByIndex(b, index):
303 @to_internal_encoding
305 image = Blender.Image.Load(path)
306 texture = Blender.Texture.New(path)
307 texture.type = Blender.Texture.Types.IMAGE
308 texture.image = image
309 texture.imageFlags|=Blender.Texture.ImageFlags.USEALPHA
310 return texture, image
315 @to_internal_encoding
317 m = Blender.Material.New(name)
321 def get(material_name):
322 return Blender.Material.Get(material_name)
325 def addTexture(material, texture):
326 material.mode = material.mode | Blender.Material.Modes.TEXFACE
327 material.setTexture(0, texture, Blender.Texture.TexCo.UV)
330 def hasTexture(material):
331 return len(material.getTextures())>0
334 def eachTexturePath(m, dirname):
335 for texture in m.getTextures():
336 if texture and texture.tex and texture.tex.getImage():
337 image=texture.tex.getImage()
340 yield image.getFilename()
345 @to_internal_encoding
349 o=SCENE.objects.new(m, name)
353 def addGeometry(m, vertices, faces):
354 m.verts.extend(vertices)
355 new_faces=m.faces.extend(faces,
370 m.addUVLayer('NewUV')
373 def hasFaceUV(m, i, face):
374 return len(face.uv)>0
377 def getFaceUV(m, i, face, count=3):
381 def setFaceUV(m, i, face, uv_array, image):
382 face.uv=[Mathutils.Vector(uv[0], uv[1]) for uv in uv_array]
387 def vertsDelete(m, remove_vertices):
388 m.verts.delete(remove_vertices)
391 def setSmooth(m, smoothing):
392 m.mode |= Blender.Mesh.Modes.AUTOSMOOTH
393 m.degr=int(smoothing)
397 def recalcNormals(mesh_object):
398 m=mesh_object.getData(mesh=True)
406 def addMaterial(m, material):
407 m.materials+=[material]
412 def setNormal(mvert, normal):
413 mvert.no=Mathutils.Vector(*normal)
416 def setUv(mvert, uv):
422 def getVertexCount(face):
426 def getVertices(face):
427 return [v.index for v in face.v]
430 def getIndices(face):
431 return [face.verts[0].index, face.verts[1].index, face.verts[2].index]
434 def setMaterial(face, material_index):
435 face.mat=material_index
438 def getMaterialIndex(face):
442 def setNormal(face, normal):
450 def setSmooth(face, isSmooth):
451 face.smooth=1 if isSmooth else 0
458 armature = Blender.Armature.New()
459 armature_object = SCENE.objects.new(armature)
462 armature_object.drawMode = (
463 armature_object.drawMode | Blender.Object.DrawModes.XRAY)
465 armature.drawType = Blender.Armature.OCTAHEDRON
466 armature.drawNames=True
467 armature.envelopes = False
468 armature.vertexGroups = True
469 armature.mirrorEdit = True
471 return armature, armature_object
474 def makeEditable(armature_object):
476 armature_object.getData().makeEditable()
479 def createIkConstraint(armature_object, p_bone, effector_name, ik):
480 cSetting = Blender.Constraint.Settings
482 constraint = p_bone.constraints.append(Blender.Constraint.Type.IKSOLVER)
483 constraint[cSetting.CHAINLEN]=len(ik.children)
484 constraint[cSetting.TARGET]=armature_object
485 constraint[cSetting.USETIP]=False
486 constraint[cSetting.BONE]=effector_name
487 # not used. place folder when export.
488 constraint[cSetting.ROTWEIGHT]=ik.weight
489 constraint[cSetting.ITERATIONS]=ik.iterations * 10
493 @to_internal_encoding
494 def createBone(armature_object, name):
495 bone=Blender.Armature.Editbone()
497 armature_object.bones[name]=bone
501 def update(armature):
507 def setConnected(bone):
508 bone.options+=[Blender.Armature.CONNECTED]
512 return Blender.Armature.CONNECTED in b.options
515 def setLayerMask(bone, layers):
517 for i, enable in enumerate(layers):
524 return b.head['ARMATURESPACE'][0:3]
528 return b.tail['ARMATURESPACE'][0:3]
534 return c[Blender.Constraint.Settings.CHAINLEN]
538 return c[Blender.Constraint.Settings.BONE]
542 return c[Blender.Constraint.Settings.ITERATIONS]
545 def ikRotationWeight(c):
546 return c[Blender.Constraint.Settings.ROTWEIGHT]
550 return c.type==Blender.Constraint.Type.IKSOLVER