Help - Getting script to work with UI

Hey,
I have this script I've been using fairly often to randomize positions of elements within an object. (Found more or less as is on these forums I believe)

------------------------------------------------
obj = $
jitter = 1.5
minangle = 0.0
maxangle = 3.5
minscale = 0.99
maxscale = 1.15

numfaces = polyop.getnumfaces obj
allfacearr = #{1..numfaces}
for i = 1 to numfaces do
(
if allfacearr[i] then
(
elemarr = polyop.getElementsUsingFace obj i
allfacearr = allfacearr-elemarr
elemarr = elemarr as array
vertarr = #{}
for j = 1 to elemarr.count do
(
vertarr += polyop.getvertsusingFace obj elemarr[j]

)

vertarr2 = vertarr as array
pivt = [0,0,0]
for j = 1 to vertarr2.count do
(
pivt += polyop.getvert obj vertarr2[j]

)
pivt /= vertarr2.count

rot = (angleaxis (random minangle maxangle) (random [-1.0,-1.0,-1.0] [1.0,1.0,1.0])) as quat
scl = random minscale maxscale
for j = 1 to vertarr2.count do
(
vert = polyop.getvert obj vertarr2[j]
vertlocal = (vert - pivt)*scl
vert = (vertlocal*rot)+pivt
polyop.setvert obj vertarr2[j] vert

)

polyop.movevert obj vertarr (random [-jitter,-jitter,-jitter] [jitter, jitter, jitter])

)
)
-----------------------------------------------------------

However as I use it often enough, I wanted it to have a UI to change my variables rather than doing it via the script. This is what I came up with although the UI opens it doesn't actually work. Any help would be appreciated.
---------------------------------------------------------------------

obj = $
numfaces = polyop.getnumfaces obj
allfacearr = #{1..numfaces}

rollout ElementRandomise "Element Randomiser"
(

spinner jitter "Jitter" range:[0,100,0]
spinner minangle "Min Angle" range:[0,100,0]
spinner maxangle "Max Angle" range:[0,100,0]

spinner minscale "Min Scale" range:[0,100,0]
spinner maxscale "Max Scale" range:[0,100,0]
button create "Randomise"

on create pressed do

for i = 1 to numfaces do
(
if allfacearr[i] then
(
elemarr = polyop.getElementsUsingFace obj i
allfacearr = allfacearr-elemarr
elemarr = elemarr as array
vertarr = #{}
for j = 1 to elemarr.count do
(
vertarr += polyop.getvertsusingFace obj elemarr[j]

)

vertarr2 = vertarr as array
pivt = [0,0,0]
for j = 1 to vertarr2.count do
(
pivt += polyop.getvert obj vertarr2[j]

)
pivt /= vertarr2.count

rot = (angleaxis (random minangle maxangle) (random [-1.0,-1.0,-1.0] [1.0,1.0,1.0])) as quat
scl = random minscale maxscale
for j = 1 to vertarr2.count do
(
vert = polyop.getvert obj vertarr2[j]
vertlocal = (vert - pivt)*scl
vert = (vertlocal*rot)+pivt
polyop.setvert obj vertarr2[j] vert

)

polyop.movevert obj vertarr (random [-jitter,-jitter,-jitter] [jitter, jitter, jitter])

)
)

)

createDialog ElementRandomise
-------------------------------------------------------------------------

Comments

Comment viewing options

Select your preferred way to display the comments and click "Save settings" to activate your changes.
Hiltinchest's picture

Thanks for your response.I

Thanks for your response the help is much appreciated.

miauu's picture

.

(
	global ElementRandomise
	try(destroyDialog ElementRandomise)catch()
	rollout ElementRandomise "Element Randomiser"
	(	
		local poGetNumFaces = polyop.getnumfaces
		local poGetElementsUsingFace = polyop.getElementsUsingFace
		local poGetVertsuUsingFace = polyop.getvertsusingFace
		local poGetVert = polyop.getvert
		local poSetVert = polyop.setvert
		local poMoveVert = polyop.movevert
 
		spinner spn_jitter "spn_jitter" range:[0,100,0]
		spinner spn_minAngle "Min Angle" range:[0,100,0]
		spinner spn_maxAngle "Max Angle" range:[0,100,0]
 
		spinner spn_minScale "Min Scale" range:[0,100,0]
		spinner spn_maxScale "Max Scale" range:[0,100,0]
		button btn_create "Randomise"
 
		on btn_create pressed do
		(
			if selection.count == 1 then
			(
				obj = selection[1]
				if classOf obj == Editable_Poly then
				(
					numfaces = poGetNumFaces obj
					allfacearr = #{1..numfaces}
 
					for i = 1 to numfaces do
					(
						if allfacearr[i] then
						(
							elemarr = poGetElementsUsingFace obj i
							allfacearr = allfacearr - elemarr
							elemarr = elemarr as array
							vertarr = #{}
							for j = 1 to elemarr.count do
							(
								vertarr += poGetVertsuUsingFace obj elemarr[j]
							)
 
							vertarr2 = vertarr as array
							pivt = [0,0,0]
							for j = 1 to vertarr2.count do
							(
								pivt += poGetVert obj vertarr2[j]
							)
							pivt /= vertarr2.count
 
							rot = (angleaxis (random spn_minAngle.value spn_maxAngle.value) (random [-1.0,-1.0,-1.0] [1.0,1.0,1.0])) as quat
							scl = random spn_minScale.value spn_maxScale.value
							for j = 1 to vertarr2.count do
							(
								vert = poGetVert obj vertarr2[j]
								vertlocal = (vert - pivt)*scl
								vert = (vertlocal*rot)+pivt
								poSetVert obj vertarr2[j] vert
							)
 
							poMoveVert obj vertarr (random [-spn_jitter.value,-spn_jitter.value,-spn_jitter.value] [spn_jitter.value, spn_jitter.value, spn_jitter.value])
 
						)
					)
				)
				else
					messagebox "The object must be Editable Poly" title:"Wrong Selection"
			)
			else
				messagebox "Select only one object" title:"Wrong Selection"
		)
	)
	createDialog ElementRandomise
)

You have to optimize your code. Your code randomize each element as many times as faces those element have. To speed up the script you can randomize each element only once.

Comment viewing options

Select your preferred way to display the comments and click "Save settings" to activate your changes.