예제 #1
0
def mirror_controlShape(source=None,
                        target=None,
                        colorDirection='right',
                        controlType='main'):
    _str_func = "mirror_controlShape"
    if target is None:
        _sel = mc.ls(sl=True)
        if len(_sel) == 2:
            return mirror_controlShape(_sel[0], _sel[1])

    if not source:
        raise ValueError, "|{0}|  >> Must have a source".format(_str_func)
    if not target:
        raise ValueError, "|{0}|  >> Must have a target".format(_str_func)
    _dup_curve = mc.duplicate(source)[0]
    for child in TRANS.children_get(_dup_curve, True):
        mc.delete(child)
    ATTR.set_standardFlags(_dup_curve, lock=False, keyable=True, visible=True)
    _grp = mc.group(em=True)
    _dup_curve = TRANS.parent_set(_dup_curve, _grp)
    ATTR.set(_grp, 'scaleX', -1)
    _dup_curve = TRANS.parent_set(_dup_curve, False)
    mc.makeIdentity(_dup_curve,
                    apply=True,
                    translate=True,
                    rotate=True,
                    scale=False)
    return
    shapeParent_in_place(target, _dup_curve, True, True)
    mc.delete(_grp)

    colorControl(target, colorDirection, controlType)
    mc.select(target)
    return target
예제 #2
0
파일: example.py 프로젝트: liudger/cgmTools
def define(self):
    _short = self.mNode
    ATTR.set(_short, 'translate', [0, 0, 0])
    ATTR.set(_short, 'rotate', [0, 0, 0])
    ATTR.set_standardFlags(self.mNode,
                           attrs=['translate', 'rotate', 'sx', 'sz'])
    for a in ['x', 'z']:
        ATTR.connect("{0}.sy".format(_short), "{0}.s{1}".format(_short, a))
    ATTR.set_alias(_short, 'sy', 'blockScale')
예제 #3
0
def groups_verify(self):
    try:
        _str_func = "groups_verify".format()
        log.debug("|{0}| >> ...".format(_str_func))

        mMasterNull = self.masterNull

        if not mMasterNull:
            raise ValueError, "No masterNull"

        for attr in [
                'rig', 'deform', 'noTransform', 'geo', 'skeleton', 'parts',
                'worldSpaceObjects', 'puppetSpaceObjects'
        ]:
            _link = attr + 'Group'
            mGroup = mMasterNull.getMessage(_link,
                                            asMeta=True)  # Find the group
            if mGroup: mGroup = mGroup[0]

            if not mGroup:
                mGroup = mMasterNull.doCreateAt(setClass=True)
                mGroup.connectParentNode(mMasterNull.mNode, 'puppet',
                                         attr + 'Group')

            mGroup.rename(attr)
            log.debug("|{0}| >> attr: {1} | mGroup: {2}".format(
                _str_func, attr, mGroup))

            # Few Case things
            #----------------------------------------------------
            if attr in ['rig', 'geo', 'skeleton']:
                mGroup.p_parent = mMasterNull
            elif attr in ['deform', 'puppetSpaceObjects'
                          ] and self.getMessage('masterControl'):
                mGroup.p_parent = self.getMessage('masterControl')[0]
            else:
                mGroup.p_parent = mMasterNull.rigGroup

            ATTR.set_standardFlags(mGroup.mNode)

            if attr == 'worldSpaceObjects':
                mGroup.addAttr('cgmAlias', 'world')
            elif attr == 'puppetSpaceObjects':
                mGroup.addAttr('cgmAlias', 'puppet')

    except Exception, err:
        cgmGEN.cgmExceptCB(Exception, err)
예제 #4
0
                        mPlug_attrBridgeDriver.p_combinedShortName)

                mPlug_attrBridgeDriven.p_locked = True
                mPlug_attrBridgeDriven.p_hidden = True
                mPlug_attrBridgeDriven.p_keyable = False
                NodeF.argsToNodes(arg_attributeBridge).doBuild()

        #lock N Hide ============================================================================================
        if mi_control.hasAttr('visibility'):
            mi_control.visibility = True

        if autoLockNHide:
            if mi_control.hasAttr('cgmTypeModifier'):
                if mi_control.cgmTypeModifier.lower() == 'fk':
                    ATTR.set_standardFlags(
                        mi_control.mNode,
                        attrs=['tx', 'ty', 'tz', 'sx', 'sy', 'sz'])
            if mi_control.cgmName.lower() == 'cog':
                ATTR.set_standardFlags(mi_control.mNode,
                                       attrs=['sx', 'sy', 'sz'])
            cgmMeta.cgmAttr(mi_control, 'visibility', lock=True, hidden=True)

        if mi_control.hasAttr('cgmIterator'):
            ATTR.set_standardFlags(mi_control.mNode, attrs=['cgmIterator'])

        str_base = mi_control.p_nameBase
        for i, mShape in enumerate(mi_control.getShapes(asMeta=True)):
            mShape.rename("{0}_shape_{1}".format(str_base, i))
            #mShape.doName()

        #return ============================================================================================
