Esempio n. 1
0
    def save(self,
             path,
             time=None,
             sampleBy=1,
             fileType="",
             bakeConnected=True):
        """
        Save all animation data from the objects set on the Anim object.

        :type path: str
        :type time: (int, int) or None
        :type sampleBy: int
        :type fileType: str
        :type bakeConnected: bool
        
        :rtype: None
        """
        objects = self.objects().keys()

        fileType = fileType or DEFAULT_FILE_TYPE

        if not time:
            time = mutils.selectedObjectsFrameRange(objects)
        start, end = time

        # Check selected animation layers
        gSelectedAnimLayers = maya.mel.eval(
            '$gSelectedAnimLayers=$gSelectedAnimLayers')
        if len(gSelectedAnimLayers) > 1:
            msg = "More than one animation layer is selected! Please select only one animation layer for export!"
            raise AnimationTransferError(msg)

        # Check frame range
        if start is None or end is None:
            msg = "Please specify a start and end frame!"
            raise AnimationTransferError(msg)

        if start >= end:
            msg = "The start frame cannot be greater than or equal to the end frame!"
            raise AnimationTransferError(msg)

        # Check if animation exists
        if mutils.getDurationFromNodes(nodes=objects or []) <= 0:
            msg = "No animation was found on the specified object/s! Please create a pose instead!"
            raise AnimationTransferError(msg)

        self.setMetadata("endFrame", end)
        self.setMetadata("startFrame", start)

        end += 1
        dstCurves = []
        validAnimCurves = []

        msg = "Animation.save(path={0}, time={1}, bakeConnections={2}, sampleBy={3})"
        msg = msg.format(path, str(time), str(bakeConnected), str(sampleBy))
        logger.debug(msg)

        try:
            if bakeConnected:
                maya.cmds.undoInfo(openChunk=True)
                mutils.bakeConnected(objects,
                                     time=(start, end),
                                     sampleBy=sampleBy)

            for name in objects:
                if maya.cmds.copyKey(name,
                                     time=(start, end),
                                     includeUpperBound=False,
                                     option="keys"):

                    # Might return more than one object when duplicating shapes or blendshapes
                    transform, = maya.cmds.duplicate(name,
                                                     name="CURVE",
                                                     parentOnly=True)

                    dstCurves.append(transform)
                    mutils.disconnectAll(transform)
                    maya.cmds.pasteKey(transform)

                    attrs = maya.cmds.listAttr(
                        transform, unlocked=True, keyable=True) or []
                    attrs = list(
                        set(attrs) - set(['translate', 'rotate', 'scale']))

                    for attr in attrs:
                        fullname = ("%s.%s" % (transform, attr))
                        dstCurve, = maya.cmds.listConnections(
                            fullname, destination=False) or [None]

                        if dstCurve:
                            # Filter to only animCurves since you can have proxy attributes
                            if not maya.cmds.nodeType(dstCurve).startswith(
                                    "animCurve"):
                                continue

                            dstCurve = maya.cmds.rename(dstCurve, "CURVE")
                            srcCurve = mutils.animCurve("%s.%s" % (name, attr))
                            if srcCurve and "animCurve" in maya.cmds.nodeType(
                                    srcCurve):
                                preInfinity = maya.cmds.getAttr(srcCurve +
                                                                ".preInfinity")
                                postInfinity = maya.cmds.getAttr(
                                    srcCurve + ".postInfinity")
                                curveColor = maya.cmds.getAttr(srcCurve +
                                                               ".curveColor")
                                useCurveColor = maya.cmds.getAttr(
                                    srcCurve + ".useCurveColor")

                                maya.cmds.setAttr(dstCurve + ".preInfinity",
                                                  preInfinity)
                                maya.cmds.setAttr(dstCurve + ".postInfinity",
                                                  postInfinity)
                                maya.cmds.setAttr(dstCurve + ".curveColor",
                                                  *curveColor[0])
                                maya.cmds.setAttr(dstCurve + ".useCurveColor",
                                                  useCurveColor)

                            dstCurves.append(dstCurve)

                            if maya.cmds.keyframe(dstCurve,
                                                  query=True,
                                                  time=(start, end),
                                                  keyframeCount=True):
                                self.setAnimCurve(name, attr, dstCurve)
                                maya.cmds.cutKey(dstCurve,
                                                 time=(MIN_TIME_LIMIT,
                                                       start - 1))
                                maya.cmds.cutKey(dstCurve,
                                                 time=(end + 1,
                                                       MAX_TIME_LIMIT))
                                validAnimCurves.append(dstCurve)

            fileName = "animation.ma"
            if fileType == "mayaBinary":
                fileName = "animation.mb"

            mayaPath = os.path.join(path, fileName)
            posePath = os.path.join(path, "pose.json")
            mutils.Pose.save(self, posePath)

            if validAnimCurves:
                maya.cmds.select(validAnimCurves)
                logger.info("Saving animation: %s" % mayaPath)
                maya.cmds.file(mayaPath,
                               force=True,
                               options='v=0',
                               type=fileType,
                               uiConfiguration=False,
                               exportSelected=True)
                self.cleanMayaFile(mayaPath)

        finally:
            if bakeConnected:
                # HACK! Undo all baked connections. :)
                maya.cmds.undoInfo(closeChunk=True)
                maya.cmds.undo()
            elif dstCurves:
                maya.cmds.delete(dstCurves)

        self.setPath(path)
