Exemplo n.º 1
0
def get_rigGeo(self):
    """
    First pass on qss verification
    """
    _str_func = 'get_rigGeo'
    log.debug("|{0}| >> ...".format(_str_func) + cgmGEN._str_hardBreak)
    log.debug(self)
    mMasterNull = self.masterNull

    _res = []
    _l_base = [o for o in mc.ls(type='mesh', visible=True, long=True)]
    _l_dags = [VALID.getTransform(o) for o in _l_base]
    _l_dags = LISTS.get_noDuplicates(_l_dags)

    for o in _l_dags:
        mObj = cgmMeta.asMeta(o)
        if mObj.getMayaAttr('mClass') == 'cgmControl':
            log.debug("|{0}| >> Invalid obj: {1}".format(_str_func, o))
            continue
        if mObj.getMayaAttr('cgmType') in [
                'jointApprox', 'rotatePlaneVisualize'
        ]:
            log.debug("|{0}| >> Invalid obj: {1}".format(_str_func, o))
            continue
        if 'proxy_geo' in o:
            continue
        if 'proxyGeo' in o:
            continue
        _res.append(mObj)

    log.debug("|{0}| >> Visible shapes: {1} | dags: {2} | res: {3} ".format(
        _str_func, len(_l_base), len(_l_dags), len(_res)))

    return _res
Exemplo n.º 2
0
def get_constraintsFrom(node=None, fullPath = True):
    """
    Get the constraints a given node drives
    
    :parameters:
        node(str): node to query
        fullPath(bool): How you want list

    :returns
        list of constraints(list)
    """   
    _str_func = 'get_constraintsFrom'
    
    node = VALID.mNodeString(node)
    
    _res = mc.listConnections(node,source = False, destination = True,skipConversionNodes = True, type='constraint') or []

    _res = LISTS.get_noDuplicates(_res)
    #_l_objectConstraints = get(node)
    #for c in _l_objectConstraints:
        #if c in _res:_res.remove(c)
    
    if fullPath:
        return [NAMES.long(o) for o in _res]
    return _res
Exemplo n.º 3
0
def get_constraintsTo(node=None,
                      fullPath=True,
                      typeFilter=None,
                      typeMask=None):
    """
    Get the constraints on a given node
    
    :parameters:
        node(str): node to query
        fullPath(bool): How you want list
    :returns
        list of constraints(list)
    """
    _str_func = 'get_constraintsTo'

    node = VALID.mNodeString(node)

    _res = mc.listRelatives(node, type='constraint', fullPath=fullPath) or []
    _res = LISTS.get_noDuplicates(_res)

    if typeFilter:
        typeFilter = VALID.listArg(typeFilter)

        for i, t in enumerate(typeFilter):
            if 'Constraint' not in t:
                typeFilter[i] = t + 'Constraint'

        log.debug(
            cgmGEN.logString_msg(_str_func,
                                 'typeFilter: {0}'.format(typeFilter)))
        _res_filter = []
        for o in _res:
            _type = VALID.get_mayaType(o)
            if _type in typeFilter:
                _res_filter.append(o)
        _res = _res_filter

    if typeMask:
        typeMask = VALID.listArg(typeMask)

        for i, t in enumerate(typeMask):
            if 'Constraint' not in t:
                typeMask[i] = t + 'Constraint'

        log.debug(
            cgmGEN.logString_msg(_str_func, 'typeMask: {0}'.format(typeMask)))

        for o in _res:
            _type = VALID.get_mayaType(o)
            if _type in typeMask:
                _res.remove(o)
                log.debug(
                    cgmGEN.logString_msg(_str_func, 'removing: {0}'.format(o)))

    if fullPath:
        return [NAMES.long(o) for o in _res]
    return _res
Exemplo n.º 4
0
def get_driver(driven=None, getPlug=True, select=True):
    """
    Get the driver objects or plugs by following the anim curve out of our intial driven
    
    :parameters:
        driven(str): Attribute to map. If none provided, checks selection
        getPlug(bool): Whether to get plug or node
        select(bool): Select the result

    :returns
        driven
    """
    _str_func = 'get_driver'

    driven = VALID.listArg(driven)
    if not driven:
        driven = SEARCH.get_selectedFromChannelBox(False) or []

    log.debug("|{0}| >> Driven: {1}".format(_str_func, driven))
    if not driven:
        log.error(
            "|{0}| >> No driven found or offered. Try selecting an attribute that is an sdk driven"
            .format(_str_func))
        return False
    l_driver = []
    for d in driven:
        _buffer = mc.listConnections(d, scn=True, s=True, d=False) or []
        if not _buffer:
            log.error("|{0}| >> Driven: {1} | No data found".format(
                _str_func, d))
        for c in _buffer:
            log.debug("|{0}| >> Checking: {1}".format(_str_func, c))
            #b_transform = VALID.is_transform(c)
            #if not b_transform:
            l_driver.append(
                SEARCH.seek_upStream(c, mode='isTransform', getPlug=getPlug))

    l_driver = LISTS.get_noDuplicates(l_driver)
    if not l_driver:
        log.error("|{0}| >> No driver found".format(_str_func))
        return False
    if select:
        mc.select(l_driver)
        pprint.pprint(l_driver)
    return l_driver
