Notifications
Clear all

[Closed] Array index and rollout slider?

Hey, I am wondering what the best way to access an array’s index via a slider would be?

Say I have an array of objects, I would like position 1 on the slider to relate to index number 1 of the array, 2 for 2, 3 for 3 etc. So that, as the slider changes value it accesses the relevant indexed object and that slider action triggers a piece of code for that indexed object.

Ultimately, as I change slider position, the object in the scene changes appropriately

Any help would be greatly appreciated, Cheers

K

12 Replies

make an array of objects.
set the slider’s max value to the count of objects in the array.
use the the slider’s value as index into your object array.
then trigger code when slider changes value.

Thanks for the reply, I understand that this is the basic principle behind making it work.
Here is some Bobo code I found and trying to fit to my needs:


myArray = $selection as array

rollout slide ""
(
	slider slide "Slider" range:[1,myarray.count,1] type:#integer ticks:5
	label lbl "Tick I"
	on slide changed val do
	( 
	  select myarray[val]
	 	copy $
			$.name = uniquename "copy"
				$.pos = $locator.pos			
	)		
)
createdialog slide


Ok here is an update, I have managed to get the slider to select the corresponding object and move it, the only thing I cannot figure out is how to then delete that copy before the next one is put in place?

Cheers, K

Don’t use global variable for task like this.

(
	global rol_sliderTest
	try(destroyDialog rol_sliderTest)catch()
	rollout rol_sliderTest ""
	(
		local obj = undefined
		local sel = undefined
		slider sld_01 ""  range:[0,10,0] type:#integer ticks:10
		
		on rol_sliderTest open do
		(
			obj = objects as array
			sld_01.range = [0,obj.count,0]
		)
		
		on sld_01 changed val do
		(
			if val != 0 do
			(
				print obj[val].name
				obj[val].wirecolor = [(random 0 255),(random 0 255),(random 0 255)]
				if isValidNode sel do delete sel
					
				select obj[val]
				sel = copy obj[val]
				sel.name = uniquename "copy"
				sel.pos = [0,0,0]	
			)
		)
	)
	createdialog rol_sliderTest 	
)

Miauu, thank you very much for taking the time to show me this solution it is greatly appreciated! I obviously have a lot to learn, I didnt realise it was quite so complicated. Although I do not fully understand all of your script I will try to learn from it.

Do you mind explaining the difference between Global and Local in this scenario and why Global was a bad choice?

Thanks again, K

Search maxscript Help file for “Scope of Variables”.
This is copy-paste:
[left]Global variables are visible in all running MAXScript code and hold their values until you exit 3ds Max.
[/left]
[left]Local variables are directly visible to code only in the lexical scope currently in effect, and hold their values only as long as the current scope is active. Once a scope is no longer active, you can no longer access the contents of a variable local to that scope.
[/left]
Global variables can cause conflict with global vars from other scripts – if the two vars have the same name, so try to avoid it when is possible.
My english is not so god, but I believe that some other people in CGtalk can explain this a bit better. Also, search the forum and you may find some better explenations.

My script is not complicated. Here how it works:
– first, declare a var, which will hold the created copy

local sel = undefined

– then, in the

on slider changed val do

, the script first check if the copy is already in the scene and if it is a valid object

if isValidNode sel do delete sel

– if sel is a valid node then the script delete it
after that the script create a new copy and assign it to sel var
So, when you move the slider for first time, the sel is undefined, and the script will not delete any object. After that the first copy is created. On second move of the slide, the sel already holds the created copy, and when the script check this(with

if isValidNode sel do delete sel

) the copy will be deleted(because this copy is a valid scene object) and the new copy is created. Nothing too complicated.
Hope, you will understand what I wrote.

Hmmm, the thing is though, i have multiple sliders trying to do the same thing and it seems at the moment that when I use another slider to swap pieces in and out the code deletes the object i have just selected with the previous slider.

Is there anyway around this?

cheers, K

Post the code, but if you using
if isValidNode sel do delete selin every slider’s event handler and the SEL is only one variable, the object will be deleted.

Heyand thanks for reply, I overcame the problem by declaring a new variable for every object at the beginning of the script. It seems to work, here is the code so far…i know it is probably very bad but it does work which is all I need as it is the concept that is more important (being an Artists)


undo off

