Notifications
Clear all

[Closed] IscriptCTRL ??

Interfaces: [left]All script controllers expose the IScriptCtrl Interface since 3ds Max 8. This interface provides all methods to access the controller through MAXScript:
[/left]
Methods:
<boolean>SetConstant <value>Which <&fpvalue>Constant
Constant
is In parameter
Sets a given constant to the specified value.

i didn´t understand it…someone can help me, please ?

test :


  for i = 1 to (selection.count) do
  (
  	b = selection[i]
  	P_script = position_script ()
  	b.controller.position.controller.Available.controller = P_script
  	b.position.controller[3].controller.script = 
  	"Ppos = $test_obj.pos.controller[2].controller
  	 val = $test.obj.modifiers[1].value
  	 OldPos = [0,0,0]
  	 SetConstant "OldPos" ---------------- HERE MY PROBLEM
  	 at time (F-val)
  	 ( 
  	 Ppos.value
  	 )
  	 "
  )
  

– Type error: Call needs function or class, got: “Ppos = $Ten_c1_Pt_lookAt_end.pos.controller.Zero_Pos_XYZ.controller
PrevPos = [0,0,0]
setConstant “

3 Replies

if you need to use the char ” inside a string “”, you need to put a \ before it.
i.e: “stringValue=“this is a string” “.

but dude! that’s not enought to make work your script.

The methods provided by this interface are NOT to be used inside the script expression of the controller, but are meant to CREATE variables for the controller, just like you do normally via the Script Controller UI.

So the setConstant() method can be used to set a variable to a constant value by the script that creates the controller. Once you have called it, you can use the constant variable inside the .script string and it will contain the value you assigned to it.

Assuming your objects have Position List controllers, your code could look like


for b in selection do --loop through the selected objects
(
	P_script = position_script () --create a new position script
	b.controller.position.controller.Available.controller = P_script --assign to List
	P_script.AddConstant "OldPos" [1,2,3] --create a constant variable 
	P_script.SetConstant "OldPos" [0,0,0] --set the variable to a different value
	P_script.AddNode "Test_Obj" $test_obj --create a node variable
	P_script.AddTarget "Ppos" $test_obj.pos.controller[2].controller --create a target variable with a controller
	P_script.script = "at time (F-test_obj.modifiers[1].value) Ppos" --set the script
)--end loop

As you can see, you can add new variables, change their content and use them in the script to access scene data without $ references in the code. This makes the controller A) faster and B) independent on name changes and XRefs, since the nodes and controllers are stored as references in a parameter block and a pointer is used to access them internally. If you rename your object, the variable will remain valid.

I have not used the OldPos variable in the code, but it would be created and set to [0,0,0]. Of course, I don’t have your scene so I could not test the rest, but this is the general approach…

lol,
Thanks a lot Bobo !
=D !