コード例 #1
0
ファイル: utils.py プロジェクト: AntonyThomasCGI/rigbot
def resetBindPose(jnts, selected_only=False):
    """
	Resets the bind pose as if the skin was bound to the skeleton as it exists now it world space.

	:param jnts: `List` of joints to be reset. Use in conjunction with selected flag to get hierarchy.

	:param selected_only: By default will include all children of given jnts unless this is set to True.

	:return: None
	"""
    jnts = makePyNodeList(jnts)

    jnts_to_reset = set()
    if selected_only:
        jnts_to_reset |= set(jnts)
    else:
        for jnt in jnts:
            children = jnt.getChildren(ad=True, type='joint')
            jnts_to_reset |= set(children)

    pm.dagPose(jnts_to_reset, bindPose=True, reset=True)

    for jnt in jnts_to_reset:
        inv_world_mtx = jnt.worldInverseMatrix[0].get()

        skin_outputs = jnt.worldMatrix[0].outputs(p=True, type='skinCluster')
        for skin in skin_outputs:
            joint_index = skin.index()

            pre_mtx_attr = skin.node().attr('bindPreMatrix')

            jnt_pre_mtx = pre_mtx_attr.elementByLogicalIndex(joint_index)
            jnt_pre_mtx.set(inv_world_mtx)
コード例 #2
0
def bindPose(model):
    nameSpace = getNamespace(model.name())
    if nameSpace:
        dagPoseName = nameSpace + ':dagPose1'
    else:
        dagPoseName = 'dagPose1'
    pm.dagPose(dagPoseName, restore=True)
コード例 #3
0
def updateBindPose():
    """
    Updates bind pose to the selected joint hierarchies current state
    """

    dag = pmc.dagPose(q=True, bindPose=True)
    objects = pmc.dagPose(dag, q=True, members=True)
    for obj in objects:
        pmc.dagPose(obj, reset=True, name=dag[0])
コード例 #4
0
 def test_multiple_bind_poses_on_skel(self):
     test_cube, test_joints, test_skincluster = self.create_skinned_cube()
     expected = pm.ls(type='dagPose')[0]
     dummy_cube = self.create_cube()
     test_joints[2].rotateX.set(30)
     skinutils.bind_mesh_to_joints(dummy_cube, test_joints)
     pm.dagPose(test_joints[0], bindPose=True, save=True)
     bind_poses = pm.ls(type='dagPose')
     self.assertEqual(3, len(bind_poses))
     result = skinutils.get_bind_pose_from_skincluster(test_skincluster)
     self.assertEqual(expected, result)
コード例 #5
0
def export_skinned_mesh(skinned_mesh, output_path, go_to_bind_pose=True):
    with pm.UndoChunk():
        if go_to_bind_pose:
            bind_pose = skinutils.get_bind_pose_from_skinned_mesh(skinned_mesh)
            pm.dagPose(bind_pose, restore=True, g=True)
        with selutils.preserve_selection():
            dup_mesh, dup_root, dup_cluster = skinutils.duplicate_skinned_mesh_and_skeleton(
                skinned_mesh, dup_namespace=NAMESPACE_SKINCOPY_EXPORT, dup_parent=nsutils.PARENT_WORLD)
            pm.select((dup_mesh, dup_root), replace=True)
            pm.exportSelected(output_path, constraints=False, expressions=False, shader=False, preserveReferences=False,
                              type='mayaAscii', constructionHistory=True, force=True)
    pm.undo()