Esempio n. 2
0
    def save(self, path, time=None, bakeConnected=True, sampleBy=1):
        """
        Save all animation data from the objects set on the Anim object.
        
        :type path: str
        :type time: (int, int) or NOne
        :type bakeConnected: bool
        :type sampleBy: int
        """
        objects = self.objects().keys()
        if not time:
            time = mutils.animationFrameRange(objects)
        start, end = time
        gSelectedAnimLayers = maya.mel.eval('$a = $gSelectedAnimLayers;')
        if len(gSelectedAnimLayers) > 1:
            msg = 'More than one animation layer is selected! Please select only one animation layer for export!'
            raise AnimationTransferError(msg)
        if start is None or end is None:
            msg = 'Please specify a start and end frame!'
            raise AnimationTransferError(msg)
        if start >= end:
            msg = 'The start frame cannot be greater than or equal to the end frame!'
            raise AnimationTransferError(msg)
        if mutils.getDurationFromNodes(nodes=objects or []) <= 0:
            msg = 'No animation was found on the specified object/s! Please create a pose instead!'
            raise AnimationTransferError(msg)
        self.setMetadata('endFrame', end)
        self.setMetadata('startFrame', start)
        end += 1
        dstCurves = []
        validAnimCurves = []
        msg = 'Animation.save(path={0}, time={1}, bakeConnections={2}, sampleBy={3})'
        msg = msg.format(path, str(time), str(bakeConnected), str(sampleBy))
        logger.debug(msg)
        try:
            if bakeConnected:
                maya.cmds.undoInfo(openChunk=True)
                mutils.bakeConnected(objects,
                                     time=(start, end),
                                     sampleBy=sampleBy)
            for name in objects:
                if maya.cmds.copyKey(name,
                                     time=(start, end),
                                     includeUpperBound=False,
                                     option='keys'):
                    transform, = maya.cmds.duplicate(name,
                                                     name='CURVE',
                                                     parentOnly=True)
                    dstCurves.append(transform)
                    mutils.disconnectAll(transform)
                    maya.cmds.pasteKey(transform)
                    attrs = maya.cmds.listAttr(
                        transform, unlocked=True, keyable=True) or []
                    attrs = list(
                        set(attrs) - set(['translate', 'rotate', 'scale']))
                    for attr in attrs:
                        fullname = '%s.%s' % (transform, attr)
                        dstCurve, = maya.cmds.listConnections(
                            fullname, destination=False) or [None]
                        if dstCurve:
                            dstCurve = maya.cmds.rename(dstCurve, 'CURVE')
                            srcCurve = mutils.animCurve('%s.%s' % (name, attr))
                            if srcCurve and 'animCurve' in maya.cmds.nodeType(
                                    srcCurve):
                                preInfinity = maya.cmds.getAttr(srcCurve +
                                                                '.preInfinity')
                                postInfinity = maya.cmds.getAttr(
                                    srcCurve + '.postInfinity')
                                curveColor = maya.cmds.getAttr(srcCurve +
                                                               '.curveColor')
                                useCurveColor = maya.cmds.getAttr(
                                    srcCurve + '.useCurveColor')
                                maya.cmds.setAttr(dstCurve + '.preInfinity',
                                                  preInfinity)
                                maya.cmds.setAttr(dstCurve + '.postInfinity',
                                                  postInfinity)
                                maya.cmds.setAttr((dstCurve + '.curveColor'),
                                                  *curveColor[0])
                                maya.cmds.setAttr(dstCurve + '.useCurveColor',
                                                  useCurveColor)
                            dstCurves.append(dstCurve)
                            if maya.cmds.keyframe(dstCurve,
                                                  query=True,
                                                  time=(start, end),
                                                  keyframeCount=True):
                                self.setAnimCurve(name, attr, dstCurve)
                                maya.cmds.cutKey(dstCurve,
                                                 time=(MIN_TIME_LIMIT,
                                                       start - 1))
                                maya.cmds.cutKey(dstCurve,
                                                 time=(end + 1,
                                                       MAX_TIME_LIMIT))
                                validAnimCurves.append(dstCurve)

            mayaPath = os.path.join(path, 'animation.mb')
            posePath = os.path.join(path, 'pose.json')
            mutils.Pose.save(self, posePath)
            if validAnimCurves:
                maya.cmds.select(validAnimCurves)
                logger.info('Saving animation: %s' % mayaPath)
                maya.cmds.file(mayaPath,
                               force=True,
                               options='v=0',
                               type='mayaBinary',
                               uiConfiguration=False,
                               exportSelected=True)
                self.cleanMayaFile(mayaPath)
        finally:
            if bakeConnected:
                maya.cmds.undoInfo(closeChunk=True)
                maya.cmds.undo()
            elif dstCurves:
                maya.cmds.delete(dstCurves)

        self.setPath(path)