예제 #5
0
// Warning: line 0: Unrecognized node type for node 'ProductionRapidFur'; preserving node information during this session. // 
// Warning: line 0: Unrecognized node type for node 'ProductionRapidHair'; preserv


#Finger unlock -----------------------------------------------------------------
import cgm.core.cgm_Meta as cgmMeta
import cgm.core.lib.attribute_utils as ATTR
import maya.cmds as mc
for m in 'l_thumb_part','l_index_part','l_middle_part','l_ring_part','l_pinky_part','r_thumb_part','r_index_part','r_middle_part','r_ring_part','r_pinky_part':
    m1 = cgmMeta.asMeta(m)
    ml_blend = m1.rigNull.msgList_get('blendJoints')
    ml_fk = m1.rigNull.msgList_get('fkJoints')
    ml_ik = m1.rigNull.msgList_get('ikJoints')
    
    for mJnt in ml_fk:
        ATTR.set_standardFlags(mJnt.mNode,visible=True,keyable=True,lock=False)
        try:ATTR.break_connection(mJnt.mNode,'translateZ')
        except:pass
        
    for i,mJnt in enumerate(ml_blend):
        mJnt.segmentScaleCompensate = False
        ATTR.set_standardFlags(mJnt.mNode,['scale'],visible=True,keyable=True,lock=False)
        mc.scaleConstraint([ml_fk[i].mNode], mJnt.mNode)
        
    
m1 = cgmMeta.asMeta('l_thumb_part')

#Tassel control simplification --------------------------------------------------
import cgm.core.lib.transform_utils as TRANS
sel = mc.ls(sl=True)
import cgm.core.lib.math_utils as MATH
예제 #6
0
            MODULECONTROL.register(mControl,
                                   addDynParentGroup=True,
                                   mirrorSide='Centre',
                                   mirrorAxis="translateX,rotateY,rotateZ")

            mControl.masterGroup.parent = mPuppet.masterNull.deformGroup

            mMasterControl.controlVis.addAttr('rootMotionControl',
                                              value=True,
                                              keyable=False)
            mMasterControl.rootMotionControl = 0

            mControl.doConnectIn(
                'v', "{0}.rootMotionControl".format(
                    mMasterControl.controlVis.mNode))
            ATTR.set_standardFlags(mControl.mNode, ['v'])

            #DynParent group ====================================================================
            ml_dynParents = [
                mMasterNull.puppetSpaceObjectsGroup,
                mMasterNull.worldSpaceObjectsGroup
            ]

            #mMasterGroup = mMasterControl.masterGroup
            #ml_dynParents.append(mMasterGroup)

            #Add our parents
            mDynGroup = mControl.dynParentGroup
            log.debug("|{0}| >> Motion Joint | dynParentSetup : {1}".format(
                _str_func, mDynGroup))
            mDynGroup.dynMode = 0