if ((Swordsmith != undefined) and (Swordsmith.isdisplayed)) do
	(destroyDialog Swordsmith)

		BladePoint = point pos: [0,0,65] size: 5
		CGPoint = point pos: [0,0,30] size: 5
		RPPoint = point pos: [5,0,30] size: 5
		LPPoint = point pos: [-5,0,30] size: 5
		Hiltpoint = point pos: [0,0,-3] size: 5
		HandlePoint = point pos: [0,0,27] size: 5
								
		Global obj = undefined
		Global B1 = undefined						
		Global B2 = undefined
		Global CGD = undefined
		Global RP = undefined
		Global LP = undefined
		Global HNDL = undefined
		Global HLT = undefined

rollout SwordSmith "Swordsmith" width:260 height:800
(
	button FormatBladeBtn "Format Blades" pos:[16,144] width:110 height:32
	button FormatCGBtn "Format Cross-Guards" pos:[136,144] width:110 height:32
	button FormatPommelBtn "Format Pommels" pos:[16,184] width:110 height:32
	button FormatHandleBtn "Format Handles" pos:[136,184] width:110 height:32
	button FormatHiltBtn "Format Hilts" pos:[16,224] width:110 height:32
	button CreateCameraBtn "Create Camera" pos:[16,72] width:110 height:32
	button RemoveCameraBtn "Remove Camera" pos:[136,72] width:110 height:32
	GroupBox grp1 "Stage 1 - Setup Scene" pos:[8,16] width:248 height:96
	GroupBox grp2 "Stage 2 - Setup Assets" pos:[8,128] width:248 height:136
	slider sld1 "Select Blade 1" pos:[16,360] width:232 height:44 range:[0,10,0] type:#integer ticks:10
	slider sld2 "Select Blade 2" pos:[16,408] width:232 height:44 range:[0,10,0] type:#integer ticks:10
	slider sld3 "Select Cross-Guard" pos:[16,456] width:232 height:44 range:[0,10,0] type:#integer ticks:10
	slider sld4 "Select Right Pommel" pos:[16,504] width:232 height:44 range:[0,10,0] type:#integer ticks:10
	slider sld5 "Select Left Pommel" pos:[16,552] width:232 height:44 range:[0,10,0] type:#integer ticks:10
	slider sld6 "Select Handle" pos:[16,600] width:232 height:44 range:[0,8,0] type:#integer ticks:8
	slider sld7 "Select Hilt" pos:[16,648] width:232 height:44 range:[0,10,0] type:#integer ticks:10
	GroupBox grp3 "Stage 3 - Create Sword" pos:[8,288] width:248 height:416
	button GenSwordBtn "Generate Sword" pos:[16,312] width:110 height:32
	button ResetSwordBtn "Reset" pos:[136,312] width:110 height:32
	button ExportBtn "Export" pos:[16,736] width:110 height:32
	button ImageBtn "Create Image" pos:[136,736] width:110 height:32
	groupBox grp10 "Stage 4 - Save Result" pos:[8,720] width:248 height:56
	
	on CreateCameraBtn pressed do
	(
		
		)
	on RemoveCameraBtn pressed do
	(
		
		)
	on FormatBladeBtn pressed do
	(
		BladeArray = selection as array
			for i in BladeArray do
			(
				i.name = uniquename "Blade" 
					
				-- eddybrown, Maxscript - frustrating group issue
				--  http://www.polycount.com/forum/showthread.php?t=93815,  01-26-2012
				i.pivot = [i.min.x, (i.max.y+i.min.y)/2, (i.max.z+i.min.z)/2]
			)
		)
	on FormatCGBtn pressed do
	(
		CGArray = selection as array
			for i in CGArray do
			(
				i.name = uniquename "CG" 
					 i.pivot = [(i.max.x+i.min.x)/2, (i.max.y+i.min.y)/2, (i.max.z+i.min.z)/2]
			)
		)
	on FormatPommelBtn pressed do
	(
		PommelArray = selection as array
			for i in PommelArray do
			(
				i.name = uniquename "Pommel" 
					 i.pivot = [i.min.x, (i.max.y+i.min.y)/2, (i.max.z+i.min.z)/2]
			)
		)
	on FormatHandleBtn pressed do
	(
		HandleArray = selection as array
			for i in HandleArray do
			(
				i.name = uniquename "Handle" 
					 i.pivot = [(i.min.x+i.max.x)/2, (i.max.y+i.min.y)/2, i.max.z]
			)
		)
	on FormatHiltBtn pressed do
	(
		HiltArray = selection as array
			for i in HiltArray do
			(
				i.name = uniquename "Hilt" 
					 i.pivot = [(i.min.x+i.max.x)/2, (i.max.y+i.min.y)/2, i.max.z]
			)
		)
	on GenSwordBtn pressed do
	(

		
		-- FROM Anubis: Random Objects in a List, Scriptspot, 2009-12-30 05:26
		
		Select $Blade*
			BladeArray = Selection as Array
				rndIndex = random 1 BladeArray.count
					RightBlade = BladeArray[rndIndex]
						RightCopy = copy RightBlade
							RightCopy.name = uniquename "Right_Blade"
								RightCopy.pos = BladePoint.pos
		
		Select $Blade*
			BladeArray = Selection as Array
				rndIndex = random 1 BladeArray.count
					LeftBlade = BladeArray[rndIndex]
						LeftCopy = copy LeftBlade
							LeftCopy.name = uniquename "Left_blade"
								LeftCopy.pos = BladePoint.pos
								
				-- FROM Mr-Bullfrog: MaxScript - Rotate and Object, 3D Buzz, 10-24-2008
				
				currentMatrix = LeftCopy.transform
					preRotate currentMatrix (eulertoquat (eulerAngles 0 180 0))
						Leftcopy.transform = currentMatrix
						
		Select $CG*
			CGArray = Selection as Array
				rndIndex = random 1 CGArray.count
					CG = CGArray[rndIndex]
						CGCopy = copy CG
							CGCopy.name = uniquename "Copy_CG"
								CGCopy.pos = CGPoint.pos

		Select $Pommel*
			PommelArray = Selection as Array
				rndIndex = random 1 PommelArray.count
					RightPommel = PommelArray[rndIndex]
						RightPommelCopy = copy RightPommel
							RightPommelCopy.name = uniquename "Pommel_Right"
								RightPommelCopy.pos = RPpoint.pos

		Select $Pommel*
			PommelArray = Selection as Array
				rndIndex = random 1 PommelArray.count
					LeftPommel = PommelArray[rndIndex]
						LeftPommelCopy = copy LeftPommel
							LeftPommelCopy.name = uniquename "Pommel_Left"
								LeftPommelCopy.pos = LPpoint.pos	
			
			currentMatrix = LeftPommelCopy.transform
					preRotate currentMatrix (eulertoquat (eulerAngles 0 180 0))
						LeftPommelcopy.transform = currentMatrix

		Select $Handle*
			HandleArray = Selection as Array
				rndIndex = random 1 HandleArray.count
					Handle = HandleArray[rndIndex]
						HandleCopy = copy Handle
							HandleCopy.name = uniquename "Copy_Handle"
								HandleCopy.pos = Handlepoint.pos

		Select $Hilt*
			HiltArray = Selection as Array
				rndIndex = random 1 HiltArray.count
					Hilt = HiltArray[rndIndex]
						HiltCopy = copy Hilt
							HiltCopy.name = uniquename "Copy_Hilt"
								HiltCopy.pos = Hiltpoint.pos					
		)
	on ResetSwordBtn pressed do
	(
	
			for obj in objects do	
				(
					select $copy_Hilt*
						max delete
					select $Pommel_Right* 
						max delete
					select $Pommel_Left*
						max delete
					select $left_blade*
						max delete
					select $right_blade*
						max delete
					select $copy*
						max delete
				)
		)
	
	-- SLIDER 1
-- 		Edited from Code contributed by Miauu, CG Society forum, in response to my post
-- 		"Array Index and Rollout Slider", 17/04/2012	
	on sld1 changed val do
	(
		(
			select $Blade*
			BladeArray = Selection as Array
		)			
					if val != 0 do
					(
						if isValidNode B1 do delete B1
				
						select BladeArray[val]
						B1 = copy BladeArray[val]
						B1.name = uniquename "copy"
						B1.pos = Bladepoint.pos
					)
		)
	
		on sld1 buttondown do
	(
		select $Right*
		max delete
	)
		
	on sld1 buttonup do
	(
		for obj in objects do
		(
			deselect objects
		)
	)
	
-- 	SLIDER 2
	on sld2 changed val do
	(
		(
			select $Blade*
			BladeArrayLeft = Selection as Array
			
		)			
					if val != 0 do
					(
						
				
						
					if isValidNode B2 do delete B2
					
					select BladeArrayLeft[val]
					B2 = copy BladeArrayLeft[val]
					B2.name = uniquename "copy"
					B2.pos = Bladepoint.pos
					
					currentMatrix = B2.transform
					preRotate currentMatrix (eulertoquat (eulerAngles 0 180 0))
					B2.transform = currentMatrix
					)
		)
	on sld2 buttondown do
	(
		select $Left*
		max delete
	)
	on sld2 buttonup do
	(
		for obj in objects do
		(
			deselect objects
		)
	)
	
-- 	SLIDER 3
	on sld3 changed val do
	(
		(
			select $CG*
			CGArray = Selection as Array
		)			
					if val != 0 do
					(
						if isValidNode CGD do delete CGD
				
						select CGArray[val]
						CGD = copy CGArray[val]
						CGD.name = uniquename "copy"
						CGD.pos = CGpoint.pos
					)
	)
	on sld3 buttondown do
	(
		select $copy_CG*
		max delete
	)
	on sld3 buttonup do
	(
		for obj in objects do
		(
			deselect objects
		)
	)
	
-- 	SLIDER 4
	on sld4 changed val do
	(
		(
			select $Pommel*
			RightPommelArray = Selection as Array
		)			
					if val != 0 do
					(
						if isValidNode RP do delete RP
				
						select RightPommelArray[val]
						RP = copy RightPommelArray[val]
						RP.name = uniquename "copy"
						RP.pos = RPpoint.pos
					)
	)
	on sld4 buttondown do
	(
		select $Pommel_Right*
		max delete
	)
	on sld4 buttonup do
	(
		for obj in objects do
		(
			deselect objects
		)
	)
	
-- 	SLIDER 5
	on sld5 changed val do
	(
		(
			select $Pommel*
			LeftPommelArray = Selection as Array
		)			
					if val != 0 do
					(
						if isValidNode LP do delete LP
				
						select LeftPommelArray[val]
						LP = copy LeftPommelArray[val]
						LP.pos = LPpoint.pos
						LP.name = uniquename "copy"
						
						currentMatrix = LP.transform
						preRotate currentMatrix (eulertoquat (eulerAngles 0 180 0))
						LP.transform = currentMatrix
					)
	)
	on sld5 buttondown do
	(
		select $Pommel_Left*
		max delete
	)
	on sld5 buttonup do
	(
		for obj in objects do
		(
			deselect objects
		)
	)
	
-- 	SLIDER 6
	on sld6 changed val do
	(
		(
			select $Handle*
			HandleArray = Selection as Array
		)			
					if val != 0 do
					(
						if isValidNode HNDL do delete HNDL
				
						select HandleArray[val]
						HNDL = copy HandleArray[val]
						HNDL.name = uniquename "copy"
						HNDL.pos = Handlepoint.pos
					)
	)
	on sld6 buttondown do
	(
		select $copy_Handle*
		max delete
	)
	on sld6 buttonup do
	(
		for obj in objects do
		(
			deselect objects
		)
	)
	
-- 	SLIDER 7
	on sld7 changed val do
	(
		(
			select $Hilt*
			HiltArray = Selection as Array
		)			
					if val != 0 do
					(
						if isValidNode HLT do delete HLT
				
						select HiltArray[val]
						HLT = copy HiltArray[val]
						HLT.name = uniquename "copy"
						HLT.pos = Hiltpoint.pos
					)
	)
	on sld7 buttondown do
	(
		select $copy_Hilt*
		max delete
	)
	on sld7 buttonup do
	(
		for obj in objects do
		(
			deselect objects
		)
	)
	on ExportBtn pressed do
	(
		
		)
	on ImageBtn pressed do
	(
		
		)
)

createdialog SwordSmith

Cheers, K

Why you have so many global variables? Global with name obj will definitely cause problems with other scripts.
If only the script(rollout) use them – put all globals in the:

rollout rol_name ""
 (
    local obj = undefined
    ...
    ...
 )
 createDialog rol_name

Also, if you want, you can create all point helpers in

on rol_name open do
 (
    BladePoint = point pos: [0,0,65] size: 5
    ...
    ...
 )
Page 1 / 2