{"id":102,"date":"2017-04-03T11:54:57","date_gmt":"2017-04-03T15:54:57","guid":{"rendered":"http:\/\/www.vicdebaie.com\/blog\/?p=102"},"modified":"2017-04-04T08:43:45","modified_gmt":"2017-04-04T12:43:45","slug":"navigation-tool","status":"publish","type":"post","link":"http:\/\/www.vicdebaie.com\/blog\/navigation-tool\/","title":{"rendered":"Navigation Tool"},"content":{"rendered":"<p><img data-attachment-id=\"145\" data-permalink=\"http:\/\/www.vicdebaie.com\/blog\/navigation-tool\/navigate_tool\/\" data-orig-file=\"https:\/\/i0.wp.com\/www.vicdebaie.com\/blog\/wp-content\/uploads\/2017\/02\/navigate_tool.jpg?fit=280%2C225\" data-orig-size=\"280,225\" 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\/2017\/02\/navigate_tool.jpg?fit=280%2C225\" data-large-file=\"https:\/\/i0.wp.com\/www.vicdebaie.com\/blog\/wp-content\/uploads\/2017\/02\/navigate_tool.jpg?fit=280%2C225\" decoding=\"async\" loading=\"lazy\" class=\"alignleft size-full wp-image-145\" src=\"https:\/\/i0.wp.com\/www.vicdebaie.com\/blog\/wp-content\/uploads\/2017\/02\/navigate_tool.jpg?resize=280%2C225\" alt=\"\" width=\"280\" height=\"225\" data-recalc-dims=\"1\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>In this post I will show how I created a Navigation tool with Python in MotionBuilder.<\/p>\n<p>The Tool will use Python to do the following:<\/p>\n<ol>\n<li>Start and Pause the play back of the current take.<\/li>\n<li>Jump to the end of the current take&#8217;s time line.<\/li>\n<li>Move to the start of the current take&#8217;s time line.<\/li>\n<li>Set the current frame as the time line&#8217;s start frame .<\/li>\n<li>Set the current frame as the time line&#8217;s end frame.<\/li>\n<li>Go to the previous take.<\/li>\n<li>Go to the next take.<\/li>\n<\/ol>\n<p><!--more--><\/p>\n<p>&nbsp;<\/p>\n<p>You can just copy and paste the code into your MotionBuilder Python Consol:<\/p>\n<pre class=\"brush: python; title: ; notranslate\" title=\"\">\r\n'''=================================\r\n|     Written by Victor DeBaie     |\r\n|  http:\/\/www.vicdebaie.com\/blog\/  |\r\n|      vic_debaie@hotmail.com      |\r\n================================='''\r\n\r\nfrom pyfbsdk import *\r\nfrom pyfbsdk_additions import *\r\n\r\ngotostartframe = FBButton()\r\nsetplay = FBButton()\r\ngotoendframe = FBButton()\r\nsetstartframe = FBButton()\r\nsetendframe = FBButton()\r\nprevioustake = FBButton()\r\nnexttake = FBButton()\r\n\r\nplayback = FBPlayerControl()\r\n\r\n#Goto Start Frame ------------------------------------------------------------ \r\ndef Btngotostartframe(control, event):\r\n    FBPlayerControl().GotoStart()\r\n    print &quot;Goto Start Frame&quot;\r\n\r\n#Play ------------------------------------------------------------    \r\ndef BtnCallsetplay(control, event):\r\n    playback.Stop() if playback.IsPlaying else playback.Play()\r\n    print &quot;Play\/Paue&quot;\r\n    \r\n#Goto End Frame ------------------------------------------------------------ \r\ndef Btngotoendframe(control, event):\r\n    FBPlayerControl().GotoEnd()\r\n    print &quot;Goto End Frame&quot;\r\n\r\n#Functions Starts Here ------------------------------------------------------------    \r\ndef getCurrentTimeSpan():\r\n    curtimespan = FBSystem().CurrentTake.LocalTimeSpan\r\n    return curtimespan\r\n    \r\n#Set Start Frame------------------------------------------------------------    \r\ndef BtnCallsetstartframe(control, event):\r\n    ts = getCurrentTimeSpan()\r\n    newTs = FBTimeSpan()\r\n    curTime = FBSystem().LocalTime\r\n    newTs.Set(curTime, ts.GetStop())\r\n    FBSystem().CurrentTake.LocalTimeSpan = newTs\r\n    print &quot;Set Start Frame&quot;\r\n    \r\n#Set End Frame------------------------------------------------------------    \r\ndef BtnCallsetsetendframe(control, event):\r\n    ts = getCurrentTimeSpan()\r\n    newTs = FBTimeSpan()\r\n    curTime = FBSystem().LocalTime\r\n    newTs.Set(ts.GetStart(),curTime)\r\n    FBSystem().CurrentTake.LocalTimeSpan = newTs\r\n    print &quot;Set End Frame&quot;\r\n\r\n#Take Navigation Starts Here ------------------------------------------------------------ \r\ndef GetCurrentTakeIndex():\r\n    &quot;&quot;&quot;\r\n    Returns the index of the Current Take\r\n    &quot;&quot;&quot;\r\n    # Get the current Take\r\n    oCurTake = FBSystem().CurrentTake\r\n    \r\n    # Iterate through the list of Takes to find the index\r\n    i = 0\r\n    for oTake in FBSystem().Scene.Takes:\r\n        # if this is the Take, return the index\r\n        if oTake == oCurTake:\r\n            return i\r\n        # increment the index counter\r\n        i += 1\r\n    \r\n#Previous Take------------------------------------------------------------    \r\ndef BtnCallprevioustake(control, event):\r\n    &quot;&quot;&quot;\r\n    Switches to the Next Take if any. If there isn't, it loops back to the first Take.\r\n    &quot;&quot;&quot;\r\n    # Get the Current Take index\r\n    iCurTakeIndex = GetCurrentTakeIndex()\r\n    \r\n    # Next index\r\n    iPreviousIndex = iCurTakeIndex - 1\r\n    \r\n    # Make sure the next index exists before switching\r\n    if iPreviousIndex &gt; -1:\r\n        # switch using indexing\r\n        FBSystem().CurrentTake = FBSystem().Scene.Takes&#x5B; iPreviousIndex ]\r\n    else:\r\n        # if it doesn't exist, go to the first Take\r\n        FBSystem().CurrentTake = FBSystem().Scene.Takes&#x5B; 0 ]\r\n    print &quot;Previous Take&quot;\r\n\r\n#Next Take------------------------------------------------------------    \r\ndef BtnCallnexttake(control, event):\r\n    &quot;&quot;&quot;\r\n    Switches to the Next Take if any. If there isn't, it loops back to the first Take.\r\n    &quot;&quot;&quot;\r\n    # Get the Current Take index\r\n    iCurTakeIndex = GetCurrentTakeIndex()\r\n    \r\n    # Next index\r\n    iNextIndex = iCurTakeIndex + 1\r\n    \r\n    # Make sure the next index exists before switching\r\n    if iNextIndex &lt; len( FBSystem().Scene.Takes ):\r\n        # switch using indexing\r\n        FBSystem().CurrentTake = FBSystem().Scene.Takes&#x5B; iNextIndex ]\r\n# This will allow the &quot;Next Take&quot; to loop from the last take to the first take just #        \r\n\r\n#    else:\r\n#        # if it doesn't exist, go to the first Take\r\n#        FBSystem().CurrentTake = FBSystem().Scene.Takes&#x5B; 0 ]\r\n\r\n        print &quot;Next Take&quot;\r\n           \r\n#Layout Starts Here ------------------------------------------------------------            \r\n\r\ndef PopulateTool(t):\r\n    #populate regions here\r\n    \r\n    x = FBAddRegionParam(12,FBAttachType.kFBAttachNone,&quot;&quot;)\r\n    y = FBAddRegionParam(5,FBAttachType.kFBAttachNone,&quot;&quot;)\r\n    w = FBAddRegionParam(55,FBAttachType.kFBAttachNone,&quot;&quot;)\r\n    h = FBAddRegionParam(55,FBAttachType.kFBAttachNone,&quot;&quot;)\r\n    t.AddRegion(&quot;gotostartframe&quot;,&quot;gotostartframe&quot;, x, y, w, h)\r\n\r\n    t.SetControl(&quot;gotostartframe&quot;, gotostartframe)\r\n    gotostartframe.Visible = True\r\n    gotostartframe.ReadOnly = False\r\n    gotostartframe.Enabled = True\r\n    gotostartframe.Hint = &quot;Goto Start Frame&quot;\r\n    gotostartframe.Caption = &quot;&lt;&lt;&quot;\r\n    gotostartframe.State = 0\r\n    gotostartframe.Style = FBButtonStyle.kFBPushButton\r\n    gotostartframe.Justify = FBTextJustify.kFBTextJustifyCenter\r\n    gotostartframe.Look = FBButtonLook.kFBLookNormal\r\n    gotostartframe.OnClick.Add(Btngotostartframe)\r\n    \r\n    x = FBAddRegionParam(72,FBAttachType.kFBAttachNone,&quot;&quot;)\r\n    y = FBAddRegionParam(5,FBAttachType.kFBAttachNone,&quot;&quot;)\r\n    w = FBAddRegionParam(120,FBAttachType.kFBAttachNone,&quot;&quot;)\r\n    h = FBAddRegionParam(55,FBAttachType.kFBAttachNone,&quot;&quot;)\r\n    t.AddRegion(&quot;setplay&quot;,&quot;setplay&quot;, x, y, w, h)\r\n\r\n    t.SetControl(&quot;setplay&quot;, setplay)\r\n    setplay.Visible = True\r\n    setplay.ReadOnly = False\r\n    setplay.Enabled = True\r\n    setplay.Hint = &quot;Play&quot;\r\n    setplay.Caption = &quot;Play&quot;\r\n    setplay.State = 0\r\n    setplay.Style = FBButtonStyle.kFBPushButton\r\n    setplay.Justify = FBTextJustify.kFBTextJustifyCenter\r\n    setplay.Look = FBButtonLook.kFBLookNormal\r\n    setplay.OnClick.Add(BtnCallsetplay)\r\n    \r\n    x = FBAddRegionParam(197,FBAttachType.kFBAttachNone,&quot;&quot;)\r\n    y = FBAddRegionParam(5,FBAttachType.kFBAttachNone,&quot;&quot;)\r\n    w = FBAddRegionParam(55,FBAttachType.kFBAttachNone,&quot;&quot;)\r\n    h = FBAddRegionParam(55,FBAttachType.kFBAttachNone,&quot;&quot;)\r\n    t.AddRegion(&quot;gotoendframe&quot;,&quot;gotoendframe&quot;, x, y, w, h)\r\n\r\n    t.SetControl(&quot;gotoendframe&quot;, gotoendframe)\r\n    gotoendframe.Visible = True\r\n    gotoendframe.ReadOnly = False\r\n    gotoendframe.Enabled = True\r\n    gotoendframe.Hint = &quot;Goto End Frame&quot;\r\n    gotoendframe.Caption = &quot;&gt;&gt;&quot;\r\n    gotoendframe.State = 0\r\n    gotoendframe.Style = FBButtonStyle.kFBPushButton\r\n    gotoendframe.Justify = FBTextJustify.kFBTextJustifyCenter\r\n    gotoendframe.Look = FBButtonLook.kFBLookNormal\r\n    gotoendframe.OnClick.Add(Btngotoendframe)\r\n\r\n    x = FBAddRegionParam(10,FBAttachType.kFBAttachNone,&quot;&quot;)\r\n    y = FBAddRegionParam(70,FBAttachType.kFBAttachNone,&quot;&quot;)\r\n    w = FBAddRegionParam(120,FBAttachType.kFBAttachNone,&quot;&quot;)\r\n    h = FBAddRegionParam(55,FBAttachType.kFBAttachNone,&quot;&quot;)\r\n    t.AddRegion(&quot;setstartframe&quot;,&quot;setstartframe&quot;, x, y, w, h)\r\n\r\n    t.SetControl(&quot;setstartframe&quot;, setstartframe)\r\n    setstartframe.Visible = True\r\n    setstartframe.ReadOnly = False\r\n    setstartframe.Enabled = True\r\n    setstartframe.Hint = &quot;Set Currnet Fram to  Start Frame of Current Take&quot;\r\n    setstartframe.Caption = &quot;Set Start Frame&quot;\r\n    setstartframe.State = 0\r\n    setstartframe.Style = FBButtonStyle.kFBPushButton\r\n    setstartframe.Justify = FBTextJustify.kFBTextJustifyCenter\r\n    setstartframe.Look = FBButtonLook.kFBLookNormal\r\n    setstartframe.OnClick.Add(BtnCallsetstartframe)\r\n    \r\n    x = FBAddRegionParam(135,FBAttachType.kFBAttachNone,&quot;&quot;)\r\n    y = FBAddRegionParam(70,FBAttachType.kFBAttachNone,&quot;&quot;)\r\n    w = FBAddRegionParam(120,FBAttachType.kFBAttachNone,&quot;&quot;)\r\n    h = FBAddRegionParam(55,FBAttachType.kFBAttachNone,&quot;&quot;)\r\n    t.AddRegion(&quot;setendframe&quot;,&quot;setendframe&quot;, x, y, w, h)\r\n\r\n    t.SetControl(&quot;setendframe&quot;, setendframe)\r\n    setendframe.Visible = True\r\n    setendframe.ReadOnly = False\r\n    setendframe.Enabled = True\r\n    setendframe.Hint = &quot;Set Currnet Fram to  End Frame of Current Take&quot;\r\n    setendframe.Caption = &quot;Set End Frame&quot;\r\n    setendframe.State = 0\r\n    setendframe.Style = FBButtonStyle.kFBPushButton\r\n    setendframe.Justify = FBTextJustify.kFBTextJustifyCenter\r\n    setendframe.Look = FBButtonLook.kFBLookNormal\r\n    setendframe.OnClick.Add(BtnCallsetsetendframe)\r\n    \r\n    x = FBAddRegionParam(10,FBAttachType.kFBAttachNone,&quot;&quot;)\r\n    y = FBAddRegionParam(130,FBAttachType.kFBAttachNone,&quot;&quot;)\r\n    w = FBAddRegionParam(120,FBAttachType.kFBAttachNone,&quot;&quot;)\r\n    h = FBAddRegionParam(55,FBAttachType.kFBAttachNone,&quot;&quot;)\r\n    t.AddRegion(&quot;previoustake&quot;,&quot;previoustake&quot;, x, y, w, h)\r\n\r\n    t.SetControl(&quot;previoustake&quot;, previoustake)\r\n    previoustake.Visible = True\r\n    previoustake.ReadOnly = False\r\n    previoustake.Enabled = True\r\n    previoustake.Hint = &quot;Goto Previous Take&quot;\r\n    previoustake.Caption = &quot;Previous Take&quot;\r\n    previoustake.State = 0\r\n    previoustake.Style = FBButtonStyle.kFBPushButton\r\n    previoustake.Justify = FBTextJustify.kFBTextJustifyCenter\r\n    previoustake.Look = FBButtonLook.kFBLookNormal\r\n    previoustake.OnClick.Add(BtnCallprevioustake)\r\n    \r\n    x = FBAddRegionParam(135,FBAttachType.kFBAttachNone,&quot;&quot;)\r\n    y = FBAddRegionParam(130,FBAttachType.kFBAttachNone,&quot;&quot;)\r\n    w = FBAddRegionParam(120,FBAttachType.kFBAttachNone,&quot;&quot;)\r\n    h = FBAddRegionParam(55,FBAttachType.kFBAttachNone,&quot;&quot;)\r\n    t.AddRegion(&quot;nexttake&quot;,&quot;nexttake&quot;, x, y, w, h)\r\n\r\n    t.SetControl(&quot;nexttake&quot;, nexttake)\r\n    nexttake.Visible = True\r\n    nexttake.ReadOnly = False\r\n    nexttake.Enabled = True\r\n    nexttake.Hint = &quot;Goto Next Take&quot;\r\n    nexttake.Caption = &quot;Next Take&quot;\r\n    nexttake.State = 0\r\n    nexttake.Style = FBButtonStyle.kFBPushButton\r\n    nexttake.Justify = FBTextJustify.kFBTextJustifyCenter\r\n    nexttake.Look = FBButtonLook.kFBLookNormal\r\n    nexttake.OnClick.Add(BtnCallnexttake)\r\n    \r\ndef CreateTool():\r\n    t = FBCreateUniqueTool(&quot;Navigation Tool - Victor DeBaie&quot;)\r\n    t.StartSizeX = 280\r\n    t.StartSizeY = 225\r\n    PopulateTool(t)\r\n    ShowTool(t)\r\nCreateTool()\r\n\r\n<\/pre>\n<p>Since writing this tool back in late January (or was it early February??), I use this daily and I love it! Being able to jump through takes and easily setting my start and end frame per take (which is great for exporting animations to game engines) is an amazing thing.<\/p>\n<p>I hope this helps.<\/p>\n<p><\/p>","protected":false},"excerpt":{"rendered":"<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; In this post I will show how I created a Navigation tool with Python in MotionBuilder. The Tool will use Python to do the following: Start and Pause the play back of the current take. Jump to the end of the current take&#8217;s time line. Move to the start [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":145,"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":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","enabled":false}}},"categories":[4],"tags":[5,7,8],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/www.vicdebaie.com\/blog\/wp-content\/uploads\/2017\/02\/navigate_tool.jpg?fit=280%2C225","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p8pltq-1E","jetpack_likes_enabled":true,"jetpack-related-posts":[{"id":188,"url":"http:\/\/www.vicdebaie.com\/blog\/shelveit-tool\/","url_meta":{"origin":102,"position":0},"title":"ShelveIt tool","author":"admin","date":"February 21, 2017","format":false,"excerpt":"Here is a tool that I whipped up:\u00a0Shelve It. It's a simple Python script that will duplicate your current MotionBuilder take, name it using the original take's name but add the suffix \"_Shelved\". It can come in hand when you want to explore some more changes on a take you\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\/02\/Screen-Shot-2017-02-21-at-10.29.02-PM.png?fit=962%2C524&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.vicdebaie.com\/blog\/wp-content\/uploads\/2017\/02\/Screen-Shot-2017-02-21-at-10.29.02-PM.png?fit=962%2C524&resize=350%2C200 1x, https:\/\/i0.wp.com\/www.vicdebaie.com\/blog\/wp-content\/uploads\/2017\/02\/Screen-Shot-2017-02-21-at-10.29.02-PM.png?fit=962%2C524&resize=700%2C400 2x"},"classes":[]},{"id":336,"url":"http:\/\/www.vicdebaie.com\/blog\/how-to-use-functions-with-motionbuilder-python\/","url_meta":{"origin":102,"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":686,"url":"http:\/\/www.vicdebaie.com\/blog\/save-all-story-clips-to-new-takes-with-motionbuilder-python-script\/","url_meta":{"origin":102,"position":2},"title":"Save All Story Clips To New Takes with MotionBuilder Python Script","author":"admin","date":"May 2, 2019","format":false,"excerpt":"UPDATED: A quick update that will now allow the script to maintain all of the original tracks within the story. The story will look exactly as it was pre-processing. Thanks Simon Kay Below is a script that I wrote, It goes through all you Story tracks and clips and then\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\/2019\/05\/StoryTrackClips.png?fit=851%2C304&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.vicdebaie.com\/blog\/wp-content\/uploads\/2019\/05\/StoryTrackClips.png?fit=851%2C304&resize=350%2C200 1x, https:\/\/i0.wp.com\/www.vicdebaie.com\/blog\/wp-content\/uploads\/2019\/05\/StoryTrackClips.png?fit=851%2C304&resize=700%2C400 2x"},"classes":[]},{"id":253,"url":"http:\/\/www.vicdebaie.com\/blog\/move-a-character-in-motionbuilder-to-the-worlds-center-with-python\/","url_meta":{"origin":102,"position":3},"title":"Move a Character in MotionBuilder to the World&#8217;s Center with Python","author":"admin","date":"March 7, 2018","format":false,"excerpt":"\u200eWith a dozen takes in my Motionbuilder scene and my Character placed at different locations on each take, I decided Python would help me move my Character to the World's Center. With raw Mocap data your Character's Wold Position is all based on the Actors position within the volume during\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\/02\/IMG_4056.jpg?fit=800%2C600&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.vicdebaie.com\/blog\/wp-content\/uploads\/2017\/02\/IMG_4056.jpg?fit=800%2C600&resize=350%2C200 1x, https:\/\/i0.wp.com\/www.vicdebaie.com\/blog\/wp-content\/uploads\/2017\/02\/IMG_4056.jpg?fit=800%2C600&resize=700%2C400 2x"},"classes":[]},{"id":190,"url":"http:\/\/www.vicdebaie.com\/blog\/motionbuilder-python-tool-saveit\/","url_meta":{"origin":102,"position":4},"title":"MotionBuilder Python Tool &#8220;SaveIt&#8221;","author":"admin","date":"February 12, 2017","format":false,"excerpt":"Here is a script\/tool I created for MotionBuilder using Python. \u00a0This tool will\u00a0do an incremental save of your scene. Why? Incremental saves are amazingly useful, I thought a tool that automates the process down to one click would be fun. A big thanks goes out to my college Raphael Lappiere\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\/02\/SaveIt_tool.jpg?fit=600%2C220&resize=350%2C200","width":350,"height":200},"classes":[]},{"id":794,"url":"http:\/\/www.vicdebaie.com\/blog\/using-motionbuilder-python-to-offset-all-animations-within-a-scene\/","url_meta":{"origin":102,"position":5},"title":"Using MotionBuilder Python To Offset All Animations Within A Scene","author":"admin","date":"January 7, 2021","format":false,"excerpt":"Here is a quick script that will allow you to shift\/offset all animation keys within a scene. Previously I would do this via story mode or use another technique that would skip over props and\/or constraints. This script should shift everything within the scene that is animated. The script is\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\/2021\/01\/OffSet-1.jpg?fit=960%2C540&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.vicdebaie.com\/blog\/wp-content\/uploads\/2021\/01\/OffSet-1.jpg?fit=960%2C540&resize=350%2C200 1x, https:\/\/i0.wp.com\/www.vicdebaie.com\/blog\/wp-content\/uploads\/2021\/01\/OffSet-1.jpg?fit=960%2C540&resize=700%2C400 2x"},"classes":[]}],"_links":{"self":[{"href":"http:\/\/www.vicdebaie.com\/blog\/wp-json\/wp\/v2\/posts\/102"}],"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=102"}],"version-history":[{"count":8,"href":"http:\/\/www.vicdebaie.com\/blog\/wp-json\/wp\/v2\/posts\/102\/revisions"}],"predecessor-version":[{"id":311,"href":"http:\/\/www.vicdebaie.com\/blog\/wp-json\/wp\/v2\/posts\/102\/revisions\/311"}],"wp:featuredmedia":[{"embeddable":true,"href":"http:\/\/www.vicdebaie.com\/blog\/wp-json\/wp\/v2\/media\/145"}],"wp:attachment":[{"href":"http:\/\/www.vicdebaie.com\/blog\/wp-json\/wp\/v2\/media?parent=102"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.vicdebaie.com\/blog\/wp-json\/wp\/v2\/categories?post=102"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.vicdebaie.com\/blog\/wp-json\/wp\/v2\/tags?post=102"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}