| 
									
										
										
										
											2010-01-19 00:59:36 +00:00
										 |  |  | # ##### BEGIN GPL LICENSE BLOCK ##### | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | #  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 LICENSE BLOCK ##### | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-19 09:36:40 +00:00
										 |  |  | # <pep8 compliant> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-19 00:59:36 +00:00
										 |  |  | import bpy | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-19 09:36:40 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-19 00:59:36 +00:00
										 |  |  | def randomize_selected(seed, loc, rot, scale, scale_even, scale_min): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     import random | 
					
						
							|  |  |  |     from random import uniform | 
					
						
							|  |  |  |     from Mathutils import Vector | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     random.seed(seed) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def rand_vec(vec_range): | 
					
						
							| 
									
										
										
										
											2010-01-19 09:36:40 +00:00
										 |  |  |         return Vector([uniform(- val, val) for val in vec_range]) | 
					
						
							| 
									
										
										
										
											2010-01-19 00:59:36 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     for obj in bpy.context.selected_objects: | 
					
						
							| 
									
										
										
										
											2010-01-19 09:36:40 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-19 00:59:36 +00:00
										 |  |  |         if loc: | 
					
						
							|  |  |  |             obj.location += rand_vec(loc) | 
					
						
							| 
									
										
										
										
											2010-01-19 09:24:39 +00:00
										 |  |  |         else: # otherwise the values change under us | 
					
						
							|  |  |  |             uniform(0.0, 0.0), uniform(0.0, 0.0), uniform(0.0, 0.0) | 
					
						
							| 
									
										
										
										
											2010-01-19 09:36:40 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-19 00:59:36 +00:00
										 |  |  |         if rot: # TODO, non euler's | 
					
						
							|  |  |  |             vec = rand_vec(rot) | 
					
						
							|  |  |  |             obj.rotation_euler[0] += vec[0] | 
					
						
							|  |  |  |             obj.rotation_euler[1] += vec[1] | 
					
						
							|  |  |  |             obj.rotation_euler[2] += vec[2] | 
					
						
							| 
									
										
										
										
											2010-01-19 09:24:39 +00:00
										 |  |  |         else: | 
					
						
							|  |  |  |             uniform(0.0, 0.0), uniform(0.0, 0.0), uniform(0.0, 0.0) | 
					
						
							| 
									
										
										
										
											2010-01-19 00:59:36 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if scale: | 
					
						
							|  |  |  |             org_sca_x, org_sca_y, org_sca_z = obj.scale | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if scale_even: | 
					
						
							| 
									
										
										
										
											2010-01-19 09:36:40 +00:00
										 |  |  |                 sca_x = sca_y = sca_z = uniform(scale[0], - scale[0]) | 
					
						
							| 
									
										
										
										
											2010-01-19 00:59:36 +00:00
										 |  |  |             else: | 
					
						
							|  |  |  |                 sca_x, sca_y, sca_z = rand_vec(scale) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             aX = sca_x + org_sca_x | 
					
						
							| 
									
										
										
										
											2010-01-19 09:36:40 +00:00
										 |  |  |             bX = org_sca_x * scale_min | 
					
						
							| 
									
										
										
										
											2010-01-19 00:59:36 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |             aY = sca_y + org_sca_y | 
					
						
							| 
									
										
										
										
											2010-01-19 09:36:40 +00:00
										 |  |  |             bY = org_sca_y * scale_min | 
					
						
							| 
									
										
										
										
											2010-01-19 00:59:36 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |             aZ = sca_z + org_sca_z | 
					
						
							| 
									
										
										
										
											2010-01-19 09:36:40 +00:00
										 |  |  |             bZ = org_sca_z * scale_min | 
					
						
							| 
									
										
										
										
											2010-01-19 00:59:36 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-19 09:36:40 +00:00
										 |  |  |             if aX < bX: | 
					
						
							|  |  |  |                 aX = bX | 
					
						
							|  |  |  |             if aY < bY: | 
					
						
							|  |  |  |                 aY = bY | 
					
						
							|  |  |  |             if aZ < bZ: | 
					
						
							|  |  |  |                 aZ = bZ | 
					
						
							| 
									
										
										
										
											2010-01-19 00:59:36 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |             obj.scale = aX, aY, aZ | 
					
						
							| 
									
										
										
										
											2010-01-19 09:24:39 +00:00
										 |  |  |         else: | 
					
						
							|  |  |  |             uniform(0.0, 0.0), uniform(0.0, 0.0), uniform(0.0, 0.0) | 
					
						
							| 
									
										
										
										
											2010-01-19 00:59:36 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | from bpy.props import * | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class RandomizeLocRotSize(bpy.types.Operator): | 
					
						
							|  |  |  |     '''Randomize objects loc/rot/scale.''' | 
					
						
							|  |  |  |     bl_idname = "object.randomize_locrotsize" | 
					
						
							|  |  |  |     bl_label = "Randomize Loc Rot Size" | 
					
						
							|  |  |  |     bl_register = True | 
					
						
							|  |  |  |     bl_undo = True | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     random_seed = IntProperty(name="Random Seed", | 
					
						
							|  |  |  |         description="Seed value for the random generator", | 
					
						
							|  |  |  |         default=0, min=0, max=1000) | 
					
						
							| 
									
										
										
										
											2010-01-19 09:36:40 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-19 00:59:36 +00:00
										 |  |  |     use_loc = BoolProperty(name="Randomize Location", | 
					
						
							|  |  |  |         description="Randomize the scale values", default=True) | 
					
						
							| 
									
										
										
										
											2010-01-19 09:36:40 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-19 00:59:36 +00:00
										 |  |  |     loc = FloatVectorProperty(name="Location", | 
					
						
							|  |  |  |         description="Maximun distance the objects can spread over each axis", | 
					
						
							|  |  |  |         default=(0.0, 0.0, 0.0), min=-100.0, max=100.0) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     use_rot = BoolProperty(name="Randomize Rotation", | 
					
						
							|  |  |  |         description="Randomize the rotation values", default=True) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     rot = FloatVectorProperty(name="Rotation", | 
					
						
							|  |  |  |         description="Maximun rotation over each axis", | 
					
						
							|  |  |  |         default=(0.0, 0.0, 0.0), min=-180.0, max=180.0) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     use_scale = BoolProperty(name="Randomize Scale", | 
					
						
							|  |  |  |         description="Randomize the scale values", default=True) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     scale_even = BoolProperty(name="Scale Even", | 
					
						
							|  |  |  |         description="Use the same scale value for all axis", default=False) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     scale_min = FloatProperty(name="Minimun Scale Factor", | 
					
						
							|  |  |  |         description="Lowest scale percentage possible", | 
					
						
							| 
									
										
										
										
											2010-01-19 09:36:40 +00:00
										 |  |  |         default=15.0, min=-1.0, max=1.0, precision=3) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-19 00:59:36 +00:00
										 |  |  |     scale = FloatVectorProperty(name="Scale", | 
					
						
							|  |  |  |         description="Maximum scale randomization over each axis", | 
					
						
							|  |  |  |         default=(0.0, 0.0, 0.0), min=-100.0, max=100.0) | 
					
						
							| 
									
										
										
										
											2010-01-19 09:36:40 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-19 00:59:36 +00:00
										 |  |  |     def execute(self, context): | 
					
						
							|  |  |  |         from math import radians | 
					
						
							|  |  |  |         seed = self.properties.random_seed | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         loc = self.properties.loc if self.properties.use_loc else None | 
					
						
							|  |  |  |         rot = self.properties.rot if self.properties.use_rot else None | 
					
						
							| 
									
										
										
										
											2010-01-19 09:36:40 +00:00
										 |  |  |         scale = [radians(val) for val in self.properties.scale] if self.properties.use_scale else None | 
					
						
							| 
									
										
										
										
											2010-01-19 00:59:36 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         scale_even = self.properties.scale_even | 
					
						
							| 
									
										
										
										
											2010-01-19 09:36:40 +00:00
										 |  |  |         scale_min = self.properties.scale_min | 
					
						
							| 
									
										
										
										
											2010-01-19 00:59:36 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         randomize_selected(seed, loc, rot, scale, scale_even, scale_min) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return {'FINISHED'} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Register the operator | 
					
						
							|  |  |  | bpy.types.register(RandomizeLocRotSize) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-19 09:36:40 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-19 00:59:36 +00:00
										 |  |  | def menu_func(self, context): | 
					
						
							|  |  |  |     if context.mode == 'OBJECT': | 
					
						
							|  |  |  |         self.layout.operator(RandomizeLocRotSize.bl_idname, | 
					
						
							|  |  |  |         text="Randomize Loc Rot Size") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bpy.types.VIEW3D_MT_transform.append(menu_func) |