Metaball - added metaball.update attribute and constants Mataball.Update.ALWAYS, NEVER, HALFRES and NEVER
		
			
				
	
	
		
			247 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			247 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| # Blender.Metaball module and the Metaball PyType metaball
 | |
| 
 | |
| """
 | |
| The Blender.Metaball submodule
 | |
| 
 | |
| This module provides access to B{Metaball} data in Blender and the elements they contain.
 | |
| 
 | |
| 
 | |
| Example::
 | |
|  import Blender
 | |
|  mb = Blender.Metaball.New()
 | |
|  for i in xrange(20):
 | |
|    element= mb.elements.add()
 | |
|    element.co = Blender.Mathutils.Vector(i, 0, 0) 
 | |
|  sce = Blender.Scene.GetCurrent()
 | |
|  sce.objects.new(mb)
 | |
| 
 | |
| 
 | |
| 
 | |
| Example::
 | |
|     # Converts the active armature into metaballs
 | |
|     from Blender import *
 | |
|     def main():
 | |
| 
 | |
|             scn= Scene.GetCurrent()
 | |
|             ob_arm= scn.objects.active
 | |
|             if not ob_arm or ob_arm.type!='Armature':
 | |
|                     Draw.PupMenu('No Armature Selected')
 | |
|                     return
 | |
|             arm= ob_arm.data
 | |
| 
 | |
|             res= Draw.PupFloatInput('res:', 0.2, 0.05, 2.0)
 | |
|             if not res:
 | |
|                     return
 | |
| 
 | |
|             # Make a metaball
 | |
|             mb= Metaball.New()
 | |
|             mb.wiresize= res
 | |
| 
 | |
|             # Link to the Scene
 | |
|             ob_mb = scn.objects.new(ob_mb)
 | |
|             ob_arm.sel= 0
 | |
|             ob_mb.setMatrix(ob_arm.matrixWorld)
 | |
| 
 | |
| 
 | |
|             meta_type= 0 # all elemts are ball type
 | |
|             meta_stiffness= 2.0 # Volume
 | |
| 
 | |
|             for bone in arm.bones.values():
 | |
|                     print bone
 | |
| 
 | |
|                     # Find out how many metaballs to add based on bone length, 4 min
 | |
|                     length= bone.length
 | |
|                     if length < res:
 | |
|                             mballs= 4
 | |
|                     else:
 | |
|                             mballs= int(length/res)
 | |
|                             if mballs < 4:
 | |
|                                     mballs = 4
 | |
| 
 | |
|                     print 'metaball count', mballs
 | |
| 
 | |
|                     # get the bone properties
 | |
|                     head_rad= bone.headRadius
 | |
|                     tail_rad= bone.tailRadius
 | |
| 
 | |
|                     head_loc= bone.head['ARMATURESPACE']
 | |
|                     tail_loc= bone.tail['ARMATURESPACE']
 | |
| 
 | |
| 
 | |
|                     for i in range(mballs):
 | |
|                             f= float(i)
 | |
| 
 | |
|                             w1= f/mballs # weighting of this position on the bone for rad and loc
 | |
|                             w2= 1-w1
 | |
| 
 | |
|                             loc= head_loc*w1 + tail_loc*w2
 | |
|                             rad= (head_rad*w1 + tail_rad*w2) * 1.3
 | |
| 
 | |
|                             # Add the metaball
 | |
|                             ml= mb.elements.add()
 | |
|                             ml.co= loc
 | |
|                             ml.radius= rad
 | |
|                             ml.stiffness= meta_stiffness
 | |
| 
 | |
| 
 | |
|             Window.RedrawAll()
 | |
| 
 | |
|     main()
 | |
| 
 | |
| @type Types: readonly dictionary
 | |
| @var Types: MeteElement types.
 | |
|     - BALL
 | |
|     - TUBE
 | |
|     - PLANE
 | |
|     - ELIPSOID
 | |
|     - CUBE
 | |
| 
 | |
| @type Update: readonly dictionary
 | |
| @var Update: MeteElement types.
 | |
|     - ALWAYS
 | |
|     - HALFRES
 | |
|     - FAST
 | |
|     - NEVER
 | |
| 
 | |
| """
 | |
| 
 | |
| 
 | |
| def New (name):
 | |
| 	"""
 | |
| 	Creates a new Metaball.
 | |
| 	@type name: string
 | |
| 	@param name: The name of the metaball. If this parameter is not given (or not valid) blender will assign a name to the metaball.
 | |
| 	@rtype: Blender Metaball
 | |
| 	@return: The created Metaball.
 | |
| 	"""
 | |
| 
 | |
| def Get (name):
 | |
| 	"""
 | |
| 	Get the Metaball from Blender.
 | |
| 	@type name: string
 | |
| 	@param name: The name of the requested Metaball.
 | |
| 	@rtype: Blender Metaball or a list of Blender Metaballs
 | |
| 	@return: It depends on the 'name' parameter:
 | |
| 			- (name): The Metaball with the given name;
 | |
| 			- ():     A list with all Metaballs in the current scene.
 | |
| 	"""
 | |