Esempio n. 3
0
    def save(
        self,
        path,
        time=None,
        sampleBy=1,
        fileType="",
        bakeConnected=True
    ):
        """
        Save all animation data from the objects set on the Anim object.

        :type path: str
        :type time: (int, int) or None
        :type sampleBy: int
        :type fileType: str
        :type bakeConnected: bool
        
        :rtype: None
        """
        objects = self.objects().keys()

        fileType = fileType or DEFAULT_FILE_TYPE

        if not time:
            time = mutils.selectedObjectsFrameRange(objects)
        start, end = time

        # Check selected animation layers
        validateAnimLayers()

        # Check frame range
        if start is None or end is None:
            msg = "Please specify a start and end frame!"
            raise AnimationTransferError(msg)

        if start >= end:
            msg = "The start frame cannot be greater than or equal to the end frame!"
            raise AnimationTransferError(msg)

        # Check if animation exists
        if mutils.getDurationFromNodes(objects or []) <= 0:
            msg = "No animation was found on the specified object/s! " \
                  "Please create a pose instead!"
            raise AnimationTransferError(msg)

        self.setMetadata("endFrame", end)
        self.setMetadata("startFrame", start)

        end += 1
        validCurves = []
        deleteObjects = []

        msg = "Animation.save(path={0}, time={1}, bakeConnections={2}, sampleBy={3})"
        msg = msg.format(path, str(time), str(bakeConnected), str(sampleBy))
        logger.debug(msg)

        try:
            if bakeConnected:
                maya.cmds.undoInfo(openChunk=True)
                mutils.bakeConnected(objects, time=(start, end), sampleBy=sampleBy)

            for name in objects:
                if maya.cmds.copyKey(name, time=(start, end), includeUpperBound=False, option="keys"):

                    # Might return more than one object when duplicating shapes or blendshapes
                    transform, = maya.cmds.duplicate(name, name="CURVE", parentOnly=True)

                    if not FIX_SAVE_ANIM_REFERENCE_LOCKED_ERROR:
                        mutils.disconnectAll(transform)

                    deleteObjects.append(transform)
                    maya.cmds.pasteKey(transform)

                    attrs = maya.cmds.listAttr(transform, unlocked=True, keyable=True) or []
                    attrs = list(set(attrs) - set(['translate', 'rotate', 'scale']))

                    for attr in attrs:
                        dstAttr = mutils.Attribute(transform, attr)
                        dstCurve = dstAttr.animCurve()

                        if dstCurve:

                            dstCurve = maya.cmds.rename(dstCurve, "CURVE")
                            deleteObjects.append(dstCurve)

                            srcAttr = mutils.Attribute(name, attr)
                            srcCurve = srcAttr.animCurve()

                            if srcCurve:
                                preInfinity = maya.cmds.getAttr(srcCurve + ".preInfinity")
                                postInfinity = maya.cmds.getAttr(srcCurve + ".postInfinity")
                                curveColor = maya.cmds.getAttr(srcCurve + ".curveColor")
                                useCurveColor = maya.cmds.getAttr(srcCurve + ".useCurveColor")

                                maya.cmds.setAttr(dstCurve + ".preInfinity", preInfinity)
                                maya.cmds.setAttr(dstCurve + ".postInfinity", postInfinity)
                                maya.cmds.setAttr(dstCurve + ".curveColor", *curveColor[0])
                                maya.cmds.setAttr(dstCurve + ".useCurveColor", useCurveColor)

                            if maya.cmds.keyframe(dstCurve, query=True, time=(start, end), keyframeCount=True):
                                self.setAnimCurve(name, attr, dstCurve)
                                maya.cmds.cutKey(dstCurve, time=(MIN_TIME_LIMIT, start - 1))
                                maya.cmds.cutKey(dstCurve, time=(end + 1, MAX_TIME_LIMIT))
                                validCurves.append(dstCurve)

            fileName = "animation.ma"
            if fileType == "mayaBinary":
                fileName = "animation.mb"

            mayaPath = os.path.join(path, fileName)
            posePath = os.path.join(path, "pose.json")
            mutils.Pose.save(self, posePath)

            if validCurves:
                maya.cmds.select(validCurves)
                logger.info("Saving animation: %s" % mayaPath)
                maya.cmds.file(mayaPath, force=True, options='v=0', type=fileType, uiConfiguration=False, exportSelected=True)
                self.cleanMayaFile(mayaPath)

        finally:
            if bakeConnected:
                # HACK! Undo all baked connections. :)
                maya.cmds.undoInfo(closeChunk=True)
                maya.cmds.undo()
            elif deleteObjects:
                maya.cmds.delete(deleteObjects)

        self.setPath(path)