예제 #7
0
def rig_cleanUp(self):
    try:
        _short = self.d_block['shortName']
        _str_func = 'rig_cleanUp'.format(_short)
        log.debug("|{0}| >>  ".format(_str_func) + '-' * 80)
        log.debug("{0}".format(self))

        #_start = time.clock()

        mBlock = self.mBlock
        mMasterControl = self.d_module['mMasterControl']
        mMasterDeformGroup = self.d_module['mMasterDeformGroup']
        mMasterNull = self.d_module['mMasterNull']
        mPlug_globalScale = self.d_module['mPlug_globalScale']
        _spacePivots = mBlock.numSpacePivots

        ml_controlsAll = []

        #MasterControl =======================================================================
        log.debug(
            "|{0}| >> MasterConrol | dynParent setup...".format(_str_func))
        #reload(MODULECONTROL)

        if not _spacePivots:
            mConstrainGroup = mMasterControl.doGroup(True,
                                                     True,
                                                     asMeta=True,
                                                     typeModifier='constrain')
            mConstrainGroup.addAttr(
                'cgmAlias', '{0}_constrain'.format(mMasterNull.puppet.cgmName))
        else:
            MODULECONTROL.register(mMasterControl,
                                   addDynParentGroup=True,
                                   addSpacePivots=_spacePivots,
                                   mirrorSide='Centre',
                                   mirrorAxis="translateX,rotateY,rotateZ",
                                   noFreeze=True)

            mMasterControl.masterGroup.setAttrFlags()
            ml_dynParents = [mMasterNull]

            ml_spacePivots = mMasterControl.msgList_get('spacePivots',
                                                        asMeta=True)
            for mPivot in ml_spacePivots:
                mDup = mPivot.doDuplicate(po=False)
                mDup.scale = .25, .25, .25
                CORERIG.shapeParent_in_place(mPivot.mNode, mDup.mNode, False,
                                             True)

            ml_dynParents.extend(ml_spacePivots)

            mDynGroup = mMasterControl.dynParentGroup
            mDynGroup.dynMode = 0

            for o in ml_dynParents:
                mDynGroup.addDynParent(o)
            mDynGroup.rebuild()
        #mMasterGroup = mMasterControl.masterGroup
        #ml_dynParents.append(mMasterGroup)

        #Add our parents
        mPuppet = mBlock.moduleTarget

        #Motion Joint ==========================================================================
        if mBlock.addMotionJoint:
            if not skeleton_check(mBlock):
                skeleton_build(mBlock)

            mRootMotionHelper = mBlock.rootMotionHelper
            mMasterNull = mPuppet.masterNull

            #Make joint =================================================================
            mJoint = mBlock.moduleTarget.getMessage('rootJoint',
                                                    asMeta=True)[0]
            mJoint.p_parent = mBlock.moduleTarget.masterNull.skeletonGroup

            #Make the handle ===========================================================
            log.debug("|{0}| >> Motion Joint | Main control shape...".format(
                _str_func))
            mControl = mRootMotionHelper.doCreateAt()

            CORERIG.shapeParent_in_place(mControl, mRootMotionHelper.mNode,
                                         True)
            mControl = cgmMeta.validateObjArg(mControl,
                                              'cgmObject',
                                              setClass=True)
            mControl.parent = False

            #ATTR.copy_to(mBlock.moduleTarget.mNode,'cgmName',mControl.mNode,driven='target')
            mControl.doStore('cgmName', 'rootMotion')
            mControl.doName()

            #Color ---------------------------------------------------------------
            log.debug("|{0}| >> Motion Joint | Color...".format(_str_func))
            #_side = mBlock.atBlockUtils('get_side')
            #CORERIG.colorControl(mControl.mNode,_side,'main')

            #Register ------------------------------------------------------------
            log.debug("|{0}| >> Motion Joint | Register...".format(_str_func))

            MODULECONTROL.register(mControl,
                                   addDynParentGroup=True,
                                   mirrorSide='Centre',
                                   mirrorAxis="translateX,rotateY,rotateZ")

            mControl.masterGroup.parent = mPuppet.masterNull.deformGroup

            mMasterControl.controlVis.addAttr('rootMotionControl',
                                              value=True,
                                              keyable=False)
            mMasterControl.rootMotionControl = 0

            mControl.doConnectIn(
                'v', "{0}.rootMotionControl".format(
                    mMasterControl.controlVis.mNode))
            ATTR.set_standardFlags(mControl.mNode, ['v'])

            #DynParent group ====================================================================
            ml_dynParents = [
                mMasterNull.puppetSpaceObjectsGroup,
                mMasterNull.worldSpaceObjectsGroup
            ]

            #mMasterGroup = mMasterControl.masterGroup
            #ml_dynParents.append(mMasterGroup)

            #Add our parents
            mDynGroup = mControl.dynParentGroup
            log.debug("|{0}| >> Motion Joint | dynParentSetup : {1}".format(
                _str_func, mDynGroup))
            mDynGroup.dynMode = 0

            for o in ml_dynParents:
                mDynGroup.addDynParent(o)
            mDynGroup.rebuild()

            #>>>>> INDEX CONTROLS
            #>>>>> Setup VIS
            mJoint.connectChildNode(mControl.mNode, 'rigJoint', 'sourceJoint')
            """
            mc.parentConstraint(mControl.mNode,
                                mJoint.mNode,
                                maintainOffset = True)
            mc.scaleConstraint(mControl.mNode,
                               mJoint.mNode,
                               maintainOffset = True)            
            """
            ml_controlsAll.append(mControl)
            mPuppet.connectChildNode(mControl, 'rootMotionHandle',
                                     'puppet')  #Connect
            mMasterControl.connectChildNode(mControl, 'rootMotionHandle',
                                            'puppet')  #Connect

        for mCtrl in ml_controlsAll:
            if mCtrl.hasAttr('radius'):
                ATTR.set(mCtrl.mNode, 'radius', 0)

            ml_pivots = mCtrl.msgList_get('spacePivots')
            if ml_pivots:
                log.debug("|{0}| >> Coloring spacePivots for: {1}".format(
                    _str_func, mCtrl))
                for mPivot in ml_pivots:
                    mHandleFactory.color(mPivot.mNode, controlType='sub')
                    ml_controlsAll.append(mPivot)

        #Connect -------------------------------------------------------------
        mPuppet.msgList_connect('controlsAll', ml_controlsAll)
        mPuppet.puppetSet.extend(ml_controlsAll)
        #self.atBuilderUtils('register_mirrorIndices', ml_controlsAll)
        self.atBuilderUtils('check_nameMatches', ml_controlsAll)

        #Connections =======================================================================================
        #ml_controlsAll = mBlock.atBuilderUtils('register_mirrorIndices', ml_controlsAll)
        #mRigNull.msgList_connect('controlsAll',ml_controlsAll)
        #mRigNull.moduleSet.extend(ml_controlsAll)

        self.v = 0

        #mRigNull.version = self.d_block['buildVersion']
        #mRigNull.version = __version__
        mBlock.blockState = 'rig'

        mBlock.template = True
        mBlock.noTransFormNull.template = True
        self.UTILS.rigNodes_store(self)

        self.version = self.d_block['buildVersion']

        mMasterControl.doStore('version', self.d_block['buildVersion'])

        #log.info("|{0}| >> Time >> = {1} seconds".format(_str_func, "%0.3f"%(time.clock()-_start)))
        #except Exception,err:cgmGEN.cgmExceptCB(Exception,err)
    except Exception, err:
        cgmGEN.cgmExceptCB(Exception, err, localDat=vars())