コード例 #6
0
    def _callback(self, doDisconnect):
        """
        Handles actual rig connection.
        """

        rootControl = pmc.ls(selection=True)
        joints = [
            i for i in rootControl[0].getChildren(ad=True, type='joint')
            if i.startswith(self._rigPrefix)
        ]

        for jnt in joints:
            if doDisconnect:
                skinJoint = jnt.replace(self._rigPrefix, self._bindPrefix, 1)
                if not pmc.objExists(skinJoint):
                    continue

                constraintNodes = set(
                    pmc.listConnections(skinJoint,
                                        type='constraint',
                                        d=False,
                                        s=True))
                pmc.delete(list(constraintNodes))

            else:
                # Find matching jnt in skeleton, if available
                skinJoint = jnt.replace(self._rigPrefix, self._bindPrefix, 1)
                if skinJoint is jnt or not pmc.objExists(skinJoint):
                    continue

                pmc.pointConstraint(jnt, skinJoint, maintainOffset=False)
                orient = pmc.orientConstraint(jnt,
                                              skinJoint,
                                              maintainOffset=False)
                orient.interpType.set(
                    2)  # Interplotion 2 = shortest (to avoid flipping)

        # After disconnect, revert skeleton to bind pose
        if doDisconnect:
            skinRoot = joints[0]
            dagPoses = pmc.listConnections(skinRoot,
                                           type='dagPose',
                                           d=True,
                                           s=False)
            if len(dagPoses):
                pmc.dagPose(skinRoot,
                            restore=True,
                            g=True,
                            bindPose=True,
                            name=dagPoses[0])
            print 'COGSWELL COUPLER :: Rig Disconnected'
        else:
            print 'COGSWELL COUPLER :: Rig Connected'
コード例 #7
0
def bindPose(model):
    """Restore the reset position of the rig

    Args:
        model (TYPE): Description
    """
    nameSpace = getNamespace(model.name())
    if nameSpace:
        dagPoseName = nameSpace + ':dagPose1'
    else:
        dagPoseName = 'dagPose1'
    pm.dagPose(dagPoseName, restore=True)
コード例 #8
0
def import_skinning(skinned_mesh, skinweights_path, copy_weights_method=None, go_to_bindpose=True):
    with selutils.preserve_selection():
        copy_weights_method = copy_weights_method or skinutils.copy_weights
        new_nodes = pm.importFile(skinweights_path, loadReferenceDepth='none',
                                  namespace=NAMESPACE_SKINCOPY_IMPORT, returnNewNodes=True)
        source_skinmesh = _get_skinned_mesh_from_import(new_nodes, skinweights_path, skinned_mesh.nodeName())
        if go_to_bindpose:
            bind_pose = skinutils.get_bind_pose_from_skinned_mesh(skinned_mesh)
            pm.dagPose(bind_pose, restore=True, g=True)
        copy_weights_method(source_skinmesh, skinned_mesh)
        import_namespace = nsutils.get_namespace_as_pynode(NAMESPACE_SKINCOPY_IMPORT)
        import_namespace.remove()
        # evaluate all nodes
        pm.mel.eval('doEnableNodeItems true all;')
コード例 #9
0
ファイル: utils.py プロジェクト: AntonyThomasCGI/rigbot
def setSceneToBindPose():
    """
	Sets the scene to bind pose.
	:return: None
	"""
    bind_jnts = getBindJoints()

    input_nodes = set()
    for jnt in bind_jnts:
        input_nodes |= set(jnt.inputs())

    # set nodes to blocking
    for node in input_nodes:
        node.nodeState.set(2)

    pm.dagPose(bind_jnts, bindPose=True, restore=True)
コード例 #10
0
def rebuildDagPose():
    """
    Walks through bind pose data in selected skeleton and consolidates it down to one new bindPose node
    Directly inspired by Nathan Horne's NT_rebuildDagPose.mel script
    """

    dagPoses = set()
    connectedSkinClusters = set()
    selection = pmc.selected()
    joints = pmc.listRelatives(selection[0], path=True, allDescendents=True, type="joint")
    joints.insert(0, selection[0])

    for jnt in joints:
        dagPoses.update(jnt.listConnections(type="dagPose"))

    for dag in dagPoses:
        connectedSkinClusters.update(dag.listConnections(type="skinCluster"))

    pmc.delete(dagPoses)
    pmc.select(joints, replace=True)
    newDagPose = pmc.dagPose(save=True, selection=True, bindPose=True)

    print "New dagPose, {0}, created".format(newDagPose.shortName())

    for sc in connectedSkinClusters:
        print "Connecting {0}.message to {1}.bindPose".format(newDagPose.shortName(), sc.shortName())
        newDagPose.message.connect(sc.bindPose)