Esempio n. 4
0
    def save(self, path, time = None, compress = False, bakeConnected = True, sampleBy = 1):
        """
        @type time: (int, int)
        """
        objects = self.objects().keys()
        if not time:
            time = mutils.animationRange(objects)
        start, end = time
        gSelectedAnimLayers = maya.mel.eval('$a = $gSelectedAnimLayers;')
        if len(gSelectedAnimLayers) > 1:
            msg = 'More than one animation layer is selected! Please select only one animation layer for export!'
            raise AnimationTransferError(msg)
        if start is None or end is None:
            msg = 'Please specify a start and end frame!'
            raise AnimationTransferError(msg)
        if start >= end:
            msg = 'The start frame cannot be greater than or equal to the end frame!'
            raise AnimationTransferError(msg)
        if mutils.getDurationFromNodes(nodes=objects or []) <= 0:
            msg = 'No animation was found on the specified object/s! Please create a pose instead!'
            raise AnimationTransferError(msg)
        self.setMetadata('endFrame', end)
        self.setMetadata('startFrame', start)
        end += 1
        dstCurves = []
        validAnimCurves = []
        log.debug('Animation.save(path=%s, time=%s, compress=%s, bakeConnections=%s, sampleBy=%s)' % (path,
         str(time),
         str(compress),
         str(bakeConnected),
         str(sampleBy)))
        try:
            if bakeConnected:
                maya.cmds.undoInfo(openChunk=True)
                mutils.bakeConnected(objects, time=(start, end), sampleBy=sampleBy)
            for name in objects:
                if maya.cmds.copyKey(name, time=(start, end), includeUpperBound=False, option='keys'):
                    transform, = maya.cmds.duplicate(name, name='CURVE', parentOnly=True)
                    dstCurves.append(transform)
                    mutils.disconnectAll(transform)
                    maya.cmds.pasteKey(transform)
                    attrs = maya.cmds.listAttr(transform, unlocked=True, keyable=True) or []
                    attrs = list(set(attrs) - set(['translate', 'rotate', 'scale']))
                    for attr in attrs:
                        fullname = '%s.%s' % (transform, attr)
                        dstCurve, = maya.cmds.listConnections(fullname, destination=False) or [None]
                        if dstCurve:
                            dstCurve = maya.cmds.rename(dstCurve, 'CURVE')
                            srcCurve = mutils.animCurve('%s.%s' % (name, attr))
                            if srcCurve and 'animCurve' in maya.cmds.nodeType(srcCurve):
                                preInfinity = maya.cmds.getAttr(srcCurve + '.preInfinity')
                                postInfinity = maya.cmds.getAttr(srcCurve + '.postInfinity')
                                curveColor = maya.cmds.getAttr(srcCurve + '.curveColor')
                                useCurveColor = maya.cmds.getAttr(srcCurve + '.useCurveColor')
                                maya.cmds.setAttr(dstCurve + '.preInfinity', preInfinity)
                                maya.cmds.setAttr(dstCurve + '.postInfinity', postInfinity)
                                maya.cmds.setAttr((dstCurve + '.curveColor'), *curveColor[0])
                                maya.cmds.setAttr(dstCurve + '.useCurveColor', useCurveColor)
                            dstCurves.append(dstCurve)
                            if maya.cmds.keyframe(dstCurve, query=True, time=(start, end), keyframeCount=True):
                                self.setAttrCurve(name, attr, dstCurve)
                                maya.cmds.cutKey(dstCurve, time=(MIN_TIME_LIMIT, start - 1))
                                maya.cmds.cutKey(dstCurve, time=(end + 1, MAX_TIME_LIMIT))
                                validAnimCurves.append(dstCurve)

            mayaPath = os.path.join(path, 'animation.ma')
            posePath = os.path.join(path, 'pose.json')
            mutils.Pose.save(self, posePath)
            if validAnimCurves:
                maya.cmds.select(validAnimCurves)
                log.info('Saving animation: %s' % mayaPath)
                maya.cmds.file(mayaPath, force=True, options='v=0', type='mayaAscii', uiConfiguration=False, exportSelected=True)
                self.cleanMayaFile(mayaPath)
        finally:
            if bakeConnected:
                maya.cmds.undoInfo(closeChunk=True)
                maya.cmds.undo()
            elif dstCurves:
                maya.cmds.delete(dstCurves)

        self.setPath(path)