예제 #8
0
def create_axisProxy(obj=None):
    """
    Make a local axis box around a given object so that you can then 
    
    """
    try:
        _str_func = 'create_axisProxy'
        _dag = VALID.getTransform(obj)
        if not _dag:
            raise ValueError, "Must have a dag node. Obj: {0}".format(obj)
        if VALID.is_shape(obj):
            l_shapes = [obj]
        else:
            l_shapes = TRANS.shapes_get(_dag, True)

        _parent = TRANS.parent_get(_dag)
        _dup = mc.duplicate(l_shapes, po=False, rc=True)[0]
        #TRANS.pivots_recenter(_dup)
        _dup = TRANS.parent_set(_dup, False)
        ATTR.set_standardFlags(_dup, lock=False, keyable=True)
        #Get some values...
        l_reset = ['t', 'r', 's', 'shear', 'rotateAxis']
        t = ATTR.get(_dup, 'translate')
        r = ATTR.get(_dup, 'rotate')
        s = ATTR.get(_dup, 'scale')
        ra = ATTR.get(_dup, 'rotateAxis')
        if ATTR.has_attr(_dup, 'jointOrient'):
            l_reset.append('jointOrient')
            jo = ATTR.get(_dup, 'jointOrient')
        o = TRANS.orient_get(_dup)
        shear = ATTR.get(_dup, 'shear')
        _scaleLossy = TRANS.scaleLossy_get(_dag)

        #Reset our stuff before we make our bb...
        ATTR.reset(_dup, l_reset)
        _size = POS.get_bb_size(_dup, True)

        #_proxy = create_proxyGeo('cube',COREMATH.list_div(_scaleLossy,_size))
        _proxy = create_proxyGeo('cube', _size)
        mc.makeIdentity(_proxy, apply=True, scale=True)

        #Now Put it back
        _dup = TRANS.parent_set(_dup, TRANS.parent_get(_dag))
        _proxy = TRANS.parent_set(_proxy, _dup)

        #_dup = TRANS.parent_set(_dup, TRANS.parents_get(_dag))
        SNAP.go(_dup, _dag)
        #ATTR.set(_dup,'s',(0,0,0))
        ATTR.reset(_dup, ['s', 'shear'])

        ATTR.reset(_proxy, ['t', 'r', 's', 'shear', 'rotateAxis'])
        _proxy = TRANS.parent_set(_proxy, _dag)
        ATTR.reset(_proxy, ['t', 'r', 's', 'shear', 'rotateAxis'])
        #match_transform(_proxy,_dag)

        #SNAP.go(_proxy,_dag,pivot='bb')

        #cgmGEN.func_snapShot(vars())

        _proxy = TRANS.parent_set(_proxy, False)
        mc.delete(_dup)
        #match_transform(_proxy,_dag)
        return mc.rename(_proxy,
                         "{0}_localAxisProxy".format(NAMES.get_base(_dag)))
    except Exception, err:
        cgmGEN.cgmExceptCB(Exception, err, msg=vars())