コード例 #11
0
ファイル: skin.py プロジェクト: MongoWobbler/piper
def returnToBindPose(joints=None):
    """
    Returns the associated bindPoses of the given joints to the pose when they were originally bound.

    Args:
        joints (list): Joints to find bind poses of.
        Note, these are NOT necessarily all the joints that will be restored since joints can share bindPose nodes.

    Returns:
        (set): Bind poses restored.
    """
    # Get joints, find all the bind poses all the joints are using, restore the bind poses for each pose found.
    joints = myu.validateSelect(joints, find='joint')
    poses = {
        pose
        for joint in joints for pose in pm.dagPose(joint, bp=True, q=True)
    }
    [pm.dagPose(pose, g=True, restore=True) for pose in poses]
    return poses
コード例 #12
0
ファイル: skinUtil.py プロジェクト: clamdragon/SurfRig
def setBindPose(meshXform):
    """Set the current skeleton pose as the bind pose for a transform.
    All relevant sub-shapes will be fixed. Move joints BEFORE using this
    (so skin is deformed) and skin will reset. Args:
    - meshXForm: TRANSFORM node of the skincluster affectes mesh."""
    for shape in meshXform.getShapes():
        try:
            skinClus = shape.inputs(type="skinCluster")[0]
        except IndexError:
            # perhaps an "Orig" shape, or just generally bad argument
            # ignore it.
            continue

        jnts = skinClus.matrix.inputs()
        for i, j in enumerate(jnts):
            # skinCluster stores each joint's worldInverseMatrix
            # at its bind pose
            skinClus.bindPreMatrix[i].set(j.worldInverseMatrix.get())

        pmc.dagPose(jnts, n=skinClus.bindPose.get(), reset=True)

        print("Successfully reset bind pose on {0}".format(shape.name()))
コード例 #13
0
    def finalize(self):
        """
        Finalize the rig.
        """
        groupIdx = 0

        # Properties --------------------------------------
        mgear.log("Finalize")

        # Groups ------------------------------------------
        mgear.log("Creating groups")
        # Retrieve group content from components
        for name in self.componentsIndex:
            component = self.components[name]
            for name, objects in component.groups.items():
                self.addToGroup(objects, name)


        #Create master set to group all the groups
        masterSet = pm.sets(n=self.model.name()+"_sets_grp", em=True)
        pm.connectAttr(masterSet.message, self.model.rigGroups[groupIdx])
        groupIdx += 1
        

        # Creating all groups
        pm.select(cl=True)
        for name, objects in self.groups.items():
            s = pm.sets(n=self.model.name()+"_"+name+"_grp")
            s.union( objects)
            pm.connectAttr(s.message, self.model.rigGroups[groupIdx])
            groupIdx += 1
            masterSet.add(s)




        # Bind pose ---------------------------------------
        print self.groups["controllers"]
        pm.select(self.groups["controllers"])
        node = pm.dagPose(save=True, selection=True)
        pm.connectAttr(node.message, self.model.rigPoses[0])
        print node

        # Bind skin re-apply
        if self.options["importSkin"]:
            try:
                pm.displayInfo("Importing Skin")
                skin.importSkin(self.options["skin"])

            except:
                pm.displayWarning("Skin doesn't exist or is not correct. "+self.options["skin"]+" Skipped!")
コード例 #14
0
def bdSetBindPose():
    selection = pm.ls(sl=True, type='joint')
    bindPose = ''
    skRoot = None
    if selection and len(selection) == 1:
        bindPose = pm.dagPose(save=True, bp=1)
        skRoot = selection[0]
    else:
        findRoot = pm.ls('Skeleton_Root', type='joint')
        if findRoot and len(findRoot) == 1:
            skRoot = findRoot[0]
            bndPoses = pm.listConnections('%s.bindPose' % skRoot.name())
            if bndPoses:
                strPoses = ''
                for p in bndPoses:
                    strPoses += (p.name() + ' ')
                return '%s has already the following bind pose(s): %s' % (
                    skRoot.name(), strPoses)
            else:
                bindPose = pm.dagPose(skRoot, save=True, bp=1)
        else:
            return 'No selection and no Skeleton_Root found !!!'

    return 'Created %s for %s' % (bindPose, skRoot.name())
