Пример #1
0
    def remove(cls):
        prints = cls.getTargets(1)
        if not prints:
            return False

        for p in prints:
            if not cmds.attributeQuery(cls._PREVIOUS_PRINT_ATTR, node=p, exists=True):
                print 'UNRECOGNIZED ITEM: "%s" is not a valid footprint and has been skipped.' % p
                continue

            nexts = cls.getNext(p)
            for c in nexts:
                cmds.disconnectAttr(p + '.message', c + '.' + cls._PREVIOUS_PRINT_ATTR)

            prevs = cls.getPrevious(p)
            for c in prevs:
                try:
                    cmds.disconnectAttr(c + '.message', p + '.' + cls._PREVIOUS_PRINT_ATTR)
                except Exception, err:
                    print 'DISCONNECT FAILURE | Unable to disconnect'
                    print '\tTarget:', str(p) + '.' + cls._PREVIOUS_PRINT_ATTR
                    print '\tSource:', str(c) + '.message'
                    raise

            cmds.deleteAttr(p + '.' + cls._PREVIOUS_PRINT_ATTR)
            cmds.connectAttr(
                prevs[0] + '.message',
                nexts[0] + '.' + cls._PREVIOUS_PRINT_ATTR,
                force=True
            )
Пример #2
0
    def getNodeDatum(cls, node):
        """ Returns the numeric datum value, else None. """

        if not cmds.attributeQuery('datum', node=node, exists=True):
            return None

        return cmds.getAttr(node + '.datum')
Пример #3
0
    def getPrevNode(cls, node):
        """ Returns the previous track node to a given node else None. """

        if not cmds.attributeQuery('prev', node=node, exists=True):
            return None

        return cmds.getAttr(node + '.prev')
Пример #4
0
    def getNextNode(cls, node):
        """ Returns the next track node to a given node else None. """

        if not cmds.attributeQuery('next', node=node, exists=True):
            return None

        return cmds.getAttr(node + '.next')
Пример #5
0
    def setNodeDatum(cls, node, value):
        """ Sets the numeric datum value, creating the attribute if not already
            defined. """

        if not cmds.attributeQuery('datum', node=node, exists=True):
            cmds.addAttr(
                node,
                longName='cadence_datum',
                shortName='datum',
                niceName='Datum')

        cmds.setAttr(node + '.datum', value)
Пример #6
0
    def setNodeLinks(cls, node, prev, next):
        """ Sets up two attributes, prev and next, that directly link the given
            node to its previous and next nodes. """

        if not cmds.attributeQuery('prevNode', node=node, exists=True):
            cmds.addAttr(
                node,
                longName='cadence_prevNode',
                shortName='prevNode',
                dataType='string',
                niceName='PrevNode')

        if not cmds.attributeQuery('nextNode', node=node, exists=True):
            cmds.addAttr(
                node,
                longName='cadence_nextNode',
                shortName='nextNode',
                dataType='string',
                niceName='NextNode')

        if prev:
            cmds.setAttr(node + '.prevNode', prev, type='string')
        if next:
            cmds.setAttr(node + '.nextNode', next, type='string')
Пример #7
0
    def build(cls):
        prints = cls.getTargets(2)
        if not prints or len(prints) < 2:
            return False

        prev = prints[0]
        for p in prints[1:]:
            if not cmds.attributeQuery(cls._PREVIOUS_PRINT_ATTR, node=p, exists=True):
                cmds.addAttr(longName=cls._PREVIOUS_PRINT_ATTR, attributeType='message')

            prevs = cls.getPrevious(p)
            if not prevs or prev not in prevs:
                cmds.connectAttr(prev + '.message', p + '.' + cls._PREVIOUS_PRINT_ATTR, force=True)

            prev = p

        return True
Пример #8
0
    def getPrevious(cls, target=None):
        if not target:
            target = cls.getTargets(1)[0]

        if not cmds.attributeQuery(cls._PREVIOUS_PRINT_ATTR, node=target, exists=True):
            return []

        conns = cmds.listConnections(
            target + '.' + cls._PREVIOUS_PRINT_ATTR,
            source=True,
            plugs=True
        )
        prevs = []
        if conns:
            for c in conns:
                if c.endswith('.message'):
                    prevs.append(c.split('.')[0])
            return prevs

        return []
Пример #9
0
 def isTrackNode(self, n):
     return cmds.attributeQuery(TrackPropEnum.SITE.name, node=n, exists=True)
Пример #10
0
 def isFootprint(cls, target):
     return cmds.attributeQuery(cls._PREVIOUS_PRINT_ATTR, node=target, exists=True)