Exemplo n.º 5
0
def get_constraintsTo(node=None, fullPath = True):
    """
    Get the constraints on a given node
    
    :parameters:
        node(str): node to query
        fullPath(bool): How you want list
    :returns
        list of constraints(list)
    """   
    _str_func = 'get_constraintsTo'
    
    node = VALID.mNodeString(node)
    
    _res = mc.listRelatives(node,type='constraint',fullPath=fullPath) or []
    _res = LISTS.get_noDuplicates(_res)
    if fullPath:
        return [NAMES.long(o) for o in _res]
    return _res
Exemplo n.º 6
0
def driven_disconnect(driven = None, driver = None, mode = 'best'):
    """
    :parameters:
        l_jointChain1 - First set of objects

    :returns:

    :raises:
        Exception | if reached

    """
    _str_func = 'driven_disconnect'
    mDriven = cgmMeta.asMeta(driven)
    _short = mDriven.mNode
    l_drivers = []
    for a in ['tx','ty','tz','rx','ry','rz','sx','sy','sz']:
        l_drivers.append(ATTR.get_driver(_short,a,True))

    l_drivers = LISTS.get_noDuplicates(l_drivers)
    log.debug("|{0}| >> drivers: {1}".format(_str_func,l_drivers))
    mc.delete(l_drivers)
Exemplo n.º 7
0
def get_constraintsFrom(node=None,
                        fullPath=True,
                        typeFilter=None,
                        typeMask=None):
    """
    Get the constraints a given node drives
    
    :parameters:
        node(str): node to query
        fullPath(bool): How you want list

    :returns
        list of constraints(list)
    """
    _str_func = 'get_constraintsFrom'

    node = VALID.mNodeString(node)

    _res = mc.listConnections(node,
                              source=False,
                              destination=True,
                              skipConversionNodes=True,
                              type='constraint') or []

    _res = LISTS.get_noDuplicates(_res)
    #_l_objectConstraints = get(node)
    #for c in _l_objectConstraints:
    #if c in _res:_res.remove(c)

    if typeFilter:
        typeFilter = VALID.listArg(typeFilter)

        for i, t in enumerate(typeFilter):
            if 'Constraint' not in t:
                typeFilter[i] = t + 'Constraint'

        log.debug(
            cgmGEN.logString_msg(_str_func,
                                 'typeFilter: {0}'.format(typeFilter)))
        _res_filter = []
        for o in _res:
            _type = VALID.get_mayaType(o)
            if _type in typeFilter:
                _res_filter.append(o)
        _res = _res_filter

    if typeMask:
        typeMask = VALID.listArg(typeMask)

        for i, t in enumerate(typeMask):
            if 'Constraint' not in t:
                typeMask[i] = t + 'Constraint'

        log.debug(
            cgmGEN.logString_msg(_str_func, 'typeMask: {0}'.format(typeMask)))

        for o in _res:
            _type = VALID.get_mayaType(o)
            if _type in typeMask:
                _res.remove(o)
                log.debug(
                    cgmGEN.logString_msg(_str_func, 'removing: {0}'.format(o)))

    if fullPath:
        return [NAMES.long(o) for o in _res]
    return _res