コード例 #15
0
    def _callback(self, doDisconnect):
        """
        Handles actual rig connection.
        """

        rootControl = pmc.ls(selection=True)
        joints = [i for i in rootControl[0].getChildren(ad=True, type='joint') if i.startswith(self._rigPrefix)]

        for jnt in joints:
            if doDisconnect:
                skinJoint = jnt.replace(self._rigPrefix, self._bindPrefix, 1)
                if not pmc.objExists(skinJoint):
                    continue

                constraintNodes = set(pmc.listConnections(skinJoint, type='constraint', d=False, s=True))
                pmc.delete(list(constraintNodes))

            else:
                # Find matching jnt in skeleton, if available
                skinJoint = jnt.replace(self._rigPrefix, self._bindPrefix, 1)
                if skinJoint is jnt or not pmc.objExists(skinJoint):
                    continue

                pmc.pointConstraint(jnt, skinJoint, maintainOffset=False)
                orient = pmc.orientConstraint(jnt, skinJoint, maintainOffset=False)
                orient.interpType.set(2)  # Interplotion 2 = shortest (to avoid flipping)

        # After disconnect, revert skeleton to bind pose
        if doDisconnect:
            skinRoot = joints[0]
            dagPoses = pmc.listConnections(skinRoot, type='dagPose', d=True, s=False)
            if len(dagPoses):
                pmc.dagPose(skinRoot, restore=True, g=True, bindPose=True, name=dagPoses[0])
            print 'COGSWELL COUPLER :: Rig Disconnected'
        else:
            print 'COGSWELL COUPLER :: Rig Connected'
コード例 #16
0
def bdAssumeBindPose():
    selection = pm.ls(sl=True, type='joint')
    bindPose = ''
    skRoot = None
    if selection and len(selection) == 1:
        skRoot = selection[0]
        poses = pm.listConnections('%s.bindPose' % skRoot.name())
        if len(poses) > 1:
            return 'Multiple poses found for selection, you have to create only one !!!'
        else:
            pm.dagPose(poses[0], restore=True)
            return 'Bind pose \' %s \' restored ' % poses[0].name()
    else:
        findRoot = pm.ls('Skeleton_Root', type='joint')
        if findRoot and len(findRoot) == 1:
            skRoot = findRoot[0]
            poses = pm.listConnections('%s.bindPose' % skRoot.name())
            if len(poses) > 1:
                return 'Multiple poses found for selection, you have to create only one !!!'
            else:
                pm.dagPose(poses[0], restore=True)
                return 'Bind pose \' %s \' restored ' % poses[0].name()
        else:
            return 'Did\'t find a Skeleton_Root'
コード例 #17
0
    def combineBindPoses(self):
        # find all skinCluster in the scene
        skinCluster = pm.ls(type="skinCluster")
        # find all connected bindPoses
        influences = set()
        for sc in skinCluster:
            for i in pm.skinCluster(sc, q=1, influence=1):
                if pm.nodeType(i) == "joint": influences.add(i)

        # delete all dagPoses, create a new one and link to skin clusters
        dagPoses = pm.ls(type="dagPose")
        if dagPoses:
            print("Converted:")
            print(dagPoses)
            pm.delete(dagPoses)

        pose = pm.dagPose(list(influences), s=1, sl=1, bp=1)
        for sc in skinCluster:
            pm.connectAttr('%s.message' % pose, '%s.bindPose' % sc)

        print("to: %s\n" % pose)
