- Getting the current selection the BAD way:
To get the current selection in the viewport one CAN (but should not, unless for testing) use the “$” symbol
--This takes the current selection and stores it in a variable MySelection = $
The Problem with this is…
- If you have nothing selected
MySelection = undefined (this is 3dsmax version of null in other languages) - If you have ONE object selected
MySelection = $box001 —the selected object for example - But if you have MORE then one you get an array of objects
MySelection = #( $box001, $box002, $sphere003)
So the resulting data type you get when using the $ symbol differs from
undefined, node or array. Which makes it complicated to use in a user friendly script.
- Getting the current selection the SMART way:
--This takes the current selection and creates an array of it.. MySelection = selection as array --the important thing is the "as array" command --it forces the selection to always be an array
The good thing with this is that it ALWAYS returns an ARRAY
- If you have nothing selected you get an empty array
MySelection = #() - If you have ONE object selected you get a array with one item
MySelection = #( $box001 )
- If you have MORE then one you get an array of objects
MySelection = #( $box001, $box002, $sphere003 )
Since you get the same datatype (an array) every time it is easier to write the rest of the code since you know that you ALWAYS get an array back.
- Select a certain object already in the scene
--if you know exactly the name of the object --you want to select do: select $myBox001 --If I have an object called myBox001 in the scene --if you want to select many objects at the same time --use an array instead select #( $object01,$object02,$object03 )
- Select all objects that has a name that begins with “box”
you can use wildcard selection--Select all object that has a name that begins with Box select $Box* --Select all objects in the scene select $* --You can also use object sets.. --It is some predefined categories --that is handy to have when you --want to edit all of the same type select objects --selects all objects select cameras --selects all cameras /* objects --all the objects geometry --the standard 3ds Max categories... lights cameras helpers shapes systems spacewarps selection --the current selection */
- Use the 3ds max dynamic ObjectSet array when you need to select all objects from a certain type..
--do print the names of all lights in the scene for myLight in lights do print myLight.name --move all helpers aka dummies, up 10 units --from where they currently are for myObj in helpers do myObj.pos += [0,0,10]
- Select all objects that has the material with the name “MyGreenMaterial”
(this version does not support multisub materials)--This command collects all object that --matches material.name == "MyGreenMaterial" TheObjectsWithGreenMat = for item in objects where item.material.name == "MyGreenMaterial" collect item --Then to select all objects I use the select command --and pass in the array we created above select TheObjectsWithGreenMat
- Select the head of the group, and only the topmost grouphead if it is a group in another group..
--how to get the node that is the main group object... so that you can move a group around --I also check that I am affecting the topmost object.. item.parent == undefined myNodes = selection as array TopNodeOfGroupArray = for item in myNodes where (isGroupHead item) == true and item.parent == undefined or isgroupmember item == false collect item --move all nodes to the center for MoveNode in TopNodeOfGroupArray do ( MoveNode.pos = [0,0,0] )