389 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			389 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
# Blender.Scene module and the Scene PyType object
 | 
						|
 | 
						|
"""
 | 
						|
The Blender.Scene submodule.
 | 
						|
 | 
						|
B{New}:
 | 
						|
	- L{Scene.clearScriptLinks<Scene.Scene.clearScriptLinks>} accepts a parameter now.
 | 
						|
	- acess methods L{Scene.getLayers<Scene.Scene.getLayers>}, L{Scene.setLayers<Scene.Scene.setLayers>} via lists to complement the layers and
 | 
						|
		Layers Scene attributes which use bitmasks. 
 | 
						|
 | 
						|
Scene
 | 
						|
=====
 | 
						|
 | 
						|
This module provides access to B{Scenes} in Blender.
 | 
						|
 | 
						|
Example::
 | 
						|
	import Blender
 | 
						|
	from Blender import Scene, Object, Camera
 | 
						|
	#
 | 
						|
	camdata = Camera.New('persp')           # create new camera data
 | 
						|
	camdata.name = 'newCam'
 | 
						|
	camdata.lens = 16.0
 | 
						|
	scene = Scene.New('NewScene')           # create a new scene
 | 
						|
	scene.objects.new(camdata,'Camera')     # add a new object to the scene with newly-created data
 | 
						|
	scene.makeCurrent()                     # make this the current scene
 | 
						|
 | 
						|
@warn: B{scene.objects.new} is the preferred way to add new objects to a scene.
 | 
						|
	The older way is to create an object with B{Object.New()}, link the
 | 
						|
	data to the new object, then link the object to the scene.  This way is
 | 
						|
	not recommended since a forgotten step or run-time error in the script can 
 | 
						|
	cause bad things to be done to Blender's database.
 | 
						|
 | 
						|
	If you use this older method, it's recommended to always perform the
 | 
						|
	operations in this order.  This is because if
 | 
						|
	there is no object data linked to an object B{ob}, B{scene.link(ob)} will
 | 
						|
	automatically create the missing data.  This is OK on its own, but I{if
 | 
						|
	after that} object B{ob} is linked to obdata, the automatically created one
 | 
						|
	will be discarded -- as expected -- but will stay in Blender's memory
 | 
						|
	space until the program is exited, since Blender doesn't really get rid of
 | 
						|
	most kinds of data.  So first linking ObData to object, then object to
 | 
						|
	scene is a tiny tiny bit faster than the other way around and also saves
 | 
						|
	some realtime memory (if many objects are created from scripts, the
 | 
						|
	savings become important).
 | 
						|
"""
 | 
						|
 | 
						|
def New (name = 'Scene'):
 | 
						|
	"""
 | 
						|
	Create a new Scene in Blender.
 | 
						|
	@type name: string
 | 
						|
	@param name: The Scene name.
 | 
						|
	@rtype: Blender Scene
 | 
						|
	@return: The created Scene.
 | 
						|
	"""
 | 
						|
 | 
						|
def Get (name = None):
 | 
						|
	"""
 | 
						|
	Get the Scene(s) from Blender.
 | 
						|
	@type name: string
 | 
						|
	@param name: The name of a Scene.
 | 
						|
	@rtype: Blender Scene or a list of Blender Scenes
 | 
						|
	@return: It depends on the I{name} parameter:
 | 
						|
			- (name): The Scene with the given I{name};
 | 
						|
			- ():     A list with all Scenes currently in Blender.
 | 
						|
	"""
 | 
						|
 | 
						|
def GetCurrent():
 | 
						|
	"""
 | 
						|
	Get the currently active Scene in Blender.
 | 
						|
	@rtype: Blender Scene
 | 
						|
	@return: The currently active Scene.
 | 
						|
	"""
 | 
						|
 | 
						|
def Unlink(scene):
 | 
						|
	"""
 | 
						|
	Unlink (delete) a Scene from Blender.
 | 
						|
	@type scene: Blender Scene
 | 
						|
	@param scene: The Scene to be unlinked.
 | 
						|
	"""
 | 
						|
	
 | 
						|
from IDProp import IDGroup, IDArray
 | 
						|