コード例 #18
0
ファイル: zoobeMixamo.py プロジェクト: Mortaciunea/bdScripts
    def combineBindPoses(self):
        #find all skinCluster in the scene
        skinCluster = pm.ls(type="skinCluster")
        #find all connected bindPoses
        influences = set()
        for sc in skinCluster:
            for i in pm.skinCluster( sc, q=1, influence=1):
                if pm.nodeType(i)=="joint": influences.add(i)

        #delete all dagPoses, create a new one and link to skin clusters
        dagPoses = pm.ls(type="dagPose")
        if dagPoses:
            print( "Converted:")
            print (dagPoses)
            pm.delete( dagPoses)

        pose = pm.dagPose( list(influences), s=1, sl=1, bp=1)
        for sc in skinCluster:
            pm.connectAttr( '%s.message'%pose, '%s.bindPose'%sc)


        print("to: %s\n" % pose)
コード例 #19
0
 def test_get_bind_poses(self):
     test_joints = [self.create_joint(position=(i, i, i)) for i in range(5)]
     expected = [pm.dagPose(test_joints[0], bindPose=True, save=True)]
     result = skeletonutils.get_bind_poses(test_joints[0])
     self.assertEqual(expected, result)
コード例 #20
0
    def genereateRig(self, select=True):

        # export_path,_ = self.getFilename()
        # if not os.path.exists(export_path):
        #     return

        Scene = self.preExport()
        export_path = os.path.join(Scene.dirname(), "%s.FBX" % Scene.namebase)
        export_path = export_path.replace('\\', '/')

        mel.eval('FBXExportSkins -v true')

        # NOTE 导入所有的 reference
        [ref.importContents(True) for ref in pm.listReferences()]

        # NOTE 获取场景中所有可见的模型
        mesh_list = pm.ls("MODEL", ni=1, dag=1, type="mesh")
        # # NOTE 删除非变形器历史
        # pm.bakePartialHistory( mesh_list,prePostDeformers=True )
        jnt_list = self.getJntList(mesh_list)

        pm.select(cl=1)
        root = pm.joint(n="root")

        jnt_parent = self.getRelParent(jnt_list, root)

        mel.eval('moveJointsMode 1;')
        # # NOTE 删除所有 Blendshape
        # pm.delete(pm.ls(type="ikEffector"))
        pm.delete(pm.ls(type="blendShape"))

        jnt_transform = {}
        for jnt, pos in {
                jnt: pm.xform(jnt, q=1, ws=1, t=1)
                for jnt in jnt_list
        }.iteritems():
            jnt.tx.setLocked(0)
            jnt.ty.setLocked(0)
            jnt.tz.setLocked(0)
            jnt.rx.setLocked(0)
            jnt.ry.setLocked(0)
            jnt.rz.setLocked(0)
            jnt.sx.setLocked(0)
            jnt.sy.setLocked(0)
            jnt.sz.setLocked(0)

            jnt.tx.showInChannelBox(1)
            jnt.ty.showInChannelBox(1)
            jnt.tz.showInChannelBox(1)
            jnt.rx.showInChannelBox(1)
            jnt.ry.showInChannelBox(1)
            jnt.rz.showInChannelBox(1)
            jnt.sx.showInChannelBox(1)
            jnt.sy.showInChannelBox(1)
            jnt.sz.showInChannelBox(1)

            mel.eval('CBdeleteConnection %s' % jnt.tx)
            mel.eval('CBdeleteConnection %s' % jnt.ty)
            mel.eval('CBdeleteConnection %s' % jnt.tz)
            mel.eval('CBdeleteConnection %s' % jnt.rx)
            mel.eval('CBdeleteConnection %s' % jnt.ry)
            mel.eval('CBdeleteConnection %s' % jnt.rz)
            mel.eval('CBdeleteConnection %s' % jnt.sx)
            mel.eval('CBdeleteConnection %s' % jnt.sy)
            mel.eval('CBdeleteConnection %s' % jnt.sz)

            jnt.setParent(root)
            jnt.rename("%s_bind" % jnt)
            parent = jnt.getParent()
            if parent.name() == root:
                jnt.t.set(pos)
            else:
                jnt_transform[jnt] = parent

        # NOTE clear jnt transform node
        for jnt, parent in jnt_transform.items():
            pm.xform(parent, piv=pm.xform(jnt, q=1, ws=1, t=1), ws=1)
            # jnt.s.set(parent.s.get())
            # parent.s.set(1,1,1)
            pm.ungroup(parent)

        # NOTE delete unrelated node
        [pm.delete(node) for jnt in jnt_list for node in jnt.getChildren()]

        # NOTE reparent hierarchy
        jnt_transform = {}
        for jnt, parent in jnt_parent.items():
            jnt.setParent(parent)
            transform = jnt.getParent()
            if transform != parent:
                jnt_transform[jnt] = transform

        for jnt, parent in jnt_transform.items():
            pm.xform(parent, piv=pm.xform(jnt, q=1, ws=1, t=1), ws=1)
            # NOTE 避免意外扭动
            jnt.s.set(1, 1, 1)
            parent.s.set(1, 1, 1)
            pm.ungroup(parent)

        [mesh.getParent().setParent(w=1) for mesh in mesh_list]
        pm.select(root, mesh_list)
        pm.delete(pm.ls(type="dagPose"))
        pm.dagPose(bp=1, s=1)
        # mel.eval('moveJointsMode 0;')

        # NOTE 导出文件
        mel.eval('FBXExport -f "' + export_path + '" -s')
        os.startfile(os.path.dirname(export_path))

        # NOTE 重新打开当前文件
        pm.openFile(pm.sceneName(), f=1)
