I centered the pivot as below
cmds.xform(item,centerPivots=True)
How can I bake pivot by Python in Maya? I couldn't find it in the documentation.
Here is a python version of the bake Pivot tool : It is working on a basic sphere but I could have done some mistakes At the end of the script, there is the commands to find the mel files containing the code.
import maya.cmds as cmds
import maya.mel as mel
def bakeCustomToolPivot(pos=1, ori=1):
# Check 1) must have an object(s) selected
objects = cmds.ls(sl=1, transforms=1)
shapes = cmds.ls(sl=1, shapes=1)
if len(shapes) > 0:
transforms = cmds.listRelatives(path=1, parent=1, type='transform')
objects += transforms
if len(objects) == 0:
cmds.error("m_bakeCustomToolPivot.kNoObjectsSelectedError")
return None
# Check 2) must be in the move/rotate/scale tool
currentCtx = cmds.currentCtx()
contextList = ["moveSuperContext", "manipMoveContext", "RotateSuperContext",
"manipRotateContext", "scaleSuperContext", "manipScaleContext"]
if currentCtx not in contextList:
cmds.error("m_bakeCustomToolPivot.kWrongToolError")
return None
# Check 3) must be in custom orientation mode
customOri = []
pivotModeActive = 0
customModeActive = 0
if currentCtx == "moveSuperContext" or currentCtx == "manipMoveContext":
customOri = cmds.manipMoveContext('Move', q=1, orientAxes=1)
pivotModeActive = cmds.manipMoveContext('Move', q=1, editPivotMode=1)
customModeActive = cmds.manipMoveContext('Move', q=1, mode=1) / 6
elif currentCtx == "RotateSuperContext" or currentCtx == "manipRotateContext":
customOri = cmds.manipRotateContext('Rotate', q=1, orientAxes=1)
pivotModeActive = cmds.manipRotateContext('Rotate', q=1, editPivotMode=1)
customModeActive = cmds.manipRotateContext('Rotate', q=1, mode=1) / 3
elif currentCtx == "scaleSuperContext" or currentCtx == "manipScaleContext":
customOri = cmds.manipScaleContext('Scale', q=1, orientAxes=1)
pivotModeActive = cmds.manipScaleContext('Scale', q=1, editPivotMode=1)
customModeActive = cmds.manipScaleContext('Scale', q=1, mode=1) / 6
if ori and not pos and not customModeActive:
cmds.error("m_bakeCustomToolPivot.kWrongAxisOriModeError")
return None
# Get custom orientation
if ori and customModeActive:
customOri[0] = mel.eval('rad_to_deg({})'.format(customOri[0]))
customOri[1] = mel.eval('rad_to_deg({})'.format(customOri[1]))
customOri[2] = mel.eval('rad_to_deg({})'.format(customOri[2]))
# Set object(s) rotation to the custom one (preserving child transform positions and geometry positions)
cmds.rotate(customOri[0], customOri[1], customOri[2], objects, a=1, pcp=1, pgp=1, ws=1, fo=1)
if pos:
for object in objects:
# Get pivot in parent space
# object = 'pSphere4'
old = [0, 0, 0]
m = cmds.xform(object, q=1, m=1)
p = cmds.xform(object, q=1, os=1, sp=1)
old[0] = (p[0] * m[0] + p[1] * m[4] + p[2] * m[8] + m[12])
old[1] = (p[0] * m[1] + p[1] * m[5] + p[2] * m[9] + m[13])
old[2] = (p[0] * m[2] + p[1] * m[6] + p[2] * m[10] + m[14])
# Zero out pivots
cmds.xform(objects, zeroTransformPivots=1)
# Translate object(s) back to previous pivot (preserving child transform positions and geometry positions)
new = cmds.getAttr(object + ".translate")[0]
cmds.move((old[0] - new[0]), (old[1] - new[1]), (old[2] - new[2]), object, pcp=1, pgp=1, ls=1, r=1)
# Exit pivot mode
if pivotModeActive:
mel.eval('ctxEditMode;')
# Set the axis orientation mode back to object
if ori and customModeActive:
if currentCtx == "moveSuperContext" or currentCtx == "manipMoveContext":
cmds.manipMoveContext('Move', e=1, mode=0)
elif currentCtx == "RotateSuperContext" or currentCtx == "manipRotateContext":
cmds.manipRotateContext('Rotate', e=True, mode=0)
elif currentCtx == "scaleSuperContext" or currentCtx == "manipScaleContext":
cmds.manipScaleContext('Scale', e=1, mode=0)
print(mel.eval('whatIs bakeCustomToolPivot;'))
print(mel.eval('whatIs performBakeCustomToolPivot;'))
bakeCustomToolPivot()