Exemplo n.º 8
0
def orientByPlane(joints = None, axisAim = 'z+', axisUp = 'y+',
                worldUpAxis = [0,1,0], planarMode = 'up', relativeOrient = True,
                progressBar=None,
                baseName = None, cleanUp = True, asMeta = True):
                
    """
    Given a chain of joints, setup 

    :parameters:
        planarMode - up/out - What plane to use
        
    :returns
        created(list)
    """    
    _str_func = 'orientPlane'
    
    ml_joints = cgmMeta.validateObjListArg(joints,mayaType=['joint'],noneValid=False)
    ml_joints = LISTS.get_noDuplicates(ml_joints)
    
    mAxis_aim = VALID.simpleAxis(axisAim)
    mAxis_up = VALID.simpleAxis(axisUp)
    str_aim = mAxis_aim.p_string
    str_up = mAxis_up.p_string
    ml_delete = []
    
    if str_aim == str_up:
        raise ValueError,"axisAim and axisUp cannot be the same"
    if len(ml_joints) < 3:
        raise ValueError,"{0} > Need more than 3 joints".format(_str_func)
    
    #First setup a dup chain of first and end, orient those ----------------------------------------------------------------
    log.debug("|{0}| >> Setup tmp chain...".format(_str_func))                     
    
    mStart = ml_joints[0].doDuplicate(parentOnly = True)
    mEnd = ml_joints[-1].doDuplicate(parentOnly = True)
    mEnd.parent = mStart
    
    orientChain([mStart,mEnd], axisAim, axisUp, worldUpAxis, relativeOrient)

    #Setup Loft curves and plane ----------------------------------------------------------------
    log.debug("|{0}| >> Setup curves...".format(_str_func))                     
    
    if planarMode == 'up':
        crvUp = mAxis_up.p_string
        crvDn = mAxis_up.inverse.p_string
    else:
        for a in 'xyz':
            if a not in str_aim and a not in str_up:
                mAxisCrv_tmp = VALID.simpleAxis(a+'+')
                crvUp = mAxisCrv_tmp.p_string
                crvDn = mAxisCrv_tmp.inverse.p_string
        
    d_distance = DIST.get_distance_between_targets([mStart.mNode,mEnd.mNode])
    
    l_crvs = []
    for mObj in [mStart,mEnd]:
        crv =   mc.curve (d=1, ep = [DIST.get_pos_by_axis_dist(mObj.mNode, crvUp, d_distance),
                                     DIST.get_pos_by_axis_dist(mObj.mNode, crvDn, d_distance)],
                               os=True)
        log.debug("|{0}| >> Created: {1}".format(_str_func,crv))
        l_crvs.append(crv)
        
    _res_body = mc.loft(l_crvs, o = True, d = 1, po = 1 )
    _inputs = mc.listHistory(_res_body[0],pruneDagObjects=True)
    _tessellate = _inputs[0]
    
    _d = {'format':2,#General
          'polygonType':1,#'quads'
          }
          
    for a,v in _d.iteritems():
        ATTR.set(_tessellate,a,v)    
            
    #Snap our joints ---------------------------------------------------------------------------------
    for mJnt in ml_joints[1:-1]:
        ml_children = mJnt.getChildren(asMeta=True)
        for mChild in ml_children:
            mChild.parent = False
            
        SNAP.go(mJnt, _res_body[0], rotation=False, pivot='closestPoint')

        for mChild in ml_children:
            mChild.parent = mJnt
            
    #Cleanup --------------------------------------------------------------------------------------------
    if cleanUp:
        mc.delete(_res_body + l_crvs)
        mStart.delete()
        
    orientChain(ml_joints, axisAim, axisUp, worldUpAxis, relativeOrient,progressBar)

    return

    l_start = []
    l_end = []
    
    mStartCrv = mc.curve()
    mc.curve (d=1, ep = posList, os=True)
Exemplo n.º 9
0
         #log.debug("|{0}| >> reparenting: {1} | {2}".format(_str_func,mJnt.mNode, _d_parents[mJnt]))         
         #cgmUI.progressBar_iter(progressBar,status='Reparenting: {0}'.format(mJnt.mNode))
         
         mJnt.parent = _d_parents[mJnt]
         
         for mChild in _d_children[mJnt]:
             #if mChild not in ml_joints:
                 #log.debug("|{0}| >> reparenting child: {1}".format(_str_func,mChild.mNode))                             
             mChild.parent = mJnt
         
         if mJnt in ml_ends and mJnt not in ml_world:
             log.debug("|{0}| >> End joint. No world: {1}".format(_str_func,mJnt))                                             
             mJnt.jointOrient = 0,0,0                
                     
 ml_joints = cgmMeta.validateObjListArg(joints,mayaType=['joint'],noneValid=False)
 ml_joints = LISTS.get_noDuplicates(ml_joints)
 
 mAxis_aim = VALID.simpleAxis(axisAim)
 mAxis_up = VALID.simpleAxis(axisUp)
 _axisWorldUp = worldUpAxis
 str_aim = mAxis_aim.p_string
 str_up = mAxis_up.p_string
 
 if str_aim == str_up:
     raise ValueError,"axisAim and axisUp cannot be the same"
 
 _len = len(ml_joints)
 _d_parents = {}
 _d_children = {}
 ml_roots = []
 ml_ends = []
