129 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			129 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
#!BPY
 | 
						|
 | 
						|
"""
 | 
						|
Name: 'Randomize Loc Size Rot'
 | 
						|
Blender: 241
 | 
						|
Group: 'Object'
 | 
						|
Tooltip: 'Randomize the selected objects Loc Size Rot'
 | 
						|
"""
 | 
						|
 | 
						|
__bpydoc__=\
 | 
						|
'''
 | 
						|
This script randomizes the selected objects location/size/rotation.
 | 
						|
'''
 | 
						|
 | 
						|
# ***** BEGIN GPL LICENSE BLOCK *****
 | 
						|
#
 | 
						|
# Script copyright (C) Campbell Barton
 | 
						|
#
 | 
						|
# 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 *****
 | 
						|
# --------------------------------------------------------------------------
 | 
						|
 | 
						|
'''
 | 
						|
30 Jun 07 - ZanQdo:
 | 
						|
 - Properly coded axis toggles for Loc random (didn't work at all)
 | 
						|
 - Made Rot input values meaningful (45 will give max 45 degres of rotation)
 | 
						|
 - Pumped up the Scale value limit
 | 
						|
 - Made Scale input values meaningful (15 will give max 15 units bigger model)
 | 
						|
'''
 | 
						|
 | 
						|
from Blender import Draw, Scene
 | 
						|
from Blender.Mathutils import Rand
 | 
						|
 | 
						|
def rnd(flag):
 | 
						|
	Random = Rand()
 | 
						|
	if flag == "LOC":
 | 
						|
		return (Random - 0.5) * 2
 | 
						|
	elif flag == "ROT":
 | 
						|
		return (Random - 0.5) * 0.035
 | 
						|
	elif flag == "SIZE":
 | 
						|
		return (Random - 0.5) * 1.8
 | 
						|
 | 
						|
def randomize(sel, PREF_LOC, PREF_SIZE, PREF_ROT, PREF_LINK_AXIS, PREF_X_AXIS, PREF_Y_AXIS, PREF_Z_AXIS):
 | 
						|
	for ob in sel:
 | 
						|
		if PREF_LOC:
 | 
						|
			if PREF_LINK_AXIS:
 | 
						|
				rand = PREF_LOC*rnd("LOC")
 | 
						|
				ob.loc = (ob.LocX+(rand*PREF_X_AXIS),  ob.LocY+(rand*PREF_Y_AXIS),  ob.LocZ+(rand*PREF_Z_AXIS))
 | 
						|
			else:
 | 
						|
				if PREF_X_AXIS:	x= PREF_LOC*rnd("LOC")
 | 
						|
				else:			x= 0
 | 
						|
				if PREF_Y_AXIS:	y= PREF_LOC*rnd("LOC")
 | 
						|
				else:			y= 0
 | 
						|
				if PREF_Z_AXIS:	z= PREF_LOC*rnd("LOC")
 | 
						|
				else:			z= 0
 | 
						|
				ob.loc = (ob.LocX+x,  ob.LocY+y,  ob.LocZ+z)
 | 
						|
		
 | 
						|
		if PREF_SIZE:
 | 
						|
			if PREF_LINK_AXIS:
 | 
						|
				rand = PREF_SIZE*rnd("SIZE")
 | 
						|
				if PREF_X_AXIS:	x= rand
 | 
						|
				else:			x= 0
 | 
						|
				if PREF_Y_AXIS:	y= rand
 | 
						|
				else:			y= 0
 | 
						|
				if PREF_Z_AXIS:	z= rand
 | 
						|
				else:			z= 0
 | 
						|
			
 | 
						|
			else:
 | 
						|
				if PREF_X_AXIS:	x= PREF_SIZE*rnd("SIZE")
 | 
						|
				else:			x= 0
 | 
						|
				if PREF_Y_AXIS:	y= PREF_SIZE*rnd("SIZE")
 | 
						|
				else:			y= 0
 | 
						|
				if PREF_Z_AXIS:	z= PREF_SIZE*rnd("SIZE")
 | 
						|
				else:			z= 0
 | 
						|
				
 | 
						|
			ob.size = (abs(ob.SizeX+x),  abs(ob.SizeY+y),  abs(ob.SizeZ+z))
 | 
						|
		
 | 
						|
		if PREF_ROT:
 | 
						|
			if PREF_LINK_AXIS:
 | 
						|
				rand = PREF_ROT*rnd("ROT")
 | 
						|
				ob.rot = (ob.RotX+rand,  ob.RotY+rand,  ob.RotZ+rand)
 | 
						|
			else:
 | 
						|
				ob.rot = (ob.RotX+(PREF_X_AXIS*PREF_ROT*rnd("ROT")),  ob.RotY+(PREF_Y_AXIS*PREF_ROT*rnd("ROT")),  ob.RotZ+(PREF_Z_AXIS*PREF_ROT*rnd("ROT")))
 | 
						|
	
 | 
						|
 | 
						|
def main():
 | 
						|
	scn = Scene.GetCurrent()
 | 
						|
	if not scn.objects.context:
 | 
						|
		return
 | 
						|
	
 | 
						|
	PREF_LOC= Draw.Create(0.0)
 | 
						|
	PREF_SIZE= Draw.Create(0.0)
 | 
						|
	PREF_ROT= Draw.Create(0.0)
 | 
						|
	PREF_LINK_AXIS= Draw.Create(0)
 | 
						|
	PREF_X_AXIS= Draw.Create(1)
 | 
						|
	PREF_Y_AXIS= Draw.Create(1)
 | 
						|
	PREF_Z_AXIS= Draw.Create(1)
 | 
						|
	
 | 
						|
	pup_block = [\
 | 
						|
	('loc:', PREF_LOC, 0.0, 100.0, 'Amount to randomize the location'),\
 | 
						|
	('size:', PREF_SIZE, 0.0, 100.0,  'Amount to randomize the size'),\
 | 
						|
	('rot:', PREF_ROT, 0.0, 360.0, 'Amount to randomize the rotation'),\
 | 
						|
	'',\
 | 
						|
	('Link Axis', PREF_LINK_AXIS, 'Use the same random value for each objects XYZ'),\
 | 
						|
	('X Axis', PREF_X_AXIS, 'Enable X axis randomization'),\
 | 
						|
	('Y Axis', PREF_Y_AXIS, 'Enable Y axis randomization'),\
 | 
						|
	('Z Axis', PREF_Z_AXIS, 'Enable Z axis randomization'),\
 | 
						|
	]
 | 
						|
	
 | 
						|
	if not Draw.PupBlock('Object Randomize', pup_block):
 | 
						|
		return
 | 
						|
	
 | 
						|
	randomize(scn.objects.context, PREF_LOC.val, PREF_SIZE.val, PREF_ROT.val, PREF_LINK_AXIS.val, PREF_X_AXIS.val, PREF_Y_AXIS.val, PREF_Z_AXIS.val)
 | 
						|
	
 | 
						|
if __name__ == '__main__':
 | 
						|
	main() |