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)
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 )
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 )
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)