예제 #9
0
def shapeParent_in_place(obj,
                         shapeSource,
                         keepSource=True,
                         replaceShapes=False,
                         snapFirst=False):
    """
    Shape parent a curve in place to a obj transform

    :parameters:
        obj(str): Object to modify
        shapeSource(str): Curve to shape parent
        keepSource(bool): Keep the curve shapeParented as well
        replaceShapes(bool): Whether to remove the obj's original shapes or not
        snapFirst(bool): whether to snap source to obj before transfer

    :returns
        success(bool)
    """
    _str_func = 'shapeParent_in_place'

    l_shapes = VALID.listArg(shapeSource)
    obj = VALID.mNodeString(obj)
    log.debug(
        "|{0}|  >> obj: {1} | shapeSource: {2} | keepSource: {3} | replaceShapes: {4}"
        .format(_str_func, obj, shapeSource, keepSource, replaceShapes))

    if replaceShapes:
        _l_objShapes = mc.listRelatives(obj, s=True, fullPath=True)
        if _l_objShapes:
            log.debug("|{0}|  >> Removing obj shapes...| {1}".format(
                _str_func, _l_objShapes))
            mc.delete(_l_objShapes)

    mc.select(cl=True)
    #mc.refresh()
    for c in l_shapes:
        try:
            _shapeCheck = SEARCH.is_shape(c)
            if not _shapeCheck and not mc.listRelatives(
                    c, f=True, shapes=True, fullPath=True):
                raise ValueError, "Has no shapes"
            if coreNames.get_long(obj) == coreNames.get_long(c):
                raise ValueError, "Cannot parentShape self"

            if VALID.get_mayaType(c) == 'nurbsCurve':
                mc.ls(['%s.ep[*]' % (c)], flatten=True)
                #This is for a really weird bug in 2016 where offset curve shapes don't work right unless they're components are queried.

            if _shapeCheck:
                _dup_curve = duplicate_shape(c)[0]
                log.debug("|{0}|  >> shape duplicate".format(_str_func))
                if snapFirst:
                    SNAP.go(_dup_curve, obj)
            else:
                log.debug("|{0}|  >> regular duplicate".format(_str_func))
                _dup_curve = mc.duplicate(c)[0]
                for child in TRANS.children_get(_dup_curve, True):
                    mc.delete(child)
                if snapFirst:
                    SNAP.go(_dup_curve, obj)

            _l_parents = SEARCH.get_all_parents(obj)
            ATTR.set_standardFlags(_dup_curve,
                                   lock=False,
                                   visible=True,
                                   keyable=True)
            _dup_curve = parent_set(_dup_curve, False)

            copy_pivot(_dup_curve, obj)
            #piv_pos = mc.xform(obj, q=True, ws=True, rp = True)
            #mc.xform(_dup_curve,ws=True, rp = piv_pos)

            pos = mc.xform(obj, q=True, os=True, rp=True)

            curveScale = mc.xform(_dup_curve, q=True, s=True, r=True)
            objScale = mc.xform(obj, q=True, s=True, r=True)

            #account for freezing
            #mc.makeIdentity(_dup_curve,apply=True,translate =True, rotate = True, scale=False)

            # make our zero out group
            #group = rigging.groupMeObject(obj,False)
            group = create_at(obj, 'null')

            _dup_curve = mc.parent(_dup_curve, group)[0]

            # zero out the group
            mc.xform(group, ws=True, t=pos)
            #mc.xform(group,roo = 'xyz', p=True)
            mc.xform(group, ra=[0, 0, 0], p=False)
            mc.xform(group, ro=[0, 0, 0], p=False)

            mc.makeIdentity(_dup_curve,
                            apply=True,
                            translate=True,
                            rotate=True,
                            scale=False)

            #main scale fix
            baseMultiplier = [0, 0, 0]
            baseMultiplier[0] = (curveScale[0] / objScale[0])
            baseMultiplier[1] = (curveScale[1] / objScale[1])
            baseMultiplier[2] = (curveScale[2] / objScale[2])
            mc.setAttr(_dup_curve + '.sx', baseMultiplier[0])
            mc.setAttr(_dup_curve + '.sy', baseMultiplier[1])
            mc.setAttr(_dup_curve + '.sz', baseMultiplier[2])

            #parent scale fix
            if _l_parents:
                _l_parents.reverse()
                multiplier = [
                    baseMultiplier[0], baseMultiplier[1], baseMultiplier[2]
                ]
                for p in _l_parents:
                    scaleBuffer = mc.xform(p, q=True, s=True, r=True)
                    multiplier[0] = ((multiplier[0] / scaleBuffer[0]))
                    multiplier[1] = ((multiplier[1] / scaleBuffer[1]))
                    multiplier[2] = ((multiplier[2] / scaleBuffer[2]))
                mc.setAttr(_dup_curve + '.sx', multiplier[0])
                mc.setAttr(_dup_curve + '.sy', multiplier[1])
                mc.setAttr(_dup_curve + '.sz', multiplier[2])

            _dup_curve = parent_set(_dup_curve, False)

            mc.delete(group)

            #freeze for parent shaping
            mc.makeIdentity(_dup_curve,
                            apply=True,
                            translate=True,
                            rotate=True,
                            scale=True)

            shape = mc.listRelatives(_dup_curve,
                                     f=True,
                                     shapes=True,
                                     fullPath=True)
            mc.parent(shape, obj, add=True, shape=True)
            mc.delete(_dup_curve)
            if not keepSource:
                mc.delete(c)
        except Exception, err:
            cgmGEN.cgmExceptCB(Exception, err, msg=vars())
