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
21 def initialize(name, scene):
26 mode_edit = Blender.Window.EditMode()
28 Blender.Window.EditMode(0)
35 # Blender.Window.EditMode(1)
38 res=Blender.Draw.PupMenu(msg + "%t|OK")
42 Blender.Window.EditMode(1)
45 Blender.Window.EditMode(0)
47 def createVector(x, y, z):
48 return Mathutils.Vector(x, y, z)
58 def __init__(self, path, encoding):
60 path: file path to open
61 encoding: text encoding to write
64 self.io=open(path, "wb")
65 self.encoding=encoding
77 class ProgressBar(object):
81 __slots__=['base', 'start', 'progress',]
82 def __init__(self, base):
83 print("#### %s ####" % base)
85 self.start=Blender.sys.time()
86 self.set('<start>', 0)
87 Blender.Window.WaitCursor(1)
89 def advance(self, message, progress):
90 self.progress+=float(progress)
93 def set(self, message, progress):
94 self.progress=float(progress)
97 def _print(self, message):
99 message="%s: %s" % (self.base, message)
100 if message.__class__ is unicode:
101 message=message.encode(FS_ENCODING)
102 Blender.Window.DrawProgressBar(self.progress, message)
106 message='finished in %.2f sec' % (Blender.sys.time()-self.start)
107 self.set(message, 1.0)
108 Blender.Window.WaitCursor(0)
111 def progress_start(base):
113 progressBar=ProgressBar(base)
115 def progress_finish():
119 def progress_print(message, progress=0.05):
121 progressBar.advance(message, progress)
123 def progress_set(message, progress):
125 progressBar.set(message, progress)
136 def createEmpty(name):
138 empty=SCENE.objects.new("Empty")
143 def makeParent(parent, child):
144 parent.makeParent([child])
148 new_mesh, new_object=mesh.create(o.name.decode(INTERNAL_ENCODING))
149 # not apply modifiers
150 new_mesh.getFromObject(o.name, 1)
152 #o.setMatrix(o.matrixWorld)
153 return new_mesh, new_object
158 SCENE.objects.unlink(o)
162 return o.getData(mesh=True)
172 SCENE.objects.active=o
177 return SCENE.objects.active
181 for o in bpy.data.scenes.active.objects:
185 def setLayerMask(o, layers):
187 for i, enable in enumerate(layers):
194 return o.restrictDisplay
198 return o.getData(mesh=True).key.blocks
201 def addShapeKey(o, name):
202 mesh=o.getData(mesh=True)
204 block=mesh.key.blocks[-1]
205 block.name=name.encode(INTERNAL_ENCODING)
210 return o.getData(mesh=True).key
213 def pinShape(o, enable):
217 def setActivateShapeKey(o, index):
225 def addVertexGroup(o, name):
226 o.getData(mesh=True).addVertGroup(name)
229 def assignVertexGroup(o, name, index, weight):
230 o.getData(mesh=True).assignVertsToGroup(name,
231 [index], weight, Blender.Mesh.AssignModes.ADD)
234 def getVertexGroupNames(o):
235 return o.getData(mesh=True).getVertGroupNames()
238 def getVertexGroup(o, name):
240 for index in o.getData(mesh=True).getVertsFromGroup(name):
241 indices.append(index)
247 def addMirror(mesh_object):
248 return mesh_object.modifiers.append(Blender.Modifier.Types.MIRROR)
251 def addArmature(mesh_object, armature_object):
252 mod=mesh_object.modifiers.append(Blender.Modifier.Types.ARMATURE)
253 mod[Blender.Modifier.Settings.OBJECT] = armature_object
254 mod[Blender.Modifier.Settings.ENVELOPES] = False
257 def hasType(mesh_object, type_name):
258 for mod in mesh_object.modifiers:
259 if mod.name.upper()==type_name.upper():
263 def isType(m, type_name):
264 return m.name.upper()==type_name.upper()
267 def getArmatureObject(m):
268 return m[Blender.Modifier.Settings.OBJECT]
273 def assign(b, index, pos):
277 def getByIndex(b, index):
288 image = Blender.Image.Load(path.encode(INTERNAL_ENCODING))
289 texture = Blender.Texture.New(path.encode(INTERNAL_ENCODING))
290 texture.type = Blender.Texture.Types.IMAGE
291 texture.image = image
292 texture.imageFlags|=Blender.Texture.ImageFlags.USEALPHA
293 return texture, image
299 m = Blender.Material.New(name)
303 def get(material_name):
304 return Blender.Material.Get(material_name)
307 def addTexture(material, texture):
308 material.mode = material.mode | Blender.Material.Modes.TEXFACE
309 material.setTexture(0, texture, Blender.Texture.TexCo.UV)
312 def hasTexture(material):
313 return len(material.getTextures())>0
316 def eachTexturePath(m, dirname):
317 for texture in m.getTextures():
318 if texture and texture.tex and texture.tex.getImage():
319 image=texture.tex.getImage()
322 yield image.getFilename()
330 o=SCENE.objects.new(m, name.encode(INTERNAL_ENCODING))
334 def addGeometry(m, vertices, faces):
335 m.verts.extend(vertices)
336 new_faces=m.faces.extend(faces,
351 m.addUVLayer('NewUV')
354 def hasFaceUV(m, i, face):
355 return len(face.uv)>0
358 def getFaceUV(m, i, face, count=3):
362 def setFaceUV(m, i, face, uv_array, image):
363 face.uv=[Mathutils.Vector(uv[0], uv[1]) for uv in uv_array]
368 def vertsDelete(m, remove_vertices):
369 m.verts.delete(remove_vertices)
372 def setSmooth(m, smoothing):
373 m.mode |= Blender.Mesh.Modes.AUTOSMOOTH
374 m.degr=int(smoothing)
378 def recalcNormals(mesh_object):
379 m=mesh_object.getData(mesh=True)
387 def addMaterial(m, material):
388 m.materials+=[material]
393 def setNormal(mvert, normal):
394 mvert.no=Mathutils.Vector(*normal)
397 def setUv(mvert, uv):
403 def getVertexCount(face):
407 def getVertices(face):
408 return [v.index for v in face.v]
411 def getIndices(face):
412 return [face.verts[0].index, face.verts[1].index, face.verts[2].index]
415 def setMaterial(face, material_index):
416 face.mat=material_index
419 def getMaterialIndex(face):
423 def setNormal(face, normal):
431 def setSmooth(face, isSmooth):
432 face.smooth=1 if isSmooth else 0
439 armature = Blender.Armature.New()
440 armature_object = SCENE.objects.new(armature)
443 armature_object.drawMode = (
444 armature_object.drawMode | Blender.Object.DrawModes.XRAY)
446 armature.drawType = Blender.Armature.OCTAHEDRON
447 armature.drawNames=True
448 armature.envelopes = False
449 armature.vertexGroups = True
450 armature.mirrorEdit = True
452 return armature, armature_object
455 def makeEditable(armature_object):
457 armature_object.getData().makeEditable()
460 def createIkConstraint(armature_object, p_bone, effector_name, ik):
461 cSetting = Blender.Constraint.Settings
463 constraint = p_bone.constraints.append(Blender.Constraint.Type.IKSOLVER)
464 constraint[cSetting.CHAINLEN]=len(ik.children)
465 constraint[cSetting.TARGET]=armature_object
466 constraint[cSetting.USETIP]=False
467 constraint[cSetting.BONE]=effector_name
468 # not used. place folder when export.
469 constraint[cSetting.ROTWEIGHT]=ik.weight
470 constraint[cSetting.ITERATIONS]=ik.iterations * 10
474 def createBone(armature_object, name):
475 bone=Blender.Armature.Editbone()
476 bone.name=name.encode(INTERNAL_ENCODING)
477 armature_object.bones[name]=bone
481 def update(armature):
487 def setConnected(bone):
488 bone.options+=[Blender.Armature.CONNECTED]
492 return Blender.Armature.CONNECTED in b.options
495 def setLayerMask(bone, layers):
497 for i, enable in enumerate(layers):
504 return b.head['ARMATURESPACE'][0:3]
508 return b.tail['ARMATURESPACE'][0:3]
514 return c[Blender.Constraint.Settings.CHAINLEN]
518 return c[Blender.Constraint.Settings.BONE]
522 return c[Blender.Constraint.Settings.ITERATIONS]
525 def ikRotationWeight(c):
526 return c[Blender.Constraint.Settings.ROTWEIGHT]
530 return c.type==Blender.Constraint.Type.IKSOLVER