diff options
Diffstat (limited to 'intern/python/Blender.py')
-rw-r--r-- | intern/python/Blender.py | 349 |
1 files changed, 349 insertions, 0 deletions
diff --git a/intern/python/Blender.py b/intern/python/Blender.py new file mode 100644 index 00000000000..ef9e527386e --- /dev/null +++ b/intern/python/Blender.py @@ -0,0 +1,349 @@ +#! /usr/bin/env python + +####################### +# (c) Jan Walter 2000 # +####################### + +# CVS +# $Author$ +# $Date$ +# $RCSfile$ +# $Revision$ + +"""This is the Python API for Blender""" + +def _findNewName(name, names): + import string + words = string.split(name, ".") + basename = words[0] + newname = name + num = 1 + while newname in names: + newname = basename + ".%03d" % num + num = num + 1 + return newname + +################### +# Blender classes # +################### + +class Camera: + def __init__(self, name, Lens = 35.0, ClipSta = 0.1, ClipEnd = 100.0): + self.name = name + self.ipos = {} + self.Lens = Lens + self.ClipSta = ClipSta + self.ClipEnd = ClipEnd + +class Curve: + def __init__(self, name): + # ... + self.name = name + self.ipos = {} + self.materials = [] + +class Ika: + def __init__(self, name): + self.name = name + +class Ipo: + def __init__(self, name): + self.name = name + +class Lamp: + def __init__(self, name, Energ = 1.0, R = 1.0, G = 1.0, B = 1.0, + SpoSi = 45.0, + OfsX = 0.0, OfsY = 0.0, OfsZ = 0.0, + SizeX = 1.0, SizeY = 1.0, SizeZ = 1.0): + self.name = name + self.ipos = {} + self.Energ = Energ + self.R = R + self.G = G + self.B = B + self.SpoSi = SpoSi + self.OfsX = OfsX + self.OfsY = OfsY + self.OfsZ = OfsZ + self.SizeX = SizeX + self.SizeY = SizeY + self.SizeZ = SizeZ + +class Material: + def __init__(self, name, + R = 0.8, G = 0.8, B = 0.8, + SpecR = 1.0, SpecG = 1.0, SpecB = 1.0, + MirR = 1.0, MirG = 1.0, MirB = 1.0, + Ref = 0.8, Alpha = 1.0, Emit = 0.0, Amb = 0.5, + Spec = 0.5, Hard = 50): + self.name = name + self.ipos = {} + self.R = R + self.G = G + self.B = B + self.SpecR = SpecR + self.SpecG = SpecG + self.SpecB = SpecB + self.MirR = MirR + self.MirG = MirG + self.MirB = MirB + self.Ref = Ref + self.Alpha = Alpha + self.Emit = Emit + self.Amb = Amb + self.Spec = Spec + self.Hard = Hard + +class Matrix: + def __init__(self): + self.elements = [[1, 0, 0, 0], + [0, 1, 0, 0], + [0, 0, 1, 0], + [0, 0, 0, 1]] + + def __repr__(self): + str = "%s" % self.elements + return str + +class Mesh: + """Creates an (empty) instance of a Blender mesh.\n\ + E.g.: "m = Blender.Mesh('Plane')"\n\ + To create faces first add vertices with \n\ + "i1 = m.addVertex(x, y, z, nx, ny, nz, r = -1.0, r = 0.0, b = 0.0)"\n\ + then create faces with "index = m.addFace(i1, i2, i3, i4, isSmooth)".""" + + _meshes = {} + + def __init__(self, name): + self.name = name + self.ipos = {} + self.materials = [] + self.vertices = [] + self.normals = [] + self.colors = [] + self.faces = [] + if name in Mesh._meshes.keys(): + print 'Mesh "%s" already exists ...' % name + self.name = _findNewName(name, Mesh._meshes.keys()) + print '... so it will be called "%s"' % self.name + Mesh._meshes[self.name] = self + + def __repr__(self): + str = 'Mesh(name = "%s",\n' % self.name + str = str + ' vertices = %s,\n' % len(self.vertices) + str = str + ' faces = %s)' % len(self.faces) + return str + + def addFace(self, i1, i2, i3, i4, isSmooth): + """addFace(self, i1, i2, i3, i4)""" + self.faces.append([i1, i2, i3, i4, isSmooth]) + return (len(self.faces) - 1) + + def addVertex(self, x, y, z, nx, ny, nz, r = -1.0, g = 0.0, b = 0.0): + """addVertex(self, x, y, z, nx, ny, nz, r = -1.0, g = 0.0, b = 0.0)""" + self.vertices.append([x, y, z]) + self.normals.append([nx, ny, nz]) + if r != -1.0: + self.colors.append([r, g, b]) + return (len(self.vertices) - 1) + +class MetaBall: + def __init__(self, name): + self.name = name + +class Object: + """Creates an instance of a Blender object""" + + _objects = {} + + def __init__(self, name): + self.name = name + self.ipos = {} + self.materials = [] + self.matrix = Matrix() + self.data = None + self.type = None + if name in Object._objects.keys(): + print 'Object "%s" already exists ...' % name + self.name = _findNewName(name, Object._objects.keys()) + print '... so it will be called "%s"' % self.name + Object._objects[self.name] = self + + def __repr__(self): + str = 'Object(name = "%s",\n' % self.name + str = str + ' matrix = %s,\n' % self.matrix + if self.type: + str = str + ' data = %s("%s"))' % (self.type, self.data) + else: + str = str + ' data = None)' + return str + +class Scene: + """Creates an instance of a Blender scene""" + + _scenes = {} + + def __init__(self, name): + self.name = name + self.objects = [] +## self.camera = None +## self.world = None + Scene._scenes[self.name] = self + + def __repr__(self): + str = 'Scene(name = "%s", \n' % self.name + str = str + ' objects = %s)' % len(self.objects) + return str + + def addObject(self, object): + """addObject(self, object)""" + self.objects.append(object.name) + return (len(self.objects) - 1) + +class Surface: + def __init__(self, name): + self.name = name + self.ipos = {} + self.materials = [] + # ... + +class Text(Surface): + def __init__(self, name): + Surface.__init__(name) + +############## +# primitives # +############## + +def addMesh(type, sceneName): + """Blender.addMesh(type, sceneName)\n\ + where type is one of ["Plane"]""" + + if type == "Plane": + object = Object(type) + mesh = Mesh(type) + i1 = mesh.addVertex(+1.0, +1.0, 0.0, 0.0, 0.0, 1.0) + i2 = mesh.addVertex(+1.0, -1.0, 0.0, 0.0, 0.0, 1.0) + i3 = mesh.addVertex(-1.0, -1.0, 0.0, 0.0, 0.0, 1.0) + i4 = mesh.addVertex(-1.0, +1.0, 0.0, 0.0, 0.0, 1.0) + mesh.addFace(i1, i4, i3, i2, 0) + connect("OB" + object.name, "ME" + mesh.name) + connect("SC" + sceneName, "OB" + object.name) + return object.name, mesh.name + elif type == "Cube": + pass + elif type == "Circle": + pass + elif type == "UVsphere": + pass + elif type == "Icosphere": + pass + elif type == "Cylinder": + pass + elif type == "Tube": + pass + elif type == "Cone": + pass + elif type == "Grid": + pass + else: + raise TypeError + +def addCurve(type): + if type == "Bezier Curve": + pass + elif type == "Bezier Circle": + pass + elif type == "Nurbs Curve": + pass + elif type == "Nurbs Circle": + pass + elif type == "Path": + pass + else: + raise TypeError + +def addSurface(type): + if type == "Curve": + pass + elif type == "Circle": + pass + elif type == "Surface": + pass + elif type == "Tube": + pass + elif type == "Sphere": + pass + elif type == "Donut": + pass + else: + raise TypeError + +def connect(objName1, objName2): + """connect(objName1, objName2)""" + + if objName1[:2] == "OB" and objName2[:2] == "ME": + obj1 = getObject(objName1[2:]) + obj1.data = objName2[2:] + obj1.type = "Mesh" + elif objName1[:2] == "SC" and objName2[:2] == "OB": + obj1 = getScene(objName1[2:]) + obj2 = getObject(objName2[2:]) + obj1.addObject(obj2) + else: + print "ERROR: connect(%s, %s)" % (objName1, objName2) + +def getCurrentScene(): + """getCurrentScene()""" + + return Scene._scenes[0] + +def getMesh(name): + """getMesh(name)""" + + if name in Mesh._meshes.keys(): + return Mesh._meshes[name] + else: + return None + +def getObject(name): + """getObject(name)""" + + if name in Object._objects.keys(): + return Object._objects[name] + else: + return None + +def getScene(name): + """getScene(name)""" + + if name in Scene._scenes.keys(): + return Scene._scenes[name] + else: + return None + +def testBlender(): + scene = Scene("1") + print scene + objName, meshName = addMesh("Plane", "1") + print scene + obj = Object("Plane") + connect("OB" + obj.name, "ME" + meshName) + connect("SC" + scene.name, "OB" + obj.name) + print scene + for name in scene.objects: + obj = getObject(name) + print obj + if obj.type == "Mesh": + mesh = getMesh(obj.data) + print mesh + print mesh.vertices + print mesh.faces + Mesh("Plane") + # print global data + print Scene._scenes + print Object._objects + print Mesh._meshes + +if __name__ == "__main__": + testBlender() |