def _reload(): ''' reload carefully and re-register the RED9_META_REGISTRY ''' Red9.core._reload() reload(cgm_General) reload(cgm_Meta) reload(cgm_PuppetMeta) reload(cgm_RigMeta) reload(cgmPy.validateArgs) reload(rigger.ModuleFactory) reload(rigger.JointFactory) reload(rigger.TemplateFactory) reload(rigger.PuppetFactory) reload(rigger.RigFactory) reload(rigger.ModuleShapeCaster) reload(rigger.ModuleControlFactory) reload(classes.DraggerContextFactory) reload(classes.SnapFactory) reload(lib.rayCaster) reload(lib.meta_Utils) reload(lib.shapeCaster) Red9_Meta.registerMClassNodeMapping(nodeTypes = ['transform','objectSet','clamp','setRange','pointOnCurveInfo','decomposeMatrix','remapValue', 'ikSplineSolver','blendColors','blendTwoAttr','addDoubleLinear','condition','multiplyDivide','plusMinusAverage']) print('CGM Core Reloaded and META REGISTRY updated') print '==============================================================================' Red9_Meta.printSubClassRegistry() print '=============================================================================='
def test_getMetaNodes_mTypesAsClass(self): #mTypes test passing in Class rather than string nodes=sorted(r9Meta.getMetaNodes(mTypes=[r9Meta.MetaRig,r9Meta.MetaFacialRig]),key=lambda x: x.mClass.upper()) assert [n.mClass for n in nodes]==['MetaFacialRig','MetaRig'] nodes=r9Meta.getMetaNodes(dataType=None, mTypes=[r9Meta.MetaRig]) assert nodes==['MetaRig_Test']
def test_getMetaNodes_mTypes(self): #mTypes test nodes=sorted(r9Meta.getMetaNodes(mTypes=['MetaRig','MetaFacialRig']),key=lambda x: x.mClass.upper()) assert [n.mClass for n in nodes]==['MetaFacialRig','MetaRig'] nodes=r9Meta.getMetaNodes(dataType=None, mTypes=['MetaRig']) assert nodes==['MetaRig_Test']
def test_basicRigStructure(self): mRig=r9Meta.getConnectedMetaSystemRoot('L_Wrist_Ctrl') assert type(mRig)==r9Meta.MetaRig assert mRig.mNode=='RED_Rig' assert mRig.CTRL_Main[0]=='|World_Ctrl' #test the Left Arm wires assert type(mRig.L_ArmSystem)==r9Meta.MetaRigSubSystem assert mRig.L_ArmSystem.mNode=='L_ArmSystem' assert mRig.L_ArmSystem.systemType=='Arm' assert mRig.L_ArmSystem.mirrorSide==1 assert mRig.L_ArmSystem.CTRL_L_Wrist[0]=='|World_Ctrl|L_Wrist_Ctrl' assert mRig.L_ArmSystem.CTRL_L_Elbow[0]=='|World_Ctrl|COG__Ctrl|L_Elbow_Ctrl' ctrl=r9Meta.MetaClass(mRig.L_ArmSystem.CTRL_L_Wrist[0]) assert ctrl.mirrorSide==1 #?????? consistency of attrs on node and metaSubsystems!!!!!!! assert ctrl.mirrorIndex==1 #test the Right Leg wires assert type(mRig.R_LegSystem)==r9Meta.MetaRigSubSystem assert r9Meta.isMetaNode('R_LegSystem') assert mRig.R_LegSystem.mNode=='R_LegSystem' assert mRig.R_LegSystem.systemType=='Leg' assert mRig.R_LegSystem.mirrorSide==2 assert mRig.R_LegSystem.CTRL_R_Foot[0]=='|World_Ctrl|R_Foot_grp|R_Foot_Ctrl' assert mRig.R_LegSystem.CTRL_R_Knee[0]=='|World_Ctrl|R_Knee_Ctrl' ctrl=r9Meta.MetaClass(mRig.R_LegSystem.CTRL_R_Foot[0]) assert ctrl.mirrorSide==2 #?????? consistency of attrs on node and metaSubsystems!!!!!!! assert ctrl.mirrorIndex==4 #test the Left Leg wires #:NOTE slight difference in the naming as we didn't pass in the attr when making the subSystem assert type(mRig.L_Leg_System)==r9Meta.MetaRigSubSystem assert r9Meta.isMetaNode('L_LegSystem') assert mRig.L_Leg_System.mNode=='L_LegSystem' assert mRig.L_Leg_System.systemType=='Leg' assert mRig.L_Leg_System.mirrorSide==1 #test the Spine wires assert type(mRig.SpineSystem)==r9Meta.MetaRigSubSystem assert mRig.SpineSystem.mNode=='SpineSystem' assert mRig.SpineSystem.systemType=='Spine' assert mRig.SpineSystem.mirrorSide==0 assert mRig.SpineSystem.CTRL_Hips[0]=='|World_Ctrl|COG__Ctrl|Hips_Ctrl' assert mRig.SpineSystem.CTRL_Chest[0]=='|World_Ctrl|COG__Ctrl|Chest_Ctrl' ctrl=r9Meta.MetaClass(mRig.SpineSystem.CTRL_Chest[0]) assert ctrl.mirrorSide==0 #?????? consistency of attrs on node and metaSubsystems!!!!!!! assert ctrl.mirrorIndex==4 #test the MetaRigSupport nodes assert type(mRig.L_ArmSystem.L_ArmSupport)==r9Meta.MetaRigSupport assert mRig.L_ArmSystem.L_ArmSupport.mNode=='L_ArmSupport' assert mRig.L_ArmSystem.L_ArmSupport.SUP_IKHandle[0]=='|World_Ctrl|L_Wrist_Ctrl|ikHandle1' assert mRig.SpineSystem.SpineSupport.SUP_NeckIK[0]=='|World_Ctrl|COG__Ctrl|Chest_Ctrl|Head_grp|Head_Ctrl|ikHandle3' assert mRig.SpineSystem.SpineSupport.SUP_SpineIK[0]=='|World_Ctrl|COG__Ctrl|Chest_Ctrl|ikHandle4'
def _reload(): ''' reload carefully and re-register the RED9_META_REGISTRY ''' Red9.core._reload() reload(cgm_Meta) reload(cgm_PuppetMeta) print('CGM Core Reloaded and META REGISTRY updated') print '=============================================' Red9_Meta.printSubClassRegistry() print '============================================='
def test_getMetaNodes_mInstancesAsClass(self): #mInstances tests passing in Class rather than string nodes=r9Meta.getMetaNodes(dataType=None, mInstances=[r9Meta.MetaRig]) assert nodes==['MetaFacialRig_Test', 'MetaRig_Test'] nodes=r9Meta.getMetaNodes(mInstances=[r9Meta.MetaRig]) assert [n.mNodeID for n in nodes]==['MetaFacialRig_Test', 'MetaRig_Test'] nodes=r9Meta.getMetaNodes(mInstances=[r9Meta.MetaClass]) assert sorted([n.mNode for n in nodes])==['MetaClass_Test', 'MetaFacialRigSupport_Test', 'MetaFacialRig_Test', 'MetaRigSupport_Test', 'MetaRig_Test']
def test_getMetaNodes_mInstances(self): #mInstances tests nodes=r9Meta.getMetaNodes(dataType=None, mInstances=['MetaRig']) assert nodes==['MetaFacialRig_Test', 'MetaRig_Test'] nodes=r9Meta.getMetaNodes(mInstances=['MetaRig']) assert [n.mNodeID for n in nodes]==['MetaFacialRig_Test', 'MetaRig_Test'] nodes=r9Meta.getMetaNodes(mInstances=['MetaClass']) assert sorted([n.mNode for n in nodes])==['MetaClass_Test', 'MetaFacialRigSupport_Test', 'MetaFacialRig_Test', 'MetaRigSupport_Test', 'MetaRig_Test']
def test_getMetaNodes_mAttrs(self): mNodes=r9Meta.getMetaNodes(mAttrs='mirrorSide=1') assert sorted([node.mNodeID for node in mNodes])==['L_Arm_System', 'L_Fingers_System', 'L_Leg_System', 'L_Toes_System', 'L_other_System'] mNodes=r9Meta.getMetaNodes(mAttrs=['mirrorSide=1','systemType=Arm']) assert sorted([node.mNodeID for node in mNodes])==['L_Arm_System'] mNodes=r9Meta.getMetaNodes(mAttrs=['systemType=Leg']) assert sorted([node.mNodeID for node in mNodes])== ['L_Leg_System', 'R_Leg_System']
def pushPoseFromLib(poseUIObj): mFacial = r9Meta.getMetaNodes(mTypes='Red9_MetaFacialCore')[0] posepath = poseUIObj.getPoseDir() poseName = os.path.basename(poseUIObj.getPoseSelected()) print 'posepath', posepath print 'poseName', poseName mFacial.poses_pull_from_library(posepath, poseName)
def getNodesOverload(poseObj, nodes, *args): # NOTE: poseObj already has an attr 'metaRig' which is filled # automatically in the main buildInternalPoseData() call metaNode = poseObj.metaRig currentSelection = cmds.ls(sl=True, l=True) filteredNodes = [] if not issubclass(type(metaNode), r9Meta.MetaHIKControlSetNode): # see if we have a controller selected thats connected to an # appropriate subMetaSystem if not currentSelection: result = cmds.confirmDialog( title='selection hint missing', button=['L_Fingers', 'R_Fingers', 'L_Toes', 'R_Toes', 'Cancel'], message='We need a hint to ID which finger system to load/save the data too,\nIdeally you should select something in the correct limb system that we can use', defaultButton='Cancel', cancelButton='Cancel', icon='information', dismissString='Cancel') if result == 'L_Fingers': msystem = metaNode.L_ArmSystem elif result == 'R_Fingers': msystem = metaNode.R_ArmSystem elif result == 'L_Toes': msystem = metaNode.L_LegSystem elif result == 'R_Toes': msystem = metaNode.R_LegSystem else: msystem = r9Meta.getConnectedMetaNodes(cmds.ls(sl=True))[0] # from selected node, or selected system find our finger / toe subSystem if not msystem.systemType.lower() in ['fingers', 'toes']: fingersystem = msystem.getChildMetaNodes(mAttrs=['systemType']) if fingersystem: fingersystem=fingersystem[0] else: fingersystem = msystem if not fingersystem or not fingersystem.systemType.lower() in ['fingers', 'toes']: raise IOError('no finger / toe metaSubSystems found from the selected node') print '\nFinger : PoseOverload Handler : %s >> subSystem: %s' % (metaNode, fingersystem) filteredNodes = fingersystem.getChildren() # if cmds.getAttr('%s.mirrorSide' % currentSelection[0]) == 1: # print '\nFinger : PoseOverload Handler : %s >> side: Left' % metaNode # filteredNodes = metaNode.L_ArmSystem.L_FingerSystem.getChildren() # elif cmds.getAttr('%s.mirrorSide' % currentSelection[0]) == 2: # print '\nFinger : PoseOverload Handler : %s >> side: Right' % metaNode # filteredNodes = metaNode.R_ArmSystem.R_FingerSystem.getChildren() # modify the actual PoseData object, changing the data to be matched on index # rather than using the standard name or metaMap matching poseObj.metaPose = False poseObj.matchMethod = 'mirrorIndex_ID' poseObj.mirrorInverse = True # set the mirror inverse code to active to cope with mirror differences between Left and Right fingers return filteredNodes
def test_isMetaNode(self): assert r9Meta.isMetaNode('MetaRig_Test') assert r9Meta.isMetaNode('MetaRig_Test', mTypes=['MetaRig']) assert r9Meta.isMetaNode('MetaRig_Test', mTypes='MetaRig') assert not r9Meta.isMetaNode('MetaRig_Test', mTypes='MonkeyBollox') assert not r9Meta.isMetaNode('MetaRig_Test', mTypes='MetaFacialRigSupport_Test') assert r9Meta.isMetaNode('MetaRig_Test', mTypes=[r9Meta.MetaRig]) assert r9Meta.isMetaNode('MetaRig_Test', mTypes=r9Meta.MetaRig) cube1=cmds.ls(cmds.polyCube()[0],l=True)[0] assert not r9Meta.isMetaNode(cube1)
def setup(self): cmds.file(os.path.join(r9Setup.red9ModulePath(),'tests','testFiles','MetaRig_anim_jump.mb'),open=True,f=True) self.mRig = r9Meta.getMetaNodes(mTypes=r9Meta.MetaRig)[0] self.poseFolder = getPoseFolder() #make our PoseData object with the unitTest config loaded filterNode=r9Core.FilterNode_Settings() filterNode.read(red9MetaRigConfig) self.poseData=r9Pose.PoseData(filterNode)
def addAttrToHUD(node, attr): """ adds node.attr to the HUD using Red9_Meta.MetaHUDNode """ currentHUDs = r9Meta.getMetaNodes(mTypes=r9Meta.MetaHUDNode, mAttrs='mNodeID=CBMonitorHUD') if not currentHUDs: metaHUD = r9Meta.MetaHUDNode(name='CBMonitorHUD') else: metaHUD = currentHUDs[0] monitoredAttr = '%s_%s' % (r9Core.nodeNameStrip(node), attr) metaHUD.addMonitoredAttr(monitoredAttr, value=mc.getAttr('%s.%s' % (node, attr)), refresh=False) mc.connectAttr('%s.%s' % (node, attr), '%s.%s' % (metaHUD.mNode, monitoredAttr)) metaHUD.refreshHud()
def test_metaRigHandlers(self): ''' main metaRig handlers in the pose setups ''' self.poseData.metaPose = False assert not self.poseData.metaRig self.poseData.setMetaRig('L_Wrist_Ctrl') assert r9Meta.isMetaNode(self.poseData.metaRig) assert self.poseData.metaPose == True # this is now part of the metaPose property, self.poseData.metaPose = True assert self.poseData.settings.metaRig == True
def test_caching(self): self.assertEquals( self.r9Node1.cached, None, ) self.r9Node1.addAttr('mClass', 'MetaClass') r9Node1Cached = r9Meta.MetaClass(self.r9Node1.mNode) self.assertEquals(self.r9Node1.cached, True) self.assertEquals(self.r9Node1, r9Node1Cached)
def _iterate_(self): self.call2_func = self.test2_func for i in range(self.int_targetCount): self.progressBar_set(status = ("Pass 1: Substantiating Call %i"%i), progress = i, maxValue = self.int_targetCount) #string = mc.joint(n = "obj_{0}".format(i)) string = mc.createNode('network',n = "obj_{0}".format(i)) #string = mc.createNode('transform',n = "obj_{0}".format(i)) t1 = time.clock() n1 = self.test1_func(string) t2 = time.clock() self.l_times_1.append(t2-t1) r9Meta.registerMClassNodeCache(n1) t1 = time.clock() #self.l_roots_2.extend( [self.test2_func(self._toCall)] ) self.call2_func(n1.mNode) t2 = time.clock() self.l_times_2.append(t2-t1)
def release_post_insert(self): #ATTR.set_messagse(_catch, 'tmpMsg', self.l_created[-1]) _loc = self.l_created[-1] _mLoc = r9Meta.MetaClass(_loc) _buffer = _mLoc.cgmLocDat _target = ATTR.get_message(_loc,'meshTarget')[0] _loc = mc.rename(_loc, "{0}_u{1}_v{2}_rayCast_loc".format(coreNames.get_base(_target), "{0:.4f}".format(_buffer['uv'][0]), "{0:.4f}".format(_buffer['uv'][1]), )) self.dropTool()
def test_metaRigHandlers(self): ''' main metaRig handlers in the pose setups ''' self.poseData.metaPose=False assert not self.poseData.metaRig self.poseData.setMetaRig('L_Wrist_Ctrl') assert r9Meta.isMetaNode(self.poseData.metaRig) assert self.poseData.metaPose==False self.poseData.metaPose=True assert self.poseData.settings.metaRig==True
def setup(self): cmds.file(os.path.join(r9Setup.red9ModulePath(), 'tests', 'testFiles', 'MetaRig_anim_jump.mb'), open=True, f=True) self.mRig = r9Meta.getMetaNodes(mTypes=r9Meta.MetaRig)[0] self.poseFolder = getPoseFolder() #make our PoseData object with the unitTest config loaded filterNode = r9Core.FilterNode_Settings() filterNode.read(red9MetaRigConfig) self.poseData = r9Pose.PoseData(filterNode)
def test_isMetaNodeInherited(self): assert r9Meta.isMetaNodeInherited('MetaFacialRig_Test','MetaRig') assert r9Meta.isMetaNodeInherited('MetaFacialRig_Test','MetaClass') assert not r9Meta.isMetaNodeInherited('MetaFacialRig_Test','MetaRigSubSystem') assert r9Meta.isMetaNodeInherited('MetaFacialRig_Test',r9Meta.MetaRig) assert r9Meta.isMetaNodeInherited('MetaFacialRig_Test',r9Meta.MetaClass) assert not r9Meta.isMetaNodeInherited('MetaFacialRig_Test',r9Meta.MetaRigSubSystem)
def test_registerMClassNodeMapping(self): ''' test the registry functions for nodeTypes ''' cmds.file(new=True,f=True) r9Meta.MetaClass(name='standardNetworkMetaNode') assert [cmds.nodeType(n.mNode) for n in r9Meta.getMetaNodes()]==['network'] #register transforms to the NodeTypes r9Meta.registerMClassNodeMapping(nodeTypes='transform') assert r9Meta.getMClassNodeTypes()==['network', 'transform'] new=r9Meta.MetaClass(name='newTransformMetaNode', nodeType='transform') assert [cmds.nodeType(n.mNode) for n in r9Meta.getMetaNodes()]==['network','transform'] #reset the NodeTypes r9Meta.resetMClassNodeTypes() assert r9Meta.getMClassNodeTypes()==['network'] assert [cmds.nodeType(n.mNode) for n in r9Meta.getMetaNodes()]==['network']
def getTimecode_from_node(node): ''' wrapper method to get the timecode back from a given node :param node: node containing correctly formatted timecode data .. note: the node passed in has to have the correctly formatted timecode data to compute ''' import Red9.core.Red9_Meta as r9Meta node = r9Meta.MetaClass(node) if node.hasAttr(Timecode.ref): ms = (getattr(node, Timecode.ref) + ((float(getattr(node, Timecode.count)) / getattr(node,Timecode.samplerate)) * 1000)) return milliseconds_to_Timecode(ms)
def _buildStuff_(self): mi_rootJoint = r9Meta.MetaClass(mc.joint(name='root')) #mc.parent(mi_rootJoint.mNode,world = True) #mi_rootJoint.parent = False self.md_rootToChildren[mi_rootJoint] = [] _last = mi_rootJoint for i in range(self.int_children): self.progressBar_set(status=("Creating obj %i" % i), progress=i, maxValue=self.int_children) mi_child = r9Meta.MetaClass(mc.joint(name=' "child"%i' % i)) self.md_rootToChildren[mi_rootJoint].append(mi_child) #mi_child.parent = _last try: mc.parent(mi_child.mNode, _last.mNode) except: pass mi_child.ty = (i) _last = mi_child #...change for the next self._toCall = self.md_rootToChildren[mi_rootJoint][4] self.mi_rootJoint = mi_rootJoint
def override_clear(target=None, pushToShapes=True): """ Clear override flags on target and shapes if you choose :parameters target(str): What to color - shape or transform with shapes pushToShapes(bool): Push the overrides to shapes of passed transforms :returns info(dict) """ _str_func = "override_clear" if not target: raise ValueError, "|{0}| >> Must have a target".format(_str_func) _shapes = [] mTarget = r9Meta.MetaClass(target, autoFill=False) if mTarget.hasAttr('overrideEnabled'): log.debug("|{0}| >> overrideEnabled on target...".format(_str_func)) _shapes.append(mTarget.mNode) if pushToShapes: _bfr = mc.listRelatives(target, s=True, fullPath=True) if _bfr: _shapes.extend(_bfr) if not _shapes: raise ValueError, "|{0}| >> Not a shape and has no shapes: '{1}'".format( _str_func, target) for i, s in enumerate(_shapes): mShape = r9Meta.MetaClass(s) try: mShape.overrideEnabled = False except Exception, err: log.warning("|{0}| >> target failed: {1} | err: {2}".format( _str_func, s, err))
def _iterate_(self): self.call2_func = self.test2_func for i in range(self.int_targetCount): self.progressBar_set(status=("Pass 1: Substantiating Call %i" % i), progress=i, maxValue=self.int_targetCount) #string = mc.joint(n = "obj_{0}".format(i)) string = mc.createNode('network', n="obj_{0}".format(i)) #string = mc.createNode('transform',n = "obj_{0}".format(i)) t1 = time.clock() n1 = self.test1_func(string) t2 = time.clock() self.l_times_1.append(t2 - t1) r9Meta.registerMClassNodeCache(n1) t1 = time.clock() #self.l_roots_2.extend( [self.test2_func(self._toCall)] ) self.call2_func(n1.mNode) t2 = time.clock() self.l_times_2.append(t2 - t1)
def verify_sceneBlocks(): """ Gather all rig blocks data in scene :parameters: :returns metalist(list) """ _str_func = 'verify_sceneBlocks' for mBlock in r9Meta.getMetaNodes(mTypes='cgmRigBlock', nTypes=['transform', 'network']): mBlock.atUtils('verify_blockAttrs', queryMode=False)
def test_createMetaNode(self): _r9ClassRegistry = r9Meta.getMClassMetaRegistry() _l_mask = [ 'cgmBlendShape', 'cgmBufferNode', 'cgmPuppet', 'cgmDynParentGroup', 'cgmDynamicMatch', #RESOLVE ASAP 'cgmMorpheusPuppet', 'cgmInfoNode2', 'cgmModuleBufferNode', 'cgmTest', 'cgmMasterControl', 'cgmEyeballBlock', 'cgmMouthNoseBlock', 'cgmEyebrowBlock', #...these pass but don't need 'cgmNodeOLD', 'cgmEyelids', 'cgmMouthNose', 'cgmEyebrow', 'cgmSimpleBSFace', 'cgmEyeball', 'cgmObjectOLD' ] #for mType in ['cgmNode','cgmObject','cgmControl','cgmObjectList']: #for mType in _r9ClassRegistry.keys(): #if 'cgm' in mType and mType not in _l_mask: for mType in [ 'cgmNode', 'cgmObject', 'cgmControl', 'cgmObjectSet', 'cgmPuppet', 'cgmModule', 'cgmDynParentGroup', 'cgmDynamicMatch', 'cgmPuppet', 'cgmModule' ]: _t_start = time.clock() try: mObj = cgmMeta.createMetaNode( mType, name='createTest_{0}'.format(mType)) except Exception, err: log.error("{0} failure...".format(mType)) for arg in err.args: log.error(arg) #log.error(cgmGEN._str_subLine) raise Exception, err self.assertEqual(issubclass(type(mObj), _r9ClassRegistry[mType]), True, mObj) mObj.delete() print("[{0}] completed in {1} seconds".format( mType, "%0.3f" % (time.clock() - _t_start)))
def get_from_scene(): """ Gather all rig blocks data in scene :parameters: :returns metalist(list) """ _str_func = 'get_from_scene' _ml_rigBlocks = r9Meta.getMetaNodes(mTypes='cgmRigBlock', nTypes=['transform', 'network']) return _ml_rigBlocks
def test_mClassConversion_cgm(self): _str_grp = mc.group(em=True) n1 = cgmMeta.cgmNode(_str_grp) n1 = r9Meta.convertMClassType(n1, 'cgmControl') self.assertEqual(type(n1), cgmMeta.cgmControl) n1 = cgmMeta.validateObjArg(n1.mNode, 'cgmObject', setClass=True) self.assertEqual(type(n1), cgmMeta.cgmObject) n1 = cgmMeta.validateObjArg(n1.mNode, 'cgmControl', setClass=True) self.assertEqual(type(n1), cgmMeta.cgmControl) n1.delete()
def _bake(cls, binder_file, namespace): rig_name = os.path.splitext( os.path.basename(binder_file))[0].split('_')[0] source_rig = None dest_rig = None meta_nodes = getMetaNodes(mTypes='MsvMetaRig') if meta_nodes: for obj in meta_nodes: # print 'obj rig: %s, rig: %s' % (obj.rigName, rig_name) # if obj.rigName == rig_name: if obj.nameSpaceFull().startswith(namespace): dest_rig = obj else: source_rig = obj source_root = source_rig.get_export_root() binder_rigs = r9Meta.getMetaNodes("MsvAnimationBinderRig") # source root (new rig) name is C_pelvis, Marker # but the dest root (old rig) name is root, marker, etc, so don't use name matching dest_root = [ joint for joint in binder_rigs[0].get_root_joints() if mc.listRelatives(joint, c=True, type='joint') ][0] anim_binder.bind_skeletons(source_root, dest_root) dest_root_node = dest_rig.get_export_root() if mc.nodeType(dest_root_node) == 'reference': # We reference the skeleton into rig file # and the Meta rig node will store the reference node instead of the root joint # ps: the reference node is parent node of root joint joint_nodes = [ node for node in mc.referenceQuery( dest_root_node, nodes=True, dp=True) if mc.nodeType(node) == 'joint' ] joint_node = joint_nodes[0].split('|')[-1] dest_root_node = cls._get_root_parent(joint_node) else: # dest_root_node is u'|Thanator_Rig:main_Grp|Thanator_Rig:output_Grp|Thanator_Rig:C_pelvis' # always to select it's root parent node dest_root_node = dest_root_node.split('|')[1] ctrls = cls._get_bound_ctrls(dest_root_node) anim_binder.bake_binder_data(dest_root_node) return source_rig, dest_rig, ctrls
def removeAttrFromHUD(node, attr): """ remove attrs from the MetaHUD """ currentHUDs = r9Meta.getMetaNodes(mTypes=r9Meta.MetaHUDNode, mAttrs='mNodeID=CBMonitorHUD') if currentHUDs: metaHUD=currentHUDs[0] if attr: metaHUD.killHud() monitoredAttr='%s_%s' % (r9Core.nodeNameStrip(node), attr) print 'removing attr :', attr, monitoredAttr try: metaHUD.removeMonitoredAttr(monitoredAttr) except: pass metaHUD.refreshHud()
def removeAttrFromHUD(node, attr): """ remove attrs from the MetaHUD """ currentHUDs = r9Meta.getMetaNodes(mTypes=r9Meta.MetaHUDNode, mAttrs='mNodeID=CBMonitorHUD') if currentHUDs: metaHUD = currentHUDs[0] if attr: metaHUD.killHud() monitoredAttr = '%s_%s' % (r9Core.nodeNameStrip(node), attr) print 'removing attr :', attr, monitoredAttr try: metaHUD.removeMonitoredAttr(monitoredAttr) except: pass metaHUD.refreshHud()
def speedTest_objectCount(iterations=100, ): """ Test to see how meta reloading affects file new/open """ l_times = [] mc.file(new=True, f=True) t_start = time.clock() _jnt = mc.joint() for i in range(iterations): log.info("On...{0}".format(i)) _jnt = mc.joint() #_jnt = mc.createNode('multiplyDivide') #_jnt = mc.createNode('transform') t1 = time.clock() #r9Meta.MetaClass(name = 'test_{0}'.format(i),nodeType='transform') #import maya.cmds as mc r9Meta.MetaClass(_jnt) #r9Meta.MetaClass(_jnt,autofill='messageOnly') t2 = time.clock() l_times.append(t2 - t1) t_end = time.clock() #for i,t in enumerate(l_times): #log.info("Step {0} | {1}".format(i,"%0.3f"%t)) _str_dif = l_times[-1] - l_times[0] _l_diffs = [] for i in range(len(l_times) - 1): _l_diffs.append(l_times[i + 1] - l_times[i]) _averageDiff = sum(_l_diffs) / len(_l_diffs) _totalTime = t_end - t_start _totalIterTime = (sum(l_times)) log.info( " speedTest_reloadMeta -- {0} | Start -- {1} | End -- {2} | [Diff] -- {3} | AverageIncrease: {4}" .format("%0.3f" % (sum(l_times)), "%0.3f" % l_times[0], "%0.3f" % l_times[-1], "%0.3f" % _str_dif, _averageDiff)) log.info("Time total: {0} | IterTime: {1} | Unaccounted: {2}".format( "%0.3f" % (_totalTime), "%0.3f" % (_totalIterTime), "%0.3f" % (_totalTime - _totalIterTime))) log.info(" Maya: {0} | OS: {1}".format( mel.eval('about -%s' % 'version'), mel.eval('about -%s' % 'operatingSystemVersion')))
def test_longJsonDumps(self): ''' Test the handling of LONG serialized Json data - testing the 16bit string attrTemplate handling NOTE: if you set a string to over 32,767 chars and don't lock the attr once made, selecting the textField in the AttributeEditor will truncate the data, hence this test! ''' data= "x" * 40000 self.MClass.addAttr('json_test', data) assert len(self.MClass.json_test)==40000 #save the file and reload to ensure the attr is consistent cmds.file(rename=os.path.join(r9Setup.red9ModulePath(),'tests','testFiles','deleteMe.ma')) cmds.file(save=True,type='mayaAscii') cmds.file(new=True,f=True) cmds.file(os.path.join(r9Setup.red9ModulePath(),'tests','testFiles','deleteMe.ma'),open=True,f=True) mClass=r9Meta.getMetaNodes()[0] assert len(mClass.json_test)
def get_scene_block_heirarchy(asMeta=True): _str_func = 'get_scene_block_heirarchy' _md_heirachy = {} _ml_rigBlocks = r9Meta.getMetaNodes(mTypes='cgmRigBlock', nTypes=['transform', 'network']) for mBlock in _ml_rigBlocks: #...find our roots if not mBlock.p_blockParent: log.debug("|{0}| >> Root: {1}".format(_str_func, mBlock.mNode)) if asMeta: k = mBlock else: k = mBlock.mNode _md_heirachy[k] = mBlock.getBlockHeirarchyBelow(asMeta=asMeta) #cgmGEN.walk_dat(_md_heirachy, _str_func) return _md_heirachy
def addAttrToHUD(node, attr): """ adds node.attr to the HUD using Red9_Meta.MetaHUDNode """ currentHUDs = r9Meta.getMetaNodes(mTypes=r9Meta.MetaHUDNode, mAttrs='mNodeID=CBMonitorHUD') if not currentHUDs: metaHUD = r9Meta.MetaHUDNode(name='CBMonitorHUD') else: metaHUD = currentHUDs[0] monitoredAttr='%s_%s' % (r9Core.nodeNameStrip(node), attr) metaHUD.addMonitoredAttr(monitoredAttr, value=mc.getAttr('%s.%s' % (node, attr)), refresh=False) mc.connectAttr('%s.%s' % (node, attr), '%s.%s' % (metaHUD.mNode, monitoredAttr)) metaHUD.refreshHud()
def test_connectionsTo_MayaNodes_Basic(self): ''' Test how the code handles connections to standard MayaNodes ''' cube1=cmds.ls(cmds.polyCube()[0],l=True)[0] cube2=cmds.ls(cmds.polyCube()[0],l=True)[0] cube3=cmds.ls(cmds.polyCube()[0],l=True)[0] cube4=cmds.ls(cmds.polyCube()[0],l=True)[0] #add singular Child self.MClass.connectChild(cube1,'Singluar') assert self.MClass.Singluar==[cube1] #add multiple Children self.MClass.connectChildren([cube2,cube3],'Multiple') assert sorted(self.MClass.Multiple)==[cube2,cube3] #get the MetaNode back from the cube1 connection and retest found=r9Meta.getConnectedMetaNodes(cube1)[0] assert isinstance(found,r9Meta.MetaClass) assert found.mNode=='MetaClass_Test' assert found.mClass=='MetaClass' assert sorted(found.Multiple)==[cube2,cube3] #connect something else to Singluar - cleanCurrent=True by default so unhook cube1 self.MClass.connectChild(cube2,'Singluar') assert self.MClass.Singluar==[cube2] assert not cmds.attributeQuery('MetaClassTest',node=cube1,exists=True) #cleaned up after ourselves? self.MClass.connectChildren([cube3,cube4],'Singluar') assert sorted(self.MClass.Singluar)==[cube2,cube3,cube4] #setAttr has cleanCurrent and force set to true so remove all current connections to this attr self.MClass.Singluar=cube1 assert self.MClass.Singluar==[cube1] try: #still thinking about this....if the attr isn't a multi then #the __setattr__ will fail if you pass in a lots of nodes self.MClass.Singluar=[cube1,cube2,cube3] except: assert True self.MClass.Multiple=[cube1,cube4] assert sorted(self.MClass.Multiple)==[cube1,cube4]
def jointStuff_meta(): ml_joints = cgmMeta.validateObjListArg( mc.ls(sl=1), mayaType='joint' ) #...gets us a validated meta data list of our selection for i, mJnt in enumerate(ml_joints): mJnt.rename("ourChain_{0}_jnt".format(i)) mi_crv = r9Meta.MetaClass(mc.circle(normal=[1, 0, 0], ch=0)[0]) mc.parent(mi_crv.mNode, mJnt.mNode) mi_crv.rename('{0}_crv'.format( mJnt.p_nameBase)) #...p_nameBase property cgmMeta only mc.delete( mc.parentConstraint(mJnt.mNode, mi_crv.mNode, maintainOffset=False)) #...loc mJnt.doLoc() #..doLoc cgmMeta only #...same data storage mJnt.connectChildNode(mi_crv, 'curveObject', 'targetJoint')
def _iterate_(self): self.call2_func = self.test2_func mObj = r9Meta.MetaClass(name="obj", nodeType='transform') for i in range(self.int_targetCount): self.progressBar_set(status=("Pass 1: Substantiating Call %i" % i), progress=i, maxValue=self.int_targetCount) mObj.addAttr('test_{0}'.format(i), attrType='string') t1 = time.clock() n1 = self.test1_func(mObj) t2 = time.clock() self.l_times_1.append(t2 - t1) t1 = time.clock() #self.l_roots_2.extend( [self.test2_func(self._toCall)] ) self.call2_func(mObj) t2 = time.clock() self.l_times_2.append(t2 - t1)
def get_scene_module_heirarchy(asMeta=True): _str_func = 'get_scene_module_heirarchy' _md_heirachy = {} _ml_puppets = r9Meta.getMetaNodes(mTypes=['cgmRigPuppet'], nTypes=['transform', 'network']) for mPuppet in _ml_puppets: #...find our roots if asMeta: k = mPuppet else: k = mPuppet.mNode ml_initialModules = mPuppet.UTILS.modules_get(mPuppet) if not ml_initialModules: _md_heirachy[k] = {} else: _md_heirachy[k] = get_puppet_heirarchy_context( ml_initialModules[0], 'root', asList=False, report=False) #cgmGEN.walk_dat(_md_heirachy, _str_func) return _md_heirachy
def getNodesOverload(poseObj, nodes, *args): # NOTE: poseObj already has an attr 'metaRig' which is filled # automatically in the main buildInternalPoseData() call metaNode = poseObj.metaRig currentSelection = cmds.ls(sl=True, l=True) filteredNodes = [] if not issubclass(type(metaNode), r9Meta.MetaHIKControlSetNode): # see if we have a controller selected thats connected to an # appropriate subMetaSystem if not currentSelection: result = cmds.confirmDialog( title='selection hint missing', button=[ 'L_Fingers', 'R_Fingers', 'L_Toes', 'R_Toes', 'Cancel' ], message= 'We need a hint to ID which finger system to load/save the data too,\nIdeally you should select something in the correct limb system that we can use', defaultButton='Cancel', cancelButton='Cancel', icon='information', dismissString='Cancel') if result == 'L_Fingers': msystem = metaNode.L_ArmSystem elif result == 'R_Fingers': msystem = metaNode.R_ArmSystem elif result == 'L_Toes': msystem = metaNode.R_LegSystem elif result == 'R_Toes': msystem = metaNode.R_LegSystem else: msystem = r9Meta.getConnectedMetaNodes(cmds.ls(sl=True))[0] # from selected node, or selected system find our finger / toe subSystem if not msystem.systemType.lower() in ['fingers', 'toes']: fingersystem = msystem.getChildMetaNodes(mAttrs=['systemType']) if fingersystem: fingersystem = fingersystem[0] else: fingersystem = msystem if not fingersystem or not fingersystem.systemType.lower() in [ 'fingers', 'toes' ]: raise IOError( 'no finger / toe metaSubSystems found from the selected node') print '\nFinger : PoseOverload Handler : %s >> subSystem: %s' % ( metaNode, fingersystem) filteredNodes = fingersystem.getChildren() # if cmds.getAttr('%s.mirrorSide' % currentSelection[0]) == 1: # print '\nFinger : PoseOverload Handler : %s >> side: Left' % metaNode # filteredNodes = metaNode.L_ArmSystem.L_FingerSystem.getChildren() # elif cmds.getAttr('%s.mirrorSide' % currentSelection[0]) == 2: # print '\nFinger : PoseOverload Handler : %s >> side: Right' % metaNode # filteredNodes = metaNode.R_ArmSystem.R_FingerSystem.getChildren() # modify the actual PoseData object, changing the data to be matched on index # rather than using the standard name or metaMap matching poseObj.metaPose = False poseObj.matchMethod = 'mirrorIndex_ID' poseObj.mirrorInverse = True # set the mirror inverse code to active to cope with mirror differences between Left and Right fingers return filteredNodes
import Red9.core.Red9_Meta as r9Meta import maya.cmds as cmds #reload(r9Meta) ''' #################################################################### # METHOD 1: ADDING CONTROLS : using the mRig Presets #################################################################### Easy method, these basic types are defined for speed, but really the method below is the one for more experienced people as it's completely expandable and flexible. Saying that if you want these presets expanding just let me know. They certainly stop you having to mess with the mirrorData! ''' #make the base MRig mRig = r9Meta.MetaRig(name='MORPHEUS') #Left / Right Pairs mRig.addFootCtrl('morpheusRig_v01_00:m_leg_IKleg_Cntrl_l_anim', 'Left') mRig.addFootCtrl('morpheusRig_v01_00:m_leg_IKleg_Cntrl_r_anim', 'Right') mRig.addKneeCtrl('morpheusRig_v01_00:m_leg_PV_Cntrl_l_anim', 'Left') mRig.addKneeCtrl('morpheusRig_v01_00:m_leg_PV_Cntrl_r_anim', 'Right') #note here we're supplying axis that determine which axis are managed in the mirror code #without these the default axis set is used and inverted during mirror mRig.addWristCtrl('morpheusRig_v01_00:m_arm_IK_Cntrl_l_anim', 'Left', axis='translateX,translateY,translateZ') mRig.addWristCtrl('morpheusRig_v01_00:m_arm_IK_Cntrl_r_anim', 'Right', axis='translateX,translateY,translateZ') mRig.addElbowCtrl('morpheusRig_v01_00:m_arm_PV_Cntrl_l_anim', 'Left')
from cgm.core import cgm_PuppetMeta as cgmPM import Red9.core.Red9_Meta as r9Meta from cgm.core.classes import SnapFactory as Snap reload(Snap) from cgm.core.rigger import ModuleControlFactory as mControlFactory reload(mControlFactory) from cgm.lib import search obj = mc.ls(sl=True)[0] or False obj = '' objList = [] #>>> Modules #======================================================= m1 = cgmPM.cgmModule(name='test') m1 = r9Meta.MetaClass('spine_part') m1.setState('skeleton') m1.getPartNameBase() m1.modulePuppet.getGeo() mObj = cgmMeta.cgmObject(control) i_loc = mObj.doLoc() i_loc.rx = i_loc.rx + 90 mObj.doCopyTransform(i_loc.mNode) mObj.mNode mObj.getAttr('asdfasdf') #>>> Testing control registering control = 'cog_controlCurve' mControlFactory.registerControl(mc.ls(sl=True)[0]) mControlFactory.registerControl(control) for i in range(2):
def refreshHUD(): r9Meta.monitorHUDManagement('refreshHeadsUp')
log.debug("|{0}| >> trying shape | {1}".format(_str_func,attr)) try: if ATTR.has_attr(self.mShape.mNode,attr): log.debug("|{0}| >> trying shape | {1}".format(_str_func,attr)) return r9Meta.MetaClass.__getattribute__(self.mShape,attr, value, force=True, **kws) except Exception,err: log.debug("|{0}| >> shape attempt err: {1}".format(_str_func,err)) return r9Meta.MetaClass.__setattr__(self,attr, value, force=True, **kws) try: _str_func = 'cgmLight.__setattr__' log.debug("|{0}| >> trying dag | {1}".format(_str_func,attr)) r9Meta.MetaClass.__setattr__(self,attr, value, force=True, **kws) except Exception,err: try: log.debug("|{0}| >> trying shape | {1}".format(_str_func,attr)) r9Meta.MetaClass.__getattribute__(self.mShape,attr, value, force=True, **kws) except Exception,err: pass #finally: # log.debug("|{0}| >> err: {1}".format(_str_func,err)) # return #========================================================================= # R9 Stuff - We force the update on the Red9 internal registry #========================================================================= r9Meta.registerMClassInheritanceMapping()#Pushes our classes in
def setup(self): cmds.file(os.path.join(r9Setup.red9ModulePath(), 'tests', 'testFiles', 'MetaRig_anim_jump.mb'), open=True, f=True) self.mRig = r9Meta.getMetaNodes(mTypes=r9Meta.MetaRig)[0] self.poseFolder = getPoseFolder()
''' #Find the Jaw controller from the mRig mRig.Facial.FACE_Jaw #Get all controllers wired to the MetaRigNode #NOTE this currently has no walk function so will only return direct wired controllers #so in this example from the mRig it will not return the Facial Controllers mRig.getRigCtrls() #or facial controllers mRig.Facial.getRigCtrls() #finally to get the mRig node back from any of the Controllers #Note that this command has source,destination args to clamp #the direction of the search r9Meta.getConnectedMetaNodes(cmds.ls(sl=True))[0] ''' ############################################################################## # CONCLUSION : why is this good??? ############################################################################## So you now have a basically setup MetaRig. If you open the AnimationUI and go to the Hierarchy Tab switch the MetaRig checkbox on, this will switch all the back-end code to filter for the MetaNode systems. The hierarchy filters for most of the setups still require you to select a node to act on, in case you have multiple characters in the scene, but as long as its a member of the mRig then hierarchy functions will all work on the mRig as root.
def test_getMetaNodes_mAttrs(self): assert r9Meta.getMetaNodes(mAttrs='version=1')[0].mNodeID=='MetaRig_Test'
def setup(self): cmds.file(os.path.join(r9Setup.red9ModulePath(),'tests','testFiles','MetaRig_anim_jump.mb'),open=True,f=True) self.mRig = r9Meta.getMetaNodes(mTypes=r9Meta.MetaRig)[0] self.poseFolder = getPoseFolder()
mLambert.diffuse #>>0.5 mLambert.color #>>(0.5, 0.5, 0.5) mLambert.color=(1,0.2,0.2) #sets the compound float3 attr mLambert.diffuse=0.7 #sets the diffuse directly mLambert.diffuse #>>0.7 ''' General =============================================================== Generic call to find all mClass nodes in the scene. This also takes a type argument so you can return only nodes of a given class type NOTE: 'type' the given class type must exist as a key in the RED9_META_REGISTRY ''' mClass = r9Meta.getMetaNodes() mClass = r9Meta.getMetaNodes(dataType='mClass',mTypes='MetaRig') #Return only MetaRig class objects. If the dataType isn't 'mClass' then we #return the standard MayaNodes, else we return the mClass initialized to the class object #Connect the selected Maya Nodes to the mClass node under a Multi-Message attr 'mirrorLeft' node.connectChildren(cmds.ls(sl=True),'mirrorLeft') node.mirrorLeft #will now return all connected nodes to the message attr #Connect the selected Maya Node to the mClass node under a NON Multi-Message attr 'simpleChild' #this is what most of the MRig calls use as a single connection describes a single MayaNode node.connectChild(cmds.ls(sl=True)[0],'simpleChild') node.simpleChild #will now return all connected nodes to the message attr r9Meta.getConnectedMetaNodes(nodes, source=True, destination=True, dataType='mClass')
def __bindData__(self): self.addAttr('myRigType','') self.addAttr('myFloat', attrType='float', min=0, max=5) self.addAttr('myEnum', enumName='A:B:D:E:F', attrType='enum') def getChildren(self, walk=False, mAttrs=None, cAttrs=None): ''' overload call for getChildren ''' pass def getSkeletonRoots(self): ''' get the Skeleton Root, used in the poseSaver. By default this looks for a message link via the attr "exportSkeletonRoot" to the skeletons root jnt always returns a list! ''' pass def getNodeConnectionMetaDataMap(self, node, mTypes=[]): pass #======================================================================== # This HAS to be at the END of this module so that the RED9_META_REGISTRY # picks up all inherited subclasses when Red9.core is imported #======================================================================== r9Meta.registerMClassInheritanceMapping() #r9Meta.registerMClassNodeMapping(nodes='myNewNodeType')
def getAndMove(loc, targets=None, mode=None, forceBBCenter=False): log.debug("|{0}| >> mode: {1} | targets: {2}".format( _str_func, mode, targets)) if not targets: raise ValueError, "Must have targets" _kws = {'target': loc, 'move': True, 'rotate': True} if mode == 'fromTarget': _d = POS.get_info(targets[0]) _kws['infoDict'] = _d elif mode == 'midPoint': if len(targets) == 1: _d = POS.get_info(targets[0], boundingBox=True) _kws['infoDict'] = _d elif not len(targets) >= 2: raise ValueError, "midPoint mode must have at least two targets" else: _d = get_midPointDict(targets, forceBBCenter) _kws['infoDict'] = _d elif mode == 'closestPoint': if not len(targets) >= 2: raise ValueError, "midPoint mode must have at least two targets" _d = { 'position': DIST.get_by_dist(targets[0], targets[1:], resMode='pointOnSurface') } _kws['infoDict'] = _d _kws['rotate'] = False elif mode == 'closestTarget': if not len(targets) >= 3: raise ValueError, "midPoint mode must have at least three targets" _d = POS.get_info( DIST.get_by_dist(targets[0], targets[1:], resMode='object')) _d['rotateOrder'] = False _d['rotateAxis'] = False _kws['infoDict'] = _d elif mode == 'rayCast': _dbuffer = r9Meta.MetaClass(_loc).cgmLocDat _d = {} _p = POS.get_uv_position(_target[0], _dbuffer['uv']) if _dbuffer.get('offsetDist'): _v = POS.get_uv_normal(_target[0], _dbuffer['uv']) _dist = _dbuffer.get('offsetDist') _p = DIST.get_pos_by_vec_dist(_p, _v, _dist) _d['position'] = _p _kws['infoDict'] = _d _kws['rotate'] = False else: log.error("|{0}| >> unknown mode: {1}".format(_str_func, _mode)) return False try: return position(**_kws) except Exception, err: log.error("|{0}| >> loc: {1}".format(_str_func, loc)) cgmGeneral.log_info_dict(_kws['infoDict'], "{0} >> {1}".format(_str_func, mode)) log.error("|{0}| >> err: {1}".format(_str_func, _err)) return False
def create(target=None, position=None, tag=True, setMatchTarget=True, pivot='rp', mode='fromTarget', name=None): """ Return the short name of an object :parameters :target(str): What to create a loc from :tag(bool): Whether to tag for updating or special naming :pivot: Whether to force it to be created at the rotatePivot, scalePivot or BoundingBox center :mode fromTarget -- can be component or transform midPoint -- mid point of specfied targets closestPointOnTarget -- closest point from source to targets closestTarget -- closest target from source rayCast -- create a rayCast locator. For more options, see LOCINATOR attachPoint -- Create a rayCast follicle, and parent your loc to that. :setMatchTarget :returns short name(str) """ _str_func = "create" try: if mode == 'rayCast': #_catch = mc.group(em=True) class rayCastLoc(cgmDrag.clickMesh): def release_post_insert(self): #ATTR.set_messagse(_catch, 'tmpMsg', self.l_created[-1]) _loc = self.l_created[-1] _mLoc = r9Meta.MetaClass(_loc) _buffer = _mLoc.cgmLocDat _target = ATTR.get_message(_loc, 'meshTarget')[0] _loc = mc.rename( _loc, "{0}_u{1}_v{2}_rayCast_loc".format( coreNames.get_base(_target), "{0:.4f}".format(_buffer['uv'][0]), "{0:.4f}".format(_buffer['uv'][1]), )) self.dropTool() rayCastLoc(create='locator') #_res = ATTR.get_message(_catch,'tmpMsg')[0] return True _loc = mc.spaceLocator()[0] if position: mc.move(position[0], position[1], position[2], _loc, ws=True) if name: return mc.rename(_loc, name) return mc.rename("pos_loc") if not target: if name: return mc.rename(_loc, name) return mc.rename(_loc, "world_center_loc") _targets = VALID.objStringList(target, noneValid=False, calledFrom=__name__ + _str_func + ">> validate target") #_targets = VALID.listArg(target) if tag or mode: _mi_loc = r9Meta.MetaClass(_loc) if not _mi_loc.hasAttr('cgmLocDat'): _mi_loc.addAttr('cgmLocDat', attrType='string') log.debug("|{0}| >> {1} mode...".format(_str_func, mode)) if mode in ['fromTarget', 'attachPoint']: if len(_targets) != 1: log.warning("|{0}| >> mode: {1} | targets: {2} | ".format( _str_func, mode, _targets)) raise ValueError, "May only have one target for mode: {0} | targets: {1}".format( mode, _targets) _target = _targets[0] if name: _loc = mc.rename(_loc, name) else: _loc = mc.rename( _loc, "{0}_fromTarget_loc".format(coreNames.get_base(_target))) if tag: #store info ATTR.store_info(_loc, 'cgmName', coreNames.get_base(_target), attrType='string', lock=True) ATTR.store_info(_loc, 'cgmLocMode', 'fromTarget', lock=True) ATTR.set_message(_loc, 'cgmLocSource', _target, 'cgmLocDat') if not VALID.is_component(_target) and setMatchTarget: SNAP.matchTarget_set(_target, _loc) #_d = r9Meta.MetaClass(_loc).cgmLocDat _res = update(_loc) _res = update(_loc, _target, 'fromTarget') if mode == 'attachPoint': class follicleAttach(cgmDrag.clickMesh): def release_post_insert(self): _str_funcName = 'follicleAttach.release' """if not self.b_dragStoreMode:#If not on drag, do it here. Otherwise do it on update if self._posBuffer: self.l_return.extend(self._posBuffer) if self._posBufferRaw: self.l_returnRaw.extend(self._posBufferRaw) else: self.l_returnRaw.extend(self._posBuffer) if self._createModeBuffer: self.l_created.extend(self._createModeBuffer)""" for pos in self.l_returnRaw: log.debug("|{0}|...pos {1}".format( _str_funcName, pos)) for i, m in enumerate(self.d_meshPos.keys()): log.debug("|{0}|...mesh: {1}".format( _str_funcName, m)) for i2, h in enumerate(self.d_meshPos[m]): if h == pos: log.debug("Found follicle match!") try: _set = [ m, self.d_meshUV[m][i2], "{0}_u{1}_v{2}".format( coreNames.get_short(m), "{0:.4f}".format( self.d_meshUV[m][i2] [0]), "{0:.4f}".format( self.d_meshUV[m] [i2][1])) ] self._l_folliclesToMake.append( _set) log.debug("|{0}|...uv {1}".format( _str_funcName, _set)) except Exception, err: log.error( "|{0}| >> Failed to query uv for hit {2} on shape {2} | err:{1}" .format( _str_funcName, err, pos, m)) if self._l_folliclesToMake: for f_dat in self._l_folliclesToMake: _follicle = NODES.add_follicle( f_dat[0], f_dat[2]) log.debug( "|finalize| >> Follicle created: {0}". format(_follicle)) ATTR.set(_follicle[0], 'parameterU', f_dat[1][0]) ATTR.set(_follicle[0], 'parameterV', f_dat[1][1]) mc.parent(_loc, _follicle[0]) mc.delete(self.l_created) self.dropTool() follicleAttach() return _loc elif not _targets: raise ValueError, "Must have targets for mode: {0} | targets: {1}".format( mode, _targets)
def test_getMetaNodes(self): nodes=sorted(r9Meta.getMetaNodes(),key=lambda x: x.mClass.upper()) assert [n.mClass for n in nodes]==['MetaClass','MetaFacialRig','MetaFacialRigSupport','MetaRig','MetaRigSupport']
#=============================================================== # Basic MetaClass Use: #=============================================================== import Red9.core.Red9_Meta as r9Meta import maya.cmds as cmds reload(r9Meta) #make a new blank mClass MayaNode node = r9Meta.MetaClass() node.select() ''' If a Maya node is passed in and it has the mClass attribute of a class thats known then the following call with return the correct class object. NOTE: there's a global RED9_META_REGISTERY which holds registered mClasses found at start using itersubclasses, called in the r9Meta.registerMClassInheritanceMapping() ''' new = r9Meta.MetaClass(cmds.ls(sl=True)[0]) type(new) #// <class 'Red9_Meta.MetaClass'> ''' Attribute Handling =============================================================== Attribute management for the node. If no type flag is passed in then the code automatically figures what attrType to add from the given value. Note that the attribute is serialized to the Maya Node AND the class object. All attributes are managed ''' #standard attribute handling node.addAttr('stringTest', "this_is_a_string") #create a string attribute
def setup(self): cmds.file(os.path.join(r9Setup.red9ModulePath(),'tests','testFiles','Meta_Network_WalkTest.ma'),open=True,f=True) self.mRig=r9Meta.getMetaNodes(mTypes='MetaRig')[0]
def deleteHUD(): r9Meta.monitorHUDManagement('delete')
def test_getParentSystems(self): assert r9Meta.getConnectedMetaSystemRoot('L_Fingers_System').mNode=='MetaRig' assert r9Meta.getConnectedMetaSystemRoot('L_Toes_System').mNode=='MetaRig' assert self.mRig.C_Spine_System.L_Arm_System.getParentMetaNode().mNodeID=='C_Spine_System' assert self.mRig.C_Spine_System.L_Arm_System.L_Arm_Support.getParentMetaNode().mNodeID=='L_Arm_System'
import cgm.core cgm.core._reload() from cgm.core import cgm_Meta as cgmMeta from cgm.core import cgm_PuppetMeta as cgmPM import Red9.core.Red9_Meta as r9Meta from cgm.core.rigger import RigFactory as Rig #====================================================================== issubclass(type(i_rig._i_masterControl), cgmMeta.cgmObject) cgmMeta.validateObjArg(i_rig._i_masterControl.mNode, cgmMeta.cgmObject) cgmMeta.log.setLevel(cgmMeta.logging.INFO) cgmMeta.log.setLevel(cgmMeta.logging.DEBUG) jFactory.log.setLevel(jFactory.logging.DEBUG) m1 = r9Meta.MetaClass('l_clav_part') m1 = r9Meta.MetaClass('r_clav_part') m1 = r9Meta.MetaClass('l_arm_part') m1 = r9Meta.MetaClass('r_arm_part') m1.rigDelete() m1.doRig() m1 = r9Meta.MetaClass('l_arm_part') Rig.get_report(m1) m1.rigNull.blendJoints m1.rigConnect() m1.isRigged() m1.rigDelete() m1.rigNull.moduleJoints i_rig = Rig.go(m1, forceNew=False, autoBuild=False) #call to do general rig m1.setState('skeleton', forceNew=True) m1.getState() m1.modulePuppet.getModuleFromDict({'moduleType': 'thumb'}) m1.modulePuppet.getModuleFromDict(moduleType=['torso', 'spine']) m1.modulePuppet.getModuleFromDict(checkDict={'moduleType': 'head'})
def process_blocks_rig(f=None, blocks=None, postProcesses=1, **kws): _str_func = 'process_blocks_rig' #cgmGEN.log_start(_str_func) mFile = PATHS.Path(f) if not mFile.exists(): raise ValueError, "Invalid file: {0}".format(f) _path = mFile.asFriendly() log.info("Good Path: {0}".format(_path)) """ if 'template' in _path: _newPath = _path.replace('template','build') else:""" _name = mFile.name() _d = mFile.up().asFriendly() log.debug(cgmGEN.logString_msg(_str_func, _name)) _newPath = os.path.join(_d, _name + '_BUILD.{0}'.format(mFile.getExtension())) log.info("New Path: {0}".format(_newPath)) #cgmGEN.logString_msg(_str_func,'File Open...') mc.file(_path, open=1, f=1) #cgmGEN.logString_msg(_str_func,'Process...') T1 = time.time() get_time = cgmGEN.get_timeString try: if not blocks: #cgmGEN.logString_sub(_str_func,'No blocks arg') ml_masters = r9Meta.getMetaNodes(mTypes='cgmRigBlock', nTypes=['transform', 'network'], mAttrs='blockType=master') for mMaster in ml_masters: #cgmGEN.logString_sub(_str_func,mMaster) RIGBLOCKS.contextual_rigBlock_method_call(mMaster, 'below', 'atUtils', 'changeState', 'rig', forceNew=False) ml_context = BLOCKGEN.get_rigBlock_heirarchy_context( mMaster, 'below', True, False) l_fails = [] for mSubBlock in ml_context: _state = mSubBlock.getState(False) if _state != 4: l_fails.append(mSubBlock) if l_fails: log.info('The following failed...') pprint.pprint(l_fails) raise ValueError, "Modules failed to rig: {0}".format( l_fails) log.info("Begin Rig Prep cleanup...") ''' Begin Rig Prep process ''' mPuppet = mMaster.moduleTarget #...when mBlock is your masterBlock #str(datetime.timedelta(seconds=v)) if postProcesses: l_timeReports = [] if kws.get('mirrorVerify', 1): print(cgmGEN._str_hardBreak) log.info('mirror_verify...') t1 = time.clock() mPuppet.atUtils('mirror_verify', 1) t2 = time.clock() l_timeReports.append( ['mirrorVerify', get_time(t2 - t1)]) if kws.get('gatherSpaceDrivers', 1): log.info('collect worldSpace...') t1 = time.clock() mPuppet.atUtils('collect_worldSpaceObjects') t2 = time.clock() l_timeReports.append( ['gatherSpaceDrivers', get_time(t2 - t1)]) if kws.get('qss', 1): print(cgmGEN._str_hardBreak) log.info('qss...') t1 = time.clock() mPuppet.atUtils('qss_verify', puppetSet=1, bakeSet=1, deleteSet=1, exportSet=1) t2 = time.clock() l_timeReports.append(['qss', get_time(t2 - t1)]) if kws.get('deleteUnusedShaders'): print(cgmGEN._str_hardBreak) log.info('Delete unused shaders...') t1 = time.clock() MRSPOST.shaders_getUnused(delete=True) t2 = time.clock() l_timeReports.append( ['deleteUnusedShaders', get_time(t2 - t1)]) if kws.get('deleteCGMLightGroup'): print(cgmGEN._str_hardBreak) log.info('Delete cgm shaders...') t1 = time.clock() try: mc.delete('cgmLightGroup') except: pass t2 = time.clock() l_timeReports.append( ['deleteUnusedShaders', get_time(t2 - t1)]) if kws.get('proxyMesh', 1): print(cgmGEN._str_hardBreak) log.info('proxyMesh...') t1 = time.clock() mPuppet.atUtils('proxyMesh_verify', 1) t2 = time.clock() l_timeReports.append(['proxyMesh', get_time(t2 - t1)]) if kws.get('puppetMesh', 1): print(cgmGEN._str_hardBreak) log.info('puppetMesh...') t1 = time.clock() mPuppet.atUtils('puppetMesh_create', **{ 'unified': True, 'skin': True }) t2 = time.clock() l_timeReports.append(['puppetMesh', get_time(t2 - t1)]) if kws.get('hideVisSub', 1): print(cgmGEN._str_hardBreak) log.info('hideVisSub...') t1 = time.clock() for i, mSubBlock in enumerate(ml_context): if not i: continue try: mSubBlock.moduleTarget.rigNull.settings.visSub = 0 except Exception, err: log.error(mSubBlock) log.error(err) t2 = time.clock() l_timeReports.append(['hideVisSub', get_time(t2 - t1)]) if kws.get('hideJointAxis'): print(cgmGEN._str_hardBreak) log.info('Hide axis on all joints...') t1 = time.clock() for mObj in cgmMeta.asMeta(mc.ls(type='joint')): mObj.displayLocalAxis = 0 t2 = time.clock() l_timeReports.append( ['hideJointAxis', get_time(t2 - t1)]) if kws.get('removeRefs'): print(cgmGEN._str_hardBreak) log.info('Remove Refs...') t1 = time.clock() MRSPOST.refs_remove() t2 = time.clock() l_timeReports.append(['removeRefs', get_time(t2 - t1)]) if kws.get('ihi', 1): print(cgmGEN._str_hardBreak) log.info('ihi...') t1 = time.clock() mPuppet.atUtils('rigNodes_setAttr', 'ihi', 0) t2 = time.clock() l_timeReports.append(['ihi', get_time(t2 - t1)]) if kws.get('connectRig', 1): print(cgmGEN._str_hardBreak) log.info('rig connect...') t1 = time.clock() mPuppet.atUtils('rig_connectAll') t2 = time.clock() l_timeReports.append(['connectRig', get_time(t2 - t1)]) log.info('...') if kws.get('controllerVerify', 1): print(cgmGEN._str_hardBreak) if cgmGEN.__mayaVersion__ >= 2018: log.info('controller_verify...') t1 = time.clock() mPuppet.atUtils('controller_verify') log.info('...') t2 = time.clock() l_timeReports.append( ['controllerVerify', get_time(t2 - t1)]) if kws.get('blocksGather', 1): print(cgmGEN._str_hardBreak) t1 = time.clock() mGrp = BUILDERUTILS.gather_rigBlocks() if kws.get('blocksParent', 1): mGrp.p_parent = mPuppet mGrp.v = False t2 = time.clock() l_timeReports.append( ['blocksGather', get_time(t2 - t1)]) if kws.get('worldGather'): print(cgmGEN._str_hardBreak) log.info('Gathering world dags...') t1 = time.clock() MRSPOST.gather_worldStuff() t2 = time.clock() l_timeReports.append( ['worldGather', get_time(t2 - t1)]) if kws.get('deleteUnusedLayers'): print(cgmGEN._str_hardBreak) log.info('Deleting Unused Layers...') t1 = time.clock() MRSPOST.layers_getUnused(delete=True) t2 = time.clock() l_timeReports.append( ['deleteUnusedLayers', get_time(t2 - t1)]) print(cgmGEN._str_hardBreak) print(cgmGEN.logString_sub("Batch", 'Times')) for i, pair_time in enumerate(l_timeReports): print(" {0} | ['{1}'] | {2} ".format( i, pair_time[0], pair_time[1])) except Exception, err: log.error(err)