Exemplo n.º 10
0
def eyeLook_verify(self):
    _str_func = 'eyeLook_verify'
    try:
        log.debug("|{0}| >>  ".format(_str_func)+ '-'*80)
        log.debug("{0}".format(self))
        mBlock = self.mBlock
        
        mModule = self.mModule
        mRigNull = self.mRigNull
        mPuppet = self.mPuppet
        mHandleFactory = mBlock.asHandleFactory()
        
        _eyeLook = eyeLook_get(self)
        if _eyeLook:
            log.debug("|{0}| >> Found existing eyeLook...".format(_str_func))                      
            return _eyeLook
        
        if mBlock.blockType not in ['eye']:
            raise ValueError,"blocktype must be eye. Found {0} | {1}".format(mBlock.blockType,mBlock)
        
        #Data... -----------------------------------------------------------------------
        log.debug("|{0}| >> Get data...".format(_str_func))
        #_size = mHandleFactory.get_axisBox_size(mBlock.getMessage('bbHelper'))
        
        try:
            _size = self.v_baseSize
            _sizeAvg = self.f_sizeAvg             
        except:
            _size = [mBlock.blockScale * v for v in mBlock.baseSize]
            _sizeAvg = MATH.average(_size)
        
        #Create shape... -----------------------------------------------------------------------        
        log.debug("|{0}| >> Creating shape...".format(_str_func))
        mCrv = cgmMeta.asMeta( CURVES.create_fromName('arrow4Fat',
                                                      direction = 'z+',
                                                      size = _sizeAvg ,
                                                      absoluteSize=False),'cgmObject',setClass=True)
        mCrv.doSnapTo(mBlock.mNode,rotation=False)
        pos = mBlock.getPositionByAxisDistance('z+',
                                               _sizeAvg * 8)
        
        mCrv.p_position = 0,pos[1],pos[2]
        
        
        mBlockParent = mBlock.p_blockParent
        if mBlockParent:
            mCrv.doStore('cgmName',mBlockParent.cgmName + '_eyeLook')
            mBlockParent.asHandleFactory().color(mCrv.mNode)
        else:
            mCrv.doStore('cgmName','eyeLook')
            mHandleFactory.color(mCrv.mNode)
        
        mCrv.doName()
        

        #Register control... -----------------------------------------------------------------------        
        log.debug("|{0}| >> Registering Control... ".format(_str_func))
        d_buffer = MODULECONTROL.register(mCrv,
                                          mirrorSide= 'center',
                                          mirrorAxis="translateX,rotateY,rotateZ",
                                          addSpacePivots = 2)
        
        mCrv = d_buffer['mObj']        
        
        
        #Dynparent... -----------------------------------------------------------------------        
        log.debug("|{0}| >> Dynparent setup.. ".format(_str_func))
        ml_dynParents = copy.copy(self.ml_dynParentsAbove)
        mHead = False
        for mParent in ml_dynParents:
            log.debug("|{0}| >> mParent: {1}".format(_str_func,mParent))
            
            if mParent.getMayaAttr('cgmName') == 'head':
                log.debug("|{0}| >> found head_direct...".format(_str_func))
                mHead = mParent
                break
        if mHead:
            ml_dynParents.insert(0,mHead)
        #if mBlock.attachPoint == 'end':
        #ml_dynParents.reverse()
        
        ml_dynParents.extend(mCrv.msgList_get('spacePivots'))
        ml_dynParents.extend(copy.copy(self.ml_dynEndParents))
        
        ml_dynParents = LISTS.get_noDuplicates(ml_dynParents)
        mDynParent = cgmRIGMETA.cgmDynParentGroup(dynChild=mCrv,dynMode=0)
        
        for o in ml_dynParents:
            mDynParent.addDynParent(o)
        mDynParent.rebuild()
        
        #Connections... -----------------------------------------------------------------------        
        log.debug("|{0}| >> Connections... ".format(_str_func))
        mModule.connectChildNode(mCrv,'eyeLook')
        mPuppet.msgList_append('eyeLook',mCrv,'puppet')
        
        if mBlockParent:
            log.debug("|{0}| >> Adding to blockParent...".format(_str_func))
            mModuleParent = mBlockParent.moduleTarget
            mModuleParent.connectChildNode(mCrv,'eyeLook')
            if mModuleParent.mClass == 'cgmRigModule':
                mBlockParentRigNull = mModuleParent.rigNull
                mBlockParentRigNull.msgList_append('controlsAll',mCrv)
                mBlockParentRigNull.moduleSet.append(mCrv)
                mRigNull.faceSet.append(mCrv)
                
                mCrv.connectParentNode(mBlockParentRigNull,'rigNull')
                
            else:
                mModuleParent.puppetSet.append(mCrv)
                mModuleParent.msgList_append('controlsAll',mCrv)
                mModuleParent.faceSet.append(mCrv)
                

        #Connections... -----------------------------------------------------------------------        
        log.debug("|{0}| >> Heirarchy... ".format(_str_func))
        mCrv.masterGroup.p_parent = self.mDeformNull
        
        for link in 'masterGroup','dynParentGroup':
            if mCrv.getMessage(link):
                mCrv.getMessageAsMeta(link).dagLock(True)
                
        mCrv.addAttr('cgmControlDat','','string')
        mCrv.cgmControlDat = {'tags':['ik']}                
        
        return mCrv
    
    except Exception,error:
        cgmGEN.cgmExceptCB(Exception,error,msg=vars())
