Beispiel #1
0
from sgMaya import sgCmds
import pymel.core

sels = pymel.core.ls(sl=1)
newObjs = []
for sel in sels:
    newObj = sgCmds.putObject(sel, 'locator')
    sgCmds.constrain_parent(sel, newObj)
    newObjs.append(newObj)
pymel.core.select(newObjs)
Beispiel #2
0
def buildArcControl( numJointUpper, numJointLower, typ='arm' ):
    
    armTops = []
    armMiddles = []
    armEnds = []
    fkIkCtls = []
    
    for side in ['_L_', '_R_' ]:
        armTops    += pymel.core.ls( 'jnt%s%s0' % ( side, typ ) )
        armMiddles += pymel.core.ls( 'jnt%s%s1' % ( side, typ ) )
        armEnds    += pymel.core.ls( 'jnt%s%s1_end' % ( side, typ ) )
        fkIkCtls += pymel.core.ls( 'anim%s%s_IKFK' % ( side, typ ) )

    if not armTops:
        for side in ['_L_', '_R_' ]:
            armTops    += pymel.core.ls( '%s01%sJNT' % ( typ.capitalize(), side ) )
            armMiddles += pymel.core.ls( '%s02%sJNT' % ( typ.capitalize(), side ) )
            armEnds    += pymel.core.ls( '%s03%sJNT' % ( typ.capitalize(), side ) )
            fkIkCtls += pymel.core.ls( '%s%sIKFKSwitch' % ( typ.capitalize(), side ) )

    for sideIndex in range( 2 ):
        coreGrp = pymel.core.createNode( 'transform', n='%sInterporationCoreGrp%s' % ( typ.capitalize(), ['_L_','_R_'][sideIndex] ) )
        pymel.core.xform( coreGrp, ws=1, matrix=pymel.core.xform( armTops[sideIndex], q=1, ws=1, matrix=1 ) )
        
        armTop = armTops[sideIndex]
        armMiddle = armMiddles[sideIndex]
        armEnd = armEnds[sideIndex]
        
        armUpper = sgCmds.addMiddleTranslateJoint( armMiddle, n='MiddleJnt_' + armMiddle )
        armRotMiddle = sgCmds.addMiddleJoint( armMiddle, n='MiddleRotJnt_' + armMiddle )
        armLower = sgCmds.addMiddleTranslateJoint( armEnd, n='MiddleJnt_' + armEnd )
        
        targets = [ armTop, armMiddle, armEnd ]
        circleSubCtls = []
        for i in range( len( targets ) ):
            circleSubCtl = pymel.core.circle( normal=[1,0,0], n=targets[i].replace( 'jnt_', 'sub_Ctl_' ), radius=0.1 )[0]
            circleSubCtlGrp = pymel.core.group( circleSubCtl, n='P' + circleSubCtl )
            pymel.core.parent( circleSubCtlGrp, coreGrp )
            pymel.core.xform( circleSubCtlGrp, ws=1, matrix=targets[i].wm.get() )
            circleSubCtls.append( circleSubCtl )
        
        firstSubCtl  = circleSubCtls[0]
        secondSubCtl = circleSubCtls[1]
        thirdSubCtl  = circleSubCtls[2]
        
        upperSubCtl = pymel.core.circle( normal=[1,0,0], n=secondSubCtl + '_upper', radius=0.1 )[0]
        upperSubCtlOffset = pymel.core.group( upperSubCtl, n='Offset' + upperSubCtl )
        upperSubCtlGrp = pymel.core.group( upperSubCtlOffset, n='P' + upperSubCtl )
        lowerSubCtl = pymel.core.circle( normal=[1,0,0], n=secondSubCtl + '_lower', radius=0.1 )[0]
        lowerSubCtlOffset = pymel.core.group( lowerSubCtl, n='Offset' + lowerSubCtl )
        lowerSubCtlGrp = pymel.core.group( lowerSubCtlOffset, n='P' + lowerSubCtl )
        
        pymel.core.parent( upperSubCtlGrp, coreGrp )
        pymel.core.parent( lowerSubCtlGrp, coreGrp )
        
        pymel.core.xform( upperSubCtlGrp, ws=1, matrix=firstSubCtl.wm.get() )
        pymel.core.xform( lowerSubCtlGrp, ws=1, matrix=secondSubCtl.wm.get() )
        
        firstPos = pymel.core.xform( firstSubCtl, q=1, ws=1, t=1 )
        secondPos = pymel.core.xform( secondSubCtl, q=1, ws=1, t=1 )
        thirdPos = pymel.core.xform( thirdSubCtl, q=1, ws=1, t=1 )
        
        upperPos = [ (firstPos[i] + secondPos[i])/2 for i in range( 3 ) ]
        lowerPos = [ (secondPos[i] + thirdPos[i])/2 for i in range( 3 ) ]
        
        pymel.core.xform( upperSubCtlGrp, ws=1, t=upperPos )
        pymel.core.xform( lowerSubCtlGrp, ws=1, t=lowerPos )

        def getPointOneTwo( pointerCtl1, pointerCtl2, baseCtl ):
            
            point1Dcmp = sgCmds.getLocalDecomposeMatrix( pointerCtl1.wm, baseCtl.wim )
            point2Dcmp = sgCmds.getLocalDecomposeMatrix( pointerCtl2.wm, baseCtl.wim )
            
            point1 = sgCmds.makeChild( baseCtl, n='pointer1_' + baseCtl )
            point2 = sgCmds.makeChild( baseCtl, n='pointer2_' + baseCtl )
            
            point1Dcmp.otx >> point1.tx
            point2Dcmp.otx >> point2.tx
            
            sgCmds.convertMultDoubleConnection( point1.tx ).set( 0.5 )
            sgCmds.convertMultDoubleConnection( point2.tx ).set( 0.5 )
            
            point1.dh.set( 1 )
            point2.dh.set( 1 )
            
            return point1, point2
        
        def disconnectRotate( inputNode ):
            node = pymel.core.ls( inputNode )[0]
            cons = node.r.listConnections( s=1, d=0, p=1 )
            if cons:
                cons[0] // node.r
        
        upperPoint1, upperPoint2 = getPointOneTwo( firstSubCtl, secondSubCtl, upperSubCtl )
        lowerPoint1, lowerPoint2 = getPointOneTwo( secondSubCtl, thirdSubCtl, lowerSubCtl )
        
        upperCurve = sgCmds.makeCurveFromObjects( firstSubCtl,  upperPoint1, upperPoint2, secondSubCtl )
        lowerCurve = sgCmds.makeCurveFromObjects( secondSubCtl, lowerPoint1, lowerPoint2, thirdSubCtl  )
        upperCurve.setParent( coreGrp ); upperCurve.t.set( 0,0,0 ); upperCurve.r.set( 0,0,0 )
        lowerCurve.setParent( coreGrp ); lowerCurve.t.set( 0,0,0 ); lowerCurve.r.set( 0,0,0 )
        
        upperJoints = sgCmds.createPointOnCurve( upperCurve, numJointUpper, nodeType='joint', vector=[1,0,0] )
        lowerJoints = sgCmds.createPointOnCurve( lowerCurve, numJointLower, nodeType='joint', vector=[1,0,0] )
        
        pymel.core.parent( upperJoints, coreGrp )
        pymel.core.parent( lowerJoints, coreGrp )
        for upperJoint in upperJoints:
            upperJoint.jo.set( 0,0,0 )
        for lowerJoint in lowerJoints:
            lowerJoint.jo.set( 0,0,0 )
        
        disconnectRotate( upperJoints[0] )
        pymel.core.delete( upperJoints[-1] )
        disconnectRotate( lowerJoints[0] )
        disconnectRotate( lowerJoints[-1] )
        
        sgCmds.blendTwoMatrixConnect( upperJoints[-2], lowerJoints[1], lowerJoints[0], ct=False )
        
        ctlGrp = pymel.core.createNode( 'transform', n='%sInterporationCtlGrp%s' % ( typ.capitalize(), ['_L_','_R_'][sideIndex] ) )
        sgCmds.constrain_all(armTop, ctlGrp)
        pymel.core.xform( ctlGrp, os=1, matrix= sgCmds.getDefaultMatrix() )
        sgCmds.addAttr( fkIkCtls[sideIndex], ln='showArcCtls', cb=1, min=0, max=1, at='long' )
        fkIkCtls[sideIndex].showArcCtls >> ctlGrp.v
        fkIkCtls[sideIndex].showArcCtls.set( 1 )
        sgCmds.addAttr( fkIkCtls[sideIndex], ln='arc', k=1, min=0, max=1 )
        
        circleCtls = []
        for i in range( len( targets ) ):
            circleCtl = pymel.core.circle( normal=[1,0,0], n=targets[i].replace( 'jnt_', 'Ctl_itp_' ), radius=0.5 )[0]
            circleCtlGrp = pymel.core.group( circleCtl, n='P' + circleCtl )
            pymel.core.parent( circleCtlGrp )
            pymel.core.xform( circleCtlGrp, ws=1, matrix=targets[i].wm.get() )
            circleCtls.append( circleCtl )
        
        for i in range( len( targets ) ):
            circleCtls[i].t >> circleSubCtls[i].t
            circleCtls[i].r >> circleSubCtls[i].r

        sgCmds.constrain_parent( armTop, circleCtls[0].getParent() )
        sgCmds.constrain_parent( armRotMiddle, circleCtls[1].getParent() )
        sgCmds.constrain_parent( armEnd, circleCtls[2].getParent() )

        upperCtl = pymel.core.circle( normal=[1,0,0], n=circleCtls[1] + '_upper', radius=0.5 )[0]
        upperCtlOffset = pymel.core.group( upperCtl, n='Offset' + upperCtl )
        upperCtlGrp = pymel.core.group( upperCtlOffset, n='P' + upperCtl )
        lowerCtl = pymel.core.circle( normal=[1,0,0], n=circleCtls[1] + '_lower', radius=0.5 )[0]
        lowerCtlOffset = pymel.core.group( lowerCtl, n='Offset' + lowerCtl )
        lowerCtlGrp = pymel.core.group( lowerCtlOffset, n='P' + lowerCtl )
        
        upperCtl.t >> upperSubCtl.t
        lowerCtl.t >> lowerSubCtl.t
        upperSubCtlOffset.t >> upperCtlOffset.t
        lowerSubCtlOffset.t >> lowerCtlOffset.t
        
        sgCmds.constrain_parent( armUpper, upperCtlGrp )
        sgCmds.constrain_parent( armLower, lowerCtlGrp )
        
        pymel.core.parent( circleCtls[0].getParent(), circleCtls[1].getParent(), circleCtls[2].getParent(), upperCtlGrp, lowerCtlGrp, ctlGrp )
        
        arcNode = pymel.core.createNode( 'makeThreePointCircularArc' )
        arcNode.point1.set( 0,0,0 )
        armMiddle.t >> arcNode.point2
        dcmpEnd = sgCmds.getLocalDecomposeMatrix( armEnd.wm, armTop.wim )
        rangeNode = pymel.core.createNode( 'setRange' )
        
        if sideIndex == 0:
            rangeNode.minZ.set( 0.001 ); rangeNode.maxZ.set( 10000 )
            rangeNode.oldMinZ.set( 0.001 ); rangeNode.oldMaxZ.set( 10000 )
        else:
            rangeNode.minZ.set( -100 ); rangeNode.maxZ.set( -0.001 )
            rangeNode.oldMinZ.set( -100 ); rangeNode.oldMaxZ.set( -0.001 )

        dcmpEnd.ot >> rangeNode.value
        rangeNode.outValue >> arcNode.point3

        curveShape = pymel.core.createNode( 'nurbsCurve' )
        curveTr = curveShape.getParent()
        curveTr.setParent( armTop )
        pymel.core.xform( curveTr, os=1, matrix=sgCmds.getDefaultMatrix() )
        
        arcNode.outputCurve >> curveShape.create
        
        middleTargets = [armUpper, armLower]
        offsetCtls = [upperSubCtlOffset, lowerSubCtlOffset]
        
        for i in range( 2 ):
            nearPointChild = pymel.core.createNode( 'transform' )
            nearPointChild.setParent( curveTr )
            nearCurve = pymel.core.createNode( 'nearestPointOnCurve' )
            curveShape.local >> nearCurve.inputCurve
            middleDcmp = sgCmds.getLocalDecomposeMatrix( middleTargets[i].wm, curveTr.wim )
            middleDcmp.ot >> nearCurve.inPosition
            nearCurve.position >> nearPointChild.t
            dcmp = sgCmds.getLocalDecomposeMatrix( nearPointChild.wm, middleTargets[i].wim )
            blendColor = pymel.core.createNode( 'blendColors' )
            dcmp.ot >> blendColor.color1
            blendColor.color2.set( 0,0,0 )
            fkIkCtls[sideIndex].arc >> blendColor.blender
            blendColor.output >> offsetCtls[i].t
        
        circleCtls[0].v.set(0)
        circleCtls[2].v.set(0)
        
        for joint in upperJoints[:-1] + lowerJoints[1:]:
            sgCmds.makeParent( joint )
            attrNameX = sgCmds.addMultDoubleLinearConnection( joint.rx )
            attrNameY = sgCmds.addMultDoubleLinearConnection( joint.ry )
            attrNameZ = sgCmds.addMultDoubleLinearConnection( joint.rz )
            if not attrNameX: continue
            attrNameX.set( 0.5 )
            attrNameY.set( 0.5 )
            attrNameZ.set( 0.5 )
