-- ----------------------------------------------------------------------- -- MAXScript Procedural Array -- "r7_procedural_array.ms" -- ----------------------------------------------------------------------- -- AUTHOR: Markus Boos -- COMPANY: project|gemini -- CONTACT: relief7@projectgemini.net -- COPYRIGHT: 2007-2010. Markus Boos. All Rights Reserved -- CREATION DATE: 2009-03-01 (YYYY-MM-DD) -- MAX Version: 2008-2010 -- ----------------------------------------------------------------------- /* -------------------------------------------------------------------------- INSTRUCTIONS -------------------------------------------------------------------------- This script allows you to create procedural arrays which stay editable even after you close and reopen the file. The array objects are linked to a parent helper which you can transform to your liking while still keeping array qualities. Running the script: Drag & Drop the script into MAX's viewport or start it via MAXScript -> Run Script Usage: 1. A dialog opens. Click and select the source object in your scene (currently only instances are supported). 2. The master array node (yellow point helper) and one instance will be created at [0,0,0]. 3. Move, rotate and scale the master array node into place (instances are linked to it). 4. Change number of instances in each dimension (1D, 2D and 3D) and distance between objects to your liking. 5. Check "auto-distance" if you want the script to place one object right next to each other (without any gaps). This is based on the bounding box on the object. Does not work that well if source object is transformed (scaled, rotated). (currently not working) 6. "Center around master" means all instances will be placed around the master array node, instead of starting to place elements there and continue in one direction. (currently not working) 7. The scale values allow you to locally scale the instances without affecting the source object. 8. Similar to 7, just changing the rotation values. 9. After you are done. Close the tool window and continue working. If you want to change an existing array: 1. Reopen the tool. 2. Click and click the master array node. 3. The last settings are read in from the master node. 3. If you want to change anything, you need to have an instance selected as well because with every change the array needs to be rebuilt and the script needs to know which element is the source element. So you need to make a copy of an existing array element and use that as your geo node: . 4. Then change to your liking and array will be rebuilt dynamically. Attention: Do not delete the master array node or its modifier. Otherwise the array will lose its ability to be changed. After that it will be treated as any other collapsed max array. The auto-distance option only works in MAX 2008 and higher. -------------------------------------------------------------------------- VERSION HISTORY -------------------------------------------------------------------------- Version 0.01 2007-03-01 - Markus Boos - relief7@projectgemini.net - initial script created Version 0.02 2009-05-15 - Markus Boos - relief7@projectgemini.net - modified it to be more like MAX's native array tool - added multipliers for non-constant steps -------------------------------------------------------------------------- BUGS / KNOWN ISSUES -------------------------------------------------------------------------- - auto distance does not work for objects other than geom objects like Box, Sphere etc. (use snapshot instead) -------------------------------------------------------------------------- TODO ITEMS / WISHLIST -------------------------------------------------------------------------- -randomize functionality -incremental, multiplier functionality -start, end distance, log distance -make it like max array tool -create a filter function for master nodes (check for existence of custom attributes) */ ( -- --------------------------------------------------- -- SETUP -- --------------------------------------------------- -- --------------------------------------------------- -- GLOBAL VARIABLES -- --------------------------------------------------- -- global rollout floater variable global rofTool -- --------------------------------------------------- -- CUSTOM ATTRIBUTE DEFINITIONS -- --------------------------------------------------- CADefArrayControl = attributes caArrayControl attribId:#(0x72dcf469, 0xc133030) ( parameters main -- rollout: roHeliControl ( fCount1D type:#integer default: 1 fCount2D type:#integer default: 1 fCount3D type:#integer default: 1 -- pos f1DPosAbsX type:#float default: 0.0 f1DPosAbsY type:#float default: 0.0 f1DPosAbsZ type:#float default: 0.0 f1DPosStepX type:#float default: 10.0 f1DPosStepY type:#float default: 0.0 f1DPosStepZ type:#float default: 0.0 f1DPosMultX type:#float default: 1.0 f1DPosMultY type:#float default: 1.0 f1DPosMultZ type:#float default: 1.0 -- rot f1DRotAbsX type:#float default: 0.0 f1DRotAbsY type:#float default: 0.0 f1DRotAbsZ type:#float default: 0.0 f1DRotStepX type:#float default: 0.0 f1DRotStepY type:#float default: 0.0 f1DRotStepZ type:#float default: 0.0 f1DRotMultX type:#float default: 1.0 f1DRotMultY type:#float default: 1.0 f1DRotMultZ type:#float default: 1.0 -- scale f1DScaleAbsX type:#float default: 1.0 f1DScaleAbsY type:#float default: 1.0 f1DScaleAbsZ type:#float default: 1.0 f1DScaleStepX type:#float default: 0.0 f1DScaleStepY type:#float default: 0.0 f1DScaleStepZ type:#float default: 0.0 f1DScaleMultX type:#float default: 1.0 f1DScaleMultY type:#float default: 1.0 f1DScaleMultZ type:#float default: 1.0 -- 2D ------------ -- pos f2DPosAbsX type:#float default: 0.0 f2DPosAbsY type:#float default: 0.0 f2DPosAbsZ type:#float default: 0.0 f2DPosStepX type:#float default: 10.0 f2DPosStepY type:#float default: 0.0 f2DPosStepZ type:#float default: 0.0 f2DPosMultX type:#float default: 1.0 f2DPosMultY type:#float default: 1.0 f2DPosMultZ type:#float default: 1.0 -- rot f2DRotAbsX type:#float default: 0.0 f2DRotAbsY type:#float default: 0.0 f2DRotAbsZ type:#float default: 0.0 f2DRotStepX type:#float default: 0.0 f2DRotStepY type:#float default: 0.0 f2DRotStepZ type:#float default: 0.0 f2DRotMultX type:#float default: 1.0 f2DRotMultY type:#float default: 1.0 f2DRotMultZ type:#float default: 1.0 -- scale f2DScaleAbsX type:#float default: 1.0 f2DScaleAbsY type:#float default: 1.0 f2DScaleAbsZ type:#float default: 1.0 f2DScaleStepX type:#float default: 0.0 f2DScaleStepY type:#float default: 0.0 f2DScaleStepZ type:#float default: 0.0 f2DScaleMultX type:#float default: 1.0 f2DScaleMultY type:#float default: 1.0 f2DScaleMultZ type:#float default: 1.0 -- 3D ------------ -- pos f3DPosAbsX type:#float default: 0.0 f3DPosAbsY type:#float default: 0.0 f3DPosAbsZ type:#float default: 0.0 f3DPosStepX type:#float default: 10.0 f3DPosStepY type:#float default: 0.0 f3DPosStepZ type:#float default: 0.0 f3DPosMultX type:#float default: 1.0 f3DPosMultY type:#float default: 1.0 f3DPosMultZ type:#float default: 1.0 -- rot f3DRotAbsX type:#float default: 0.0 f3DRotAbsY type:#float default: 0.0 f3DRotAbsZ type:#float default: 0.0 f3DRotStepX type:#float default: 0.0 f3DRotStepY type:#float default: 0.0 f3DRotStepZ type:#float default: 0.0 f3DRotMultX type:#float default: 1.0 f3DRotMultY type:#float default: 1.0 f3DRotMultZ type:#float default: 1.0 -- scale f3DScaleAbsX type:#float default: 1.0 f3DScaleAbsY type:#float default: 1.0 f3DScaleAbsZ type:#float default: 1.0 f3DScaleStepX type:#float default: 0.0 f3DScaleStepY type:#float default: 0.0 f3DScaleStepZ type:#float default: 0.0 f3DScaleMultX type:#float default: 1.0 f3DScaleMultY type:#float default: 1.0 f3DScaleMultZ type:#float default: 1.0 bCenter type:#boolean default: false bAutoDistance type:#boolean default: false ) ) -- --------------------------------------------------- -- FUNCTION DEFINITIONS -- --------------------------------------------------- function calcValue fStart fDist fMultiplier iIndex = ( local fValue = 0.0 local fStep = fMultiplier * fDist for i = 1 to iIndex do ( -- central calculation for every step fValue += fStep fStep = fStep * fMultiplier ) fStart + fValue ) -- --------------------------------------------------- -- ROLLOUT DEFINITIONS -- --------------------------------------------------- function filterGeo obj = ( superclassOf obj == GeometryClass ) Rollout roProceduralArray "Procedural Array" ( -- --------------------------------------------------- -- ROLLOUT FUNCTIONS -- --------------------------------------------------- -- --------------------------------------------------- -- ROLLOUT UI ELEMENTS -- --------------------------------------------------- label lblGeoNode "Array element:" pos: [10, 6] label lblMasterNode "Array master:" pos: [10, 30] pickbutton pbGeoNode "" message: "pick geometry node" filter: filterGeo autoDisplay:true width: 100 pos: [90, 2] pickbutton pbRoot "" message: "pick root node" autoDisplay:true width: 100 pos: [90, 26] --groupBox grp1D "1D" pos:[5, 50] width:274 height:80 spinner spCount1D "count 1D" type: #integer range: [1, 99999, 1] fieldwidth: 25 across: 3 --pos: [10, 54] spinner spCount2D "count 2D" type: #integer range: [1, 99999, 1] fieldwidth: 25 --pos: [10, 74] spinner spCount3D "count 3D" type: #integer range: [1, 99999, 1] fieldwidth: 25 --pos: [10, 94] -- 1D -- label lbl1DPosX "X" pos: [10, 200] across: 4 -- pos spinner sp1DPosAbsX "pos" type: #worldunits range: [-99999, 99999, 0] fieldwidth: 45 enabled: false offset: [0, 20] across: 3 --pos: [110, 54] spinner sp1DPosStepX "step" type: #worldunits range: [-99999, 99999, 10] fieldwidth: 45 offset: [0, 20]--pos: [110, 54] spinner sp1DPosMultX "mult" type: #float range: [0, 99999, 1.0] fieldwidth: 45 offset: [0, 20] --pos: [210, 54] spinner sp1DPosAbsY "pos" type: #worldunits range: [-99999, 99999, 0] fieldwidth: 45 enabled: false across: 3 --pos: [110, 54] spinner sp1DPosStepY "step" type: #worldunits range: [-99999, 99999, 0] fieldwidth: 45 --pos: [110, 54] spinner sp1DPosMultY "mult" type: #float range: [0, 99999, 1.0] fieldwidth: 45 --pos: [210, 54] spinner sp1DPosAbsZ "pos" type: #worldunits range: [-99999, 99999, 0] fieldwidth: 45 enabled: false across: 3 --pos: [110, 54] spinner sp1DPosStepZ "step" type: #worldunits range: [-99999, 99999, 0] fieldwidth: 45 --pos: [110, 54] spinner sp1DPosMultZ "mult" type: #float range: [0, 99999, 1.0] fieldwidth: 45 --pos: [210, 54] -- rot spinner sp1DRotAbsX "rot" type: #worldunits range: [-99999, 99999, 0] fieldwidth: 45 across: 3--pos: [110, 54] spinner sp1DRotStepX "step" type: #worldunits range: [-99999, 99999, 0] fieldwidth: 45 --pos: [110, 54] spinner sp1DRotMultX "mult" type: #float range: [0, 99999, 1.0] fieldwidth: 45 --pos: [210, 54] spinner sp1DRotAbsY "rot" type: #worldunits range: [-99999, 99999, 0] fieldwidth: 45 across: 3--pos: [110, 54] spinner sp1DRotStepY "step" type: #worldunits range: [-99999, 99999, 0] fieldwidth: 45 --pos: [110, 54] spinner sp1DRotMultY "mult" type: #float range: [0, 99999, 1.0] fieldwidth: 45 --pos: [210, 54] spinner sp1DRotAbsZ "rot" type: #worldunits range: [-99999, 99999, 0] fieldwidth: 45 across: 3--pos: [110, 54] spinner sp1DRotStepZ "step" type: #worldunits range: [-99999, 99999, 0] fieldwidth: 45 --pos: [110, 54] spinner sp1DRotMultZ "mult" type: #float range: [0, 99999, 1.0] fieldwidth: 45 --pos: [210, 54] -- scale spinner sp1DScaleAbsX "scale" type: #worldunits range: [-99999, 99999, 1] fieldwidth: 45 across: 3 --pos: [110, 54] spinner sp1DScaleStepX "step" type: #float range: [-99999, 99999, 0.0] fieldwidth: 45 --pos: [10, 154] spinner sp1DScaleMultX "mult" type: #float range: [0, 99999, 1.0] fieldwidth: 45 --pos: [210, 54] spinner sp1DScaleAbsY "scale" type: #worldunits range: [-99999, 99999, 1] fieldwidth: 45 across: 3 --pos: [110, 54] spinner sp1DScaleStepY "step" type: #float range: [-99999, 99999, 0.0] fieldwidth: 45 --pos: [10, 154] spinner sp1DScaleMultY "mult" type: #float range: [0, 99999, 1.0] fieldwidth: 45 --pos: [210, 54] spinner sp1DScaleAbsZ "scale" type: #worldunits range: [-99999, 99999, 1] fieldwidth: 45 across: 3 --pos: [110, 54] spinner sp1DScaleStepZ "step" type: #float range: [-99999, 99999, 0.0] fieldwidth: 45 --pos: [10, 154] spinner sp1DScaleMultZ "mult" type: #float range: [0, 99999, 1.0] fieldwidth: 45 --pos: [210, 54] groupBox grp1D "1D" pos:[5, 74] width:274 height:210 -- 2D -- pos spinner sp2DPosAbsX "pos" type: #worldunits range: [-99999, 99999, 0] fieldwidth: 45 enabled: false across: 3 offset: [0, 20] --pos: [110, 54] spinner sp2DPosStepX "step" type: #worldunits range: [-99999, 99999, 0] fieldwidth: 45 offset: [0, 20] --pos: [110, 54] spinner sp2DPosMultX "mult" type: #float range: [0, 99999, 1.0] fieldwidth: 45 offset: [0, 20] --pos: [210, 54] spinner sp2DPosAbsY "pos" type: #worldunits range: [-99999, 99999, 0] fieldwidth: 45 enabled: false across: 3 --pos: [110, 54] spinner sp2DPosStepY "step" type: #worldunits range: [-99999, 99999, 10] fieldwidth: 45 --pos: [110, 54] spinner sp2DPosMultY "mult" type: #float range: [0, 99999, 1.0] fieldwidth: 45 --pos: [210, 54] spinner sp2DPosAbsZ "pos" type: #worldunits range: [-99999, 99999, 0] fieldwidth: 45 enabled: false across: 3 --pos: [110, 54] spinner sp2DPosStepZ "step" type: #worldunits range: [-99999, 99999, 0] fieldwidth: 45 --pos: [110, 54] spinner sp2DPosMultZ "mult" type: #float range: [0, 99999, 1.0] fieldwidth: 45 --pos: [210, 54] -- rot spinner sp2DRotAbsX "rot" type: #worldunits range: [-99999, 99999, 0] fieldwidth: 45 across: 3 enabled: false --pos: [110, 54] spinner sp2DRotStepX "step" type: #worldunits range: [-99999, 99999, 0] fieldwidth: 45 --pos: [110, 54] spinner sp2DRotMultX "mult" type: #float range: [0, 99999, 1.0] fieldwidth: 45 --pos: [210, 54] spinner sp2DRotAbsY "rot" type: #worldunits range: [-99999, 99999, 0] fieldwidth: 45 across: 3 enabled: false --pos: [110, 54] spinner sp2DRotStepY "step" type: #worldunits range: [-99999, 99999, 0] fieldwidth: 45 --pos: [110, 54] spinner sp2DRotMultY "mult" type: #float range: [0, 99999, 1.0] fieldwidth: 45 --pos: [210, 54] spinner sp2DRotAbsZ "rot" type: #worldunits range: [-99999, 99999, 0] fieldwidth: 45 across: 3 enabled: false --pos: [110, 54] spinner sp2DRotStepZ "step" type: #worldunits range: [-99999, 99999, 0] fieldwidth: 45 --pos: [110, 54] spinner sp2DRotMultZ "mult" type: #float range: [0, 99999, 1.0] fieldwidth: 45 --pos: [210, 54] -- scale spinner sp2DScaleAbsX "scale" type: #worldunits range: [-99999, 99999, 0] fieldwidth: 45 across: 3 enabled: false --pos: [110, 54] spinner sp2DScaleStepX "step" type: #float range: [-99999, 99999, 0.0] fieldwidth: 45 --pos: [10, 154] spinner sp2DScaleMultX "mult" type: #float range: [0, 99999, 1.0] fieldwidth: 45 --pos: [210, 54] spinner sp2DScaleAbsY "scale" type: #worldunits range: [-99999, 99999, 0] fieldwidth: 45 across: 3 enabled: false --pos: [110, 54] spinner sp2DScaleStepY "step" type: #float range: [-99999, 99999, 0.0] fieldwidth: 45 --pos: [10, 154] spinner sp2DScaleMultY "mult" type: #float range: [0, 99999, 1.0] fieldwidth: 45 --pos: [210, 54] spinner sp2DScaleAbsZ "scale" type: #worldunits range: [-99999, 99999, 0] fieldwidth: 45 across: 3 enabled: false --pos: [110, 54] spinner sp2DScaleStepZ "step" type: #float range: [-99999, 99999, 0.0] fieldwidth: 45 --pos: [10, 154] spinner sp2DScaleMultZ "mult" type: #float range: [0, 99999, 1.0] fieldwidth: 45 --pos: [210, 54] groupBox grp2D "2D" pos:[5, 294] width:274 height:210 -- 3D -- pos spinner sp3DPosAbsX "pos" type: #worldunits range: [-99999, 99999, 0] fieldwidth: 45 enabled: false across: 3 offset: [0, 20] --pos: [110, 54] spinner sp3DPosStepX "step" type: #worldunits range: [-99999, 99999, 0] fieldwidth: 45 offset: [0, 20] --pos: [110, 54] spinner sp3DPosMultX "mult" type: #float range: [0, 99999, 1.0] fieldwidth: 45 offset: [0, 20] --pos: [210, 54] spinner sp3DPosAbsY "pos" type: #worldunits range: [-99999, 99999, 0] fieldwidth: 45 enabled: false across: 3 --pos: [110, 54] spinner sp3DPosStepY "step" type: #worldunits range: [-99999, 99999, 0] fieldwidth: 45 --pos: [110, 54] spinner sp3DPosMultY "mult" type: #float range: [0, 99999, 1.0] fieldwidth: 45 --pos: [210, 54] spinner sp3DPosAbsZ "pos" type: #worldunits range: [-99999, 99999, 0] fieldwidth: 45 enabled: false across: 3 --pos: [110, 54] spinner sp3DPosStepZ "step" type: #worldunits range: [-99999, 99999, 10] fieldwidth: 45 --pos: [110, 54] spinner sp3DPosMultZ "mult" type: #float range: [0, 99999, 1.0] fieldwidth: 45 --pos: [210, 54] -- rot spinner sp3DRotAbsX "rot" type: #worldunits range: [-99999, 99999, 0] fieldwidth: 45 across: 3 enabled: false --pos: [110, 54] spinner sp3DRotStepX "step" type: #worldunits range: [-99999, 99999, 0] fieldwidth: 45 --pos: [110, 54] spinner sp3DRotMultX "mult" type: #float range: [0, 99999, 1.0] fieldwidth: 45 --pos: [210, 54] spinner sp3DRotAbsY "rot" type: #worldunits range: [-99999, 99999, 0] fieldwidth: 45 across: 3 enabled: false --pos: [110, 54] spinner sp3DRotStepY "step" type: #worldunits range: [-99999, 99999, 0] fieldwidth: 45 --pos: [110, 54] spinner sp3DRotMultY "mult" type: #float range: [0, 99999, 1.0] fieldwidth: 45 --pos: [210, 54] spinner sp3DRotAbsZ "rot" type: #worldunits range: [-99999, 99999, 0] fieldwidth: 45 across: 3 enabled: false --pos: [110, 54] spinner sp3DRotStepZ "step" type: #worldunits range: [-99999, 99999, 0] fieldwidth: 45 --pos: [110, 54] spinner sp3DRotMultZ "mult" type: #float range: [0, 99999, 1.0] fieldwidth: 45 --pos: [210, 54] -- scale spinner sp3DScaleAbsX "scale" type: #worldunits range: [-99999, 99999, 0] fieldwidth: 45 across: 3 enabled: false --pos: [110, 54] spinner sp3DScaleStepX "step" type: #float range: [-99999, 99999, 0.0] fieldwidth: 45 --pos: [10, 154] spinner sp3DScaleMultX "mult" type: #float range: [0, 99999, 1.0] fieldwidth: 45 --pos: [210, 54] spinner sp3DScaleAbsY "scale" type: #worldunits range: [-99999, 99999, 0] fieldwidth: 45 across: 3 enabled: false --pos: [110, 54] spinner sp3DScaleStepY "step" type: #float range: [-99999, 99999, 0.0] fieldwidth: 45 --pos: [10, 154] spinner sp3DScaleMultY "mult" type: #float range: [0, 99999, 1.0] fieldwidth: 45 --pos: [210, 54] spinner sp3DScaleAbsZ "scale" type: #worldunits range: [-99999, 99999, 0] fieldwidth: 45 across: 3 enabled: false --pos: [110, 54] spinner sp3DScaleStepZ "step" type: #float range: [-99999, 99999, 0.0] fieldwidth: 45 --pos: [10, 154] spinner sp3DScaleMultZ "mult" type: #float range: [0, 99999, 1.0] fieldwidth: 45 --pos: [210, 54] groupBox grp3D "3D" pos:[5, 514] width:274 height:210 checkbox cbAutoDistance "auto distance (by BBox)" enabled: false --pos: [50, 114] enabled: false checkbox cbCenter "center around master" enabled: false --pos: [50, 134] -- --------------------------------------------------- -- EVENT HANDLER(S) -- --------------------------------------------------- function doUpdate = ( -- center around master can only be active for translation multipliers of 1 -- start x, y, z position, distance and scale values -- check if auto distance is checked -- if ( cbAutoDistance.checked ) then -- ( -- local bbGeo = undefined -- -- if pbGeoNode.object != undefined then -- ( -- -- calculate bounding box of geo object -- bbGeo = nodeGetBoundingBox pbGeoNode.object ( matrix3 1 ) -- -- fDistX = ( bbGeo [2].x - bbGeo[1].x ) * fScaleX -- fDistY = ( bbGeo [2].y - bbGeo[1].y ) * fScaleY -- fDistZ = ( bbGeo [2].z - bbGeo[1].z ) * fScaleZ -- ) -- ) -- -- -- check if center is checked -- if ( cbCenter.checked ) then -- ( -- fStartX = -( spCount1D.value - 1 ) * fDistX / 2.0 -- fStartY = -( spCount2D.value - 1 ) * fDistY / 2.0 -- fStartZ = -( spCount3D.value - 1 ) * fDistZ / 2.0 -- ) -- save old root transform local mRoot = matrix3 1 if pbRoot.object != undefined then ( mRoot = pbRoot.object.transform for obj in pbRoot.object.children do ( delete obj ) delete pbRoot.object pbRoot.object = undefined ) -- create root helper objHlp = Point cross: true box: true wirecolor: yellow transform: mRoot size: 10 name: ( uniqueName "Master_Array_Node" ) addModifier objHlp ( EmptyModifier () ) objHlp.modifiers[#Attribute_Holder].name = "ArrayControl" -- add custom attribute custAttributes.add objHlp.modifiers[#ArrayControl] CADefArrayControl objHlp.modifiers[#ArrayControl].caArrayControl.fCount1D = spCount1D.value objHlp.modifiers[#ArrayControl].caArrayControl.fCount2D = spCount2D.value objHlp.modifiers[#ArrayControl].caArrayControl.fCount3D = spCount3D.value -- 1D objHlp.modifiers[#ArrayControl].caArrayControl.f1DPosAbsX = sp1DPosAbsX.value objHlp.modifiers[#ArrayControl].caArrayControl.f1DPosAbsY = sp1DPosAbsY.value objHlp.modifiers[#ArrayControl].caArrayControl.f1DPosAbsZ = sp1DPosAbsZ.value objHlp.modifiers[#ArrayControl].caArrayControl.f1DPosStepX = sp1DPosStepX.value objHlp.modifiers[#ArrayControl].caArrayControl.f1DPosStepY = sp1DPosStepY.value objHlp.modifiers[#ArrayControl].caArrayControl.f1DPosStepZ = sp1DPosStepZ.value objHlp.modifiers[#ArrayControl].caArrayControl.f1DPosMultX = sp1DPosMultX.value objHlp.modifiers[#ArrayControl].caArrayControl.f1DPosMultY = sp1DPosMultY.value objHlp.modifiers[#ArrayControl].caArrayControl.f1DPosMultZ = sp1DPosMultZ.value -- rot objHlp.modifiers[#ArrayControl].caArrayControl.f1DRotAbsX = sp1DRotAbsX.value objHlp.modifiers[#ArrayControl].caArrayControl.f1DRotAbsY = sp1DRotAbsY.value objHlp.modifiers[#ArrayControl].caArrayControl.f1DRotAbsZ = sp1DRotAbsZ.value objHlp.modifiers[#ArrayControl].caArrayControl.f1DRotStepX = sp1DRotStepX.value objHlp.modifiers[#ArrayControl].caArrayControl.f1DRotStepY = sp1DRotStepY.value objHlp.modifiers[#ArrayControl].caArrayControl.f1DRotStepZ = sp1DRotStepZ.value objHlp.modifiers[#ArrayControl].caArrayControl.f1DRotMultX = sp1DRotMultX.value objHlp.modifiers[#ArrayControl].caArrayControl.f1DRotMultY = sp1DRotMultY.value objHlp.modifiers[#ArrayControl].caArrayControl.f1DRotMultZ = sp1DRotMultZ.value -- scale objHlp.modifiers[#ArrayControl].caArrayControl.f1DScaleAbsX = sp1DScaleAbsX.value objHlp.modifiers[#ArrayControl].caArrayControl.f1DScaleAbsY = sp1DScaleAbsY.value objHlp.modifiers[#ArrayControl].caArrayControl.f1DScaleAbsZ = sp1DScaleAbsZ.value objHlp.modifiers[#ArrayControl].caArrayControl.f1DScaleStepX = sp1DScaleStepX.value objHlp.modifiers[#ArrayControl].caArrayControl.f1DScaleStepY = sp1DScaleStepY.value objHlp.modifiers[#ArrayControl].caArrayControl.f1DScaleStepZ = sp1DScaleStepZ.value objHlp.modifiers[#ArrayControl].caArrayControl.f1DScaleMultX = sp1DScaleMultX.value objHlp.modifiers[#ArrayControl].caArrayControl.f1DScaleMultY = sp1DScaleMultY.value objHlp.modifiers[#ArrayControl].caArrayControl.f1DScaleMultZ = sp1DScaleMultZ.value -- 2D objHlp.modifiers[#ArrayControl].caArrayControl.f2DPosAbsX = sp2DPosAbsX.value objHlp.modifiers[#ArrayControl].caArrayControl.f2DPosAbsY = sp2DPosAbsY.value objHlp.modifiers[#ArrayControl].caArrayControl.f2DPosAbsZ = sp2DPosAbsZ.value objHlp.modifiers[#ArrayControl].caArrayControl.f2DPosStepX = sp2DPosStepX.value objHlp.modifiers[#ArrayControl].caArrayControl.f2DPosStepY = sp2DPosStepY.value objHlp.modifiers[#ArrayControl].caArrayControl.f2DPosStepZ = sp2DPosStepZ.value objHlp.modifiers[#ArrayControl].caArrayControl.f2DPosMultX = sp2DPosMultX.value objHlp.modifiers[#ArrayControl].caArrayControl.f2DPosMultY = sp2DPosMultY.value objHlp.modifiers[#ArrayControl].caArrayControl.f2DPosMultZ = sp2DPosMultZ.value -- rot objHlp.modifiers[#ArrayControl].caArrayControl.f2DRotAbsX = sp2DRotAbsX.value objHlp.modifiers[#ArrayControl].caArrayControl.f2DRotAbsY = sp2DRotAbsY.value objHlp.modifiers[#ArrayControl].caArrayControl.f2DRotAbsZ = sp2DRotAbsZ.value objHlp.modifiers[#ArrayControl].caArrayControl.f2DRotStepX = sp2DRotStepX.value objHlp.modifiers[#ArrayControl].caArrayControl.f2DRotStepY = sp2DRotStepY.value objHlp.modifiers[#ArrayControl].caArrayControl.f2DRotStepZ = sp2DRotStepZ.value objHlp.modifiers[#ArrayControl].caArrayControl.f2DRotMultX = sp2DRotMultX.value objHlp.modifiers[#ArrayControl].caArrayControl.f2DRotMultY = sp2DRotMultY.value objHlp.modifiers[#ArrayControl].caArrayControl.f2DRotMultZ = sp2DRotMultZ.value -- scale objHlp.modifiers[#ArrayControl].caArrayControl.f2DScaleAbsX = sp2DScaleAbsX.value objHlp.modifiers[#ArrayControl].caArrayControl.f2DScaleAbsY = sp2DScaleAbsY.value objHlp.modifiers[#ArrayControl].caArrayControl.f2DScaleAbsZ = sp2DScaleAbsZ.value objHlp.modifiers[#ArrayControl].caArrayControl.f2DScaleStepX = sp2DScaleStepX.value objHlp.modifiers[#ArrayControl].caArrayControl.f2DScaleStepY = sp2DScaleStepY.value objHlp.modifiers[#ArrayControl].caArrayControl.f2DScaleStepZ = sp2DScaleStepZ.value objHlp.modifiers[#ArrayControl].caArrayControl.f2DScaleMultX = sp2DScaleMultX.value objHlp.modifiers[#ArrayControl].caArrayControl.f2DScaleMultY = sp2DScaleMultY.value objHlp.modifiers[#ArrayControl].caArrayControl.f2DScaleMultZ = sp2DScaleMultZ.value -- 3D objHlp.modifiers[#ArrayControl].caArrayControl.f3DPosAbsX = sp3DPosAbsX.value objHlp.modifiers[#ArrayControl].caArrayControl.f3DPosAbsY = sp3DPosAbsY.value objHlp.modifiers[#ArrayControl].caArrayControl.f3DPosAbsZ = sp3DPosAbsZ.value objHlp.modifiers[#ArrayControl].caArrayControl.f3DPosStepX = sp3DPosStepX.value objHlp.modifiers[#ArrayControl].caArrayControl.f3DPosStepY = sp3DPosStepY.value objHlp.modifiers[#ArrayControl].caArrayControl.f3DPosStepZ = sp3DPosStepZ.value objHlp.modifiers[#ArrayControl].caArrayControl.f3DPosMultX = sp3DPosMultX.value objHlp.modifiers[#ArrayControl].caArrayControl.f3DPosMultY = sp3DPosMultY.value objHlp.modifiers[#ArrayControl].caArrayControl.f3DPosMultZ = sp3DPosMultZ.value -- rot objHlp.modifiers[#ArrayControl].caArrayControl.f3DRotAbsX = sp3DRotAbsX.value objHlp.modifiers[#ArrayControl].caArrayControl.f3DRotAbsY = sp3DRotAbsY.value objHlp.modifiers[#ArrayControl].caArrayControl.f3DRotAbsZ = sp3DRotAbsZ.value objHlp.modifiers[#ArrayControl].caArrayControl.f3DRotStepX = sp3DRotStepX.value objHlp.modifiers[#ArrayControl].caArrayControl.f3DRotStepY = sp3DRotStepY.value objHlp.modifiers[#ArrayControl].caArrayControl.f3DRotStepZ = sp3DRotStepZ.value objHlp.modifiers[#ArrayControl].caArrayControl.f3DRotMultX = sp3DRotMultX.value objHlp.modifiers[#ArrayControl].caArrayControl.f3DRotMultY = sp3DRotMultY.value objHlp.modifiers[#ArrayControl].caArrayControl.f3DRotMultZ = sp3DRotMultZ.value -- scale objHlp.modifiers[#ArrayControl].caArrayControl.f3DScaleAbsX = sp3DScaleAbsX.value objHlp.modifiers[#ArrayControl].caArrayControl.f3DScaleAbsY = sp3DScaleAbsY.value objHlp.modifiers[#ArrayControl].caArrayControl.f3DScaleAbsZ = sp3DScaleAbsZ.value objHlp.modifiers[#ArrayControl].caArrayControl.f3DScaleStepX = sp3DScaleStepX.value objHlp.modifiers[#ArrayControl].caArrayControl.f3DScaleStepY = sp3DScaleStepY.value objHlp.modifiers[#ArrayControl].caArrayControl.f3DScaleStepZ = sp3DScaleStepZ.value objHlp.modifiers[#ArrayControl].caArrayControl.f3DScaleMultX = sp3DScaleMultX.value objHlp.modifiers[#ArrayControl].caArrayControl.f3DScaleMultY = sp3DScaleMultY.value objHlp.modifiers[#ArrayControl].caArrayControl.f3DScaleMultZ = sp3DScaleMultZ.value objHlp.modifiers[#ArrayControl].caArrayControl.bCenter = cbCenter.checked objHlp.modifiers[#ArrayControl].caArrayControl.bAutoDistance = cbAutoDistance.checked -- parent array elements to helper pbRoot.object = objHlp if pbGeoNode.object != undefined then ( for iIndex1D = 0 to spCount1D.value - 1 do ( for iIndex2D = 0 to spCount2D.value - 1 do ( for iIndex3D = 0 to spCount3D.value - 1 do ( local obj = instance pbGeoNode.object wirecolor: ( color 100 100 100 ) obj.transform = matrix3 1 -- calculate position local fPosX = ( calcValue sp1DPosAbsX.value sp1DPosStepX.value sp1DPosMultX.value iIndex1D ) + ( calcValue 0.0 sp2DPosStepX.value sp2DPosMultX.value iIndex2D ) + ( calcValue 0.0 sp3DPosStepX.value sp3DPosMultX.value iIndex3D ) local fPosY = ( calcValue sp1DPosAbsY.value sp1DPosStepY.value sp1DPosMultY.value iIndex1D ) + ( calcValue 0.0 sp2DPosStepY.value sp2DPosMultY.value iIndex2D ) + ( calcValue 0.0 sp3DPosStepY.value sp3DPosMultY.value iIndex3D ) local fPosZ = ( calcValue sp1DPosAbsZ.value sp1DPosStepZ.value sp1DPosMultZ.value iIndex1D ) + ( calcValue 0.0 sp2DPosStepZ.value sp2DPosMultZ.value iIndex2D ) + ( calcValue 0.0 sp3DPosStepZ.value sp3DPosMultZ.value iIndex3D ) obj.pos = [ fPosX, fPosY, fPosZ ] -- apply rotation local fRotX = ( calcValue sp1DRotAbsX.value sp1DRotStepX.value sp1DRotMultX.value iIndex1D ) + ( calcValue sp2DRotAbsX.value sp2DRotStepX.value sp2DRotMultX.value iIndex2D ) + ( calcValue sp3DRotAbsX.value sp3DRotStepX.value sp3DRotMultX.value iIndex3D ) rot = eulerangles fRotX 0 0 rotate obj rot local fRotY = ( calcValue sp1DRotAbsY.value sp1DRotStepY.value sp1DRotMultY.value iIndex1D ) + ( calcValue sp2DRotAbsY.value sp2DRotStepY.value sp2DRotMultY.value iIndex2D ) + ( calcValue sp3DRotAbsY.value sp3DRotStepY.value sp3DRotMultY.value iIndex3D ) rot = eulerangles 0 fRotY 0 rotate obj rot local fRotZ = ( calcValue sp1DRotAbsZ.value sp1DRotStepZ.value sp1DRotMultZ.value iIndex1D ) + ( calcValue sp2DRotAbsZ.value sp2DRotStepZ.value sp2DRotMultZ.value iIndex2D ) + ( calcValue sp3DRotAbsZ.value sp3DRotStepZ.value sp3DRotMultZ.value iIndex3D ) rot = eulerangles 0 0 fRotZ rotate obj rot local fScaleX = ( calcValue sp1DScaleAbsX.value sp1DScaleStepX.value sp1DScaleMultX.value iIndex1D ) + ( calcValue sp2DScaleAbsX.value sp2DScaleStepX.value sp2DScaleMultX.value iIndex2D ) + ( calcValue sp3DScaleAbsX.value sp3DScaleStepX.value sp3DScaleMultX.value iIndex3D ) local fScaleY = ( calcValue sp1DScaleAbsY.value sp1DScaleStepY.value sp1DScaleMultY.value iIndex1D ) + ( calcValue sp2DScaleAbsY.value sp2DScaleStepY.value sp2DScaleMultY.value iIndex2D ) + ( calcValue sp3DScaleAbsY.value sp3DScaleStepY.value sp3DScaleMultY.value iIndex3D ) local fScaleZ = ( calcValue sp1DScaleAbsZ.value sp1DScaleStepZ.value sp1DScaleMultZ.value iIndex1D ) + ( calcValue sp2DScaleAbsZ.value sp2DScaleStepZ.value sp2DScaleMultZ.value iIndex2D ) + ( calcValue sp3DScaleAbsZ.value sp3DScaleStepZ.value sp3DScaleMultZ.value iIndex3D ) obj.scale = [ fScaleX, fScaleY, fScaleZ ] obj.transform *= mRoot obj.parent = objHlp ) ) ) ) ) on pbGeoNode picked objRoot do ( doUpdate() ) on pbRoot picked objRoot do ( -- try to read values from helper spCount1D.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.fCount1D spCount2D.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.fCount2D spCount3D.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.fCount3D -- 1D -- pos sp1DPosAbsX.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f1DPosAbsX sp1DPosAbsY.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f1DPosAbsY sp1DPosAbsZ.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f1DPosAbsZ sp1DPosStepX.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f1DPosStepX sp1DPosStepY.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f1DPosStepY sp1DPosStepZ.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f1DPosStepZ sp1DPosMultX.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f1DPosMultX sp1DPosMultY.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f1DPosMultY sp1DPosMultZ.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f1DPosMultZ -- rot sp1DRotAbsX.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f1DRotAbsX sp1DRotAbsY.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f1DRotAbsY sp1DRotAbsZ.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f1DRotAbsZ sp1DRotStepX.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f1DRotStepX sp1DRotStepY.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f1DRotStepY sp1DRotStepZ.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f1DRotStepZ sp1DRotMultX.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f1DRotMultX sp1DRotMultY.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f1DRotMultY sp1DRotMultZ.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f1DRotMultZ -- scale sp1DScaleAbsX.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f1DScaleAbsX sp1DScaleAbsY.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f1DScaleAbsY sp1DScaleAbsZ.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f1DScaleAbsZ sp1DScaleStepX.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f1DScaleStepX sp1DScaleStepY.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f1DScaleStepY sp1DScaleStepZ.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f1DScaleStepZ sp1DScaleMultX.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f1DScaleMultX sp1DScaleMultY.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f1DScaleMultY sp1DScaleMultZ.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f1DScaleMultZ -- 2D -- pos sp2DPosAbsX.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f2DPosAbsX sp2DPosAbsY.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f2DPosAbsY sp2DPosAbsZ.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f2DPosAbsZ sp2DPosStepX.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f2DPosStepX sp2DPosStepY.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f2DPosStepY sp2DPosStepZ.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f2DPosStepZ sp2DPosMultX.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f2DPosMultX sp2DPosMultY.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f2DPosMultY sp2DPosMultZ.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f2DPosMultZ -- rot sp2DRotAbsX.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f2DRotAbsX sp2DRotAbsY.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f2DRotAbsY sp2DRotAbsZ.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f2DRotAbsZ sp2DRotStepX.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f2DRotStepX sp2DRotStepY.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f2DRotStepY sp2DRotStepZ.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f2DRotStepZ sp2DRotMultX.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f2DRotMultX sp2DRotMultY.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f2DRotMultY sp2DRotMultZ.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f2DRotMultZ -- scale sp2DScaleAbsX.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f2DScaleAbsX sp2DScaleAbsY.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f2DScaleAbsY sp2DScaleAbsZ.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f2DScaleAbsZ sp2DScaleStepX.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f2DScaleStepX sp2DScaleStepY.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f2DScaleStepY sp2DScaleStepZ.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f2DScaleStepZ sp2DScaleMultX.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f2DScaleMultX sp2DScaleMultY.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f2DScaleMultY sp2DScaleMultZ.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f2DScaleMultZ -- 3D -- pos sp3DPosAbsX.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f3DPosAbsX sp3DPosAbsY.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f3DPosAbsY sp3DPosAbsZ.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f3DPosAbsZ sp3DPosStepX.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f3DPosStepX sp3DPosStepY.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f3DPosStepY sp3DPosStepZ.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f3DPosStepZ sp3DPosMultX.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f3DPosMultX sp3DPosMultY.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f3DPosMultY sp3DPosMultZ.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f3DPosMultZ -- rot sp3DRotAbsX.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f3DRotAbsX sp3DRotAbsY.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f3DRotAbsY sp3DRotAbsZ.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f3DRotAbsZ sp3DRotStepX.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f3DRotStepX sp3DRotStepY.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f3DRotStepY sp3DRotStepZ.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f3DRotStepZ sp3DRotMultX.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f3DRotMultX sp3DRotMultY.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f3DRotMultY sp3DRotMultZ.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f3DRotMultZ -- scale sp3DScaleAbsX.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f3DScaleAbsX sp3DScaleAbsY.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f3DScaleAbsY sp3DScaleAbsZ.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f3DScaleAbsZ sp3DScaleStepX.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f3DScaleStepX sp3DScaleStepY.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f3DScaleStepY sp3DScaleStepZ.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f3DScaleStepZ sp3DScaleMultX.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f3DScaleMultX sp3DScaleMultY.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f3DScaleMultY sp3DScaleMultZ.value = pbRoot.object.modifiers[#ArrayControl].caArrayControl.f3DScaleMultZ -- cbCenter.checked = pbRoot.object.modifiers[#ArrayControl].caArrayControl.bCenter -- cbAutoDistance.checked = pbRoot.object.modifiers[#ArrayControl].caArrayControl.bAutoDistance ) on spCount1D changed val do ( doUpdate() ) on spCount2D changed val do ( doUpdate() ) on spCount3D changed val do ( doUpdate() ) ------------------------ -- 1D ------------------------ -- position on sp1DPosAbsX changed val do ( doUpdate() ) on sp1DPosAbsY changed val do ( doUpdate() ) on sp1DPosAbsZ changed val do ( doUpdate() ) on sp1DPosStepX changed val do ( doUpdate() ) on sp1DPosStepY changed val do ( doUpdate() ) on sp1DPosStepZ changed val do ( doUpdate() ) on sp1DPosMultX changed val do ( doUpdate() ) on sp1DPosMultY changed val do ( doUpdate() ) on sp1DPosMultZ changed val do ( doUpdate() ) -- rotation on sp1DRotAbsX changed val do ( doUpdate() ) on sp1DRotAbsY changed val do ( doUpdate() ) on sp1DRotAbsZ changed val do ( doUpdate() ) on sp1DRotStepX changed val do ( doUpdate() ) on sp1DRotStepY changed val do ( doUpdate() ) on sp1DRotStepZ changed val do ( doUpdate() ) on sp1DRotMultX changed val do ( doUpdate() ) on sp1DRotMultY changed val do ( doUpdate() ) on sp1DRotMultZ changed val do ( doUpdate() ) -- scale on sp1DScaleAbsX changed val do ( doUpdate() ) on sp1DScaleAbsY changed val do ( doUpdate() ) on sp1DScaleAbsZ changed val do ( doUpdate() ) on sp1DScaleStepX changed val do ( doUpdate() ) on sp1DScaleStepY changed val do ( doUpdate() ) on sp1DScaleStepZ changed val do ( doUpdate() ) on sp1DScaleMultX changed val do ( doUpdate() ) on sp1DScaleMultY changed val do ( doUpdate() ) on sp1DScaleMultZ changed val do ( doUpdate() ) ------------------------ -- 2D ------------------------ -- position on sp2DPosAbsX changed val do ( doUpdate() ) on sp2DPosAbsY changed val do ( doUpdate() ) on sp2DPosAbsZ changed val do ( doUpdate() ) on sp2DPosStepX changed val do ( doUpdate() ) on sp2DPosStepY changed val do ( doUpdate() ) on sp2DPosStepZ changed val do ( doUpdate() ) on sp2DPosMultX changed val do ( doUpdate() ) on sp2DPosMultY changed val do ( doUpdate() ) on sp2DPosMultZ changed val do ( doUpdate() ) -- rotation on sp2DRotAbsX changed val do ( doUpdate() ) on sp2DRotAbsY changed val do ( doUpdate() ) on sp2DRotAbsZ changed val do ( doUpdate() ) on sp2DRotStepX changed val do ( doUpdate() ) on sp2DRotStepY changed val do ( doUpdate() ) on sp2DRotStepZ changed val do ( doUpdate() ) on sp2DRotMultX changed val do ( doUpdate() ) on sp2DRotMultY changed val do ( doUpdate() ) on sp2DRotMultZ changed val do ( doUpdate() ) -- scale on sp2DScaleAbsX changed val do ( doUpdate() ) on sp2DScaleAbsY changed val do ( doUpdate() ) on sp2DScaleAbsZ changed val do ( doUpdate() ) on sp2DScaleStepX changed val do ( doUpdate() ) on sp2DScaleStepY changed val do ( doUpdate() ) on sp2DScaleStepZ changed val do ( doUpdate() ) on sp2DScaleMultX changed val do ( doUpdate() ) on sp2DScaleMultY changed val do ( doUpdate() ) on sp2DScaleMultZ changed val do ( doUpdate() ) ------------------------ -- 3D ------------------------ -- position on sp3DPosAbsX changed val do ( doUpdate() ) on sp3DPosAbsY changed val do ( doUpdate() ) on sp3DPosAbsZ changed val do ( doUpdate() ) on sp3DPosStepX changed val do ( doUpdate() ) on sp3DPosStepY changed val do ( doUpdate() ) on sp3DPosStepZ changed val do ( doUpdate() ) on sp3DPosMultX changed val do ( doUpdate() ) on sp3DPosMultY changed val do ( doUpdate() ) on sp3DPosMultZ changed val do ( doUpdate() ) -- rotation on sp3DRotAbsX changed val do ( doUpdate() ) on sp3DRotAbsY changed val do ( doUpdate() ) on sp3DRotAbsZ changed val do ( doUpdate() ) on sp3DRotStepX changed val do ( doUpdate() ) on sp3DRotStepY changed val do ( doUpdate() ) on sp3DRotStepZ changed val do ( doUpdate() ) on sp3DRotMultX changed val do ( doUpdate() ) on sp3DRotMultY changed val do ( doUpdate() ) on sp3DRotMultZ changed val do ( doUpdate() ) -- scale on sp3DScaleAbsX changed val do ( doUpdate() ) on sp3DScaleAbsY changed val do ( doUpdate() ) on sp3DScaleAbsZ changed val do ( doUpdate() ) on sp3DScaleStepX changed val do ( doUpdate() ) on sp3DScaleStepY changed val do ( doUpdate() ) on sp3DScaleStepZ changed val do ( doUpdate() ) on sp3DScaleMultX changed val do ( doUpdate() ) on sp3DScaleMultY changed val do ( doUpdate() ) on sp3DScaleMultZ changed val do ( doUpdate() ) on cbCenter changed val do ( doUpdate() ) on cbAutoDistance changed val do ( if val == true then ( spDistX.enabled = false spDistY.enabled = false spDistZ.enabled = false ) else ( spDistX.enabled = true spDistY.enabled = true spDistZ.enabled = true ) doUpdate() ) ) Rollout roAbout "About" ( label lblAbout00 "relief7 Tools" align: #left offset: [ 22, 0 ] label lblAbout01 "Version:" align: #left offset: [ 22, 0 ] label lblAbout02 "Author: Markus Boos" align: #left offset: [ 22, 0 ] label lblAbout03 "(c) 2007-2010 project|gemini" align: #left offset: [ 22, 0 ] label lblAbout04 "All rights reserved." align: #left offset: [ 22, 0 ] label lblAbout05 "" align: #left offset: [ 22, 0 ] --label lblAbout06 \"relief7@projectgemini.net\" align: #left offset: [ 22, -10 ] hyperLink lblAbout06 "relief7@projectgemini.net" color: white address: "mailto:relief7@projectgemini.net" align: #left offset: [ 22, -10 ] hyperLink lblAbout07 "http://www.projectgemini.net" color: white address: "http://www.projectgemini.net" align: #left offset: [ 22, -5 ] on roAbout open do ( lblAbout00.text = ( "Procedural Array" ) lblAbout01.text = ( "Version: 0.01" ) ) ) -- --------------------------------------------------- -- ROLLOUT FLOATER -- --------------------------------------------------- -- try closing the dialog if it already exists try ( closeRolloutFloater rofTool ) catch ( ) -- create rollout floater rofTool = newRolloutFloater "Procedural Array 0.02" 300 466 -- add rollouts addRollout roProceduralArray rofTool addRollout roAbout rofTool rolledUp:true )