Exemplo n.º 11
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 = []

        #DynParents =============================================================================
        self.UTILS.get_dynParentTargetsDat(self)
        log.debug(cgmGEN._str_subLine)

        mModule = self.mModule
        mRigNull = self.mRigNull
        mPuppet = self.mPuppet
        mHandleFactory = mBlock.asHandleFactory()
        """
        _eyeLook = eyeLook_get(self)
        
        if _eyeLook:
            log.debug("|{0}| >> Found existing eyeLook...".format(_str_func))                      
            return _eyeLook
        
        if mBlock.blockType not in ['eye']:
            raise ValueError,"blocktype must be eye. Found {0} | {1}".format(mBlock.blockType,mBlock)
        """

        #Data... -----------------------------------------------------------------------
        log.debug("|{0}| >> Get data...".format(_str_func))
        #_size = mHandleFactory.get_axisBox_size(mBlock.getMessage('bbHelper'))

        try:
            _size = self.v_baseSize
            _sizeAvg = self.f_sizeAvg
        except:
            _size = [mBlock.blockScale * v for v in mBlock.baseSize]
            _sizeAvg = MATH.average(_size)

        #Create shape... -----------------------------------------------------------------------
        log.debug("|{0}| >> Creating shape...".format(_str_func))
        mCrv = cgmMeta.asMeta(CURVES.create_fromName('arrow4Fat',
                                                     direction='z+',
                                                     size=_sizeAvg,
                                                     absoluteSize=False),
                              'cgmObject',
                              setClass=True)
        mCrv.doSnapTo(mBlock.mNode, rotation=False)
        pos = mBlock.p_position

        mCrv.p_position = pos

        mBlockParent = mBlock.p_blockParent
        if mBlockParent:
            _parentName = mBlockParent.getMayaAttr(
                'cgmName') or mBlockParent.p_nameShort
            mCrv.doStore('cgmName', _parentName + '_eyeLook')
            mBlockParent.asHandleFactory().color(mCrv.mNode)
        else:
            mCrv.doStore('cgmName', 'eyeLook')
            mHandleFactory.color(mCrv.mNode)

        mCrv.doName()

        #Register control... -----------------------------------------------------------------------
        log.debug("|{0}| >> Registering Control... ".format(_str_func))
        d_controlSpaces = self.atBuilderUtils('get_controlSpaceSetupDict')

        d_buffer = MODULECONTROL.register(
            mCrv,
            mirrorSide='center',
            mirrorAxis="translateX,rotateY,rotateZ",
            **d_controlSpaces)

        mCrv = d_buffer['mObj']

        #Dynparent... -----------------------------------------------------------------------
        log.debug("|{0}| >> Dynparent setup.. ".format(_str_func))
        ml_dynParents = copy.copy(self.ml_dynParentsAbove)
        mHead = False
        for mParent in ml_dynParents:
            log.debug("|{0}| >> mParent: {1}".format(_str_func, mParent))

            if mParent.getMayaAttr('cgmName') == 'head':
                log.debug("|{0}| >> found head_direct...".format(_str_func))
                mHead = mParent
                break
        if mHead:
            ml_dynParents.insert(0, mHead)

        #if mBlock.attachPoint == 'end':
        #ml_dynParents.reverse()

        ml_dynParents.extend(mCrv.msgList_get('spacePivots'))
        ml_dynParents.extend(copy.copy(self.ml_dynEndParents))

        ml_dynParents = LISTS.get_noDuplicates(ml_dynParents)
        mDynParent = cgmRIGMETA.cgmDynParentGroup(dynChild=mCrv, dynMode=0)

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

        #Connections... -----------------------------------------------------------------------
        log.debug("|{0}| >> Connections... ".format(_str_func))
        mModule.connectChildNode(mCrv, 'eyeLook')
        mPuppet.msgList_append('eyeLook', mCrv, 'puppet')

        if mBlockParent:
            log.debug("|{0}| >> Adding to blockParent...".format(_str_func))
            mModuleParent = mBlockParent.moduleTarget
            mModuleParent.connectChildNode(mCrv, 'eyeLook')
            if mModuleParent.mClass == 'cgmRigModule':
                mBlockParentRigNull = mModuleParent.rigNull
                mBlockParentRigNull.msgList_append('controlsAll', mCrv)
                mBlockParentRigNull.moduleSet.append(mCrv)
                #mRigNull.faceSet.append(mCrv)

                #mCrv.connectParentNode(mBlockParentRigNull,'rigNull')

            else:
                mModuleParent.puppetSet.append(mCrv)
                mModuleParent.msgList_append('controlsAll', mCrv)
                #mModuleParent.faceSet.append(mCrv)

        #Connections... -----------------------------------------------------------------------
        log.debug("|{0}| >> Heirarchy... ".format(_str_func))
        mCrv.masterGroup.p_parent = self.mDeformNull

        for link in 'masterGroup', 'dynParentGroup':
            if mCrv.getMessage(link):
                mCrv.getMessageAsMeta(link).dagLock(True)

        mCrv.addAttr('cgmControlDat', '', 'string')
        mCrv.cgmControlDat = {'tags': ['ik']}

        mBlock.template = True
        return True

        try:  #moduleParent Stuff =======================================================
            if mi_moduleParent:
                try:
                    for mCtrl in self.ml_controlsAll:
                        mi_parentRigNull.msgList_append('controlsAll', mCtrl)
                except Exception, error:
                    raise Exception, "!Controls all connect!| %s" % error
                try:
                    mi_parentRigNull.moduleSet.extend(self.ml_controlsAll)
                except Exception, error:
                    raise Exception, "!Failed to set module objectSet! | %s" % error
        except Exception, error:
            raise Exception, "!Module Parent registration! | %s" % (error)