Пример #11
0
    def buildScene(self):
        """Doc..."""

        groupItems = []
        hinds      = []
        fores      = []

        for c in self._data.getChannelsByKind(ChannelsEnum.POSITION):
            isHind = c.target in [TargetsEnum.LEFT_HIND, TargetsEnum.RIGHT_HIND]
            radius = 20 if isHind else 15
            res    = cmds.polySphere(radius=radius, name=c.target)
            groupItems.append(res[0])
            if isHind:
                hinds.append(res[0])
            else:
                fores.append(res[0])

            if c.target == TargetsEnum.LEFT_HIND:
                self._leftHind = res[0]
            elif c.target == TargetsEnum.RIGHT_HIND:
                self._rightHind = res[0]
            elif c.target == TargetsEnum.RIGHT_FORE:
                self._rightFore = res[0]
            elif c.target == TargetsEnum.LEFT_FORE:
                self._leftFore = res[0]

            for k in c.keys:
                frames = [
                    ['translateX', k.value.x, k.inTangentMaya[0], k.outTangentMaya[0]],
                    ['translateY', k.value.y, k.inTangentMaya[1], k.outTangentMaya[1]],
                    ['translateZ', k.value.z, k.inTangentMaya[2], k.outTangentMaya[2]]
                ]
                for f in frames:
                    cmds.setKeyframe(
                        res[0],
                        attribute=f[0],
                        time=k.time,
                        value=f[1],
                        inTangentType=f[2],
                        outTangentType=f[3]
                    )

                if k.event == 'land':
                    printResult = cmds.polyCylinder(
                        name=c.target + '_print1',
                        radius=radius,
                        height=(1.0 if isHind else 5.0)
                    )
                    cmds.move(k.value.x, k.value.y, k.value.z, printResult[0])
                    groupItems.append(printResult[0])

        cfg = self._data.configs
        name = 'cyc' + str(int(cfg.get(GaitConfigEnum.CYCLES))) + \
               '_ph' + str(int(cfg.get(GaitConfigEnum.PHASE))) + \
               '_gad' + str(int(cfg.get(SkeletonConfigEnum.FORE_OFFSET).z)) + \
               '_step' + str(int(cfg.get(SkeletonConfigEnum.STRIDE_LENGTH)))

        cube        = cmds.polyCube(name='pelvic_reference', width=20, height=20, depth=20)
        self._hips  = cube[0]
        groupItems.append(cube[0])
        cmds.move(0, 100, 0, cube[0])

        backLength = self._data.configs.get(SkeletonConfigEnum.FORE_OFFSET).z - \
                     self._data.configs.get(SkeletonConfigEnum.HIND_OFFSET).z

        cube2 = cmds.polyCube(name='pectoral_comparator', width=15, height=15, depth=15)
        cmds.move(0, 115, backLength, cube2[0])
        cmds.parent(cube2[0], cube[0], absolute=True)

        cmds.expression(
            string="%s.translateZ = 0.5*abs(%s.translateZ - %s.translateZ) + min(%s.translateZ, %s.translateZ)" %
            (cube[0], hinds[0], hinds[1], hinds[0], hinds[1])
        )

        cube = cmds.polyCube(name='pectoral_reference', width=15, height=15, depth=15)
        self._pecs = cube[0]
        groupItems.append(cube[0])
        cmds.move(0, 100, 0, cube[0])
        cmds.expression(
            string="%s.translateZ = 0.5*abs(%s.translateZ - %s.translateZ) + min(%s.translateZ, %s.translateZ)" %
            (cube[0], fores[0], fores[1], fores[0], fores[1])
        )

        self._group = cmds.group(*groupItems, world=True, name=name)

        cfg = self._data.configs
        info = 'Gait Phase: ' + \
                str(cfg.get(GaitConfigEnum.PHASE)) + \
                '\nGleno-Acetabular Distance (GAD): ' + \
                str(cfg.get(SkeletonConfigEnum.FORE_OFFSET).z) + \
                '\nStep Length: ' + \
                str(cfg.get(SkeletonConfigEnum.STRIDE_LENGTH)) + \
                '\nHind Duty Factor: ' + \
                str(cfg.get(GaitConfigEnum.DUTY_FACTOR_HIND)) + \
                '\nFore Duty Factor: ' + \
                str(cfg.get(GaitConfigEnum.DUTY_FACTOR_FORE)) + \
                '\nCycles: ' + \
                str(cfg.get(GaitConfigEnum.CYCLES))

        cmds.select(self._group)
        if not cmds.attributeQuery('notes', node=self._group, exists=True):
            cmds.addAttr(longName='notes', dataType='string')
            cmds.setAttr(self._group + '.notes', info, type='string')

        self.createShaders()
        self.createRenderEnvironment()

        minTime = min(0, int(cmds.playbackOptions(query=True, minTime=True)))

        deltaTime = cfg.get(GeneralConfigEnum.STOP_TIME) - cfg.get(GeneralConfigEnum.START_TIME)
        maxTime = max(
            int(float(cfg.get(GaitConfigEnum.CYCLES))*float(deltaTime)),
            int(cmds.playbackOptions(query=True, maxTime=True))
        )

        cmds.playbackOptions(
            minTime=minTime, animationStartTime=minTime, maxTime= maxTime, animationEndTime=maxTime
        )

        cmds.currentTime(0, update=True)

        cmds.select(self._group)