| 
 | |
| class Metaball:
 | |
| 	"""
 | |
| 	The Metaball object
 | |
| 	===================
 | |
| 	This metaball gives access to generic data from all metaballs in Blender.
 | |
| 	@ivar elements: Element iterator of MetaElemSeq type.
 | |
| 	@type elements: MetaElemSeq
 | |
| 	@ivar wiresize: display resolution.
 | |
| 		Value clamped between 0.05 and 1.0.
 | |
| 
 | |
| 		A lower value results in more polygons.
 | |
| 	@type wiresize: float
 | |
| 	@ivar rendersize: render resolution.
 | |
| 		Value clamped between 0.05 and 1.0.
 | |
| 
 | |
| 		A lower value results in more polygons.
 | |
| 	@type rendersize: float
 | |
| 	@ivar thresh: Threshold setting for this metaball.
 | |
| 		Value clamped between 0.0 and 5.0.
 | |
| 	@type thresh: float
 | |
| 	@ivar materials: List of up to 16 Materials or None types
 | |
| 		Only the first material of the mother-ball used at the moment.
 | |
| 	@type materials: list
 | |
| 	@ivar update: The update method to use for this metaball.
 | |
| 	@type update: int
 | |
| 	"""
 | |
| 	
 | |
| 	def __copy__():
 | |
| 		"""
 | |
| 		Return a copy of this metaball object data.
 | |
| 		@rtype: Metaball
 | |
| 		@return: Metaball
 | |
| 		"""
 | |
| 
 | |
| import id_generics
 | |
| Metaball.__doc__ += id_generics.attributes 
 | |
| 
 | |
| 
 | |
| class MetaElemSeq:
 | |
| 	"""
 | |
| 	The MetaElemSeq object
 | |
| 	======================
 | |
| 		This object provides sequence and iterator access to the metaballs elements.
 | |
| 		The elements accessed within this iterator "wraps" the actual metaball elements; changing any
 | |
| 		of the elements's attributes will immediately change the data in the metaball.
 | |
| 
 | |
| 		This iterator is most like pythons 'set' type.
 | |
| 	"""
 | |
| 
 | |
| 	def add():
 | |
| 		"""
 | |
| 		Append a new element to the metaball.
 | |
| 		no arguments are taken, instead a new metaelement is
 | |
| 		added to the metaball data and returned.
 | |
| 		This new element can then be modified.
 | |
| 
 | |
| 		@return: a new meta element.
 | |
| 		@rtype: Metaelement
 | |
| 		"""
 | |
| 
 | |
| 	def remove(element):
 | |
| 		"""
 | |
| 		remove an element from the metaball data.
 | |
| 		
 | |
| 		if the element is not a part of the metaball data, an error will be raised.
 | |
| 
 | |
| 		@return: None
 | |
| 		@rtype: None
 | |
| 		"""
 | |
| 
 | |
| 	def __iter__():
 | |
| 		"""
 | |
| 		Iterate over elements in this metaball.
 | |
| 
 | |
| 		@return: One of the metaelem in this metaball.
 | |
| 		@rtype: Metaelem
 | |
| 		"""
 | |
| 
 | |
| 	def __len__():
 | |
| 		"""
 | |
| 		Iterate over elements in this metaball.
 | |
| 
 | |
| 		@return: The number of elements in this metaball
 | |
| 		@rtype: int
 | |
| 		"""
 | |
| 
 | |
| class Metaelem:
 | |
| 	"""
 | |
| 	The Metaelem object
 | |
| 	===================
 | |
| 	This gives direct access to meta element data within a metaball.
 | |
| 	@ivar type: The type of the metaball.
 | |
| 		Values must be from L{Types}
 | |
| 
 | |
| 		Example::
 | |
| 			from Blender import Metaball
 | |
| 			mb= Metaball.Get('mb')
 | |
| 			for el in mb.elements:
 | |
| 			  el.type= Metaball.Types.CUBE
 | |
| 	@type type: int
 | |
| 	@ivar co: The location of this element.
 | |
| 	@type co: Vector
 | |
| 	@ivar dims: Element dimensions.
 | |
| 		Values clamped between 0 and 20 on all axies.
 | |
| 	@type dims: Vector
 | |
| 	@ivar quat: Element rotation.
 | |
| 	@type quat: Quaternion
 | |
| 	@ivar stiffness: Element stiffness.
 | |
| 		Value clamped between 0 and 10.
 | |
| 	@type stiffness: float
 | |
| 	@ivar radius: Element radius.
 | |
| 		Value clamped between 0 and 5000.
 | |
| 	@type radius: float
 | |
| 	@ivar negative: Element negative volume status.
 | |
| 	@type negative: bool
 | |
| 	@ivar hide: Element hidden status.
 | |
| 	@type hide: bool
 | |
| 	"""
 |