Exemplo n.º 12
0
def get_splitValues(surface=None,
                    values=[],
                    mode='u',
                    knotIndices=[],
                    insertMin=False,
                    insertMax=False,
                    preInset=None,
                    postInset=None,
                    offset=None,
                    curvesCreate=False,
                    curvesConnect=False,
                    connectionPoints=9):
    """
    Function to split a curve up u positionally 
    
    :parameters:
        'curve'(None)  -- Curve to split
        
        
        curvesCreate(bool) - create new curves from the new values
        curvesConnect(bool) - whether to connect the first and last curves
        connectionPoints(int) - how many points of connection to use
    :returns
        list of values(list)
        
    hat tip: http://ewertb.soundlinker.com/mel/mel.074.php
    """
    _str_func = 'get_splitValues'
    log.debug("|{0}| >>  ".format(_str_func) + '-' * 80)
    _shape = SHAPES.get_nonintermediate(surface)
    if mode == 'u':
        l_base = get_dat(_shape, uKnots=True)['uKnots']
        minKnot = ATTR.get(_shape, 'minValueU')
        maxKnot = ATTR.get(_shape, 'maxValueU')
    else:
        l_base = get_dat(_shape, vKnots=True)['vKnots']
        minKnot = ATTR.get(_shape, 'minValueV')
        maxKnot = ATTR.get(_shape, 'maxValueV')

    l_sets = []

    log.debug("|{0}| >>  l_base: {1}".format(_str_func, l_base))

    if knotIndices:
        values = [l_base[v] for v in knotIndices]

    for i, v in enumerate(values):
        log.debug("|{0}| >>  Processing: {1} | {2}".format(_str_func, i, v) +
                  "-" * 40)
        _last = False
        if v == values[-1]:
            log.debug("|{0}| >>  last...".format(_str_func))
            _last = True

        if preInset:
            v += preInset
            log.debug("|{0}| >>  preinset: {1}".format(_str_func, v))

        _l = [v]

        _stop = False
        for knot in l_base:
            if _stop or MATH.is_float_equivalent(knot, v) == v: continue
            log.debug("|{0}| >>  checking knot: {1}".format(_str_func, knot))
            if _last:
                if knot > v:
                    _stop = True
                    _l.append(knot)

            if knot > v or knot < v:
                if _last != True and knot < values[i + 1] and knot > v:
                    _l.append(knot)
            log.debug("|{0}| >>  knot add: {1}".format(_str_func, _l))
            """
            if v == values[-1]:
                if knot < maxKnot:
                    _l.append(knot)
            elif _last != True and knot < values[i+1]:
                _l.append(knot)"""

        if _last and insertMax:
            l_add = []
            for v2 in l_base:
                if v2 > _l[-1]:
                    l_add.append(v2)
            for v2 in l_add:
                _l.append(v2)
            _l.append(maxKnot)

        if _last != True:
            _l.append(values[i + 1])

        if insertMin and i == 0:
            _l.insert(0, minKnot)

        if postInset:
            vPost = _l[-1] + postInset
            if vPost < _l[-2]:
                log.debug("|{0}| >>  alternate postInset".format(_str_func))
                vPost = _l[-2] + postInset

            log.debug("|{0}| >>  postInset: {1} | new: {2}".format(
                _str_func, _l[-1], vPost))
            if len(_l) > 1:
                if vPost > max(_l[:-1]):
                    log.debug(
                        "|{0}| >>  v post creater the max".format(_str_func))
                    _l[-1] = vPost
                else:
                    _l = _l[:-1]
            else:
                _l.append(vPost)
            """
            if _last != True:
                for v2 in _l:
                    if v2 > v:
                        _l.remove(v2)"""

        _l = LISTS.get_noDuplicates(_l)
        _l.sort()

        l_sets.append(_l)
        log.debug("|{0}| >>  result: {1} | {2} | {3}".format(
            _str_func, i, v, _l))

    l_pre = copy.copy(l_sets)
    #pprint.pprint(vars())

    if not curvesCreate:
        return l_sets

    log.debug("|{0}| >>  creating curves...".format(_str_func))

    l_newCurves = []
    d_curves = {}
    l_finalCurves = []

    def getCurve(uValue, l_newCurves):
        _crv = d_curves.get(uValue)
        if _crv: return _crv
        _crv = mc.duplicateCurve("{0}.u[{1}]".format(_shape, uValue),
                                 ch=0,
                                 rn=0,
                                 local=0)[0]
        if offset:
            DIST.offsetShape_byVector(_crv, offset, component='cv')
        d_curves[uValue] = _crv
        log.debug("|{0}| >> created: {1} ...".format(_str_func, _crv))
        l_newCurves.append(_crv)
        return _crv

    for i, uSet in enumerate(l_sets):
        _loftCurves = [getCurve(uValue, l_newCurves) for uValue in uSet]
        """
        if len(uSet)<2:
            l_finalCurves.append(mc.duplicate(_loftCurves[0])[0])
            continue"""

        log.debug("|{0}| >> {1} | u's: {2}".format(_str_func, i, uSet))
        """
                            if i == 0 and str_start:
                                _pair = [str_start,c,l_newCurves[i+1]]
                            else:
                                _pair = [c,l_newCurves[i+1]]"""

        if len(_loftCurves) == 1:
            l_mainCurves = [mc.duplicate(_loftCurves[0])[0]]

        else:
            crvBase = mc.duplicate(_loftCurves[0])[0]
            crvEnd = mc.duplicate(_loftCurves[-1])[0]

            l_mainCurves = [crvBase, crvEnd]

            if curvesConnect:
                log.debug("|{0}| >> {1} | Making connectors".format(
                    _str_func, i))
                d_epPos = {}

                for i, crv in enumerate(_loftCurves):
                    _l = CURVES.getUSplitList(crv,
                                              connectionPoints,
                                              rebuild=True,
                                              rebuildSpans=30)[:-1]
                    for ii, p in enumerate(_l):
                        if not d_epPos.get(ii):
                            d_epPos[ii] = []
                        _l = d_epPos[ii]
                        _l.append(p)

                for k, points in d_epPos.iteritems():
                    log.debug("|{0}| >> {1} | k: {1} | points: {2}".format(
                        _str_func, k, points))
                    try:
                        crv_connect = mc.curve(d=1, ep=points, os=True)

                        #CURVES.create_fromList(posList=points)
                        l_mainCurves.append(crv_connect)
                    except Exception, err:
                        print err

        for crv in l_mainCurves[1:]:
            CORERIG.shapeParent_in_place(l_mainCurves[0], crv, False)

        #ml_shapes.append(cgmMeta.validateObjArg(l_mainCurves[0]))
        l_finalCurves.append(l_mainCurves[0])