Esempio n. 5
0
    def save(self,
             path,
             time=None,
             compress=False,
             bakeConnected=True,
             sampleBy=1):
        """
        @type time: (int, int)
        """
        objects = self.objects().keys()
        if not time:
            time = mutils.animationRange(objects)
        start, end = time
        self.setMetadata('endFrame', end)
        self.setMetadata('startFrame', start)
        end += 1
        dstCurves = []
        validAnimCurves = []
        log.debug(
            'Animation.save(path=%s, time=%s, compress=%s, bakeConnections=%s, sampleBy=%s)'
            % (path, str(time), str(compress), str(bakeConnected),
               str(sampleBy)))
        try:
            if bakeConnected:
                maya.cmds.undoInfo(openChunk=True)
                mutils.bakeConnected(objects,
                                     time=(start, end),
                                     sampleBy=sampleBy)
            for name in objects:
                if maya.cmds.copyKey(name,
                                     time=(start, end),
                                     includeUpperBound=False,
                                     option='keys'):
                    transform, = maya.cmds.duplicate(name,
                                                     name='CURVE',
                                                     parentOnly=True)
                    dstCurves.append(transform)
                    mutils.disconnectAll(transform)
                    maya.cmds.pasteKey(transform)
                    attrs = maya.cmds.listAttr(
                        transform, unlocked=True, keyable=True) or []
                    attrs = list(
                        set(attrs) - set(['translate', 'rotate', 'scale']))
                    for attr in attrs:
                        fullname = '%s.%s' % (transform, attr)
                        dstCurve, = maya.cmds.listConnections(
                            fullname, destination=False) or [None]
                        if dstCurve:
                            dstCurve = maya.cmds.rename(dstCurve, 'CURVE')
                            srcCurve = mutils.animCurve('%s.%s' % (name, attr))
                            if srcCurve and 'animCurve' in maya.cmds.nodeType(
                                    srcCurve):
                                preInfinity = maya.cmds.getAttr(srcCurve +
                                                                '.preInfinity')
                                postInfinity = maya.cmds.getAttr(
                                    srcCurve + '.postInfinity')
                                curveColor = maya.cmds.getAttr(srcCurve +
                                                               '.curveColor')
                                useCurveColor = maya.cmds.getAttr(
                                    srcCurve + '.useCurveColor')
                                maya.cmds.setAttr(dstCurve + '.preInfinity',
                                                  preInfinity)
                                maya.cmds.setAttr(dstCurve + '.postInfinity',
                                                  postInfinity)
                                maya.cmds.setAttr((dstCurve + '.curveColor'),
                                                  *curveColor[0])
                                maya.cmds.setAttr(dstCurve + '.useCurveColor',
                                                  useCurveColor)
                            dstCurves.append(dstCurve)
                            if maya.cmds.keyframe(dstCurve,
                                                  query=True,
                                                  time=(start, end),
                                                  keyframeCount=True):
                                self.setAttrCurve(name, attr, dstCurve)
                                maya.cmds.cutKey(dstCurve,
                                                 time=(MIN_TIME_LIMIT,
                                                       start - 1))
                                maya.cmds.cutKey(dstCurve,
                                                 time=(end + 1,
                                                       MAX_TIME_LIMIT))
                                validAnimCurves.append(dstCurve)

            mayaPath = os.path.join(path, 'animation.ma')
            posePath = os.path.join(path, 'pose.json')
            mutils.Pose.save(self, posePath)
            if validAnimCurves:
                maya.cmds.select(validAnimCurves)
                log.info('Saving animation: %s' % mayaPath)
                maya.cmds.file(mayaPath,
                               force=True,
                               options='v=0',
                               type='mayaAscii',
                               uiConfiguration=False,
                               exportSelected=True)
                self.cleanMayaFile(mayaPath)
        finally:
            if bakeConnected:
                maya.cmds.undoInfo(closeChunk=True)
                maya.cmds.undo()
            elif dstCurves:
                maya.cmds.delete(dstCurves)

        self.setPath(path)