{"id":550,"date":"2018-06-11T15:17:12","date_gmt":"2018-06-11T19:17:12","guid":{"rendered":"http:\/\/www.vicdebaie.com\/blog\/?p=550"},"modified":"2022-06-20T11:16:02","modified_gmt":"2022-06-20T15:16:02","slug":"stop-foot-sliding-with-motionbuilder-and-python","status":"publish","type":"post","link":"http:\/\/www.vicdebaie.com\/blog\/stop-foot-sliding-with-motionbuilder-and-python\/","title":{"rendered":"Stop Foot Sliding With MotionBuilder and Python"},"content":{"rendered":"<p><img data-attachment-id=\"553\" data-permalink=\"http:\/\/www.vicdebaie.com\/blog\/stop-foot-sliding-with-motionbuilder-and-python\/footslide-2\/\" data-orig-file=\"https:\/\/i0.wp.com\/www.vicdebaie.com\/blog\/wp-content\/uploads\/2018\/06\/footslide-1.jpg?fit=1368%2C912\" data-orig-size=\"1368,912\" 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;1&quot;}\" data-image-title=\"footslide\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/www.vicdebaie.com\/blog\/wp-content\/uploads\/2018\/06\/footslide-1.jpg?fit=300%2C200\" data-large-file=\"https:\/\/i0.wp.com\/www.vicdebaie.com\/blog\/wp-content\/uploads\/2018\/06\/footslide-1.jpg?fit=678%2C452\" decoding=\"async\" loading=\"lazy\" class=\"wp-image-553 aligncenter\" src=\"https:\/\/i0.wp.com\/www.vicdebaie.com\/blog\/wp-content\/uploads\/2018\/06\/footslide-1.jpg?resize=478%2C323\" alt=\"\" width=\"478\" height=\"323\" data-recalc-dims=\"1\" \/><\/p>\n<hr \/>\n<h2><strong>Update<\/strong><\/h2>\n<p>June 20 2022 &#8211;\u00a0<\/p>\n<p>It&#8217;s been a while since I have checked the blog. \ud83d\ude41 Back in January someone posted a comment asking if i ever updated this script\/tool to work with newer MotionBuilders. I have now, sorry for the wait. <br \/>The fix was a quick change, Motionbuilder changed &#8216;FBModelTransformationMatrix&#8217; to &#8216;FBModelTransformationType&#8217; years ago, I think I originally developed this tool on the last version of Mobu to support &#8216;FBModelTransformationMatrix&#8217;. Again, sorry for the late reply.<\/p>\n<p>Oct. 29 2018 &#8211;<\/p>\n<p>For the script to work in MotionBuilder 2018 I had to make a slight change. You can down load a new version of <a href=\"https:\/\/drive.google.com\/open?id=1hQP4IRYDWX7qauaLnTYxJmkLH25dRNFZ\">StopFootSliding here<\/a>, I also made the changes to the script below in the original post.<\/p>\n<p>The only difference between to last release and this one is that I removed an FBContainer, which was just a visual element and had no functional baring on the tool. The attribute FBContainer is no longer supported in MotionBuilder 2018, The new version is FBVisualContainer().<\/p>\n<p>StopFootSliding v1.0 was giving this error in MotionBuilder 2018:<\/p>\n<p>&#8220;cInfo = fb.FBContainer() AttributeError: &#8216;module&#8217; object has no attribute &#8216;FBContainer'&#8221;.<\/p>\n<p>Thanks <a href=\"https:\/\/twitter.com\/287882191HH\">Andy.HH<\/a> for bringing this to my attention.<\/p>\n<hr \/>\n<p>After exploring\u00a0FBVector3d() and creating the <a href=\"http:\/\/www.vicdebaie.com\/blog\/using-motionbuilder-pythons-fbvector3d-to-create-an-animated-align-tool\/\">Animated Align post<\/a>, I started to think &#8220;Hey, why not use that same process and stop a foot from sliding!&#8221;. Using a reference frame we can grab the translation and rotation of an object and then over a range of time have that object match it referenced translations. I decided to work with layers when preventing foot sliding as to not destroy the original data.<\/p>\n<p>Here is a quick demo of the tool (sorry for the poor audio).<\/p>\n<p><iframe loading=\"lazy\" src=\"https:\/\/www.youtube.com\/embed\/4qOM1PLKMeI?rel=0\" width=\"560\" height=\"315\" frameborder=\"0\" allowfullscreen=\"allowfullscreen\"><\/iframe><\/p>\n<p>You can down load the &#8220;StopFoorSliding&#8221; tool <a href=\"https:\/\/drive.google.com\/open?id=1hQP4IRYDWX7qauaLnTYxJmkLH25dRNFZ\">here<\/a>.<\/p>\n<p>Here is the script with my notes:<\/p>\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\nimport pyfbsdk as fb\nimport pyfbsdk_additions as fba\n \ndef GetCurrentFrame():\n    Frame = fb.FBSystem().LocalTime.GetFrame()\n    return Frame\n \ndef GotoFrame(time):\n    t = fb.FBTime(0, 0, 0, time, 0)\n    fb.FBPlayerControl().Goto(t)\n \n##Check For Conflicts In User's Desired Frame Ranges\ndef FrameCheck():\n    ##Does Blend In Conflict With Start Frame\n    if nBlendIn.Value &gt; nStart.Value:\n        fb.FBMessageBox( &quot;Frame Input Error&quot;, &quot;Blend In Frame Is Higher Than The Start Frame&quot;, &quot;OK&quot; )\n        return False\n    ##Does Start Frame Conflict Wtih End Frame\n    if nEnd.Value &lt; nStart.Value:\n        fb.FBMessageBox( &quot;Frame Input Error&quot;, &quot;End Frame Is Lower Than The Start Frame&quot;, &quot;OK&quot; )\n        return False\n    ##Does Blend Out Frame Conflict With End Frame\n    if nBlendOut.Value &lt; nEnd.Value:\n        fb.FBMessageBox( &quot;Frame Input Error&quot;, &quot;Blend Out Frame Is Lower Than The End Frame&quot;, &quot;OK&quot; )\n        return False\n    else:\n        return True\n \n##Get Selected Object\ndef GetSelObj():\n    ModelList = fb.FBModelList()\n    fb.FBGetSelectedModels(ModelList, None, True, True)\n    if len(ModelList) == 1:\n        for Model in ModelList:\n            SelObjName = Model.LongName\n        return SelObjName\n    else:\n        fb.FBMessageBox( &quot;Object Select Error&quot;, &quot;Please Selecte An Object&quot;, &quot;OK&quot; )\n \n##Get Layer Count\ndef GetLayerCount():\n    return fb.FBSystem().CurrentTake.GetLayerCount()\n \n##Zero The Translation and Rotation Of The Selected Object\ndef ZeroTRTransforms(YourObject):\n    YourObject.Translation = fb.FBVector3d()\n    YourObject.Rotation = fb.FBVector3d()\n \n##Create The Layer We Will Work On\ndef CreateLayer():\n    SelObj = GetSelObj()#.rsplit(':', 2)&#x5B;2]\n    fb.FBSystem().CurrentTake.CreateNewLayer()\n    ##Set the new layer as the current one (Keys will be added to that layer)\n    lCount = fb.FBSystem().CurrentTake.GetLayerCount()\n    ##Name the Layer to be &quot;Selected Object Name: Start Frame to End Frame&quot; (ie. LeftHeelPivot: 100-150)\n    fb.FBSystem().CurrentTake.GetLayer(lCount-1).Name = SelObj + &quot; &quot; + str( int(nStart.Value) ) + &quot;-&quot; + str( int(nEnd.Value) )\n    fb.FBSystem().CurrentTake.SetCurrentLayer(lCount-1)\n \n##Enure That Blend In, Ref Pose and Blend Out Translation And Roation Are Preserved\ndef PreserveFrames():\n    ##Create A List Of Frame That We Want ZeroKeys To Be Set On\n    ZeroFrames = ( int(nBlendIn.Value), int(nRef.Value), int(nBlendOut.Value) )\n    ##Get Selected Object\n    YourObject = GetSelObj()\n    for FrameNumber in ZeroFrames:\n        GotoFrame(FrameNumber)\n        fb.FBPlayerControl().Key()\n \n##For Each Frame Between The Defind Start Frame And End Frame We Will Create A Key\n##And Match The Translation And Rotation To That Of The Values On The RefPose Frame\ndef MatchRefPose():\n    GotoFrame( int(nRef.Value) )\n    MyObject = GetSelObj()\n    RefObjTrans = fb.FBVector3d()\n    RefObjRot = fb.FBVector3d()\n    fb.FBFindModelByLabelName(MyObject).GetVector (RefObjTrans, fb.FBModelTransformationType.kModelTranslation, False)\n    fb.FBFindModelByLabelName(MyObject).GetVector (RefObjRot, fb.FBModelTransformationType.kModelRotation, False)\n    GotoFrame( int(nStart.Value) )\n \n    lval = ( int(nEnd.Value) - int(nStart.Value) )\n    lprogsum = 1\n    lpercent = (100.0\/lval)\n \n    for time in range ( int(nStart.Value), int(nEnd.Value) ):\n        if time == int(nRef.Value):\n            pass\n        else:\n            GotoFrame(time)\n            if bTR.State == 1:\n                fb.FBFindModelByLabelName(MyObject).Translation = RefObjTrans\n                fb.FBFindModelByLabelName(MyObject).Rotation = RefObjRot\n                fb.FBPlayerControl().Key()\n            if bTrans.State == 1:\n                if bTX.State == 1:\n                    lTX = RefObjTrans&#x5B;0]\n                if bTX.State != 1:\n                    lTX = fb.FBFindModelByLabelName(MyObject).Translation&#x5B;0]\n                if bTY.State == 1:\n                    lTY = RefObjTrans&#x5B;1]\n                if bTY.State != 1:\n                    lTY = fb.FBFindModelByLabelName(MyObject).Translation&#x5B;1]\n                if bTZ.State == 1:\n                    lTZ = RefObjTrans&#x5B;2]\n                if bTZ.State != 1:\n                    lTZ = fb.FBFindModelByLabelName(MyObject).Translation&#x5B;2]\n                fb.FBFindModelByLabelName(MyObject).Translation = fb.FBVector3d(lTX, lTY, lTZ)\n                fb.FBPlayerControl().Key()\n            if bRot.State == 1:\n                if bRX.State == 1:\n                    lRX = RefObjRot&#x5B;0]\n                if bRX.State != 1:\n                    lRX = fb.FBFindModelByLabelName(MyObject).Rotation&#x5B;0]\n                if bRY.State == 1:\n                    lRY = RefObjRot&#x5B;1]\n                if bRY.State != 1:\n                    lRY = fb.FBFindModelByLabelName(MyObject).Rotation&#x5B;1]\n                if bRZ.State == 1:\n                    lRZ = RefObjRot&#x5B;2]\n                if bRZ.State != 1:\n                    lRZ = fb.FBFindModelByLabelName(MyObject).Rotation&#x5B;2]\n                fb.FBFindModelByLabelName(MyObject).Rotation = fb.FBVector3d(lRX, lRY, lRZ)\n                fb.FBPlayerControl().Key()\n \n##UI Starts Here\n \nhBlendIn = fb.FBLabel()\nnBlendIn = fb.FBEditNumber()\nbBlendIn = fb.FBButton()\nhBlendOut = fb.FBLabel()\nnBlendOut = fb.FBEditNumber()\nbBlendOut = fb.FBButton()\nhStart = fb.FBLabel()\nnStart = fb.FBEditNumber()\nbStart = fb.FBButton()\nhEnd = fb.FBLabel()\nnEnd = fb.FBEditNumber()\nbEnd = fb.FBButton()\nhRef = fb.FBLabel()\nnRef = fb.FBEditNumber()\nbRef = fb.FBButton()\nbTR = fb.FBButton()\nbTrans = fb.FBButton()\nbTX = fb.FBButton()\nbTY = fb.FBButton()\nbTZ = fb.FBButton()\nbRot = fb.FBButton()\nbRX = fb.FBButton()\nbRY = fb.FBButton()\nbRZ = fb.FBButton()\nbStopSliding = fb.FBButton()\n \n##Get Current Frame For Blend In Time\ndef bBlendInCallBack(control, event):\n    CurrentFrame = GetCurrentFrame()\n    nBlendIn.Value = CurrentFrame\n \n##Get Current Frame For Blend Out Time\ndef bBlendOutCallBack(control, event):\n    CurrentFrame = GetCurrentFrame()\n    nBlendOut.Value = CurrentFrame\n \n##Get Current Frame For Start Time\ndef bStartCallBack(control, event):\n    CurrentFrame = GetCurrentFrame()\n    nStart.Value = CurrentFrame\n \n##Get Current Frame For End Time\ndef bBlendEndCallBack(control, event):\n    CurrentFrame = GetCurrentFrame()\n    nEnd.Value = CurrentFrame\n \n##Get Current Frame For Reference Pose Time\ndef bBlendRefCallBack(control, event):\n    CurrentFrame = GetCurrentFrame()\n    nRef.Value = CurrentFrame\n \n##Match Translation and Rotation Transforms\ndef bTRCallBack(control, event):\n    if bTR.State == 1:\n        bTrans.Enabled = bTX.Enabled = bTY.Enabled = bTZ.Enabled = bRot.Enabled = bRX.Enabled = bRY.Enabled = bRZ.Enabled = False\n        bTrans.State = bTX.State = bTY.State = bTZ.State = bRot.State = bRX.State = bRY.State = bRZ.State = False\n    else:\n        bTrans.Enabled = bTX.Enabled = bTY.Enabled = bTZ.Enabled = bRot.Enabled = bRX.Enabled = bRY.Enabled = bRZ.Enabled = True\n        bTrans.State = bTX.State = bTY.State = bTZ.State = True\n \n##Match Translation Transforms\ndef bTransCallBack(control, event):\n    if bTrans.State == 0:\n        bTX.State = bTY.State = bTZ.State = 0\n    else:\n        bTX.State = bTY.State = bTZ.State = 1\n \n##Match Rotation Transforms\ndef bRotCallBack(control, event):\n    if bRot.State == 0:\n        bRX.State = bRY.State = bRZ.State = 0\n    else:\n        bRX.State = bRY.State = bRZ.State = 1\n \n##Stop Sliding\ndef bStopSlidingCallBack(control, event):\n    ##Check That There Is No Conflicts Between Inputs Blend In Frame, Start Frame, End Frame and Blend Out Frame\n    Process = FrameCheck()\n    if Process == True:\n        if bTR.State != 1 and bTrans.State != 1 and bRot.State != 1:\n            fb.FBMessageBox( &quot;Transform Match Error&quot;, &quot;Please Select Which Transforms To Match&quot;, &quot;OK&quot; )\n            pass\n        else:\n            ##Get Users Frame They Were On When Executing The Stop Sliding Button\n            OrgFrame = GetCurrentFrame()\n            ##Get Layer Count So We Can Later Compare\n            lOrgLayCount = GetLayerCount()\n            ##If The User Has An Object Selected Create A New Layer Named After That Object And The Frames Inputed\n            CreateLayer()\n            ##Fail Safe To See If The Layer Was Created\n            lCurLayCount = GetLayerCount()\n            ##If All Is Good\n            if lCurLayCount &gt; lOrgLayCount:\n                PreserveFrames()\n                MatchRefPose()\n                GotoFrame(OrgFrame)\n            ##If Stop Sliding Layer Was Not Able To Be Created\n            else:\n               GotoFrame(OrgFrame)\n               fb.FBMessageBox( &quot;Could Not Process&quot;, &quot;Please Ensure That A Foot Was Selected And Try Again&quot;, &quot;OK&quot; )\n    else:\n      fb.FBMessageBox( &quot;Could Not Process&quot;, &quot;Please Check The Frames You Have Inputed&quot;, &quot;OK&quot; )  \n \ndef PopulateTool(t):\n    #populate regions here\n \n    x = fb.FBAddRegionParam(5,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    y = fb.FBAddRegionParam(10,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    w = fb.FBAddRegionParam(105,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    h = fb.FBAddRegionParam(15,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    t.AddRegion(&quot;hBlendIn&quot;,&quot;hBlendIn&quot;, x, y, w, h)\n \n    t.SetControl(&quot;hBlendIn&quot;, hBlendIn)\n    hBlendIn.Visible = True\n    hBlendIn.ReadOnly = False\n    hBlendIn.Enabled = True\n    hBlendIn.Hint = &quot;&quot;\n    hBlendIn.Caption = &quot;Blend In Frame&quot;\n    hBlendIn.Style = fb.FBTextStyle.kFBTextStyleNone\n    hBlendIn.Justify = fb.FBTextJustify.kFBTextJustifyCenter\n    hBlendIn.WordWrap = False\n \n    x = fb.FBAddRegionParam(5,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    y = fb.FBAddRegionParam(25,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    w = fb.FBAddRegionParam(75,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    h = fb.FBAddRegionParam(30,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    t.AddRegion(&quot;nBlendIn&quot;,&quot;nBlendIn&quot;, x, y, w, h)\n \n    t.SetControl(&quot;nBlendIn&quot;, nBlendIn)\n    nBlendIn.Visible = True\n    nBlendIn.ReadOnly = False\n    nBlendIn.Enabled = True\n    nBlendIn.Hint = &quot;&quot;\n    nBlendIn.Value = 0.000000\n \n    x = fb.FBAddRegionParam(80,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    y = fb.FBAddRegionParam(25,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    w = fb.FBAddRegionParam(30,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    h = fb.FBAddRegionParam(30,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    t.AddRegion(&quot;bBlendIn&quot;,&quot;bBlendIn&quot;, x, y, w, h)\n \n    t.SetControl(&quot;bBlendIn&quot;, bBlendIn)\n    bBlendIn.Visible = True\n    bBlendIn.ReadOnly = False\n    bBlendIn.Enabled = True\n    bBlendIn.Hint = &quot;Use Current Frame&quot;\n    bBlendIn.Caption = &quot;{]&quot;\n    bBlendIn.State = 0\n    bBlendIn.Style = fb.FBButtonStyle.kFBPushButton\n    bBlendIn.Justify = fb.FBTextJustify.kFBTextJustifyCenter\n    bBlendIn.Look = fb.FBButtonLook.kFBLookNormal\n    bBlendIn.OnClick.Add(bBlendInCallBack) \n \n    x = fb.FBAddRegionParam(145,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    y = fb.FBAddRegionParam(10,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    w = fb.FBAddRegionParam(105,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    h = fb.FBAddRegionParam(15,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    t.AddRegion(&quot;hBlendOut&quot;,&quot;hBlendOut&quot;, x, y, w, h)\n \n    t.SetControl(&quot;hBlendOut&quot;, hBlendOut)\n    hBlendOut.Visible = True\n    hBlendOut.ReadOnly = False\n    hBlendOut.Enabled = True\n    hBlendOut.Hint = &quot;&quot;\n    hBlendOut.Caption = &quot;Blend Out Frame&quot;\n    hBlendOut.Style = fb.FBTextStyle.kFBTextStyleNone\n    hBlendOut.Justify = fb.FBTextJustify.kFBTextJustifyCenter\n    hBlendOut.WordWrap = False\n \n    x = fb.FBAddRegionParam(145,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    y = fb.FBAddRegionParam(25,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    w = fb.FBAddRegionParam(75,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    h = fb.FBAddRegionParam(30,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    t.AddRegion(&quot;nBlendOut&quot;,&quot;nBlendOut&quot;, x, y, w, h)\n \n    t.SetControl(&quot;nBlendOut&quot;, nBlendOut)\n    nBlendOut.Visible = True\n    nBlendOut.ReadOnly = False\n    nBlendOut.Enabled = True\n    nBlendOut.Hint = &quot;&quot;\n    nBlendOut.Value = 0.000000\n \n    x = fb.FBAddRegionParam(220,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    y = fb.FBAddRegionParam(25,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    w = fb.FBAddRegionParam(30,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    h = fb.FBAddRegionParam(30,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    t.AddRegion(&quot;bBlendOut&quot;,&quot;bBlendOut&quot;, x, y, w, h)\n \n    t.SetControl(&quot;bBlendOut&quot;, bBlendOut)\n    bBlendOut.Visible = True\n    bBlendOut.ReadOnly = False\n    bBlendOut.Enabled = True\n    bBlendOut.Hint = &quot;Use Current Frame&quot;\n    bBlendOut.Caption = &quot;{]&quot;\n    bBlendOut.State = 0\n    bBlendOut.Style = fb.FBButtonStyle.kFBPushButton\n    bBlendOut.Justify = fb.FBTextJustify.kFBTextJustifyCenter\n    bBlendOut.Look = fb.FBButtonLook.kFBLookNormal\n    bBlendOut.OnClick.Add(bBlendOutCallBack) \n \n    x = fb.FBAddRegionParam(5,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    y = fb.FBAddRegionParam(65,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    w = fb.FBAddRegionParam(105,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    h = fb.FBAddRegionParam(15,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    t.AddRegion(&quot;hStart&quot;,&quot;hStart&quot;, x, y, w, h)\n \n    t.SetControl(&quot;hStart&quot;, hStart)\n    hStart.Visible = True\n    hStart.ReadOnly = False\n    hStart.Enabled = True\n    hStart.Hint = &quot;&quot;\n    hStart.Caption = &quot;Start Frame&quot;\n    hStart.Style = fb.FBTextStyle.kFBTextStyleNone\n    hStart.Justify = fb.FBTextJustify.kFBTextJustifyCenter\n    hStart.WordWrap = False\n \n    x = fb.FBAddRegionParam(5,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    y = fb.FBAddRegionParam(80,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    w = fb.FBAddRegionParam(75,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    h = fb.FBAddRegionParam(30,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    t.AddRegion(&quot;nStart&quot;,&quot;nStart&quot;, x, y, w, h)\n \n    t.SetControl(&quot;nStart&quot;, nStart)\n    nStart.Visible = True\n    nStart.ReadOnly = False\n    nStart.Enabled = True\n    nStart.Hint = &quot;&quot;\n    nStart.Value = 0.000000\n \n    x = fb.FBAddRegionParam(80,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    y = fb.FBAddRegionParam(80,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    w = fb.FBAddRegionParam(30,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    h = fb.FBAddRegionParam(30,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    t.AddRegion(&quot;bStart&quot;,&quot;bStart&quot;, x, y, w, h)\n \n    t.SetControl(&quot;bStart&quot;, bStart)\n    bStart.Visible = True\n    bStart.ReadOnly = False\n    bStart.Enabled = True\n    bStart.Hint = &quot;Use Current Frame&quot;\n    bStart.Caption = &quot;{]&quot;\n    bStart.State = 0\n    bStart.Style = fb.FBButtonStyle.kFBPushButton\n    bStart.Justify = fb.FBTextJustify.kFBTextJustifyCenter\n    bStart.Look = fb.FBButtonLook.kFBLookNormal\n    bStart.OnClick.Add(bStartCallBack) \n \n    x = fb.FBAddRegionParam(145,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    y = fb.FBAddRegionParam(65,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    w = fb.FBAddRegionParam(105,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    h = fb.FBAddRegionParam(15,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    t.AddRegion(&quot;hEnd&quot;,&quot;hEnd&quot;, x, y, w, h)\n \n    t.SetControl(&quot;hEnd&quot;, hEnd)\n    hEnd.Visible = True\n    hEnd.ReadOnly = False\n    hEnd.Enabled = True\n    hEnd.Hint = &quot;&quot;\n    hEnd.Caption = &quot;End Frame&quot;\n    hEnd.Style = fb.FBTextStyle.kFBTextStyleNone\n    hEnd.Justify = fb.FBTextJustify.kFBTextJustifyCenter\n    hEnd.WordWrap = False\n \n    x = fb.FBAddRegionParam(145,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    y = fb.FBAddRegionParam(80,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    w = fb.FBAddRegionParam(75,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    h = fb.FBAddRegionParam(30,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    t.AddRegion(&quot;nEnd&quot;,&quot;nEnd&quot;, x, y, w, h)\n \n    t.SetControl(&quot;nEnd&quot;, nEnd)\n    nEnd.Visible = True\n    nEnd.ReadOnly = False\n    nEnd.Enabled = True\n    nEnd.Hint = &quot;&quot;\n    nEnd.Value = 0.000000\n \n    x = fb.FBAddRegionParam(220,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    y = fb.FBAddRegionParam(80,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    w = fb.FBAddRegionParam(30,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    h = fb.FBAddRegionParam(30,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    t.AddRegion(&quot;bEnd&quot;,&quot;bEnd&quot;, x, y, w, h)\n \n    t.SetControl(&quot;bEnd&quot;, bEnd)\n    bEnd.Visible = True\n    bEnd.ReadOnly = False\n    bEnd.Enabled = True\n    bEnd.Hint = &quot;Use Current Frame&quot;\n    bEnd.Caption = &quot;{]&quot;\n    bEnd.State = 0\n    bEnd.Style = fb.FBButtonStyle.kFBPushButton\n    bEnd.Justify = fb.FBTextJustify.kFBTextJustifyCenter\n    bEnd.Look = fb.FBButtonLook.kFBLookNormal\n    bEnd.OnClick.Add(bBlendEndCallBack) \n \n    x = fb.FBAddRegionParam(75,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    y = fb.FBAddRegionParam(120,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    w = fb.FBAddRegionParam(105,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    h = fb.FBAddRegionParam(15,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    t.AddRegion(&quot;hRef&quot;,&quot;hRef&quot;, x, y, w, h)\n \n    t.SetControl(&quot;hRef&quot;, hRef)\n    hRef.Visible = True\n    hRef.ReadOnly = False\n    hRef.Enabled = True\n    hRef.Hint = &quot;&quot;\n    hRef.Caption = &quot;Reference Frame&quot;\n    hRef.Style = fb.FBTextStyle.kFBTextStyleBold\n    hRef.Justify = fb.FBTextJustify.kFBTextJustifyCenter\n    hRef.WordWrap = False\n \n    x = fb.FBAddRegionParam(75,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    y = fb.FBAddRegionParam(135,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    w = fb.FBAddRegionParam(75,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    h = fb.FBAddRegionParam(30,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    t.AddRegion(&quot;nRef&quot;,&quot;nRef&quot;, x, y, w, h)\n \n    t.SetControl(&quot;nRef&quot;, nRef)\n    nRef.Visible = True\n    nRef.ReadOnly = False\n    nRef.Enabled = True\n    nRef.Hint = &quot;&quot;\n    nRef.Value = 0.000000\n \n    x = fb.FBAddRegionParam(150,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    y = fb.FBAddRegionParam(135,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    w = fb.FBAddRegionParam(30,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    h = fb.FBAddRegionParam(30,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    t.AddRegion(&quot;bRef&quot;,&quot;bRef&quot;, x, y, w, h)\n \n    t.SetControl(&quot;bRef&quot;, bRef)\n    bRef.Visible = True\n    bRef.ReadOnly = False\n    bRef.Enabled = True\n    bRef.Hint = &quot;Use Current Frame&quot;\n    bRef.Caption = &quot;{]&quot;\n    bRef.State = 0\n    bRef.Style = fb.FBButtonStyle.kFBPushButton\n    bRef.Justify = fb.FBTextJustify.kFBTextJustifyCenter\n    bRef.Look = fb.FBButtonLook.kFBLookNormal\n    bRef.OnClick.Add(bBlendRefCallBack) \n \n    x = fb.FBAddRegionParam(5,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    y = fb.FBAddRegionParam(185,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    w = fb.FBAddRegionParam(40,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    h = fb.FBAddRegionParam(25,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    t.AddRegion(&quot;bTR&quot;,&quot;bTR&quot;, x, y, w, h)\n \n    t.SetControl(&quot;bTR&quot;, bTR)\n    bTR.Visible = True\n    bTR.ReadOnly = False\n    bTR.Enabled = True\n    bTR.Hint = &quot;Affect Translation And Rotation&quot;\n    bTR.Caption = &quot;TR&quot;\n    bTR.State = 0\n    bTR.Style = fb.FBButtonStyle.kFBCheckbox\n    bTR.Justify = fb.FBTextJustify.kFBTextJustifyLeft\n    bTR.Look = fb.FBButtonLook.kFBLookNormal\n    bTR.OnClick.Add(bTRCallBack) \n \n    x = fb.FBAddRegionParam(60,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    y = fb.FBAddRegionParam(185,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    w = fb.FBAddRegionParam(90,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    h = fb.FBAddRegionParam(25,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    t.AddRegion(&quot;bTrans&quot;,&quot;bTrans&quot;, x, y, w, h)\n \n    t.SetControl(&quot;bTrans&quot;, bTrans)\n    bTrans.Visible = True\n    bTrans.ReadOnly = False\n    bTrans.Enabled = True\n    bTrans.Hint = &quot;Affect Translation&quot;\n    bTrans.Caption = &quot;Translation&quot;\n    bTrans.State = 1\n    bTrans.Style = fb.FBButtonStyle.kFBCheckbox\n    bTrans.Justify = fb.FBTextJustify.kFBTextJustifyLeft\n    bTrans.Look = fb.FBButtonLook.kFBLookNormal\n    bTrans.OnClick.Add(bTransCallBack) \n \n    x = fb.FBAddRegionParam(60,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    y = fb.FBAddRegionParam(210,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    w = fb.FBAddRegionParam(30,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    h = fb.FBAddRegionParam(30,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    t.AddRegion(&quot;bTX&quot;,&quot;bTX&quot;, x, y, w, h)\n \n    t.SetControl(&quot;bTX&quot;, bTX)\n    bTX.Visible = True\n    bTX.ReadOnly = False\n    bTX.Enabled = True\n    bTX.Hint = &quot;&quot;\n    bTX.Caption = &quot;X&quot;\n    bTX.State = 1\n    bTX.Style = fb.FBButtonStyle.kFBCheckbox\n    bTX.Justify = fb.FBTextJustify.kFBTextJustifyLeft\n    bTX.Look = fb.FBButtonLook.kFBLookNormal\n \n    x = fb.FBAddRegionParam(90,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    y = fb.FBAddRegionParam(210,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    w = fb.FBAddRegionParam(30,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    h = fb.FBAddRegionParam(30,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    t.AddRegion(&quot;bTY&quot;,&quot;bTY&quot;, x, y, w, h)\n \n    t.SetControl(&quot;bTY&quot;, bTY)\n    bTY.Visible = True\n    bTY.ReadOnly = False\n    bTY.Enabled = True\n    bTY.Hint = &quot;&quot;\n    bTY.Caption = &quot;Y&quot;\n    bTY.State = 1\n    bTY.Style = fb.FBButtonStyle.kFBCheckbox\n    bTY.Justify = fb.FBTextJustify.kFBTextJustifyLeft\n    bTY.Look = fb.FBButtonLook.kFBLookNormal\n \n    x = fb.FBAddRegionParam(120,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    y = fb.FBAddRegionParam(210,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    w = fb.FBAddRegionParam(30,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    h = fb.FBAddRegionParam(30,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    t.AddRegion(&quot;bTZ&quot;,&quot;bTZ&quot;, x, y, w, h)\n \n    t.SetControl(&quot;bTZ&quot;, bTZ)\n    bTZ.Visible = True\n    bTZ.ReadOnly = False\n    bTZ.Enabled = True\n    bTZ.Hint = &quot;&quot;\n    bTZ.Caption = &quot;Z&quot;\n    bTZ.State = 1\n    bTZ.Style = fb.FBButtonStyle.kFBCheckbox\n    bTZ.Justify = fb.FBTextJustify.kFBTextJustifyLeft\n    bTZ.Look = fb.FBButtonLook.kFBLookNormal\n \n    x = fb.FBAddRegionParam(160,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    y = fb.FBAddRegionParam(185,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    w = fb.FBAddRegionParam(90,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    h = fb.FBAddRegionParam(25,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    t.AddRegion(&quot;bRot&quot;,&quot;bRot&quot;, x, y, w, h)\n \n    t.SetControl(&quot;bRot&quot;, bRot)\n    bRot.Visible = True\n    bRot.ReadOnly = False\n    bRot.Enabled = True\n    bRot.Hint = &quot;&quot;\n    bRot.Caption = &quot;Rotation&quot;\n    bRot.State = 0\n    bRot.Style = fb.FBButtonStyle.kFBCheckbox\n    bRot.Justify = fb.FBTextJustify.kFBTextJustifyLeft\n    bRot.Look = fb.FBButtonLook.kFBLookNormal\n    bRot.OnClick.Add(bRotCallBack) \n \n    x = fb.FBAddRegionParam(160,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    y = fb.FBAddRegionParam(210,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    w = fb.FBAddRegionParam(30,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    h = fb.FBAddRegionParam(30,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    t.AddRegion(&quot;bRX&quot;,&quot;bRX&quot;, x, y, w, h)\n \n    t.SetControl(&quot;bRX&quot;, bRX)\n    bRX.Visible = True\n    bRX.ReadOnly = False\n    bRX.Enabled = True\n    bRX.Hint = &quot;&quot;\n    bRX.Caption = &quot;X&quot;\n    bRX.State = 0\n    bRX.Style = fb.FBButtonStyle.kFBCheckbox\n    bRX.Justify = fb.FBTextJustify.kFBTextJustifyLeft\n    bRX.Look = fb.FBButtonLook.kFBLookNormal \n \n    x = fb.FBAddRegionParam(190,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    y = fb.FBAddRegionParam(210,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    w = fb.FBAddRegionParam(30,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    h = fb.FBAddRegionParam(30,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    t.AddRegion(&quot;bRY&quot;,&quot;bRY&quot;, x, y, w, h)\n \n    t.SetControl(&quot;bRY&quot;, bRY)\n    bRY.Visible = True\n    bRY.ReadOnly = False\n    bRY.Enabled = True\n    bRY.Hint = &quot;&quot;\n    bRY.Caption = &quot;Y&quot;\n    bRY.State = 0\n    bRY.Style = fb.FBButtonStyle.kFBCheckbox\n    bRY.Justify = fb.FBTextJustify.kFBTextJustifyLeft\n    bRY.Look = fb.FBButtonLook.kFBLookNormal \n \n    x = fb.FBAddRegionParam(220,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    y = fb.FBAddRegionParam(210,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    w = fb.FBAddRegionParam(30,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    h = fb.FBAddRegionParam(30,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    t.AddRegion(&quot;bRZ&quot;,&quot;bRZ&quot;, x, y, w, h)\n \n    t.SetControl(&quot;bRZ&quot;, bRZ)\n    bRZ.Visible = True\n    bRZ.ReadOnly = False\n    bRZ.Enabled = True\n    bRZ.Hint = &quot;&quot;\n    bRZ.Caption = &quot;Z&quot;\n    bRZ.State = 0\n    bRZ.Style = fb.FBButtonStyle.kFBCheckbox\n    bRZ.Justify = fb.FBTextJustify.kFBTextJustifyLeft\n    bRZ.Look = fb.FBButtonLook.kFBLookNormal\n \n    x = fb.FBAddRegionParam(0,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    y = fb.FBAddRegionParam(270,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    w = fb.FBAddRegionParam(255,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    h = fb.FBAddRegionParam(50,fb.FBAttachType.kFBAttachNone,&quot;&quot;)\n    t.AddRegion(&quot;bStopSliding&quot;,&quot;bStopSliding&quot;, x, y, w, h)\n \n    t.SetControl(&quot;bStopSliding&quot;, bStopSliding)\n    bStopSliding.Visible = True\n    bStopSliding.ReadOnly = False\n    bStopSliding.Enabled = True\n    bStopSliding.Hint = &quot;&quot;\n    bStopSliding.Caption = &quot;Stop Sliding&quot;\n    bStopSliding.State = 0\n    bStopSliding.Style = fb.FBButtonStyle.kFBPushButton\n    bStopSliding.Justify = fb.FBTextJustify.kFBTextJustifyCenter\n    bStopSliding.Look = fb.FBButtonLook.kFBLookNormal\n    bStopSliding.OnClick.Add(bStopSlidingCallBack) \n \ndef CreateTool():\n    t = fba.FBCreateUniqueTool(&quot;Stop Foot Sliding v1.0&quot;)\n    t.StartSizeX = 270\n    t.StartSizeY = 370\n    PopulateTool(t)\n    fb.ShowTool(t)\nCreateTool()\n<\/pre><\/div>\n\n\n<pre class=\"wp-block-preformatted\">I know you can create Effectors to lock down feet or use the \"Copy Next\/Previous Key On Selected IK Object\", but this was really fun to create and see it come about. I hope you enjoy learning from the script and as always, I hope this helps.<\/pre>\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>Update June 20 2022 &#8211;\u00a0 It&#8217;s been a while since I have checked the blog. \ud83d\ude41 Back in January someone posted a comment asking if i ever updated this script\/tool to work with newer MotionBuilders. I have now, sorry for the wait. The fix was a quick change, Motionbuilder changed &#8216;FBModelTransformationMatrix&#8217; to &#8216;FBModelTransformationType&#8217; years ago, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":553,"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,7,8],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/www.vicdebaie.com\/blog\/wp-content\/uploads\/2018\/06\/footslide-1.jpg?fit=1368%2C912","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p8pltq-8S","jetpack_likes_enabled":true,"jetpack-related-posts":[{"id":566,"url":"http:\/\/www.vicdebaie.com\/blog\/motionbuilder-python-parent-constraint-tool\/","url_meta":{"origin":550,"position":0},"title":"MotionBuilder Python Parent Constraint Tool","author":"admin","date":"June 18, 2018","format":false,"excerpt":"Here is a quick post to share a tool I created a little while back. It is designed to help to quickly create Parent Constraints between two objects as well as easily allow the user to bake that constraint down. The script can be found HERE and there are 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\/2017\/02\/img_3937.jpg?fit=443%2C364&resize=350%2C200","width":350,"height":200},"classes":[]},{"id":739,"url":"http:\/\/www.vicdebaie.com\/blog\/motionbuilder-python-choose-interaction-mode-tool\/","url_meta":{"origin":550,"position":1},"title":"MotionBuilder Python -Choose Interaction Mode Tool","author":"admin","date":"November 18, 2019","format":false,"excerpt":"A quick script that allows the user to change Motionbuilder's Interaction Mode with a single click","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\/11\/GUID-1F064D55-DE9A-4005-9179-80AAAAD4B3AA.png?fit=356%2C202&resize=350%2C200","width":350,"height":200},"classes":[]},{"id":190,"url":"http:\/\/www.vicdebaie.com\/blog\/motionbuilder-python-tool-saveit\/","url_meta":{"origin":550,"position":2},"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":63,"url":"http:\/\/www.vicdebaie.com\/blog\/hello-world-a-k-a-let-us-begin\/","url_meta":{"origin":550,"position":3},"title":"Hello World! &#8211; A.k.a &#8220;Let us begin&#8221;","author":"admin","date":"February 6, 2017","format":false,"excerpt":"Here is my first posting for this experiment - \"the blog\". For the last two weeks I have been mucking around with Python scripting within MotionBuilder. It has been an uphill battle. With the limited resources out there all I can really do is hack away at bits and pieces\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_3934.jpg?fit=526%2C492&resize=350%2C200","width":350,"height":200},"classes":[]},{"id":627,"url":"http:\/\/www.vicdebaie.com\/blog\/pivot-tool-v1-motionbuilder-python\/","url_meta":{"origin":550,"position":4},"title":"Pivot Tool v1 &#8211; MotionBuilder Python","author":"admin","date":"October 19, 2018","format":false,"excerpt":"\u00a0 Updated: Pivot Tool\u00a0 now supports MotionBuilder 2018! :) and in the post below under \"Versions\". 2018 version can be found here and in the post below under \"Versions\". Versions: PivotTool v1.0 for MotionBuilder 2018 PivotTool v1.0 for MotionBuilder 2015 Here is a tool that will help you quickly create\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\/10\/pivot.gif?fit=498%2C284&resize=350%2C200","width":350,"height":200},"classes":[]},{"id":711,"url":"http:\/\/www.vicdebaie.com\/blog\/using-motionbuilder-python-to-cast-real-time-shadows\/","url_meta":{"origin":550,"position":5},"title":"Using MotionBuilder Python To Cast Real-Time Shadows","author":"admin","date":"September 18, 2019","format":false,"excerpt":"Using Python To Quickly Add A Real Time Shadow To Your MotionBuilder Scene.","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\/09\/ShadowCube.png?fit=1157%2C526&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.vicdebaie.com\/blog\/wp-content\/uploads\/2019\/09\/ShadowCube.png?fit=1157%2C526&resize=350%2C200 1x, https:\/\/i0.wp.com\/www.vicdebaie.com\/blog\/wp-content\/uploads\/2019\/09\/ShadowCube.png?fit=1157%2C526&resize=700%2C400 2x, https:\/\/i0.wp.com\/www.vicdebaie.com\/blog\/wp-content\/uploads\/2019\/09\/ShadowCube.png?fit=1157%2C526&resize=1050%2C600 3x"},"classes":[]}],"_links":{"self":[{"href":"http:\/\/www.vicdebaie.com\/blog\/wp-json\/wp\/v2\/posts\/550"}],"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=550"}],"version-history":[{"count":10,"href":"http:\/\/www.vicdebaie.com\/blog\/wp-json\/wp\/v2\/posts\/550\/revisions"}],"predecessor-version":[{"id":822,"href":"http:\/\/www.vicdebaie.com\/blog\/wp-json\/wp\/v2\/posts\/550\/revisions\/822"}],"wp:featuredmedia":[{"embeddable":true,"href":"http:\/\/www.vicdebaie.com\/blog\/wp-json\/wp\/v2\/media\/553"}],"wp:attachment":[{"href":"http:\/\/www.vicdebaie.com\/blog\/wp-json\/wp\/v2\/media?parent=550"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.vicdebaie.com\/blog\/wp-json\/wp\/v2\/categories?post=550"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.vicdebaie.com\/blog\/wp-json\/wp\/v2\/tags?post=550"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}