Exemplo n.º 13
0
def curve_tightenEnds(curve,
                      start=None,
                      end=None,
                      blendLength=3,
                      hardLength=2,
                      mode='twoBlend'):
    """
    
    
    mode
        'twoBlend' - blend between a start and end joint typically. Created for ribbon work
    
    """
    _str_func = 'curve_tightenEnds'

    mCurve = cgmMeta.asMeta(curve)

    l_cvs = mCurve.getComponents('cv')
    ml_skinClusters = mCurve.getDeformers(deformerTypes='skinCluster',
                                          asMeta=True)

    if len(ml_skinClusters) > 1:
        raise ValueError, "Only know how to deal with one skin cluster. Found: {0}".format(
            ml_skinClusters)

    mSkin = ml_skinClusters[0]

    #Get our influences --------------------------------------------------

    l_influenceObjects = CORESKIN.get_influences_fromCluster(mSkin.mNode)

    if not mSkin and l_influenceObjects:
        raise StandardError, "controlSurfaceSmoothWeights failed. Not enough info found"

    l_cvsUse = [int(cv.split('[')[-1].split(']')[0]) for cv in l_cvs]
    #cvEnds = [int(cv.split('[')[-2].split(']')[0]) for cv in l_cvs]
    pprint.pprint(vars())

    l_cvsUse = LISTS.get_noDuplicates(l_cvsUse)
    #cvEnds = LISTS.get_noDuplicates(cvEnds)

    if mode == 'twoBlend':
        log.debug("|{0}| >> twoBlend mode".format(_str_func))
        blendLength = len(l_cvsUse) - hardLength

    blendFactor = 1.0 / (blendLength + hardLength)
    log.debug("|{0}| >> BlendFactor: {1}".format(_str_func, blendFactor))

    if start is None or end is None:
        log.debug(
            "|{0}| >> No start or end. Figuring out one or another".format(
                _str_func))

        if start is None:
            pos_start = POS.get(l_cvs[0])
            start = DIST.get_closestTarget(pos_start, l_influenceObjects)
            log.warning("|{0}| >> No start arg, guessed: {1}".format(
                _str_func, start))

        if end is None:
            pos_end = POS.get(l_cvs[-1])
            end = DIST.get_closestTarget(pos_end, l_influenceObjects)
            log.warning("|{0}| >> No end arg, guessed: {1}".format(
                _str_func, end))

    #>>>Tie down start and ends
    #build our args....
    d_dat = {}
    for influence in [start, end]:
        if influence == start:
            cvBlendEnds = l_cvsUse[:blendLength]

        if influence == end:
            cvBlendEnds = l_cvsUse[-(blendLength):]
            cvBlendEnds.reverse()

        log.debug("|{0}| >> Influence: {1} | blendEnds: {2}".format(
            _str_func, influence, cvBlendEnds))

        for i, cv in enumerate(cvBlendEnds):
            k = "{0}.cv[{1}]".format(mCurve.mNode, cv)
            if not d_dat.get(k):
                l = list()
                d_dat[k] = l
            else:
                l = d_dat[k]

            d = d_dat[k]

            if i < hardLength:
                l.append([influence, 1.0])
            else:
                l.append(
                    [influence,
                     MATH.Clamp(
                         1 - ((i) * blendFactor),
                         0,
                         1.0,
                     )])
                #l.append([influence,MATH.Clamp(1 - ( (i-hardLength)*blendFactor), 0,1.0,)])

    #pprint.pprint(vars())
    #pprint.pprint(d_dat)
    #return

    for k, dat in d_dat.iteritems():
        #log.debug("|{0}| >> key: {1} | dat: {2}".format(_str_func,k,dat))

        l_vs = []
        for i, dat2 in enumerate(dat):
            l_vs.append(dat2[1])

        if sum(l_vs) > 1.0:
            #log.debug("|{0}| >> before: {1} ".format(_str_func,l_vs))
            l_vs = MATH.normalizeListToSum(l_vs)
            #log.debug("|{0}| >> after: {1} ".format(_str_func,l_vs))

            for i, dat2 in enumerate(dat):
                dat2[1] = l_vs[i]

        mc.skinPercent(mSkin.mNode, (k), tv=dat, normalize=1)