コード例 #21
0
def simpleRig(rigName="rig", wCntCtl=False, *args):
    """Create a simple 1Click rig.

    Args:
        rigName (str, optional): Name of the rig.
        wCntCtl (bool, optional): Place the Golbal control in the wolrd
            center or use the general BBox of the selection.
        *args: Description

    Returns:
        dagNode: Rig top node
    """
    meshList = []
    ctlList = []
    lvlList = []
    absBB = []
    absRadio = 0.5

    listSelection = [oSel for oSel in pm.selected()]

    # Create base structure
    rig = pm.createNode('transform', n=rigName)
    geo = pm.createNode('transform', n="geo", p=rig)
    geo.attr("overrideEnabled").set(1)
    geo.attr("overrideDisplayType").set(2)

    attribute.addAttribute(rig, "is_rig", "bool", True)
    attribute.addAttribute(rig, "rig_name", "string", "rig")
    attribute.addAttribute(rig, "user", "string", getpass.getuser())
    attribute.addAttribute(rig, "date", "string", str(datetime.datetime.now()))

    attribute.addAttribute(rig, "maya_version", "string",
                           str(pm.mel.eval("getApplicationVersionAsFloat")))

    attribute.addAttribute(rig, "gear_version", "string", mgear.getVersion())
    attribute.addAttribute(rig, "ctl_vis", "bool", True)
    attribute.addAttribute(rig, "jnt_vis", "bool", False)

    attribute.addAttribute(rig, "quickselA", "string", "")
    attribute.addAttribute(rig, "quickselB", "string", "")
    attribute.addAttribute(rig, "quickselC", "string", "")
    attribute.addAttribute(rig, "quickselD", "string", "")
    attribute.addAttribute(rig, "quickselE", "string", "")
    attribute.addAttribute(rig, "quickselF", "string", "")

    rig.addAttr("rigGroups", at='message', m=1)
    rig.addAttr("rigPoses", at='message', m=1)

    for oSel in listSelection:

        bbCenter, bbRadio, bb = bBoxData(oSel)
        lvl = pm.createNode('transform', n=oSel.name().split("_")[0] + "_npo")
        lvlList.append(lvl)
        t = transform.getTransformFromPos(bbCenter)
        lvl.setTransformation(t)

        ctl = ico.create(lvl,
                         oSel.name().split("_")[0] + "_ctl",
                         t,
                         14,
                         icon="circle",
                         w=bbRadio * 2)

        cnsPart(ctl, oSel)

        ctlList.append(ctl)
        for oShape in oSel.listRelatives(ad=True, s=True, type='mesh'):
            pm.connectAttr(ctl + ".visibility", oShape + ".visibility", f=True)
            meshList.append(oShape)

        # Reparenting
        pm.parent(oSel, geo)

        # calculate the global control BB
        if not wCntCtl:
            if not absBB:
                absBB = bb
            else:
                absBB = [
                    [min(bb[0][0], absBB[0][0]),
                     max(bb[0][1], absBB[0][1])],
                    [min(bb[1][0], absBB[1][0]),
                     max(bb[1][1], absBB[1][1])],
                    [min(bb[2][0], absBB[2][0]),
                     max(bb[2][1], absBB[2][1])]
                ]

        userPivots = dag.findChildrenPartial(oSel, PIVOT_EXTENSION)
        # Loop selection
        uPivotCtl = []
        if userPivots:
            for uPivot in userPivots:
                try:
                    pstr = uPivot.name().split('_')[0] + "_" + PGROUP_EXTENSION
                    pgrp = pm.PyNode(pstr)
                except TypeError:
                    pm.displayError("The selected pivot dont have the group"
                                    " contrapart. Review your rig structure")
                    return False
                objList = pgrp.listRelatives(ad=True)
                if objList:
                    bbCenter, bbRadio, bb = bBoxData(objList)
                    t = uPivot.getMatrix(worldSpace=True)
                    lvlParent = pm.listRelatives(
                        uPivot, p=True)[0].name().split("_")[0] + "_ctl"

                    lvl = pm.createNode('transform',
                                        n=uPivot.split("_")[0] + "_npo")
                    lvl.setTransformation(t)
                    icon = iconList[uPivot.attr("ctlIcon").get()]
                    ctlKeyable = []
                    if uPivot.attr("animTranslation").get():
                        ctlKeyable = ctlKeyable + ["tx", "ty", "tz"]
                    if uPivot.attr("animRotation").get():
                        ctlKeyable = ctlKeyable + ["ro", "rx", "ry", "rz"]
                    if uPivot.attr("animScale").get():
                        ctlKeyable = ctlKeyable + ["sx", "sy", "sz"]

                    ctl = ico.create(lvl,
                                     uPivot.split("_")[0] + "_ctl",
                                     t,
                                     15,
                                     icon=icon,
                                     w=bbRadio * 2,
                                     h=bbRadio * 2,
                                     d=bbRadio * 2)

                    attribute.setKeyableAttributes(ctl, ctlKeyable)
                    pm.parent(lvl, lvlParent)
                    attribute.setKeyableAttributes(lvl, [])
                    uPivotCtl.append(ctl)
                    # Constraint
                    cnsPart(ctl, pgrp)

                    for oShape in uPivot.listRelatives(ad=True,
                                                       s=True,
                                                       type='mesh'):
                        pm.connectAttr(ctl + ".visibility",
                                       oShape + ".visibility",
                                       f=True)
                        meshList.append(oShape)

                    # hidde user pivot
                    uPivot.attr("visibility").set(False)

    # setting the global control
    if wCntCtl:
        absCenter = [0, 0, 0]
    else:
        absCenter = [(axis[0] + axis[1]) / 2 for axis in absBB]
        # set the cencter in the floor
        absCenter[1] = absBB[1][0]

        absRadio = max([absBB[0][1] - absBB[0][0], absBB[2][1] - absBB[2][0]
                        ]) / 1.7

    t = transform.getTransformFromPos(absCenter)
    lvl = pm.createNode('transform', n="global_npo")
    lvl.setTransformation(t)
    pm.parent(lvl, rig)

    ctlGlobal = ico.create(lvl,
                           "global_ctl",
                           t,
                           17,
                           icon="square",
                           w=absRadio * 2,
                           d=absRadio * 2)

    pm.parent(lvlList, ctlGlobal)
    ctlList.append(ctlGlobal)
    attribute.setKeyableAttributes(lvl, [])
    for lvl in lvlList:
        attribute.setKeyableAttributes(lvl, [])

    # Create sets
    meshSet = pm.sets(meshList, n="CACHE_grp")
    ctlSet = pm.sets([ctlList, uPivotCtl], n="rig_controllers_grp")
    deformersSet = pm.sets(meshList, n="rig_deformers_grp")
    compGroup = pm.sets(meshList, n="rig_componentsRoots_grp")

    rigSets = pm.sets([meshSet, ctlSet, deformersSet, compGroup],
                      n="rig_Sets_grp")

    pm.connectAttr(rigSets.attr("message"), "rig.rigGroups[0]")
    pm.connectAttr(meshSet.attr("message"), "rig.rigGroups[1]")
    pm.connectAttr(ctlSet.attr("message"), "rig.rigGroups[2]")
    pm.connectAttr(deformersSet.attr("message"), "rig.rigGroups[3]")
    pm.connectAttr(compGroup.attr("message"), "rig.rigGroups[4]")

    if oSel.hasAttr("animSets") and oSel.attr("animSets").get():
        # create anim Sets
        pm.sets(n="animNodes", em=True)
        animNodes_set = pm.PyNode("animNodes")

        pm.sets(n="animSets", em=True)
        animSets_set = pm.PyNode("animSets")

        # adding set
        pm.sets(animSets_set, add=animNodes_set)
        pm.sets(animNodes_set, add=ctlSet.members())

        pm.connectAttr(animSets_set.attr("message"), "rig.rigGroups[5]")
        pm.connectAttr(animNodes_set.attr("message"), "rig.rigGroups[6]")

    # create dagPose
    pm.select(ctlSet)
    o_node = pm.dagPose(save=True, selection=True)
    pm.connectAttr(o_node.message, rig.rigPoses[0])

    return rig
