def generate(self): cmds.cycleCheck(e=False) self.rigWrist() self.setupIK() self.setupStretch() cmds.cycleCheck(e=True) self.m_isGenerated = True
def doOperation( self, operands ) : result = 'done' frameRange = operands['FrameRange']['range'].value meshPrimitives = operands["%sNodes" % self.prefix].value.split(',') tmpFileName = tempfile.mkstemp()[1] self.data['assetPath'] = "%sFrame%%d.mc" % tmpFileName self.data['multipleFiles'] = range(frameRange[0],frameRange[1]+1) self.data['nodes'] = meshPrimitives if m: m.cycleCheck(e=0) m.cacheFile( dtf =1, format ="OneFilePerFrame", fileName =os.path.basename(tmpFileName), directory =os.path.dirname(tmpFileName), cacheableNode =' '.join(meshPrimitives), st =frameRange[0], et =frameRange[1], ) # check if simulation finished susccefuly by looking for all the cached files! frames = self.data['multipleFiles'] if len(filter(lambda x: os.path.exists(self.data['assetPath']%x), frames)) != len(frames): raise Exception("Simulation was cancelled by user interaction or some other unknown issue. Asset not published!!") else: raise Exception("We can only publish nParticles from within maya!") return IECore.StringData( result )
def cycle_check(): """Check cycle check is disabled. Provided to avoid straight turning it off, which can be expensive. """ if cmds.cycleCheck(query=True, evaluation=True): cmds.cycleCheck(evaluation=False)
def doOperation(self, operands): result = 'done' frameRange = operands['FrameRange']['range'].value meshPrimitives = operands["%sNodes" % self.prefix].value.split(',') tmpFileName = tempfile.mkstemp()[1] self.data['assetPath'] = "%sFrame%%d.mc" % tmpFileName self.data['multipleFiles'] = range(frameRange[0], frameRange[1] + 1) self.data['nodes'] = meshPrimitives if m: m.cycleCheck(e=0) m.cacheFile( dtf=1, format="OneFilePerFrame", fileName=os.path.basename(tmpFileName), directory=os.path.dirname(tmpFileName), cacheableNode=' '.join(meshPrimitives), st=frameRange[0], et=frameRange[1], ) # check if simulation finished susccefuly by looking for all the cached files! frames = self.data['multipleFiles'] if len( filter( lambda x: os.path.exists(self.data['assetPath'] % x), frames)) != len(frames): raise Exception( "Simulation was cancelled by user interaction or some other unknown issue. Asset not published!!" ) else: raise Exception("We can only publish nParticles from within maya!") return IECore.StringData(result)
def create(self, objnum, shape="cone"): if shape == "cone": node = cmds.cone(ch=False, n='herdmemb') else: node = cmds.duplicate(shape, ic=True, n='herdmemb') cmds.addAttr(node, sn='fad', ln='frameAdjust', dv=0, k=True) values = herds().values() cmds.expression(s=("$herdvar = " + str(random.random() - 0.5) + " * " + self.leader + ".rnds + " + str(objnum) + ";\n" + "$randfac = " + self.leader + ".stry;\n" + "$foc = " + self.leader + ".lf;\n" + "if( $foc != 0 ) {\n" + "$randfac *= min( 1.0,abs($herdvar)*(1-$foc)/($foc*"+ str(values["population"]) +") );}\n" + "$herdvar = $herdvar * -" + self.leader + ".frameOffset + frame +" + node[0] + ".frameAdjust;\n" + "$offset = " + str(random.random() - 0.45) + " * $randfac;\n" + node[0] + ".tx = $offset + `getAttr -time $herdvar " + self.leader + ".tx`;\n" + "$offset = " + str(random.random() - 0.45) + " * $randfac;\n" + node[0] + ".ty = $offset + `getAttr -time $herdvar " + self.leader + ".ty`;\n" + "$offset = " + str(random.random() - 0.45) + " * $randfac;\n" + node[0] + ".tz = $offset + `getAttr -time $herdvar " + self.leader + ".tz`;\n" ), n=(node[0] + "_herd_exp")) # Turns off the checker for finding cycles - throws up lots of warnings without it. cmds.cycleCheck(e=True, all=False) self.node = node[0] self.point() return node
def release(self, *args): ''' Be careful overwriting the release method in child classes. Not closing the undo chunk leaves maya in a sorry state. ''' # close undo chunk and turn cycle check back on mc.undoInfo(closeChunk=True) mc.cycleCheck(evaluation=self.cycleCheck) mm.eval('SelectTool')
def update(arcTracer, forceUpdate=False): '''Populates an arcTracer with updated spacial information.''' # Get object to trace traceObj = getFirstConnection('%s.traceObj' % arcTracer, inAttr=1) if not traceObj: om.MGlobal.displayError('Trace object for arc tracer %s disappeared!' % arcTracer) return # Get selection so it can be restored later selection = cmd.ls(sl=1) # Hide everything but the trace obj in refresh mode if cmd.getAttr('%s.useRefreshMode' % arcTracer): cmd.select(traceObj) panels = cmd.getPanel(typ='modelPanel') panelsIsolated = [] for panel in panels: if not cmd.isolateSelect(panel, q=1, state=1): cmd.isolateSelect(panel, state=1) panelsIsolated.append(panel) pastFrames = cmd.getAttr('%s.pastFrames' % arcTracer) futureFrames = cmd.getAttr('%s.futureFrames' % arcTracer) # Disable cycle check since the update-frame expression causes a # cycle (apparently) try: # Only recent versions of maya can query the cycle check. cycleCheck = cmd.cycleCheck(q=1, e=1) except AttributeError: cycleCheck = 1 cmd.cycleCheck(e=0) currentFrame = cmd.currentTime(q=1) lastFrame = cmd.getAttr('%s.lastFrame' % arcTracer) timeShift = abs(lastFrame - currentFrame) if timeShift != 0 or forceUpdate: frameRange, direction = findFrameRange(pastFrames, futureFrames, currentFrame, lastFrame, timeShift, forceUpdate) arcPositions = getSavedArcPositions(arcTracer, timeShift, forceUpdate) # Get updated positions getUpdatedArcPositions(arcTracer, traceObj, frameRange, currentFrame, direction, arcPositions) # Set all positions setArcPositions(arcTracer, arcPositions, pastFrames, futureFrames, currentFrame) cmd.setAttr('%s.lastFrame' % arcTracer, currentFrame) cmd.cycleCheck(e=cycleCheck) # Restore isolation if cmd.getAttr('%s.useRefreshMode' % arcTracer): for panel in panelsIsolated: cmd.isolateSelect(panel, state=0) # Restore previous selection cmd.select(selection)
def run_app(self): """ Callback from when the menu is clicked. """ ## Tell the artist to be patient... eg not genY cmds.headsUpMessage("Building shotCam...", time = 1) inprogressBar = pbui.ProgressBarUI(title = 'Building Shotcam:') inprogressBar.show() ## Instantiate the API tk = sgtk.sgtk_from_path("T:/software/bubblebathbay") debug(app = self, method = 'run_app', message = 'API instanced...\n%s' % tk, verbose = False) debug(app = self, method = 'run_app', message = 'Fetch Shot Assets launched...', verbose = False) context = self.context ## To get the step debug(app = self, method = 'run_app', message = 'Context Step...\n%s' % context.step['name'], verbose = False) if context.step['name'] == 'Anm' or context.step['name'] == 'Blocking': inprogressBar.updateProgress(percent = 10, doingWhat = 'processing scene info...') cmds.cycleCheck(e = 1) ## Build an entity type to get some values from. entity = self.context.entity ## returns {'type': 'Shot', 'name': 'ep100_sh010', 'id': 1166} debug(app = self, method = 'run_app', message = 'entity... %s' % entity, verbose = False) ## Set the template to the maya publish folder shot_root_template = tk.templates[self.get_setting('shot_root_template')] debug(app = self, method = 'run_app', message = 'shot_root_template...\n%s' % shot_root_template, verbose = False) ## Now build the camera shotName = entity['name'] cameraName = '%s_shotCam' % shotName if self.doesAssetAlreadyExistInScene(cameraName): inprogressBar.updateProgress(percent = 100, doingWhat = 'Camera found...') inprogressBar.close() cmds.warning("Scene currently has a valid shotCamera in it! Aborting ...") QtGui.QMessageBox.information(None, "Scene currently has a valid shotCamera in it! Aborting ...") raise tank.TankError("Scene currently has a valid shotCamera in it! Aborting ...") else: inprogressBar.updateProgress(percent = 50, doingWhat = 'Building camera...') cmds.camera() cmds.rename('camera1', cameraName) self.tagShotCam(cameraName) ## Now set the default camera stuff up settings._setCameraDefaults(cameraName) settings._createCamGate(cameraName) ## Now set the renderGlobals up width = self.get_setting('movie_width') height = self.get_setting('movie_height') inprogressBar.updateProgress(percent = 90, doingWhat = 'Setting render globals...') settings._setRenderGlobals(width = width, height = height, animation = True) inprogressBar.updateProgress(percent = 100, doingWhat = 'Finished...') inprogressBar.close() cmds.headsUpMessage("shotCam built successfully...", time = 1) else: cmds.headsUpMessage("Current context is not a valid Shot context. Please make sure you are under a valid shotgun Shot context!", time = 2) cmds.warning("Current context is not a valid Shot context. Please make sure you are under a valid shotgun Shot context!") QtGui.QMessageBox.information(None, "Current context is not a valid Shot context. Please make sure you are under a valid shotgun Shot context!") raise tank.TankError("Current context is not a valid Shot context. Please make sure you are under a valid shotgun Shot context!")
def update(arcTracer, forceUpdate=False): '''Populates an arcTracer with updated spacial information.''' # Get object to trace traceObj = getFirstConnection('%s.traceObj' % arcTracer, inAttr=1) if not traceObj: om.MGlobal.displayError('Trace object for arc tracer %s disappeared!' % arcTracer) return # Get selection so it can be restored later selection = cmd.ls(sl=1) # Hide everything but the trace obj in refresh mode if cmd.getAttr('%s.useRefreshMode' % arcTracer): cmd.select(traceObj) panels = cmd.getPanel(typ='modelPanel') panelsIsolated = [] for panel in panels: if not cmd.isolateSelect(panel, q=1, state=1): cmd.isolateSelect(panel, state=1) panelsIsolated.append(panel) pastFrames = cmd.getAttr('%s.pastFrames' % arcTracer) futureFrames = cmd.getAttr('%s.futureFrames' % arcTracer) # Disable cycle check since the update-frame expression causes a # cycle (apparently) try: # Only recent versions of maya can query the cycle check. cycleCheck = cmd.cycleCheck(q=1, e=1) except AttributeError: cycleCheck = 1 cmd.cycleCheck(e=0) currentFrame = cmd.currentTime(q=1) lastFrame = cmd.getAttr('%s.lastFrame' % arcTracer) timeShift = abs(lastFrame - currentFrame) if timeShift != 0 or forceUpdate: frameRange, direction = findFrameRange(pastFrames, futureFrames, currentFrame, lastFrame, timeShift, forceUpdate) arcPositions = getSavedArcPositions(arcTracer, timeShift, forceUpdate) # Get updated positions getUpdatedArcPositions(arcTracer, traceObj, frameRange, currentFrame, direction, arcPositions) # Set all positions setArcPositions(arcTracer, arcPositions, pastFrames, futureFrames, currentFrame) cmd.setAttr('%s.lastFrame' % arcTracer, currentFrame) cmd.cycleCheck(e=cycleCheck) # Restore isolation if cmd.getAttr('%s.useRefreshMode' % arcTracer): for panel in panelsIsolated: cmd.isolateSelect(panel, state=0) # Restore previous selection cmd.select(selection)
def generate(self): cmds.cycleCheck(e=False) if self.m_rigWrist: self.rigWrist() self.setupElbowTwist() self.setupStretch() cmds.cycleCheck(e=True) self.m_isGenerated = True
def release(self, *args): ''' Called when the mouse button is released, and cleans up after the tool. Be careful overwriting the release method in child classes. Not closing the undo chunk leaves maya in a sorry state. ''' # close undo chunk and turn cycle check back on mc.undoInfo(closeChunk=True) mc.cycleCheck(evaluation=True) mm.eval('SelectTool')
def _undofunc(*args, **kwargs): try: # start an undo chunk cmds.undoInfo(ock=True) cmds.cycleCheck(e=False) return func(*args, **kwargs) finally: # after calling the func, end the undo chunk and undo cmds.undoInfo(cck=True) cmds.cycleCheck(e=True)
def __exit__(self, *args): #reset settings mc.cycleCheck(evaluation=self.resetCycleCheck) mc.autoKeyframe(state=self.resetAutoKey) if self.sel: mc.select(self.sel) self.isolate(False)
def generate(self): cmds.cycleCheck(e=False) self.rigShoulder() self.rigElbow() self.rigWrist() #-- Weird fix --# cmds.orientConstraint( self.m_joints.m_shoulder, self.m_joints.m_wrist, mo=1 ) cmds.cycleCheck(e=True) self.m_isGenerated = True
def __enter__(self): self.sel = mc.ls(sl=True) self.modelPanels = mc.getPanel(type='modelPanel') self.isolate(True) mc.select(clear=True) #save and turn off settings that might print to the script editor self.resetCycleCheck = mc.cycleCheck(query=True, evaluation=True) mc.cycleCheck(evaluation=False) self.resetAutoKey = mc.autoKeyframe(query=True, state=True) mc.autoKeyframe(state=False)
def press(self, *args): ''' Be careful overwriting the press method in child classes, because of the undoInfo openChunk ''' self.anchorPoint = mc.draggerContext(self.draggerContext, query=True, anchorPoint=True) self.button = mc.draggerContext(self.draggerContext, query=True, button=True) #dragString # This makes it so the script editor doesn't get spammed by a cycle in the puppet mc.cycleCheck(evaluation=False) # This turns off the undo queue until we're done dragging, so we can undo it. mc.undoInfo(openChunk=True)
def __init__(self, name = 'mlDraggerContext', title = 'Dragger', defaultValue=0, minValue=None, maxValue=None, multiplier=0.01, cursor='hand' ): self.multiplier = multiplier self.defaultValue = defaultValue self.minValue = minValue self.maxValue = maxValue self.cycleCheck = mc.cycleCheck(query=True, evaluation=True) self.draggerContext = name if not mc.draggerContext(self.draggerContext, exists=True): self.draggerContext = mc.draggerContext(self.draggerContext) mc.draggerContext(self.draggerContext, edit=True, pressCommand=self.press, dragCommand=self.drag, releaseCommand=self.release, cursor=cursor, drawString=title, undoMode='all' )
def connectAllWithOceanHeightAttr(object = ''): """ Find and attach everything in the scene which has an oceanHeightHook attribute to the ocean """ inprogressBar = pbui.ProgressBarUI(title = 'Hooking To Ocean:') inprogressBar.show() inprogressBar.updateProgress(percent = 0, doingWhat = 'Hooking everything to ocean now...') debug(None, method = 'connectAllWithOceanHeightAttr', message = 'Rebuilding Ocean Hooks', verbose = False) ## Find all in scene with oceanHeightHook Attribute ## Setup the progress bar if not cmds.objExists('Shot_FX_hrc'): cmds.group(n = 'Shot_FX_hrc', em = True) if not cmds.objExists('BOAT_OceanLocators_hrc'): cmds.group(n = 'BOAT_OceanLocators_hrc', em = True) cmds.parent('BOAT_OceanLocators_hrc', 'Shot_FX_hrc') cmds.setAttr('BOAT_OceanLocators_hrc.visibility', 0) ## Clean up existing hooks in the scene inprogressBar.updateProgress(percent = 50, doingWhat = 'Cleaning up now..') if object.startswith('All'): object = '' elif object.startswith('Dock'): object = 'BLD' elif object.startswith('Boat'): object = 'CHAR' elif object.startswith('Prop'): object = 'PROP' cleanUpExisting(filters = [object]) if object == 'BLD': ## Clean-up the ADEF BLD's oceanHook control animatable groups... [cmds.delete(transform) for transform in cmds.ls(type = 'transform') if transform.endswith('_oceanCtrls_hrc')] ## Rebuild / build the hooks for boats in the scene inprogressBar.updateProgress(percent = 75, doingWhat = 'performHookBoatsToOcean now..') startTime = time.time() performHookBoatsToOcean() print 'TOTAL TIME FOR performHookBoatsToOcean: %s' % (time.time()-startTime) ## Now make sure cycle check is off because it's a fn pita cmds.cycleCheck(e = 0) _finished(inprogressBar)
def connect_arm(self, arm_comp): if not cmds.pluginInfo("rotationDriver.py", q=True, loaded=True): cmds.loadPlugin("rotationDriver.py", quiet=True) if not cmds.pluginInfo("maya-math-nodes.mll", q=True, loaded=True): cmds.loadPlugin("maya-math-nodes.mll", quiet=True) cycle = cmds.cycleCheck(q=True, evaluation=True) try: cmds.cycleCheck(evaluation=False) self.insert_dummy_arm(arm_comp) self.add_arm_connection_attr(arm_comp) self.add_arm_connection_object(arm_comp) self.reparent_arm_hierarchy(arm_comp) self.set_softik_dummy(arm_comp) except Exception: import traceback as tb tb.print_exc() tb.print_stack() finally: cycle = cmds.cycleCheck(evaluation=cycle)
def generate(self): cmds.cycleCheck(e=False) # -- Duplicate joints and rename for IK-FK switch --- # self.m_bindJoints = self.duplicateJoints(self.m_startJoints, "BIND") rc.addToLayer(self.m_sceneData, "ref", self.m_bindJoints[0]) self.m_ikJoints = self.duplicateJoints(self.m_startJoints, "IK") rc.addToLayer(self.m_sceneData, "ref", self.m_ikJoints[0]) self.m_fkJoints = self.duplicateJoints(self.m_startJoints, "FK") rc.addToLayer(self.m_sceneData, "ref", self.m_fkJoints[0]) # -- Create shoulder locator -- # self.m_shoulderLocator = self.m_name+"_shoulder_CTRL" self.m_shoulderLocator = cmds.spaceLocator(n=self.m_shoulderLocator)[0] rc.addToLayer(self.m_sceneData, "detailCtrl", self.m_shoulderLocator) rc.orientControl(self.m_shoulderLocator, self.m_startJoints.m_shoulder) shoulderGRPs = rg.add3Groups( self.m_shoulderLocator, ["_SDK", "_CONST", "_0"] ) cmds.parent(shoulderGRPs[-1], self.m_group) # -- Setup FK rig -- # tmpList = self.m_fkJoints.getJointList() self.m_fkRig = fk.FKArmRig(self.m_sceneData, tmpList, self.m_name+"_FK", self.m_baseName) self.m_fkRig.generate() cmds.parent(self.m_fkRig.m_group, self.m_group) cmds.parentConstraint( self.m_shoulderLocator, self.m_fkRig.getMainTransform(), mo=True ) # -- Setup IK rig -- # tmpList = self.m_ikJoints.getJointList() self.m_ikRig = ik.IKArmRig( self.m_sceneData, tmpList, self.m_name+"_IK", self.m_baseName, self.m_isMirrored, self.m_twistAxis ) self.m_ikRig.generate() cmds.parent(self.m_ikRig.m_group, self.m_group) cmds.pointConstraint( self.m_shoulderLocator, self.m_ikRig.getMainTransform(), mo=True ) # -- Setup BIND rig -- # tmpList = self.m_bindJoints.getJointList() self.m_bindRig = bind.BINDArmRig( self.m_sceneData, tmpList, self.m_name+"_BIND", self.m_baseName, self.m_blendControl, self.m_numUpperControls, self.m_numLowerControls, self.m_numUpperJoints, self.m_numLowerJoints, self.m_upperStretchJoints, self.m_lowerStretchJoints, self.m_isMirrored, self.m_twistAxis, self.m_rigWrist ) self.m_bindRig.generate() cmds.parent(self.m_bindRig.m_group, self.m_group) cmds.pointConstraint( self.m_shoulderLocator, self.m_bindRig.getMainTransform(), mo=True ) # rig the blend control for aestethics if self.m_rigWrist: self.rigBlendControl(self.m_bindRig.getWristCtrl()) # -- Connect up rigs -- # try: tmp = self.m_blendControl except: self.m_blendControl = self.createBlendControl() self.connectIKFK() # -- Setup visibility -- # self.setupVisibility() cmds.cycleCheck(e=True) # Add all controls rc.addToControlDict( self.m_allControls, "%s_shoulderLocator" %(self.m_baseName), self.m_shoulderLocator ) rc.addDictToControlDict(self.m_allControls, self.m_fkRig.getAllControls()) rc.addDictToControlDict(self.m_allControls, self.m_ikRig.getAllControls()) rc.addDictToControlDict(self.m_allControls, self.m_bindRig.getAllControls()) self.m_isGenerated = True
def maya_came(): cmds.cycleCheck(e=0) stm = cmds.playbackOptions(q=True, minTime=True) etm = cmds.playbackOptions(q=True, maxTime=True) timRg = etm - stm + 1 cames = cmds.ls(sl=True) cmds.polyCube(name='locS_') cmds.delete('locS_*') localS = [] for i in cames: loco1 = cmds.spaceLocator(name=i) loco1New = cmds.rename('locS_' + loco1[0]) cmds.addAttr(longName='FlimOffset', attributeType='double2') cmds.addAttr(longName='XX', attributeType='double', parent='FlimOffset') cmds.addAttr(longName='YY', attributeType='double', parent='FlimOffset') cmds.addAttr(longName='focal', attributeType='float') cmds.addAttr(longName='view', attributeType='float') cmds.addAttr(longName='hF', attributeType='float') cmds.addAttr(longName='ox', attributeType='float') cmds.addAttr(longName='oy', attributeType='float') localS.append(loco1New) for i2 in range(0, int(timRg + 1), 1): cons = 0 for i3 in cames: cmds.select(i3) caT = cmds.xform(q=1, ws=1, t=1) caR = cmds.xform(q=1, ws=1, ro=1) hfa = cmds.camera(i3, q=True, hfa=True) vfa = cmds.camera(i3, q=True, vfa=True) hfo = cmds.camera(i3, q=True, hfo=True) vfo = cmds.camera(i3, q=True, vfo=True) horHo = hfo / hfa vorHo = vfo / hfa cFL = cmds.camera(cames[cons], q=True, fl=True) view = cmds.camera(cames[cons], q=True, hfv=True) hfa = cmds.camera(cames[cons], q=True, hfa=True) cmds.setAttr(localS[cons] + '.XX', (horHo * -1)) cmds.setAttr(localS[cons] + '.YY', (vorHo * -1)) cmds.setAttr(localS[cons] + '.focal', cFL) cmds.setAttr(localS[cons] + '.view', view) cmds.setAttr(localS[cons] + '.hF', hfa) cmds.setAttr(localS[cons] + '.ox', hfo) cmds.setAttr(localS[cons] + '.oy', vfo) cmds.setAttr(localS[cons] + '.tx', caT[0]) cmds.setAttr(localS[cons] + '.ty', caT[1]) cmds.setAttr(localS[cons] + '.tz', caT[2]) cmds.setAttr(localS[cons] + '.rx', caR[0]) cmds.setAttr(localS[cons] + '.ry', caR[1]) cmds.setAttr(localS[cons] + '.rz', caR[2]) cmds.setKeyframe(localS[cons], at='XX') cmds.setKeyframe(localS[cons], at='YY') cmds.setKeyframe(localS[cons], at='focal') cmds.setKeyframe(localS[cons], at='view') cmds.setKeyframe(localS[cons], at='hF') cmds.setKeyframe(localS[cons], at='ox') cmds.setKeyframe(localS[cons], at='oy') cmds.setKeyframe(localS[cons], at='rz') cmds.setKeyframe(localS[cons], at='tx') cmds.setKeyframe(localS[cons], at='ty') cmds.setKeyframe(localS[cons], at='tz') cmds.setKeyframe(localS[cons], at='rx') cmds.setKeyframe(localS[cons], at='ry') cmds.setKeyframe(localS[cons], at='rz') cons = cons + 1 cmds.currentTime(stm + i2) cmds.currentTime(stm)
def armGeneration(self, jointAmounts): curveName = 'advancedCurve1' for each in range(jointAmounts): mc.joint(p=(each, 0, 0)) mc.joint(n='advanced_' + str(each + 1) + '_JNT', e=True, rad=0.5, oj='xyz', sao='yup') mc.curve(n=curveName, p=[(0, 0, 0), (jointAmounts - 1, 0, 0)], d=1) mc.ikHandle(sj='advanced_1_JNT', ee='advanced_' + jointAmounts + '_JNT', c='advancedCurve1', p=2, w=.5, ccv=False, scv=False, sol='ikSplineSolver', tws="Linear", roc=True, pcv=False) start = mc.spaceLocator(n='Start') mc.move(0, 1, 0) end = mc.spaceLocator(n='End') mc.move(jointAmounts - 1, 1, 0) mc.select('ikHandle1') mc.setAttr("ikHandle1.dTwistControlEnable", 1) mc.setAttr("ikHandle1.dWorldUpType", 2) mc.connectAttr('Start.xformMatrix', 'ikHandle1.dWorldUpMatrix') mc.connectAttr('End.xformMatrix', 'ikHandle1.dWorldUpMatrixEnd') mc.select(clear=True) mc.joint(n='joint1Con', p=(0, 0, 0)) mc.joint(n='joint2Con', p=(jointAmounts - 1, 0, 0)) #create cluster degree = mc.getAttr('advancedCurve1.degree') span = mc.getAttr('advancedCurve1.spans') CVAmount = degree + span for eachCV in range(CVAmount): mc.select('advancedCurve1.cv[' + str(eachCV) + ']') mc.cluster(en=1) #mc.parentConstraint('joint1Con','Start',mo = True) mc.parentConstraint('joint2Con', 'End', mo=True) mc.cycleCheck(e=False) mc.parentConstraint('joint1Con', 'cluster1Handle') mc.parentConstraint('joint2Con', 'cluster2Handle') #ignore X Axis of Twisting mc.select(clear=True) mc.joint(n='joint1Aim', p=(0, 0, 0), rad=0.7) mc.parentConstraint('joint1Aim', 'Start', mo=True) mc.connectAttr('joint1Con.rotateZ', 'joint1Aim.rotateZ') mc.connectAttr('joint1Con.rotateY', 'joint1Aim.rotateY') #stretch joint mc.select(curveName) mc.arclen(curveName, ch=True) mc.delete(all=True, e=True) for each in range(jointAmounts): mc.expression(o='advanced_' + str(each + 1) + '_JNT', s='scaleX=curveInfo1.arcLength/' + 'jointAmounts-1')
def create(self): mc.cycleCheck(e=False) if mc.objExists(self.parent): self.group=mc.createNode('transform',n=uniqueNames(self.name),p=self.parent) else: self.group=mc.createNode('transform',n=uniqueNames(self.name)) self.jointParent='' if len(iterable(mc.listRelatives(self.joints[0],p=True)))>0: self.jointParent=mc.listRelatives(self.joints[0],p=True)[0] else: self.jointParent=mc.createNode('transform',n=uniqueNames(self.name+'CtrlJointGroup')) mc.parent(self.joints[0],self.jointParent) cMuscleObjects=[] # create control joints self.ctrlJoints=[] for j in self.joints: cj=mc.createNode('joint',p=j,n=uniqueNames(self.name+'CtrlJoint')) if len(self.ctrlJoints)==0: mc.parent(cj,self.group) if mc.objExists(self.jointParent): self.jointParent=mc.rename(ParentSpace(cj,self.jointParent)[0],self.name+'CtrlJoints') else: self.jointParent=mc.rename(ParentSpace(cj)[0],self.name+'CtrlJoints') else: mc.parent(cj,self.ctrlJoints[-1]) mc.setAttr(cj+'.r',*mc.getAttr(j+'.r')[0]) mc.setAttr(cj+'.jo',*mc.getAttr(j+'.jo')[0]) self.originalRotations[cj+'.r']=list(mc.getAttr(cj+'.r')[0]) mc.setAttr(j+'.r',0,0,0) mc.setAttr(cj+'.r',0,0,0) mc.setAttr(cj+'.s',1,1,1) mc.setAttr(cj+'.radius',mc.getAttr(j+'.radius')*1.5)#0) mc.setAttr(cj+'.ovc',10) mc.connectAttr(j+'.pa',cj+'.pa') if self.joints.index(j)<len(self.joints)-1: childList=removeAll\ ( iterable(mc.listRelatives(self.joints[self.joints.index(j)+1],c=True,ad=True))+[self.joints[self.joints.index(j)+1]], iterable(mc.listRelatives(j,c=True,ad=True))+[j] ) chList=childList for c in chList: if mc.nodeType(c) not in ['transform','joint','cMuscleObject']: childList.remove(c) if mc.nodeType(c) in ['transform','joint']: for a in ['.t','.tx','.ty','.tz','.r','.rx','.ry','.rz']: if mc.connectionInfo(c+a,id=True) or mc.getAttr(c+a,l=True) or mc.getAttr(c+'.io'): childList.remove(c) break if j==self.joints[-2]: childList.append(self.joints[-1]) for jc in childList: if mc.nodeType(jc)=='transform' or mc.nodeType(jc)=='joint': if jc in self.joints[:-1]: mc.parentConstraint(cj,jc,mo=True) else: mc.parentConstraint(cj,jc,sr=('x','y','z'),mo=True) elif 'cMuscle' in mc.nodeType(jc): cMuscleObjects.append(jc) else: mc.parentConstraint(cj,j,st=('x','y','z'),mo=True) self.ctrlJoints.append(cj) mc.hide(self.jointParent) mc.setAttr(self.ctrlJoints[1]+'.ssc',False) # create ik self.ikHandle,self.endEffector=mc.ikHandle(sol='ik2Bsolver',sj=self.ctrlJoints[0],ee=self.ctrlJoints[-1],n=uniqueNames(self.name+'Handle')) self.endEffector=mc.rename(self.endEffector,self.name+'Effector') mc.setAttr(self.ikHandle+'.snapEnable',False) mc.hide(self.ikHandle) mc.setAttr(self.ikHandle+'.ikBlend',0) for j in self.originalRotations: if isIterable(self.originalRotations[j]): mc.setAttr(j,*self.originalRotations[j]) else: mc.setAttr(j,self.originalRotations[j]) # look for twist joints if self.twist: skipAxis=removeAll(self.orientAxis,['x','y','z']) twistJoints=removeAll([self.joints[-2],self.joints[-1]],hierarchyBetween(self.joints[-2],self.joints[-1],type='joint')) for i in range(0,len(twistJoints)): tj=twistJoints[i] oc=mc.orientConstraint(self.ctrlJoints[-1],tj,sk=skipAxis,mo=True) if i>0: oc=mc.orientConstraint(self.ctrlJoints[-2],tj,sk=skipAxis,mo=True) wal=mc.orientConstraint(oc,q=True,wal=True) distToBend=distanceBetween(self.ctrlJoints[-2],tj) distToEnd=distanceBetween(self.ctrlJoints[-1],tj) mc.setAttr(oc+'.'+wal[-1],distToEnd/(distToBend+distToEnd)) mc.setAttr(oc+'.'+wal[-2],distToBend/(distToBend+distToEnd)) # make stretchy db=mc.createNode('distanceBetween') mc.connectAttr(self.ctrlJoints[0]+'.t',db+'.p1') pmm1=mc.createNode('pointMatrixMult') pmm2=mc.createNode('pointMatrixMult') mc.connectAttr(self.ikHandle+'.t',pmm1+'.ip') mc.connectAttr(self.ikHandle+'.pm[0]',pmm1+'.im') mc.connectAttr(pmm1+'.o',pmm2+'.ip') mc.connectAttr(self.ctrlJoints[0]+'.pim[0]',pmm2+'.im') mc.connectAttr(pmm2+'.o',db+'.p2') mdl=mc.createNode('multDoubleLinear') mc.connectAttr(db+'.d',mdl+'.i1') mc.setAttr(mdl+'.i2',1.0/mc.getAttr(db+'.d')) cn=mc.createNode('clamp') for i in range(0,3): c=['r','g','b'][i] a=['x','y','z'][i] mc.connectAttr(mdl+'.o',cn+'.ip'+c) mc.setAttr(cn+'.mn'+c,1) mc.connectAttr(mdl+'.o',cn+'.mx'+c) mc.connectAttr(cn+'.op'+c,self.ctrlJoints[0]+'.s'+a) for cmo in cMuscleObjects: mdlcm=mc.createNode('multDoubleLinear') mc.setAttr(mdlcm+'.i1',mc.getAttr(cmo+'.length')) mc.connectAttr(cn+'.op'+['r','g','b'][['x','y','z'].index(self.orientAxis)],mdlcm+'.i2') mc.connectAttr(mdlcm+'.o',cmo+'.length') # create control objects or set control object pivots poleOffset=distanceBetween(self.ctrlJoints[1],self.ctrlJoints[0])*2 for i in range(0,len(self.controlObjects)-1): if mc.objExists(self.controlObjects[i]): mc.xform(self.controlObjects[i],ws=True,piv=mc.xform(self.ctrlJoints[-1],q=True,ws=True,rp=True)) else: if 'r' not in self.handleOptions[i] and 'radius' not in self.handleOptions[i]: self.handleOptions[i]['r']=distanceBetween(self.ctrlJoints[-1],self.ctrlJoints[0])/4 if 'name' not in self.handleOptions[i] and 'n' not in self.handleOptions[i]: self.handleOptions[i]['n']=self.joints[i]+'_ctrl' if 'x' not in self.handleOptions[i] and 'xform' not in self.handleOptions[i]: self.handleOptions[i]['xform']=self.joints[i] if 'aim' not in self.handleOptions[i] and 'a' not in self.handleOptions[i]: self.handleOptions[i]['aim']=self.aimVector self.handleOptions[i]['parent']=self.group self.handleOptions[-i]['pointTo']=self.joints[i] self.handleOptions[i]['aimAt']=self.joints[i] self.handles.append(Handle(**self.handleOptions[i])) self.controlObjects[i]=(self.handles[-1].transforms[-1]) if not mc.objExists(self.controlObjects[-1]): if 'name' not in self.handleOptions[-1] and 'n' not in self.handleOptions[-1]: self.handleOptions[-1]['n']=self.joints[1]+'_aimCtrl' if 'x' not in self.handleOptions[-1] and 'xform' not in self.handleOptions[-1]: self.handleOptions[-1]['x']=self.ctrlJoints[1] if 'aim' not in self.handleOptions[i] and 'a' not in self.handleOptions[i]: self.handleOptions[i]['aim']=self.poleVector self.handleOptions[-1]['parent']=self.group self.handleOptions[-1]['pointTo']=self.joints[1] self.handleOptions[-1]['aimAt']=self.joints[1] self.handles.append(Handle(**self.handleOptions[-1])) self.controlObjects[-1]=(self.handles[-1].transforms[-1]) mc.move\ ( poleOffset*(self.poleVector[0]), poleOffset*(self.poleVector[1]), poleOffset*(self.poleVector[2]), self.controlObjects[-1], r=True,os=True,wd=True ) # add and set control attributes mc.setAttr(self.controlObjects[-1]+'.v',k=False) for attr in ['.sx','.sy','.sz']: mc.setAttr(self.controlObjects[-1]+attr,l=True,k=False,cb=False) mc.setAttr(self.ikHandle+attr,l=True,k=False,cb=False) for attr in ['.rx','.ry','.rz']: mc.setAttr(self.controlObjects[-1]+attr,k=False,cb=False) for attr in ['.tx','.ty','.tz']: mc.setAttr(self.group+attr,l=True,k=False,cb=False) mc.setAttr(self.controlObjects[0]+attr,l=True,k=False,cb=False) mc.setAttr(self.ikHandle+'.v',k=False,cb=False) for attr in ['.tx','.ty','.tz']: mc.setAttr(self.controlObjects[1]+attr,l=True,k=False,cb=False) if not mc.objExists(self.controlObjects[-2]+'.twist'): mc.addAttr(self.controlObjects[-2],at='doubleAngle',ln='twist',k=True) if not mc.objExists(self.controlObjects[-2]+'.sway') and self.sway: mc.addAttr(self.controlObjects[-2],at='doubleAngle',ln='sway',k=1) if not mc.objExists(self.controlObjects[-2]+'.stretch'): mc.addAttr(self.controlObjects[-2],at='double',ln='stretch',k=1,dv=self.stretch,min=0) if not mc.objExists(self.controlObjects[-2]+'.squash'): mc.addAttr(self.controlObjects[-2],at='double',ln='squash',k=1,dv=self.squash,min=0,max=99) if not mc.objExists(self.controlObjects[-2]+'.ikSwitch'): mc.addAttr(self.controlObjects[-2],at='enum',ln='ikSwitch',en='ik:fk',k=True,dv=1)# if self.switch=='fk' else 0 #sway control if self.sway: adl=mc.createNode('addDoubleLinear') mc.connectAttr(self.ctrlJoints[1]+'.r'+self.poleAxis,adl+'.i1') mc.connectAttr(self.controlObjects[-2]+'.sway',adl+'.i2') childList=removeAll\ ( iterable(mc.listRelatives(self.joints[2],c=True,ad=True)), iterable(mc.listRelatives(self.joints[1],c=True,ad=True)) )+[self.joints[2],self.joints[1]] for c in childList: if mc.nodeType(c)=='transform' or mc.nodeType(c)=='joint': pc=mc.parentConstraint(c,q=True) nc=listNodeConnections(self.ctrlJoints[1],pc,s=True,d=True) for conn in nc: if conn[0]==self.ctrlJoints[1]+'.rotate': mc.disconnectAttr(conn[0],conn[1]) for a in removeAll(self.poleAxis,['x','y','z']): mc.connectAttr(conn[0]+a.upper(),conn[1]+a.upper(),f=True) mc.connectAttr(adl+'.o',conn[1]+self.poleAxis.upper(),f=True) # ik/fk switch for i in range(0,3): c=['r','g','b'][i] a=['x','y','z'][i] adl=mc.createNode('addDoubleLinear') mdl1=mc.createNode('multDoubleLinear') mc.setAttr(mdl1+'.i2',.01) mdl2=mc.createNode('multDoubleLinear') mc.setAttr(mdl2+'.i2',.01) revNode=mc.createNode('reverse') mc.setAttr(adl+'.i1',1) mc.connectAttr( mdl1+'.o',adl+'.i2') mc.connectAttr(self.controlObjects[-2]+'.stretch',mdl1+'.i1') mc.connectAttr( mdl2+'.o',revNode+'.ix') mc.connectAttr(self.controlObjects[-2]+'.squash',mdl2+'.i1') mc.connectAttr(adl+'.o',cn+'.mx'+c,f=True) mc.connectAttr(revNode+'.ox',cn+'.mn'+c,f=True) if not mc.objExists(self.controlObjects[-2]+'.zenPreviousIKState'): if self.switch=='fk': mc.addAttr(self.controlObjects[-2],at='long',ln='zenPreviousIKState',k=0,dv=1) else: mc.addAttr(self.controlObjects[-2],at='long',ln='zenPreviousIKState',k=0,dv=0) if not mc.objExists(self.controlObjects[-2]+'.zenPreviousIKParent'): if self.switch=='fk': mc.addAttr(self.controlObjects[-2],at='long',ln='zenPreviousIKParent',k=0,dv=1) else: mc.addAttr(self.controlObjects[-2],at='long',ln='zenPreviousIKParent',k=0,dv=0) for i in range(0,2): for c in mc.listRelatives(self.controlObjects[i],s=True): mc.connectAttr(self.controlObjects[-2]+'.ikSwitch',c+'.v') mc.connectAttr(self.controlObjects[-2]+'.twist',self.ikHandle+'.twist') rev=mc.createNode('reverse') mc.connectAttr(self.controlObjects[-2]+'.ikSwitch',rev+'.ix') mc.connectAttr(rev+'.ox',self.ikHandle+'.ikBlend') for c in mc.listRelatives(self.controlObjects[-1],s=True): mc.connectAttr(rev+'.ox',c+'.v') # parent spaces for i in [0,1,2]: if(mc.objExists(self.jointParent)and i in [0,2]): ParentSpace(self.controlObjects[i],self.jointParent) else: ParentSpace(self.controlObjects[i],self.controlObjects[i-1]) ParentSpace(self.controlObjects[-1],self.controlObjects[-2]) if mc.objExists(self.jointParent): ParentSpace(self.controlObjects[-1],self.jointParent).setParent(self.jointParent) ParentSpace(self.controlObjects[-2],self.jointParent).setParent(self.jointParent) else: ParentSpace(self.controlObjects[-1],self.controlObjects[0]) if self.switch=='fk': ParentSpace(self.controlObjects[2],self.controlObjects[1]) for co in self.controlObjects[2:]: freeze(co,t=True) mc.aimConstraint\ ( self.ctrlJoints[1],self.controlObjects[-1], aim=(self.aimVector[0],self.aimVector[1],self.aimVector[2]), wuo=self.ctrlJoints[1], wut='objectrotation', mo=True ) if mc.objExists(self.jointParent): mc.setAttr(self.controlObjects[0]+'.parentTo',l=True,k=False,cb=False) mc.setAttr(self.controlObjects[1]+'.parentTo',l=True,k=False,cb=False) #constraints orientConstraints=['','',''] for i in [2,1,0]: orientConstraints[i]=mc.orientConstraint(self.controlObjects[i],self.ctrlJoints[i],mo=True)[0] mc.setAttr(self.controlObjects[i]+'.v',k=False) for attr in ['.sx','.sy','.sz']: mc.setAttr(self.controlObjects[i]+attr,l=True,k=False,cb=False) if i==1: if not self.sway: mc.setAttr(self.controlObjects[i]+'.r'+self.poleAxis,l=True,k=False,cb=False) mc.setAttr(self.controlObjects[i]+'.r'+self.orientAxis,l=True,k=False,cb=False) self.poleVectorConstraint=mc.poleVectorConstraint(self.controlObjects[-1],self.ikHandle)[0] for oc in orientConstraints[:-1]: octl=mc.orientConstraint(oc,q=True,tl=True) ocwal=mc.orientConstraint(oc,q=True,wal=True) weightAlias=ocwal[octl.index(self.controlObjects[orientConstraints.index(oc)])] mc.connectAttr(self.controlObjects[-2]+'.ikSwitch',oc+'.'+weightAlias) mc.parent(self.ikHandle,self.controlObjects[2],r=False) if self.switch=='ik': mc.setAttr(self.controlObjects[-2]+'.ikSwitch',0) # link for asset detection if 'zenIkFkLimbCtrls' not in mc.listAttr(self.group): mc.addAttr(self.group,ln='zenIkFkLimbCtrls',at='message',m=True) if 'zenIkFkLimbCtrlJoints' not in mc.listAttr(self.group): mc.addAttr(self.group,ln='zenIkFkLimbCtrlJoints',at='message',m=True) for co in self.controlObjects: if 'zenCtrl' not in mc.listAttr(co): mc.addAttr(co,ln='zenCtrl',at='message') mc.connectAttr(co+'.zenCtrl',self.group+'.zenIkFkLimbCtrls['+str(firstOpenPlug(self.group+'.zenIkFkLimbCtrls'))+']') for cj in self.ctrlJoints: if 'zenCtrl' not in mc.listAttr(cj): mc.addAttr(cj,ln='zenCtrl',at='message') mc.connectAttr(cj+'.zenCtrl',self.group+'.zenIkFkLimbCtrlJoints['+str(firstOpenPlug(self.group+'.zenIkFkLimbCtrlJoints'))+']') for bp in self.bindPoses: for co in self.controlObjects: mc.dagPose(co,a=True,n=bp) self[:]=[self.group]+self.controlObjects mc.cycleCheck(e=True) mc.select(self[-2])
def organizeSystem(self, arcSystem): smooth = arcSystem["values"]["smooth"][0] translate = arcSystem["values"]["translate"] rotate = arcSystem["values"]["rotate"] scale = arcSystem["values"]["scale"] rotateWire = arcSystem["values"]["rotateWire"][0] # create group of all the arc elements cmds.select(None, r = True) for mesh in arcSystem["arcs"]: cmds.select(arcSystem["arcs"][mesh][0], add = True) cmds.select(arcSystem["arcs"][mesh][1], add = True) arcSystemGroup = cmds.group(n = "arcSystem_GRP") arcExpression = "// arcs expression\n" # add global smooth attribute cmds.addAttr(arcSystemGroup, longName='globalSmooth', at="long", defaultValue=smooth, min=0, max=6) # add global translate attribute cmds.addAttr(arcSystemGroup, longName='globalSlide', defaultValue=translate[2], min=-40, max=40) # add global rotate attribute cmds.addAttr(arcSystemGroup, longName='globalRotate', attributeType = "double3" ) cmds.addAttr(arcSystemGroup, longName='rX', attributeType="double", parent='globalRotate') cmds.addAttr(arcSystemGroup, longName='rY', attributeType="double", parent='globalRotate') cmds.addAttr(arcSystemGroup, longName='rZ', attributeType="double", parent='globalRotate') cmds.setAttr(arcSystemGroup+".globalRotate", rotate[0], rotate[1], rotate[2], type="double3") # add global scale attribute cmds.addAttr(arcSystemGroup, longName='globalScale', attributeType = "double3" ) cmds.addAttr(arcSystemGroup, longName='sX', attributeType="double", parent='globalScale') cmds.addAttr(arcSystemGroup, longName='sY', attributeType="double", parent='globalScale') cmds.addAttr(arcSystemGroup, longName='sZ', attributeType="double", parent='globalScale') cmds.setAttr(arcSystemGroup+".globalScale", scale[0], scale[1], scale[2], type="double3") cmds.addAttr(arcSystemGroup, longName='globalRotateWire', defaultValue=rotateWire) for mesh in arcSystem["arcs"]: wireGroup = [wireGroup for wireGroup in cmds.listConnections(cmds.listRelatives(mesh)) if cmds.nodeType(wireGroup) == "groupId"][0] wireNode = [wireNode for wireNode in cmds.listConnections(wireGroup) if cmds.nodeType(wireNode) == "wire"][0] # add visibility attr cmds.addAttr(arcSystemGroup, longName=mesh+'Visibility', nn="Visibility", at="bool", defaultValue=True) # add attributes per mesh translateAttr cmds.addAttr(arcSystemGroup, longName=mesh+'Slide', defaultValue=translate[2], min=-40, max=40) # rotateAttr cmds.addAttr(arcSystemGroup, longName=mesh+'Rotate', attributeType="double3") cmds.addAttr(arcSystemGroup, longName=mesh+'rX', attributeType="double", parent=mesh+'Rotate') cmds.addAttr(arcSystemGroup, longName=mesh+'rY', attributeType="double", parent=mesh+'Rotate') cmds.addAttr(arcSystemGroup, longName=mesh+'rZ', attributeType="double", parent=mesh+'Rotate') # scaleAttr cmds.addAttr(arcSystemGroup, longName=mesh+'Scale', attributeType="double3") cmds.addAttr(arcSystemGroup, longName=mesh+'sX', attributeType="double", parent=mesh+'Scale') cmds.addAttr(arcSystemGroup, longName=mesh+'sY', attributeType="double", parent=mesh+'Scale') cmds.addAttr(arcSystemGroup, longName=mesh+'sZ', attributeType="double", parent=mesh+'Scale') # add expression to link meshes to the arc group arcExpression += arcSystem['arcs'][mesh][4]+".divisions = "+arcSystemGroup+".globalSmooth;\n" arcExpression += wireNode+".rotation = "+arcSystemGroup+".globalRotateWire;\n" arcExpression += mesh+".translateZ = "+arcSystemGroup+".globalSlide + "+arcSystemGroup+"."+mesh+"Slide;\n" arcExpression += mesh+".rotateX = "+arcSystemGroup+".rX + "+arcSystemGroup+"."+mesh+"rX;\n" arcExpression += mesh+".rotateY = "+arcSystemGroup+".rY + "+arcSystemGroup+"."+mesh+"rY;\n" arcExpression += mesh+".rotateZ = "+arcSystemGroup+".rZ + "+arcSystemGroup+"."+mesh+"rZ;\n" arcExpression += mesh+".scaleX = "+arcSystemGroup+".sX + "+arcSystemGroup+"."+mesh+"sX;\n" arcExpression += mesh+".scaleY = "+arcSystemGroup+".sY + "+arcSystemGroup+"."+mesh+"sY;\n" arcExpression += mesh+".scaleZ = "+arcSystemGroup+".sZ + "+arcSystemGroup+"."+mesh+"sZ;\n" arcExpression += mesh+".visibility = "+arcSystemGroup+"."+mesh+"Visibility;\n" # set expression globalSlideExpr = cmds.expression(n = arcSystemGroup+"_expression", s = arcExpression) cmds.cycleCheck(e = False)
"default":True },{ "name":"displayAffected", "command":"cmds.displayAffected(onOff)", "default":False },{ "name":"undoQueue", "command":"if onOff: cmds.undoInfo( state=True, infinity=False, length=300)", "default":True },{ "name":"scrubbingUndo", "command":"commandsMod.scrubbingUndo(onOff)", "default":True },{ "name":"zoomTowardsCenter", "command":"cmds.dollyCtx('dollyContext', edit=True, dollyTowardsCenter=onOff)", "default":cmds.dollyCtx('dollyContext', query=True, dollyTowardsCenter=True) },{ "name":"cycleCheck", "command":"cmds.cycleCheck(evaluation=onOff)", "default":cmds.cycleCheck(query=True, evaluation=True) }] class GeneralTools_Gui(uiMod.BaseSubUI): def createLayout(self): mainLayout = cmds.rowLayout(numberOfColumns=6, parent=self.parentLayout) #manipulator orientation #cmds.iconTextButton("manipOrientButton", style='textOnly', label='-', h=self.hb, annotation="Selected objects", command=updateManipOrient) #launchManipOrient()
def run_app(self): """ Callback from when the menu is clicked. """ ## Tell the artist to be patient... eg not genY inprogressBar = pbui.ProgressBarUI(title='Fetching all shot assets:') inprogressBar.show() inprogressBar.updateProgress(percent=5, doingWhat='Processing scene info...') #self.dbWrap = DoubleBarrel #self.sg = doubleBarrelWrapper._getShotgunObject(self.dbWrap, self) ## Instantiate the API tk = sgtk.sgtk_from_path("T:/software/bubblebathbay") debug(app=self, method='run_app', message='API instanced...\n%s' % tk, verbose=False) debug(app=self, method='run_app', message='Fetch Shot Assets launched...', verbose=False) context = self.context ## To get the step debug(app=self, method='run_app', message='context: %s' % context, verbose=False) debug(app=self, method='run_app', message='context Step...%s' % context.step['name'], verbose=False) if context.step['name'] == 'Anm' or context.step[ 'name'] == 'Blocking' or context.step['name'] == 'Light': ## Build an entity type to get some values from. entity = self.context.entity ## returns {'type': 'Shot', 'name': 'ep100_sh010', 'id': 1166} debug(app=self, method='run_app', message='entity... %s' % entity, verbose=False) ## Filter for the matching ID for the shot sg_filters = [["id", "is", entity["id"]]] debug(app=self, method='run_app', message='sg_filters... %s' % sg_filters, verbose=False) ## Build an entity type to get some values from. sg_entity_type = self.context.entity["type"] ## returns Shot debug(app=self, method='run_app', message='sg_entity_type...\n%s' % sg_entity_type, verbose=False) ## DATA #import time #start = time.time() data = self.shotgun.find_one(sg_entity_type, filters=sg_filters, fields=['assets']) #data = self.dbWrap.find_one(self.sg, sg_entity_type, sg_filters, ['assets']) #print 'TIME: %s' % (time.time()-start) debug(app=self, method='run_app', message='Assets...\n%s' % data['assets'], verbose=False) ## Set the template to the maya publish folder maya_assetRootTemplate = tk.templates[self.get_setting( 'sg_AssetTemplate')] debug(app=self, method='run_app', message='Asset template...\n%s' % maya_assetRootTemplate, verbose=False) ### NOTE: ### ALL CHARS MUST BE RIGGED ### ALL PROPS MUST BE RIGGED ### ALL BLDS SHOULD BE PUBLISHED TO AN ENV as well as ALL LND ### ALL ROOT_HRC GROUPS SHOULD BE CASE SENSITIVE SUCH AS CHAR_Sydney_hrc ## Set model panel to show None before fetch asset modelPanels = cmds.getPanel(type='modelPanel') if modelPanels: [ cmds.modelEditor(mp, edit=True, allObjects=False) for mp in modelPanels ] debug(app=self, method='run_app', message='Looping assets now...', verbose=False) for eachAsset in data['assets']: ## Turn this into the shotgun friendly name for the fileNames as underscores are not permitted in shotgun filenames for some obscure reason. debug(app=self, method='run_app', message='eachAsset[name]...\n%s' % eachAsset['name'], verbose=False) inprogressBar.updateProgress(percent=50, doingWhat='Fetching Assets...') x = 50 if 'CHAR' in eachAsset["name"]: x = x + 5 inprogressBar.updateProgress( percent=x, doingWhat='Fetching Char Assets...') self.processAsset(tk=tk, eachAsset=eachAsset, RIG=True, MDL=False, ENV=False, CHAR=True, BLD=False, PROP=False, templateFile=maya_assetRootTemplate) elif 'PROP' in eachAsset["name"]: x = x + 5 inprogressBar.updateProgress( percent=x, doingWhat='Fetching Prop Assets...') self.processAsset(tk=tk, eachAsset=eachAsset, RIG=True, MDL=False, ENV=False, CHAR=False, BLD=False, PROP=True, templateFile=maya_assetRootTemplate) elif 'ENV' in eachAsset["name"]: x = x + 5 inprogressBar.updateProgress( percent=x, doingWhat='Fetching Env Assets...') self.processAsset(tk=tk, eachAsset=eachAsset, RIG=False, MDL=True, ENV=True, CHAR=False, BLD=False, PROP=False, templateFile=maya_assetRootTemplate) elif 'BLD' in eachAsset["name"]: x = x + 5 inprogressBar.updateProgress( percent=x, doingWhat='Fetching Env Assets...') self.processAsset(tk=tk, eachAsset=eachAsset, RIG=True, MDL=False, ENV=False, CHAR=False, BLD=True, PROP=False, templateFile=maya_assetRootTemplate) else: debug(app=self, method='run_app', message='Invalid Asset Type...\n%s' % eachAsset['name'], verbose=False) pass ## Set all AD to None [ cmds.assembly(each, edit=True, active='') for each in cmds.ls(type='assemblyReference') ] ## Set model panel to show All if modelPanels: [ cmds.modelEditor(mp, edit=True, allObjects=True) for mp in modelPanels ] debug(app=self, method='run_app', message='Moving on to save working scene...', verbose=False) inprogressBar.updateProgress(percent=75, doingWhat='Setting Render Globals...') ## Now make sure the scene is set to pal and cm and renderglobals settings._setRenderGlobals(animation=True) ## Now save the working scene inprogressBar.updateProgress(percent=90, doingWhat='Saving vers up scene...') shotName = entity['name'] debug(app=self, method='run_app', message='shotName...\n%s' % shotName, verbose=False) work_template = tk.templates['shot_work_area_maya'] debug(app=self, method='run_app', message='work_template...\n%s' % work_template, verbose=False) ## context.step['name'] = Blocking try: debug(app=self, method='run_app', message="Shot: %s" % shotName, verbose=False) debug(app=self, method='run_app', message="context.step: %s" % context.step['name'], verbose=False) debug(app=self, method='run_app', message='Trying to fetch pathToWorking now...', verbose=False) pathToWorking = r'%s' % tk.paths_from_template( work_template, { "Shot": shotName, "Step": context.step['name'] })[0] pathToWorking.replace('\\\\', '\\') debug(app=self, method='run_app', message='pathToWorking...\n%s' % pathToWorking, verbose=False) except: ## There are NO working files yet so we have to handle this propelry ## This needs to be the root folder and 000 for version up\ ## we need to find the sequence from the workspaces index0 of this is default getWorkspace = cmds.workspace( listWorkspaces=True )[1] # Result: [u'default', u'I:/lsapipeline/episodes/eptst/eptst_sh060/Blck/work/maya'] getSequence = getWorkspace.split('/')[4] work_path = work_template.apply_fields({ 'Sequence': getSequence, 'Shot': shotName, 'Step': context.step['name'] }) debug(app=self, method='run_app', message='New work_path: %s' % work_path, verbose=False) pathToWorking = r"%s" % work_template ## Scan the folder and find the highest version number fileShotName = "".join(shotName.split('_')) or '' debug(app=self, method='run_app', message='fileShotName...\n%s' % fileShotName, verbose=False) padding = '' debug(app=self, method='run_app', message='padding...\n%s' % padding, verbose=False) versionNumber = '' debug(app=self, method='run_app', message='versionNumber...\n%s' % versionNumber, verbose=False) if os.path.exists(pathToWorking): debug(app=self, method='run_app', message='Path to working exists...', verbose=False) getfiles = os.listdir(pathToWorking) debug(app=self, method='run_app', message='getfiles...\n%s' % getfiles, verbose=False) ## Remove the stupid Keyboard folder if it exists.. thx autodesk.. not if 'Keyboard' in getfiles: getfiles.remove('Keyboard') ## Process a clean list now.. trying to remove from the current list is giving me grief and I'm too fn tired to care... finalFiles = [] for each in getfiles: if each.split('.')[0] == fileShotName: finalFiles.append(each) else: pass debug(app=self, method='run_app', message='finalFiles...\n%s' % finalFiles, verbose=False) if finalFiles: highestVersFile = max(finalFiles) debug(app=self, method='run_app', message='highestVersFile...\n%s' % highestVersFile, verbose=False) versionNumber = int( highestVersFile.split('.')[1].split('v')[1]) + 1 debug(app=self, method='run_app', message='versionNumber...\n%s' % versionNumber, verbose=False) else: versionNumber = 1 debug(app=self, method='run_app', message='versionNumber...\n%s' % versionNumber, verbose=False) ## Now pad the version number if versionNumber < 10: padding = '00' elif versionNumber < 100: padding = '0' else: padding = '' debug(app=self, method='run_app', message='padding...\n%s' % padding, verbose=False) ## Rename the file renameTo = '%s.v%s%s' % (fileShotName, padding, versionNumber) debug(app=self, method='run_app', message='renameTo...\n%s' % renameTo, verbose=False) ## Now save the file cmds.file(rename=renameTo) cmds.file(save=True, force=True, type='mayaAscii') cmds.headsUpMessage("Assets retrieved successfully...", time=1) cmds.cycleCheck(e=0) inprogressBar.updateProgress(percent=100, doingWhat='Finished') inprogressBar.close() else: debug(app=self, method='run_app', message='Invalid Path to working, skipping save...', verbose=False) inprogressBar.close() cmds.headsUpMessage( "Scene not saved. This is most likely due to a first time load of blocking/anim fetch...\nUse Shotgun saveAs now...", time=2) else: inprogressBar.close() cmds.headsUpMessage( "Current context is not a valid Shot context. Please make sure you are under a valid shotgun Shot context!", time=2)
def sk_bkPerform(self, preFrame = 10 , posFrame = 10 , simulation = 1 , animType = 2 ,step = 1 ): import time mc.cycleCheck(evaluation = 0) # 路径动画 print u'\n=================【%s】开始处理================='%(u'路径动画') print u'---开始时间.:%s'%(time.strftime("%Y-%m-%d %H:%M:%S")) print u'---请耐心等待...\n' self.sk_bakeMotionPaths() print u'---结束时间.:%s'%(time.strftime("%Y-%m-%d %H:%M:%S")) print u'=================【%s】处理完毕=================\n'%(u'路径动画') # 寻找非参考的约束物体 constrainAllInfos = self.sk_constraintsObjsGet() constrainTargets = constrainAllInfos[0] constrainNodes = constrainAllInfos[1] # 约束BK print u'\n=================【%s】开始处理================='%(u'约束类型') print u'---开始时间.:%s'%(time.strftime("%Y-%m-%d %H:%M:%S")) print u'---待处理数量:%s'%(str(len(constrainTargets))) print u'---请耐心等待...\n' self.sk_bkCore(constrainTargets , preFrame = preFrame , posFrame = posFrame , simulation = 1 , step = step ) print u'---结束时间.:%s'%(time.strftime("%Y-%m-%d %H:%M:%S")) print u'=================【%s】处理完毕=================\n'%(u'约束类型') # 删除约束 constraintConfigs = [x for x in (constrainNodes) if not mc.referenceQuery(x,inr=1)] for cons in constraintConfigs: ref = mc.referenceQuery(cons,isNodeReferenced = 1) if not ref: mc.delete(cons) nurbsCurves = mc.ls(type = 'nurbsCurve',l = 1) needCtrls = [] attrs = ['.tx','.ty','.tz','.rx','.ry','.rz','.sx','.sy','.sz','.v'] if nurbsCurves: ctrlCurves = mc.listRelatives(nurbsCurves,ap = 1, type = 'transform',f = 1) for obj in ctrlCurves: if not mc.ls(obj): continue # bk过的不处理 if obj in constrainTargets: continue # 对于没有动的控制器特殊处理,为动画曲线导出做准备 if self.sk_curveSpecialCheck(obj): mc.setKeyframe(obj) continue # 控制器处理,处理方案1 if animType == 1: settable = 0 # 只处理有keyable属性的 for attr in attrs: state = mc.getAttr((obj + attr),settable = 1 ) if state: settable = 1 if settable: break if settable: needCtrls.append(obj) # 控制器处理,处理方法2:只处理动画层影响的控制器 if animType == 2: animLayers = mc.ls(type = 'animLayer') if animLayers: checkObjs = mc.listConnections(animLayers,type = 'transform') if checkObjs: needCtrls = list(set(checkObjs)) print u'\n=================【%s】开始处理================='%(u'控制器类型') print u'---开始时间.:%s'%(time.strftime("%Y-%m-%d %H:%M:%S")) print u'---待处理数量:%s'%(str(len(needCtrls))) print u'---请耐心等待...\n' if needCtrls: self.sk_bkCore(needCtrls , preFrame , posFrame , simulation,step= step) print u'---结束时间.:%s'%(time.strftime("%Y-%m-%d %H:%M:%S")) print u'=================【%s】处理完毕=================\n'%(u'控制器类型') # 备份文件 fileName = mc.file(q=1,exn = 1) #newName = fileName.split('.')[0] + '_baked.' + fileName.split('.')[-1] #mc.file(rename = newName) #mc.file(s = 1 ,f = 1) print u'\n=================【All Done!!!】=================\n'
birth : Makes the particle visible on its birth frame death : Scales down the particle to 0 at the end of its lifetime bake : Combines all animation layers emitCurve : Emits particles from a curve followCurve : Animates a trail of particles following a curve planeEmit : Emits particles from a plane reloadFile : Reloads Maya scene to free memory and increase performance In this module, one of the functions is called with a particle list. Those particles are then individually animated using a combination of the class specific functions. ''' import maya.cmds as cmds import random cmds.cycleCheck(e=0) cmds.autoKeyframe(state=0) class particles(): '''Contains procedures to animate individual particles and stores their unique variables''' def __init__(self,name): '''Saves the object's name to an instance of the class''' self.name=name def explode(self,start,duration,distance): ''' Emits a particle along its local Y axis with decreasing speed start : Start of emission frame duration : Number of frames to reach final destination
def constrain_body(self, reverse=False): root_obj = self.setting_module.root nodes = [] mc_namespace = self.ui.mc_ns_line.text() + ":" _nodes = self._get_nsObjs(mc_namespace) nodes.extend(cmds.ls(_nodes, type="transform")) nodes.extend(cmds.ls(_nodes, type="joint")) f_frame_set = set() l_frame_set = set() for _node in nodes: f_frame_set.add(cmds.findKeyframe(_node, w="first")) l_frame_set.add(cmds.findKeyframe(_node, w="last")) f_frame = min(f_frame_set) l_frame = max(l_frame_set) trans_list = ["translateX", "translateY", "translateZ"] rot_list = ["rotateX", "rotateY", "rotateZ"] for _node in reversed(nodes): for _attr in rot_list: cmds.setKeyframe(str(_node) + "." + _attr, v=0, t=(f_frame - 5)) if _node == root_obj: for _attr in trans_list: cmds.setKeyframe(str(_node) + "." + _attr, v=0, t=(f_frame - 5)) # Constrainパート cmds.currentTime(f_frame - 5) results = {} consts = [] mc_ns = self.ui.mc_ns_line.text() rh_ns = self.ui.rh_ns_line.text() if mc_ns != "": mc_ns = mc_ns + ":" if rh_ns != "": rh_ns = rh_ns + ":" for table_dict in self.table_list: const = table_dict["const"] rh = table_dict["RH"] mc = table_dict["MC"] cmds.setAttr("{}.rotate".format(mc), 0, 0, 0) if mc.split(":")[-1] == "root_MCJNT": cmds.setAttr("{}.translate".format(mc), 0, 0, 0) if reverse == True: if mc.split(":")[-1] in ["ankle_MCJNT_L", "ankle_MCJNT_R"]: print "########################" cmds.parentConstraint("{}ankle_MCJNT_R".format(mc_ns), "{}reverseFoot_ctrl_R".format(rh_ns), mo=True) cmds.parentConstraint("{}ankle_MCJNT_L".format(mc_ns), "{}reverseFoot_ctrl_L".format(rh_ns), mo=True) print "########################" continue const_type, const = self.exec_const(const, rh, mc) consts.extend(const) results.setdefault(const_type, []).append(rh) cmds.currentTime(f_frame) # Bakeパート cmds.cycleCheck(e=False) bakelist = [] # parent if "parent" in results: attrs = trans_list + rot_list bakelist.extend(self._cana_composer(results["parent"], attrs)) # orient if "orient" in results: attrs = rot_list bakelist.extend(self._cana_composer(results["orient"], attrs)) # point if "point" in results: attrs = trans_list bakelist.extend(self._cana_composer(results["point"], attrs)) sampling = float(self.ui.sampling_line.text()) cmds.bakeResults(bakelist, t=(f_frame, l_frame), ral=True, sm=1, sb=sampling) cmds.cycleCheck(e=True) cmds.delete(consts)
mc.select(clear=True) mc.joint(n='joint1Con', p=(0, 0, 0)) mc.joint(n='joint2Con', p=(5 - 1, 0, 0)) #create cluster degree = mc.getAttr('advancedCurve1.degree') span = mc.getAttr('advancedCurve1.spans') CVAmount = degree + span for eachCV in range(CVAmount): mc.select('advancedCurve1.cv[' + str(eachCV) + ']') mc.cluster(en=1) #mc.parentConstraint('joint1Con','Start',mo = True) mc.parentConstraint('joint2Con', 'End', mo=True) mc.cycleCheck(e=False) mc.parentConstraint('joint1Con', 'cluster1Handle') mc.parentConstraint('joint2Con', 'cluster2Handle') #ignore X Axis of Twisting mc.select(clear=True) mc.joint(n='joint1Aim', p=(0, 0, 0), rad=0.7) mc.parentConstraint('joint1Aim', 'Start', mo=True) mc.connectAttr('joint1Con.rotateZ', 'joint1Aim.rotateZ') mc.connectAttr('joint1Con.rotateY', 'joint1Aim.rotateY') mc.parent('joint1Aim', 'joint1Con') #stretch joint mc.select(curveName) mc.setAttr(curveName + '.inheritsTransform', 0) mc.arclen(curveName, ch=True)
def Main_Side(self, side): sign = 1 sideindex = 0 if side == "L": sign = 1 sideindex = 0 else: sign = -1 sideindex = 1 # Eye self.CreatePrixyNode(self.Proxies_Eyes[sideindex], PC=self.Proxies_Head, mMvoe=[0.57 * sign, 1.53, 1.64], isConnect=True) # Arm Clavicle = self.Proxies_Clavicles[sideindex] self.CreatePrixyNode(Clavicle, PC=self.Proxies_SpineTop, mMvoe=[sign * 1.25, 0.5, 0], isConnect=True, isParent=True) Shoulder = self.Proxies_Shoulders[sideindex] self.CreatePrixyNode(Shoulder, PC=Clavicle, mMvoe=[sign * 1.7, 0, 0], isConnect=True, isParent=True) Elbow = self.Proxies_Elbows[sideindex] self.CreatePrixyNode(Elbow, PC=Shoulder, mMvoe=[sign * 3.5, 0, 0], isConnect=True) Wrist = self.Proxies_Wrists[sideindex] self.CreatePrixyNode(Wrist, PC=Elbow, mMvoe=[sign * 3.5, 0, 0], isConnect=True) ElbowG = Elbow + "_GRP" cmds.group(n=ElbowG, em=True) PCons = cmds.pointConstraint(Elbow, ElbowG) cmds.delete(PCons) cmds.parent(Elbow, ElbowG) cmds.makeIdentity(ElbowG, apply=True, t=1, r=1, s=1) cmds.move(0, 0, 0.001, "%s.scalePivot" % ElbowG, "%s.rotatePivot" % ElbowG, r=True) cmds.pointConstraint(Shoulder, Wrist, ElbowG, mo=True) cmds.parent(ElbowG, Wrist, self.Main) Palm = self.Proxies_Palms[sideindex] self.CreatePrixyNode(Palm, PC=Wrist, mMvoe=[sign * 0.7, 0, 0], mScale=[0.7, 0.7, 0.7], lScale=[0.175, 0.175, 0.175], isConnect=True, isParent=True) # Hand if self.thumbsOn: ThumbJ1 = self.Proxies_Thumbs[sideindex][0] self.CreatePrixyNode(ThumbJ1, PC=Wrist, mMvoe=[sign * 0.45, 0, 0.51], mScale=[0.75, 0.75, 0.75], lScale=[0.1875, 0.1875, 0.1875], isConnect=True, isParent=True) ThumbJ2 = self.Proxies_Thumbs[sideindex][1] self.CreatePrixyNode(ThumbJ2, PC=ThumbJ1, mMvoe=[sign * 0, 0, 0.75], mScale=[0.75, 0.75, 0.75], lScale=[0.1875, 0.1875, 0.1875], isConnect=True, isParent=True) ThumbJ3 = self.Proxies_Thumbs[sideindex][2] self.CreatePrixyNode(ThumbJ3, PC=ThumbJ2, mMvoe=[sign * 0, 0, 0.75], mScale=[0.75, 0.75, 0.75], lScale=[0.1875, 0.1875, 0.1875], isConnect=True, isParent=True) ThumbJTip = self.Proxies_Thumbs[sideindex][3] self.CreatePrixyNode(ThumbJTip, PC=ThumbJ3, mMvoe=[sign * 0, 0, 0.75], mScale=[0.75, 0.75, 0.75], lScale=[0.1875, 0.1875, 0.1875], isConnect=True, isParent=True) FingerList = self.Proxies_Fingers[sideindex] jointindex = 0 for i, Finger in enumerate(FingerList): FingerJ1 = Finger[jointindex] if i == 0: self.ProxyBase(FingerJ1) PCons = cmds.pointConstraint(Wrist, FingerJ1) cmds.delete(PCons) cmds.move(sign * 1.47, 0, 0, FingerJ1, r=True, os=True, wd=True) if self.fingersNum == 2: cmds.move(0, 0, 0.25, FingerJ1, r=True) cmds.makeIdentity(FingerJ1, apply=True, t=1, r=1, s=1) elif self.fingersNum >= 3: cmds.move(0, 0, 0.5, FingerJ1, r=True) cmds.makeIdentity(FingerJ1, apply=True, t=1, r=1, s=1) else: FingerJ0 = FingerList[i - 1][0] self.ProxyBase(FingerJ1) PCons = cmds.pointConstraint(FingerJ0, FingerJ1) cmds.delete(PCons) cmds.move(0, 0, -0.4, FingerJ1, r=True, os=True, wd=True) cmds.scale(0.62, 0.62, 0.62, FingerJ1) cmds.makeIdentity(FingerJ1, apply=True, t=1, r=1, s=1) cmds.setAttr("%sSnapShape.localScaleX" % FingerJ1, 0.155) cmds.setAttr("%sSnapShape.localScaleY" % FingerJ1, 0.155) cmds.setAttr("%sSnapShape.localScaleZ" % FingerJ1, 0.155) cmds.parent(FingerJ1, Palm) self.ProxyConnectors(Palm, FingerJ1) FingerJ2 = Finger[1] self.CreatePrixyNode(FingerJ2, PC=FingerJ1, mMvoe=[sign * 0.61, 0, 0], mScale=[0.62, 0.62, 0.62], lScale=[0.155, 0.155, 0.155], isConnect=True, isParent=True) FingerJ3 = Finger[2] self.CreatePrixyNode(FingerJ3, PC=FingerJ2, mMvoe=[sign * 0.61, 0, 0], mScale=[0.62, 0.62, 0.62], lScale=[0.155, 0.155, 0.155], isConnect=True, isParent=True) FingerJTip = Finger[3] self.CreatePrixyNode(FingerJTip, PC=FingerJ3, mMvoe=[sign * 0.61, 0, 0], mScale=[0.62, 0.62, 0.62], lScale=[0.155, 0.155, 0.155], isConnect=True, isParent=True) cmds.makeIdentity(Wrist, apply=True, t=1, r=1, s=1) # Leg Hip = self.Proxies_Hips[sideindex] self.CreatePrixyNode(Hip, PC=self.Proxies_Root, mMvoe=[sign * 1.72, -0.8, 0], isConnect=True, isParent=True) Knee = self.Proxies_Knees[sideindex] self.CreatePrixyNode(Knee, PC=Hip, mMvoe=[0, -6.4, 0], mRotate=[0, 180, 90], isConnect=True, isParent=True) Ankle = self.Proxies_Ankles[sideindex] self.CreatePrixyNode(Ankle, PC=Knee, mMvoe=[0, -6.4, 0], isConnect=True, isParent=True) Ball = self.Proxies_Balls[sideindex] self.CreatePrixyNode(Ball, PC=Ankle, mMvoe=[0, -1.65, 2.26], isConnect=True, isParent=True) Toe = self.Proxies_Toes[sideindex] self.CreatePrixyNode(Toe, PC=Ball, mMvoe=[0, 0, 1.7]) if self.toesNum == 1: self.ProxyConnectors(Ball, Toe) BallG = Ball + "_GRP" cmds.group(n=BallG, em=True) cmds.parent(BallG, Ball) cmds.parent(Toe, BallG) KneeLocator = Knee + "_Locator" cmds.spaceLocator(n=KneeLocator) PCons = cmds.pointConstraint(Knee, KneeLocator) cmds.delete(PCons) cmds.parent(KneeLocator, Knee) cmds.move(0, 0, 1.5, KneeLocator, r=True) cmds.setAttr("%s.v" % KneeLocator, 0) # toe num cmds.makeIdentity(Ball, apply=True, t=1, r=1, s=1) KneeG = Knee + "_GRP" cmds.group(n=KneeG, em=True) PCons = cmds.pointConstraint(Knee, KneeG) cmds.delete(PCons) cmds.parent(Knee, KneeG) cmds.makeIdentity(KneeG, apply=True, t=1, r=1, s=1) cmds.move(0, 0, 0.001, "%s.scalePivot" % KneeG, "%s.rotatePivot" % KneeG, r=True) cmds.cycleCheck(e=0) cmds.pointConstraint(Hip, Ankle, KneeG, mo=True) cmds.cycleCheck(e=1) cmds.parent(KneeG, Ankle, self.Main) pass
def run_app(self): """ Callback from when the menu is clicked. """ ## Tell the artist to be patient... eg not genY inprogressBar = pbui.ProgressBarUI(title = 'Fetching all shot assets:') inprogressBar.show() inprogressBar.updateProgress(percent = 5, doingWhat = 'Processing scene info...') #self.dbWrap = DoubleBarrel #self.sg = doubleBarrelWrapper._getShotgunObject(self.dbWrap, self) ## Instantiate the API tk = sgtk.sgtk_from_path("T:/software/bubblebathbay") debug(app = self, method = 'run_app', message = 'API instanced...\n%s' % tk, verbose = False) debug(app = self, method = 'run_app', message = 'Fetch Shot Assets launched...', verbose = False) context = self.context ## To get the step debug(app = self, method = 'run_app', message = 'context: %s' % context, verbose = False) debug(app = self, method = 'run_app', message = 'context Step...%s' % context.step['name'], verbose = False) if context.step['name'] == 'Anm' or context.step['name'] == 'Blocking' or context.step['name'] == 'Light': ## Build an entity type to get some values from. entity = self.context.entity ## returns {'type': 'Shot', 'name': 'ep100_sh010', 'id': 1166} debug(app = self, method = 'run_app', message = 'entity... %s' % entity, verbose = False) ## Filter for the matching ID for the shot sg_filters = [["id", "is", entity["id"]]] debug(app = self, method = 'run_app', message = 'sg_filters... %s' % sg_filters, verbose = False) ## Build an entity type to get some values from. sg_entity_type = self.context.entity["type"] ## returns Shot debug(app = self, method = 'run_app', message = 'sg_entity_type...\n%s' % sg_entity_type, verbose = False) ## DATA #import time #start = time.time() data = self.shotgun.find_one(sg_entity_type, filters=sg_filters, fields=['assets']) #data = self.dbWrap.find_one(self.sg, sg_entity_type, sg_filters, ['assets']) #print 'TIME: %s' % (time.time()-start) debug(app = self, method = 'run_app', message = 'Assets...\n%s' % data['assets'], verbose = False) ## Set the template to the maya publish folder maya_assetRootTemplate = tk.templates[self.get_setting('sg_AssetTemplate')] debug(app = self, method = 'run_app', message = 'Asset template...\n%s' % maya_assetRootTemplate, verbose = False) ### NOTE: ### ALL CHARS MUST BE RIGGED ### ALL PROPS MUST BE RIGGED ### ALL BLDS SHOULD BE PUBLISHED TO AN ENV as well as ALL LND ### ALL ROOT_HRC GROUPS SHOULD BE CASE SENSITIVE SUCH AS CHAR_Sydney_hrc ## Set model panel to show None before fetch asset modelPanels = cmds.getPanel(type = 'modelPanel') if modelPanels: [cmds.modelEditor(mp, edit = True, allObjects = False) for mp in modelPanels] debug(app = self, method = 'run_app', message = 'Looping assets now...', verbose = False) for eachAsset in data['assets']: ## Turn this into the shotgun friendly name for the fileNames as underscores are not permitted in shotgun filenames for some obscure reason. debug(app = self, method = 'run_app', message = 'eachAsset[name]...\n%s' % eachAsset['name'], verbose = False) inprogressBar.updateProgress(percent = 50, doingWhat = 'Fetching Assets...') x = 50 if 'CHAR' in eachAsset["name"]: x = x + 5 inprogressBar.updateProgress(percent = x, doingWhat = 'Fetching Char Assets...') self.processAsset(tk = tk, eachAsset = eachAsset, RIG = True, MDL = False, ENV = False, CHAR = True, BLD = False, PROP = False, templateFile = maya_assetRootTemplate) elif 'PROP' in eachAsset["name"]: x = x + 5 inprogressBar.updateProgress(percent = x, doingWhat = 'Fetching Prop Assets...') self.processAsset(tk = tk, eachAsset = eachAsset, RIG = True, MDL = False, ENV = False, CHAR = False, BLD = False, PROP = True, templateFile = maya_assetRootTemplate) elif 'ENV' in eachAsset["name"]: x = x + 5 inprogressBar.updateProgress(percent = x, doingWhat = 'Fetching Env Assets...') self.processAsset(tk = tk, eachAsset = eachAsset, RIG = False, MDL = True, ENV = True, CHAR = False, BLD = False, PROP = False, templateFile = maya_assetRootTemplate) elif 'BLD' in eachAsset["name"]: x = x + 5 inprogressBar.updateProgress(percent = x, doingWhat = 'Fetching Env Assets...') self.processAsset(tk = tk, eachAsset = eachAsset, RIG = True, MDL = False, ENV = False, CHAR = False, BLD = True, PROP = False, templateFile = maya_assetRootTemplate) else: debug(app = self, method = 'run_app', message = 'Invalid Asset Type...\n%s' % eachAsset['name'], verbose = False) pass ## Set all AD to None [cmds.assembly(each, edit = True, active = '') for each in cmds.ls(type = 'assemblyReference')] ## Set model panel to show All if modelPanels: [cmds.modelEditor(mp, edit = True, allObjects = True) for mp in modelPanels] debug(app = self, method = 'run_app', message = 'Moving on to save working scene...', verbose = False) inprogressBar.updateProgress(percent = 75, doingWhat = 'Setting Render Globals...') ## Now make sure the scene is set to pal and cm and renderglobals settings._setRenderGlobals(animation = True) ## Now save the working scene inprogressBar.updateProgress(percent = 90, doingWhat = 'Saving vers up scene...') shotName = entity['name'] debug(app = self, method = 'run_app', message = 'shotName...\n%s' % shotName, verbose = False) work_template = tk.templates['shot_work_area_maya'] debug(app = self, method = 'run_app', message = 'work_template...\n%s' % work_template, verbose = False) ## context.step['name'] = Blocking try: debug(app = self, method = 'run_app', message = "Shot: %s" % shotName, verbose = False) debug(app = self, method = 'run_app', message = "context.step: %s" % context.step['name'], verbose = False) debug(app = self, method = 'run_app', message = 'Trying to fetch pathToWorking now...', verbose = False) pathToWorking = r'%s' % tk.paths_from_template(work_template, {"Shot" : shotName, "Step":context.step['name']})[0] pathToWorking.replace('\\\\', '\\') debug(app = self, method = 'run_app', message = 'pathToWorking...\n%s' % pathToWorking, verbose = False) except: ## There are NO working files yet so we have to handle this propelry ## This needs to be the root folder and 000 for version up\ ## we need to find the sequence from the workspaces index0 of this is default getWorkspace = cmds.workspace( listWorkspaces=True )[1] # Result: [u'default', u'I:/lsapipeline/episodes/eptst/eptst_sh060/Blck/work/maya'] getSequence = getWorkspace.split('/')[4] work_path = work_template.apply_fields({'Sequence' : getSequence, 'Shot': shotName, 'Step': context.step['name']}) debug(app = self, method = 'run_app', message = 'New work_path: %s' % work_path, verbose = False) pathToWorking = r"%s" % work_template ## Scan the folder and find the highest version number fileShotName = "".join(shotName.split('_')) or '' debug(app = self, method = 'run_app', message = 'fileShotName...\n%s' % fileShotName, verbose = False) padding = '' debug(app = self, method = 'run_app', message = 'padding...\n%s' % padding, verbose = False) versionNumber = '' debug(app = self, method = 'run_app', message = 'versionNumber...\n%s' % versionNumber, verbose = False) if os.path.exists(pathToWorking): debug(app = self, method = 'run_app', message = 'Path to working exists...', verbose = False) getfiles = os.listdir(pathToWorking) debug(app = self, method = 'run_app', message = 'getfiles...\n%s' % getfiles, verbose = False) ## Remove the stupid Keyboard folder if it exists.. thx autodesk.. not if 'Keyboard' in getfiles: getfiles.remove('Keyboard') ## Process a clean list now.. trying to remove from the current list is giving me grief and I'm too fn tired to care... finalFiles = [] for each in getfiles: if each.split('.')[0] == fileShotName: finalFiles.append(each) else: pass debug(app = self, method = 'run_app', message = 'finalFiles...\n%s' % finalFiles, verbose = False) if finalFiles: highestVersFile = max(finalFiles) debug(app = self, method = 'run_app', message = 'highestVersFile...\n%s' % highestVersFile, verbose = False) versionNumber = int(highestVersFile.split('.')[1].split('v')[1]) + 1 debug(app = self, method = 'run_app', message = 'versionNumber...\n%s' % versionNumber, verbose = False) else: versionNumber = 1 debug(app = self, method = 'run_app', message = 'versionNumber...\n%s' % versionNumber, verbose = False) ## Now pad the version number if versionNumber < 10: padding = '00' elif versionNumber < 100: padding = '0' else: padding = '' debug(app = self, method = 'run_app', message = 'padding...\n%s' % padding, verbose = False) ## Rename the file renameTo = '%s.v%s%s' % (fileShotName, padding, versionNumber) debug(app = self, method = 'run_app', message = 'renameTo...\n%s' % renameTo, verbose = False) ## Now save the file cmds.file(rename = renameTo) cmds.file(save = True, force = True, type = 'mayaAscii') cmds.headsUpMessage("Assets retrieved successfully...", time = 1) cmds.cycleCheck(e = 0) inprogressBar.updateProgress(percent = 100, doingWhat = 'Finished') inprogressBar.close() else: debug(app = self, method = 'run_app', message = 'Invalid Path to working, skipping save...', verbose = False) inprogressBar.close() cmds.headsUpMessage("Scene not saved. This is most likely due to a first time load of blocking/anim fetch...\nUse Shotgun saveAs now...", time = 2) else: inprogressBar.close() cmds.headsUpMessage("Current context is not a valid Shot context. Please make sure you are under a valid shotgun Shot context!", time = 2)
import rigBuilder.body.bodyClasses as classes import rigBuilder.rigEnv as env import maya.cmds as cmds import re, string cmds.cycleCheck(e=False) class RigBuild(classes.RigComponent): """ Module containing processes to run prior to Advanced Skeleton generation, after setting up the guide rig. """ def build(self): FKIKCtl = '%s_legFrontFkIk_ctl_%s' % (self.locus,self.count) IKCtl = '%s_legFrontIk_ctl_%s' % (self.locus,self.count) footBallPivot = '%s_footPivotBallLegFrontIk_org_%s' % (self.locus,self.count) footRoll = '%s_footRollLegFrontIk_org_%s' % (self.locus,self.count) ballIkCtl = '%s_legFrontBallIk_ctl_%s' % (self.locus,self.count) # add attrs cmds.addAttr(FKIKCtl,ln='feetControls',at='double',min=0,max=1,dv=1) cmds.setAttr('%s.feetControls' % FKIKCtl,e=True,k=True) cmds.addAttr(FKIKCtl,ln='swivel',at='double',dv=0) cmds.setAttr('%s.swivel' % FKIKCtl,e=True,k=True) cmds.addAttr(FKIKCtl,ln='toeRoll',at='double',dv=0) cmds.setAttr('%s.toeRoll' % FKIKCtl,e=True,k=True) cmds.addAttr(FKIKCtl,ln='toeSwivel',at='double',dv=0) cmds.setAttr('%s.toeSwivel' % FKIKCtl,e=True,k=True) cmds.addAttr(FKIKCtl,ln='toeTwist',at='double',dv=0)
def rsObjectsInPath(l_curves, i_number=3, i_type=0, b_consPos=True, b_consOri=True, b_orientWorld=True, b_parentHierarchy=False, b_selectNewObjs=True, o_toCurve=None, i_instance=0, i_loft=0): l_selIn = cmds.ls(sl=True, o=False) cmds.select(cl=True) l_list = [] try: if cmds.objExists(l_curves): l_list.append(l_curves) except: pass for o_obj in l_curves: if cmds.objExists(o_obj): l_list.append(o_obj) if len(l_list) == 0: cmds.warning("Wrong input argument") return False l_curves = l_list d_type = {0: "group", 1: "spaceLocator", 2: "joint", 3: "Scene object"} l_targets = [] l_objReturns = [] for o_obj in l_curves: if cmds.objExists(o_obj): l_shapes = cmds.listRelatives(o_obj, s=True) for o_shape in l_shapes: if cmds.nodeType(o_shape) == "nurbsCurve" or cmds.nodeType( o_shape) == "bezierCurve": l_targets.append(o_shape) else: cmds.warning("%s > A Does not exist" % (o_obj)) if len(l_targets) > 0: l_loft = [] for o_target in l_targets: l_tmpObjReturns = [] i_openCloseVal = cmds.getAttr("%s.f" % (o_target)) if i_openCloseVal == 0: f_div = 1.00 / (i_number - 1) else: f_div = 1.00 / i_number l_uValues = [] for z in range(i_number): l_uValues.append(f_div * z) for z in range(i_number): o_obj = None if i_type != 3: if i_type in d_type: if i_type == 0: o_obj = cmds.group(em=True) if i_type == 1: o_obj = cmds.spaceLocator()[0] if i_type == 2: o_obj = cmds.joint() else: cmds.warning("Type not recognized") break else: if cmds.objExists(o_toCurve): if i_instance == 0: o_obj = cmds.duplicate(o_toCurve)[0] else: o_obj = cmds.instance(o_toCurve)[0] else: cmds.warning("%s > B Does not exist" % (o_toCurve)) break l_objReturns.append(o_obj) l_tmpObjReturns.append(o_obj) o_path = cmds.pathAnimation(o_obj, o_target, f=b_consOri, fractionMode=True, followAxis="y", upAxis="z", worldUpType="vector") o_incomingConnection = cmds.listConnections("%s.uValue" % (o_path), destination=False, source=True)[0] cmds.cycleCheck(e=0) cmds.delete(o_incomingConnection) cmds.cycleCheck(e=1) cmds.setAttr("%s.uValue" % (o_path), l_uValues[z]) if not b_consOri and not b_consPos: o_incoming = cmds.listConnections("%s.rotateX" % (o_obj), destination=False, source=True)[0] cmds.cycleCheck(e=0) cmds.delete(o_incoming) cmds.cycleCheck(e=1) if b_consOri and not b_consPos: o_incomingX = cmds.listConnections("%s.translateX" % (o_obj), plugs=True, destination=False, source=True)[0] o_incomingY = cmds.listConnections("%s.translateY" % (o_obj), plugs=True, destination=False, source=True)[0] o_incomingZ = cmds.listConnections("%s.translateZ" % (o_obj), plugs=True, destination=False, source=True)[0] cmds.disconnectAttr(o_incomingX, "%s.translateX" % (o_obj)) cmds.disconnectAttr(o_incomingY, "%s.translateY" % (o_obj)) cmds.disconnectAttr(o_incomingZ, "%s.translateZ" % (o_obj)) if not b_consOri and b_consPos: o_incomingX = cmds.listConnections("%s.rotateX" % (o_obj), plugs=True, destination=False, source=True)[0] o_incomingY = cmds.listConnections("%s.rotateY" % (o_obj), plugs=True, destination=False, source=True)[0] o_incomingZ = cmds.listConnections("%s.rotateZ" % (o_obj), plugs=True, destination=False, source=True)[0] cmds.disconnectAttr(o_incomingX, "%s.rotateX" % (o_obj)) cmds.disconnectAttr(o_incomingY, "%s.rotateY" % (o_obj)) cmds.disconnectAttr(o_incomingZ, "%s.rotateZ" % (o_obj)) cmds.setAttr("%s.follow" % (o_path), b_consOri) if not b_consOri and b_orientWorld: cmds.setAttr("%s.rotateX" % (o_obj), 0) cmds.setAttr("%s.rotateY" % (o_obj), 0) cmds.setAttr("%s.rotateZ" % (o_obj), 0) cmds.select(cl=True) o_loft = "" if i_loft > 0: if i_loft == 1: o_loftPoly = cmds.loft(l_tmpObjReturns, ch=1, u=1, c=0, ar=1, d=3, ss=1, rn=0, po=1, rsn=True) o_outcoming = cmds.listConnections("%s.outputSurface" % (o_loftPoly[1]), plugs=False, destination=True, source=False)[0] o_loft = o_loftPoly[1] l_loft.append(o_loftPoly[0]) cmds.setAttr("%s.polygonType" % (o_outcoming), 1) cmds.setAttr("%s.format" % (o_outcoming), 2) cmds.setAttr("%s.uType" % (o_outcoming), 3) cmds.setAttr("%s.uNumber" % (o_outcoming), 1) cmds.setAttr("%s.vType" % (o_outcoming), 3) cmds.setAttr("%s.vNumber" % (o_outcoming), 1) if i_loft == 2: cmds.loft(l_tmpObjReturns, ch=1, u=1, c=0, ar=1, d=3, ss=1, rn=0, po=0, rsn=True) if i_loft > 2: cmds.warning("Loft type not recognized") cmds.select(cl=True) if b_parentHierarchy: if not b_consPos and not b_consOri: l_tmpObjReturns.reverse() for z in range(len(l_tmpObjReturns) - 1): cmds.parent(l_tmpObjReturns[z], l_tmpObjReturns[z + 1]) else: cmds.warning( "Objects cannot be in hierarchy, , they have transformations constraints" ) cmds.select(cl=True) if b_selectNewObjs: if l_objReturns != []: cmds.select(l_objReturns) if len(l_loft) > 0: cmds.select(l_loft, add=True) else: if l_selIn != []: cmds.select(l_selIn) else: if l_selIn != []: cmds.select(l_selIn) return (l_objReturns, l_targets, l_loft)
def doIt(self,args): self.parseArguments(args) cmds.cycleCheck(e=0) controllerShapeName = self.falloffName+'Shape' counter = 0 theSet = '' feathers = cmds.listRelatives(self.feathergroupName) for featherCNTRL in feathers: initialScaleX = cmds.getAttr(featherCNTRL+'.scaleX') initialScaleY = cmds.getAttr(featherCNTRL+'.scaleY') initialScaleZ = cmds.getAttr(featherCNTRL+'.scaleZ') cmds.select(featherCNTRL) cmds.pickWalk(d='down') featherShape = cmds.ls(selection=True)[0] print featherShape #Distance between feathers and falloffobject distNode = cmds.createNode('distanceBetween', n='distance_'+self.falloffName+str(counter)) cmds.connectAttr(controllerShapeName+'.worldPosition[0]', distNode+'.point1') cmds.connectAttr(featherShape+'_DistanceLoc.worldPosition[0]', distNode+'.point2') #Divide Distance/FalloffSize multDivNode = cmds.createNode('multiplyDivide', n='MultiDiv_distDiv_'+self.falloffName+str(counter)) cmds.connectAttr(self.falloffName+'.Falloff_Size', multDivNode+'.input2X') cmds.setAttr(multDivNode+'.operation', 2) cmds.connectAttr(distNode+'.distance', multDivNode+'.input1X') #Clamp division to max 1 (Value now between 0 and 1) clampNode = cmds.createNode('clamp', n='clamp_'+self.falloffName+str(counter)) cmds.setAttr(clampNode+'.maxR', 1) cmds.connectAttr(multDivNode+'.outputX', clampNode+'.inputR') #Scale it with 1-ClampOutput plusMinNode = cmds.createNode('plusMinusAverage', n='plusMinAv_'+self.falloffName+str(counter)) cmds.setAttr(plusMinNode+'.operation', 2) cmds.setAttr(plusMinNode+'.input2D[0].input2Dx', 1) cmds.connectAttr(clampNode+'.outputR', plusMinNode+'.input2D[1].input2Dx') #Make scaling correct and stuffz remapPlusMinNode = cmds.createNode('plusMinusAverage', n='remapPlusMinAv_'+self.falloffName+str(counter)) cmds.setAttr(remapPlusMinNode+'.operation', 2) cmds.connectAttr(self.falloffName+'.scaleX', remapPlusMinNode+'.input3D[0].input3Dx') cmds.connectAttr(self.falloffName+'.scaleY', remapPlusMinNode+'.input3D[0].input3Dy') cmds.connectAttr(self.falloffName+'.scaleZ', remapPlusMinNode+'.input3D[0].input3Dz') cmds.setAttr(remapPlusMinNode+'.input3D[1].input3Dx', 1) cmds.setAttr(remapPlusMinNode+'.input3D[1].input3Dy', 1) cmds.setAttr(remapPlusMinNode+'.input3D[1].input3Dz', 1) #Rotation and scaling stuff going strong multRotNode = cmds.createNode('multiplyDivide', n='MultiDiv_multRot_'+self.falloffName+str(counter)) multScaleNode = cmds.createNode('multiplyDivide', n='MultiDiv_multScale_'+self.falloffName+str(counter)) cmds.connectAttr(plusMinNode+'.output2Dx', multRotNode+'.input1X') cmds.connectAttr(plusMinNode+'.output2Dx', multScaleNode+'.input1X') multReverseNode = cmds.createNode('multiplyDivide', n='MultiDiv_multReverse_'+self.falloffName+str(counter)) cmds.setAttr(multReverseNode+'.input2X', -1) cmds.connectAttr(multRotNode+'.outputX', multReverseNode+'.input1X') #Ranges, ranges, ranges... rotRangeNode = cmds.createNode('setRange', n='setRange_RotRange_'+self.falloffName+str(counter)) scaleRangeNode = cmds.createNode('setRange', n='setRange_ScaleRange_'+self.falloffName+str(counter)) cmds.setAttr(rotRangeNode+'.oldMinX', -360) cmds.setAttr(rotRangeNode+'.oldMaxX', 360) cmds.setAttr(rotRangeNode+'.oldMinY', -360) cmds.setAttr(rotRangeNode+'.oldMaxY', 360) cmds.setAttr(rotRangeNode+'.oldMinZ', -360) cmds.setAttr(rotRangeNode+'.oldMaxZ', 360) cmds.setAttr(scaleRangeNode+'.minX', 0) cmds.setAttr(scaleRangeNode+'.minY', 0) cmds.setAttr(scaleRangeNode+'.minZ', 0) cmds.setAttr(scaleRangeNode+'.oldMinX', 0) cmds.setAttr(scaleRangeNode+'.oldMinY', 0) cmds.setAttr(scaleRangeNode+'.oldMinZ', 0) cmds.setAttr(scaleRangeNode+'.oldMaxX', 25) cmds.setAttr(scaleRangeNode+'.oldMaxY', 25) cmds.setAttr(scaleRangeNode+'.oldMaxZ', 25) #Connect this.. cmds.connectAttr(multReverseNode+'.outputX', rotRangeNode+'.minX') cmds.connectAttr(multReverseNode+'.outputX', rotRangeNode+'.minY') cmds.connectAttr(multReverseNode+'.outputX', rotRangeNode+'.minZ') cmds.connectAttr(multRotNode+'.outputX', rotRangeNode+'.maxX') cmds.connectAttr(multRotNode+'.outputX', rotRangeNode+'.maxY') cmds.connectAttr(multRotNode+'.outputX', rotRangeNode+'.maxZ') cmds.connectAttr(multScaleNode+'.outputX', scaleRangeNode+'.maxX') cmds.connectAttr(multScaleNode+'.outputX', scaleRangeNode+'.maxY') cmds.connectAttr(multScaleNode+'.outputX', scaleRangeNode+'.maxZ') cmds.connectAttr(rotRangeNode+'.oldMaxX', multRotNode+'.input2X') cmds.connectAttr(scaleRangeNode+'.oldMaxX', multScaleNode+'.input2X') cmds.connectAttr(self.falloffName+'.rotateX', rotRangeNode+'.valueX') cmds.connectAttr(self.falloffName+'.rotateY', rotRangeNode+'.valueY') cmds.connectAttr(self.falloffName+'.rotateZ', rotRangeNode+'.valueZ') #Connect to feather shape cmds.connectAttr(rotRangeNode+'.outValueX', featherCNTRL+'.rotateX') cmds.connectAttr(rotRangeNode+'.outValueY', featherCNTRL+'.rotateY') cmds.connectAttr(rotRangeNode+'.outValueZ', featherCNTRL+'.rotateZ') endPlusMinNode = cmds.createNode('plusMinusAverage', n='endPlusMinAv_'+self.falloffName+str(counter)) cmds.setAttr(endPlusMinNode+'.operation', 1) cmds.setAttr(endPlusMinNode+'.input3D[0].input3Dx', initialScaleX) cmds.setAttr(endPlusMinNode+'.input3D[0].input3Dy', initialScaleY) cmds.setAttr(endPlusMinNode+'.input3D[0].input3Dz', initialScaleZ) cmds.connectAttr(remapPlusMinNode+'.output3Dx', scaleRangeNode+'.valueX') cmds.connectAttr(remapPlusMinNode+'.output3Dy', scaleRangeNode+'.valueY') cmds.connectAttr(remapPlusMinNode+'.output3Dz', scaleRangeNode+'.valueZ') cmds.connectAttr(scaleRangeNode+'.outValueX', endPlusMinNode+'.input3D[1].input3Dx') cmds.connectAttr(scaleRangeNode+'.outValueY', endPlusMinNode+'.input3D[1].input3Dy') cmds.connectAttr(scaleRangeNode+'.outValueZ', endPlusMinNode+'.input3D[1].input3Dz') cmds.connectAttr(endPlusMinNode+'.output3Dx', featherCNTRL+'.scaleX') cmds.connectAttr(endPlusMinNode+'.output3Dy', featherCNTRL+'.scaleY') cmds.connectAttr(endPlusMinNode+'.output3Dz', featherCNTRL+'.scaleZ') cmds.select(distNode, r=True) cmds.select(multDivNode, add=True) cmds.select(clampNode, add=True) cmds.select(plusMinNode, add=True) cmds.select(multRotNode, add=True) cmds.select(multScaleNode, add=True) cmds.select(multReverseNode, add=True) cmds.select(rotRangeNode, add=True) cmds.select(scaleRangeNode, add=True) cmds.select(remapPlusMinNode, add=True) cmds.select(endPlusMinNode, add=True) if cmds.objExists(self.falloffName+'_UtilContainer'): cmds.container(self.falloffName+'_UtilContainer', edit=True, includeShapes=True, includeTransform=True, force=True, addNode=cmds.ls(sl=True)) else: cmds.container(n=self.falloffName+'_UtilContainer', includeShapes=True, includeTransform=True, force=True, addNode=cmds.ls(sl=True)) if cmds.objExists(self.falloffName+'_FeatherfalloffSet'): cmds.select(featherCNTRL, r=True) cmds.sets(cmds.ls(sl=True), add=theSet) else: cmds.select(featherCNTRL, r=True) theSet = cmds.sets(n=self.falloffName+'_FeatherfalloffSet') counter = counter+1
def createFalloffObject(self): circle1 = cmds.circle(r=self.size) circle2 = cmds.circle(r=self.size) cmds.rotate(0,'90deg',0,circle2[0]) self.falloffName = cmds.spaceLocator(n='Falloff_Obj')[0]; #Kanske connecta Falloff_size med radien pa cirklarna cmds.addAttr(self.falloffName, at='double', k=True, dv=self.size,ln='Falloff_Size' ) locGroup = cmds.group(circle1, circle2, n='circleGroup') cmds.setAttr(self.falloffName+'.visibility', 0) movingLocator = cmds.spaceLocator(n='Move_This_Obj')[0] cmds.addAttr(movingLocator, at='double', k=True, dv=self.size,ln='Falloff_Size' ) cmds.connectAttr(movingLocator+'.Falloff_Size',self.falloffName+'.Falloff_Size') cmds.connectAttr(movingLocator+'.translate', self.falloffName+'.translate') cmds.connectAttr(movingLocator+'.rotate', self.falloffName+'.rotate') cmds.connectAttr(movingLocator+'.scale', self.falloffName+'.scale') cmds.parent(locGroup, movingLocator) # attachFalloffObject cmds.cycleCheck(e=0) controllerShapeName = self.falloffName+'Shape' counter = 0 theSet = '' feathers = cmds.listRelatives(self.feathergroupName) for ScaleGroup in feathers: select(ScaleGroup) CTRLgroup = pickWalk(d='down')[0] initialScaleX = cmds.getAttr(CTRLgroup+'.scaleX') initialScaleY = cmds.getAttr(CTRLgroup+'.scaleY') initialScaleZ = cmds.getAttr(CTRLgroup+'.scaleZ') pickWalk(d='down') featherShape = cmds.ls(selection=True)[0] #Distance between feathers and falloffobject distNode = cmds.createNode('distanceBetween', n='distance_'+self.falloffName+str(counter)) cmds.connectAttr(controllerShapeName+'.worldPosition[0]', distNode+'.point1') cmds.connectAttr(featherShape+'_DistanceLoc.worldPosition[0]', distNode+'.point2') #Divide Distance/FalloffSize multDivNode = cmds.createNode('multiplyDivide', n='MultiDiv_distDiv_'+self.falloffName+str(counter)) cmds.connectAttr(self.falloffName+'.Falloff_Size', multDivNode+'.input2X') cmds.setAttr(multDivNode+'.operation', 2) cmds.connectAttr(distNode+'.distance', multDivNode+'.input1X') #Clamp division to max 1 (Value now between 0 and 1) clampNode = cmds.createNode('clamp', n='clamp_'+self.falloffName+str(counter)) cmds.setAttr(clampNode+'.maxR', 1) cmds.connectAttr(multDivNode+'.outputX', clampNode+'.inputR') #Scale it with 1-ClampOutput plusMinNode = cmds.createNode('plusMinusAverage', n='plusMinAv_'+self.falloffName+str(counter)) cmds.setAttr(plusMinNode+'.operation', 2) cmds.setAttr(plusMinNode+'.input2D[0].input2Dx', 1) cmds.connectAttr(clampNode+'.outputR', plusMinNode+'.input2D[1].input2Dx') #Make scaling correct and stuffz remapPlusMinNode = cmds.createNode('plusMinusAverage', n='remapPlusMinAv_'+self.falloffName+str(counter)) cmds.setAttr(remapPlusMinNode+'.operation', 2) cmds.connectAttr(self.falloffName+'.scaleX', remapPlusMinNode+'.input3D[0].input3Dx') cmds.connectAttr(self.falloffName+'.scaleY', remapPlusMinNode+'.input3D[0].input3Dy') cmds.connectAttr(self.falloffName+'.scaleZ', remapPlusMinNode+'.input3D[0].input3Dz') cmds.setAttr(remapPlusMinNode+'.input3D[1].input3Dx', 1) cmds.setAttr(remapPlusMinNode+'.input3D[1].input3Dy', 1) cmds.setAttr(remapPlusMinNode+'.input3D[1].input3Dz', 1) #Rotation and scaling stuff going strong multRotNode = cmds.createNode('multiplyDivide', n='MultiDiv_multRot_'+self.falloffName+str(counter)) multScaleNode = cmds.createNode('multiplyDivide', n='MultiDiv_multScale_'+self.falloffName+str(counter)) cmds.connectAttr(plusMinNode+'.output2Dx', multRotNode+'.input1X') cmds.connectAttr(plusMinNode+'.output2Dx', multScaleNode+'.input1X') multReverseNode = cmds.createNode('multiplyDivide', n='MultiDiv_multReverse_'+self.falloffName+str(counter)) cmds.setAttr(multReverseNode+'.input2X', -1) cmds.connectAttr(multRotNode+'.outputX', multReverseNode+'.input1X') #Ranges, ranges, ranges... rotRangeNode = cmds.createNode('setRange', n='setRange_RotRange_'+self.falloffName+str(counter)) scaleRangeNode = cmds.createNode('setRange', n='setRange_ScaleRange_'+self.falloffName+str(counter)) cmds.setAttr(rotRangeNode+'.oldMinX', -360) cmds.setAttr(rotRangeNode+'.oldMaxX', 360) cmds.setAttr(rotRangeNode+'.oldMinY', -360) cmds.setAttr(rotRangeNode+'.oldMaxY', 360) cmds.setAttr(rotRangeNode+'.oldMinZ', -360) cmds.setAttr(rotRangeNode+'.oldMaxZ', 360) cmds.setAttr(scaleRangeNode+'.minX', 0) cmds.setAttr(scaleRangeNode+'.minY', 0) cmds.setAttr(scaleRangeNode+'.minZ', 0) cmds.setAttr(scaleRangeNode+'.oldMinX', 0) cmds.setAttr(scaleRangeNode+'.oldMinY', 0) cmds.setAttr(scaleRangeNode+'.oldMinZ', 0) cmds.setAttr(scaleRangeNode+'.oldMaxX', 25) cmds.setAttr(scaleRangeNode+'.oldMaxY', 25) cmds.setAttr(scaleRangeNode+'.oldMaxZ', 25) #Connect this.. cmds.connectAttr(multReverseNode+'.outputX', rotRangeNode+'.minX') cmds.connectAttr(multReverseNode+'.outputX', rotRangeNode+'.minY') cmds.connectAttr(multReverseNode+'.outputX', rotRangeNode+'.minZ') cmds.connectAttr(multRotNode+'.outputX', rotRangeNode+'.maxX') cmds.connectAttr(multRotNode+'.outputX', rotRangeNode+'.maxY') cmds.connectAttr(multRotNode+'.outputX', rotRangeNode+'.maxZ') cmds.connectAttr(multScaleNode+'.outputX', scaleRangeNode+'.maxX') cmds.connectAttr(multScaleNode+'.outputX', scaleRangeNode+'.maxY') cmds.connectAttr(multScaleNode+'.outputX', scaleRangeNode+'.maxZ') cmds.connectAttr(rotRangeNode+'.oldMaxX', multRotNode+'.input2X') cmds.connectAttr(scaleRangeNode+'.oldMaxX', multScaleNode+'.input2X') cmds.connectAttr(self.falloffName+'.rotateX', rotRangeNode+'.valueX') cmds.connectAttr(self.falloffName+'.rotateY', rotRangeNode+'.valueY') cmds.connectAttr(self.falloffName+'.rotateZ', rotRangeNode+'.valueZ') #Connect to feather shape cmds.connectAttr(rotRangeNode+'.outValueX', CTRLgroup+'.rotateX') cmds.connectAttr(rotRangeNode+'.outValueY', CTRLgroup+'.rotateY') cmds.connectAttr(rotRangeNode+'.outValueZ', CTRLgroup+'.rotateZ') endPlusMinNode = cmds.createNode('plusMinusAverage', n='endPlusMinAv_'+self.falloffName+str(counter)) cmds.setAttr(endPlusMinNode+'.operation', 1) cmds.setAttr(endPlusMinNode+'.input3D[0].input3Dx', initialScaleX) cmds.setAttr(endPlusMinNode+'.input3D[0].input3Dy', initialScaleY) cmds.setAttr(endPlusMinNode+'.input3D[0].input3Dz', initialScaleZ) cmds.connectAttr(remapPlusMinNode+'.output3Dx', scaleRangeNode+'.valueX') cmds.connectAttr(remapPlusMinNode+'.output3Dy', scaleRangeNode+'.valueY') cmds.connectAttr(remapPlusMinNode+'.output3Dz', scaleRangeNode+'.valueZ') cmds.connectAttr(scaleRangeNode+'.outValueX', endPlusMinNode+'.input3D[1].input3Dx') cmds.connectAttr(scaleRangeNode+'.outValueY', endPlusMinNode+'.input3D[1].input3Dy') cmds.connectAttr(scaleRangeNode+'.outValueZ', endPlusMinNode+'.input3D[1].input3Dz') cmds.connectAttr(endPlusMinNode+'.output3Dx', CTRLgroup+'.scaleX') cmds.connectAttr(endPlusMinNode+'.output3Dy', CTRLgroup+'.scaleY') cmds.connectAttr(endPlusMinNode+'.output3Dz', CTRLgroup+'.scaleZ') #Add every node to a container cmds.select(distNode, r=True) cmds.select(multDivNode, add=True) cmds.select(clampNode, add=True) cmds.select(plusMinNode, add=True) cmds.select(multRotNode, add=True) cmds.select(multScaleNode, add=True) cmds.select(multReverseNode, add=True) cmds.select(rotRangeNode, add=True) cmds.select(scaleRangeNode, add=True) cmds.select(remapPlusMinNode, add=True) cmds.select(endPlusMinNode, add=True) if cmds.objExists(self.falloffName+'_UtilContainer'): cmds.container(self.falloffName+'_UtilContainer', edit=True, includeShapes=True, includeTransform=True, force=True, addNode=cmds.ls(sl=True)) else: cmds.container(n=self.falloffName+'_UtilContainer', includeShapes=True, includeTransform=True, force=True, addNode=cmds.ls(sl=True)) if cmds.objExists(self.falloffName+'_FeatherfalloffSet'): cmds.select(CTRLgroup, r=True) cmds.sets(cmds.ls(sl=True), add=theSet) else: cmds.select(CTRLgroup, r=True) theSet = cmds.sets(n=self.falloffName+'_FeatherfalloffSet') counter = counter+1
def k_mayaMax_camTransfer(): u''' {'load':'maya_tool','defaultOption':1,'CNname':'Maya立体相机转Max'} ''' cames = [ a for a in cmds.ls(sl=True) if cmds.ls(cmds.listRelatives(a, c=1), type="camera") != [] ] if cames != []: cmds.cycleCheck(e=0) stm = cmds.playbackOptions(q=True, minTime=True) etm = cmds.playbackOptions(q=True, maxTime=True) timRgs = etm - stm + 1 timRg = int(timRgs) cmds.polyCube(name='locS_') cmds.delete('locS_*') localS = [] for i in cames: loco1 = cmds.spaceLocator(name=i) loco1New = cmds.rename('locS_' + loco1[0]) cmds.addAttr(longName='FlimOffset', attributeType='double3') cmds.addAttr(longName='XX', attributeType='double', parent='FlimOffset') cmds.addAttr(longName='YY', attributeType='double', parent='FlimOffset') cmds.addAttr(longName='focalLen', attributeType='double', parent='FlimOffset') localS.append(loco1New) for i2 in range(0, timRg + 1, 1): cons = 0 for i3 in cames: cmds.select(i3) caT = cmds.xform(q=1, ws=1, t=1) caR = cmds.xform(q=1, ws=1, ro=1) hfa = cmds.camera(i3, q=True, hfa=True) vfa = cmds.camera(i3, q=True, vfa=True) hfo = cmds.camera(i3, q=True, hfo=True) vfo = cmds.camera(i3, q=True, vfo=True) horHo = hfo / hfa vorHo = vfo / hfa cFL = cmds.camera(cames[cons], q=True, hfv=True) cmds.setAttr(localS[cons] + '.XX', (horHo * -1)) cmds.setAttr(localS[cons] + '.YY', (vorHo * -1)) cmds.setAttr(localS[cons] + '.focalLen', cFL) cmds.setKeyframe(localS[cons], at='XX') cmds.setKeyframe(localS[cons], at='YY') cmds.setKeyframe(localS[cons], at='focalLen') cmds.setAttr(localS[cons] + '.tx', caT[0]) cmds.setAttr(localS[cons] + '.ty', caT[1]) cmds.setAttr(localS[cons] + '.tz', caT[2]) cmds.setAttr(localS[cons] + '.rx', caR[0]) cmds.setAttr(localS[cons] + '.ry', caR[1]) cmds.setAttr(localS[cons] + '.rz', caR[2]) cmds.setKeyframe(localS[cons], at='tx') cmds.setKeyframe(localS[cons], at='ty') cmds.setKeyframe(localS[cons], at='tz') cmds.setKeyframe(localS[cons], at='rx') cmds.setKeyframe(localS[cons], at='ry') cmds.setKeyframe(localS[cons], at='rz') cons = cons + 1 cmds.currentTime(stm + i2) cmds.currentTime(stm) print "MayaCamLocater is created!!", else: cmds.warning("please select Target camera and do it again!!")
"default":True },{ "name":"displayAffected", "command":"cmds.displayAffected(onOff)", "default":False },{ "name":"undoQueue", "command":"if onOff: cmds.undoInfo( state=True, infinity=False, length=300)", "default":True },{ "name":"scrubbingUndo", "command":"commandsMod.scrubbingUndo(onOff)", "default":True },{ "name":"zoomTowardsCenter", "command":"cmds.dollyCtx('dollyContext', edit=True, dollyTowardsCenter=onOff)", "default":cmds.dollyCtx('dollyContext', query=True, dollyTowardsCenter=True) },{ "name":"cycleCheck", "command":"cmds.cycleCheck(evaluation=onOff)", "default":cmds.cycleCheck(query=True, evaluation=True) }] class GeneralTools_Gui(uiMod.BaseSubUI): def createLayout(self): mainLayout = cmds.rowLayout(numberOfColumns=6, parent=self.parentLayout) #manipulator orientation #cmds.iconTextButton("manipOrientButton", style='textOnly', label='-', h=self.hb, annotation="Selected objects", command=updateManipOrient) #launchManipOrient()
def rsObjectsInPath(l_curves, i_number=3, i_type=0, b_consPos=True, b_consOri=True, b_orientWorld=True, b_parentHierarchy=False, b_selectNewObjs=True, o_toCurve=None, i_instance=0, i_loft=0): l_selIn = cmds.ls(sl=True, o=False) cmds.select(cl=True) l_list = [] try: if cmds.objExists(l_curves): l_list.append(l_curves) except: pass for o_obj in l_curves: if cmds.objExists(o_obj): l_list.append(o_obj) if len(l_list) == 0: cmds.warning("Wrong input argument") return False l_curves = l_list d_type = {0: "group", 1: "spaceLocator", 2: "joint", 3: "Scene object"} l_targets = [] l_objReturns = [] for o_obj in l_curves: if cmds.objExists(o_obj): l_shapes = cmds.listRelatives(o_obj, s=True) for o_shape in l_shapes: if cmds.nodeType(o_shape) == "nurbsCurve" or cmds.nodeType(o_shape) == "bezierCurve": l_targets.append(o_shape) else: cmds.warning("%s > A Does not exist" % (o_obj)) if len(l_targets) > 0: l_loft = [] for o_target in l_targets: l_tmpObjReturns = [] i_openCloseVal = cmds.getAttr("%s.f" % (o_target)) if i_openCloseVal == 0: f_div = 1.00 / (i_number - 1) else: f_div = 1.00 / i_number l_uValues = [] for z in range(i_number): l_uValues.append(f_div * z) for z in range(i_number): o_obj = None if i_type != 3: if i_type in d_type: if i_type == 0: o_obj = cmds.group(em=True) if i_type == 1: o_obj = cmds.spaceLocator()[0] if i_type == 2: o_obj = cmds.joint() else: cmds.warning("Type not recognized") break else: if cmds.objExists(o_toCurve): if i_instance == 0: o_obj = cmds.duplicate(o_toCurve)[0] else: o_obj = cmds.instance(o_toCurve)[0] else: cmds.warning("%s > B Does not exist" % (o_toCurve)) break l_objReturns.append(o_obj) l_tmpObjReturns.append(o_obj) o_path = cmds.pathAnimation(o_obj, o_target, f=b_consOri, fractionMode=True, followAxis="y", upAxis="z", worldUpType="vector") o_incomingConnection = cmds.listConnections("%s.uValue" % (o_path), destination=False, source=True)[0] cmds.cycleCheck(e=0) cmds.delete(o_incomingConnection) cmds.cycleCheck(e=1) cmds.setAttr("%s.uValue" % (o_path), l_uValues[z]) if not b_consOri and not b_consPos: o_incoming = cmds.listConnections("%s.rotateX" % (o_obj), destination=False, source=True)[0] cmds.cycleCheck(e=0) cmds.delete(o_incoming) cmds.cycleCheck(e=1) if b_consOri and not b_consPos: o_incomingX = cmds.listConnections("%s.translateX" % (o_obj), plugs=True, destination=False, source=True)[0] o_incomingY = cmds.listConnections("%s.translateY" % (o_obj), plugs=True, destination=False, source=True)[0] o_incomingZ = cmds.listConnections("%s.translateZ" % (o_obj), plugs=True, destination=False, source=True)[0] cmds.disconnectAttr(o_incomingX, "%s.translateX" % (o_obj)) cmds.disconnectAttr(o_incomingY, "%s.translateY" % (o_obj)) cmds.disconnectAttr(o_incomingZ, "%s.translateZ" % (o_obj)) if not b_consOri and b_consPos: o_incomingX = cmds.listConnections("%s.rotateX" % (o_obj), plugs=True, destination=False, source=True)[0] o_incomingY = cmds.listConnections("%s.rotateY" % (o_obj), plugs=True, destination=False, source=True)[0] o_incomingZ = cmds.listConnections("%s.rotateZ" % (o_obj), plugs=True, destination=False, source=True)[0] cmds.disconnectAttr(o_incomingX, "%s.rotateX" % (o_obj)) cmds.disconnectAttr(o_incomingY, "%s.rotateY" % (o_obj)) cmds.disconnectAttr(o_incomingZ, "%s.rotateZ" % (o_obj)) cmds.setAttr("%s.follow" % (o_path), b_consOri) if not b_consOri and b_orientWorld: cmds.setAttr("%s.rotateX" % (o_obj), 0) cmds.setAttr("%s.rotateY" % (o_obj), 0) cmds.setAttr("%s.rotateZ" % (o_obj), 0) cmds.select(cl=True) o_loft = "" if i_loft > 0: if i_loft == 1: o_loftPoly = cmds.loft(l_tmpObjReturns, ch=1, u=1, c=0, ar=1, d=3, ss=1, rn=0, po=1, rsn=True) o_outcoming = cmds.listConnections("%s.outputSurface" % (o_loftPoly[1]), plugs=False, destination=True, source=False)[0] o_loft = o_loftPoly[1] l_loft.append(o_loftPoly[0]) cmds.setAttr("%s.polygonType" % (o_outcoming), 1) cmds.setAttr("%s.format" % (o_outcoming), 2) cmds.setAttr("%s.uType" % (o_outcoming), 3) cmds.setAttr("%s.uNumber" % (o_outcoming), 1) cmds.setAttr("%s.vType" % (o_outcoming), 3) cmds.setAttr("%s.vNumber" % (o_outcoming), 1) if i_loft == 2: cmds.loft(l_tmpObjReturns, ch=1, u=1, c=0, ar=1, d=3, ss=1, rn=0, po=0, rsn=True) if i_loft > 2: cmds.warning("Loft type not recognized") cmds.select(cl=True) if b_parentHierarchy: if not b_consPos and not b_consOri: l_tmpObjReturns.reverse() for z in range(len(l_tmpObjReturns) - 1): cmds.parent(l_tmpObjReturns[z], l_tmpObjReturns[z + 1]) else: cmds.warning("Objects cannot be in hierarchy, , they have transformations constraints") cmds.select(cl=True) if b_selectNewObjs: if l_objReturns != []: cmds.select(l_objReturns) if len(l_loft) > 0: cmds.select(l_loft, add=True) else: if l_selIn != []: cmds.select(l_selIn) else: if l_selIn != []: cmds.select(l_selIn) return(l_objReturns, l_targets, l_loft)