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 )
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')
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')
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')
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)
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')
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
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 []
def isTrackNode(self, n): return cmds.attributeQuery(TrackPropEnum.SITE.name, node=n, exists=True)
def isFootprint(cls, target): return cmds.attributeQuery(cls._PREVIOUS_PRINT_ATTR, node=target, exists=True)
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)