コード例 #22
0
    def finalize(self):
        """Finalize the rig."""
        groupIdx = 0

        # Properties --------------------------------------
        mgear.log("Finalize")

        # clean jnt_org --------------------------------------
        if self.options["joint_rig"]:
            mgear.log("Cleaning jnt org")
            for jOrg in dag.findChildrenPartial(self.jnt_org, "org"):
                if not jOrg.listRelatives(c=True):
                    pm.delete(jOrg)

        # Groups ------------------------------------------
        mgear.log("Creating groups")
        # Retrieve group content from components
        for name in self.componentsIndex:
            component_ = self.components[name]
            for name, objects in component_.groups.items():
                self.addToGroup(objects, name)
            for name, objects in component_.subGroups.items():
                self.addToSubGroup(objects, name)

        # Create master set to group all the groups
        masterSet = pm.sets(n=self.model.name() + "_sets_grp", em=True)
        pm.connectAttr(masterSet.message, self.model.rigGroups[groupIdx])
        groupIdx += 1

        # Creating all groups
        pm.select(cl=True)
        for name, objects in self.groups.items():
            s = pm.sets(n=self.model.name() + "_" + name + "_grp")
            s.union(objects)
            pm.connectAttr(s.message, self.model.rigGroups[groupIdx])
            groupIdx += 1
            masterSet.add(s)
        for parentGroup, subgroups in self.subGroups.items():
            pg = pm.PyNode(self.model.name() + "_" + parentGroup + "_grp")
            for sg in subgroups:
                sub = pm.PyNode(self.model.name() + "_" + sg + "_grp")
                if sub in masterSet.members():
                    masterSet.remove(sub)
                pg.add(sub)

        # Bind pose ---------------------------------------
        # controls_grp = self.groups["controllers"]
        # pprint(controls_grp, stream=None, indent=1, width=100)
        ctl_master_grp = pm.PyNode(self.model.name() + "_controllers_grp")
        pm.select(ctl_master_grp, replace=True)
        dag_node = pm.dagPose(save=True, selection=True)
        pm.connectAttr(dag_node.message, self.model.rigPoses[0])
        print dag_node

        # Bind skin re-apply
        if self.options["importSkin"]:
            try:
                pm.displayInfo("Importing Skin")
                skin.importSkin(self.options["skin"])

            except RuntimeError:
                pm.displayWarning("Skin doesn't exist or is not correct. " +
                                  self.options["skin"] + " Skipped!")
コード例 #23
0
ファイル: utils.py プロジェクト: moChen0607/mgear
def bindPose(model):
    if len(model.name().split(":")) == 2:
        dagPoseName = model.name().split(":")[0]+':dagPose1'
    else:
        dagPoseName = 'dagPose1'
    pm.dagPose( dagPoseName, restore=True )