--animate bend angle by a control object with a certain radius -- written by Jos Balcaen for maxmad on scriptspot -- contact jos_balcaen@hotmail.com -- last update 19/06/2012 -- thanks for the help from Branko Zivkovic (--start local function _dts_uniqueArrays = () rollout roll_unhide "Bend By Movement" ( local ListOfObjects = #() local ListOfNames = #() local ListOfVisible = #() local ControlObject fn filterObj obj = hasProperty obj #radius pickbutton pcbControlObject "Pick Control Object" autoDisplay:true width:150 height:25 align:#center spinner spnRadius "Radius" range:[0.001,1000000,10] width:150 align:#left tooltip:"Unhide in radius" checkbox chbX "X" across:3 checked:true checkbox chbY "Y" checked:true checkbox chbZ "Z" checked:true button btnAddObjects "Add Slaves" width:150 height:25 align:#center tooltip:"Add Selected" button btnDeleteObjects "remove all" width:150 height:20 align:#center tooltip:"remove all objects from list. double click on an item to remove it" multilistbox mlbObjects width:150 height:10 align:#center label lblNumberOfObjects "no objects" spinner spnFadeIn "Curl in over" range:[0,1000,5] tooltip:"number of frames" type:#integer spinner spnFrom "From" across:2 type:#integer fieldwidth:35 range:[0,100000,0] spinner spnTo "To" type:#integer fieldwidth:35 range:[1,100000,100] button btnAnimate "Animate bend" width:150 height:25 align:#center button btnDelete "Delete bend animation" width:150 height:25 align:#center on pcbControlObject picked arg do ( ControlObject = arg;ControlObject.xray = on if filterObj ControlObject do spnRadius.value = ControlObject.radius ) on btnAddObjects pressed do ( if selection.count == 0 then (messageBox "Pick some objects first!" title:"NOTE" beep:false) else ( if appendIfUnique != undefined then ( for obj in selection where obj != ControlObject do ( appendIfUnique ListOfObjects obj appendIfUnique ListOfNames obj.name ) ) else ( ListOfObjects += (selection as array) ListOfNames = for obj in ListOfObjects collect obj.name ) mlbObjects.items = ListOfNames lblNumberOfObjects.text = ListOfObjects.count as string + " objects" ) lblNumberOfObjects.text = ListOfObjects.count as string + " objects" ) on spnRadius changed val do ( if isValidNode ControlObject and filterObj ControlObject do ControlObject.radius = val ) on mlbObjects doubleClicked index do ( ListOfObjects = deleteItem ListOfObjects index ListOfNames = deleteItem ListOfNames index mlbObjects.items = ListOfNames lblNumberOfObjects.text = ListOfObjects.count as string + " objects" ) on btnDeleteObjects pressed do ( ListOfObjects = #() ListOfNames = #() mlbObjects.items = ListOfNames lblNumberOfObjects.text = "no objects" ) on btnAnimate pressed do ( if ListOfObjects.count == 0 or not isValidNode ControlObject then (messageBox "Add some objects and controller first!" title:"NOTE" beep:false) else ( --assign visibility track for each slave for obj in ListOfObjects do ( --if obj[1].controller == undefined do obj.visibility = bezier_float() if obj.modifiers[3].angle.controller == undefined do obj.modifiers[1].angle.controller = bezier_float() key = addNewKey obj.modifiers[3].angle.controller spnFrom.value key.value = 0 key.outTangentType = #step ) for f=1 to ListOfObjects.count do ListOfVisible[f] = false for i = spnFrom.value to spnTo.value do ( --sliderTime = i --check for every objects if its in range for o=1 to ListOfObjects.count do ( if ListOfVisible[o] == false do ( sPos = Point3 0 0 0 mPos = Point3 0 0 0 if chbX.checked == true do (at time i (sPos.x = ListOfObjects[o].pos.x;mPos.x = ControlObject.pos.x)) if chbY.checked == true do (at time i (sPos.y = ListOfObjects[o].pos.y;mPos.y = ControlObject.pos.y)) if chbZ.checked == true do (at time i (sPos.z = ListOfObjects[o].pos.z;mPos.z = ControlObject.pos.z)) if (distance mPos sPos) < spnRadius.value do ( if spnFadeIn.value != 0 then ( key = addNewKey ListOfObjects[o].modifiers[3].angle.controller i key.value = 0 key.outTangentType = #slow key = addNewKey ListOfObjects[o].modifiers[3].angle.controller (i+spnFadeIn.value) key.value = 360 key.outTangentType = #slow ListOfVisible[o] = true ) else ( key = addNewKey ListOfObjects[o].modifiers[3].angle.controller i key.value = 360 key.outTangentType = #step ListOfVisible[o] = true ) ) ) ) ) ) ) on btnDelete pressed do ( for obj in ListOfObjects do ( if obj.modifiers[3].angle.controller != undefined do ( -- obj.visibility = bezier_float() deleteKeys obj.modifiers[3].angle.controller #allKeys obj.modifiers[3].angle.controller.value = 0 ) ) ) ) createDialog roll_unhide width:150 style:#(#style_toolwindow,#style_sysmenu) fn _dts_uniqueArrays theArray = -- by denisT ( hashes = #() for a in theArray where (finditem hashes (h = gethashvalue a 0)) == 0 collect (append hashes h; a) print h ) )--end local