Share

How To Make It Better?

Avoid using persistent global variables

A good idea gone bad.

Initially added to support scripted controllers and xrefs.

Problems:

  • No control over whether they are loaded

  • Overwriting previous values

Solutions:

  • Use the new scripted controllers in 3ds Max 8

  • Use scripted CAs for persistent data storage (see below)

Using scripted CAs for persistent data storage

Scripted Custom Attributes can be used instead of persistent global variables to store data with the scene file, avoiding the problems mentioned above.

A scripted CA can be placed on the scene root:

sceneDataCADef =attributes sceneDataCADef version:1 attribID:#(0x61e9ff5f, 0x63784819)
(
parameters main rollout:params
( note type:#string ui:et_note default:"")
rollout params "Scene Data Parameters"
( edittext et_note "Note: ")
)
 
thescene = (refs.dependents rootnode)[1]
rootNodeDataCA = undefined
if (custattributes.add rootnode sceneDataCADef) do
 rootNodeDataCA = rootnode.custAttributes[rootnode.custAttributes.count]
sceneDataCA = undefined
if (custattributes.add thescene sceneDataCADef) do
 sceneDataCA = thescene.custAttributes[thescene.custAttributes.count]
rootNodeDataCA.note
sceneDataCA.note
rootNodeDataCA.note = "rootnode"
sceneDataCA.note = "thescene"

If the file is saved and reloaded, you can access the CAs:

rootNodeDataCA = undefined
if(rootnode.custAttributes.count != 0) do
 rootNodeDataCA = rootnode.custAttributes[rootnode.custAttributes.count]
sceneDataCA = undefined
if(thescene.custAttributes.count != 0) do
 sceneDataCA = thescene.custAttributes[thescene.custAttributes.count]

If the file is brought in as an XRef scene, you can still access the CAs:

xr = xrefs.getXRefFile 1
xr_root = xr.tree
xr_rootNodeDataCA = undefined
if (xr_root.custAttributes.count != 0) do
 xr_rootNodeDataCA = xr_root.custAttributes[xr_root.custAttributes.count]

Building UI on Script/Expression Controller

By placing a scripted Custom Attributes definition on a script or expression controller, you can provide a custom UI for the controller.

  • Define the CA to contain animatable parameters and rollout for UI.

  • Create a script controller.

  • Apply the CA to the script controller.

  • Apply the script controller.

  • Create variables in the script controller.

  • Assign Target values to the variables, specifying the CA parameters as the targets.

  • Display the CA’s UI using createDialog or newRolloutFloater & addrollout

EXAMPLE

floatDataCADef = attributes floatDataCADef version:1
(
parameters main rollout:params
( prop1 type:#float ui:s_prop1 )
rollout params "Parameters"
( spinner s_prop1 "Prop1: ")
fn getRollout = params
)
 
sc = float_Script()
custattributes.add sc floatDataCADef
floatCA = sc.custattributes[1]
sc.addTarget "prop1" floatCA[#prop1]
 
displayControlDialog sc ""
 
mscas =for ca in sc.custattributes where isMSCustAttrib ca collect ca
rollouts =for ca in mscas where isproperty ca #getrollout collect ca.getrollout()
if rollouts.count == 1 then
 createdialog rollouts[1]
else if rollouts.count > 1 do
(
 width = rollouts[1].width
 for ro in rollouts do
  width = amax width ro.width
 rof = newrolloutfloater "" (width+13) 0 0 0
 for ro in rollouts do addrollout ro rof
 height = 6
 for ro in rollouts do
  height += ro.height + 24
 rof.size = [rof.size.x,height]
)

Was this information helpful?