{"id":590,"date":"2018-07-16T12:40:09","date_gmt":"2018-07-16T16:40:09","guid":{"rendered":"http:\/\/www.vicdebaie.com\/blog\/?p=590"},"modified":"2018-07-16T12:47:52","modified_gmt":"2018-07-16T16:47:52","slug":"motionbuilder-python-library-aka-my-fav-functions","status":"publish","type":"post","link":"http:\/\/www.vicdebaie.com\/blog\/motionbuilder-python-library-aka-my-fav-functions\/","title":{"rendered":"MotionBuilder Python Library aka. My Fav Functions"},"content":{"rendered":"<p><img data-attachment-id=\"591\" data-permalink=\"http:\/\/www.vicdebaie.com\/blog\/motionbuilder-python-library-aka-my-fav-functions\/cheatsheet\/\" data-orig-file=\"https:\/\/i0.wp.com\/www.vicdebaie.com\/blog\/wp-content\/uploads\/2018\/07\/CheatSheet.jpg?fit=1200%2C797\" data-orig-size=\"1200,797\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/www.vicdebaie.com\/blog\/wp-content\/uploads\/2018\/07\/CheatSheet.jpg?fit=300%2C199\" data-large-file=\"https:\/\/i0.wp.com\/www.vicdebaie.com\/blog\/wp-content\/uploads\/2018\/07\/CheatSheet.jpg?fit=678%2C450\" decoding=\"async\" loading=\"lazy\" class=\"aligncenter wp-image-591 \" src=\"https:\/\/i0.wp.com\/www.vicdebaie.com\/blog\/wp-content\/uploads\/2018\/07\/CheatSheet.jpg?resize=429%2C265\" alt=\"\" width=\"429\" height=\"265\" srcset=\"https:\/\/i0.wp.com\/www.vicdebaie.com\/blog\/wp-content\/uploads\/2018\/07\/CheatSheet.jpg?resize=200%2C125 200w, https:\/\/i0.wp.com\/www.vicdebaie.com\/blog\/wp-content\/uploads\/2018\/07\/CheatSheet.jpg?zoom=2&amp;resize=429%2C265 858w\" sizes=\"(max-width: 429px) 100vw, 429px\" data-recalc-dims=\"1\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>Here is a quick post containing a collection of my favorite functions or snippets of scripts that I find very useful in my day to day workflow. You could save them all and then import them into your scripts as apart of your person library, to do that I will point you <a href=\"https:\/\/chrisyeh96.github.io\/2017\/08\/08\/definitive-guide-python-imports.html\">here<\/a>. \ud83d\ude42<\/p>\n<pre class=\"brush: python; title: ; notranslate\" title=\"\">\r\nimport pyfbsdk as fb\r\nimport pyfbsdk_additions as fba\r\n\r\n##Search the module namespace for specific name ie searchFB(&quot;Scene&quot;)\r\ndef searchFB(string):\r\n    count = 0\r\n    for i in dir(fb):\r\n        if string in i:\r\n            count = count + 1\r\n            print &quot;fb.&quot; + i\r\n        else:\r\n            pass\r\n    if count == 0:\r\n        print &quot;No Results Found&quot;\r\n            \r\n##Search through the module fb.FBScene for specific name ie. searchFBScene(&quot;Layer&quot;)          \r\ndef searchFBScene(string):\r\n    count = 0\r\n    for i in dir(fb.FBScene):\r\n        if string in i:\r\n            count = count + 1\r\n            print &quot;fb.FBScene.&quot; + i\r\n        else:\r\n            pass\r\n    if count == 0:\r\n        print &quot;No Results Found&quot;\r\n\r\n##Search dir() On User Specific Component But Only Return Attributes That Match User's Specific String ie. SearchDirString(fb.FBSystem().Scene.Takes, &quot;Get&quot;)\r\ndef searchDirString(component, string):\r\n    count = 0\r\n    for item in dir(component):\r\n        if string in item:\r\n            print item\r\n            count = count + 1\r\n        else:\r\n            pass\r\n    if count == 0:\r\n        print 'No Attributes Match Or Contain &quot;' + string + '&quot; - This Search Is Case Sensitive.'\r\n        print 'Please Try Again Using Proper Case Of Text Or Use &quot;searchDirString(component, sting)&quot; To Return All Results.'\r\n        \r\n'''\r\nTime Line\/Frames\r\n'''\r\n##Scene Refresh Bug Work Around\r\ndef SceneRefresh(): \r\n    fb.FBPlayerControl().GotoNextKey()\r\n    fb.FBSystem().Scene.Evaluate()\r\n    fb.FBPlayerControl().GotoPreviousKey()\r\n    fb.FBSystem().Scene.Evaluate()\r\n\r\n##Get Current Frame\r\ndef GetCurrentFrame():\r\n    return fb.FBSystem().LocalTime.GetFrame()\r\n\r\n##Get First Frame Of Time Line \/ Get Start Frame Of Time Line    \r\ndef GetStartFrame():\r\n    lStartFrame = fb.FBSystem().CurrentTake.LocalTimeSpan.GetStart().GetFrame()\r\n    return lStartFrame\r\n\r\n##Get Last Frame Of Time Line \/ Get End Frame Of Time Line           \r\ndef GetEndFrame():\r\n    lEndFrame = fb.FBSystem().CurrentTake.LocalTimeSpan.GetStop().GetFrame()\r\n    return lEndFrame\r\n\r\n##Get Length Of Time Line \/ Get Time Line Frame Count            \r\ndef GetTimeSpan():\r\n    return ( fb.FBSystem().CurrentTake.LocalTimeSpan.GetStop().GetFrame() - fb.FBSystem().CurrentTake.LocalTimeSpan.GetStart().GetFrame() )\r\n\r\n##Set Time Line Length ie. SetTimeSpan(150, 200) Will Set The Time Line To Start At Frame 150 And End At Frame 200\r\ndef SetTimeSpan(start, end):\r\n    fb.FBSystem().CurrentTake.LocalTimeSpan = fb.FBTimeSpan(fb.FBTime(0, 0, 0, start, 0), fb.FBTime(0, 0, 0, end, 0))\r\n    \r\n##Goto User Specified Frame ie. GotoFrame(15) Will Place The Time Slider\/Play Head On Frame 15\r\ndef GotoFrame(frame):\r\n    t = fb.FBTime(0, 0, 0, frame, 0)\r\n    fb.FBPlayerControl().Goto(t)\r\n    \r\n##Goto First Frame Of Time Line \/ Get Start Frame Of Time Line    \r\ndef GotoStartFrame():\r\n    fb.FBPlayerControl().GotoStart()\r\n\r\n##Goto Last Frame Of Time Line \/ Get End Frame Of Time Line      \r\ndef GotoEndFrame():\r\n    fb.FBPlayerControl().GotoEnd()\r\n\r\n##Move The Time Slider\/Play Head Up One Frame From Its Current Position    \r\ndef GotoNextFrame():\r\n    fb.FBPlayerControl().StepForward()\r\n\r\n##Move The Time Slider\/Play Head Down One Frame From Its Current Position        \r\ndef GotoPreviousFrame():\r\n    fb.FBPlayerControl().StepBackward()\r\n\r\n##Move The Time Slider\/Play Head To The Next Key On The Time Line    \r\ndef GotoNextKey():\r\n    fb.FBPlayerControl().GotoNextKey()\r\n\r\n##Move The Time Slider\/Play Head To The Previous Key On The Time Line     \r\ndef GotoPreviousKey():\r\n    fb.FBPlayerControl().GotoPreviousKey()\r\n\r\n##User Specified Setting Of The Scenes Play Back Speed (in Frames Per Second) ie. SetFPS(45) Will Set The Scene To Play Back At 45 Frames Per Second     \r\ndef SetFPS(number):\r\n    fb.FBPlayerControl().SetTransportFps(fb.FBTimeMode.kFBTimeModeCustom, number)\r\n\r\n##Set The Scene's FPS Play Back Through User Specified Modes ie. SetFPSMode(&quot;PAL&quot;) Will Play The Scene Back At 25 Frames Per Second.\r\ndef SetFPSMode(mode):\r\n    if mode == &quot;Cinema&quot;:\r\n        fb.FBPlayerControl().SetTransportFps(fb.FBTimeMode.kFBTimeMode24Frames)\r\n    if mode == &quot;PAL&quot;:\r\n        fb.FBPlayerControl().SetTransportFps(fb.FBTimeMode.kFBTimeMode25Frames)\r\n    if mode == &quot;NTSC&quot;:\r\n        fb.FBPlayerControl().SetTransportFps(fb.FBTimeMode.kFBTimeMode2997Frames)    \r\n    if mode == &quot;NTSC_Drop&quot;:\r\n        fb.FBPlayerControl().SetTransportFps(fb.FBTimeMode.kFBTimeMode2997Frames_Drop)\r\n    if mode == &quot;CinemaND&quot;:\r\n        fb.FBPlayerControl().SetTransportFps(fb.FBTimeMode.kFBTimeMode23976Frames)\r\n    else:\r\n        pass\r\n\r\n'''\r\nKeying\r\n'''\r\n##Get The Current Keying Mode\r\ndef GetKeyingMode():\r\n    return fb.FBApplication().CurrentCharacter.KeyingMode\r\n\r\n##Set The Character Keying Mode ie. SetKeyingMode(&quot;FullBody&quot;) Will Set The Keying Mode To FullBody (fb.FBCharacterKeyingMode.kFBCharacterKeyingFullBody) \r\ndef SetKeyingMode(mode):\r\n    if mode == &quot;FullBody&quot;:\r\n        fb.FBApplication().CurrentCharacter.KeyingMode = fb.FBCharacterKeyingMode.kFBCharacterKeyingFullBody\r\n    if mode == &quot;BodyPart&quot;:\r\n        fb.FBApplication().CurrentCharacter.KeyingMode = fb.FBCharacterKeyingMode.kFBCharacterKeyingBodyPart\r\n    if mode == &quot;Selection&quot;:\r\n        fb.FBApplication().CurrentCharacter.KeyingMode = fb.FBCharacterKeyingMode.kFBCharacterKeyingSelection\r\n\r\n##Set Auto Key ie. SetAutoKey(True) Will Endable Auto Key\r\ndef SetAutoKey(value):\r\n    if value == True:\r\n        fb.FBKeyControl().AutoKey = True\r\n    if value == False:\r\n        fb.FBKeyControl().AutoKey = False\r\n\r\n'''Used With Layers To Set Zero Keys'''\r\n##Zero Transforms By Getting Model's FBVectors \r\ndef ZeroTransforms( yourmodel ):\r\n    yourmodel.Translation = fb.FBVector3d()\r\n    yourmodel.Rotation = fb.FBVector3d() \r\n\r\n##Sets Zero Key On Selected Model On Current Frame    \r\ndef ZeroKeySelected():    \r\n    SelModels = GetSelModels()\r\n    for model in SelModels:         \r\n        ZeroTransforms( model )\r\n        fb.FBPlayerControl().Key()\r\n\r\n##Sets Zero Key On Selected Model At Desired Frame ie. ZeroKeySelOnFrame(50) Will Set A Zero Key On Frame 50\r\ndef ZeroKeySelOnFrame(frame):\r\n    GotoFrame(frame)        \r\n    ZeroKeySelected()\r\n\r\n    \r\n'''\r\nTakes\r\n'''\r\n\r\n##Get Index Of Selected Takes\r\ndef GetSelTakeIdx():\r\n    listIndex = &#x5B;]\r\n    for i in fb.FBSystem().Scene.Takes:\r\n        if i.Selected == True:\r\n            listIndex.extend(&#x5B;i])\r\n        else: pass\r\n    return listIndex\r\n\r\n##Get All The Take Names Within The Scene\r\ndef GetTakeNames():\r\n    lTakeNames = &#x5B;]\r\n    for i in fb.FBSystem().Scene.Takes:\r\n        lTakeNames.extend(&#x5B;i.Name])\r\n    return lTakeNames\r\n\r\n##Goto User Specified Take ie. GotoTakeName(&quot;Take 002&quot;) Will Make &quot;Take 002&quot; Your Currently Acitve Take   \r\ndef GotoTakeName(name):\r\n    for i in fb.FBSystem().Scene.Takes:\r\n        if i.Name == name:\r\n            fb.FBSystem().CurrentTake = i\r\n        else:\r\n            pass\r\n\r\n##Set The Currently Acitve Take As A Reference. This Is Used With Loops And When At The End Of The Loop We Need To Arive Back On The Take We Started On.\r\ndef SetTakeAsTakeRef():\r\n    TakeRef = fb.FBSystem().CurrentTake\r\n    TakeRefName = fb.FBSystem().CurrentTake.Name\r\n    return TakeRef\r\n\r\n##Returns Us Back To Our TakeRef. This Is Used With Loops And When At The End Of The Loop We Need To Arive Back On The Take We Started On.\r\ndef ReturnToOriginTake(TakeRef):\r\n    if TakeRef == fb.FBSystem().CurrentTake.Name:\r\n        pass\r\n    else:\r\n        fb.FBSystem().CurrentTake = TakeRef\r\n\r\n##Set Current Take As A Selected Take\r\ndef SelectCurrentTake():\r\n    fb.FBSystem().CurrentTake.Selected = True\r\n\r\n##Using A Take's Name We Can Set Tate Take As The Selected Take ie. SelectTakeName(&quot;Take 002&quot;) Will Make &quot;Take 002&quot; Now Selected And All Other Selected Takes Will Be Unselected.  \r\ndef SelectTakeName(takename):\r\n    UnSelectAllTakes()\r\n    lTakeLst = &#x5B;]\r\n    for i in range( len(fb.FBSystem().Scene.Takes) ):\r\n        if fb.FBSystem().Scene.Takes&#x5B;i].Name == takename:\r\n            lTakeLst.extend(&#x5B;fb.FBSystem().Scene.Takes&#x5B;i]])\r\n        else: pass\r\n    for take in lTakeLst:\r\n        fb.FBSystem().CurrentTake = take\r\n        fb.FBSystem().CurrentTake.Selected = True\r\n\r\n##Sets All Takes Within The Scene As Selected Takes    \r\ndef SelectAllTakes():\r\n    TakeRef, TakeRefName = SetTakeAsTakeRef()\r\n    lTakeNames = &#x5B;]\r\n    for i in fb.FBSystem().Scene.Takes:\r\n        fb.FBSystem().CurrentTake = i\r\n        i.Selected = True\r\n    ReturnToOriginTake(TakeRef)    \r\n    \r\n##Sets All Takes Within The Scene As UnSelected Takes\r\ndef UnSelectAllTakes():\r\n    TakeRef, TakeRefName = SetTakeAsTakeRef()\r\n    lfbTakeSum = 0\r\n    for i in fb.FBSystem().Scene.Takes:\r\n        lfbTakeSum = lfbTakeSum+1\r\n    for x in range (lfbTakeSum):\r\n        fb.FBSystem().CurrentTake = fb.FBSystem().Scene.Takes&#x5B;x]\r\n        fb.FBSystem().CurrentTake.Selected = False\r\n    ReturnToOriginTake(TakeRef)\r\n\r\n##Creates A New Take With The User's Specified Take Name ie. CreateNewTake(&quot;Take 003&quot;) Will Create A New Empty Take Named &quot;Take 003&quot;\r\ndef CreateNewTake(takename):\r\n    fb.FBSystem().Scene.Takes.append( fb.FBTake(takename) )\r\n\r\n##Copies The Current Take To A New Take And Names It To The User's Specified Name ie DuplicateCurrentTake(&quot;MyCopiedTake&quot;)    \r\ndef DuplicateCurrentTake(newtakename):\r\n    fb.FBSystem().CurrentTake.CopyTake(newtakename)\r\n\r\n##Duplicates All Selected Takes With the Suffix &quot;CopyOf____&quot; ie. &quot;Take 002&quot; Will Be Duplicated As &quot;CopyOf____Take 002&quot;     \r\ndef DuplicateSelectedTakes():\r\n    lTakeLst = &#x5B;]\r\n    for i in range( len(fb.FBSystem().Scene.Takes) ):\r\n        if fb.FBSystem().Scene.Takes&#x5B;i].Selected == True:\r\n            lTakeLst.extend(&#x5B;fb.FBSystem().Scene.Takes&#x5B;i]])\r\n        else: pass\r\n    for take in lTakeLst:\r\n        fb.FBSystem().CurrentTake = take\r\n        lnewtakename = &quot;CopyOf____&quot;+take.Name\r\n        fb.FBSystem().CurrentTake.CopyTake(lnewtakename)\r\n\r\n##Duplicate Take By Take Name ie. DuplicateTakeByName(&quot;Take 002&quot;) Will Only Duplicate &quot;Take 002&quot; And Will Name It As &quot;CopyOf____Take 002&quot;           \r\ndef DuplicateTakeByName(takename):\r\n    lTakeLst = &#x5B;]\r\n    for i in range( len(fb.FBSystem().Scene.Takes) ):\r\n        if fb.FBSystem().Scene.Takes&#x5B;i].Name == takename:\r\n            lTakeLst.extend(&#x5B;fb.FBSystem().Scene.Takes&#x5B;i]])\r\n        else: pass\r\n    for take in lTakeLst:\r\n        fb.FBSystem().CurrentTake = take\r\n        lnewtakename = &quot;CopyOf____&quot;+take.Name\r\n        fb.FBSystem().CurrentTake.CopyTake(lnewtakename)\r\n    \r\n##Rename Take ie. RenameTake(&quot;Take 002&quot;, &quot;My Take 002&quot;)\r\ndef RenameTake(currentname, newname):\r\n    for i in fb.FBSystem().Scene.Takes:\r\n        if i.Name == currentname:\r\n            i.Name = newname\r\n        else:\r\n            pass\r\n\r\n##Rename All Selected Takes ie. RenameSelectedTake(&quot;My_New_Name&quot;) Will Produce Takes &quot;My_New_Name&quot;, &quot;My_New_Name 1&quot;, &quot;My_New_Name 2&quot;, &quot;My_New_Name 3&quot;, etc.             \r\ndef RenameSelectedTake(newname):\r\n    for i in fb.FBSystem().Scene.Takes:\r\n        if i.Selected == True:\r\n            i.Name = newname\r\n        else:\r\n            pass\r\n            \r\n##Delete Take By Name ie.  DelTakeByName(&quot;Take 002&quot;)           \r\ndef DelTakeByName(takename):\r\n    lTakeLst = &#x5B;]\r\n    for i in range( len(fb.FBSystem().Scene.Takes) ):\r\n        if fb.FBSystem().Scene.Takes&#x5B;i].Name == takename:\r\n            lTakeLst.extend(&#x5B;fb.FBSystem().Scene.Takes&#x5B;i]])\r\n        else:\r\n            pass\r\n    for take in lTakeLst:\r\n        take.FBDelete()\r\n\r\n##Delete All Selected Takes                \r\ndef DelSelectedTakes():\r\n    lTakeLst = &#x5B;]\r\n    for i in range( len(fb.FBSystem().Scene.Takes) ):\r\n        if fb.FBSystem().Scene.Takes&#x5B;i].Selected == True:\r\n            lTakeLst.extend(&#x5B;fb.FBSystem().Scene.Takes&#x5B;i]])\r\n        else: pass\r\n    for take in lTakeLst:\r\n        take.FBDelete()     \r\n\r\n##Delete All Takes Within You Scene    \r\ndef DelAllTakes():\r\n    lTakeLst = &#x5B;]\r\n    for i in range( len(fb.FBSystem().Scene.Takes) ):\r\n        lTakeLst.extend(&#x5B;fb.FBSystem().Scene.Takes&#x5B;i]]) \r\n    for take in lTakeLst:\r\n        take.FBDelete()\r\n\r\n'''\r\nLayers    \r\n'''\r\n##Rename The Top Layer To The User's Specification ie. ReNameTopLayer(&quot;MyNewName&quot;)\r\ndef ReNameTopLayer(newname):\r\n    laycount = fb.FBSystem().CurrentTake.GetLayerCount()\r\n    layer = fb.FBSystem().CurrentTake.GetLayer(laycount-1)\r\n    layer.Name = newname\r\n\r\n##Creat Layer ie. CreateLayer(&quot;MyNewLayer&quot;) Will Create A New Top Layer Named &quot;MyNewLayer&quot;\r\ndef CreateLayer(name):\r\n    fb.FBSystem().CurrentTake.CreateNewLayer()\r\n    lCount = fb.FBSystem().CurrentTake.GetLayerCount()\r\n    fb.FBSystem().CurrentTake.SetCurrentLayer(lCount-1)\r\n    fb.FBSystem().CurrentTake.GetLayer(lCount-1).Name= name\r\n'''\r\nScene Components\r\n'''\r\n##Clear All Selected Components\r\ndef ClearAllComponents():\r\n    for lComp in fb.FBSystem().Scene.Components:\r\n        lComp.Selected = False\r\n              \r\n'''\r\nModels\r\n'''        \r\n##Clear Selected Models\r\ndef ClearSelModel():\r\n    modelList = fb.FBModelList()\r\n    fb.FBGetSelectedModels (modelList, None, True)\r\n    for model in modelList:\r\n        model.Selected = False\r\n\r\n##Returns A List Of All Selected Models\r\ndef GetSelModels():\r\n    lSelModels = &#x5B;]\r\n    modelList = fb.FBModelList()\r\n    fb.FBGetSelectedModels (modelList, None, True)\r\n    for model in modelList:\r\n        if model.Selected == True:\r\n            lSelModels.extend(&#x5B;model])\r\n        else:\r\n            pass\r\n    return lSelModels\r\n\r\n##Get Model By Long Name ie. GetModel('Character_01:Ctrl:HipsEffector') Will Return The HipEffector Of The Character Within Your Scene That Has The NameSpace &quot;Character_01&quot; \r\ndef GetModel(longname):\r\n    lModel = fb.FBFindModelByLabelName(longname) \r\n    return lModel\r\n\r\n##Select Model By Long Name ie. GetModel('Character_01:Ctrl:HipsEffector',True) Will Additonally Select The HipEffector Of The Character Within Your Scene That Has The NameSpace &quot;Character_01&quot; \r\ndef SelectModel(longname, appendselection):\r\n    if appendselection == False:\r\n        ClearSelModel()\r\n    if appendselection == True:\r\n        pass\r\n    lModel = fb.FBFindModelByLabelName(longname) \r\n    lModel.Selected = True           \r\n    \r\n'''\r\nCharacters\r\n'''\r\n    \r\ndef GetCharNameSpace():\r\n    return fb.FBApplication().CurrentCharacter.LongName.rsplit(':', 1)&#x5B;0]\r\n\r\n##Set Active Caharcter By Name Space ie. GetCharByNameSpace(&quot;Carl&quot;)\r\ndef GetCharByNameSpace(namespace):\r\n    charInScene = fb.FBSystem().Scene.Characters\r\n    nameSpaceList = &#x5B;]\r\n    for i in charInScene:\r\n        nameSpaceList.extend( &#x5B; i.LongName.rsplit(':', 1)&#x5B;0] ] )\r\n    if namespace not in nameSpaceList:\r\n        print &quot;No Character With That Name Space&quot; \r\n    else:\r\n        for i in charInScene:\r\n            if i.LongName.rsplit(':', 1)&#x5B;0] == namespace:\r\n                fb.FBApplication().CurrentCharacter = i\r\n            else:\r\n                pass\r\n##Select Current Character's Effector By Name ie. GetActiveCharEffector(&quot;RightAnkleEffector&quot;)\r\ndef GetActiveCharEffector(name, appendselection):\r\n    if appendselection == False:\r\n        ClearSelModel()\r\n    if appendselection == True:\r\n        pass \r\n    nameSpace = GetCharNameSpace()\r\n    charEffeector = fb.FBFindModelByLabelName(nameSpace+&quot;:Ctrl:&quot;+name)\r\n    print charEffeector.Name\r\n    charEffeector.Selected = True\r\n\r\n##Character Plot Options\r\ndef CharPlotOptions():\r\n    lPlotCtrlRigTakeOptions = fb.FBPlotOptions()\r\n    lPlotCtrlRigTakeOptions.ConstantKeyReducerKeepOneKey = False\r\n    lPlotCtrlRigTakeOptions.PlotAllTakes = False\r\n    lPlotCtrlRigTakeOptions.PlotOnFrame = True\r\n    lPlotCtrlRigTakeOptions.PlotPeriod = fb.FBTime( 0, 0, 0, 1 )\r\n    lPlotCtrlRigTakeOptions.PlotTranslationOnRootOnly = False\r\n    lPlotCtrlRigTakeOptions.PreciseTimeDiscontinuities = False\r\n    lPlotCtrlRigTakeOptions.RotationFilterToApply = fb.FBRotationFilter.kFBRotationFilterUnroll\r\n    lPlotCtrlRigTakeOptions.UseConstantKeyReducer = False\r\n    return lPlotCtrlRigTakeOptions\r\n\r\n##Plot Selected Character\r\ndef PlotSelChar():\r\n    plotOptions = CharPlotOptions()\r\n    fb.FBApplication().CurrentCharacter.PlotAnimation (fb.FBCharacterPlotWhere.kFBCharacterPlotOnSkeleton,plotOptions )\r\n    fb.FBApplication().CurrentCharacter.PlotAnimation (fb.FBCharacterPlotWhere.kFBCharacterPlotOnControlRig,plotOptions )\r\n\r\n##Plot All Characters In The Scene    \r\ndef PlotAllChar():\r\n    plotOptions = CharPlotOptions()\r\n    for i in range( len(fb.FBSystem().Scene.Characters) ):\r\n        char = fb.FBSystem().Scene.Characters&#x5B;i]\r\n        fb.FBApplication().CurrentCharacter = char\r\n        fb.FBApplication().CurrentCharacter.PlotAnimation (fb.FBCharacterPlotWhere.kFBCharacterPlotOnSkeleton,plotOptions )\r\n        fb.FBApplication().CurrentCharacter.PlotAnimation (fb.FBCharacterPlotWhere.kFBCharacterPlotOnControlRig,plotOptions )\r\n\r\ndef PlotToCtrlRig():\r\n    plotOptions = CharPlotOptions()\r\n    fb.FBApplication().CurrentCharacter.PlotAnimation (fb.FBCharacterPlotWhere.kFBCharacterPlotOnControlRig,plotOptions )\r\n\r\ndef PlotAllCharToCtrlRig():\r\n    plotOptions = CharPlotOptions()\r\n    for i in range( len(fb.FBSystem().Scene.Characters) ):\r\n        char = fb.FBSystem().Scene.Characters&#x5B;i]\r\n        fb.FBApplication().CurrentCharacter = char\r\n        fb.FBApplication().CurrentCharacter.PlotAnimation (fb.FBCharacterPlotWhere.kFBCharacterPlotOnSkeleton,plotOptions )\r\n        fb.FBApplication().CurrentCharacter.PlotAnimation (fb.FBCharacterPlotWhere.kFBCharacterPlotOnControlRig,plotOptions ) \r\n           \r\n<\/pre>\n<p>I hope to update this post in the future with links to more of these &#8220;Cheat Sheets&#8221;.<\/p>\n<p>As always, I hope this helps and maybe even speeds up your workflow when it comes to python scripting within MotionBuilder.<\/p>\n<p><\/p><noscript class=\"ninja-forms-noscript-message\">\n\tNotice: JavaScript is required for this content.<\/noscript>\n<div id=\"nf-form-1-cont\" class=\"nf-form-cont\" aria-live=\"polite\" aria-labelledby=\"nf-form-title-1\" aria-describedby=\"nf-form-errors-1\" role=\"form\">\n\n    <div class=\"nf-loading-spinner\"><\/div>\n\n<\/div>\n        <!-- That data is being printed as a workaround to page builders reordering the order of the scripts loaded-->\n        <script>var formDisplay=1;var nfForms=nfForms||[];var form=[];form.id='1';form.settings={\"objectType\":\"Form Setting\",\"editActive\":\"\",\"title\":\"Contact Me\",\"key\":\"\",\"created_at\":\"2016-08-24 16:39:20\",\"default_label_pos\":\"above\",\"conditions\":[],\"show_title\":\"1\",\"clear_complete\":\"1\",\"hide_complete\":\"1\",\"wrapper_class\":\"\",\"element_class\":\"\",\"add_submit\":\"1\",\"logged_in\":\"\",\"not_logged_in_msg\":\"\",\"sub_limit_number\":\"\",\"sub_limit_msg\":\"\",\"calculations\":[],\"formContentData\":[\"name\",\"message\",\"submit\"],\"container_styles_background-color\":\"\",\"container_styles_border\":\"\",\"container_styles_border-style\":\"\",\"container_styles_border-color\":\"\",\"container_styles_color\":\"\",\"container_styles_height\":\"\",\"container_styles_width\":\"\",\"container_styles_font-size\":\"\",\"container_styles_margin\":\"\",\"container_styles_padding\":\"\",\"container_styles_display\":\"\",\"container_styles_float\":\"\",\"container_styles_show_advanced_css\":\"0\",\"container_styles_advanced\":\"\",\"title_styles_background-color\":\"\",\"title_styles_border\":\"\",\"title_styles_border-style\":\"\",\"title_styles_border-color\":\"\",\"title_styles_color\":\"\",\"title_styles_height\":\"\",\"title_styles_width\":\"\",\"title_styles_font-size\":\"\",\"title_styles_margin\":\"\",\"title_styles_padding\":\"\",\"title_styles_display\":\"\",\"title_styles_float\":\"\",\"title_styles_show_advanced_css\":\"0\",\"title_styles_advanced\":\"\",\"row_styles_background-color\":\"\",\"row_styles_border\":\"\",\"row_styles_border-style\":\"\",\"row_styles_border-color\":\"\",\"row_styles_color\":\"\",\"row_styles_height\":\"\",\"row_styles_width\":\"\",\"row_styles_font-size\":\"\",\"row_styles_margin\":\"\",\"row_styles_padding\":\"\",\"row_styles_display\":\"\",\"row_styles_show_advanced_css\":\"0\",\"row_styles_advanced\":\"\",\"row-odd_styles_background-color\":\"\",\"row-odd_styles_border\":\"\",\"row-odd_styles_border-style\":\"\",\"row-odd_styles_border-color\":\"\",\"row-odd_styles_color\":\"\",\"row-odd_styles_height\":\"\",\"row-odd_styles_width\":\"\",\"row-odd_styles_font-size\":\"\",\"row-odd_styles_margin\":\"\",\"row-odd_styles_padding\":\"\",\"row-odd_styles_display\":\"\",\"row-odd_styles_show_advanced_css\":\"0\",\"row-odd_styles_advanced\":\"\",\"success-msg_styles_background-color\":\"\",\"success-msg_styles_border\":\"\",\"success-msg_styles_border-style\":\"\",\"success-msg_styles_border-color\":\"\",\"success-msg_styles_color\":\"\",\"success-msg_styles_height\":\"\",\"success-msg_styles_width\":\"\",\"success-msg_styles_font-size\":\"\",\"success-msg_styles_margin\":\"\",\"success-msg_styles_padding\":\"\",\"success-msg_styles_display\":\"\",\"success-msg_styles_show_advanced_css\":\"0\",\"success-msg_styles_advanced\":\"\",\"error_msg_styles_background-color\":\"\",\"error_msg_styles_border\":\"\",\"error_msg_styles_border-style\":\"\",\"error_msg_styles_border-color\":\"\",\"error_msg_styles_color\":\"\",\"error_msg_styles_height\":\"\",\"error_msg_styles_width\":\"\",\"error_msg_styles_font-size\":\"\",\"error_msg_styles_margin\":\"\",\"error_msg_styles_padding\":\"\",\"error_msg_styles_display\":\"\",\"error_msg_styles_show_advanced_css\":\"0\",\"error_msg_styles_advanced\":\"\",\"currency\":\"\",\"unique_field_error\":\"A form with this value has already been submitted.\",\"ninjaForms\":\"Ninja Forms\",\"changeEmailErrorMsg\":\"Please enter a valid email address!\",\"changeDateErrorMsg\":\"Please enter a valid date!\",\"confirmFieldErrorMsg\":\"These fields must match!\",\"fieldNumberNumMinError\":\"Number Min Error\",\"fieldNumberNumMaxError\":\"Number Max Error\",\"fieldNumberIncrementBy\":\"Please increment by \",\"fieldTextareaRTEInsertLink\":\"Insert Link\",\"fieldTextareaRTEInsertMedia\":\"Insert Media\",\"fieldTextareaRTESelectAFile\":\"Select a file\",\"formErrorsCorrectErrors\":\"Please correct errors before submitting this form.\",\"formHoneypot\":\"If you are a human seeing this field, please leave it empty.\",\"validateRequiredField\":\"This is a required field.\",\"honeypotHoneypotError\":\"Honeypot Error\",\"fileUploadOldCodeFileUploadInProgress\":\"File Upload in Progress.\",\"fileUploadOldCodeFileUpload\":\"FILE UPLOAD\",\"currencySymbol\":\"$\",\"fieldsMarkedRequired\":\"Fields marked with an <span class=\\\"ninja-forms-req-symbol\\\">*<\\\/span> are required\",\"thousands_sep\":\",\",\"decimal_point\":\".\",\"siteLocale\":\"en\",\"dateFormat\":\"d\\\/m\\\/Y\",\"startOfWeek\":\"0\",\"of\":\"of\",\"previousMonth\":\"Previous Month\",\"nextMonth\":\"Next Month\",\"months\":[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"],\"monthsShort\":[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"],\"weekdays\":[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],\"weekdaysShort\":[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],\"weekdaysMin\":[\"Su\",\"Mo\",\"Tu\",\"We\",\"Th\",\"Fr\",\"Sa\"],\"recaptchaConsentMissing\":\"reCaptcha validation couldn&#039;t load.\",\"recaptchaMissingCookie\":\"reCaptcha v3 validation couldn&#039;t load the cookie needed to submit the form.\",\"recaptchaConsentEvent\":\"Accept reCaptcha cookies before sending the form.\",\"embed_form\":\"\",\"currency_symbol\":\"\",\"beforeForm\":\"\",\"beforeFields\":\"\",\"afterFields\":\"\",\"afterForm\":\"\"};form.fields=[{\"objectType\":\"Field\",\"objectDomain\":\"fields\",\"editActive\":\"\",\"order\":1,\"label\":\"Name\",\"key\":\"name\",\"type\":\"textbox\",\"created_at\":\"2016-08-24 16:39:20\",\"label_pos\":\"above\",\"required\":1,\"placeholder\":\"\",\"default\":\"\",\"wrapper_class\":\"\",\"element_class\":\"\",\"container_class\":\"\",\"input_limit\":\"\",\"input_limit_type\":\"characters\",\"input_limit_msg\":\"Character(s) left\",\"manual_key\":\"\",\"disable_input\":\"\",\"admin_label\":\"\",\"help_text\":\"\",\"desc_text\":\"\",\"disable_browser_autocomplete\":\"\",\"mask\":\"\",\"custom_mask\":\"\",\"wrap_styles_background-color\":\"\",\"wrap_styles_border\":\"\",\"wrap_styles_border-style\":\"\",\"wrap_styles_border-color\":\"\",\"wrap_styles_color\":\"\",\"wrap_styles_height\":\"\",\"wrap_styles_width\":\"\",\"wrap_styles_font-size\":\"\",\"wrap_styles_margin\":\"\",\"wrap_styles_padding\":\"\",\"wrap_styles_display\":\"\",\"wrap_styles_float\":\"\",\"wrap_styles_show_advanced_css\":0,\"wrap_styles_advanced\":\"\",\"label_styles_background-color\":\"\",\"label_styles_border\":\"\",\"label_styles_border-style\":\"\",\"label_styles_border-color\":\"\",\"label_styles_color\":\"\",\"label_styles_height\":\"\",\"label_styles_width\":\"\",\"label_styles_font-size\":\"\",\"label_styles_margin\":\"\",\"label_styles_padding\":\"\",\"label_styles_display\":\"\",\"label_styles_float\":\"\",\"label_styles_show_advanced_css\":0,\"label_styles_advanced\":\"\",\"element_styles_background-color\":\"\",\"element_styles_border\":\"\",\"element_styles_border-style\":\"\",\"element_styles_border-color\":\"\",\"element_styles_color\":\"\",\"element_styles_height\":\"\",\"element_styles_width\":\"\",\"element_styles_font-size\":\"\",\"element_styles_margin\":\"\",\"element_styles_padding\":\"\",\"element_styles_display\":\"\",\"element_styles_float\":\"\",\"element_styles_show_advanced_css\":0,\"element_styles_advanced\":\"\",\"cellcid\":\"c3277\",\"id\":1,\"beforeField\":\"\",\"afterField\":\"\",\"value\":\"\",\"parentType\":\"textbox\",\"element_templates\":[\"textbox\",\"input\"],\"old_classname\":\"\",\"wrap_template\":\"wrap\"},{\"objectType\":\"Field\",\"objectDomain\":\"fields\",\"editActive\":\"\",\"order\":3,\"label\":\"Message\",\"key\":\"message\",\"type\":\"textarea\",\"created_at\":\"2016-08-24 16:39:20\",\"label_pos\":\"above\",\"required\":1,\"placeholder\":\"\",\"default\":\"\",\"wrapper_class\":\"\",\"element_class\":\"\",\"container_class\":\"\",\"input_limit\":\"\",\"input_limit_type\":\"characters\",\"input_limit_msg\":\"Character(s) left\",\"manual_key\":\"\",\"disable_input\":\"\",\"admin_label\":\"\",\"help_text\":\"\",\"desc_text\":\"\",\"disable_browser_autocomplete\":\"\",\"textarea_rte\":\"\",\"disable_rte_mobile\":\"\",\"textarea_media\":\"\",\"wrap_styles_background-color\":\"\",\"wrap_styles_border\":\"\",\"wrap_styles_border-style\":\"\",\"wrap_styles_border-color\":\"\",\"wrap_styles_color\":\"\",\"wrap_styles_height\":\"\",\"wrap_styles_width\":\"\",\"wrap_styles_font-size\":\"\",\"wrap_styles_margin\":\"\",\"wrap_styles_padding\":\"\",\"wrap_styles_display\":\"\",\"wrap_styles_float\":\"\",\"wrap_styles_show_advanced_css\":0,\"wrap_styles_advanced\":\"\",\"label_styles_background-color\":\"\",\"label_styles_border\":\"\",\"label_styles_border-style\":\"\",\"label_styles_border-color\":\"\",\"label_styles_color\":\"\",\"label_styles_height\":\"\",\"label_styles_width\":\"\",\"label_styles_font-size\":\"\",\"label_styles_margin\":\"\",\"label_styles_padding\":\"\",\"label_styles_display\":\"\",\"label_styles_float\":\"\",\"label_styles_show_advanced_css\":0,\"label_styles_advanced\":\"\",\"element_styles_background-color\":\"\",\"element_styles_border\":\"\",\"element_styles_border-style\":\"\",\"element_styles_border-color\":\"\",\"element_styles_color\":\"\",\"element_styles_height\":\"\",\"element_styles_width\":\"\",\"element_styles_font-size\":\"\",\"element_styles_margin\":\"\",\"element_styles_padding\":\"\",\"element_styles_display\":\"\",\"element_styles_float\":\"\",\"element_styles_show_advanced_css\":0,\"element_styles_advanced\":\"\",\"cellcid\":\"c3284\",\"id\":3,\"beforeField\":\"\",\"afterField\":\"\",\"value\":\"\",\"parentType\":\"textarea\",\"element_templates\":[\"textarea\",\"input\"],\"old_classname\":\"\",\"wrap_template\":\"wrap\"},{\"objectType\":\"Field\",\"objectDomain\":\"fields\",\"editActive\":\"\",\"order\":5,\"label\":\"Submit\",\"key\":\"submit\",\"type\":\"submit\",\"created_at\":\"2016-08-24 16:39:20\",\"processing_label\":\"Processing\",\"container_class\":\"\",\"element_class\":\"\",\"wrap_styles_background-color\":\"\",\"wrap_styles_border\":\"\",\"wrap_styles_border-style\":\"\",\"wrap_styles_border-color\":\"\",\"wrap_styles_color\":\"\",\"wrap_styles_height\":\"\",\"wrap_styles_width\":\"\",\"wrap_styles_font-size\":\"\",\"wrap_styles_margin\":\"\",\"wrap_styles_padding\":\"\",\"wrap_styles_display\":\"\",\"wrap_styles_float\":\"\",\"wrap_styles_show_advanced_css\":0,\"wrap_styles_advanced\":\"\",\"label_styles_background-color\":\"\",\"label_styles_border\":\"\",\"label_styles_border-style\":\"\",\"label_styles_border-color\":\"\",\"label_styles_color\":\"\",\"label_styles_height\":\"\",\"label_styles_width\":\"\",\"label_styles_font-size\":\"\",\"label_styles_margin\":\"\",\"label_styles_padding\":\"\",\"label_styles_display\":\"\",\"label_styles_float\":\"\",\"label_styles_show_advanced_css\":0,\"label_styles_advanced\":\"\",\"element_styles_background-color\":\"\",\"element_styles_border\":\"\",\"element_styles_border-style\":\"\",\"element_styles_border-color\":\"\",\"element_styles_color\":\"\",\"element_styles_height\":\"\",\"element_styles_width\":\"\",\"element_styles_font-size\":\"\",\"element_styles_margin\":\"\",\"element_styles_padding\":\"\",\"element_styles_display\":\"\",\"element_styles_float\":\"\",\"element_styles_show_advanced_css\":0,\"element_styles_advanced\":\"\",\"submit_element_hover_styles_background-color\":\"\",\"submit_element_hover_styles_border\":\"\",\"submit_element_hover_styles_border-style\":\"\",\"submit_element_hover_styles_border-color\":\"\",\"submit_element_hover_styles_color\":\"\",\"submit_element_hover_styles_height\":\"\",\"submit_element_hover_styles_width\":\"\",\"submit_element_hover_styles_font-size\":\"\",\"submit_element_hover_styles_margin\":\"\",\"submit_element_hover_styles_padding\":\"\",\"submit_element_hover_styles_display\":\"\",\"submit_element_hover_styles_float\":\"\",\"submit_element_hover_styles_show_advanced_css\":0,\"submit_element_hover_styles_advanced\":\"\",\"cellcid\":\"c3287\",\"id\":4,\"beforeField\":\"\",\"afterField\":\"\",\"value\":\"\",\"label_pos\":\"above\",\"parentType\":\"textbox\",\"element_templates\":[\"submit\",\"button\",\"input\"],\"old_classname\":\"\",\"wrap_template\":\"wrap-no-label\"}];nfForms.push(form);<\/script>\n        ","protected":false},"excerpt":{"rendered":"<p>&nbsp; Here is a quick post containing a collection of my favorite functions or snippets of scripts that I find very useful in my day to day workflow. You could save them all and then import them into your scripts as apart of your person library, to do that I will point you here. \ud83d\ude42 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":591,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","jetpack_publicize_message":"","jetpack_is_tweetstorm":false,"jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","enabled":false}}},"categories":[4],"tags":[5,6,7],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/www.vicdebaie.com\/blog\/wp-content\/uploads\/2018\/07\/CheatSheet.jpg?fit=1200%2C797","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p8pltq-9w","jetpack_likes_enabled":true,"jetpack-related-posts":[{"id":645,"url":"http:\/\/www.vicdebaie.com\/blog\/motionbuilder-python-a-better-way-to-create-constraints\/","url_meta":{"origin":590,"position":0},"title":"MotionBuilder Python &#8211; A Better Way To Create Constraints","author":"admin","date":"November 14, 2018","format":false,"excerpt":"Update Thanks to\u00a0kilianeczka\u00a0for the heads up, there is even an EASIER easy way to create a constraint using MotionBuilder and Python [code language=\"python\"] import pyfbsdk as fb fb.FBConstraintManager().TypeCreateConstraint('Parent\/Child') [\/code] This omits the need to find the number of constraints and then search all the constraints for one that has the\u2026","rel":"","context":"In &quot;Python&quot;","block_context":{"text":"Python","link":"http:\/\/www.vicdebaie.com\/blog\/category\/python\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.vicdebaie.com\/blog\/wp-content\/uploads\/2018\/11\/Think^_Is_There_a_Better_Way_to_Do_it^_-_NARA_-_534256.jpg?fit=400%2C204&resize=350%2C200","width":350,"height":200},"classes":[]},{"id":336,"url":"http:\/\/www.vicdebaie.com\/blog\/how-to-use-functions-with-motionbuilder-python\/","url_meta":{"origin":590,"position":1},"title":"How to use functions with MotionBuilder Python","author":"admin","date":"April 25, 2017","format":false,"excerpt":"Using functions will save you from re-writing and maintaining many of the same lines of code over and over. What is a Python Function? \"A function is a block of organized, reusable code that is used to perform a single, related action. Functions provide better modularity for your application and\u2026","rel":"","context":"In &quot;Python&quot;","block_context":{"text":"Python","link":"http:\/\/www.vicdebaie.com\/blog\/category\/python\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.vicdebaie.com\/blog\/wp-content\/uploads\/2017\/04\/c2c827b3a6ea16d024b6875b5610651c-e1493127532666.gif?fit=251%2C300&resize=350%2C200","width":350,"height":200},"classes":[]},{"id":83,"url":"http:\/\/www.vicdebaie.com\/blog\/using-python-to-create-a-layer-on-the-current-selected-take-in-motionbuilder\/","url_meta":{"origin":590,"position":2},"title":"Using Python to Create a layer on the Current Selected Take in MotionBuilder.\u00a0","author":"admin","date":"February 9, 2017","format":false,"excerpt":"In MotionBuilder using animation layers are great for edits, blending, additives and in general adding quality passes to your animations. So below I'm going to demo how I learned to add layers\u00a0using Python. To create an Animation Layer on the Current Take script: [code language=\"python\"] from pyfbsdk import * lSystem\u2026","rel":"","context":"In &quot;Python&quot;","block_context":{"text":"Python","link":"http:\/\/www.vicdebaie.com\/blog\/category\/python\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":498,"url":"http:\/\/www.vicdebaie.com\/blog\/copying-fbx-files-with-python\/","url_meta":{"origin":590,"position":3},"title":"Copying .fbx Files With Python","author":"admin","date":"March 9, 2018","format":false,"excerpt":"\u00a0 When dealing with a lot of .fbx files we some times have to move them or back them up. Maybe a mocap shot was delivered and you want to move them off a network and on to your local drive to process or maybe it's the end of a\u2026","rel":"","context":"In &quot;Python&quot;","block_context":{"text":"Python","link":"http:\/\/www.vicdebaie.com\/blog\/category\/python\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.vicdebaie.com\/blog\/wp-content\/uploads\/2018\/03\/copy.png?fit=691%2C720&resize=350%2C200","width":350,"height":200},"classes":[]},{"id":601,"url":"http:\/\/www.vicdebaie.com\/blog\/scaling-and-moving-story-clips-with-motionbulider-python\/","url_meta":{"origin":590,"position":4},"title":"Scaling And Moving Story Clips With MotionBulider Python","author":"admin","date":"July 17, 2018","format":false,"excerpt":"\u00a0 After the last two posts (found here and here), I was able to quickly create a script that would scale all selected takes within a scene to a specific frame length. This could be handy if data needed to blend or needed to conform to a specific length for\u2026","rel":"","context":"In &quot;Python&quot;","block_context":{"text":"Python","link":"http:\/\/www.vicdebaie.com\/blog\/category\/python\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.vicdebaie.com\/blog\/wp-content\/uploads\/2018\/07\/lib_story_together.jpg?fit=920%2C473&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.vicdebaie.com\/blog\/wp-content\/uploads\/2018\/07\/lib_story_together.jpg?fit=920%2C473&resize=350%2C200 1x, https:\/\/i0.wp.com\/www.vicdebaie.com\/blog\/wp-content\/uploads\/2018\/07\/lib_story_together.jpg?fit=920%2C473&resize=700%2C400 2x"},"classes":[]},{"id":596,"url":"http:\/\/www.vicdebaie.com\/blog\/motionbuilder-python-my-fav-story-functions\/","url_meta":{"origin":590,"position":5},"title":"MotionBuilder Python My Fav Story Functions","author":"admin","date":"July 17, 2018","format":false,"excerpt":"After posting \"MotionBuilder Python Library aka. My Fav Functions\" I thought I would follow up with some breakdown on manipulating Story Tracks, Clips and Folders with MotionBuilder's Python modules. I briefly covered this a while ago here but that was really just an example of how to put characters into\u2026","rel":"","context":"In &quot;Python&quot;","block_context":{"text":"Python","link":"http:\/\/www.vicdebaie.com\/blog\/category\/python\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.vicdebaie.com\/blog\/wp-content\/uploads\/2018\/07\/Storycheatsheet.jpg?fit=782%2C474&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.vicdebaie.com\/blog\/wp-content\/uploads\/2018\/07\/Storycheatsheet.jpg?fit=782%2C474&resize=350%2C200 1x, https:\/\/i0.wp.com\/www.vicdebaie.com\/blog\/wp-content\/uploads\/2018\/07\/Storycheatsheet.jpg?fit=782%2C474&resize=700%2C400 2x"},"classes":[]}],"_links":{"self":[{"href":"http:\/\/www.vicdebaie.com\/blog\/wp-json\/wp\/v2\/posts\/590"}],"collection":[{"href":"http:\/\/www.vicdebaie.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.vicdebaie.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.vicdebaie.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.vicdebaie.com\/blog\/wp-json\/wp\/v2\/comments?post=590"}],"version-history":[{"count":3,"href":"http:\/\/www.vicdebaie.com\/blog\/wp-json\/wp\/v2\/posts\/590\/revisions"}],"predecessor-version":[{"id":608,"href":"http:\/\/www.vicdebaie.com\/blog\/wp-json\/wp\/v2\/posts\/590\/revisions\/608"}],"wp:featuredmedia":[{"embeddable":true,"href":"http:\/\/www.vicdebaie.com\/blog\/wp-json\/wp\/v2\/media\/591"}],"wp:attachment":[{"href":"http:\/\/www.vicdebaie.com\/blog\/wp-json\/wp\/v2\/media?parent=590"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.vicdebaie.com\/blog\/wp-json\/wp\/v2\/categories?post=590"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.vicdebaie.com\/blog\/wp-json\/wp\/v2\/tags?post=590"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}