Initial revision
This commit is contained in:
349
intern/python/Blender.py
Normal file
349
intern/python/Blender.py
Normal file
@@ -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()
|
Reference in New Issue
Block a user