예제 #10
0
def register(controlObject = None,#(mObject - None) -- The object to use as a control
             typeModifier = None,#(string - None) -- Tag for cgmTypeModifier for naming
             copyTransform = None,#(mObject - None) -- Object to copy the transform of for our control object
             copyPivot = None,#(mObject - None) -- Object to copy the pivot of for our control object
             shapeParentTo = None, #'(mObject - None) -- Object to shape parent our control curve to to use that transform
             useShape = None, #'(mObject - None) -- Object to use the curve shape of for our control
             setRotateOrder = None,#'(rotateOrder - None) -- Argument for a rotate order to set
             autoLockNHide = None,#'(bool - None) -- Try to set lock and hide
             mirrorAxis = None,#'(string - None) -- Mirror axis to set - using red9's setup terms
             mirrorSide = None,#'(string/int - None) -- Mirror side - using red9's setup terms
             makeMirrorable = True,#'(bool - True) -- Setup for mirrorability (using red9) -- implied by other mirror args
             addDynParentGroup = False,#'(False) -- Add a dynParent group setup
             addExtraGroups = False,#'(int - False) -- Number of nested extra groups desired
             addConstraintGroup = False,#'(bool - False) -- If a group just above the control is desired for consraining
             freezeAll = False,#'(bool - False) -- Freeze all transforms on the control object
             noFreeze = False,
             addSpacePivots = False,#'(int - False) -- Number of space pivots to generate and connect
             controlType = None,#'(string - None) -- Tag for cgmType
             aim = None,#'(string/int - None) -- aim axis to use
             up = None,#'(string/int - None) -- up axis to use
             out = None,#'(string/int - None) -- out axis to use
             makeAimable = None,#'(mObject - False) -- Make object aimable -- implied by aim/up/out):
             **kws):

    _str_func = 'register'
    """
    [{'step':'validate','call':self._validate},
    {'step':'Copy Transform','call':self._copyTransform},
    {'step':'Shape Parent','call':self._shapeParent},
    {'step':'Copy Pivot','call':self._copyPivot},
    {'step':'Naming','call':self._naming},
    {'step':'Aim Setup','call':self._aimSetup},
    {'step':'Rotate Order','call':self._rotateOrder},
    {'step':'Initial Freeze','call':self._initialFreeze},
    {'step':'Groups Setup','call':self._groupsSetup},
    {'step':'Space Pivot','call':self._spacePivots},
    {'step':'Mirror Setup','call':self._mirrorSetup},	                        
    {'step':'Freeze','call':self._freeze},
    {'step':'Mirror Attribute Bridges','call':self._mirrorAttributeBridges_},	                        
    {'step':'lock N Hide','call':self._lockNHide},
    {'step':'Return build','call':self._returnBuild}]
    """
    try:
        #Validate ================================================================================================
        mi_control = cgmMeta.validateObjArg(controlObject,'cgmControl', setClass=True)
        
        str_mirrorAxis = VALID.stringArg(mirrorAxis,calledFrom = _str_func)
        str_mirrorSide = cgmGeneral.verify_mirrorSideArg(mirrorSide)#VALID.stringArg(mirrorSide,calledFrom = _str_func)
        b_makeMirrorable = VALID.boolArg(makeMirrorable,calledFrom = _str_func)
    
        _addMirrorAttributeBridges = kws.get('addMirrorAttributeBridges',False)
        addForwardBack = kws.get('addForwardBack',False)
        
        if _addMirrorAttributeBridges :
            if type(_addMirrorAttributeBridges ) not in [list,tuple]:
                raise ValueError,"[Bad addMirrorAttributeBridge arg]{arg: %s}"%_addMirrorAttributeBridge 
            for i,l in enumerate(_addMirrorAttributeBridges):
                if type(l) not in [list,tuple]:
                    raise ValueError,"[Bad addMirrorAttributeBridge arg: %s]{arg: %s}"%(i,l) 			
        
        # Running lists ------------------------------------------------------------------------------------------
        ml_groups = []#Holder for groups
        ml_constraintGroups = []
        ml_spacePivots = []
    
        #Copy Transform ================================================================================================
        if copyTransform is not None:
            mTarget = cgmMeta.validateObjArg(copyTransform,'cgmObject',noneValid=True)
            if not mTarget:
                raise StandardError,"Failed to find suitable copyTransform object: '%s"%copyTransform
    
            #Need to move this to default cgmNode stuff
            mBuffer = mi_control
            i_newTransform = cgmMeta.cgmObject( rigging.groupMeObject(mTarget.mNode,False) )
            for a in mc.listAttr(mi_control.mNode, userDefined = True):
                ATTR.copy_to(mi_control.mNode,a,i_newTransform.mNode)
            curves.parentShapeInPlace(i_newTransform.mNode,mi_control.mNode)#Parent shape
            i_newTransform.parent = mi_control.parent#Copy parent
            mi_control = cgmMeta.asMeta(i_newTransform,'cgmControl', setClass=True)
            mc.delete(mBuffer.mNode)    
          
        #ShapeParent ================================================================================================
        if shapeParentTo:
            i_target = cgmMeta.validateObjArg(shapeParentTo,'cgmObject')
            CORERIG.shapeParent_in_place(i_target.mNode,mi_control.mNode)
            i_target = cgmMeta.asMeta(i_target,'cgmControl',setClass = True)
            #mi_control.delete()
            mi_control = i_target#replace the control with the joint    
    
        if useShape is not None:
            i_shape = cgmMeta.validateObjArg(useShape,cgmMeta.cgmObject,mayaType='nurbsCurve')
            curves.parentShapeInPlace(mi_control.mNode,i_shape.mNode)
            
        #Copy Pivot ============================================================================================
        if copyPivot is not None:
            if issubclass(type(copyPivot),cgmMeta.cgmNode):
                i_target = copyPivot
            elif mc.objExists(copyPivot):
                i_target = cgmMeta.cgmObject(copyPivot)
            else:
                raise StandardError,"Failed to find suitable copyTransform object: '%s"%copyPivot
    
            #Need to move this to default cgmNode stuff
            mi_control.doCopyPivot(i_target.mNode)
    
        #Naming ============================================================================================
        mi_control.addAttr('cgmType','controlAnim',lock=True)    
        if typeModifier is not None:
            mi_control.addAttr('cgmTypeModifier',str(typeModifier),lock=True)
        mi_control.doName()#mi_control.doName(nameShapes=True) 
            
            
        #Rotate Order ============================================================================================
        _rotateOrder = False
        if setRotateOrder is not None:
            _rotateOrder = setRotateOrder
        elif controlType in __d_rotateOrderDefaults__.keys():
            _rotateOrder = __d_rotateOrderDefaults__[controlType]
        elif mi_control.getAttr('cgmName') in __d_rotateOrderDefaults__.keys():
            _rotateOrder = __d_rotateOrderDefaults__[mi_control.getAttr('cgmName')]
        else:
            log.debug("|{0}| >> Rotate order not set on: {1}".format(_str_func,mi_control.p_nameShort))  
            
            
        #Set it ---------------------------------------------------------------
        if _rotateOrder:
            mRotateOrder = VALID.simpleOrientation(_rotateOrder)
            #dictionary.validateRotateOrderString(_rotateOrder)
            
            mc.xform(mi_control.mNode, rotateOrder = mRotateOrder.p_string)
            
        #Initial Freeze ============================================================================================
        if freezeAll:
            mc.makeIdentity(mi_control.mNode, apply=True,t=1,r=1,s=1,n=0)    
        
        #Groups ============================================================================================
        if addDynParentGroup or addSpacePivots or mi_control.getAttr('cgmName') == 'cog' or _addMirrorAttributeBridges:
            mi_control.addAttr('________________',attrType = 'int',keyable = False,hidden = False,lock=True)
            ATTR.reorder(mi_control.mNode, '________________',top=True )
        #Aim Setup ============================================================================================
        if aim is not None or up is not None or makeAimable:
            mi_control._verifyAimable()  
       
        #First our master group:
        i_masterGroup = (cgmMeta.asMeta(mi_control.doGroup(True), 'cgmObject', setClass=True))
        i_masterGroup.doStore('cgmName',mi_control)
        i_masterGroup.addAttr('cgmTypeModifier','master',lock=True)
        i_masterGroup.doName()
        mi_control.connectChildNode(i_masterGroup,'masterGroup','groupChild')
    
        if addDynParentGroup:
            i_dynGroup = (cgmMeta.cgmObject(mi_control.doGroup(True)))
            i_dynGroup = cgmRigMeta.cgmDynParentGroup(dynChild=mi_control,dynGroup=i_dynGroup)
            i_dynGroup.doName()
            """
            i_zeroGroup = (cgmMeta.cgmObject(mi_control.doGroup(True)))
            i_zeroGroup.addAttr('cgmTypeModifier','zero',lock=True)
            i_zeroGroup.doName()
            mi_control.connectChildNode(i_zeroGroup,'zeroGroup','groupChild')"""
    
        if addExtraGroups:
            for i in range(addExtraGroups):
                i_group = (cgmMeta.asMeta(mi_control.doGroup(True),'cgmObject',setClass=True))
                if type(addExtraGroups)==int and addExtraGroups>1:#Add iterator if necessary
                    i_group.addAttr('cgmIterator',str(i+1),lock=True)
                    i_group.doName()
                ml_groups.append(i_group)
            mi_control.msgList_connect("extraGroups",ml_groups,'groupChild')
    
        if addConstraintGroup:#ConstraintGroups
            i_constraintGroup = (cgmMeta.asMeta(mi_control.doGroup(True),'cgmObject',setClass=True))
            i_constraintGroup.addAttr('cgmTypeModifier','constraint',lock=True)
            i_constraintGroup.doName()
            ml_constraintGroups.append(i_constraintGroup)
            mi_control.connectChildNode(i_constraintGroup,'constraintGroup','groupChild')	    	    
        
    
        #Space Pivot ============================================================================================
        if addSpacePivots:
            parent = mi_control.getMessage('masterGroup')[0]
            for i in range(int(addSpacePivots)):
                #i_pivot = rUtils.create_spaceLocatorForObject(mi_control.mNode,parent)
                i_pivot = SPACEPIVOTS.create(mi_control.mNode,parent)
                ml_spacePivots.append(i_pivot)
                #log.info("spacePivot created: {0}".format(i_pivot.p_nameShort))			
    
    
        #Mirror Setup ============================================================================================
        if str_mirrorSide is not None or b_makeMirrorable:
            for mObj in [mi_control] + ml_spacePivots:
                mi_control._verifyMirrorable()
                l_enum = cgmMeta.cgmAttr(mi_control,'mirrorSide').p_enum
                if str_mirrorSide in l_enum:
                    #log.debug("|{0}| >> Rotate order not set on: {1}".format(_str_func,mi_control.p_nameShort))                  
                    #log.debug("%s >> %s >> found in : %s"%(_str_funcCombined, "mirrorSetup", l_enum))		
                    mi_control.mirrorSide = l_enum.index(str_mirrorSide)
                if str_mirrorAxis:
                    mi_control.mirrorAxis = str_mirrorAxis
            for mObj in mi_control.msgList_get('spacePivots'):
                mObj._verifyMirrorable()
                mi_control.doConnectOut('mirrorAxis',mObj.mNode + '.mirrorAxis')
                mi_control.doConnectOut('mirrorSide',mObj.mNode + '.mirrorSide')
                
                #cgmMeta.cgmAttr(mObj,'mirrorSide').doConnectIn(mi_control,'mirrorSide')
                #cgmMeta.cgmAttr(mi_control,'mirrorAxis').doCopyTo(mObj,connectTargetToSource = 1)
                #ATTR.connect(mObj.mNode + '.mirrorAxis',"{0}.mirrorAxis".format(mi_control.mNode))
                #ATTR.connect(mObj.mNode + 'mirrorSide',"{0}.mirrorSide".format(mi_control.mNode))
    
        #Freeze ============================================================================================
        if not shapeParentTo and noFreeze is not True:
            if not freezeAll:
                if mi_control.getAttr('cgmName') == 'cog' or controlType in __l_fullFreezeTypes__:
                    mc.makeIdentity(mi_control.mNode, apply=True,t=1,r=1,s=1,n=0)	
                else:
                    mc.makeIdentity(mi_control.mNode, apply=True,t=1,r=0,s=1,n=0)
            else:
                mc.makeIdentity(mi_control.mNode, apply=True,t=1,r=1,s=1,n=0)    
        
        #Mirror attriubte Bridges ============================================================================================
        if addForwardBack:
            mPlug_forwardBackDriver = cgmMeta.cgmAttr(mi_control,"forwardBack",attrType = 'float',keyable=True)
            try:
                mPlug_forwardBackDriven = cgmMeta.validateAttrArg([mi_control,addForwardBack])['mi_plug']
            except Exception,error:raise StandardError,"push pull driver | %s"%(error)
        
            if str_mirrorSide.lower() == 'right':
                arg_forwardBack = "%s = -%s"%(mPlug_forwardBackDriven.p_combinedShortName,
                                              mPlug_forwardBackDriver.p_combinedShortName)		    
            else:
                arg_forwardBack = "%s = %s"%(mPlug_forwardBackDriven.p_combinedShortName,
                                             mPlug_forwardBackDriver.p_combinedShortName)
        
            mPlug_forwardBackDriven.p_locked = True
            mPlug_forwardBackDriven.p_hidden = True
            mPlug_forwardBackDriven.p_keyable = False		
            NodeF.argsToNodes(arg_forwardBack).doBuild()
        
        if _addMirrorAttributeBridges:
            for l_bridge in _addMirrorAttributeBridges:
                _attrName = VALID.stringArg(l_bridge[0])
                _attrToBridge = VALID.stringArg(l_bridge[1])
                if not mi_control.hasAttr(_attrToBridge):
                    raise StandardError,"['%s' lacks the bridge attr '%s']"%(mi_control.p_nameShort,_attrToBridge)
    
                mPlug_attrBridgeDriver = cgmMeta.cgmAttr(mi_control,_attrName,attrType = 'float',keyable=True)
                try:
                    mPlug_attrBridgeDriven = cgmMeta.validateAttrArg([mi_control,_attrToBridge])['mi_plug']
                except Exception,error:raise StandardError,"[validate control attribute bridge attr]{%s}"%(error)
    
                if str_mirrorSide.lower() == 'right':
                    arg_attributeBridge = "%s = -%s"%(mPlug_attrBridgeDriven.p_combinedShortName,
                                                      mPlug_attrBridgeDriver.p_combinedShortName)		    
                else:
                    arg_attributeBridge = "%s = %s"%(mPlug_attrBridgeDriven.p_combinedShortName,
                                                     mPlug_attrBridgeDriver.p_combinedShortName)
    
                mPlug_attrBridgeDriven.p_locked = True
                mPlug_attrBridgeDriven.p_hidden = True
                mPlug_attrBridgeDriven.p_keyable = False		
                NodeF.argsToNodes(arg_attributeBridge).doBuild()    
        
        #lock N Hide ============================================================================================
        if mi_control.hasAttr('visibility'):
            mi_control.visibility = True
        
        if autoLockNHide:
            if mi_control.hasAttr('cgmTypeModifier'):
                if mi_control.cgmTypeModifier.lower() == 'fk':
                    ATTR.set_standardFlags(mi_control.mNode,attrs=['tx','ty','tz','sx','sy','sz'])
            if mi_control.cgmName.lower() == 'cog':
                ATTR.set_standardFlags(mi_control.mNode,attrs=['sx','sy','sz'])
            cgmMeta.cgmAttr(mi_control,'visibility',lock=True,hidden=True)
            
        if mi_control.hasAttr('cgmIterator'):
            ATTR.set_standardFlags(mi_control.mNode,attrs=['cgmIterator'])
        
        str_base = mi_control.p_nameBase
        for i,mShape in enumerate(mi_control.getShapes(asMeta=True)):
            mShape.rename("{0}_shape_{1}".format(str_base,i))
            #mShape.doName()
        
        #return ============================================================================================
        #pprint.pprint(vars())
        
        return {'mObj':mi_control,'instance':mi_control,'ml_groups':ml_groups,'ml_constraintGroups':ml_constraintGroups}	
    except Exception,err: cgmGeneral.cgmExceptCB(Exception,err)