scriptJob execution when playback stops

by nazmiprinter posted 131 days ago | 1 comment

Hi, i basically setup a scriptJob with attributeChange on enum for matching IK/FK for left arm. It works fine at the viewport but it's not behaving as i'd expect to when i try to animate it. I'm probably missing something but couldn't find what it is. Here is the video of what's happening:

https://gfycat.com/WellwornEvergreenAdder

The code example just for the left arm:

myCode = '''from maya import cmds, OpenMaya
def leftArmMatch(*arg):

            #IK TO FK
            if cmds.getAttr('arm_L_settings_CTRL.IK') == 10 :
                cmds.matchTransform('arm_L_Shoulder_FK_CTRL', 'arm_L_Shoulder_bind_JNT')
                cmds.matchTransform('arm_L_Elbow_FK_CTRL', 'arm_L_Elbow_bind_JNT')
                cmds.matchTransform('arm_L_Wrist_FK_CTRL', 'arm_L_Wrist_bind_JNT')

                cmds.setAttr('arm_L_settings_CTRL.IK', 0)
            #FK TO IK
            else:
                startJnt = 'arm_L_Shoulder_bind_JNT'
                midJnt = 'arm_L_Elbow_bind_JNT'
                endJnt = 'arm_L_Wrist_bind_JNT'

                start = cmds.xform(startJnt ,q= 1 ,ws = 1,t =1 )
                mid = cmds.xform(midJnt ,q= 1 ,ws = 1,t =1 )
                end = cmds.xform(endJnt ,q= 1 ,ws = 1,t =1 )

                startV = OpenMaya.MVector(start[0] ,start[1],start[2])
                midV = OpenMaya.MVector(mid[0] ,mid[1],mid[2])
                endV = OpenMaya.MVector(end[0] ,end[1],end[2])

                startEnd = endV - startV
                startMid = midV - startV

                dotP = startMid * startEnd
                proj = float(dotP) / float(startEnd.length())
                startEndN = startEnd.normal()
                projV = startEndN * proj

                arrowV = startMid - projV
                arrowV*= 1
                finalV = arrowV + midV

                pv = 'arm_L_Elbow_PV_CTRL'
                cmds.xform(pv , ws =1 , t= (finalV.x , finalV.y ,finalV.z))


                cmds.matchTransform('arm_L_Wrist_IK_CTRL', 'arm_L_Wrist_bind_JNT')

                cmds.setAttr('arm_L_settings_CTRL.IK', 10)

cmds.scriptJob(attributeChange=['arm_L_settings_CTRL.match', leftArmMatch])

#scriptNode

cmds.scriptNode(st=2, bs=myCode.replace("'''", "''"), n='matchScriptNode', stp='python')
by yarrysp posted 130 days ago

Try switching from Parallel evaluation mode to DG or even Serial.

Sometimes, Maya's viewport 2.0 with parallel processing tries to optimize performance in funky ways, leading to stuff not being evaluated properly.

Alternatively, look into callbacks in openmaya. It's a better alternative to scriptjobs.