New scripts:
- hotkeys, obdatacopier and renameobjectbyblock, all from Jean-Michel Soler (jms); - bevel_center by Loic Berthe, suggested for inclusion by jms; - doc_browser, by Daniel Dunbar (Zr) Thanks to them for the new contributions! (I included doc_browser at 'Misc' because only users interested in script writing would actually use it, but it could also be under 'Help'. Opinions?) BPython related: - Added scriptlink methods to object, lamp, camera and world. - Object: added object.makeTrack and object.clearTrack (old track method). - sys: made sys.exists(path) return 0 for not found; 1 for file, 2 for dir and -1 for neither. - doc updates and fixes. - made ONLOAD event work. G.f's SCENESCRIPT bit was being zeroed in set_app_data. - Blender: updated functions Load and Save to support the builtin importers and exporters besides .blend (dxf, videoscape, vrml 1.0, stl, ...) - Draw: added mouse wheel events. - Scene: added scene.play to play back animations (like ALT+A and SHIFT+ALT+A). Makes a good counter, too, when the 'win' attribute is set to a space that doesn't "animate". The scene.play() addition and the fix to ONLOAD scriptlinks is part of the work for a Blender demo mode. It already works, but I'll still add support for Radiosity calculations and fix a thing in main(): it executes onload scripts too early (BIF_Init), giving funny results in alt+a animations and renderings when firing up Blender. Loading after the program is up has no such problems. When I finish I'll post examples of demo mode scripts.
This commit is contained in:
parent
90d4f7a3c1
commit
9282827720
@ -100,13 +100,11 @@ def matrix_mul(m, n = acmatrix):
|
||||
|
||||
# ---
|
||||
|
||||
errmsg = ''
|
||||
|
||||
class AC3DExport:
|
||||
|
||||
def __init__(self, scene, filename):
|
||||
|
||||
global ARG, SKIP_DATA, ADD_DEFAULT_MAT, DEFAULT_MAT, errmsg
|
||||
global ARG, SKIP_DATA, ADD_DEFAULT_MAT, DEFAULT_MAT
|
||||
|
||||
print 'Trying AC3DExport...'
|
||||
|
||||
@ -179,7 +177,9 @@ class AC3DExport:
|
||||
try:
|
||||
file = open(filename, 'w')
|
||||
except IOError, (errno, strerror):
|
||||
errmsg = "IOError #%s: %s" % (errno, strerror)
|
||||
errmsg = "IOError #%s" % errno
|
||||
errmsg = errmsg + "%t|" + strerror
|
||||
Blender.Draw.PupMenu(errmsg)
|
||||
return None
|
||||
file.write(buf)
|
||||
file.close()
|
||||
@ -333,30 +333,43 @@ def gui():
|
||||
BGL.glClear(BGL.GL_COLOR_BUFFER_BIT)
|
||||
BGL.glColor3f(1,1,1)
|
||||
BGL.glRasterPos2i(18, 150)
|
||||
Draw.Text("AC3D is a simple, affordable commercial 3d modeller that can be found at www.ac3d.org .")
|
||||
Draw.Text("AC3D is a simple, affordable commercial 3d modeller that can "
|
||||
"be found at www.ac3d.org .")
|
||||
BGL.glRasterPos2i(18, 130)
|
||||
Draw.Text("It uses a nice text file format (extension .ac) which supports uv-textured meshes")
|
||||
Draw.Text("It uses a nice text file format (extension .ac) which supports "
|
||||
"uv-textured meshes")
|
||||
BGL.glRasterPos2i(18, 110)
|
||||
Draw.Text("with parenting (grouping) information.")
|
||||
BGL.glRasterPos2i(18, 90)
|
||||
Draw.Text("Notes: AC3D has a 'data' token that assigns a string to each mesh, useful for games,")
|
||||
Draw.Text("Notes: AC3D has a 'data' token that assigns a string to each "
|
||||
"mesh, useful for games,")
|
||||
BGL.glRasterPos2i(55, 70)
|
||||
Draw.Text("for example. You can use Blender's mesh datablock name for that.")
|
||||
Draw.Text("for example. You can use Blender's mesh 'ME:' field for that.")
|
||||
BGL.glRasterPos2i(55, 50)
|
||||
Draw.Text("The .ac format is well supported by the PLib 3d gaming library.")
|
||||
Draw.Button("Ok", 21, 285, 10, 45, 20, "Click to return to previous screen.")
|
||||
Draw.Button("Ok", 21, 285, 10, 45, 20,
|
||||
"Click to return to previous screen.")
|
||||
else:
|
||||
BGL.glClearColor(0,0,1,1)
|
||||
BGL.glClear(BGL.GL_COLOR_BUFFER_BIT)
|
||||
BGL.glColor3f(1,1,1)
|
||||
BGL.glRasterPos2i(20, 150)
|
||||
Draw.Text("AC3D Exporter")
|
||||
Draw.Toggle("Default mat", 1, 15, 100, 90, 20, ADD_DEFAULT_MAT, "Objects without materials assigned get a default (white) one automatically.")
|
||||
Draw.Toggle("Skip data", 2, 15, 80, 90, 20, SKIP_DATA, "Don't export mesh names as 'data' info.")
|
||||
Draw.Toggle("Mir2Amb", 3, 15, 50, 90, 20, MIRCOL_AS_AMB, "Get AC3D's ambient RGB color for each object from its mirror color in Blender.")
|
||||
Draw.Toggle("Mir2Emis", 4, 15, 30, 90, 20, MIRCOL_AS_EMIS, "Get AC3D's emissive RGB color for each object from its mirror color in Blender.")
|
||||
Draw.Button("Export All...", 10, 140, 80, 110, 30, "Export all meshes to an AC3D file.")
|
||||
Draw.Button("Export Selected...", 11, 140, 40, 110, 30, "Export selected meshes to an AC3D file.")
|
||||
Draw.Toggle("Default mat", 1, 15, 100, 90, 20, ADD_DEFAULT_MAT,
|
||||
"Objects without materials assigned get a default (white) one"
|
||||
" automatically.")
|
||||
Draw.Toggle("Skip data", 2, 15, 80, 90, 20, SKIP_DATA,
|
||||
"Don't export mesh names as 'data' info.")
|
||||
Draw.Toggle("Mir2Amb", 3, 15, 50, 90, 20, MIRCOL_AS_AMB,
|
||||
"Get AC3D's ambient RGB color for each object from its mirror color "
|
||||
"in Blender.")
|
||||
Draw.Toggle("Mir2Emis", 4, 15, 30, 90, 20, MIRCOL_AS_EMIS,
|
||||
"Get AC3D's emissive RGB color for each object from its mirror color "
|
||||
"in Blender.")
|
||||
Draw.Button("Export All...", 10, 140, 80, 110, 30,
|
||||
"Export all meshes to an AC3D file.")
|
||||
Draw.Button("Export Selected...", 11, 140, 40, 110, 30,
|
||||
"Export selected meshes to an AC3D file.")
|
||||
Draw.Button("HELP", 20, 285, 80, 100, 40, "Click for additional info.")
|
||||
Draw.Button("EXIT", 22, 285, 30, 100, 40, "Click to leave.")
|
||||
|
||||
|
462
release/scripts/bevel_center.py
Normal file
462
release/scripts/bevel_center.py
Normal file
@ -0,0 +1,462 @@
|
||||
#!BPY
|
||||
|
||||
""" Registration info for Blender menus
|
||||
Name: 'Bevel Center'
|
||||
Blender: 232
|
||||
Group: 'Mesh'
|
||||
Tip: 'Bevel selected vertices.'
|
||||
"""
|
||||
|
||||
######################################################################
|
||||
# Bevel Center v1 for Blender
|
||||
#
|
||||
# This script lets you bevel the selected vertices and control the
|
||||
# thickness of the bevel
|
||||
#
|
||||
# (c) 2004 Loïc Berthe (loic.berthe@lilotux.net)
|
||||
# released under Blender Artistic License
|
||||
#
|
||||
######################################################################
|
||||
|
||||
import Blender
|
||||
from Blender import NMesh
|
||||
from Blender.Draw import *
|
||||
from Blender.BGL import *
|
||||
|
||||
from math import pi, sin, sqrt
|
||||
|
||||
######################################################################
|
||||
# Functions to handle the global structures of the script NV, NE and NC
|
||||
# which contain informations about the vertices, faces and corners to be
|
||||
# created
|
||||
|
||||
class Dir:
|
||||
def __init__(self, co):
|
||||
self.co = co
|
||||
|
||||
def add_to_NV(old,co,new):
|
||||
dir = Dir(co)
|
||||
#
|
||||
if old in NV.keys():
|
||||
NV[old][dir] = new
|
||||
else:
|
||||
NV[old] = {dir:new}
|
||||
|
||||
def is_in_NV(old,co):
|
||||
if old in NV.keys():
|
||||
for dir in NV[old]:
|
||||
if dir.co == co : return NV[old][dir]
|
||||
#
|
||||
return False
|
||||
|
||||
def add_to_NE(old, new):
|
||||
ind1 = old[0].index
|
||||
ind2 = old[1].index
|
||||
if ind1 > ind2:
|
||||
new.reverse()
|
||||
ind1,ind2 = ind2,ind1
|
||||
id = str(ind1)+"_"+str(ind2)
|
||||
if id in NE.keys():
|
||||
[NE[id].append(v) for v in new]
|
||||
else:
|
||||
NE[id] = new
|
||||
|
||||
def add_to_NC(old,edge):
|
||||
if old in NC.keys():
|
||||
NC[old].append(edge)
|
||||
else:
|
||||
NC[old] = [edge]
|
||||
|
||||
######################################################################
|
||||
# Geometric functions
|
||||
|
||||
def norm(vec):
|
||||
n = sqrt(vec[0]**2+vec[1]**2+vec[2]**2)
|
||||
return [vec[0]/n,vec[1]/n,vec[2]/n]
|
||||
|
||||
def parall_coord(old, dir):
|
||||
co = old.co
|
||||
vec = [0.0,0.0,0.0]
|
||||
nco = [0.0,0.0,0.0]
|
||||
#
|
||||
if len(dir) == 1:
|
||||
for i in range(3): vec[i] = dir[0].co[i] - co[i]
|
||||
vec = norm(vec)
|
||||
#
|
||||
elif len(dir) == 2:
|
||||
vec1 = [0.0,0.0,0.0]
|
||||
vec2 = [0.0,0.0,0.0]
|
||||
for i in range(3):
|
||||
vec1[i] = dir[0].co[i] - co[i]
|
||||
vec2[i] = dir[1].co[i] - co[i]
|
||||
vec1 = norm(vec1)
|
||||
vec2 = norm(vec2)
|
||||
for i in range(3) : vec[i] = vec1[i]+vec2[i]
|
||||
#
|
||||
for i in range(3): nco[i] = co[i] + dist.val*vec[i]
|
||||
return (nco,vec)
|
||||
|
||||
def get_vert(old, dir):
|
||||
""" Look in NV if a vertice corresponding to the vertex old and the
|
||||
direction dir already exists, and create one otherwise"""
|
||||
(nco, vec) = parall_coord(old, dir)
|
||||
v = is_in_NV(old,vec)
|
||||
if v: return v
|
||||
#
|
||||
v = NMesh.Vert(nco[0],nco[1],nco[2])
|
||||
v.sel = 1
|
||||
me.verts.append(v)
|
||||
add_to_NV(old,vec,v)
|
||||
return v
|
||||
|
||||
######################################################################
|
||||
# Functions to create the differents faces
|
||||
|
||||
def make_NF():
|
||||
""" Analyse the mesh, sort the faces containing selected vertices and
|
||||
create a liste NF : NF = [[flag, vertlist, old_face]]. Flag describes the
|
||||
topology of the face."""
|
||||
#
|
||||
for f in me.faces:
|
||||
V = f.v
|
||||
v_sel = [x.sel for x in V]
|
||||
nb_sel = sum(v_sel)
|
||||
if nb_sel == 0 :
|
||||
pass
|
||||
else:
|
||||
nb_v = len(V)
|
||||
#
|
||||
if nb_v == 4:
|
||||
#
|
||||
if nb_sel == 4:
|
||||
NF.append([1,V,f])
|
||||
#
|
||||
elif nb_sel == 3:
|
||||
if v_sel == [0,1,1,1]: V = [V[1],V[2],V[3],V[0]]
|
||||
elif v_sel == [1,0,1,1]: V = [V[2],V[3],V[0],V[1]]
|
||||
elif v_sel == [1,1,0,1]: V = [V[3],V[0],V[1],V[2]]
|
||||
NF.append([2,V,f])
|
||||
#
|
||||
elif nb_sel == 2:
|
||||
if v_sel == [1,0,1,0] or v_sel == [0,1,0,1]:
|
||||
if v_sel == [0,1,0,1]: V = [V[1],V[2],V[3],V[0]]
|
||||
NF.append([5,[V[0],V[1],V[3]],f])
|
||||
NF.append([5,[V[2],V[1],V[3]]])
|
||||
else:
|
||||
if v_sel == [0,1,1,0]: V = [V[1],V[2],V[3],V[0]]
|
||||
elif v_sel == [0,0,1,1]: V = [V[2],V[3],V[0],V[1]]
|
||||
elif v_sel == [1,0,0,1]: V = [V[3],V[0],V[1],V[2]]
|
||||
NF.append([3,V,f])
|
||||
#
|
||||
else:
|
||||
if v_sel == [0,1,0,0]: V = [V[1],V[2],V[3],V[0]]
|
||||
elif v_sel == [0,0,1,0]: V = [V[2],V[3],V[0],V[1]]
|
||||
elif v_sel == [0,0,0,1]: V = [V[3],V[0],V[1],V[2]]
|
||||
NF.append([4,V,f])
|
||||
#
|
||||
elif nb_v == 3:
|
||||
#
|
||||
if nb_sel == 3:
|
||||
NF.append([6,V,f])
|
||||
#
|
||||
elif nb_sel == 2:
|
||||
if v_sel == [0,1,1]: V = [V[1],V[2],V[0]]
|
||||
elif v_sel == [1,0,1]: V = [V[2],V[0],V[1]]
|
||||
NF.append([7,V,f])
|
||||
#
|
||||
else:
|
||||
if v_sel == [0,1,0]: V = [V[1],V[2],V[0]]
|
||||
elif v_sel == [0,0,1]: V = [V[2],V[0],V[1]]
|
||||
NF.append([5,V,f])
|
||||
|
||||
def make_faces():
|
||||
""" Make the new faces according to NF """
|
||||
#
|
||||
for N in NF:
|
||||
cas = N[0]
|
||||
V = N[1]
|
||||
#
|
||||
if cas < 6:
|
||||
new_v = [0,0,0,0]
|
||||
if cas == 1: # v_sel = [1,1,1,1]
|
||||
for i in range(-1,3):
|
||||
new_v[i] = get_vert(V[i],[V[i-1],V[i+1]])
|
||||
new_f = NMesh.Face(new_v)
|
||||
me.faces.append(new_f)
|
||||
for i in range(-1,3):
|
||||
add_to_NE([V[i],V[i+1]],[new_v[i],new_v[i+1]])
|
||||
#
|
||||
elif cas == 2: # v_sel = [1,1,1,0]
|
||||
new_v[0] = get_vert(V[0],[V[3]])
|
||||
new_v[1] = get_vert(V[1],[V[0],V[2]])
|
||||
new_v[2] = get_vert(V[2],[V[3]])
|
||||
new_v[3] = V[3]
|
||||
#
|
||||
new_f = NMesh.Face(new_v)
|
||||
me.faces.append(new_f)
|
||||
#
|
||||
add_to_NE([V[0],V[1]],[new_v[0],new_v[1]])
|
||||
add_to_NE([V[1],V[2]],[new_v[1],new_v[2]])
|
||||
#
|
||||
elif cas == 3: # v_sel = [1,1,0,0]
|
||||
new_v[0] = get_vert(V[0],[V[3]])
|
||||
new_v[1] = get_vert(V[1],[V[2]])
|
||||
new_v[2] = V[2]
|
||||
new_v[3] = V[3]
|
||||
#
|
||||
new_f = NMesh.Face(new_v)
|
||||
me.faces.append(new_f)
|
||||
#
|
||||
add_to_NE([V[0],V[1]],[new_v[0],new_v[1]])
|
||||
#
|
||||
elif cas == 4: # v_sel = [1,0,0,0]
|
||||
new_v[0] = get_vert(V[0],[V[3]])
|
||||
new_v[1] = get_vert(V[0],[V[1]])
|
||||
new_v[2] = V[1]
|
||||
new_v[3] = V[3]
|
||||
#
|
||||
new_f = NMesh.Face(new_v)
|
||||
me.faces.append(new_f)
|
||||
#
|
||||
add_to_NC(V[0], new_v[0:2])
|
||||
#
|
||||
new_v[0] = V[1]
|
||||
new_v[1] = V[2]
|
||||
new_v[2] = V[3]
|
||||
#
|
||||
new_f = NMesh.Face(new_v[:3])
|
||||
me.faces.append(new_f)
|
||||
#
|
||||
else: # v_sel = [1,0,0]
|
||||
new_v[0] = get_vert(V[0],[V[2]])
|
||||
new_v[1] = get_vert(V[0],[V[1]])
|
||||
new_v[2] = V[1]
|
||||
new_v[3] = V[2]
|
||||
#
|
||||
new_f = NMesh.Face(new_v)
|
||||
me.faces.append(new_f)
|
||||
#
|
||||
add_to_NC(V[0], new_v[0:2])
|
||||
#
|
||||
else:
|
||||
new_v = [0,0,0]
|
||||
#
|
||||
if cas == 6: # v_sel = [1,1,1]
|
||||
for i in range(-1,2):
|
||||
new_v[i] = get_vert(V[i],[V[i-1],V[i+1]])
|
||||
new_f = NMesh.Face(new_v)
|
||||
me.faces.append(new_f)
|
||||
for i in range(-1,2):
|
||||
add_to_NE([V[i],V[i+1]],[new_v[i],new_v[i+1]])
|
||||
#
|
||||
elif cas == 7: # v_sel = [1,1,0]
|
||||
new_v[0] = get_vert(V[0],[V[2]])
|
||||
new_v[1] = get_vert(V[1],[V[2]])
|
||||
new_v[2] = V[2]
|
||||
#
|
||||
new_f = NMesh.Face(new_v)
|
||||
me.faces.append(new_f)
|
||||
add_to_NE([V[0],V[1]],[new_v[0],new_v[1]])
|
||||
|
||||
def make_edges():
|
||||
""" Make the faces corresponding to selected edges """
|
||||
#
|
||||
for l in NE.values():
|
||||
if len(l) == 4:
|
||||
f = NMesh.Face([l[0],l[1],l[3],l[2]])
|
||||
me.faces.append(f)
|
||||
|
||||
def make_corners():
|
||||
""" Make the faces corresponding to selected corners """
|
||||
#
|
||||
for v in NV.keys():
|
||||
V = NV[v].values()
|
||||
nb_v = len(V)
|
||||
#
|
||||
if nb_v < 3:
|
||||
pass
|
||||
#
|
||||
elif nb_v == 3:
|
||||
new_f = NMesh.Face(V)
|
||||
me.faces.append(new_f)
|
||||
#
|
||||
else:
|
||||
# We need to know which are the edges around the corner.
|
||||
# First, we look for the quads surrounding the corner.
|
||||
q = [NE[id] for id in NE.keys() if str(v.index) in id.split('_')]
|
||||
#
|
||||
# We will put the associated edges in the list eed
|
||||
is_in_v = lambda x:x in V
|
||||
eed = [filter(is_in_v, l) for l in q]
|
||||
#
|
||||
# We will add the edges coming from faces where only one vertice is selected.
|
||||
# They are stocked in NC.
|
||||
if v in NC.keys():
|
||||
eed = eed+NC[v]
|
||||
b = eed.pop()
|
||||
# b will contain the sorted list of vertices
|
||||
#
|
||||
while eed:
|
||||
for l in eed:
|
||||
if l[0] == b[-1]:
|
||||
b.append(l[1])
|
||||
eed.remove(l)
|
||||
break
|
||||
elif l[1] == b[-1]:
|
||||
b.append(l[0])
|
||||
eed.remove(l)
|
||||
break
|
||||
# Now we can create the faces
|
||||
if nb_v == 4:
|
||||
new_f = NMesh.Face(b[:4])
|
||||
me.faces.append(new_f)
|
||||
#
|
||||
else:
|
||||
co = [0.0, 0.0,0.0]
|
||||
vec = [0.0, 0.0,0.0]
|
||||
for x in V:
|
||||
co[0] += x[0]
|
||||
co[1] += x[1]
|
||||
co[2] += x[2]
|
||||
#
|
||||
for dir in NV[v]:
|
||||
vec[0] += dir.co[0]
|
||||
vec[1] += dir.co[1]
|
||||
vec[2] += dir.co[2]
|
||||
#
|
||||
co = [x/nb_v for x in co]
|
||||
vec = [x/nb_v for x in vec]
|
||||
center = NMesh.Vert(co[0],co[1],co[2])
|
||||
center.sel = 1
|
||||
me.verts.append(center)
|
||||
add_to_NV(v,vec,center)
|
||||
#
|
||||
for k in range(nb_v):
|
||||
new_f = NMesh.Face([center, b[k], b[k+1]])
|
||||
me.faces.append(new_f)
|
||||
#
|
||||
|
||||
def clear_old():
|
||||
""" Erase old faces and vertices """
|
||||
for F in NF:
|
||||
if len(F) == 3:
|
||||
me.faces.remove(F[2])
|
||||
#
|
||||
for v in NV.keys():
|
||||
me.verts.remove(v)
|
||||
|
||||
######################################################################
|
||||
# Interface
|
||||
#
|
||||
global dist
|
||||
dist = Create(0.2)
|
||||
left = Create(0.0)
|
||||
right = Create(1.0)
|
||||
num = Create(2)
|
||||
|
||||
# Events
|
||||
EVENT_NOEVENT = 1
|
||||
EVENT_BEVEL = 2
|
||||
EVENT_UPDATE = 3
|
||||
EVENT_RECURS = 4
|
||||
EVENT_EXIT = 5
|
||||
|
||||
def draw():
|
||||
global dist, left, right, num
|
||||
global EVENT_NOEVENT, EVENT_BEVEL, EVENT_UPDATE, EVENT_RECURS, EVENT_EXIT
|
||||
|
||||
glClear(GL_COLOR_BUFFER_BIT)
|
||||
Button("Bevel",EVENT_BEVEL,10,100,280,25)
|
||||
left=Number('', EVENT_NOEVENT,10,70,45, 20,left.val,0,right.val,'Set the minimum of the slider')
|
||||
right = Number("",EVENT_NOEVENT,245,70,45,20,right.val,left.val,200,"Set the maximum of the slider")
|
||||
dist=Slider("Thickness ",EVENT_UPDATE,60,70,180,20,dist.val,left.val,right.val,0,"Thickness of the bevel")
|
||||
glRasterPos2d(8,40)
|
||||
Text('To finish, you can use recursive bevel to smooth it')
|
||||
num=Number('', EVENT_NOEVENT,10,10,40, 16,num.val,1,100,'Recursion level')
|
||||
Button("Recursive",EVENT_RECURS,55,10,100,16)
|
||||
Button("Exit",EVENT_EXIT,210,10,80,20)
|
||||
|
||||
def event(evt, val):
|
||||
if (evt == QKEY and not val):
|
||||
Exit()
|
||||
|
||||
def bevent(evt):
|
||||
if evt == EVENT_EXIT :
|
||||
Exit()
|
||||
#
|
||||
elif evt == EVENT_BEVEL:
|
||||
bevel()
|
||||
#
|
||||
elif evt == EVENT_UPDATE:
|
||||
try:
|
||||
bevel_update()
|
||||
except NameError:
|
||||
pass
|
||||
#
|
||||
elif evt == EVENT_RECURS:
|
||||
recursive()
|
||||
|
||||
Register(draw, event, bevent)
|
||||
|
||||
######################################################################
|
||||
def bevel():
|
||||
""" The main function, which creates the bevel """
|
||||
global me,NF,NV,NE,NC, old_dist
|
||||
#
|
||||
objects = Blender.Object.GetSelected()
|
||||
me = NMesh.GetRaw(objects[0].data.name)
|
||||
#
|
||||
NF = []
|
||||
NV = {}
|
||||
NE = {}
|
||||
NC = {}
|
||||
#
|
||||
make_NF()
|
||||
make_faces()
|
||||
make_edges()
|
||||
make_corners()
|
||||
clear_old()
|
||||
#
|
||||
old_dist = dist.val
|
||||
#
|
||||
me.update(1)
|
||||
Blender.Redraw()
|
||||
|
||||
def bevel_update():
|
||||
""" Use NV to update the bevel """
|
||||
global dist, old_dist
|
||||
fac = dist.val - old_dist
|
||||
old_dist = dist.val
|
||||
#
|
||||
for old_v in NV.keys():
|
||||
for dir in NV[old_v].keys():
|
||||
for i in range(3):
|
||||
NV[old_v][dir].co[i] += fac*dir.co[i]
|
||||
#
|
||||
me.update(1)
|
||||
Blender.Redraw()
|
||||
|
||||
def recursive():
|
||||
""" Make a recursive bevel... still experimental """
|
||||
global dist
|
||||
#
|
||||
if num.val > 1:
|
||||
a = pi/4
|
||||
ang = []
|
||||
for k in range(num.val):
|
||||
ang.append(a)
|
||||
a = (pi+2*a)/4
|
||||
#
|
||||
l = [2*(1-sin(x))/sin(2*x) for x in ang]
|
||||
R = dist.val/sum(l)
|
||||
l = [x*R for x in l]
|
||||
#
|
||||
dist.val = l[0]
|
||||
bevel_update()
|
||||
#
|
||||
for x in l[1:]:
|
||||
dist.val = x
|
||||
bevel()
|
||||
|
||||
# vim:set ts=4 sw=4:
|
||||
|
425
release/scripts/doc_browser.py
Normal file
425
release/scripts/doc_browser.py
Normal file
@ -0,0 +1,425 @@
|
||||
#!BPY
|
||||
|
||||
"""
|
||||
Name: 'BPy Doc Browser'
|
||||
Blender: 232
|
||||
Group: 'Misc'
|
||||
Tip: 'Browse BPython (scripting API) modules doc strings.'
|
||||
"""
|
||||
|
||||
# $Id$
|
||||
#
|
||||
# --------------------------------------------------------------------------
|
||||
# ***** BEGIN GPL LICENSE BLOCK *****
|
||||
#
|
||||
# Copyright (C) 2004: Daniel Dunbar, ddunbar _at_ diads.com
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License
|
||||
# as published by the Free Software Foundation; either version 2
|
||||
# of the License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software Foundation,
|
||||
# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
#
|
||||
# ***** END GPL LICENCE BLOCK *****
|
||||
# --------------------------------------------------------------------------
|
||||
|
||||
#####
|
||||
# Blender help browser
|
||||
# By Daniel Dunbar,
|
||||
#
|
||||
# This should function as a self-explanatory (interface, not code)
|
||||
# (mostly) help browser. The code is wacky and nasty and or fun,
|
||||
# but mainly bad, just cause it works doesn't mean its readable!
|
||||
#
|
||||
# TEEHEE!
|
||||
#
|
||||
# The row_draw function could easily be made into a more generic
|
||||
# and usefull table drawing function...
|
||||
#
|
||||
|
||||
import Blender
|
||||
from types import ListType, IntType, FloatType, StringType, ModuleType
|
||||
from Blender.Draw import *
|
||||
from Blender.BGL import *
|
||||
|
||||
# Simple version check, since I use the
|
||||
# buffer calls... DONT use this code,
|
||||
# assume everyone has 1.73+, and force
|
||||
# them to upgrade if they dont
|
||||
try:
|
||||
a= BufList
|
||||
version= 172
|
||||
except:
|
||||
version= 173
|
||||
|
||||
# I could have used the split from the string module,
|
||||
# but some people might not have it
|
||||
def split(str, on):
|
||||
out= [""]
|
||||
for s in str:
|
||||
if s in on: out.append("")
|
||||
else: out[-1]= out[-1]+s
|
||||
|
||||
if out[-1]=="": del(out[-1])
|
||||
|
||||
return out
|
||||
|
||||
last_sort= 1; direction= 1
|
||||
def sort_browselist(type):
|
||||
global browselist
|
||||
global last_sort, direction
|
||||
|
||||
if (type==last_sort): direction= -direction
|
||||
else: direction= 1
|
||||
|
||||
last_sort= type
|
||||
|
||||
if (direction==1):
|
||||
def byname(x, y): return cmp(x[0],y[0]);
|
||||
def bytype(x, y): return cmp(x[1],y[1])
|
||||
def bydata(x, y): return cmp(x[2],y[2])
|
||||
else:
|
||||
def byname(x, y): return cmp(y[0],x[0]);
|
||||
def bytype(x, y): return cmp(y[1],x[1])
|
||||
def bydata(x, y): return cmp(y[2],x[2])
|
||||
|
||||
if (type==1): browselist.sort(byname)
|
||||
elif (type==2): browselist.sort(bytype)
|
||||
elif (type==3): browselist.sort(bydata)
|
||||
|
||||
selected= -1
|
||||
def view_doc(num):
|
||||
global selected, selected_page
|
||||
|
||||
if (selected==num): selected= -1
|
||||
else: selected= num
|
||||
|
||||
selected_page= 0
|
||||
|
||||
function_filter= 0
|
||||
def toggle_function_filter():
|
||||
global function_filter
|
||||
|
||||
function_filter= not function_filter
|
||||
make_browselist()
|
||||
|
||||
def view_page(dir):
|
||||
global selected_page
|
||||
|
||||
selected_page= selected_page + dir
|
||||
|
||||
browse_scrollstart= 0
|
||||
def browse_module(num):
|
||||
global browsing, selected, browse_scrollstart
|
||||
|
||||
if (num>=0): newstr= browsing.val + "." + browselist[num][0]
|
||||
else:
|
||||
modules= split(browsing.val, ".")
|
||||
newstr= ""
|
||||
for m in modules[:-1]:
|
||||
newstr= newstr+m
|
||||
try:
|
||||
browsing= Create(newstr)
|
||||
make_browselist()
|
||||
except:
|
||||
browsing= Create('Blender')
|
||||
make_browselist()
|
||||
|
||||
browse_scrollstart= 0
|
||||
scrolling= 0
|
||||
selected= -1
|
||||
|
||||
def make_browselist():
|
||||
global browselist
|
||||
|
||||
browselist= []
|
||||
|
||||
module= eval(browsing.val)
|
||||
items= dir(module)
|
||||
|
||||
for item_name in items:
|
||||
if (item_name[:2]=='__'): continue
|
||||
|
||||
data= [item_name, 'None', '', '']
|
||||
item= eval(item_name,module.__dict__)
|
||||
t= type(item)
|
||||
|
||||
if (t==IntType): data[1]= 'Int'; data[2]= `item`
|
||||
elif (t==FloatType): data[1]= 'Float'; data[2]= `item`
|
||||
elif (t==StringType): data[1]= 'String'
|
||||
elif (t==ModuleType): data[1]= 'Module'
|
||||
elif (callable(item)):
|
||||
data[1]= 'Function'
|
||||
doc= item.__doc__
|
||||
if (doc): data[3]= doc
|
||||
|
||||
if (function_filter and data[1]!='Function'): continue
|
||||
|
||||
browselist.append(data)
|
||||
|
||||
browsing= Create('Blender')
|
||||
make_browselist()
|
||||
|
||||
BROWSE_EVT= 1
|
||||
|
||||
SORT_BYNAME= 2
|
||||
SORT_BYTYPE= 3
|
||||
SORT_BYDATA= 4
|
||||
|
||||
DOC_PAGE_UP= 5
|
||||
DOC_PAGE_DOWN= 6
|
||||
|
||||
BACK_MODULE= 7
|
||||
CLOSE_VIEW= 8
|
||||
FILTER_DISPLAY= 9
|
||||
|
||||
SCROLLBAR= 10
|
||||
|
||||
VIEW_DOC= 100
|
||||
BROWSE_MODULE= 20000
|
||||
|
||||
scr= Create(0)
|
||||
browse_scrollstart= 0
|
||||
|
||||
winrect= [0.0, 0.0, 0.0, 0.0]
|
||||
def draw():
|
||||
global browsing, winrect, scr, browse_scrollstart
|
||||
|
||||
# Blender doesn't give us direct access to
|
||||
# the window size yet, but it does set the
|
||||
# GL scissor box for it, so we can get the
|
||||
# size from that.
|
||||
|
||||
if (version<173):
|
||||
size= Buffer(GL_FLOAT, None, 4)
|
||||
glGetFloat(GL_SCISSOR_BOX, size)
|
||||
size= BufList(size)
|
||||
else:
|
||||
size= Buffer(GL_FLOAT, 4)
|
||||
glGetFloatv(GL_SCISSOR_BOX, size)
|
||||
size= size.list
|
||||
|
||||
winrect= size[:]
|
||||
|
||||
size[0]= size[1]= 0.0
|
||||
|
||||
# Shrink the size to make a nice frame
|
||||
# (also a good technique so you can be sure you are clipping things properly)
|
||||
size[0], size[1]= int(size[0]+10), int(size[1]+10)
|
||||
size[2], size[3]= int(size[2]-12), int(size[3]-10)
|
||||
|
||||
glClearColor(0.6, 0.5, 0.3, 0.0)
|
||||
glClear(GL_COLOR_BUFFER_BIT)
|
||||
|
||||
# The frame
|
||||
glColor3f(0.4, 0.5, 0.2)
|
||||
glRectf(size[0], size[1], size[2], size[3])
|
||||
|
||||
# Window header
|
||||
glColor3f(0.2, 0.2, 0.4)
|
||||
glRectf(size[0], size[3]-25, size[2], size[3])
|
||||
|
||||
glColor3f(0.6, 0.6, 0.6)
|
||||
glRasterPos2f(size[0]+15, size[3]-17)
|
||||
Text("Zr's Help Browser")
|
||||
|
||||
Button("Filter", FILTER_DISPLAY, size[2]-400, size[3]-22, 45, 18)
|
||||
Button("Back", BACK_MODULE, size[2]-300, size[3]-22, 45, 18)
|
||||
browsing= String("Browse: ", BROWSE_EVT, size[2]-250, size[3]-22, 245, 18, browsing.val, 30)
|
||||
|
||||
# The real table
|
||||
def row_draw(rect, data, cols, cell_colors, text_colors):
|
||||
if (len(data)!=len(cols)):
|
||||
print "Must have same length data and columns"
|
||||
return
|
||||
|
||||
if (type(cell_colors)!=ListType): cell_colors= [cell_colors]
|
||||
if (type(text_colors)!=ListType): text_colors= [text_colors]
|
||||
|
||||
sx= rect[0]
|
||||
for i in range(len(data)):
|
||||
d= data[i]
|
||||
c= cols[i]
|
||||
|
||||
c, align= c[0], c[1]
|
||||
|
||||
if (type(c)==FloatType): c= c*(rect[2]-rect[0])
|
||||
ex= sx + c
|
||||
|
||||
color= cell_colors[i%len(cell_colors)]
|
||||
apply(glColor3f, color)
|
||||
glRectf(sx, rect[1], ex, rect[3])
|
||||
|
||||
color= text_colors[i%len(text_colors)]
|
||||
apply(glColor3f, color)
|
||||
|
||||
if (type(d)==StringType):
|
||||
str_width= len(d)*8
|
||||
if (align=='left'): glRasterPos2f(sx+3, rect[1]+5)
|
||||
elif (align=='center'): glRasterPos2f((sx+ex)/2 - str_width/2 +3, rect[1]+5)
|
||||
elif (align=='right'): glRasterPos2f(ex - str_width -3, rect[1]+5)
|
||||
|
||||
Text(d)
|
||||
else:
|
||||
d(map(int,[sx, rect[1], ex, rect[3]]))
|
||||
|
||||
sx= ex
|
||||
# Some colors
|
||||
black= (0.0, 0.0, 0.0)
|
||||
white= (1.0, 1.0, 1.0)
|
||||
red= (0.8, 0.1, 0.1)
|
||||
|
||||
gray0= (0.17, 0.17, 0.17)
|
||||
gray1= (0.25, 0.25, 0.25)
|
||||
gray2= (0.33, 0.33, 0.33)
|
||||
gray3= (0.41, 0.41, 0.41)
|
||||
gray4= (0.49, 0.49, 0.49)
|
||||
gray5= (0.57, 0.57, 0.57)
|
||||
gray6= (0.65, 0.65, 0.65)
|
||||
|
||||
cols= [[.3, 'left'], [.2, 'left'], [.4, 'right'], [.1, 'center']]
|
||||
|
||||
header= [size[0]+20, size[3]-60, size[2]-40, size[3]-40]
|
||||
|
||||
def sort_byname(co): Button("Name",SORT_BYNAME, co[0]+3, co[1], co[2]-co[0]-4, 19)
|
||||
def sort_bytype(co): Button("Type",SORT_BYTYPE, co[0]+3, co[1], co[2]-co[0]-4, 19)
|
||||
def sort_bydata(co): Button("Data",SORT_BYDATA, co[0]+3, co[1], co[2]-co[0]-4, 19)
|
||||
|
||||
row_draw(header, [sort_byname, sort_bytype, sort_bydata,'Link'], cols, [gray0, gray1], gray6)
|
||||
|
||||
if (selected!=-1):
|
||||
table= [size[0]+20, size[1]+220, size[2]-40, size[3]-60]
|
||||
else:
|
||||
table= [size[0]+20, size[1]+20, size[2]-40, size[3]-60]
|
||||
|
||||
row_height= 25
|
||||
items= (table[3]-table[1])/row_height
|
||||
|
||||
items= 10
|
||||
if (items>len(browselist)): items= len(browselist)
|
||||
|
||||
end= len(browselist)-items
|
||||
if (end>0):
|
||||
scr= Scrollbar(SCROLLBAR, table[2]+5, table[1], 20, table[3]-table[1], scr.val, 0.0, end, 0, "Page Up/Down scrolls list.")
|
||||
|
||||
row= table
|
||||
row[1]= row[3]-row_height
|
||||
start= browse_scrollstart
|
||||
if (start+items>len(browselist)): items= len(browselist)-start
|
||||
for i in range(items):
|
||||
i= start+i
|
||||
data= browselist[i][:]
|
||||
|
||||
if (i%2): colors= [gray1, gray2]
|
||||
else: colors= [gray2, gray3]
|
||||
|
||||
# Strange pythonic code
|
||||
def view_doc(co,num=i):
|
||||
Button("Doc",VIEW_DOC+num, co[0]+3, co[1]+2, co[2]-co[0]-4, 19)
|
||||
|
||||
def browse_module(co,num=i):
|
||||
Button("Browse",BROWSE_MODULE+num, co[0]+3, co[1]+2, co[2]-co[0]-4, 19)
|
||||
|
||||
if (data[1]=='Function'):
|
||||
if data[3]:
|
||||
data[3]= view_doc
|
||||
tcolor= black
|
||||
else:
|
||||
tcolor= red
|
||||
data[2]= 'NO DOC STRING'
|
||||
data[3]= ''
|
||||
else:
|
||||
if (data[1]=='Module'): data[3]= browse_module
|
||||
else: data[3]= ''
|
||||
|
||||
tcolor= black
|
||||
|
||||
row_draw(row, data, cols, colors, tcolor)
|
||||
|
||||
row[1]= row[1]-row_height
|
||||
row[3]= row[3]-row_height
|
||||
|
||||
if (selected!=-1):
|
||||
table= [size[0]+20, size[1]+20, size[2]-40, size[1]+180]
|
||||
|
||||
apply(glColor3f, gray5)
|
||||
glRectf(table[0], table[3], table[2], table[3]+20)
|
||||
apply(glColor3f, gray2)
|
||||
glRectf(table[0], table[1], table[2], table[3])
|
||||
|
||||
apply(glColor3f, black)
|
||||
glRasterPos2f(table[0]+3, table[3]+5)
|
||||
Text("Function: " + browsing.val + "." + browselist[selected][0])
|
||||
|
||||
Button("Close", CLOSE_VIEW, table[2]-50, table[3], 45, 18)
|
||||
|
||||
row_height= 20
|
||||
view_lines= int((table[3]-table[1])/row_height)-1
|
||||
|
||||
lines= split(browselist[selected][3], "\n")
|
||||
doc_lines= len(lines)
|
||||
|
||||
sindex= view_lines*selected_page
|
||||
eindex= view_lines*(selected_page+1)
|
||||
if (sindex>0):
|
||||
sindex= sindex-1
|
||||
eindex= eindex-1
|
||||
|
||||
lines= lines[sindex:eindex]
|
||||
|
||||
y= table[3]-20
|
||||
for line in lines:
|
||||
glRasterPos2f(table[0]+3, y)
|
||||
Text(line)
|
||||
|
||||
y= y-20
|
||||
|
||||
if (sindex): Button("Page up", DOC_PAGE_UP, table[2]-100, table[3]-20, 90, 18)
|
||||
if (eindex<doc_lines): Button("Page down", DOC_PAGE_DOWN, table[2]-100, table[1]+5, 90, 18)
|
||||
|
||||
lmouse= [0, 0]
|
||||
def event(evt, val):
|
||||
global browse_scrollstart
|
||||
|
||||
if (evt==QKEY or evt==ESCKEY): Exit()
|
||||
elif (evt in [PAGEUPKEY, PAGEDOWNKEY] and val):
|
||||
if (evt==PAGEUPKEY): browse_scrollstart= browse_scrollstart-5
|
||||
else: browse_scrollstart= browse_scrollstart+5
|
||||
|
||||
if (browse_scrollstart<0): browse_scrollstart= 0
|
||||
elif (browse_scrollstart>=len(browselist)): browse_scrollstart= len(browselist)-1
|
||||
|
||||
Redraw()
|
||||
|
||||
def bevent(evt):
|
||||
if (evt==BROWSE_EVT): make_browselist()
|
||||
|
||||
elif (evt==SORT_BYNAME): sort_browselist(1)
|
||||
elif (evt==SORT_BYTYPE): sort_browselist(2)
|
||||
elif (evt==SORT_BYDATA): sort_browselist(3)
|
||||
|
||||
elif (evt==DOC_PAGE_UP): view_page(-1)
|
||||
elif (evt==DOC_PAGE_DOWN): view_page(1)
|
||||
|
||||
elif (evt==BACK_MODULE): browse_module(-1)
|
||||
elif (evt==CLOSE_VIEW): view_doc(-1)
|
||||
elif (evt==FILTER_DISPLAY): toggle_function_filter()
|
||||
|
||||
elif (evt==SCROLLBAR):
|
||||
global browse_scrollstart
|
||||
browse_scrollstart= int(scr.val)
|
||||
|
||||
elif (evt>=BROWSE_MODULE): browse_module(evt-BROWSE_MODULE)
|
||||
elif (evt>=VIEW_DOC): view_doc(evt-VIEW_DOC)
|
||||
|
||||
Redraw()
|
||||
|
||||
Register(draw, event, bevent)
|
438
release/scripts/hotkeys.py
Normal file
438
release/scripts/hotkeys.py
Normal file
@ -0,0 +1,438 @@
|
||||
#!BPY
|
||||
|
||||
""" Registration info for Blender menus:
|
||||
Name: 'HotKeys'
|
||||
Blender: 232
|
||||
Group: 'Help'
|
||||
Tip: 'All the hotkeys.'
|
||||
"""
|
||||
# $Id$
|
||||
#------------------------
|
||||
# Hotkeys script
|
||||
# jm soler (2003)
|
||||
# -----------------------
|
||||
# Page officielle :
|
||||
# http://jmsoler.free.fr/didacticiel/blender/tutor/cpl_hotkeyscript.htm
|
||||
# Communiquer les problemes et les erreurs sur:
|
||||
# http://www.zoo-logique.org/3D.Blender/newsportal/thread.php?group=3D.Blender
|
||||
#---------------------------------------------
|
||||
# ce script est proposé sous licence GPL pour etre associe
|
||||
# a la distribution de Blender 2.33 et suivant
|
||||
# --------------------------------------------------------------------------
|
||||
# ***** BEGIN GPL LICENSE BLOCK *****
|
||||
#
|
||||
# Copyright (C) 2003, 2004: Jean-Michel Soler
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License
|
||||
# as published by the Free Software Foundation; either version 2
|
||||
# of the License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software Foundation,
|
||||
# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
#
|
||||
# ***** END GPL LICENCE BLOCK *****
|
||||
# --------------------------------------------------------------------------
|
||||
|
||||
import Blender
|
||||
from Blender.Draw import *
|
||||
from Blender.BGL import *
|
||||
|
||||
hotkeys={
|
||||
'Specials 1 ':[
|
||||
[',', 'Set Bounding Box rotation scaling pivot'],
|
||||
['.', 'Set 3D cursor as rotation scaling pivot'] ,
|
||||
['~', 'Display all layers'] ,
|
||||
['Shift-~', 'Display all/previous layers'] ,
|
||||
['TAB', 'Enter/exit edit mode'] ,
|
||||
['TAB', 'Edit Mode and Numerical Edit (see N key) : move to next input value'],
|
||||
['TAB', 'Sequencer: Edit meta strip'] ,
|
||||
['CTRL-TAB', 'Enter/exit pose mode']
|
||||
],
|
||||
|
||||
'Specials 2 ':[
|
||||
['F1', 'Open File'],
|
||||
['F2', 'Save File'],
|
||||
['F3', 'Save image'],
|
||||
['F4', 'Logic window (may change)'],
|
||||
['F5', 'Material window'],
|
||||
['F6', 'Texture window'],
|
||||
['F7', 'Object window'],
|
||||
['F8', 'World window'],
|
||||
['F9', 'Edit Mode window'],
|
||||
['F10', 'Render Window'],
|
||||
['F11', 'Recall the last rendered image'],
|
||||
['F12', 'Render current Scene'],
|
||||
['Shift-F1', 'Library Data Select'],
|
||||
['Shift-F4', 'Data Select '],
|
||||
['Shift-F5', '3D window'],
|
||||
['Shift-F6', 'IPO window'],
|
||||
['Shift-F8', 'Video Sequencer window'],
|
||||
['Shift-F9', 'OOP window'],
|
||||
['Shift-F10', 'Image Window']
|
||||
] ,
|
||||
|
||||
'Numbers ':[
|
||||
['1..2..0-=', 'Show layer 1..2..12'] ,
|
||||
['ALT-1..2..0', 'Show layer 11..12..20'] ,
|
||||
['SHIFT-1..2..0-=', 'Toggle layer 1..2..12'] ,
|
||||
['SHIFT-ALT-...', 'Toggle layer 11..12..20'] ],
|
||||
|
||||
'Numpad ':[
|
||||
['Numpad DEL', 'Zoom on object'] ,
|
||||
['Numpad /', 'Local view on object (hide others)'] ,
|
||||
['Numpad *', "Rotate view to object's local axes"] ,
|
||||
['Numpad +', 'Zoom in (works everywhere)'] ,
|
||||
['Numpad +', 'Proportional vertex edit mode: Increase range of influence'] ,
|
||||
['Numpad -', 'Zoom out (works everywhere)'] ,
|
||||
['Numpad -', 'Proportional vertex edit mode: Decrease range of influence'] ,
|
||||
['Numpad INS', 'Set Camera view'] ,
|
||||
['CTRL-Numpad INS', 'Set active object as camera'] ,
|
||||
['ALT-Numbad INS', 'Restore old camera'] ,
|
||||
['Numpad 1', 'Front view'] ,
|
||||
['CTRL-Numpad 1', 'Back view'] ,
|
||||
['Numpad 3', 'Right-Side view'] ,
|
||||
['CTRL-Numpad 3', 'Left-Side view'] ,
|
||||
['Numpad 7', 'Top view'] ,
|
||||
['CTRL-Numpad 7', 'Bottom view '] ,
|
||||
['Numpad 5', 'Toggle orthogonal // perspective view'] ,
|
||||
['Numpad 9', 'Redraw view'] ,
|
||||
['Numpad 2', 'Rotate view left'] ,
|
||||
['Numpad 6', 'Rotate view right'] ,
|
||||
['Numpad 8', 'Rotate view up'] ,
|
||||
['Numpad 2', 'Rotate view down'] ],
|
||||
|
||||
'Arrows ':[
|
||||
['PgUp', 'IPO: Select next keyframe'] ,
|
||||
['CTRL-PgUp', 'IPO: Select and jump to next keyframe'] ,
|
||||
['PgDn', 'IPO: Select previous keyframe'] ,
|
||||
['CTRL-PgDn', 'IPO: Select and jump to previous keyframe'] ,
|
||||
['LEFT', 'One frame backwards'] ,
|
||||
['RIGHT', 'One frame forwards'] ,
|
||||
['DOWN', '10 frames backwards'] ,
|
||||
['UP', '10 frames forwards'] ],
|
||||
|
||||
'Letters ':[ {"A":[
|
||||
['A', 'Select all / Deselect all'] ,
|
||||
['ALT-A', 'Animate current window'] ,
|
||||
['CTRL-A', "Apply object's size/rotation to object data"] ,
|
||||
['SHIFT-A', 'Sequencer: ADD menu'] ,
|
||||
['SHIFT-ALT-A', 'Animate all windows'] ,
|
||||
['SHIFT-CTRL-A', 'Apply lattice / Make dupliverts real']] ,
|
||||
|
||||
"B":[
|
||||
['B', 'Border select'] ,
|
||||
['BB', 'Circle select'] ,
|
||||
['SHIFT-B', 'Set render border'] ],
|
||||
|
||||
"C":[
|
||||
['C', 'Center view on cursor'] ,
|
||||
['C', 'Sequencer: Change images'] ,
|
||||
['C', 'IPO: Snap current frame to selected key'] ,
|
||||
['ALT-C', 'Convert menu'] ,
|
||||
['CTRL-C', 'Copy menu (Copy properties of active to selected objects)'] ,
|
||||
['SHIFT-C', 'Center and zoom view on selected objects']] ,
|
||||
|
||||
"D":[
|
||||
['D', 'Set 3d draw mode'] ,
|
||||
['ALT-D', 'Create new instance of object'] ,
|
||||
['CTRL-D', 'Display alpha of image texture as wire'] ,
|
||||
['SHIFT-D', 'Create full copy of object'] ],
|
||||
|
||||
"E":[
|
||||
['E', 'Extrude'],
|
||||
['EX', 'Extrude along X axis'],
|
||||
['EY', 'Extrude along Y axis'],
|
||||
['EZ', 'Extrude along Z axis'],
|
||||
['ALT-E', 'Edit mode: exit edit mode'],] ,
|
||||
|
||||
"F":[
|
||||
['F', 'Edit mode: Make edge/face'] ,
|
||||
['F', 'Sequencer: Set Filter Y'] ,
|
||||
['F', 'Faceselect mode'] ,
|
||||
['ALT-F', 'Beautify fill'] ,
|
||||
['CTRL-F', 'Sort faces in Z direction'] ,
|
||||
['CTRL-F', 'Edit mode: Flip triangle edges'] ,
|
||||
['SHIFT-F', 'Edit mode: Fill with triangles']] ,
|
||||
|
||||
"G":[
|
||||
['G', 'Grab (move)'] ,
|
||||
['ALT-G', 'Clear location'] ,
|
||||
['SHIFT-ALT-G', 'Remove selected objects from group'] ,
|
||||
['CTRL-G', 'Add selected objects to group'] ,
|
||||
['SHIFT-G', 'Group menu'] ],
|
||||
|
||||
"H":[
|
||||
['H', 'Hide selected vertices/faces'] ,
|
||||
['H', 'Curves: Set handle type'] ,
|
||||
['ALT-H', 'Reveal vertices'] ,
|
||||
['CTRL-H', 'Curves: Automatic handle calculation'] ,
|
||||
['SHIFT-H', 'Hide deselected vertices'] ,
|
||||
['SHIFT-H', 'Curves: Set handle type']] ,
|
||||
|
||||
"I":[
|
||||
['I', 'Keyframe menu'] ],
|
||||
|
||||
"J":[
|
||||
['J', 'Mesh: Join all adjacent triangles to quads'] ,
|
||||
['J', 'Swap render page of render window'] ,
|
||||
['CTRL-J', 'Join selected objects'] ,
|
||||
['CTRL-J', 'Nurbs: Add segment'] ,
|
||||
['CTRL-J', 'IPO: Join keyframes menu'],
|
||||
['ALT-J', 'Edit Mode: convert quads to triangles']
|
||||
],
|
||||
|
||||
"K":[
|
||||
['K', '3d window: Show keyframe positions'] ,
|
||||
['K', 'IPO: Show keyframe positions'] ,
|
||||
['K', 'Nurbs: Print knots'] ,
|
||||
['CTRL-K', 'Make skeleton from armature'] ,
|
||||
['SHIFT-K', 'Show and select all keyframes for object'] ,
|
||||
['SHIFT-K', 'Edit: Knife Mode select'],
|
||||
['SHIFT-K', 'Faceselect: Clear vertexcolours'],
|
||||
] ,
|
||||
|
||||
"L":[
|
||||
['L', 'Make local menu'] ,
|
||||
['L', 'Edit mode: Select linked vertices (near mouse pointer)'] ,
|
||||
['L', 'OOPS window: Select linked objects'] ,
|
||||
['CTRL-L', 'Make links menu'] ,
|
||||
['SHIFT-L', 'Select links menu'] ],
|
||||
|
||||
"M":[
|
||||
['M', 'Move object to different layer'] ,
|
||||
['M', 'Sequencer: Make meta strip (group) from selected strips'],
|
||||
['ALT-M', 'Edit Mode: Merge vertices'] ],
|
||||
|
||||
"N":[
|
||||
['N', 'Numeric input menu (Size/Rot/Loc)'] ,
|
||||
['N', 'OOPS window: Rename object/linked objects'] ,
|
||||
['CTRL-N', 'Armature: Recalculate bone roll angles'] ,
|
||||
['CTRL-N', 'Recalculate normals to outside'] ,
|
||||
['CTRL-ALT-N', 'Recalculate normals to inside'] ],
|
||||
|
||||
"O":[
|
||||
['O', 'Edit mode: Toggle proportional vertex editing'] ,
|
||||
['ALT-O', 'Clear object origin'] ,
|
||||
['CTRL-O', 'Revert current file to last saved'] ,
|
||||
['SHIFT-O', 'Proportional vertex edit mode: Toggle smooth/steep falloff'] ],
|
||||
|
||||
"P":[
|
||||
['P', 'Start realtime engine'] ,
|
||||
['P', 'Edit mode: Seperate vertices to new object'] ,
|
||||
['ALT-P', 'Clear parent relationship'] ,
|
||||
['CTRL-P', 'Make active object parent of selected object'] ,
|
||||
['CTRL-SHIFT-P', 'Make active object parent of selected object without inverse'] ,
|
||||
['CTRL-P', 'Edit mode: Make active vertex parent of selected object'] ],
|
||||
|
||||
"Q":[['Q', 'Quit'] ],
|
||||
|
||||
"R":[
|
||||
['R', 'Rotate'] ,
|
||||
['R', 'IPO: Record mouse movement as IPO curve'] ,
|
||||
['RX', 'Rotate around X axis'] ,
|
||||
['RXX', "Rotate around object's local X axis"] ,
|
||||
['RY', 'Rotate around Y axis'] ,
|
||||
['RYY', "Rotate around object's local Y axis"] ,
|
||||
['RZ', 'Rotate around Z axis'] ,
|
||||
['RZZ', "Rotate around object's local Z axis"] ,
|
||||
['ALT-R', 'Clear object rotation'] ,
|
||||
['SHIFT-R', 'Nurbs: Select row'],
|
||||
['CTRL-R', 'Edit Mode: Knife, cut selected edges, accept left mouse/ cancel right mouse'],
|
||||
['SHIT-R', 'Edit Mode: loop Selection']],
|
||||
|
||||
"S":[
|
||||
['S', 'Scale'] ,
|
||||
['SX', 'Flip around X axis'] ,
|
||||
['SY', 'Flip around Y axis'] ,
|
||||
['SZ', 'Flip around Z axis'] ,
|
||||
['SXX', 'Flip around X axis and show axis'] ,
|
||||
['SYY', 'Flip around Y axis and show axis'] ,
|
||||
['SZZ', 'Flip around Z axis and show axis'] ,
|
||||
['ALT-S', 'Edit mode: Shrink/fatten (Scale along vertex normals)'] ,
|
||||
['ALT-S', 'Clear object size'] ,
|
||||
['CTRL-S', 'Edit mode: Shear'] ,
|
||||
['SHIFT-S', 'Cursor/Grid snap menu'] ],
|
||||
|
||||
"T":[
|
||||
['T', 'Sequencer: Touch and print selected movies'] ,
|
||||
['T', 'Adjust texture space'] ,
|
||||
['T', 'Edit mode: Flip 3d curve'] ,
|
||||
['T', 'IPO: Change IPO type'] ,
|
||||
['ALT-T', 'Clear tracking of object'] ,
|
||||
['CTRL-T', 'Make selected object track active object'] ,
|
||||
['CTRL-T', 'Mesh: Convert to triangles'] ,
|
||||
['CTRL-ALT-T', 'Blenchmark'] ],
|
||||
|
||||
"U":[
|
||||
['U', 'Make single user menu'] ,
|
||||
['U', 'Edit mode: Reload object data from before entering edit mode'] ,
|
||||
['U', 'Faceselect mode: Automatic UV calculation menu'] ,
|
||||
['U', 'Vertex-/Weightpaint mode: Undo'] ,
|
||||
['CTRL-U', 'Save current state as user default'],
|
||||
['SHIFT-U', 'EditMode : Redo Menu'],
|
||||
['ALT-U', 'Edit Mode: Undo Menu']
|
||||
],
|
||||
|
||||
"V":[
|
||||
['V', 'Curves/Nurbs: Vector handle'] ,
|
||||
['V', 'Vertexpaint mode'] ,
|
||||
['ALT-V', "Scale object to match image texture's aspect ratio"] ,
|
||||
['SHIFT-V', 'Edit mode: Align view to selected vertices'] ],
|
||||
|
||||
"W":[
|
||||
['W', 'Boolean operations menu'] ,
|
||||
['W', 'Edit mode: Specials menu'] ,
|
||||
['CTRL-W', 'Save current file'] ,
|
||||
['CTRL-W', 'Nurbs: Switch direction'] ,
|
||||
['SHIFT-W', 'Warp/bend selected vertices around cursor'] ] ,
|
||||
|
||||
"X":[
|
||||
['X', 'Delete menu'] ,
|
||||
['CTRL-X', 'Restore default state (Erase all)'] ],
|
||||
|
||||
"Y":[
|
||||
['Y', 'Mesh: Split selected vertices/faces from the rest'] ],
|
||||
|
||||
"Z":[
|
||||
['Z', 'Switch 3d draw type : solide/ wireframe (see also D)'],
|
||||
['Alt-Z', 'Switch 3d draw type : solid / textured (see also D)'],
|
||||
['Shift-Z', 'Switch 3d draw type : shaded / wireframe (see also D)'],
|
||||
|
||||
]}]}
|
||||
|
||||
|
||||
for k in hotkeys.keys():
|
||||
hotkeys[k].append(Create(0))
|
||||
|
||||
for k in hotkeys['Letters '][0]:
|
||||
hotkeys['Letters '][0][k].append(Create(0))
|
||||
|
||||
hotL=hotkeys['Letters '][0].keys()
|
||||
hotL.sort()
|
||||
|
||||
hot=hotkeys.keys()
|
||||
hot.sort()
|
||||
|
||||
glCr=glRasterPos2d
|
||||
glCl3=glColor3f
|
||||
glCl4=glColor4f
|
||||
glRct=glRectf
|
||||
|
||||
cf=[0.95,0.95,0.9,0.0]
|
||||
c1=[0.95,0.95,0.9,0.0]
|
||||
c=cf
|
||||
r=[0,0,0,0]
|
||||
|
||||
def trace_rectangle4(r,c):
|
||||
glCl4(c[0],c[1],c[2],c[3])
|
||||
glRct(r[0],r[1],r[2],r[3])
|
||||
|
||||
def trace_rectangle3(r,c,c1):
|
||||
glCl3(c[0],c[1],c[2])
|
||||
glRct(r[0],r[1],r[2],r[3])
|
||||
glCl3(c1[0],c1[1],c1[2])
|
||||
|
||||
def draw():
|
||||
global r,c,c1,hotkeys, hot, hotL
|
||||
|
||||
size=Buffer(GL_FLOAT, 4)
|
||||
glGetFloatv(GL_SCISSOR_BOX, size)
|
||||
size= size.list
|
||||
|
||||
for s in [0,1,2,3]: size[s]=int(size[s])
|
||||
|
||||
c=[0.9,0.95,0.95,0.0]
|
||||
c1=[0.95,0.95,0.9,0.0]
|
||||
|
||||
r=[0,size[3],size[2],0]
|
||||
trace_rectangle4(r,c)
|
||||
|
||||
c=[0.7,0.7,0.9,0.0]
|
||||
c1=[0.95,0.95,0.9,0.0]
|
||||
|
||||
r=[0,size[3],size[2],size[3]-20]
|
||||
trace_rectangle4(r,c)
|
||||
|
||||
c1=[0.7,0.7,0.9,0.0]
|
||||
c=[0.2,0.2,0.4,0.0]
|
||||
c2=[0.87,0.87,0.95,0.0]
|
||||
|
||||
r=[0,size[3]-20,size[2],size[3]-44]
|
||||
trace_rectangle4(r,c)
|
||||
|
||||
glColor3f(0.1, 0.1, 0.15)
|
||||
glRasterPos2f(10, size[3]-16)
|
||||
|
||||
Text("HotKey")
|
||||
|
||||
l=0
|
||||
listed=0
|
||||
Llisted=0
|
||||
for k in hot:
|
||||
hotkeys[k][-1]=Toggle(k, hot.index(k)+10, 4+(20*26)/6*hot.index(k), size[3]-(40), len(k)*8, 20, hotkeys[k][-1].val )
|
||||
l+=len(k)
|
||||
if hotkeys[k][-1].val==1.0:
|
||||
listed=hot.index(k)
|
||||
#print listed
|
||||
l=0
|
||||
if hot[listed]!='Letters ':
|
||||
for n in hotkeys[hot[listed]][:-1]:
|
||||
if l%2==0:
|
||||
r=[4,size[3]-(18*l+66),
|
||||
8+(21*26), size[3]-(46+18*l)]
|
||||
trace_rectangle4(r,c2)
|
||||
glColor3f(0.1, 0.1, 0.15)
|
||||
glRasterPos2f(4+8, size[3]-(58+18*l))
|
||||
Text(n[0])
|
||||
glRasterPos2f(4+8*15, size[3]-(58+18*l))
|
||||
Text(' : '+n[1])
|
||||
l+=1
|
||||
else:
|
||||
for k in hotL:
|
||||
pos=hotL.index(k)
|
||||
hotkeys['Letters '][0][k][-1]=Toggle(k,pos+20,4+hotL.index(k)*21, size[3]-(52+18), 20, 20, hotkeys['Letters '][0][k][-1].val )
|
||||
if hotkeys['Letters '][0][k][-1].val==1.0:
|
||||
Llisted=pos
|
||||
for n in hotkeys['Letters '][0][hotL[Llisted]][:-1]:
|
||||
if l%2==0:
|
||||
r=[4,size[3]-(18*l+92),
|
||||
8+(21*26), size[3]-(74+18*l)]
|
||||
trace_rectangle4(r,c2)
|
||||
glColor3f(0.1, 0.1, 0.15)
|
||||
glRasterPos2f(4+8, size[3]-(88+18*l))
|
||||
Text(n[0])
|
||||
glRasterPos2f(4+8*15, size[3]-(88+18*l))
|
||||
Text(' : '+n[1])
|
||||
l+=1
|
||||
|
||||
def event(evt, val):
|
||||
global hotkeys
|
||||
if (evt== QKEY and not val): Exit()
|
||||
|
||||
def bevent(evt):
|
||||
global hotkeysmhot, hotL
|
||||
if (evt== 1):
|
||||
Exit()
|
||||
|
||||
elif (evt in range(10,20,1)):
|
||||
for k in hot:
|
||||
if hot.index(k)+10!=evt:
|
||||
hotkeys[k][-1].val=0
|
||||
|
||||
Blender.Window.Redraw()
|
||||
|
||||
elif (evt in range(20,46,1)):
|
||||
for k in hotL:
|
||||
if hotL.index(k)+20!=evt:
|
||||
hotkeys['Letters '][0][k][-1].val=0
|
||||
|
||||
Blender.Window.Redraw()
|
||||
|
||||
Register(draw, event, bevent)
|
142
release/scripts/obdatacopier.py
Normal file
142
release/scripts/obdatacopier.py
Normal file
@ -0,0 +1,142 @@
|
||||
#!BPY
|
||||
|
||||
""" Registration info for Blender menus: <- these words are ignored
|
||||
Name: 'Data Copier'
|
||||
Blender: 232
|
||||
Group: 'Object'
|
||||
Tip: 'Copy data from active object to other selected ones.'
|
||||
"""
|
||||
|
||||
# ----------------------------------------------------------
|
||||
# Object DATA copier 0.1.1
|
||||
# (c) 2004 jean-michel soler
|
||||
# -----------------------------------------------------------
|
||||
#----------------------------------------------
|
||||
# Page officielle/official page du blender python Object DATA copier:
|
||||
# http://jmsoler.free.fr/didacticiel/blender/tutor/cpl_lampdatacopier.htm
|
||||
# Communiquer les problemes et erreurs sur:
|
||||
# To Communicate problems and errors on:
|
||||
# http://www.zoo-logique.org/3D.Blender/newsportal/thread.php?group=3D.Blender
|
||||
#---------------------------------------------
|
||||
# Blender Artistic License
|
||||
# http://download.blender.org/documentation/html/x21254.html
|
||||
#---------------------------------------------
|
||||
|
||||
import Blender
|
||||
from Blender import *
|
||||
from Blender.Draw import *
|
||||
from Blender.BGL import *
|
||||
|
||||
|
||||
O = Object.GetSelected()
|
||||
|
||||
def renew():
|
||||
global O
|
||||
MAJ='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
|
||||
O = Object.GetSelected()
|
||||
param= [ p for p in dir(O[0].getData()) if (p.find('set')!=0 and p.find('get')!=0 and (MAJ.find(p[0])==-1 or (p in ['R','G','B']))) ]
|
||||
PARAM={}
|
||||
evt=4
|
||||
doc='doc'
|
||||
for p in param:
|
||||
try:
|
||||
if p=='mode':
|
||||
try:
|
||||
exec "doc=str(%s.Modes)+' ; value : %s'"%( O[0].getType(), str(O[0].getData().mode) )
|
||||
except:
|
||||
exec """doc= '%s'+' value = '+ str(O[0].getData().%s)"""%(p,p)
|
||||
elif p=='type':
|
||||
try:
|
||||
exec "doc=str(%s.Types)+' ; value : %s'"%( O[0].getType(), str(O[0].getData().type) )
|
||||
except:
|
||||
exec """doc= '%s'+' value = '+ str(O[0].getData().%s)"""%(p,p)
|
||||
else:
|
||||
exec """doc= '%s'+' value = '+ str(O[0].getData().%s)"""%(p,p)
|
||||
if doc.find('built-in')!=-1:
|
||||
exec """doc= 'This is a function ! Doc = '+ str(O[0].getData().%s.__doc__)"""%(p)
|
||||
except:
|
||||
doc='Doc...'
|
||||
PARAM[p]=[Create(0),evt,doc]
|
||||
evt+=1
|
||||
return PARAM
|
||||
|
||||
def copy():
|
||||
global PARAM
|
||||
OBJECT=None
|
||||
TYPE=None
|
||||
|
||||
for O in Blender.Object.GetSelected():
|
||||
if O.getType()!='Mesh' and O.getType()!='Empty' :
|
||||
if OBJECT==None and TYPE==None:
|
||||
OBJECT=O.getData()
|
||||
TYPE= O.getType()
|
||||
|
||||
elif O.getType()==TYPE:
|
||||
for p in PARAM.keys():
|
||||
if PARAM[p][0].val==1:
|
||||
try:
|
||||
exec "O.getData().%s=OBJECT.%s"%(p,p)
|
||||
except:
|
||||
errormsg = "Type Error|It's not possible to copy %s to %s types." % (p,TYPE)
|
||||
Blender.Draw.PupMenu(errormsg)
|
||||
|
||||
PARAM= renew()
|
||||
|
||||
def EVENT(evt,val):
|
||||
pass
|
||||
|
||||
def BUTTON(evt):
|
||||
global PARAM
|
||||
if (evt==1):
|
||||
Exit()
|
||||
|
||||
if (evt==2):
|
||||
|
||||
copy()
|
||||
Blender.Redraw()
|
||||
|
||||
if (evt==3):
|
||||
PARAM= renew()
|
||||
Blender.Redraw()
|
||||
|
||||
def DRAW():
|
||||
global PARAM, O
|
||||
glColor3f(0.7, 0.7, 0.7)
|
||||
glClear(GL_COLOR_BUFFER_BIT)
|
||||
glColor3f(0.1, 0.1, 0.15)
|
||||
|
||||
size=Buffer(GL_FLOAT, 4)
|
||||
glGetFloatv(GL_SCISSOR_BOX, size)
|
||||
size= size.list
|
||||
for s in [0,1,2,3]: size[s]=int(size[s])
|
||||
ligne=20
|
||||
|
||||
Button ("Exit",1,20,4,80,ligne)
|
||||
Button ("Copy",2,102,4,80,ligne)
|
||||
Button ("renew",3,184,4,80,ligne)
|
||||
|
||||
glRasterPos2f(20, ligne*2-8)
|
||||
Text(O[0].getType()+" DATA copier")
|
||||
|
||||
|
||||
max=size[3] / 22 -2
|
||||
pos = 1
|
||||
decal = 20
|
||||
key=PARAM.keys()
|
||||
key.sort()
|
||||
for p in key:
|
||||
if pos==max:
|
||||
decal+=102
|
||||
pos=1
|
||||
else:
|
||||
pos+=1
|
||||
PARAM[p][0]=Toggle(p,
|
||||
PARAM[p][1],
|
||||
decal,
|
||||
pos*22+22,
|
||||
100,
|
||||
20,
|
||||
PARAM[p][0].val,str(PARAM[p][2]))
|
||||
|
||||
|
||||
Register(DRAW,EVENT,BUTTON)
|
173
release/scripts/renameobjectbyblock.py
Normal file
173
release/scripts/renameobjectbyblock.py
Normal file
@ -0,0 +1,173 @@
|
||||
#!BPY
|
||||
|
||||
""" Registration info for Blender menus: <- these words are ignored
|
||||
Name: 'Name OBJECT changer'
|
||||
Blender: 232
|
||||
Group: 'Object'
|
||||
Tip: 'GUI to select then rename objects.'
|
||||
"""
|
||||
|
||||
# ----------------------------------------------------------
|
||||
# Name OBJECT changer
|
||||
# (c) 2004 jean-michel soler
|
||||
# -----------------------------------------------------------
|
||||
#----------------------------------------------
|
||||
# Page officielle/offcial page du blender python Name OBJECT changer:
|
||||
# http://jmsoler.free.fr/didacticiel/blender/tutor/cpl_renameobjectgui.htm
|
||||
# Communiquer les problemes et erreurs sur:
|
||||
# To Communicate problems and errors on:
|
||||
# http://www.zoo-logique.org/3D.Blender/newsportal/thread.php?group=3D.Blender
|
||||
#---------------------------------------------
|
||||
# Blender Artistic License
|
||||
# http://download.blender.org/documentation/html/x21254.html
|
||||
#---------------------------------------------
|
||||
|
||||
CVS=0
|
||||
|
||||
import Blender
|
||||
from Blender import *
|
||||
from Blender.Draw import *
|
||||
from Blender.BGL import *
|
||||
|
||||
|
||||
O = Object.Get()
|
||||
taglist=[]
|
||||
stringlist=[[],[]]
|
||||
|
||||
|
||||
def renew(taglist):
|
||||
global O
|
||||
MAJ='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
|
||||
O = Object.Get()
|
||||
if CVS==0:
|
||||
param= [ [p.getName(),O.index(p),str(p.getType())] for p in O ]
|
||||
else:
|
||||
param= [ [p.getName(),O.index(p),str(p.getType()),O[O.index(p)].isSelected()] for p in O ]
|
||||
PARAM={}
|
||||
evt=9
|
||||
stringlist=[[],[],[]]
|
||||
for p in param:
|
||||
if p[0] in taglist or len(p)>3:
|
||||
if CVS==0:
|
||||
PARAM[p[0]]=[Create(1),evt,p[1],p[2],Create(p[0]),evt+1]
|
||||
elif p[3]==1:
|
||||
PARAM[p[0]]=[Create(1),evt,p[1],p[2],Create(p[0]),evt+1]
|
||||
elif p[3]==0:
|
||||
PARAM[p[0]]=[Create(0),evt,p[1],p[2],Create(p[0]),evt+1]
|
||||
stringlist[0].append(evt+1)
|
||||
stringlist[1].append(p[0])
|
||||
stringlist[2].append(evt)
|
||||
else:
|
||||
PARAM[p[0]]=[Create(0),evt,p[1],p[2],Create(p[0]),evt+1]
|
||||
stringlist[0].append(evt+1)
|
||||
stringlist[1].append(p[0])
|
||||
stringlist[2].append(evt)
|
||||
evt+=2
|
||||
return PARAM,stringlist
|
||||
|
||||
NEWNAME=Create('Name')
|
||||
|
||||
alignment={'BEGIN' : [Create(1),5],
|
||||
'END' : [Create(0),6],
|
||||
'POINT' : [Create(0),7],
|
||||
'FULL' : [Create(0),8]}
|
||||
|
||||
def rename():
|
||||
global NEWNAME, alignment, O, taglist, PARAM, stringlist
|
||||
taglist=[]
|
||||
for p in PARAM.keys():
|
||||
if PARAM[p][0].val==1:
|
||||
if alignment['END'][0].val:
|
||||
O[PARAM[p][2]].setName(p+NEWNAME.val)
|
||||
taglist.append(p+NEWNAME.val)
|
||||
elif alignment['BEGIN'][0].val:
|
||||
O[PARAM[p][2]].setName(NEWNAME.val+p)
|
||||
taglist.append(NEWNAME.val+p)
|
||||
elif alignment['FULL'][0].val:
|
||||
O[PARAM[p][2]].setName(NEWNAME.val)
|
||||
taglist.append(O[PARAM[p][2]].getName())
|
||||
PARAM, stringlist =renew(taglist)
|
||||
|
||||
PARAM, stringlist = renew(taglist)
|
||||
|
||||
def EVENT(evt,val):
|
||||
pass
|
||||
|
||||
def BUTTON(evt):
|
||||
global PARAM , alignment, O, stringlist, CVS
|
||||
if (evt==1):
|
||||
Exit()
|
||||
elif (evt==2):
|
||||
rename()
|
||||
elif (evt==3):
|
||||
PARAM, stringlist = renew(taglist)
|
||||
|
||||
elif (evt in [5,6,7,8]):
|
||||
for k in alignment.keys():
|
||||
if alignment[k][1]!=evt:
|
||||
alignment[k][0].val=0
|
||||
|
||||
|
||||
elif (evt in stringlist[0]):
|
||||
O[PARAM[stringlist[1][(evt-9)/2]][2]].setName(PARAM[stringlist[1][(evt-9)/2]][4].val)
|
||||
PARAM, stringlist = renew(taglist)
|
||||
|
||||
elif (evt in stringlist[2]):
|
||||
try:
|
||||
O[PARAM[stringlist[1][(evt-9)/2]][2]].select(PARAM[stringlist[1][(evt-9)/2]][0].val)
|
||||
except:
|
||||
pass
|
||||
|
||||
Blender.Redraw()
|
||||
|
||||
def DRAW():
|
||||
global PARAM, O, NEWNAME, alignment
|
||||
|
||||
|
||||
#glColor3f(0.7, 0.7, 0.7)
|
||||
glClear(GL_COLOR_BUFFER_BIT)
|
||||
glColor3f(0.1, 0.1, 0.15)
|
||||
|
||||
size=Buffer(GL_FLOAT, 4)
|
||||
glGetFloatv(GL_SCISSOR_BOX, size)
|
||||
size= size.list
|
||||
for s in [0,1,2,3]: size[s]=int(size[s])
|
||||
ligne=20
|
||||
|
||||
Button ("Exit",1,20,1,80,ligne)
|
||||
Button ("Rename",2,102,1,80,ligne)
|
||||
Button ("renew",3,184,1,80,ligne)
|
||||
|
||||
glRasterPos2f(20, ligne*2-10)
|
||||
Text(" Poly-RENAME tool")
|
||||
NEWNAME=String('Add string : ', 4, 150, ligne*2-16, 150, 18, NEWNAME.val,120 )
|
||||
|
||||
key=alignment.keys()
|
||||
key.sort()
|
||||
n=150+150+4
|
||||
for k in key:
|
||||
alignment[k][0]=Toggle(k,alignment[k][1],n,ligne*2-16, 40, 18, alignment[k][0].val)
|
||||
n+=40+4
|
||||
|
||||
max=size[3] / 22 -2
|
||||
pos = 1
|
||||
decal = 20
|
||||
|
||||
keys=[[PARAM[k][1],k] for k in PARAM.keys()]
|
||||
keys.sort()
|
||||
|
||||
|
||||
for p_ in keys:
|
||||
p=p_[1]
|
||||
if pos==max:
|
||||
decal+=152
|
||||
pos=1
|
||||
else:
|
||||
pos+=1
|
||||
PARAM[p][0]=Toggle('S',PARAM[p][1],decal,pos*22+22,20,20, PARAM[p][0].val,"Select this one for a group renaming")
|
||||
PARAM[p][4]=String('> ',PARAM[p][5],decal+20,pos*22+22,90,20, PARAM[p][4].val,200, "string button to rename immediately but only this object")
|
||||
|
||||
glRasterPos2f(decal+115,pos*22+22)
|
||||
Text(PARAM[p][3][:4])
|
||||
Register(DRAW,EVENT,BUTTON)
|
||||
|
@ -290,7 +290,8 @@ static void setup_app_data(BlendFileData *bfd, char *filename) {
|
||||
R.displaymode= bfd->displaymode;
|
||||
G.curscreen= bfd->curscreen;
|
||||
G.fileflags= bfd->fileflags;
|
||||
if (G.f & G_DEBUG) bfd->globalf |=G_DEBUG;
|
||||
if (G.f & G_DEBUG) bfd->globalf |= G_DEBUG;
|
||||
if (G.f & G_SCENESCRIPT) bfd->globalf |= G_SCENESCRIPT;
|
||||
G.f= bfd->globalf;
|
||||
G.scene= G.curscreen->scene;
|
||||
|
||||
|
@ -2611,14 +2611,16 @@ void write_stl(char *str)
|
||||
if(BLI_testextensie(str,".ble")) str[ strlen(str)-4]= 0;
|
||||
if(BLI_testextensie(str,".stl")==0) strcat(str, ".stl");
|
||||
|
||||
if (BLI_exists(str))
|
||||
if(saveover(str)==0)
|
||||
return;
|
||||
|
||||
if (!during_script()) {
|
||||
if (BLI_exists(str))
|
||||
if(saveover(str)==0)
|
||||
return;
|
||||
}
|
||||
|
||||
fpSTL= fopen(str, "wb");
|
||||
|
||||
if(fpSTL==NULL) {
|
||||
error("Can't write file");
|
||||
if (!during_script()) error("Can't write file");
|
||||
return;
|
||||
}
|
||||
strcpy(videosc_dir, str);
|
||||
@ -2791,7 +2793,7 @@ void write_videoscape(char *str)
|
||||
|
||||
file= open(str,O_BINARY|O_RDONLY);
|
||||
close(file);
|
||||
if(file>-1) if(saveover(str)==0) return;
|
||||
if(file>-1) if(!during_script() && saveover(str)==0) return;
|
||||
|
||||
strcpy(videosc_dir, str);
|
||||
|
||||
@ -3114,11 +3116,11 @@ void write_vrml(char *str)
|
||||
if(BLI_testextensie(str,".ble")) str[ strlen(str)-4]= 0;
|
||||
if(BLI_testextensie(str,".wrl")==0) strcat(str, ".wrl");
|
||||
|
||||
if(saveover(str)==0) return;
|
||||
if(!during_script() && saveover(str)==0) return;
|
||||
|
||||
fp= fopen(str, "w");
|
||||
|
||||
if(fp==NULL) {
|
||||
if(fp==NULL && !during_script()) {
|
||||
error("Can't write file");
|
||||
return;
|
||||
}
|
||||
@ -3420,13 +3422,15 @@ void write_dxf(char *str)
|
||||
if(BLI_testextensie(str,".ble")) str[ strlen(str)-4]= 0;
|
||||
if(BLI_testextensie(str,".dxf")==0) strcat(str, ".dxf");
|
||||
|
||||
if (BLI_exists(str))
|
||||
if(saveover(str)==0)
|
||||
return;
|
||||
|
||||
if (!during_script()) {
|
||||
if (BLI_exists(str))
|
||||
if(saveover(str)==0)
|
||||
return;
|
||||
}
|
||||
|
||||
fp= fopen(str, "w");
|
||||
|
||||
if(fp==NULL) {
|
||||
if(fp==NULL && !during_script()) {
|
||||
error("Can't write file");
|
||||
return;
|
||||
}
|
||||
|
@ -417,6 +417,7 @@ int BPY_txt_do_python_Text(struct Text* text)
|
||||
{
|
||||
PyObject *py_dict, *py_result;
|
||||
BPy_constant *info;
|
||||
char textname[24];
|
||||
Script *script = G.main->script.first;
|
||||
|
||||
if (!text) return 0;
|
||||
@ -442,6 +443,11 @@ int BPY_txt_do_python_Text(struct Text* text)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* if in the script Blender.Load(blendfile) is not the last command,
|
||||
* an error after it will call BPY_Err_Handle below, but the text struct
|
||||
* will have been deallocated already, so we need to copy its name here. */
|
||||
BLI_strncpy(textname, GetName(text), strlen(GetName(text))+1);
|
||||
|
||||
/* if in it, leave editmode, since changes a script makes to meshdata
|
||||
* can be lost otherwise. */
|
||||
if (G.obedit) exit_editmode(1);
|
||||
@ -468,12 +474,10 @@ int BPY_txt_do_python_Text(struct Text* text)
|
||||
|
||||
if (!py_result) { /* Failed execution of the script */
|
||||
|
||||
BPY_Err_Handle(GetName(text));
|
||||
BPY_Err_Handle(textname);
|
||||
ReleaseGlobalDictionary(py_dict);
|
||||
script->py_globaldict = NULL;
|
||||
free_libblock(&G.main->script, script);
|
||||
//BPY_end_python();
|
||||
//BPY_start_python();
|
||||
if (G.main->script.first) free_libblock(&G.main->script, script);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -507,28 +511,38 @@ int BPY_txt_do_python(struct SpaceText* st)
|
||||
/*****************************************************************************/
|
||||
void BPY_run_python_script(char *fn)
|
||||
{
|
||||
Text *text;
|
||||
Text *text = NULL;
|
||||
int is_blenText = 0;
|
||||
|
||||
if ( !BLI_exists(fn) ) {
|
||||
printf("\nError: no such file -- %s.\n", fn);
|
||||
return;
|
||||
if ( !BLI_exists(fn) ) { /* if there's no such filename ...*/
|
||||
text = G.main->text.first; /* try an already existing Blender Text */
|
||||
while (text) {
|
||||
if (!strcmp(fn, text->id.name+2)) break;
|
||||
text = text->id.next;
|
||||
}
|
||||
|
||||
if (!text) {
|
||||
printf("\nError: no such file or Blender text -- %s.\n", fn);
|
||||
return;
|
||||
}
|
||||
else is_blenText = 1; /* fn is already a Blender Text */
|
||||
}
|
||||
|
||||
text = add_text(fn);
|
||||
if (!is_blenText) text = add_text(fn);
|
||||
if (text == NULL) {
|
||||
printf("Error in BPY_run_python_script: couldn't create Blender text "
|
||||
"from %s\n", fn);
|
||||
// On Windows if I continue I just get a segmentation
|
||||
// Chris: On Windows if I continue I just get a segmentation
|
||||
// violation. To get a baseline file I exit here.
|
||||
exit(2);
|
||||
}
|
||||
|
||||
if (BPY_txt_do_python_Text(text) != 1) {
|
||||
printf( "\nError executing Python script:\n"
|
||||
"%s (at line %d)\n", fn, BPY_Err_getLinenumber());
|
||||
printf( "\nError executing Python script from command-line:\n"
|
||||
"%s (at line %d).\n", fn, BPY_Err_getLinenumber());
|
||||
}
|
||||
|
||||
free_libblock(&G.main->text, text);
|
||||
if (!is_blenText) free_libblock(&G.main->text, text);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
@ -708,9 +722,7 @@ int BPY_menu_do_python(short menutype, int event)
|
||||
BPY_Err_Handle(script->id.name+2);
|
||||
PyErr_Print();
|
||||
ReleaseGlobalDictionary(py_dict);
|
||||
free_libblock(&G.main->script, script);
|
||||
// BPY_end_python();
|
||||
// BPY_start_python();
|
||||
if (G.main->script.first) free_libblock(&G.main->script, script);
|
||||
error ("Python script error: check console");
|
||||
|
||||
return 0;
|
||||
|
@ -32,11 +32,22 @@
|
||||
#include <Python.h>
|
||||
#include <stdio.h>
|
||||
|
||||
/* for open, close in Blender_Load */
|
||||
#include <fcntl.h>
|
||||
#ifndef WIN32
|
||||
#include <unistd.h>
|
||||
#else
|
||||
#include "BLI_winstuff.h"
|
||||
#include <io.h>
|
||||
#endif
|
||||
|
||||
#include <BIF_usiblender.h>
|
||||
#include <BLI_blenlib.h>
|
||||
#include <BLO_writefile.h>
|
||||
#include <BKE_exotic.h>
|
||||
#include <BKE_global.h>
|
||||
#include <BKE_packedFile.h>
|
||||
#include <BKE_object.h>
|
||||
#include <BPI_script.h>
|
||||
#include <BSE_headerbuttons.h>
|
||||
#include <DNA_ID.h>
|
||||
@ -46,6 +57,7 @@
|
||||
#include <DNA_space_types.h> /* for SPACE_VIEW3D */
|
||||
#include <DNA_userdef_types.h>
|
||||
#include <BKE_ipo.h>
|
||||
#include <blendef.h>
|
||||
|
||||
#include "gen_utils.h"
|
||||
#include "modules.h"
|
||||
@ -97,19 +109,28 @@ static char Blender_Quit_doc[] =
|
||||
"() - Quit Blender. The current data is saved as 'quit.blend' before leaving.";
|
||||
|
||||
static char Blender_Load_doc[] =
|
||||
"(filename) - Load the given .blend file. If successful, the script is ended\n\
|
||||
immediately.\n\
|
||||
"(filename) - Load the given file.\n\
|
||||
Supported formats:\n\
|
||||
Blender, DXF, Inventor 1.0 ASCII, VRML 1.0 asc, STL, Videoscape, radiogour.\n\
|
||||
\n\
|
||||
Notes:\n\
|
||||
1 - () - an empty argument loads the default .B.blend file;\n\
|
||||
2 - if the substring '.B.blend' occurs inside 'filename', the default\n\
|
||||
.B.blend file is loaded;\n\
|
||||
3 - The current data is always preserved as an autosave file, for safety;\n\
|
||||
4 - This function only works if the script where it's executed is the\n\
|
||||
only one running.";
|
||||
3 - If a Blender file is loaded the script ends immediately.\n\
|
||||
4 - The current data is always preserved as an autosave file, for safety;\n\
|
||||
5 - This function only works if the script where it's executed is the\n\
|
||||
only one running at the moment.";
|
||||
|
||||
static char Blender_Save_doc[] =
|
||||
"(filename) - Save a .blend file with the given filename.\n\
|
||||
(filename) - A file pathname that should not contain \".B.blend\" in it.";
|
||||
"(filename) - Save data to a file based on the filename's extension.\n\
|
||||
Supported are: Blender's .blend and the builtin exporters:\n\
|
||||
VRML 1.0 (.wrl), Videoscape (.obj), DXF (.dxf) and STL (.stl)\n\
|
||||
(filename) - A filename with one of the supported extensions.\n\
|
||||
Note 1: 'filename' should not contain the substring \".B.blend\" in it.\n\
|
||||
Note 2: only .blend raises an error if file wasn't saved.\n\
|
||||
\tYou can use Blender.sys.exists(filename) to make sure the file was saved\n\
|
||||
\twhen writing to one of the other formats.";
|
||||
|
||||
/*****************************************************************************/
|
||||
/* Python method structure definition. */
|
||||
@ -295,10 +316,17 @@ static PyObject *Blender_Quit(PyObject *self)
|
||||
return Py_None;
|
||||
}
|
||||
|
||||
/**
|
||||
* Blender.Load
|
||||
* loads Blender's .blend, DXF, radiogour(?), STL, Videoscape,
|
||||
* Inventor 1.0 ASCII, VRML 1.0 asc.
|
||||
*/
|
||||
static PyObject *Blender_Load(PyObject *self, PyObject *args)
|
||||
{
|
||||
char *fname = NULL;
|
||||
Script *script = NULL;
|
||||
char str[32];
|
||||
int file, is_blend_file = 0;
|
||||
|
||||
if (!PyArg_ParseTuple(args, "|s", &fname))
|
||||
return EXPP_ReturnPyObjError(PyExc_TypeError,
|
||||
@ -315,12 +343,30 @@ static PyObject *Blender_Load(PyObject *self, PyObject *args)
|
||||
return EXPP_ReturnPyObjError(PyExc_RuntimeError,
|
||||
"there are other scripts running at the Scripts win, close them first!");
|
||||
|
||||
/* trick: mark the script so that its script struct won't be freed after
|
||||
* the script is executed (to avoid a double free warning on exit): */
|
||||
script = G.main->script.first;
|
||||
script->flags |= SCRIPT_GUI;
|
||||
if (fname) {
|
||||
file = open(fname, O_BINARY|O_RDONLY);
|
||||
|
||||
BIF_write_autosave(); /* for safety let's preserve the current data */
|
||||
if (file <= 0) {
|
||||
return EXPP_ReturnPyObjError(PyExc_RuntimeError,
|
||||
"cannot open file!");
|
||||
}
|
||||
else {
|
||||
read(file, str, 31);
|
||||
close(file);
|
||||
|
||||
if (strncmp(str, "BLEN", 4) == 0) is_blend_file = 1;
|
||||
}
|
||||
}
|
||||
else is_blend_file = 1; /* .B.blend */
|
||||
|
||||
if (is_blend_file) {
|
||||
/* trick: mark the script so that its script struct won't be freed after
|
||||
* the script is executed (to avoid a double free warning on exit): */
|
||||
script = G.main->script.first;
|
||||
script->flags |= SCRIPT_GUI;
|
||||
|
||||
BIF_write_autosave(); /* for safety let's preserve the current data */
|
||||
}
|
||||
|
||||
/* for safety, any filename with .B.blend is considered the default one.
|
||||
* It doesn't seem necessary to compare file attributes (like st_ino and
|
||||
@ -329,7 +375,7 @@ static PyObject *Blender_Load(PyObject *self, PyObject *args)
|
||||
* default one for sure. Taking any .B.blend file as the default is good
|
||||
* enough here. Note: the default file requires extra clean-up done by
|
||||
* BIF_read_homefile: freeing the user theme data. */
|
||||
if (!fname || strstr(fname, ".B.blend"))
|
||||
if (!fname || (strstr(fname, ".B.blend") && is_blend_file))
|
||||
BIF_read_homefile();
|
||||
else
|
||||
BIF_read_file(fname);
|
||||
@ -341,7 +387,6 @@ static PyObject *Blender_Load(PyObject *self, PyObject *args)
|
||||
static PyObject *Blender_Save(PyObject *self, PyObject *args)
|
||||
{
|
||||
char *fname = NULL;
|
||||
char savefname[FILE_MAXFILE];
|
||||
int overwrite = 0, len = 0;
|
||||
char *error = NULL;
|
||||
Library *li;
|
||||
@ -365,23 +410,37 @@ static PyObject *Blender_Save(PyObject *self, PyObject *args)
|
||||
|
||||
len = strlen(fname);
|
||||
|
||||
if (len > FILE_MAXFILE - 7) /* 6+1 for eventual .blend added below */
|
||||
if (len > FILE_MAXFILE)
|
||||
return EXPP_ReturnPyObjError(PyExc_AttributeError,
|
||||
"filename is too long!");
|
||||
else
|
||||
BLI_strncpy(savefname, fname, len + 1);
|
||||
|
||||
if (!strstr(fname, ".blend"))
|
||||
BLI_strncpy(savefname + len, ".blend", 7); /* 7: BLI_strncpy adds '\0'*/
|
||||
|
||||
if (BLI_exists(savefname) && !overwrite)
|
||||
else if (BLI_exists(fname) && !overwrite)
|
||||
return EXPP_ReturnPyObjError(PyExc_AttributeError,
|
||||
"file already exists and overwrite flag was not given.");
|
||||
|
||||
if (G.fileflags & G_AUTOPACK) packAll();
|
||||
disable_where_script(1); /* to avoid error popups in the write_* functions */
|
||||
|
||||
if (!BLO_write_file(savefname, G.fileflags, &error))
|
||||
return EXPP_ReturnPyObjError(PyExc_SystemError, error);
|
||||
if (BLI_testextensie(fname, ".blend")) {
|
||||
if (G.fileflags & G_AUTOPACK) packAll();
|
||||
if (!BLO_write_file(fname, G.fileflags, &error)) {
|
||||
disable_where_script(0);
|
||||
return EXPP_ReturnPyObjError(PyExc_SystemError, error);
|
||||
}
|
||||
}
|
||||
else if (BLI_testextensie(fname, ".dxf"))
|
||||
write_dxf(fname);
|
||||
else if (BLI_testextensie(fname, ".stl"))
|
||||
write_stl(fname);
|
||||
else if (BLI_testextensie(fname, ".wrl"))
|
||||
write_vrml(fname);
|
||||
else if (BLI_testextensie(fname, ".obj"))
|
||||
write_videoscape(fname);
|
||||
else {
|
||||
disable_where_script(0);
|
||||
return EXPP_ReturnPyObjError(PyExc_AttributeError,
|
||||
"unknown file extension.");
|
||||
}
|
||||
|
||||
disable_where_script(0);
|
||||
|
||||
Py_INCREF(Py_None);
|
||||
return Py_None;
|
||||
|
@ -113,6 +113,9 @@ static PyObject *Camera_setLens (BPy_Camera * self, PyObject * args);
|
||||
static PyObject *Camera_setClipStart (BPy_Camera * self, PyObject * args);
|
||||
static PyObject *Camera_setClipEnd (BPy_Camera * self, PyObject * args);
|
||||
static PyObject *Camera_setDrawSize (BPy_Camera * self, PyObject * args);
|
||||
static PyObject *Camera_getScriptLinks(BPy_Camera *self, PyObject *args);
|
||||
static PyObject *Camera_addScriptLink(BPy_Camera *self, PyObject *args);
|
||||
static PyObject *Camera_clearScriptLinks(BPy_Camera *self);
|
||||
|
||||
/*****************************************************************************/
|
||||
/* Python BPy_Camera methods table: */
|
||||
@ -154,6 +157,16 @@ static PyMethodDef BPy_Camera_methods[] = {
|
||||
"(f) - Set Camera clip end value"},
|
||||
{"setDrawSize", (PyCFunction) Camera_setDrawSize, METH_VARARGS,
|
||||
"(f) - Set Camera draw size value"},
|
||||
{"getScriptLinks", (PyCFunction)Camera_getScriptLinks, METH_VARARGS,
|
||||
"(eventname) - Get a list of this camera's scriptlinks (Text names) "
|
||||
"of the given type\n"
|
||||
"(eventname) - string: FrameChanged or Redraw."},
|
||||
{"addScriptLink", (PyCFunction)Camera_addScriptLink, METH_VARARGS,
|
||||
"(text, evt) - Add a new camera scriptlink.\n"
|
||||
"(text) - string: an existing Blender Text name;\n"
|
||||
"(evt) string: FrameChanged or Redraw."},
|
||||
{"clearScriptLinks", (PyCFunction)Camera_clearScriptLinks, METH_NOARGS,
|
||||
"() - Delete all scriptlinks from this camera."},
|
||||
{NULL, NULL, 0, NULL}
|
||||
};
|
||||
|
||||
@ -739,6 +752,44 @@ Camera_setDrawSize (BPy_Camera * self, PyObject * args)
|
||||
Py_INCREF (Py_None);
|
||||
return Py_None;
|
||||
}
|
||||
/* cam.addScriptLink */
|
||||
static PyObject *Camera_addScriptLink (BPy_Camera *self, PyObject *args)
|
||||
{
|
||||
Camera *cam = self->camera;
|
||||
ScriptLink *slink = NULL;
|
||||
|
||||
slink = &(cam)->scriptlink;
|
||||
|
||||
if (!EXPP_addScriptLink(slink, args, 0))
|
||||
return EXPP_incr_ret (Py_None);
|
||||
else return NULL;
|
||||
}
|
||||
|
||||
/* cam.clearScriptLinks */
|
||||
static PyObject *Camera_clearScriptLinks (BPy_Camera *self)
|
||||
{
|
||||
Camera *cam = self->camera;
|
||||
ScriptLink *slink = NULL;
|
||||
|
||||
slink = &(cam)->scriptlink;
|
||||
|
||||
return EXPP_incr_ret(Py_BuildValue("i", EXPP_clearScriptLinks (slink)));
|
||||
}
|
||||
|
||||
/* cam.getScriptLinks */
|
||||
static PyObject *Camera_getScriptLinks (BPy_Camera *self, PyObject *args)
|
||||
{
|
||||
Camera *cam = self->camera;
|
||||
ScriptLink *slink = NULL;
|
||||
PyObject *ret = NULL;
|
||||
|
||||
slink = &(cam)->scriptlink;
|
||||
|
||||
ret = EXPP_getScriptLinks(slink, args, 0);
|
||||
|
||||
if (ret) return ret;
|
||||
else return NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
Camera_dealloc (BPy_Camera * self)
|
||||
|
@ -325,12 +325,13 @@ PyTypeObject Button_Type = {
|
||||
(reprfunc) Button_repr, /*tp_repr */
|
||||
};
|
||||
|
||||
|
||||
static void Button_dealloc (PyObject *self)
|
||||
{
|
||||
Button *but = (Button *) self;
|
||||
|
||||
if (but->type == 3) MEM_freeN (but->val.asstr);
|
||||
if (but->type == 3) {
|
||||
if (but->val.asstr) MEM_freeN (but->val.asstr);
|
||||
}
|
||||
|
||||
PyObject_DEL (self);
|
||||
}
|
||||
@ -1008,7 +1009,7 @@ static PyObject *Method_String (PyObject *self, PyObject *args)
|
||||
but->val.asstr = MEM_mallocN (len + 1, "button string");
|
||||
|
||||
strncpy (but->val.asstr, newstr, len);
|
||||
but->val.asstr[len] = 0;
|
||||
but->val.asstr[len] = '\0';
|
||||
|
||||
block = Get_uiBlock ();
|
||||
if (block)
|
||||
@ -1189,6 +1190,8 @@ PyObject *Draw_Init (void)
|
||||
EXPP_ADDCONST (LEFTMOUSE);
|
||||
EXPP_ADDCONST (MIDDLEMOUSE);
|
||||
EXPP_ADDCONST (RIGHTMOUSE);
|
||||
EXPP_ADDCONST (WHEELUPMOUSE);
|
||||
EXPP_ADDCONST (WHEELDOWNMOUSE);
|
||||
EXPP_ADDCONST (MOUSEX);
|
||||
EXPP_ADDCONST (MOUSEY);
|
||||
EXPP_ADDCONST (TIMER0);
|
||||
|
@ -29,7 +29,269 @@
|
||||
* ***** END GPL/BL DUAL LICENSE BLOCK *****
|
||||
*/
|
||||
|
||||
#include "Lamp.h"
|
||||
#include <Python.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include <BKE_main.h>
|
||||
#include <BKE_global.h>
|
||||
#include <BKE_object.h>
|
||||
#include <BKE_library.h>
|
||||
#include <BLI_blenlib.h>
|
||||
#include <DNA_lamp_types.h>
|
||||
|
||||
#include "constant.h"
|
||||
#include "rgbTuple.h"
|
||||
#include "gen_utils.h"
|
||||
#include "modules.h"
|
||||
#include "bpy_types.h" /* for the BPy_Lamp declaration */
|
||||
|
||||
/*****************************************************************************/
|
||||
/* Python BPy_Lamp defaults: */
|
||||
/*****************************************************************************/
|
||||
|
||||
/* Lamp types */
|
||||
|
||||
#define EXPP_LAMP_TYPE_LAMP 0
|
||||
#define EXPP_LAMP_TYPE_SUN 1
|
||||
#define EXPP_LAMP_TYPE_SPOT 2
|
||||
#define EXPP_LAMP_TYPE_HEMI 3
|
||||
|
||||
/* Lamp mode flags */
|
||||
|
||||
#define EXPP_LAMP_MODE_SHADOWS 1
|
||||
#define EXPP_LAMP_MODE_HALO 2
|
||||
#define EXPP_LAMP_MODE_LAYER 4
|
||||
#define EXPP_LAMP_MODE_QUAD 8
|
||||
#define EXPP_LAMP_MODE_NEGATIVE 16
|
||||
#define EXPP_LAMP_MODE_ONLYSHADOW 32
|
||||
#define EXPP_LAMP_MODE_SPHERE 64
|
||||
#define EXPP_LAMP_MODE_SQUARE 128
|
||||
#define EXPP_LAMP_MODE_TEXTURE 256
|
||||
#define EXPP_LAMP_MODE_OSATEX 512
|
||||
#define EXPP_LAMP_MODE_DEEPSHADOW 1024
|
||||
#define EXPP_LAMP_MODE_NODIFFUSE 2048
|
||||
#define EXPP_LAMP_MODE_NOSPECULAR 4096
|
||||
/* Lamp MIN, MAX values */
|
||||
|
||||
#define EXPP_LAMP_SAMPLES_MIN 1
|
||||
#define EXPP_LAMP_SAMPLES_MAX 16
|
||||
#define EXPP_LAMP_BUFFERSIZE_MIN 512
|
||||
#define EXPP_LAMP_BUFFERSIZE_MAX 5120
|
||||
#define EXPP_LAMP_ENERGY_MIN 0.0
|
||||
#define EXPP_LAMP_ENERGY_MAX 10.0
|
||||
#define EXPP_LAMP_DIST_MIN 0.1
|
||||
#define EXPP_LAMP_DIST_MAX 5000.0
|
||||
#define EXPP_LAMP_SPOTSIZE_MIN 1.0
|
||||
#define EXPP_LAMP_SPOTSIZE_MAX 180.0
|
||||
#define EXPP_LAMP_SPOTBLEND_MIN 0.00
|
||||
#define EXPP_LAMP_SPOTBLEND_MAX 1.00
|
||||
#define EXPP_LAMP_CLIPSTART_MIN 0.1
|
||||
#define EXPP_LAMP_CLIPSTART_MAX 1000.0
|
||||
#define EXPP_LAMP_CLIPEND_MIN 1.0
|
||||
#define EXPP_LAMP_CLIPEND_MAX 5000.0
|
||||
#define EXPP_LAMP_BIAS_MIN 0.01
|
||||
#define EXPP_LAMP_BIAS_MAX 5.00
|
||||
#define EXPP_LAMP_SOFTNESS_MIN 1.0
|
||||
#define EXPP_LAMP_SOFTNESS_MAX 100.0
|
||||
#define EXPP_LAMP_HALOINT_MIN 0.0
|
||||
#define EXPP_LAMP_HALOINT_MAX 5.0
|
||||
#define EXPP_LAMP_HALOSTEP_MIN 0
|
||||
#define EXPP_LAMP_HALOSTEP_MAX 12
|
||||
#define EXPP_LAMP_QUAD1_MIN 0.0
|
||||
#define EXPP_LAMP_QUAD1_MAX 1.0
|
||||
#define EXPP_LAMP_QUAD2_MIN 0.0
|
||||
#define EXPP_LAMP_QUAD2_MAX 1.0
|
||||
#define EXPP_LAMP_COL_MIN 0.0
|
||||
#define EXPP_LAMP_COL_MAX 1.0
|
||||
|
||||
/*****************************************************************************/
|
||||
/* Python API function prototypes for the Lamp module. */
|
||||
/*****************************************************************************/
|
||||
static PyObject *M_Lamp_New (PyObject *self, PyObject *args, PyObject *keywords);
|
||||
static PyObject *M_Lamp_Get (PyObject *self, PyObject *args);
|
||||
|
||||
/*****************************************************************************/
|
||||
/* The following string definitions are used for documentation strings. */
|
||||
/* In Python these will be written to the console when doing a */
|
||||
/* Blender.Lamp.__doc__ */
|
||||
/*****************************************************************************/
|
||||
static char M_Lamp_doc[] =
|
||||
"The Blender Lamp module\n\n\
|
||||
This module provides control over **Lamp Data** objects in Blender.\n\n\
|
||||
Example::\n\n\
|
||||
from Blender import Lamp\n\
|
||||
l = Lamp.New('Spot') # create new 'Spot' lamp data\n\
|
||||
l.setMode('square', 'shadow') # set these two lamp mode flags\n\
|
||||
ob = Object.New('Lamp') # create new lamp object\n\
|
||||
ob.link(l) # link lamp obj with lamp data\n";
|
||||
|
||||
static char M_Lamp_New_doc[] =
|
||||
"Lamp.New (type = 'Lamp', name = 'LampData'):\n\
|
||||
Return a new Lamp Data object with the given type and name.";
|
||||
|
||||
static char M_Lamp_Get_doc[] =
|
||||
"Lamp.Get (name = None):\n\
|
||||
Return the Lamp Data with the given name, None if not found, or\n\
|
||||
Return a list with all Lamp Data objects in the current scene,\n\
|
||||
if no argument was given.";
|
||||
|
||||
/*****************************************************************************/
|
||||
/* Python method structure definition for Blender.Lamp module: */
|
||||
/*****************************************************************************/
|
||||
struct PyMethodDef M_Lamp_methods[] = {
|
||||
{"New",(PyCFunction)M_Lamp_New, METH_VARARGS|METH_KEYWORDS,
|
||||
M_Lamp_New_doc},
|
||||
{"Get", M_Lamp_Get, METH_VARARGS, M_Lamp_Get_doc},
|
||||
{"get", M_Lamp_Get, METH_VARARGS, M_Lamp_Get_doc},
|
||||
{NULL, NULL, 0, NULL}
|
||||
};
|
||||
|
||||
/*****************************************************************************/
|
||||
/* Python BPy_Lamp methods declarations: */
|
||||
/*****************************************************************************/
|
||||
static PyObject *Lamp_getName(BPy_Lamp *self);
|
||||
static PyObject *Lamp_getType(BPy_Lamp *self);
|
||||
static PyObject *Lamp_getMode(BPy_Lamp *self);
|
||||
static PyObject *Lamp_getSamples(BPy_Lamp *self);
|
||||
static PyObject *Lamp_getBufferSize(BPy_Lamp *self);
|
||||
static PyObject *Lamp_getHaloStep(BPy_Lamp *self);
|
||||
static PyObject *Lamp_getEnergy(BPy_Lamp *self);
|
||||
static PyObject *Lamp_getDist(BPy_Lamp *self);
|
||||
static PyObject *Lamp_getSpotSize(BPy_Lamp *self);
|
||||
static PyObject *Lamp_getSpotBlend(BPy_Lamp *self);
|
||||
static PyObject *Lamp_getClipStart(BPy_Lamp *self);
|
||||
static PyObject *Lamp_getClipEnd(BPy_Lamp *self);
|
||||
static PyObject *Lamp_getBias(BPy_Lamp *self);
|
||||
static PyObject *Lamp_getSoftness(BPy_Lamp *self);
|
||||
static PyObject *Lamp_getHaloInt(BPy_Lamp *self);
|
||||
static PyObject *Lamp_getQuad1(BPy_Lamp *self);
|
||||
static PyObject *Lamp_getQuad2(BPy_Lamp *self);
|
||||
static PyObject *Lamp_getCol(BPy_Lamp *self);
|
||||
static PyObject *Lamp_setName(BPy_Lamp *self, PyObject *args);
|
||||
static PyObject *Lamp_setType(BPy_Lamp *self, PyObject *args);
|
||||
static PyObject *Lamp_setIntType(BPy_Lamp *self, PyObject *args);
|
||||
static PyObject *Lamp_setMode(BPy_Lamp *self, PyObject *args);
|
||||
static PyObject *Lamp_setIntMode(BPy_Lamp *self, PyObject *args);
|
||||
static PyObject *Lamp_setSamples(BPy_Lamp *self, PyObject *args);
|
||||
static PyObject *Lamp_setBufferSize(BPy_Lamp *self, PyObject *args);
|
||||
static PyObject *Lamp_setHaloStep(BPy_Lamp *self, PyObject *args);
|
||||
static PyObject *Lamp_setEnergy(BPy_Lamp *self, PyObject *args);
|
||||
static PyObject *Lamp_setDist(BPy_Lamp *self, PyObject *args);
|
||||
static PyObject *Lamp_setSpotSize(BPy_Lamp *self, PyObject *args);
|
||||
static PyObject *Lamp_setSpotBlend(BPy_Lamp *self, PyObject *args);
|
||||
static PyObject *Lamp_setClipStart(BPy_Lamp *self, PyObject *args);
|
||||
static PyObject *Lamp_setClipEnd(BPy_Lamp *self, PyObject *args);
|
||||
static PyObject *Lamp_setBias(BPy_Lamp *self, PyObject *args);
|
||||
static PyObject *Lamp_setSoftness(BPy_Lamp *self, PyObject *args);
|
||||
static PyObject *Lamp_setHaloInt(BPy_Lamp *self, PyObject *args);
|
||||
static PyObject *Lamp_setQuad1(BPy_Lamp *self, PyObject *args);
|
||||
static PyObject *Lamp_setQuad2(BPy_Lamp *self, PyObject *args);
|
||||
static PyObject *Lamp_setCol(BPy_Lamp *self, PyObject *args);
|
||||
static PyObject *Lamp_setColorComponent(BPy_Lamp *self, char *key,
|
||||
PyObject *args);
|
||||
static PyObject *Lamp_getScriptLinks(BPy_Lamp *self, PyObject *args);
|
||||
static PyObject *Lamp_addScriptLink(BPy_Lamp *self, PyObject *args);
|
||||
static PyObject *Lamp_clearScriptLinks(BPy_Lamp *self);
|
||||
|
||||
/*****************************************************************************/
|
||||
/* Python BPy_Lamp methods table: */
|
||||
/*****************************************************************************/
|
||||
static PyMethodDef BPy_Lamp_methods[] = {
|
||||
/* name, method, flags, doc */
|
||||
{"getName", (PyCFunction)Lamp_getName, METH_NOARGS,
|
||||
"() - return Lamp name"},
|
||||
{"getType", (PyCFunction)Lamp_getType, METH_NOARGS,
|
||||
"() - return Lamp type - 'Lamp':0, 'Sun':1, 'Spot':2, 'Hemi':3"},
|
||||
{"getMode", (PyCFunction)Lamp_getMode, METH_NOARGS,
|
||||
"() - return Lamp mode flags (or'ed value)"},
|
||||
{"getSamples", (PyCFunction)Lamp_getSamples, METH_NOARGS,
|
||||
"() - return Lamp samples value"},
|
||||
{"getBufferSize", (PyCFunction)Lamp_getBufferSize, METH_NOARGS,
|
||||
"() - return Lamp buffer size value"},
|
||||
{"getHaloStep", (PyCFunction)Lamp_getHaloStep, METH_NOARGS,
|
||||
"() - return Lamp halo step value"},
|
||||
{"getEnergy", (PyCFunction)Lamp_getEnergy, METH_NOARGS,
|
||||
"() - return Lamp energy value"},
|
||||
{"getDist", (PyCFunction)Lamp_getDist, METH_NOARGS,
|
||||
"() - return Lamp clipping distance value"},
|
||||
{"getSpotSize", (PyCFunction)Lamp_getSpotSize, METH_NOARGS,
|
||||
"() - return Lamp spot size value"},
|
||||
{"getSpotBlend", (PyCFunction)Lamp_getSpotBlend, METH_NOARGS,
|
||||
"() - return Lamp spot blend value"},
|
||||
{"getClipStart", (PyCFunction)Lamp_getClipStart, METH_NOARGS,
|
||||
"() - return Lamp clip start value"},
|
||||
{"getClipEnd", (PyCFunction)Lamp_getClipEnd, METH_NOARGS,
|
||||
"() - return Lamp clip end value"},
|
||||
{"getBias", (PyCFunction)Lamp_getBias, METH_NOARGS,
|
||||
"() - return Lamp bias value"},
|
||||
{"getSoftness", (PyCFunction)Lamp_getSoftness, METH_NOARGS,
|
||||
"() - return Lamp softness value"},
|
||||
{"getHaloInt", (PyCFunction)Lamp_getHaloInt, METH_NOARGS,
|
||||
"() - return Lamp halo intensity value"},
|
||||
{"getQuad1", (PyCFunction)Lamp_getQuad1, METH_NOARGS,
|
||||
"() - return light intensity value #1 for a Quad Lamp"},
|
||||
{"getQuad2", (PyCFunction)Lamp_getQuad2, METH_NOARGS,
|
||||
"() - return light intensity value #2 for a Quad Lamp"},
|
||||
{"getCol", (PyCFunction)Lamp_getCol, METH_NOARGS,
|
||||
"() - return light rgb color triplet"},
|
||||
{"setName", (PyCFunction)Lamp_setName, METH_VARARGS,
|
||||
"(str) - rename Lamp"},
|
||||
{"setType", (PyCFunction)Lamp_setType, METH_VARARGS,
|
||||
"(str) - change Lamp type, which can be 'persp' or 'ortho'"},
|
||||
{"setMode", (PyCFunction)Lamp_setMode, METH_VARARGS,
|
||||
"([up to eight str's]) - Set Lamp mode flag(s)"},
|
||||
{"setSamples", (PyCFunction)Lamp_setSamples, METH_VARARGS,
|
||||
"(int) - change Lamp samples value"},
|
||||
{"setBufferSize", (PyCFunction)Lamp_setBufferSize, METH_VARARGS,
|
||||
"(int) - change Lamp buffer size value"},
|
||||
{"setHaloStep", (PyCFunction)Lamp_setHaloStep, METH_VARARGS,
|
||||
"(int) - change Lamp halo step value"},
|
||||
{"setEnergy", (PyCFunction)Lamp_setEnergy, METH_VARARGS,
|
||||
"(float) - change Lamp energy value"},
|
||||
{"setDist", (PyCFunction)Lamp_setDist, METH_VARARGS,
|
||||
"(float) - change Lamp clipping distance value"},
|
||||
{"setSpotSize", (PyCFunction)Lamp_setSpotSize, METH_VARARGS,
|
||||
"(float) - change Lamp spot size value"},
|
||||
{"setSpotBlend", (PyCFunction)Lamp_setSpotBlend, METH_VARARGS,
|
||||
"(float) - change Lamp spot blend value"},
|
||||
{"setClipStart", (PyCFunction)Lamp_setClipStart, METH_VARARGS,
|
||||
"(float) - change Lamp clip start value"},
|
||||
{"setClipEnd", (PyCFunction)Lamp_setClipEnd, METH_VARARGS,
|
||||
"(float) - change Lamp clip end value"},
|
||||
{"setBias", (PyCFunction)Lamp_setBias, METH_VARARGS,
|
||||
"(float) - change Lamp draw size value"},
|
||||
{"setSoftness", (PyCFunction)Lamp_setSoftness, METH_VARARGS,
|
||||
"(float) - change Lamp softness value"},
|
||||
{"setHaloInt", (PyCFunction)Lamp_setHaloInt, METH_VARARGS,
|
||||
"(float) - change Lamp halo intensity value"},
|
||||
{"setQuad1", (PyCFunction)Lamp_setQuad1, METH_VARARGS,
|
||||
"(float) - change light intensity value #1 for a Quad Lamp"},
|
||||
{"setQuad2", (PyCFunction)Lamp_setQuad2, METH_VARARGS,
|
||||
"(float) - change light intensity value #2 for a Quad Lamp"},
|
||||
{"setCol", (PyCFunction)Lamp_setCol, METH_VARARGS,
|
||||
"(f,f,f) or ([f,f,f]) - change light's rgb color triplet"},
|
||||
{"getScriptLinks", (PyCFunction)Lamp_getScriptLinks, METH_VARARGS,
|
||||
"(eventname) - Get a list of this lamp's scriptlinks (Text names) "
|
||||
"of the given type\n"
|
||||
"(eventname) - string: FrameChanged or Redraw."},
|
||||
{"addScriptLink", (PyCFunction)Lamp_addScriptLink, METH_VARARGS,
|
||||
"(text, evt) - Add a new lamp scriptlink.\n"
|
||||
"(text) - string: an existing Blender Text name;\n"
|
||||
"(evt) string: FrameChanged or Redraw."},
|
||||
{"clearScriptLinks", (PyCFunction)Lamp_clearScriptLinks, METH_NOARGS,
|
||||
"() - Delete all scriptlinks from this lamp."},
|
||||
{NULL, NULL, 0, NULL}
|
||||
};
|
||||
|
||||
/*****************************************************************************/
|
||||
/* Python TypeLamp callback function prototypes: */
|
||||
/*****************************************************************************/
|
||||
static void Lamp_dealloc (BPy_Lamp *lamp);
|
||||
static PyObject *Lamp_getAttr (BPy_Lamp *lamp, char *name);
|
||||
static int Lamp_setAttr (BPy_Lamp *lamp, char *name, PyObject *v);
|
||||
static int Lamp_compare (BPy_Lamp *a, BPy_Lamp *b);
|
||||
static PyObject *Lamp_repr (BPy_Lamp *lamp);
|
||||
|
||||
|
||||
/*****************************************************************************/
|
||||
/* Python TypeLamp structure definition: */
|
||||
@ -859,6 +1121,45 @@ static PyObject *Lamp_setCol(BPy_Lamp *self, PyObject *args)
|
||||
return rgbTuple_setCol(self->color, args);
|
||||
}
|
||||
|
||||
/* lamp.addScriptLink */
|
||||
static PyObject *Lamp_addScriptLink (BPy_Lamp *self, PyObject *args)
|
||||
{
|
||||
Lamp *lamp = self->lamp;
|
||||
ScriptLink *slink = NULL;
|
||||
|
||||
slink = &(lamp)->scriptlink;
|
||||
|
||||
if (!EXPP_addScriptLink(slink, args, 0))
|
||||
return EXPP_incr_ret (Py_None);
|
||||
else return NULL;
|
||||
}
|
||||
|
||||
/* lamp.clearScriptLinks */
|
||||
static PyObject *Lamp_clearScriptLinks (BPy_Lamp *self)
|
||||
{
|
||||
Lamp *lamp = self->lamp;
|
||||
ScriptLink *slink = NULL;
|
||||
|
||||
slink = &(lamp)->scriptlink;
|
||||
|
||||
return EXPP_incr_ret(Py_BuildValue("i", EXPP_clearScriptLinks (slink)));
|
||||
}
|
||||
|
||||
/* mat.getScriptLinks */
|
||||
static PyObject *Lamp_getScriptLinks (BPy_Lamp *self, PyObject *args)
|
||||
{
|
||||
Lamp *lamp = self->lamp;
|
||||
ScriptLink *slink = NULL;
|
||||
PyObject *ret = NULL;
|
||||
|
||||
slink = &(lamp)->scriptlink;
|
||||
|
||||
ret = EXPP_getScriptLinks(slink, args, 0);
|
||||
|
||||
if (ret) return ret;
|
||||
else return NULL;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/* Function: Lamp_dealloc */
|
||||
/* Description: This is a callback function for the BPy_Lamp type. It is */
|
||||
|
@ -32,256 +32,4 @@
|
||||
#ifndef EXPP_LAMP_H
|
||||
#define EXPP_LAMP_H
|
||||
|
||||
#include <Python.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include <BKE_main.h>
|
||||
#include <BKE_global.h>
|
||||
#include <BKE_object.h>
|
||||
#include <BKE_library.h>
|
||||
#include <BLI_blenlib.h>
|
||||
#include <DNA_lamp_types.h>
|
||||
|
||||
#include "constant.h"
|
||||
#include "rgbTuple.h"
|
||||
#include "gen_utils.h"
|
||||
#include "modules.h"
|
||||
#include "bpy_types.h" /* for the BPy_Lamp declaration */
|
||||
|
||||
/*****************************************************************************/
|
||||
/* Python BPy_Lamp defaults: */
|
||||
/*****************************************************************************/
|
||||
|
||||
/* Lamp types */
|
||||
|
||||
#define EXPP_LAMP_TYPE_LAMP 0
|
||||
#define EXPP_LAMP_TYPE_SUN 1
|
||||
#define EXPP_LAMP_TYPE_SPOT 2
|
||||
#define EXPP_LAMP_TYPE_HEMI 3
|
||||
|
||||
/* Lamp mode flags */
|
||||
|
||||
#define EXPP_LAMP_MODE_SHADOWS 1
|
||||
#define EXPP_LAMP_MODE_HALO 2
|
||||
#define EXPP_LAMP_MODE_LAYER 4
|
||||
#define EXPP_LAMP_MODE_QUAD 8
|
||||
#define EXPP_LAMP_MODE_NEGATIVE 16
|
||||
#define EXPP_LAMP_MODE_ONLYSHADOW 32
|
||||
#define EXPP_LAMP_MODE_SPHERE 64
|
||||
#define EXPP_LAMP_MODE_SQUARE 128
|
||||
#define EXPP_LAMP_MODE_TEXTURE 256
|
||||
#define EXPP_LAMP_MODE_OSATEX 512
|
||||
#define EXPP_LAMP_MODE_DEEPSHADOW 1024
|
||||
#define EXPP_LAMP_MODE_NODIFFUSE 2048
|
||||
#define EXPP_LAMP_MODE_NOSPECULAR 4096
|
||||
/* Lamp MIN, MAX values */
|
||||
|
||||
#define EXPP_LAMP_SAMPLES_MIN 1
|
||||
#define EXPP_LAMP_SAMPLES_MAX 16
|
||||
#define EXPP_LAMP_BUFFERSIZE_MIN 512
|
||||
#define EXPP_LAMP_BUFFERSIZE_MAX 5120
|
||||
#define EXPP_LAMP_ENERGY_MIN 0.0
|
||||
#define EXPP_LAMP_ENERGY_MAX 10.0
|
||||
#define EXPP_LAMP_DIST_MIN 0.1
|
||||
#define EXPP_LAMP_DIST_MAX 5000.0
|
||||
#define EXPP_LAMP_SPOTSIZE_MIN 1.0
|
||||
#define EXPP_LAMP_SPOTSIZE_MAX 180.0
|
||||
#define EXPP_LAMP_SPOTBLEND_MIN 0.00
|
||||
#define EXPP_LAMP_SPOTBLEND_MAX 1.00
|
||||
#define EXPP_LAMP_CLIPSTART_MIN 0.1
|
||||
#define EXPP_LAMP_CLIPSTART_MAX 1000.0
|
||||
#define EXPP_LAMP_CLIPEND_MIN 1.0
|
||||
#define EXPP_LAMP_CLIPEND_MAX 5000.0
|
||||
#define EXPP_LAMP_BIAS_MIN 0.01
|
||||
#define EXPP_LAMP_BIAS_MAX 5.00
|
||||
#define EXPP_LAMP_SOFTNESS_MIN 1.0
|
||||
#define EXPP_LAMP_SOFTNESS_MAX 100.0
|
||||
#define EXPP_LAMP_HALOINT_MIN 0.0
|
||||
#define EXPP_LAMP_HALOINT_MAX 5.0
|
||||
#define EXPP_LAMP_HALOSTEP_MIN 0
|
||||
#define EXPP_LAMP_HALOSTEP_MAX 12
|
||||
#define EXPP_LAMP_QUAD1_MIN 0.0
|
||||
#define EXPP_LAMP_QUAD1_MAX 1.0
|
||||
#define EXPP_LAMP_QUAD2_MIN 0.0
|
||||
#define EXPP_LAMP_QUAD2_MAX 1.0
|
||||
#define EXPP_LAMP_COL_MIN 0.0
|
||||
#define EXPP_LAMP_COL_MAX 1.0
|
||||
|
||||
/*****************************************************************************/
|
||||
/* Python API function prototypes for the Lamp module. */
|
||||
/*****************************************************************************/
|
||||
static PyObject *M_Lamp_New (PyObject *self, PyObject *args, PyObject *keywords);
|
||||
static PyObject *M_Lamp_Get (PyObject *self, PyObject *args);
|
||||
|
||||
/*****************************************************************************/
|
||||
/* The following string definitions are used for documentation strings. */
|
||||
/* In Python these will be written to the console when doing a */
|
||||
/* Blender.Lamp.__doc__ */
|
||||
/*****************************************************************************/
|
||||
char M_Lamp_doc[] =
|
||||
"The Blender Lamp module\n\n\
|
||||
This module provides control over **Lamp Data** objects in Blender.\n\n\
|
||||
Example::\n\n\
|
||||
from Blender import Lamp\n\
|
||||
l = Lamp.New('Spot') # create new 'Spot' lamp data\n\
|
||||
l.setMode('square', 'shadow') # set these two lamp mode flags\n\
|
||||
ob = Object.New('Lamp') # create new lamp object\n\
|
||||
ob.link(l) # link lamp obj with lamp data\n";
|
||||
|
||||
char M_Lamp_New_doc[] =
|
||||
"Lamp.New (type = 'Lamp', name = 'LampData'):\n\
|
||||
Return a new Lamp Data object with the given type and name.";
|
||||
|
||||
char M_Lamp_Get_doc[] =
|
||||
"Lamp.Get (name = None):\n\
|
||||
Return the Lamp Data with the given name, None if not found, or\n\
|
||||
Return a list with all Lamp Data objects in the current scene,\n\
|
||||
if no argument was given.";
|
||||
|
||||
/*****************************************************************************/
|
||||
/* Python method structure definition for Blender.Lamp module: */
|
||||
/*****************************************************************************/
|
||||
struct PyMethodDef M_Lamp_methods[] = {
|
||||
{"New",(PyCFunction)M_Lamp_New, METH_VARARGS|METH_KEYWORDS,
|
||||
M_Lamp_New_doc},
|
||||
{"Get", M_Lamp_Get, METH_VARARGS, M_Lamp_Get_doc},
|
||||
{"get", M_Lamp_Get, METH_VARARGS, M_Lamp_Get_doc},
|
||||
{NULL, NULL, 0, NULL}
|
||||
};
|
||||
|
||||
/*****************************************************************************/
|
||||
/* Python BPy_Lamp methods declarations: */
|
||||
/*****************************************************************************/
|
||||
static PyObject *Lamp_getName(BPy_Lamp *self);
|
||||
static PyObject *Lamp_getType(BPy_Lamp *self);
|
||||
static PyObject *Lamp_getMode(BPy_Lamp *self);
|
||||
static PyObject *Lamp_getSamples(BPy_Lamp *self);
|
||||
static PyObject *Lamp_getBufferSize(BPy_Lamp *self);
|
||||
static PyObject *Lamp_getHaloStep(BPy_Lamp *self);
|
||||
static PyObject *Lamp_getEnergy(BPy_Lamp *self);
|
||||
static PyObject *Lamp_getDist(BPy_Lamp *self);
|
||||
static PyObject *Lamp_getSpotSize(BPy_Lamp *self);
|
||||
static PyObject *Lamp_getSpotBlend(BPy_Lamp *self);
|
||||
static PyObject *Lamp_getClipStart(BPy_Lamp *self);
|
||||
static PyObject *Lamp_getClipEnd(BPy_Lamp *self);
|
||||
static PyObject *Lamp_getBias(BPy_Lamp *self);
|
||||
static PyObject *Lamp_getSoftness(BPy_Lamp *self);
|
||||
static PyObject *Lamp_getHaloInt(BPy_Lamp *self);
|
||||
static PyObject *Lamp_getQuad1(BPy_Lamp *self);
|
||||
static PyObject *Lamp_getQuad2(BPy_Lamp *self);
|
||||
static PyObject *Lamp_getCol(BPy_Lamp *self);
|
||||
static PyObject *Lamp_setName(BPy_Lamp *self, PyObject *args);
|
||||
static PyObject *Lamp_setType(BPy_Lamp *self, PyObject *args);
|
||||
static PyObject *Lamp_setIntType(BPy_Lamp *self, PyObject *args);
|
||||
static PyObject *Lamp_setMode(BPy_Lamp *self, PyObject *args);
|
||||
static PyObject *Lamp_setIntMode(BPy_Lamp *self, PyObject *args);
|
||||
static PyObject *Lamp_setSamples(BPy_Lamp *self, PyObject *args);
|
||||
static PyObject *Lamp_setBufferSize(BPy_Lamp *self, PyObject *args);
|
||||
static PyObject *Lamp_setHaloStep(BPy_Lamp *self, PyObject *args);
|
||||
static PyObject *Lamp_setEnergy(BPy_Lamp *self, PyObject *args);
|
||||
static PyObject *Lamp_setDist(BPy_Lamp *self, PyObject *args);
|
||||
static PyObject *Lamp_setSpotSize(BPy_Lamp *self, PyObject *args);
|
||||
static PyObject *Lamp_setSpotBlend(BPy_Lamp *self, PyObject *args);
|
||||
static PyObject *Lamp_setClipStart(BPy_Lamp *self, PyObject *args);
|
||||
static PyObject *Lamp_setClipEnd(BPy_Lamp *self, PyObject *args);
|
||||
static PyObject *Lamp_setBias(BPy_Lamp *self, PyObject *args);
|
||||
static PyObject *Lamp_setSoftness(BPy_Lamp *self, PyObject *args);
|
||||
static PyObject *Lamp_setHaloInt(BPy_Lamp *self, PyObject *args);
|
||||
static PyObject *Lamp_setQuad1(BPy_Lamp *self, PyObject *args);
|
||||
static PyObject *Lamp_setQuad2(BPy_Lamp *self, PyObject *args);
|
||||
static PyObject *Lamp_setCol(BPy_Lamp *self, PyObject *args);
|
||||
|
||||
static PyObject *Lamp_setColorComponent(BPy_Lamp *self, char *key,
|
||||
PyObject *args);
|
||||
|
||||
/*****************************************************************************/
|
||||
/* Python BPy_Lamp methods table: */
|
||||
/*****************************************************************************/
|
||||
static PyMethodDef BPy_Lamp_methods[] = {
|
||||
/* name, method, flags, doc */
|
||||
{"getName", (PyCFunction)Lamp_getName, METH_NOARGS,
|
||||
"() - return Lamp name"},
|
||||
{"getType", (PyCFunction)Lamp_getType, METH_NOARGS,
|
||||
"() - return Lamp type - 'Lamp':0, 'Sun':1, 'Spot':2, 'Hemi':3"},
|
||||
{"getMode", (PyCFunction)Lamp_getMode, METH_NOARGS,
|
||||
"() - return Lamp mode flags (or'ed value)"},
|
||||
{"getSamples", (PyCFunction)Lamp_getSamples, METH_NOARGS,
|
||||
"() - return Lamp samples value"},
|
||||
{"getBufferSize", (PyCFunction)Lamp_getBufferSize, METH_NOARGS,
|
||||
"() - return Lamp buffer size value"},
|
||||
{"getHaloStep", (PyCFunction)Lamp_getHaloStep, METH_NOARGS,
|
||||
"() - return Lamp halo step value"},
|
||||
{"getEnergy", (PyCFunction)Lamp_getEnergy, METH_NOARGS,
|
||||
"() - return Lamp energy value"},
|
||||
{"getDist", (PyCFunction)Lamp_getDist, METH_NOARGS,
|
||||
"() - return Lamp clipping distance value"},
|
||||
{"getSpotSize", (PyCFunction)Lamp_getSpotSize, METH_NOARGS,
|
||||
"() - return Lamp spot size value"},
|
||||
{"getSpotBlend", (PyCFunction)Lamp_getSpotBlend, METH_NOARGS,
|
||||
"() - return Lamp spot blend value"},
|
||||
{"getClipStart", (PyCFunction)Lamp_getClipStart, METH_NOARGS,
|
||||
"() - return Lamp clip start value"},
|
||||
{"getClipEnd", (PyCFunction)Lamp_getClipEnd, METH_NOARGS,
|
||||
"() - return Lamp clip end value"},
|
||||
{"getBias", (PyCFunction)Lamp_getBias, METH_NOARGS,
|
||||
"() - return Lamp bias value"},
|
||||
{"getSoftness", (PyCFunction)Lamp_getSoftness, METH_NOARGS,
|
||||
"() - return Lamp softness value"},
|
||||
{"getHaloInt", (PyCFunction)Lamp_getHaloInt, METH_NOARGS,
|
||||
"() - return Lamp halo intensity value"},
|
||||
{"getQuad1", (PyCFunction)Lamp_getQuad1, METH_NOARGS,
|
||||
"() - return light intensity value #1 for a Quad Lamp"},
|
||||
{"getQuad2", (PyCFunction)Lamp_getQuad2, METH_NOARGS,
|
||||
"() - return light intensity value #2 for a Quad Lamp"},
|
||||
{"getCol", (PyCFunction)Lamp_getCol, METH_NOARGS,
|
||||
"() - return light rgb color triplet"},
|
||||
{"setName", (PyCFunction)Lamp_setName, METH_VARARGS,
|
||||
"(str) - rename Lamp"},
|
||||
{"setType", (PyCFunction)Lamp_setType, METH_VARARGS,
|
||||
"(str) - change Lamp type, which can be 'persp' or 'ortho'"},
|
||||
{"setMode", (PyCFunction)Lamp_setMode, METH_VARARGS,
|
||||
"([up to eight str's]) - Set Lamp mode flag(s)"},
|
||||
{"setSamples", (PyCFunction)Lamp_setSamples, METH_VARARGS,
|
||||
"(int) - change Lamp samples value"},
|
||||
{"setBufferSize", (PyCFunction)Lamp_setBufferSize, METH_VARARGS,
|
||||
"(int) - change Lamp buffer size value"},
|
||||
{"setHaloStep", (PyCFunction)Lamp_setHaloStep, METH_VARARGS,
|
||||
"(int) - change Lamp halo step value"},
|
||||
{"setEnergy", (PyCFunction)Lamp_setEnergy, METH_VARARGS,
|
||||
"(float) - change Lamp energy value"},
|
||||
{"setDist", (PyCFunction)Lamp_setDist, METH_VARARGS,
|
||||
"(float) - change Lamp clipping distance value"},
|
||||
{"setSpotSize", (PyCFunction)Lamp_setSpotSize, METH_VARARGS,
|
||||
"(float) - change Lamp spot size value"},
|
||||
{"setSpotBlend", (PyCFunction)Lamp_setSpotBlend, METH_VARARGS,
|
||||
"(float) - change Lamp spot blend value"},
|
||||
{"setClipStart", (PyCFunction)Lamp_setClipStart, METH_VARARGS,
|
||||
"(float) - change Lamp clip start value"},
|
||||
{"setClipEnd", (PyCFunction)Lamp_setClipEnd, METH_VARARGS,
|
||||
"(float) - change Lamp clip end value"},
|
||||
{"setBias", (PyCFunction)Lamp_setBias, METH_VARARGS,
|
||||
"(float) - change Lamp draw size value"},
|
||||
{"setSoftness", (PyCFunction)Lamp_setSoftness, METH_VARARGS,
|
||||
"(float) - change Lamp softness value"},
|
||||
{"setHaloInt", (PyCFunction)Lamp_setHaloInt, METH_VARARGS,
|
||||
"(float) - change Lamp halo intensity value"},
|
||||
{"setQuad1", (PyCFunction)Lamp_setQuad1, METH_VARARGS,
|
||||
"(float) - change light intensity value #1 for a Quad Lamp"},
|
||||
{"setQuad2", (PyCFunction)Lamp_setQuad2, METH_VARARGS,
|
||||
"(float) - change light intensity value #2 for a Quad Lamp"},
|
||||
{"setCol", (PyCFunction)Lamp_setCol, METH_VARARGS,
|
||||
"(f,f,f) or ([f,f,f]) - change light's rgb color triplet"},
|
||||
{NULL, NULL, 0, NULL}
|
||||
};
|
||||
|
||||
/*****************************************************************************/
|
||||
/* Python TypeLamp callback function prototypes: */
|
||||
/*****************************************************************************/
|
||||
static void Lamp_dealloc (BPy_Lamp *lamp);
|
||||
static PyObject *Lamp_getAttr (BPy_Lamp *lamp, char *name);
|
||||
static int Lamp_setAttr (BPy_Lamp *lamp, char *name, PyObject *v);
|
||||
static int Lamp_compare (BPy_Lamp *a, BPy_Lamp *b);
|
||||
static PyObject *Lamp_repr (BPy_Lamp *lamp);
|
||||
|
||||
|
||||
#endif /* EXPP_LAMP_H */
|
||||
|
@ -99,6 +99,7 @@ struct PyMethodDef M_Object_methods[] = {
|
||||
static PyObject *Object_buildParts (BPy_Object *self);
|
||||
static PyObject *Object_clearIpo (BPy_Object *self);
|
||||
static PyObject *Object_clrParent (BPy_Object *self, PyObject *args);
|
||||
static PyObject *Object_clearTrack (BPy_Object *self, PyObject *args);
|
||||
static PyObject *Object_getData (BPy_Object *self);
|
||||
static PyObject *Object_getDeltaLocation (BPy_Object *self);
|
||||
static PyObject *Object_getDrawMode (BPy_Object *self);
|
||||
@ -133,6 +134,7 @@ static PyObject *Object_setMaterials (BPy_Object *self, PyObject *args);
|
||||
static PyObject *Object_setName (BPy_Object *self, PyObject *args);
|
||||
static PyObject *Object_setSize (BPy_Object *self, PyObject *args);
|
||||
static PyObject *Object_setTimeOffset (BPy_Object *self, PyObject *args);
|
||||
static PyObject *Object_makeTrack (BPy_Object *self, PyObject *args);
|
||||
static PyObject *Object_shareFrom (BPy_Object *self, PyObject *args);
|
||||
static PyObject *Object_Select (BPy_Object *self, PyObject *args);
|
||||
static PyObject *Object_getAllProperties (BPy_Object *self);
|
||||
@ -141,6 +143,9 @@ static PyObject *Object_removeProperty(BPy_Object *self, PyObject *args);
|
||||
static PyObject *Object_getProperty(BPy_Object *self, PyObject *args);
|
||||
static PyObject *Object_removeAllProperties(BPy_Object *self);
|
||||
static PyObject *Object_copyAllPropertiesTo(BPy_Object *self, PyObject *args);
|
||||
static PyObject *Object_getScriptLinks(BPy_Object *self, PyObject *args);
|
||||
static PyObject *Object_addScriptLink(BPy_Object *self, PyObject *args);
|
||||
static PyObject *Object_clearScriptLinks(BPy_Object *self);
|
||||
|
||||
/*****************************************************************************/
|
||||
/* Python BPy_Object methods table: */
|
||||
@ -153,6 +158,10 @@ static PyMethodDef BPy_Object_methods[] = {
|
||||
"Returns the ipo of this object (if any) "},
|
||||
{"clrParent", (PyCFunction)Object_clrParent, METH_VARARGS,
|
||||
"Clears parent object. Optionally specify:\n\
|
||||
mode\n\tnonzero: Keep object transform\nfast\n\t>0: Don't update scene \
|
||||
hierarchy (faster)"},
|
||||
{"clearTrack", (PyCFunction)Object_clearTrack, METH_VARARGS,
|
||||
"Make this object not track another anymore. Optionally specify:\n\
|
||||
mode\n\t2: Keep object transform\nfast\n\t>0: Don't update scene \
|
||||
hierarchy (faster)"},
|
||||
{"getData", (PyCFunction)Object_getData, METH_NOARGS,
|
||||
@ -203,7 +212,7 @@ match the Object's type, so you cannot link a Lamp to a Mesh type object."},
|
||||
"Makes the object the parent of the objects provided in the \n\
|
||||
argument which must be a list of valid Objects. Optional extra arguments:\n\
|
||||
mode:\n\t0: make parent with inverse\n\t1: without inverse\n\
|
||||
fase:\n\t0: update scene hierarchy automatically\n\t\
|
||||
fast:\n\t0: update scene hierarchy automatically\n\t\
|
||||
don't update scene hierarchy (faster). In this case, you must\n\t\
|
||||
explicitely update the Scene hierarchy."},
|
||||
{"materialUsage", (PyCFunction)Object_materialUsage, METH_VARARGS,
|
||||
@ -237,6 +246,12 @@ objects."},
|
||||
triple."},
|
||||
{"setTimeOffset", (PyCFunction)Object_setTimeOffset, METH_VARARGS,
|
||||
"Set the object's time offset."},
|
||||
{"makeTrack", (PyCFunction)Object_makeTrack, METH_VARARGS,
|
||||
"(trackedobj, fast = 0) - Make this object track another.\n\
|
||||
(trackedobj) - the object that will be tracked.\n\
|
||||
(fast = 0) - if 0: update the scene hierarchy automatically. If you\n\
|
||||
set 'fast' to a nonzero value, don't forget to update the scene yourself\n\
|
||||
(see scene.update())."},
|
||||
{"shareFrom", (PyCFunction)Object_shareFrom, METH_VARARGS,
|
||||
"Link data of self with object specified in the argument. This\n\
|
||||
works only if self and the object specified are of the same type."},
|
||||
@ -259,6 +274,16 @@ works only if self and the object specified are of the same type."},
|
||||
"() - removeAll a properties from this object"},
|
||||
{"copyAllPropertiesTo", (PyCFunction)Object_copyAllPropertiesTo, METH_VARARGS,
|
||||
"() - copy all properties from this object to another object"},
|
||||
{"getScriptLinks", (PyCFunction)Object_getScriptLinks, METH_VARARGS,
|
||||
"(eventname) - Get a list of this object's scriptlinks (Text names) "
|
||||
"of the given type\n"
|
||||
"(eventname) - string: FrameChanged or Redraw."},
|
||||
{"addScriptLink", (PyCFunction)Object_addScriptLink, METH_VARARGS,
|
||||
"(text, evt) - Add a new object scriptlink.\n"
|
||||
"(text) - string: an existing Blender Text name;\n"
|
||||
"(evt) string: FrameChanged or Redraw."},
|
||||
{"clearScriptLinks", (PyCFunction)Object_clearScriptLinks, METH_NOARGS,
|
||||
"() - Delete all scriptlinks from this object."},
|
||||
{NULL, NULL, 0, NULL}
|
||||
};
|
||||
|
||||
@ -620,6 +645,35 @@ static PyObject *Object_clrParent (BPy_Object *self, PyObject *args)
|
||||
return (Py_None);
|
||||
}
|
||||
|
||||
static PyObject *Object_clearTrack (BPy_Object *self, PyObject *args)
|
||||
{
|
||||
int mode=0;
|
||||
int fast=0;
|
||||
|
||||
if (!PyArg_ParseTuple (args, "|ii", &mode, &fast))
|
||||
{
|
||||
return (EXPP_ReturnPyObjError (PyExc_AttributeError,
|
||||
"expected one or two integers as arguments"));
|
||||
}
|
||||
|
||||
/* Remove the link only, the object is still in the scene. */
|
||||
self->object->track = NULL;
|
||||
|
||||
if (mode)
|
||||
{
|
||||
/* Keep transform */
|
||||
apply_obmat (self->object);
|
||||
}
|
||||
|
||||
if (!fast)
|
||||
{
|
||||
sort_baselist (G.scene);
|
||||
}
|
||||
|
||||
Py_INCREF (Py_None);
|
||||
return (Py_None);
|
||||
}
|
||||
|
||||
/* adds object data to a Blender object, if object->data = NULL */
|
||||
int EXPP_add_obdata(struct Object *object)
|
||||
{
|
||||
@ -1600,6 +1654,23 @@ static PyObject *Object_setTimeOffset (BPy_Object *self, PyObject *args)
|
||||
return (Py_None);
|
||||
}
|
||||
|
||||
static PyObject *Object_makeTrack (BPy_Object *self, PyObject *args)
|
||||
{
|
||||
BPy_Object *tracked = NULL;
|
||||
Object *ob = self->object;
|
||||
int fast = 0;
|
||||
|
||||
if (!PyArg_ParseTuple (args, "O!|i", &Object_Type, &tracked, &fast))
|
||||
return EXPP_ReturnPyObjError (PyExc_TypeError,
|
||||
"expected an object and optionally also an int as arguments.");
|
||||
|
||||
ob->track = tracked->object;
|
||||
|
||||
if (!fast) sort_baselist(G.scene);
|
||||
|
||||
return EXPP_incr_ret(Py_None);
|
||||
}
|
||||
|
||||
static PyObject *Object_shareFrom (BPy_Object *self, PyObject *args)
|
||||
{
|
||||
BPy_Object * object;
|
||||
@ -1608,22 +1679,19 @@ static PyObject *Object_shareFrom (BPy_Object *self, PyObject *args)
|
||||
|
||||
if (!PyArg_ParseTuple (args, "O", &object))
|
||||
{
|
||||
EXPP_ReturnPyObjError (PyExc_AttributeError,
|
||||
return EXPP_ReturnPyObjError (PyExc_AttributeError,
|
||||
"expected an object argument");
|
||||
return (NULL);
|
||||
}
|
||||
if (!Object_CheckPyObject ((PyObject*)object))
|
||||
{
|
||||
EXPP_ReturnPyObjError (PyExc_TypeError,
|
||||
return EXPP_ReturnPyObjError (PyExc_TypeError,
|
||||
"argument 1 is not of type 'Object'");
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
if (self->object->type != object->object->type)
|
||||
{
|
||||
EXPP_ReturnPyObjError (PyExc_TypeError,
|
||||
return EXPP_ReturnPyObjError (PyExc_TypeError,
|
||||
"objects are not of same data type");
|
||||
return (NULL);
|
||||
}
|
||||
switch (self->object->type)
|
||||
{
|
||||
@ -1659,9 +1727,8 @@ static PyObject *Object_shareFrom (BPy_Object *self, PyObject *args)
|
||||
Py_INCREF (Py_None);
|
||||
return (Py_None);
|
||||
default:
|
||||
EXPP_ReturnPyObjError (PyExc_TypeError,
|
||||
return EXPP_ReturnPyObjError (PyExc_TypeError,
|
||||
"type not supported");
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
Py_INCREF (Py_None);
|
||||
@ -1871,6 +1938,45 @@ static PyObject *Object_copyAllPropertiesTo(BPy_Object *self, PyObject *args)
|
||||
return EXPP_incr_ret (Py_None);
|
||||
}
|
||||
|
||||
/* obj.addScriptLink */
|
||||
static PyObject *Object_addScriptLink (BPy_Object *self, PyObject *args)
|
||||
{
|
||||
Object *obj = self->object;
|
||||
ScriptLink *slink = NULL;
|
||||
|
||||
slink = &(obj)->scriptlink;
|
||||
|
||||
if (!EXPP_addScriptLink(slink, args, 0))
|
||||
return EXPP_incr_ret (Py_None);
|
||||
else return NULL;
|
||||
}
|
||||
|
||||
/* obj.clearScriptLinks */
|
||||
static PyObject *Object_clearScriptLinks (BPy_Object *self)
|
||||
{
|
||||
Object *obj = self->object;
|
||||
ScriptLink *slink = NULL;
|
||||
|
||||
slink = &(obj)->scriptlink;
|
||||
|
||||
return EXPP_incr_ret(Py_BuildValue("i", EXPP_clearScriptLinks (slink)));
|
||||
}
|
||||
|
||||
/* obj.getScriptLinks */
|
||||
static PyObject *Object_getScriptLinks (BPy_Object *self, PyObject *args)
|
||||
{
|
||||
Object *obj = self->object;
|
||||
ScriptLink *slink = NULL;
|
||||
PyObject *ret = NULL;
|
||||
|
||||
slink = &(obj)->scriptlink;
|
||||
|
||||
ret = EXPP_getScriptLinks(slink, args, 0);
|
||||
|
||||
if (ret) return ret;
|
||||
else return NULL;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/* Function: Object_CreatePyObject */
|
||||
/* Description: This function will create a new BlenObject from an existing */
|
||||
@ -2231,10 +2337,10 @@ static int Object_setAttr (BPy_Object *obj, char *name, PyObject *value)
|
||||
}
|
||||
if (StringEqual (name, "track"))
|
||||
{
|
||||
/* This is not allowed. */
|
||||
EXPP_ReturnPyObjError (PyExc_AttributeError,
|
||||
"Setting the track is not allowed.");
|
||||
return (0);
|
||||
if (Object_makeTrack (obj, valtuple) != Py_None)
|
||||
return (-1);
|
||||
else
|
||||
return (0);
|
||||
}
|
||||
if (StringEqual (name, "data"))
|
||||
{
|
||||
|
@ -34,9 +34,12 @@
|
||||
#include <BKE_scene.h>
|
||||
#include <BKE_library.h>
|
||||
#include <BLI_blenlib.h>
|
||||
#include <BSE_drawview.h> /* for play_anim */
|
||||
#include <BSE_headerbuttons.h> /* for copy_scene */
|
||||
#include <BIF_drawscene.h> /* for set_scene */
|
||||
#include <BIF_space.h> /* for copy_view3d_lock() */
|
||||
#include <BIF_screen.h> /* curarea */
|
||||
#include <DNA_screen_types.h> /* SPACE_VIEW3D, SPACE_SEQ */
|
||||
#include <DNA_scriptlink_types.h>
|
||||
#include <MEM_guardedalloc.h> /* for MEM_callocN */
|
||||
#include <mydevice.h> /* for #define REDRAW */
|
||||
@ -101,6 +104,7 @@ static PyObject *Scene_getRenderingContext(BPy_Scene *self);
|
||||
static PyObject *Scene_getScriptLinks(BPy_Scene *self, PyObject *args);
|
||||
static PyObject *Scene_addScriptLink(BPy_Scene *self, PyObject *args);
|
||||
static PyObject *Scene_clearScriptLinks(BPy_Scene *self);
|
||||
static PyObject *Scene_play(BPy_Scene *self, PyObject *args);
|
||||
|
||||
//deprecated methods
|
||||
static PyObject *Scene_currentFrame(BPy_Scene *self, PyObject *args);
|
||||
@ -180,6 +184,19 @@ static PyMethodDef BPy_Scene_methods[] = {
|
||||
{"currentFrame", (PyCFunction)Scene_currentFrame, METH_VARARGS,
|
||||
"(frame) - If frame is given, the current frame is set and"
|
||||
"\nreturned in any case"},
|
||||
{"play", (PyCFunction)Scene_play, METH_VARARGS,
|
||||
"(mode = 0, win = VIEW3D) - Play realtime animation in Blender"
|
||||
" (not rendered).\n"
|
||||
"(mode) - int:\n"
|
||||
"\t0 - keep playing in biggest given 'win';\n"
|
||||
"\t1 - keep playing in all 'win', VIEW3D and SEQ windows;\n"
|
||||
"\t2 - play once in biggest given 'win';\n"
|
||||
"\t3 - play once in all 'win', VIEW3D and SEQ windows.\n"
|
||||
"(win) - int: see Blender.Window.Types. Only these are meaningful here:"
|
||||
"VIEW3D, SEQ, IPO, ACTION, NLA, SOUND. But others are also accepted, "
|
||||
"since they can be used just as an interruptible timer. If 'win' is not"
|
||||
"available or invalid, VIEW3D is tried, then any bigger window."
|
||||
"Returns 0 for normal exit or 1 when canceled by user input."},
|
||||
{NULL, NULL, 0, NULL}
|
||||
};
|
||||
//-----------------------BPy_Scene method def-------------------------------------------------------------------------
|
||||
@ -791,6 +808,62 @@ static PyObject *Scene_getScriptLinks (BPy_Scene *self, PyObject *args)
|
||||
else return NULL;
|
||||
}
|
||||
|
||||
static PyObject *Scene_play (BPy_Scene *self, PyObject *args)
|
||||
{
|
||||
Scene *scene = self->scene;
|
||||
int mode = 0, win = SPACE_VIEW3D;
|
||||
PyObject *ret = NULL;
|
||||
ScrArea *sa = NULL, *oldsa = curarea;
|
||||
|
||||
if (!scene)
|
||||
return EXPP_ReturnPyObjError (PyExc_RuntimeError,
|
||||
"Blender Scene was deleted!");
|
||||
|
||||
if (!PyArg_ParseTuple(args, "|ii", &mode, &win))
|
||||
return EXPP_ReturnPyObjError (PyExc_TypeError,
|
||||
"expected nothing, or or two ints as arguments.");
|
||||
|
||||
if (mode < 0 || mode > 3)
|
||||
return EXPP_ReturnPyObjError (PyExc_TypeError,
|
||||
"mode should be in range [0, 3].");
|
||||
|
||||
switch (win) {
|
||||
case SPACE_VIEW3D:
|
||||
case SPACE_SEQ:
|
||||
case SPACE_IPO:
|
||||
case SPACE_ACTION:
|
||||
case SPACE_NLA:
|
||||
case SPACE_SOUND:
|
||||
case SPACE_BUTS: /* from here they don't 'play', but ...*/
|
||||
case SPACE_TEXT: /* ... might be used as a timer. */
|
||||
case SPACE_SCRIPT:
|
||||
case SPACE_OOPS:
|
||||
case SPACE_IMAGE:
|
||||
case SPACE_IMASEL:
|
||||
case SPACE_INFO:
|
||||
case SPACE_FILE:
|
||||
break;
|
||||
default:
|
||||
win = SPACE_VIEW3D;
|
||||
}
|
||||
|
||||
/* we have to move to a proper win */
|
||||
sa = find_biggest_area_of_type(win);
|
||||
if (!sa && win != SPACE_VIEW3D)
|
||||
sa = find_biggest_area_of_type(SPACE_VIEW3D);
|
||||
|
||||
if (!sa) sa = find_biggest_area();
|
||||
|
||||
if (sa) areawinset(sa->win);
|
||||
|
||||
/* play_anim returns 0 for normal exit or 1 if user canceled it */
|
||||
ret = Py_BuildValue("i", play_anim(mode));
|
||||
|
||||
if (sa) areawinset(oldsa->win);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
// DEPRECATED
|
||||
/*****************************************************************************/
|
||||
|
@ -33,6 +33,7 @@
|
||||
#include <BLI_blenlib.h>
|
||||
#include <PIL_time.h>
|
||||
#include <Python.h>
|
||||
#include <sys/stat.h>
|
||||
#include "gen_utils.h"
|
||||
#include "modules.h"
|
||||
|
||||
@ -92,7 +93,12 @@ Each successive call is garanteed to return values greater than or\n\
|
||||
equal to the previous call.";
|
||||
|
||||
static char M_sys_exists_doc[] =
|
||||
"(path) - Return 1 if given pathname (file or dir) exists, 0 otherwise.";
|
||||
"(path) - Check if the given pathname exists.\n\
|
||||
The return value is as follows:\n\
|
||||
\t 0: path doesn't exist;\n\
|
||||
\t 1: path is an existing filename;\n\
|
||||
\t 2: path is an existing dirname;\n\
|
||||
\t-1: path exists but is neither a regular file nor a dir.";
|
||||
|
||||
/*****************************************************************************/
|
||||
/* Python method structure definition for Blender.sys module: */
|
||||
@ -337,16 +343,20 @@ static PyObject *M_sys_time (PyObject *self)
|
||||
|
||||
static PyObject *M_sys_exists (PyObject *self, PyObject *args)
|
||||
{
|
||||
struct stat st;
|
||||
char *fname = NULL;
|
||||
int i = 0;
|
||||
int res = 0, i = -1;
|
||||
|
||||
if (!PyArg_ParseTuple(args, "s", &fname))
|
||||
return EXPP_ReturnPyObjError (PyExc_TypeError,
|
||||
"expected string (file path) argument");
|
||||
"expected string (pathname) argument");
|
||||
|
||||
i = BLI_exists(fname);
|
||||
res = stat(fname, &st);
|
||||
|
||||
if (i) return Py_BuildValue("i", 1); /* path was found */
|
||||
if (res == -1) i = 0;
|
||||
else if (S_ISREG(st.st_mode)) i = 1;
|
||||
else if (S_ISDIR(st.st_mode)) i = 2;
|
||||
/* i stays as -1 if path exists but is neither a regular file nor a dir */
|
||||
|
||||
return Py_BuildValue("i", 0); /* path doesn't exist */
|
||||
return Py_BuildValue("i", i);
|
||||
}
|
||||
|
@ -639,7 +639,44 @@ static PyObject *World_setMist(BPy_World *self, PyObject *args )
|
||||
return Py_None;
|
||||
}
|
||||
|
||||
/* world.addScriptLink */
|
||||
static PyObject *World_addScriptLink (BPy_World *self, PyObject *args)
|
||||
{
|
||||
World *world = self->world;
|
||||
ScriptLink *slink = NULL;
|
||||
|
||||
slink = &(world)->scriptlink;
|
||||
|
||||
if (!EXPP_addScriptLink(slink, args, 0))
|
||||
return EXPP_incr_ret (Py_None);
|
||||
else return NULL;
|
||||
}
|
||||
|
||||
/* world.clearScriptLinks */
|
||||
static PyObject *World_clearScriptLinks (BPy_World *self)
|
||||
{
|
||||
World *world = self->world;
|
||||
ScriptLink *slink = NULL;
|
||||
|
||||
slink = &(world)->scriptlink;
|
||||
|
||||
return EXPP_incr_ret(Py_BuildValue("i", EXPP_clearScriptLinks (slink)));
|
||||
}
|
||||
|
||||
/* world.getScriptLinks */
|
||||
static PyObject *World_getScriptLinks (BPy_World *self, PyObject *args)
|
||||
{
|
||||
World *world = self->world;
|
||||
ScriptLink *slink = NULL;
|
||||
PyObject *ret = NULL;
|
||||
|
||||
slink = &(world)->scriptlink;
|
||||
|
||||
ret = EXPP_getScriptLinks(slink, args, 0);
|
||||
|
||||
if (ret) return ret;
|
||||
else return NULL;
|
||||
}
|
||||
|
||||
|
||||
/*@{*/
|
||||
|
@ -105,6 +105,9 @@ static PyObject *World_getStar(BPy_World *self);
|
||||
static PyObject *World_setStar(BPy_World *self, PyObject *args );
|
||||
static PyObject *World_getMist(BPy_World *self);
|
||||
static PyObject *World_setMist(BPy_World *self, PyObject *args );
|
||||
static PyObject *World_getScriptLinks(BPy_World *self, PyObject *args);
|
||||
static PyObject *World_addScriptLink(BPy_World *self, PyObject *args);
|
||||
static PyObject *World_clearScriptLinks(BPy_World *self);
|
||||
|
||||
/*****************************************************************************/
|
||||
/* Python BPy_World methods table: */
|
||||
@ -152,6 +155,16 @@ static PyMethodDef BPy_World_methods[] = {
|
||||
"() - Return World Data mist"},
|
||||
{"setMist", (PyCFunction)World_setMist, METH_VARARGS,
|
||||
"() - Return World Data mist"},
|
||||
{"getScriptLinks", (PyCFunction)World_getScriptLinks, METH_VARARGS,
|
||||
"(eventname) - Get a list of this world's scriptlinks (Text names) "
|
||||
"of the given type\n"
|
||||
"(eventname) - string: FrameChanged or Redraw."},
|
||||
{"addScriptLink", (PyCFunction)World_addScriptLink, METH_VARARGS,
|
||||
"(text, evt) - Add a new world scriptlink.\n"
|
||||
"(text) - string: an existing Blender Text name;\n"
|
||||
"(evt) string: FrameChanged or Redraw."},
|
||||
{"clearScriptLinks", (PyCFunction)World_clearScriptLinks, METH_NOARGS,
|
||||
"() - Delete all scriptlinks from this world :)."},
|
||||
{NULL, NULL, 0, NULL}
|
||||
};
|
||||
|
||||
@ -160,7 +173,7 @@ static PyMethodDef BPy_World_methods[] = {
|
||||
/* and Object modules. */
|
||||
/*****************************************************************************/
|
||||
PyObject *World_Init (void);
|
||||
PyObject *World_CreatePyObject (World *cam);
|
||||
PyObject *World_CreatePyObject (World *world);
|
||||
World *World_FromPyObject (PyObject *pyobj);
|
||||
int World_CheckPyObject (PyObject *pyobj);
|
||||
|
||||
|
@ -23,16 +23,27 @@ Example::
|
||||
from Blender import Draw
|
||||
R = G = B = 0
|
||||
A = 1
|
||||
instructions = "Hold mouse buttons to change the background color."
|
||||
title = "Testing BGL + Draw"
|
||||
instructions = "Use mouse buttons or wheel to change the background color."
|
||||
quitting = " Press ESC or q to quit."
|
||||
len1 = Draw.GetStringWidth(title)
|
||||
len2 = Draw.GetStringWidth(instructions + quitting)
|
||||
#
|
||||
def show_win():
|
||||
glClearColor(R,G,B,A) # define color used to clear buffers
|
||||
glClear(GL_COLOR_BUFFER_BIT) # use it to clear the color buffer
|
||||
glColor3f(1,1,1) # change default color
|
||||
glColor3f(0.35,0.18,0.92) # define default color
|
||||
glBegin(GL_POLYGON) # begin a vertex data list
|
||||
glVertex2i(165, 158)
|
||||
glVertex2i(252, 55)
|
||||
glVertex2i(104, 128)
|
||||
glEnd()
|
||||
glColor3f(0.4,0.4,0.4) # change default color
|
||||
glRecti(40, 96, 60+len1, 113)
|
||||
glColor3f(1,1,1)
|
||||
glRasterPos2i(50,100) # move cursor to x = 50, y = 100
|
||||
Draw.Text("Testing BGL + Draw") # draw this text there
|
||||
glRasterPos2i(350,20) # move cursor again
|
||||
Draw.Text(title) # draw this text there
|
||||
glRasterPos2i(350,40) # move cursor again
|
||||
Draw.Text(instructions + quitting) # draw another msg
|
||||
glBegin(GL_LINE_LOOP) # begin a vertex-data list
|
||||
glVertex2i(46,92)
|
||||
@ -40,29 +51,29 @@ Example::
|
||||
glVertex2i(120,115)
|
||||
glVertex2i(46,115)
|
||||
glEnd() # close this list
|
||||
glColor3f(0.35,0.18,0.92) # change default color again
|
||||
glBegin(GL_POLYGON) # another list, for a polygon
|
||||
glVertex2i(315, 292)
|
||||
glVertex2i(412, 200)
|
||||
glVertex2i(264, 256)
|
||||
glEnd()
|
||||
Draw.Redraw(1) # make changes visible.
|
||||
#
|
||||
def ev(evt, val): # this is a callback for Draw.Register()
|
||||
def ev(evt, val): # event callback for Draw.Register()
|
||||
global R,G,B,A # ... it handles input events
|
||||
if evt == Draw.ESCKEY or evt == Draw.QKEY:
|
||||
Draw.Exit() # this quits the script
|
||||
elif not val: return
|
||||
elif evt == Draw.LEFTMOUSE: R = 1 - R
|
||||
elif evt == Draw.MIDDLEMOUSE: G = 1 - G
|
||||
elif evt == Draw.RIGHTMOUSE: B = 1 - B
|
||||
elif evt == Draw.WHEELUPMOUSE:
|
||||
R += 0.1
|
||||
if R > 1: R = 1
|
||||
elif evt == Draw.WHEELDOWNMOUSE:
|
||||
R -= 0.1
|
||||
if R < 0: R = 0
|
||||
else:
|
||||
Draw.Register(show_win, ev, None)
|
||||
return # don't redraw if nothing changed
|
||||
Draw.Redraw(1) # make changes visible.
|
||||
#
|
||||
Draw.Register(show_win, ev, None) # start the main loop
|
||||
Draw.Register(show_win, ev, None) # start the main loop
|
||||
|
||||
@see: U{www.opengl.org}
|
||||
@see: U{nehe.gamedev.net}
|
||||
|
||||
"""
|
||||
|
||||
def glAccum(op, value):
|
||||
|
@ -4,14 +4,14 @@
|
||||
# Doc system used: epydoc - http://epydoc.sf.net
|
||||
# command line:
|
||||
|
||||
# epydoc -o BPY_API_230 --url "http://www.blender.org" -t Blender.py \
|
||||
# epydoc -o BPY_API_23x --url "http://www.blender.org" -t Blender.py \
|
||||
# -n "Blender" --no-private --no-frames Blender.py \
|
||||
# Types.py Scene.py Object.py NMesh.py Material.py Camera.py Lamp.py \
|
||||
# Armature.py Metaball.py Effect.py Curve.py Ipo.py World.py BGL.py Window.py \
|
||||
# Draw.py Image.py Text.py Lattice.py Texture.py Registry.py Sys.py Mathutils.py
|
||||
|
||||
"""
|
||||
The main Blender module.
|
||||
The main Blender module (*).
|
||||
|
||||
The Blender Python API Reference
|
||||
================================
|
||||
@ -23,30 +23,32 @@ The Blender Python API Reference
|
||||
- L{Bone}
|
||||
- L{NLA}
|
||||
- L{BGL}
|
||||
- L{Camera}
|
||||
- L{Camera} (*)
|
||||
- L{Curve}
|
||||
- L{Draw}
|
||||
- L{Draw} (*)
|
||||
- L{Effect}
|
||||
- L{Image}
|
||||
- L{Image} (*)
|
||||
- L{Ipo}
|
||||
- L{Lamp}
|
||||
- L{Lamp} (*)
|
||||
- L{Lattice}
|
||||
- L{Library}
|
||||
- L{Material}
|
||||
- L{Material} (*)
|
||||
- L{Mathutils}
|
||||
- L{Metaball}
|
||||
- L{Metaball} (*)
|
||||
- L{NMesh}
|
||||
- L{Noise}
|
||||
- L{Object}
|
||||
- L{Object} (*)
|
||||
- L{Registry}
|
||||
- L{Scene}
|
||||
- L{Scene} (*)
|
||||
- L{Render}
|
||||
- L{Text}
|
||||
- L{Texture}
|
||||
- L{Types}
|
||||
- L{Window}
|
||||
- L{World}
|
||||
- L{sys<Sys>}
|
||||
- L{World} (*)
|
||||
- L{sys<Sys>} (*)
|
||||
|
||||
(*) - marks updated.
|
||||
|
||||
Introduction:
|
||||
-------------
|
||||
@ -104,29 +106,54 @@ def Redraw ():
|
||||
|
||||
def Load (filename = None):
|
||||
"""
|
||||
Load a Blender .blend file.
|
||||
Load a Blender .blend file or any of the other supported file formats.
|
||||
|
||||
Supported formats:
|
||||
- Blender's .blend;
|
||||
- DXF;
|
||||
- Open Inventor 1.0 ASCII;
|
||||
- Radiogour;
|
||||
- STL;
|
||||
- Videoscape;
|
||||
- VRML 1.0 asc.
|
||||
|
||||
@type filename: string
|
||||
@param filename: the pathname to the desired .blend file. If 'filename'
|
||||
@param filename: the pathname to the desired file. If 'filename'
|
||||
isn't given or if it contains the substring '.B.blend', the default
|
||||
.B.blend file is loaded.
|
||||
|
||||
@warn: loading a new .blend file removes the current data in Blender. For
|
||||
safety, this function saves the current data as an autosave file in
|
||||
the temporary dir used by Blender before loading the new file.
|
||||
the temporary dir used by Blender before loading a new Blender file.
|
||||
@warn: after a call to Load(blendfile), current data in Blender is lost,
|
||||
including the Python dictionaries. Any posterior references in the
|
||||
script to previously defined data will generate a NameError. So it's
|
||||
better to put Blender.Load as the last executed command in the script,
|
||||
when this function is used to open .blend files.
|
||||
"""
|
||||
|
||||
def Save (filename, overwrite = 0):
|
||||
"""
|
||||
Save a Blender .blend file with the current program data.
|
||||
Save a Blender .blend file with the current program data or export to
|
||||
one of the builtin file formats.
|
||||
|
||||
Supported formats:
|
||||
- Blender (.blend);
|
||||
- DXF (.dxf);
|
||||
- STL (.stl);
|
||||
- Videoscape (.obj);
|
||||
- VRML 1.0 (.wrl).
|
||||
|
||||
@type filename: string
|
||||
@param filename: the pathname for the desired .blend file. If it doesn't
|
||||
contain ".blend", this extension is automatically appended.
|
||||
@param filename: the filename for the file to be written. It must have one
|
||||
of the supported extensions or an error will be returned.
|
||||
@type overwrite: int (bool)
|
||||
@param overwrite: if non-zero, file 'filename' will be overwritten if it
|
||||
already exists. By default existing files are not overwritten (an error
|
||||
is returned).
|
||||
|
||||
@note: the substring ".B.blend" is not accepted inside 'filename'.
|
||||
@note: The substring ".B.blend" is not accepted inside 'filename'.
|
||||
@note: DXF, STL and Videoscape export only B{selected} meshes.
|
||||
"""
|
||||
|
||||
def Quit ():
|
||||
|
@ -3,6 +3,8 @@
|
||||
"""
|
||||
The Blender.Camera submodule.
|
||||
|
||||
B{New}: scriptLink methods: L{Camera.getScriptLinks}, ...
|
||||
|
||||
Camera Data
|
||||
===========
|
||||
|
||||
@ -178,3 +180,29 @@ class Camera:
|
||||
@type drawsize: float
|
||||
@param drawsize: The new draw size value.
|
||||
"""
|
||||
|
||||
def getScriptLinks (event):
|
||||
"""
|
||||
Get a list with this Camera's script links of type 'event'.
|
||||
@type event: string
|
||||
@param event: "FrameChanged" or "Redraw".
|
||||
@rtype: list
|
||||
@return: a list with Blender L{Text} names (the script links of the given
|
||||
'event' type) or None if there are no script links at all.
|
||||
"""
|
||||
|
||||
def clearScriptLinks ():
|
||||
"""
|
||||
Delete all this Camera's script links.
|
||||
@rtype: bool
|
||||
@return: 0 if some internal problem occurred or 1 if successful.
|
||||
"""
|
||||
|
||||
def addScriptLink (text, event):
|
||||
"""
|
||||
Add a new script link to this Camera.
|
||||
@type text: string
|
||||
@param text: the name of an existing Blender L{Text}.
|
||||
@type event: string
|
||||
@param event: "FrameChanged" or "Redraw".
|
||||
"""
|
||||
|
@ -6,7 +6,7 @@ The Blender.Draw submodule.
|
||||
Draw
|
||||
====
|
||||
|
||||
B{New}: L{PupIntInput}, L{PupFloatInput}, L{PupStrInput}.
|
||||
B{New}: L{PupIntInput}, L{PupFloatInput}, L{PupStrInput}, mouse wheel events.
|
||||
|
||||
This module provides access to a B{windowing interface} in Blender. Its widgets
|
||||
include many kinds of buttons: push, toggle, menu, number, string, slider,
|
||||
|
@ -6,6 +6,8 @@ The Blender.Image submodule.
|
||||
Image
|
||||
=====
|
||||
|
||||
B{New}: L{Image.reload}.
|
||||
|
||||
This module provides access to B{Image} objects in Blender.
|
||||
|
||||
Example::
|
||||
|
@ -3,6 +3,8 @@
|
||||
"""
|
||||
The Blender.Lamp submodule.
|
||||
|
||||
B{New}: scriptLink methods: L{Lamp.getScriptLinks}, ...
|
||||
|
||||
Lamp Data
|
||||
=========
|
||||
|
||||
@ -320,3 +322,29 @@ class Lamp:
|
||||
@param quad2: The new quad 2 value.
|
||||
@warning: this only applies to Lamps with the 'Quad' flag on.
|
||||
"""
|
||||
|
||||
def getScriptLinks (event):
|
||||
"""
|
||||
Get a list with this Lamp's script links of type 'event'.
|
||||
@type event: string
|
||||
@param event: "FrameChanged" or "Redraw".
|
||||
@rtype: list
|
||||
@return: a list with Blender L{Text} names (the script links of the given
|
||||
'event' type) or None if there are no script links at all.
|
||||
"""
|
||||
|
||||
def clearScriptLinks ():
|
||||
"""
|
||||
Delete all this Lamp's script links.
|
||||
@rtype: bool
|
||||
@return: 0 if some internal problem occurred or 1 if successful.
|
||||
"""
|
||||
|
||||
def addScriptLink (text, event):
|
||||
"""
|
||||
Add a new script link to this Lamp.
|
||||
@type text: string
|
||||
@param text: the name of an existing Blender L{Text}.
|
||||
@type event: string
|
||||
@param event: "FrameChanged" or "Redraw".
|
||||
"""
|
||||
|
@ -39,18 +39,6 @@ def Rand (high = 1, low = 0):
|
||||
@param low: The lower range.
|
||||
"""
|
||||
|
||||
def Vector (list = None):
|
||||
"""
|
||||
Create a new Vector object from a list.
|
||||
@type list: PyList of float or int
|
||||
@param list: The list of values for the Vector object.
|
||||
Must be 2, 3, or 4 values.
|
||||
@rtype: Vector object.
|
||||
@return: It depends wheter a parameter was passed:
|
||||
- (list): Vector object initialized with the given values;
|
||||
- (): An empty 3 dimensional vector.
|
||||
"""
|
||||
|
||||
def CopyVec(vector):
|
||||
"""
|
||||
Create a copy of the Vector object.
|
||||
@ -128,23 +116,6 @@ def ProjectVecs(vec1, vec2):
|
||||
@return: The parallel projection vector.
|
||||
"""
|
||||
|
||||
def Matrix(list1 = None, list2 = None, list3 = None, list4 = None):
|
||||
"""
|
||||
Create a new matrix object from intialized values.
|
||||
@type list1: PyList of int/float
|
||||
@param list1: A 2d,3d or 4d list.
|
||||
@type list2: PyList of int/float
|
||||
@param list2: A 2d,3d or 4d list.
|
||||
@type list3: PyList of int/float
|
||||
@param list3: A 2d,3d or 4d list.
|
||||
@type list4: PyList of int/float
|
||||
@param list4: A 2d,3d or 4d list.
|
||||
@rtype: New matrix object.
|
||||
@return: It depends wheter a parameter was passed:
|
||||
- (list1, etc.): Matrix object initialized with the given values;
|
||||
- (): An empty 3 dimensional matrix.
|
||||
"""
|
||||
|
||||
def RotationMatrix(angle, matSize, axisFlag, axis):
|
||||
"""
|
||||
Create a matrix representing a rotation.
|
||||
@ -248,21 +219,6 @@ def MatMultVec(mat, vec):
|
||||
@return: The column vector that results from the muliplication.
|
||||
"""
|
||||
|
||||
def Quaternion(list = None, angle = None):
|
||||
"""
|
||||
Create a new matrix object from intialized values.
|
||||
@type list: PyList of int/float
|
||||
@param list: A 3d or 4d list to intialize quaternion.
|
||||
4d if intializing, 3d if will be used as an axis of rotation.
|
||||
@type angle: float (optional)
|
||||
@param angle: An arbitrary rotation amount around 'list'.
|
||||
List is used as an axis of rotation in this case.
|
||||
@rtype: New quaternion object.
|
||||
@return: It depends wheter a parameter was passed:
|
||||
- (list/angle): Quaternion object initialized with the given values;
|
||||
- (): An identity 4 dimensional quaternion.
|
||||
"""
|
||||
|
||||
def CopyQuat(quaternion):
|
||||
"""
|
||||
Create a copy of the Quaternion object.
|
||||
@ -320,16 +276,6 @@ def Slerp(quat1, quat2, factor):
|
||||
@return: The interpolated rotation.
|
||||
"""
|
||||
|
||||
def Euler(list = None):
|
||||
"""
|
||||
Create a new euler object.
|
||||
@type list: PyList of float/int
|
||||
@param list: 3d list to initalize euler
|
||||
@rtype: Euler object
|
||||
@return: Euler representing heading, pitch, bank.
|
||||
Values are in degrees.
|
||||
"""
|
||||
|
||||
def CopyEuler(euler):
|
||||
"""
|
||||
Create a new euler object.
|
||||
@ -365,6 +311,21 @@ class Vector:
|
||||
@cvar length: The magnitude of the vector.
|
||||
"""
|
||||
|
||||
def __init__(list = None):
|
||||
"""
|
||||
Create a new Vector object from a list.
|
||||
|
||||
Example::
|
||||
v = Blender.Mathutils.Vector([1,0,0])
|
||||
@type list: PyList of float or int
|
||||
@param list: The list of values for the Vector object.
|
||||
Must be 2, 3, or 4 values.
|
||||
@rtype: Vector object.
|
||||
@return: It depends wheter a parameter was passed:
|
||||
- (list): Vector object initialized with the given values;
|
||||
- (): An empty 3 dimensional vector.
|
||||
"""
|
||||
|
||||
def zero():
|
||||
"""
|
||||
Set all values to zero.
|
||||
@ -405,6 +366,19 @@ class Euler:
|
||||
@cvar z: The roll value in degrees.
|
||||
"""
|
||||
|
||||
def __init__(list = None):
|
||||
"""
|
||||
Create a new euler object.
|
||||
|
||||
Example::
|
||||
euler = Euler([45,0,0])
|
||||
@type list: PyList of float/int
|
||||
@param list: 3d list to initialize euler
|
||||
@rtype: Euler object
|
||||
@return: Euler representing heading, pitch, bank.
|
||||
@note: Values are in degrees.
|
||||
"""
|
||||
|
||||
def zero():
|
||||
"""
|
||||
Set all values to zero.
|
||||
@ -446,6 +420,25 @@ class Quaternion:
|
||||
in degrees.
|
||||
"""
|
||||
|
||||
def __init__(list = None, angle = None):
|
||||
"""
|
||||
Create a new quaternion object from initialized values.
|
||||
|
||||
Example::
|
||||
quat = Mathutils.Quaternion()
|
||||
|
||||
@type list: PyList of int/float
|
||||
@param list: A 3d or 4d list to initialize quaternion.
|
||||
4d if intializing, 3d if will be used as an axis of rotation.
|
||||
@type angle: float (optional)
|
||||
@param angle: An arbitrary rotation amount around 'list'.
|
||||
List is used as an axis of rotation in this case.
|
||||
@rtype: New quaternion object.
|
||||
@return: It depends wheter a parameter was passed:
|
||||
- (list/angle): Quaternion object initialized with the given values;
|
||||
- (): An identity 4 dimensional quaternion.
|
||||
"""
|
||||
|
||||
def identity():
|
||||
"""
|
||||
Set the quaternion to the identity quaternion.
|
||||
@ -496,6 +489,27 @@ class Matrix:
|
||||
@cvar colsize: The column size of the matrix.
|
||||
"""
|
||||
|
||||
def __init__(list1 = None, list2 = None, list3 = None, list4 = None):
|
||||
"""
|
||||
Create a new matrix object from initialized values.
|
||||
|
||||
Example::
|
||||
matrix = Mathutils.Matrix([1,1,1],[0,1,0],[1,0,0])
|
||||
|
||||
@type list1: PyList of int/float
|
||||
@param list1: A 2d,3d or 4d list.
|
||||
@type list2: PyList of int/float
|
||||
@param list2: A 2d,3d or 4d list.
|
||||
@type list3: PyList of int/float
|
||||
@param list3: A 2d,3d or 4d list.
|
||||
@type list4: PyList of int/float
|
||||
@param list4: A 2d,3d or 4d list.
|
||||
@rtype: New matrix object.
|
||||
@return: It depends wheter a parameter was passed:
|
||||
- (list1, etc.): Matrix object initialized with the given values;
|
||||
- (): An empty 3 dimensional matrix.
|
||||
"""
|
||||
|
||||
def zero():
|
||||
"""
|
||||
Set all matrix values to 0.
|
||||
|
@ -3,7 +3,12 @@
|
||||
"""
|
||||
The Blender.Object submodule
|
||||
|
||||
This module provides access to the B{Object Data} in Blender.
|
||||
B{New}: L{Object.makeTrack}, scriptLink methods: L{Object.getScriptLinks}, ...
|
||||
|
||||
Object
|
||||
======
|
||||
|
||||
This module provides access to the B{Objects} in Blender.
|
||||
|
||||
Example::
|
||||
|
||||
@ -522,3 +527,53 @@ class Object:
|
||||
are not displayed correctly, try this method function. But if the script
|
||||
works properly without it, there's no reason to use it.
|
||||
"""
|
||||
|
||||
def getScriptLinks (event):
|
||||
"""
|
||||
Get a list with this Object's script links of type 'event'.
|
||||
@type event: string
|
||||
@param event: "FrameChanged" or "Redraw".
|
||||
@rtype: list
|
||||
@return: a list with Blender L{Text} names (the script links of the given
|
||||
'event' type) or None if there are no script links at all.
|
||||
"""
|
||||
|
||||
def clearScriptLinks ():
|
||||
"""
|
||||
Delete all this Object's script links.
|
||||
@rtype: bool
|
||||
@return: 0 if some internal problem occurred or 1 if successful.
|
||||
"""
|
||||
|
||||
def addScriptLink (text, event):
|
||||
"""
|
||||
Add a new script link to this Object.
|
||||
@type text: string
|
||||
@param text: the name of an existing Blender L{Text}.
|
||||
@type event: string
|
||||
@param event: "FrameChanged" or "Redraw".
|
||||
"""
|
||||
|
||||
def makeTrack (tracked, fast = 0):
|
||||
"""
|
||||
Make this Object track another.
|
||||
@type tracked: Blender Object
|
||||
@param tracked: the object to be tracked.
|
||||
@type fast: int (bool)
|
||||
@param fast: if zero, the scene hierarchy is updated automatically. If
|
||||
you set 'fast' to a nonzero value, don't forget to update the scene
|
||||
yourself (see L{Scene.Scene.update}).
|
||||
@note: you also need to clear the rotation (L{setEuler}) of this object
|
||||
if it was not (0,0,0) already.
|
||||
"""
|
||||
|
||||
def clearTrack (mode = 0, fast = 0):
|
||||
"""
|
||||
Make this Object not track another anymore.
|
||||
@type mode: int (bool)
|
||||
@param mode: if nonzero the matrix transformation used for tracking is kept.
|
||||
@type fast: int (bool)
|
||||
@param fast: if zero, the scene hierarchy is updated automatically. If
|
||||
you set 'fast' to a nonzero value, don't forget to update the scene
|
||||
yourself (see L{Scene.Scene.update}).
|
||||
"""
|
||||
|
@ -3,7 +3,7 @@
|
||||
"""
|
||||
The Blender.Scene submodule.
|
||||
|
||||
B{New}: scriptLink methods: L{Scene.getScriptLinks}, ...
|
||||
B{New}: L{Scene.play}, scriptLink methods: L{Scene.getScriptLinks}, ...
|
||||
|
||||
Scene
|
||||
=====
|
||||
@ -219,3 +219,24 @@ class Scene:
|
||||
@type event: string
|
||||
@param event: "FrameChanged", "OnLoad" or "Redraw".
|
||||
"""
|
||||
|
||||
def play (mode = 0, win = '<VIEW3D>'):
|
||||
"""
|
||||
Play a realtime animation. This is the "Play Back Animation" function in
|
||||
Blender, different from playing a sequence of rendered images (for that
|
||||
check L{Render.RenderData.play}).
|
||||
@type mode: int
|
||||
@param mode: controls playing:
|
||||
- 0: keep playing in the biggest 'win' window;
|
||||
- 1: keep playing in all 'win', VIEW3D and SEQ windows;
|
||||
- 2: play once in the biggest VIEW3D;
|
||||
- 3: play once in all 'win', VIEW3D and SEQ windows.
|
||||
@type win: int
|
||||
@param win: window type, see L{Window.Types}. Only some of them are
|
||||
meaningful here: VIEW3D, SEQ, IPO, ACTION, NLA, SOUND. But the others
|
||||
are also accepted, since this function can be used simply as an
|
||||
interruptible timer. If 'win' is not visible or invalid, VIEW3D is
|
||||
tried, then any bigger visible window.
|
||||
@rtype: bool
|
||||
@return: 0 on normal exit or 1 when play back is canceled by user input.
|
||||
"""
|
||||
|
@ -114,14 +114,18 @@ def makename (path = "Blender.Get('filename')", ext = "", strip = 0):
|
||||
def exists(path):
|
||||
"""
|
||||
Tell if the given pathname (file or dir) exists.
|
||||
@rtype: bool
|
||||
@return: 1 if 'path' exists, 0 otherwise.
|
||||
@rtype: int
|
||||
@return:
|
||||
- 0: path does not exist;
|
||||
- 1: path is an existing filename;
|
||||
- 2: path is an existing dirname;
|
||||
- -1: path exists but is neither a regular file nor a dir.
|
||||
"""
|
||||
|
||||
def time ():
|
||||
"""
|
||||
Get the current time in seconds since a fixed value. Successive calls to
|
||||
this function are garanteed to return values greater than the previous call.
|
||||
this function are guaranteed to return values greater than the previous call.
|
||||
@rtype: float
|
||||
@return: the elapsed time in seconds.
|
||||
"""
|
||||
|
@ -55,19 +55,20 @@ DrawProgressBar::
|
||||
|
||||
@type Types: readonly dictionary
|
||||
@var Types: The available Window Types.
|
||||
- VIEW3D
|
||||
- IPO
|
||||
- OOPS
|
||||
- ACTION
|
||||
- BUTS
|
||||
- FILE
|
||||
- IMAGE
|
||||
- INFO
|
||||
- SEQ
|
||||
- IMASEL
|
||||
- SOUND
|
||||
- ACTION
|
||||
- TEXT
|
||||
- INFO
|
||||
- IPO
|
||||
- NLA
|
||||
- OOPS
|
||||
- SCRIPT
|
||||
- SEQ
|
||||
- SOUND
|
||||
- TEXT
|
||||
- VIEW3D
|
||||
"""
|
||||
|
||||
def Redraw ():
|
||||
|
@ -3,7 +3,10 @@
|
||||
"""
|
||||
The Blender.World submodule
|
||||
|
||||
B{New}: scriptLink methods: L{World.getScriptLinks}, ...
|
||||
|
||||
INTRODUCTION
|
||||
============
|
||||
|
||||
The module world allows you to access all the data of a Blender World.
|
||||
|
||||
@ -80,7 +83,7 @@ class World:
|
||||
|
||||
def getName():
|
||||
"""
|
||||
Retreives the name of an world object
|
||||
Retrieves the name of an world object
|
||||
@rtype: string
|
||||
@return: the name of the world object.
|
||||
"""
|
||||
@ -116,7 +119,7 @@ class World:
|
||||
|
||||
def getSkytype():
|
||||
"""
|
||||
Retreives the skytype of a world object.
|
||||
Retrieves the skytype of a world object.
|
||||
The skytype is a combination of 3 bits : Bit 0 : Blend; Bit 1 : Real; Bit 2 : paper.
|
||||
@rtype: int
|
||||
@return: the skytype of the world object.
|
||||
@ -135,7 +138,7 @@ class World:
|
||||
|
||||
def getMode():
|
||||
"""
|
||||
Retreives the mode of a world object.
|
||||
Retrieves the mode of a world object.
|
||||
The mode is a combination of 3 bits : Bit 0 : Blend; Bit 1 : Real; Bit 2 : paper.
|
||||
@rtype: int
|
||||
@return: the mode of the world object.
|
||||
@ -154,7 +157,7 @@ class World:
|
||||
|
||||
def getMistype():
|
||||
"""
|
||||
Retreives the mist type of a world object.
|
||||
Retrieves the mist type of a world object.
|
||||
The mist type is an integer 0 : quadratic; 1 : linear; 2 : square.
|
||||
@rtype: int
|
||||
@return: the mistype of the world object.
|
||||
@ -173,7 +176,7 @@ class World:
|
||||
|
||||
def getHor():
|
||||
"""
|
||||
Retreives the horizon color of a world object.
|
||||
Retrieves the horizon color of a world object.
|
||||
This color is a list of 3 floats.
|
||||
@rtype: list of three floats
|
||||
@return: the horizon color of the world object.
|
||||
@ -191,7 +194,7 @@ class World:
|
||||
|
||||
def getZen():
|
||||
"""
|
||||
Retreives the zenith color of a world object.
|
||||
Retrieves the zenith color of a world object.
|
||||
This color is a list of 3 floats.
|
||||
@rtype: list of three floats
|
||||
@return: the zenith color of the world object.
|
||||
@ -209,7 +212,7 @@ class World:
|
||||
|
||||
def getAmb():
|
||||
"""
|
||||
Retreives the ambient color of a world object.
|
||||
Retrieves the ambient color of a world object.
|
||||
This color is a list of 3 floats.
|
||||
@rtype: list of three floats
|
||||
@return: the ambient color of the world object.
|
||||
@ -227,7 +230,7 @@ class World:
|
||||
|
||||
def getStar():
|
||||
"""
|
||||
Retreives the star parameters of a world object.
|
||||
Retrieves the star parameters of a world object.
|
||||
It is a list of nine floats :
|
||||
red component of the color
|
||||
green component of the color
|
||||
@ -253,7 +256,7 @@ class World:
|
||||
|
||||
def getMist():
|
||||
"""
|
||||
Retreives the mist parameters of a world object.
|
||||
Retrieves the mist parameters of a world object.
|
||||
It is a list of four floats :
|
||||
intensity of the mist
|
||||
start of the mist
|
||||
@ -273,3 +276,29 @@ class World:
|
||||
@rtype: PyNone
|
||||
@return: PyNone
|
||||
"""
|
||||
|
||||
def getScriptLinks (event):
|
||||
"""
|
||||
Get a list with this World's script links of type 'event'.
|
||||
@type event: string
|
||||
@param event: "FrameChanged" or "Redraw".
|
||||
@rtype: list
|
||||
@return: a list with Blender L{Text} names (the script links of the given
|
||||
'event' type) or None if there are no script links at all.
|
||||
"""
|
||||
|
||||
def clearScriptLinks ():
|
||||
"""
|
||||
Delete all this World's script links!
|
||||
@rtype: bool
|
||||
@return: 0 if some internal problem occurred or 1 if successful.
|
||||
"""
|
||||
|
||||
def addScriptLink (text, event):
|
||||
"""
|
||||
Add a new script link to this World.
|
||||
@type text: string
|
||||
@param text: the name of an existing Blender L{Text}.
|
||||
@type event: string
|
||||
@param event: "FrameChanged" or "Redraw".
|
||||
"""
|
||||
|
@ -951,21 +951,27 @@ void run_python_script(SpaceText *st)
|
||||
{
|
||||
char *py_filename;
|
||||
Text *text=st->text;
|
||||
|
||||
if (!BPY_txt_do_python(st)) {
|
||||
int lineno = BPY_Err_getLinenumber();
|
||||
// jump to error if happened in current text:
|
||||
py_filename = (char*) BPY_Err_getFilename();
|
||||
|
||||
/* st->text can become NULL: user called Blender.Load(blendfile)
|
||||
* before the end of the script. */
|
||||
if (!st->text) return;
|
||||
|
||||
if (!strcmp(py_filename, st->text->id.name+2)) {
|
||||
error("Python script error, check console");
|
||||
if (lineno >= 0) {
|
||||
txt_move_toline(text, lineno-1, 0);
|
||||
txt_sel_line(text);
|
||||
pop_space_text(st);
|
||||
if (lineno >= 0) {
|
||||
txt_move_toline(text, lineno-1, 0);
|
||||
txt_sel_line(text);
|
||||
pop_space_text(st);
|
||||
}
|
||||
} else {
|
||||
error("Error in other (possibly external) file, "\
|
||||
"check console");
|
||||
}
|
||||
} else {
|
||||
error("Error in other (possibly external) file, "\
|
||||
"check console");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2428,7 +2428,7 @@ void inner_play_anim_loop(int init, int mode)
|
||||
if(sa==oldsa) {
|
||||
scrarea_do_windraw(sa);
|
||||
}
|
||||
else if(curmode) {
|
||||
else if(curmode & 1) { /* catch modes 1 and 3 */
|
||||
if ELEM(sa->spacetype, SPACE_VIEW3D, SPACE_SEQ) {
|
||||
scrarea_do_windraw(sa);
|
||||
}
|
||||
@ -2453,6 +2453,11 @@ void inner_play_anim_loop(int init, int mode)
|
||||
}
|
||||
}
|
||||
|
||||
/* play_anim: 'mode' defines where to play and if repeat is on:
|
||||
* - 0: current area
|
||||
* - 1: all view3d and seq areas
|
||||
* - 2: current area, no replay
|
||||
* - 3: all view3d and seq areas, no replay */
|
||||
int play_anim(int mode)
|
||||
{
|
||||
ScrArea *sa, *oldsa;
|
||||
@ -2507,7 +2512,7 @@ int play_anim(int mode)
|
||||
}
|
||||
if(event==ESCKEY || event==SPACEKEY) break;
|
||||
|
||||
if(mode==2 && CFRA==EFRA) break;
|
||||
if((mode > 1) && CFRA==EFRA) break; /* no replay */
|
||||
}
|
||||
|
||||
if(event==SPACEKEY);
|
||||
|
@ -182,7 +182,7 @@ static void print_help(void)
|
||||
printf (" -noaudio\tDisable audio on systems that support audio\n");
|
||||
printf (" -h\t\tPrint this help text\n");
|
||||
printf (" -y\t\tDisable OnLoad scene scripts, use -Y to find out why its -y\n");
|
||||
printf (" -P <filename>\tRun the given Python script\n");
|
||||
printf (" -P <filename>\tRun the given Python script (filename or Blender Text)\n");
|
||||
#ifdef WIN32
|
||||
printf (" -R\t\tRegister .blend extension\n");
|
||||
#endif
|
||||
@ -424,16 +424,6 @@ int main(int argc, char **argv)
|
||||
|
||||
BIF_init();
|
||||
|
||||
/**
|
||||
* NOTE: the U.pythondir string is NULL until BIF_init() is executed,
|
||||
* so we provide the BPY_ function below to append the user defined
|
||||
* pythondir to Python's sys.path at this point. Simply putting
|
||||
* BIF_init() before BPY_start_python() crashes Blender at startup.
|
||||
* Update: now this function also inits the bpymenus, which also depend
|
||||
* on U.pythondir.
|
||||
*/
|
||||
|
||||
BPY_post_start_python();
|
||||
}
|
||||
else {
|
||||
BPY_start_python();
|
||||
@ -445,6 +435,16 @@ int main(int argc, char **argv)
|
||||
// if (G.f & G_DEBUG) printf("setting audio to: %d\n", audio);
|
||||
}
|
||||
|
||||
/**
|
||||
* NOTE: the U.pythondir string is NULL until BIF_init() is executed,
|
||||
* so we provide the BPY_ function below to append the user defined
|
||||
* pythondir to Python's sys.path at this point. Simply putting
|
||||
* BIF_init() before BPY_start_python() crashes Blender at startup.
|
||||
* Update: now this function also inits the bpymenus, which also depend
|
||||
* on U.pythondir.
|
||||
*/
|
||||
BPY_post_start_python();
|
||||
|
||||
RE_init_filt_mask();
|
||||
|
||||
#ifdef WITH_QUICKTIME
|
||||
|
Loading…
Reference in New Issue
Block a user