from sgMaya import sgCmds
import pymel.core

sels = pymel.core.ls( sl=1 )
src = sels[-1]
others = sels[:-1]

for other in others:
    sgCmds.constrain_parent( src, other, mo=1 )
Beispiel #4
0
from sgMaya import sgCmds
import pymel.core

sels = pymel.core.ls( sl=1 )
newObjs = []
for sel in sels:
    newObj = sgCmds.putObject( sel, 'joint' )
    sgCmds.constrain_parent( sel, newObj )
    newObjs.append( newObj )
pymel.core.select( newObjs )
Beispiel #5
0
def buildArcControl(numJointUpper, numJointLower, typ='arm'):

    armTops = []
    armMiddles = []
    armEnds = []
    fkIkCtls = []

    for side in ['_L_', '_R_']:
        armTops += pymel.core.ls('jnt%s%s0' % (side, typ))
        armMiddles += pymel.core.ls('jnt%s%s1' % (side, typ))
        armEnds += pymel.core.ls('jnt%s%s1_end' % (side, typ))
        fkIkCtls += pymel.core.ls('anim%s%s_IKFK' % (side, typ))

    if not armTops:
        for side in ['_L_', '_R_']:
            armTops += pymel.core.ls('%s01%sJNT' % (typ.capitalize(), side))
            armMiddles += pymel.core.ls('%s02%sJNT' % (typ.capitalize(), side))
            armEnds += pymel.core.ls('%s03%sJNT' % (typ.capitalize(), side))
            fkIkCtls += pymel.core.ls('%s%sIKFKSwitch' %
                                      (typ.capitalize(), side))

    for sideIndex in range(2):
        coreGrp = pymel.core.createNode(
            'transform',
            n='%sInterporationCoreGrp%s' %
            (typ.capitalize(), ['_L_', '_R_'][sideIndex]))
        pymel.core.xform(coreGrp,
                         ws=1,
                         matrix=pymel.core.xform(armTops[sideIndex],
                                                 q=1,
                                                 ws=1,
                                                 matrix=1))

        armTop = armTops[sideIndex]
        armMiddle = armMiddles[sideIndex]
        armEnd = armEnds[sideIndex]

        armUpper = sgCmds.addMiddleTranslateJoint(armMiddle,
                                                  n='MiddleJnt_' + armMiddle)
        armRotMiddle = sgCmds.addMiddleJoint(armMiddle,
                                             n='MiddleRotJnt_' + armMiddle)
        armLower = sgCmds.addMiddleTranslateJoint(armEnd,
                                                  n='MiddleJnt_' + armEnd)

        targets = [armTop, armMiddle, armEnd]
        circleSubCtls = []
        for i in range(len(targets)):
            circleSubCtl = pymel.core.circle(normal=[1, 0, 0],
                                             n=targets[i].replace(
                                                 'jnt_', 'sub_Ctl_'),
                                             radius=0.1)[0]
            circleSubCtlGrp = pymel.core.group(circleSubCtl,
                                               n='P' + circleSubCtl)
            pymel.core.parent(circleSubCtlGrp, coreGrp)
            pymel.core.xform(circleSubCtlGrp, ws=1, matrix=targets[i].wm.get())
            circleSubCtls.append(circleSubCtl)

        firstSubCtl = circleSubCtls[0]
        secondSubCtl = circleSubCtls[1]
        thirdSubCtl = circleSubCtls[2]

        upperSubCtl = pymel.core.circle(normal=[1, 0, 0],
                                        n=secondSubCtl + '_upper',
                                        radius=0.1)[0]
        upperSubCtlOffset = pymel.core.group(upperSubCtl,
                                             n='Offset' + upperSubCtl)
        upperSubCtlGrp = pymel.core.group(upperSubCtlOffset,
                                          n='P' + upperSubCtl)
        lowerSubCtl = pymel.core.circle(normal=[1, 0, 0],
                                        n=secondSubCtl + '_lower',
                                        radius=0.1)[0]
        lowerSubCtlOffset = pymel.core.group(lowerSubCtl,
                                             n='Offset' + lowerSubCtl)
        lowerSubCtlGrp = pymel.core.group(lowerSubCtlOffset,
                                          n='P' + lowerSubCtl)

        pymel.core.parent(upperSubCtlGrp, coreGrp)
        pymel.core.parent(lowerSubCtlGrp, coreGrp)

        pymel.core.xform(upperSubCtlGrp, ws=1, matrix=firstSubCtl.wm.get())
        pymel.core.xform(lowerSubCtlGrp, ws=1, matrix=secondSubCtl.wm.get())

        firstPos = pymel.core.xform(firstSubCtl, q=1, ws=1, t=1)
        secondPos = pymel.core.xform(secondSubCtl, q=1, ws=1, t=1)
        thirdPos = pymel.core.xform(thirdSubCtl, q=1, ws=1, t=1)

        upperPos = [(firstPos[i] + secondPos[i]) / 2 for i in range(3)]
        lowerPos = [(secondPos[i] + thirdPos[i]) / 2 for i in range(3)]

        pymel.core.xform(upperSubCtlGrp, ws=1, t=upperPos)
        pymel.core.xform(lowerSubCtlGrp, ws=1, t=lowerPos)

        def getPointOneTwo(pointerCtl1, pointerCtl2, baseCtl):

            point1Dcmp = sgCmds.getLocalDecomposeMatrix(
                pointerCtl1.wm, baseCtl.wim)
            point2Dcmp = sgCmds.getLocalDecomposeMatrix(
                pointerCtl2.wm, baseCtl.wim)

            point1 = sgCmds.makeChild(baseCtl, n='pointer1_' + baseCtl)
            point2 = sgCmds.makeChild(baseCtl, n='pointer2_' + baseCtl)

            point1Dcmp.otx >> point1.tx
            point2Dcmp.otx >> point2.tx

            sgCmds.convertMultDoubleConnection(point1.tx).set(0.5)
            sgCmds.convertMultDoubleConnection(point2.tx).set(0.5)

            point1.dh.set(1)
            point2.dh.set(1)

            return point1, point2

        def disconnectRotate(inputNode):
            node = pymel.core.ls(inputNode)[0]
            cons = node.r.listConnections(s=1, d=0, p=1)
            if cons:
                cons[0] // node.r

        upperPoint1, upperPoint2 = getPointOneTwo(firstSubCtl, secondSubCtl,
                                                  upperSubCtl)
        lowerPoint1, lowerPoint2 = getPointOneTwo(secondSubCtl, thirdSubCtl,
                                                  lowerSubCtl)

        upperCurve = sgCmds.makeCurveFromObjects(firstSubCtl, upperPoint1,
                                                 upperPoint2, secondSubCtl)
        lowerCurve = sgCmds.makeCurveFromObjects(secondSubCtl, lowerPoint1,
                                                 lowerPoint2, thirdSubCtl)
        upperCurve.setParent(coreGrp)
        upperCurve.t.set(0, 0, 0)
        upperCurve.r.set(0, 0, 0)
        lowerCurve.setParent(coreGrp)
        lowerCurve.t.set(0, 0, 0)
        lowerCurve.r.set(0, 0, 0)

        upperJoints = sgCmds.createPointOnCurve(upperCurve,
                                                numJointUpper,
                                                nodeType='joint',
                                                vector=[1, 0, 0])
        lowerJoints = sgCmds.createPointOnCurve(lowerCurve,
                                                numJointLower,
                                                nodeType='joint',
                                                vector=[1, 0, 0])

        pymel.core.parent(upperJoints, coreGrp)
        pymel.core.parent(lowerJoints, coreGrp)
        for upperJoint in upperJoints:
            upperJoint.jo.set(0, 0, 0)
        for lowerJoint in lowerJoints:
            lowerJoint.jo.set(0, 0, 0)

        disconnectRotate(upperJoints[0])
        pymel.core.delete(upperJoints[-1])
        disconnectRotate(lowerJoints[0])
        disconnectRotate(lowerJoints[-1])

        sgCmds.blendTwoMatrixConnect(upperJoints[-2],
                                     lowerJoints[1],
                                     lowerJoints[0],
                                     ct=False)

        ctlGrp = pymel.core.createNode(
            'transform',
            n='%sInterporationCtlGrp%s' %
            (typ.capitalize(), ['_L_', '_R_'][sideIndex]))
        sgCmds.constrain_all(armTop, ctlGrp)
        pymel.core.xform(ctlGrp, os=1, matrix=sgCmds.getDefaultMatrix())
        sgCmds.addAttr(fkIkCtls[sideIndex],
                       ln='showArcCtls',
                       cb=1,
                       min=0,
                       max=1,
                       at='long')
        fkIkCtls[sideIndex].showArcCtls >> ctlGrp.v
        fkIkCtls[sideIndex].showArcCtls.set(1)
        sgCmds.addAttr(fkIkCtls[sideIndex], ln='arc', k=1, min=0, max=1)

        circleCtls = []
        for i in range(len(targets)):
            circleCtl = pymel.core.circle(normal=[1, 0, 0],
                                          n=targets[i].replace(
                                              'jnt_', 'Ctl_itp_'),
                                          radius=0.5)[0]
            circleCtlGrp = pymel.core.group(circleCtl, n='P' + circleCtl)
            pymel.core.parent(circleCtlGrp)
            pymel.core.xform(circleCtlGrp, ws=1, matrix=targets[i].wm.get())
            circleCtls.append(circleCtl)

        for i in range(len(targets)):
            circleCtls[i].t >> circleSubCtls[i].t
            circleCtls[i].r >> circleSubCtls[i].r

        sgCmds.constrain_parent(armTop, circleCtls[0].getParent())
        sgCmds.constrain_parent(armRotMiddle, circleCtls[1].getParent())
        sgCmds.constrain_parent(armEnd, circleCtls[2].getParent())

        upperCtl = pymel.core.circle(normal=[1, 0, 0],
                                     n=circleCtls[1] + '_upper',
                                     radius=0.5)[0]
        upperCtlOffset = pymel.core.group(upperCtl, n='Offset' + upperCtl)
        upperCtlGrp = pymel.core.group(upperCtlOffset, n='P' + upperCtl)
        lowerCtl = pymel.core.circle(normal=[1, 0, 0],
                                     n=circleCtls[1] + '_lower',
                                     radius=0.5)[0]
        lowerCtlOffset = pymel.core.group(lowerCtl, n='Offset' + lowerCtl)
        lowerCtlGrp = pymel.core.group(lowerCtlOffset, n='P' + lowerCtl)

        upperCtl.t >> upperSubCtl.t
        lowerCtl.t >> lowerSubCtl.t
        upperSubCtlOffset.t >> upperCtlOffset.t
        lowerSubCtlOffset.t >> lowerCtlOffset.t

        sgCmds.constrain_parent(armUpper, upperCtlGrp)
        sgCmds.constrain_parent(armLower, lowerCtlGrp)

        pymel.core.parent(circleCtls[0].getParent(), circleCtls[1].getParent(),
                          circleCtls[2].getParent(), upperCtlGrp, lowerCtlGrp,
                          ctlGrp)

        arcNode = pymel.core.createNode('makeThreePointCircularArc')
        arcNode.point1.set(0, 0, 0)
        armMiddle.t >> arcNode.point2
        dcmpEnd = sgCmds.getLocalDecomposeMatrix(armEnd.wm, armTop.wim)
        rangeNode = pymel.core.createNode('setRange')

        if sideIndex == 0:
            rangeNode.minZ.set(0.001)
            rangeNode.maxZ.set(10000)
            rangeNode.oldMinZ.set(0.001)
            rangeNode.oldMaxZ.set(10000)
        else:
            rangeNode.minZ.set(-100)
            rangeNode.maxZ.set(-0.001)
            rangeNode.oldMinZ.set(-100)
            rangeNode.oldMaxZ.set(-0.001)

        dcmpEnd.ot >> rangeNode.value
        rangeNode.outValue >> arcNode.point3

        curveShape = pymel.core.createNode('nurbsCurve')
        curveTr = curveShape.getParent()
        curveTr.setParent(armTop)
        pymel.core.xform(curveTr, os=1, matrix=sgCmds.getDefaultMatrix())

        arcNode.outputCurve >> curveShape.create

        middleTargets = [armUpper, armLower]
        offsetCtls = [upperSubCtlOffset, lowerSubCtlOffset]

        for i in range(2):
            nearPointChild = pymel.core.createNode('transform')
            nearPointChild.setParent(curveTr)
            nearCurve = pymel.core.createNode('nearestPointOnCurve')
            curveShape.local >> nearCurve.inputCurve
            middleDcmp = sgCmds.getLocalDecomposeMatrix(
                middleTargets[i].wm, curveTr.wim)
            middleDcmp.ot >> nearCurve.inPosition
            nearCurve.position >> nearPointChild.t
            dcmp = sgCmds.getLocalDecomposeMatrix(nearPointChild.wm,
                                                  middleTargets[i].wim)
            blendColor = pymel.core.createNode('blendColors')
            dcmp.ot >> blendColor.color1
            blendColor.color2.set(0, 0, 0)
            fkIkCtls[sideIndex].arc >> blendColor.blender
            blendColor.output >> offsetCtls[i].t

        circleCtls[0].v.set(0)
        circleCtls[2].v.set(0)

        for joint in upperJoints[:-1] + lowerJoints[1:]:
            sgCmds.makeParent(joint)
            attrNameX = sgCmds.addMultDoubleLinearConnection(joint.rx)
            attrNameY = sgCmds.addMultDoubleLinearConnection(joint.ry)
            attrNameZ = sgCmds.addMultDoubleLinearConnection(joint.rz)
            if not attrNameX: continue
            attrNameX.set(0.5)
            attrNameY.set(0.5)
            attrNameZ.set(0.5)
from sgMaya import sgCmds
import pymel.core

sels = pymel.core.ls( sl=1 )
src = sels[-1]
others = sels[:-1]

for other in others:
    sgCmds.constrain_parent( src, other )
from sgMaya import sgCmds
import pymel.core

sels = pymel.core.ls(sl=1)
src = sels[-1]
others = sels[:-1]

for other in others:
    sgCmds.constrain_parent(src, other, mo=1)
from sgMaya import sgCmds
import pymel.core

sels = pymel.core.ls(sl=1)
src = sels[0]
others = sels[1:]

for other in others:
    sgCmds.constrain_parent(src, other)