class Scene:
 | 
						|
	"""
 | 
						|
	The Scene object
 | 
						|
	================
 | 
						|
		This object gives access to Scene data in Blender.
 | 
						|
	@type Layers: integer (bitmask)
 | 
						|
	@ivar Layers: The Scene layers (check also the easier to use
 | 
						|
		L{layers}).  This value is a bitmask with at least
 | 
						|
		one position set for the 20 possible layers starting from the low order
 | 
						|
		bit.  The easiest way to deal with these values in in hexadecimal 
 | 
						|
		notation.
 | 
						|
		Example::
 | 
						|
			scene.Layers = 0x04 # sets layer 3 ( bit pattern 0100 )
 | 
						|
			scene.Layers |= 0x01
 | 
						|
			print scene.Layers # will print: 5 ( meaning bit pattern 0101)
 | 
						|
		After setting the Layers value, the interface (at least the 3d View and
 | 
						|
		the Buttons window) needs to be redrawn to show the changes.
 | 
						|
	@type layers: list of integers
 | 
						|
	@ivar layers: The Scene layers (check also L{Layers}).
 | 
						|
		This attribute accepts and returns a list of integer values in the
 | 
						|
		range [1, 20].
 | 
						|
		Example::
 | 
						|
			scene.layers = [3] # set layer 3
 | 
						|
			scene.layers = scene.layers.append(1)
 | 
						|
			print scene.layers # will print: [1, 3]
 | 
						|
	@type objects: sequence of objects
 | 
						|
	@ivar objects: The scene's objects. The sequence supports the methods .link(ob), .unlink(ob), and .new(obdata), and can be iterated over.
 | 
						|
	@type cursor: Vector (wrapped)
 | 
						|
	@ivar cursor: the 3d cursor location for this scene.
 | 
						|
	@type world: World or None
 | 
						|
	@ivar world: The world that this scene uses (if any)
 | 
						|
	@type timeline: Timeline
 | 
						|
	@ivar timeline: The L{timeline<TimeLine.TimeLine>} for this scene, named markers are stored here. (read only)
 | 
						|
	@type render: RenderData
 | 
						|
	@ivar render: The scenes L{render<Render>} settings. (read only)
 | 
						|
	@type radiosity: RenderData
 | 
						|
	@ivar radiosity: The scenes L{radiosity<Radio>} settings. (read only)
 | 
						|
	"""
 | 
						|
 | 
						|
	def getName():
 | 
						|
		"""
 | 
						|
		Get the name of this Scene.
 | 
						|
		@rtype: string
 | 
						|
		"""
 | 
						|
 | 
						|
	def setName(name):
 | 
						|
		"""
 | 
						|
		Set the name of this Scene.
 | 
						|
		@type name: string
 | 
						|
		@param name: The new name.
 | 
						|
		"""
 | 
						|
 | 
						|
	def getLayers():
 | 
						|
		"""
 | 
						|
		Get the layers set for this Scene.
 | 
						|
		@rtype: list of integers
 | 
						|
		@return: a list where each number means the layer with that number is set.
 | 
						|
		"""
 | 
						|
 | 
						|
	def setLayers(layers):
 | 
						|
		"""
 | 
						|
		Set the visible layers for this scene.
 | 
						|
		@type layers: list of integers
 | 
						|
		@param layers: a list of integers in the range [1, 20], where each available
 | 
						|
			index makes the layer with that number visible.
 | 
						|
		@note: if this Scene is the current one, the 3D View layers are also
 | 
						|
			updated, but the screen needs to be redrawn (at least 3D Views and
 | 
						|
			Buttons windows) for the changes to be seen.
 | 
						|
		"""
 | 
						|
 | 
						|
	def copy(duplicate_objects = 1):
 | 
						|
		"""
 | 
						|
		Make a copy of this Scene.
 | 
						|
		@type duplicate_objects: int
 | 
						|
		@param duplicate_objects: Defines how the Scene children are duplicated:
 | 
						|
				- 0: Link Objects;
 | 
						|
				- 1: Link Object Data;
 | 
						|
				- 2: Full copy.
 | 
						|
		@rtype: Scene
 | 
						|
		@return: The copied Blender Scene.
 | 
						|
		"""
 | 
						|
 | 
						|
	def makeCurrent():
 | 
						|
		"""
 | 
						|
		Make this Scene the currently active one in Blender.
 | 
						|
		"""
 | 
						|
 | 
						|
	def update(full = 0):
 | 
						|
		"""
 | 
						|
		Update this Scene in Blender.
 | 
						|
		@type full: int
 | 
						|
		@param full: A bool to control the level of updating:
 | 
						|
				- 0: sort the base list of objects.
 | 
						|
				- 1: sort and also regroup, do ipos, keys, script links, etc.
 | 
						|
		@warn: When in doubt, try with I{full = 0} first, since it is faster.
 | 
						|
				The "full" update is a recent addition to this method.
 | 
						|
		"""
 | 
						|
 | 
						|
	def getRenderingContext():
 | 
						|
		"""
 | 
						|
		Get the rendering context for this scene, see L{Render}.
 | 
						|
		@rtype: RenderData
 | 
						|
		@return: the render data object for this scene.
 | 
						|
		"""
 | 
						|
 | 
						|
	def getRadiosityContext():
 | 
						|
		"""
 | 
						|
		Get the radiosity context for this scene, see L{Radio}.
 | 
						|
		@rtype: Blender Radiosity
 | 
						|
		@return: the radiosity object for this scene.
 | 
						|
		@note: only the current scene can return a radiosity context.
 | 
						|
		"""
 | 
						|
 | 
						|
	def getChildren():
 | 
						|
		"""
 | 
						|
		Get all objects linked to this Scene. (B{deprecated}).  B{Note}: new scripts
 | 
						|
		should use the L{objects} attribute instead. In cases where a list is
 | 
						|
		required use list(scn.objects).
 | 
						|
		@rtype: list of Blender Objects
 | 
						|
		@return: A list with all Blender Objects linked to this Scene.
 | 
						|
		@note: L{Object.Get} will return all objects currently in Blender, which
 | 
						|
			means all objects from all available scenes.  In most cases (exporter
 | 
						|
			scripts, for example), it's probably better to use this
 | 
						|
			scene.GetChildren instead, since it will only access objects from this
 | 
						|
			particular scene.
 | 
						|
		@warn: Depricated! use scene.objects instead.
 | 
						|
		"""
 | 
						|
 | 
						|
	def getActiveObject():
 | 
						|
		"""
 | 
						|
		Get this scene's active object.
 | 
						|
		@note: the active object, if selected, can also be retrieved with
 | 
						|
			L{Object.GetSelected} -- it is the first item in the returned
 | 
						|
			list.  But even when no object is selected in Blender, there can be
 | 
						|
			an active one (if the user enters editmode, for example, this is the
 | 
						|
			object that should become available for edition).  So what makes this
 | 
						|
			scene method different from C{Object.GetSelected()[0]} is that it can
 | 
						|
			return the active object even when no objects are selected.
 | 
						|
		@rtype: Blender Object or None
 | 
						|
		@return: the active object or None if not available.
 | 
						|
		@warn: Depricated! use scene.objects.active instead.
 | 
						|
		"""
 | 
						|
 | 
						|
	def getCurrentCamera():
 | 
						|
		"""
 | 
						|
		Get the currently active Camera for this Scene.
 | 
						|
		@note: The active camera can be any object type, not just a camera object.
 | 
						|
		@rtype: Blender Object
 | 
						|
		@return: The currently active Camera object.
 | 
						|
		"""
 | 
						|
 | 
						|
	def setCurrentCamera(camera):
 | 
						|
		"""
 | 
						|
		Set the currently active Camera in this Scene.
 | 
						|
		@type camera: Blender Camera
 | 
						|
		@param camera: The new active Camera.
 | 
						|
		"""
 | 
						|
 | 
						|
	def link(object):
 | 
						|
		"""
 | 
						|
		Link an Object to this Scene.
 | 
						|
		@type object: Blender Object
 | 
						|
		@param object: A Blender Object.
 | 
						|
		"""
 | 
						|
 | 
						|
	def unlink(object):
 | 
						|
		"""
 | 
						|
		Unlink an Object from this Scene.
 | 
						|
		@type object: Blender Object
 | 
						|
		@param object: A Blender Object.
 | 
						|
		@rtype: boolean
 | 
						|
		@return: true if object was found in the scene.
 | 
						|
		"""
 | 
						|
 | 
						|
	def getScriptLinks (event):
 | 
						|
		"""
 | 
						|
		Get a list with this Scene's script links of type 'event'.
 | 
						|
		@type event: string
 | 
						|
		@param event: "FrameChanged", "OnLoad", "OnSave", "Redraw" or "Render".
 | 
						|
		@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 (links = None):
 | 
						|
		"""
 | 
						|
		Delete script links from this Scene.  If no list is specified, all
 | 
						|
		script links are deleted.
 | 
						|
		@type links: list of strings
 | 
						|
		@param links: None (default) or a list of Blender L{Text} names.
 | 
						|
		"""
 | 
						|
 | 
						|
	def addScriptLink (text, event):
 | 
						|
		"""
 | 
						|
		Add a new script link to this Scene.
 | 
						|
		
 | 
						|
		Using OpenGL functions within a scene ScriptLink will draw graphics over the 3D view.
 | 
						|
		There is an issue with the zoom of the floating panels also scaling graphics drawn by your scriptlink.
 | 
						|
		This makes matching OpenGL graphics to mouse location impossible.
 | 
						|
		Make sure that you use floating point for operations that you would usually use int functions for: glRasterPos2f rather then glRasterPos2i.
 | 
						|
		
 | 
						|
		The following example shows how you can use the OpenGL model view matrix to obtain the scale value.
 | 
						|
		
 | 
						|
		Example::
 | 
						|
			from Blender import BGL
 | 
						|
			view_matrix = BGL.Buffer(BGL.GL_FLOAT, 16)
 | 
						|
			BGL.glGetFloatv(BGL.GL_MODELVIEW_MATRIX, view_matrix)
 | 
						|
			gl_scale = 1/viewMatrix[0]
 | 
						|
			
 | 
						|
			# Now that we have the scale we can draw to the correct scale.
 | 
						|
			BGL.glRect2f(10*gl_scale, 10*gl_scale, 110*gl_scale, 110*gl_scale)
 | 
						|
			
 | 
						|
			
 | 
						|
		@type text: string
 | 
						|
		@param text: the name of an existing Blender L{Text}.
 | 
						|
		@type event: string
 | 
						|
		@param event: "FrameChanged", "OnLoad", "OnSave", "Redraw" or "Render".
 | 
						|
		"""
 | 
						|
 | 
						|
	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.
 | 
						|
		"""
 | 
						|
 | 
						|
import id_generics
 | 
						|
Scene.__doc__ += id_generics.attributes
 | 
						|
 | 
						|
 | 
						|
class SceneObjects:
 | 
						|
	"""
 | 
						|
	The SceneObjects (Scene ObjectSeq) object
 | 
						|
	=========================================
 | 
						|
		This object gives access to the Objects in a Scene in Blender.
 | 
						|
 | 
						|
		Example::
 | 
						|
			from Blender import Scene
 | 
						|
			scn = Scene.GetCurrent()
 | 
						|
			
 | 
						|
			scn.objects.selected = [] # select none
 | 
						|
			scn.objects.selected = scn.objects # select all
 | 
						|
			scn.objects.context = scn.objects # select all and move into the scenes display layer
 | 
						|
			
 | 
						|
			# get a list of mesh objects
 | 
						|
			obs = [ob for ob in scn.objects if ob.type == 'Mesh']
 | 
						|
			
 | 
						|
			# Select only these mesh objects
 | 
						|
			scn.objects.selected = obs
 | 
						|
			
 | 
						|
			# print all object names
 | 
						|
			for ob in scn.objects: print ob.name
 | 
						|
			
 | 
						|
			# make a list of objects that you can add and remove to
 | 
						|
			# will not affect the current scene
 | 
						|
			scene_obs = list(scn.objects)
 | 
						|
 | 
						|
	@ivar selected: an iterator over all the selected objects in a scene.
 | 
						|
	@type selected: sequence of L{Object}
 | 
						|
	@ivar context: an iterator over all the visible selected objects in a scene.
 | 
						|
	@type context: sequence of L{Object}
 | 
						|
	@ivar active: the active object in the scene.
 | 
						|
	@type active: L{Object}
 | 
						|
	"""
 | 
						|
 | 
						|
	def new(data):
 | 
						|
		"""
 | 
						|
		Adds a new object to the scene.  Data is either object data such as a
 | 
						|
		L{Mesh} or L{Curve}, or the string "Empty" for an Empty object.  The
 | 
						|
		type of the object is determined by the type of the data.
 | 
						|
		@type data: string or object data
 | 
						|
		@param data: the object data for the new object
 | 
						|
		@return: the new object.
 | 
						|
		@rtype: L{Object}
 | 
						|
		"""
 | 
						|
 | 
						|
	def link(object):
 | 
						|
		"""
 | 
						|
		Adds an existing object to the scene.  If the object is already linked
 | 
						|
		to the scene, no action is taken and no exception is raised.
 | 
						|
		@type object: L{Object}
 | 
						|
		@param object: the object
 | 
						|
		@rtype: None
 | 
						|
		"""
 | 
						|
 | 
						|
	def unlink(object):
 | 
						|
		"""
 | 
						|
		Removes an object from the scene.  If the object is not linked
 | 
						|
		to the scene, no action is taken and no exception is raised.
 | 
						|
		@type object: L{Object}
 | 
						|
		@param object: the object
 | 
						|
		@rtype: None
 | 
						|
		"""
 | 
						|
 |