Maya Python
Jump to navigation
Jump to search
Select Constraint Parents from Constrained Object
Should work on any constraint type, not tested extensively
import maya.cmds as mc parents = [] constraints = mc.listConnections(mc.ls(sl=1),s=1,type="constraint") constraints = list(set(constraints )) for constraint in constraints: cmd = "mc."+mc.nodeType(constraint) + "('" + constraint + "',q=1,tl=1)" for target in eval(cmd): parents.append(target) mc.select(parents,r=1)
Convert Curve Vertices to Joints
1 CV = 1 joint, works with objects that have multiple shapes, parents resulting joints (for an IKspline), orients along X.
#joint chain from curve(s) cvs, orient X up import maya.cmds as cmds myCurve = cmds.ls(selection=True) for item in myCurve: shapes = cmds.listRelatives(item,s=1,f=1) for shape in shapes: cmds.select(cl=True) jointN = 0 jointChain = [] cvs = cmds.ls('%s.cv[:]'%shape, fl=True) for cv in cvs: jointN = jointN + 1 [x,y,z] = cmds.xform(cv,t=1,q=1,ws=1) j = cmds.joint(n='%s_jnt%s'%(shape,jointN),p=(x,y,z)) jointChain.append(j) for j in jointChain[:-1]: cmds.joint(j,e=1,oj='xyz')
ikSpline
import maya.cmds as cmds curveAndJnt = cmds.ls(sl=1) curvOb = curveAndJnt[0] first = curveAndJnt[1] last = cmds.listRelatives(first,ad=1)[0] cmds.select([first,last,curvOb],r=1) handle = cmds.ikHandle(sol='ikSplineSolver',ccv=False,roc=False,pcv=False)
Export Camera to World
copies selected cameras to world with parent constraints so you can bake them with alembic
import maya.cmds as mc for cameras in mc.ls(sl=1): selection = cameras cam = mc.duplicate(selection)[0] #unlock transforms for item in ['tx','ty','tz','rx','ry','rz','sx','sy','sz']: mc.setAttr(cam+'.'+item,lock=0) #delete children if any children = mc.listRelatives(cam,typ="transform",f=1) if children: mc.delete(children) if mc.listRelatives(cam,parent=1): cam = mc.parent(cam,world=1) mc.parentConstraint(selection,cam) camShape=mc.listRelatives(cam)[0] selectionShape=mc.listRelatives(selection)[0] for at in ['focalLength','focusDistance','centerOfInterest','shutterAngle']: mc.connectAttr(selectionShape+'.'+at,camShape+'.'+at) cam = mc.rename(cam,selection)
Copy object and spread it along a path
import maya.cmds as mc result = mc.promptDialog( title='Copy along curve', message='Uses motionPath to spread copies of your first object on the second object selected (a path)\nThis means you can animate the curve. Check uVal attr on objects to displace along curve\n\nNumber of copies spread on curve:', button=['OK', 'Cancel'], defaultButton='OK', cancelButton='Cancel', tx=10, dismissString='Cancel') if result == 'OK': count = int(mc.promptDialog(query=True, text=True)) path = mc.ls(sl=1)[1] pathShp = mc.listRelatives(path,s=1)[0] profile = mc.ls(sl=1)[0] emGroup = mc.group(n='copies',em=1) for i in range(count): obj = mc.duplicate(profile,n=profile+'_copy')[0] mc.addAttr(obj,ln="uVal") mc.setAttr(obj+'.uVal',1.0*i/(count-1),e=1,k=1) mc.parent(obj,emGroup) pathA = mc.pathAnimation(obj,follow=True,fm=1,c=pathShp) mc.connectAttr(obj+'.uVal',pathA+'.uValue',f=1)
Pop-up (HUD) slider to change channel box attribute speed
import maya.cmds as mc from math import pow def chboxspeed( HUD, *args ): v = mc.hudSliderButton( HUD, query=True, v=True ) nv = pow(10,v) mc.channelBox("mainChannelBox", edit=True, spd=nv) if nv < 1.0: nv = "%.6f" % nv else: nv = int(nv) mc.hudSliderButton( HUD, e=True, sl=nv ) if len(args)>0: mc.channelBox("mainChannelBox", edit=True, spd=chboxspeedvalue) mc.headsUpDisplay('HUDchboxspeed',rem=1) chboxspeedvalue = mc.channelBox("mainChannelBox", query=True, spd=1) hud = mc.hudSliderButton( 'HUDchboxspeed', s=2, b=5, vis=True, sl='speed', value=0, type='int', min=-6, max=6, slw=50, vw=50, sln=100, si=1, bl='reset&delete', bw=80, bsh='rectangle',brc=lambda : chboxspeed( 'HUDchboxspeed','delete' ), sdc=lambda : chboxspeed( 'HUDchboxspeed' ))
Reconnect motion paths
''' reconnects selected objects with motion paths to a a given curve select objects driven by motion path and path last ''' import maya.cmds as mc objs = mc.ls(sl=1,l=1) curveShp = mc.listRelatives(objs[-1])[0] for o in objs[:-1]: mp = mc.listConnections(o+'.specifiedManipLocation')[0] if mc.nodeType(o) == 'motionPath': mp = o if mc.nodeType(mp) == 'motionPath': mc.connectAttr(curveShp+'.worldSpace[0]',mp+'.geometryPath',f=1) else: warning('\nNo motion path found on '+o)
Match translates and pivots
Sets translates/rotates/scales and pivots of selected objects to the last selected object
# sets the pivots and transforms of objects to last object of selection, using parents and freeze transforms # remember to delete history import maya.cmds as mc objs = mc.ls(sl=1) target = objs[-1] targetPivot = mc.xform(target,q=1,ws=1,rp=1) for o in objs[:-1]: parentObj = mc.listRelatives(o,parent=1) mc.parent(o,target) mc.makeIdentity(o,a=1,) mc.xform(o,ws=1,rp=[targetPivot[0],targetPivot[1],targetPivot[2]]) mc.xform(o,ws=1,sp=[targetPivot[0],targetPivot[1],targetPivot[2]]) if parentObj: mc.parent(o,parentObj) else: mc.parent(o,w=1) print('You might need to delete histories')
No-flip flow motion path object using curve normals
Well, not really no-flip, but you can easily modify the motion path loft
#select object and curve and run code import maya.cmds as mc def curveOnSurfaceFromCurve(curveObj,offsetDistance=.5): offset1 = mc.offsetCurve(curveObj,ugn=0,d=offsetDistance) offset2 = mc.offsetCurve(curveObj,ugn=0,d=-offsetDistance) 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 motionPathWithNormalsAndFlow(object,motionPathCurve,useTimeline=True,flowSpans=10): mc.xform(object,a=True, ro=(0, 0, 0) ) bbox = mc.xform(object,q=1,os=1,bb=1) axes = sorted([(bbox[3]-bbox[0],'x',0),(bbox[4]-bbox[1],'y',1),(bbox[5]-bbox[2],'z',2)]) if useTimeline: mc.pathAnimation(object,c=motionPathCurve,wut="normal",f=1,ua=axes[0][1],fa=axes[-1][1],fm=1,stu=mc.playbackOptions(q=1,minTime=1),etu=mc.playbackOptions(q=1,maxTime=1)) else: mc.pathAnimation(object,c=motionPathCurve,wut="normal",f=1,ua=axes[0][1],fa=axes[-1][1]) flowLatticeSides = [3,3,3] flowLatticeSides[axes[-1][2]] = flowSpans mc.flow(object,dv=flowLatticeSides) selectedCurve = mc.ls(sl=1,tl=1) object = mc.ls(sl=1,hd=1) motionPathCurveOnSurface = curveOnSurfaceFromCurve(selectedCurve) motionPathWithNormalsAndFlow(object,motionPathCurveOnSurface)
zDepth control tool
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 createZDistanceTool(): '''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 run in a perspective viewport') 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 and grid resultLocator = mc.spaceLocator(n=camObj+'resultLocator')[0] resultGrid = mc.curve(p=oneCurveGrid(14,8,3.84,2.16),d=1,n=camObj+'_resultGrid') mc.setAttr(resultGrid+'.tz',keyable=False,channelBox=False ) mc.setAttr(resultGrid+'.visibility',keyable=False,channelBox=False ) #camera based system cameraGrid = mc.curve(p=oneCurveGrid(28,16,8,4.5),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) mc.parent(resultGrid,cameraGridNull) pc2 = mc.parentConstraint(projCurve,cameraGridNull,mo=False)[0] #grab existing zdepth focus distance, with renderer specific options (maxwell for now) currentDistance = 5.0 if mc.getAttr("defaultRenderGlobals.currentRenderer") == "maxwell": currentDistance= mc.getAttr(camShape+".mxFocusDistance") else: currentDistance = mc.getAttr(camShape+'.focusDistance') mc.setAttr(cameraGrid+'.tz',currentDistance) #choice system sr = mc.createNode('setRange') sr2 = mc.createNode('setRange') mc.setAttr(sr+'.oldMaxX',1) mc.setAttr(sr+'.oldMaxY',1) mc.setAttr(sr+'.maxY',0) mc.setAttr(sr+'.minY',1) mc.setAttr(sr2+'.maxX',1) mc.setAttr(sr2+'.maxY',0) mc.setAttr(sr2+'.minY',1) mc.setAttr(sr2+'.oldMaxX',.001) mc.setAttr(sr2+'.oldMinY',.999) mc.setAttr(sr2+'.oldMaxY',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') mc.setAttr(arrowObj+'.focusDistance',e=0,keyable=False,channelBox=True) mc.connectAttr(sr+'.outValue.outValueX',arrowObj+'.focusDistance',f=True) mc.connectAttr(sr+'.outValue.outValueX',resultGrid+'.tz',f=True) # mc.connectAttr(sr2+'.outValue.outValueX',resultGrid+'.visibility',f=True) mc.connectAttr(sr2+'.outValue.outValueY',cameraGrid+'.visibility',f=True) mc.setAttr(resultGrid+'.overrideEnabled',1) mc.setAttr(resultGrid+'.overrideColor',1) mc.addAttr(arrowObj,ln='useFloatingLocator',dv=0.0,min=0.0,max=1.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.connectAttr(arrowObj+'.useFloatingLocator',sr+'.valueZ',f=True) mc.connectAttr(arrowObj+'.useFloatingLocator',sr2+'.valueX',f=True) mc.connectAttr(arrowObj+'.useFloatingLocator',sr2+'.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) if mc.getAttr("defaultRenderGlobals.currentRenderer") == "maxwell": mc.connectAttr(resultLocator+'.tz',camShape+'.mxFocusDistance',f=1) mc.connectAttr(resultLocator+'.tz',camShape+'.focusDistance',f=1) mc.select(arrowObj) createZDistanceTool()
Create python generating code for given curve
import maya.cmds as mc from decimal import * getcontext().prec = 5 shp = mc.listRelatives(mc.ls(sl=1)[0],s=1)[0] cvs = mc.getAttr(shp+'.cv[*]') cvsSimple = [] for c in cvs: cvsSimple.append([float(Decimal("%.3f" % c[0])),float(Decimal("%.3f" % c[1])),float(Decimal("%.3f" % c[2]))]) out = '\n\n### run python: #################\n\nimport maya.cmds as mc\nmc.curve(p=' out += '[%s]' % ', '.join(map(str, cvsSimple)) out += ',d='+str(mc.getAttr(shp+'.degree'))+')\n\n#################################' print out
Result:
### run python: ################# import maya.cmds as mc mc.curve(p=[[0.445, 0.49, 0.0], [0.317, 0.49, 0.0], [0.189, 0.49, 0.0], [0.061, 0.49, 0.0], [0.061, 0.441, 0.0], [0.061, 0.391, 0.0], [0.061, 0.342, 0.0], ...etc ,d=3) #################################
Attach Geos to closest Geo with follicles
Uses pivot point as attach point
https://i.imgur.com/5KQ8Tiv.mp4 (howto)
import maya.cmds as mc from math import sqrt, fabs def attachThingsToThingsUI(*kwargs): '''simple ui wrapper for "attachThingsToThings" function. No error checking or fancy stuff''' if len(kwargs) == 0: #ui if mc.windowPref('AttachStuffWindow',ex=1): mc.windowPref('AttachStuffWindow',remove=1) if cmds.window('AttachStuffWindow', exists=True): cmds.deleteUI('AttachStuffWindow', window=True) window = mc.window('AttachStuffWindow',title='Attach stuff to stuff', iconName='Short Name', widthHeight=(80, 55),rtf=1 ) mc.frameLayout(mh=10,mw=10,bv=0,l="") mc.columnLayout(adjustableColumn=True ) textInfo1 = 'This script attaches objects to other objects using follicles. Parent objects require non-overlapping UVs.' textInfo2 = 'Objects will be attached from their pivot to the closest point on parent mesh. In case of multiple parents, the script will try to figure out which is the closest' textInfo3 = 'Tips: if attached objects \'jump\' when on animated objects, or are not stuck precisely, you need more polygons on your parent object(s)' mc.text(ww=1, label=textInfo1 ) mc.separator(st="none",h=4) mc.text(ww=1, label=textInfo2 ) mc.separator(st="none",h=8) mc.separator(st="in",h=4) mc.separator(st="none",h=8) mc.text(ww=1, label=textInfo3 ) mc.separator(st="none",h=8) mc.separator(st="in",h=4) mc.separator(st="none",h=8) cb1 = mc.checkBox('cboxZero', label="Add \'zero out\' parents to all objects",v=1,rs=1,annotation="creates a group above each object that takes the constrains, so that your object is still free to move - won't work with references" ) mc.checkBox('cboxCtrl', label="Add controllers to all objects",v=0,rs=1,annotation='creates \'zero-out\' controls that constrain your objects. Use if you have references and want to animate',onc=('mc.checkBox("cboxZero",e=1,ed=0)'),ofc=('mc.checkBox("cboxZero",e=1,ed=1)') ) mc.separator(st="none",h=8) mc.button( label='Set object(s) to attach',command=('mc.sets(n=\'tmp_childrenObjects_set\')') ) mc.separator(st="none",h=2) mc.button( label='Set parent object(s)', command=('mc.sets(n=\'tmp_parentObjects_set\')') ) mc.separator(st="none",h=10) mc.button( label='Apply', command=('attachThingsToThingsUI(1)') ) mc.showWindow( window ) else: children = mc.listConnections("tmp_childrenObjects_set",s=1,d=0,p=0,c=0) parents = mc.listConnections("tmp_parentObjects_set",s=1,d=0,p=0,c=0) useZeroOut = mc.checkBox("cboxZero",q=1,v=1) useCtrl = mc.checkBox("cboxCtrl",q=1,v=1) attachThingsToThings(children,parents,1,useZeroOut,useCtrl) mc.delete("tmp_childrenObjects_set","tmp_parentObjects_set") def attachThingsToThings(objects,targets,keepHierachy=True,useZeroOut=True,useCtrl=False): '''requires closestUV() closestDistanceToMesh() mag() python math -- and non overlapping UVs ''' selectedObjects = [] 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,rotatePivot=True) ro = mc.xform(o,ws=1,q=1,ro=True) bbox = mc.xform(o,ws=1,q=1,bb=True) ctrlscale = ((bbox[3]-bbox[0])+(bbox[4]-bbox[1])+(bbox[5]-bbox[2]))/3.0 for r in targets: dist = closestDistanceToMesh(p,r) if dist < smallest: smallest = dist closest = r outPos = p follicle = closestUV(outPos,closest,attachFollicle=1) eg = '' if useZeroOut and not useCtrl: eg = mc.group(em=1,n=o+'zero') mc.parent(eg,o) mc.makeIdentity(eg) mc.parent(eg,w=1) mc.parent(o,eg) elif useCtrl: eg = mc.group(em=1,n=o+'zero') s = .33*ctrlscale/2.0 ctrlr = mc.curve(n=o+'ctrl',p=[[0.0, s*3, 0.0], [0.0, s*2, -s*2], [0.0, 0.0, -s*3], [0.0, -s*2, -s*2], [0.0, -s*3, 0.0], [0.0, -s*2, s*2], [0.0, 0.0, s*3], [0.0, s*2, s*2], [0.0, s*3, 0.0], [s*2, s*2, 0.0], [s*3, 0.0, 0.0], [s*2, -s*2, 0.0], [0.0, -s*3, 0.0], [-s*2, -s*2, 0.0], [-s*3, 0.0, 0.0], [-s*2, s*2, 0.0], [0.0, s*3, 0.0]],d=1) ctrlrShp = mc.listRelatives(ctrlr,s=1)[0] mc.setAttr(ctrlrShp+'.overrideEnabled',1) mc.setAttr(ctrlrShp+'.overrideColor',12) mc.parent(ctrlr,eg) mc.setAttr(eg+'.tx',p[0]) mc.setAttr(eg+'.ty',p[1]) mc.setAttr(eg+'.tz',p[2]) mc.setAttr(eg+'.rx',ro[0]) mc.setAttr(eg+'.ry',ro[1]) mc.setAttr(eg+'.rz',ro[2]) #mc.setAttr('%s.t' % eg,p[0],p[1],p[2]) #mc.setAttr('%s.r' % eg,ro[0],ro[1],ro[2]) mc.parentConstraint(ctrlr,o,mo=1) mc.scaleConstraint(ctrlr,o,mo=1) selectedObjects.append(ctrlr) else: eg = o selectedObjects.append(o) mc.parentConstraint(follicle,eg,mo=1) if keepHierachy is True and parents is not False and useZeroOut is True and useCtrl is False: mc.parent(eg,parents[0]) #add follicles to a group, hide it fGroup = 'FolliclesGroup' if not mc.objExists(fGroup): fGroup = mc.group(follicle,n=fGroup) mc.setAttr(fGroup+'.visibility',0) else: fGroup = mc.ls(fGroup)[-1] mc.parent(follicle,fGroup) mc.select(selectedObjects) def closestUV(position,target,attachFollicle=0): '''target geo MUST have its transforms frozen''' cpom = mc.createNode( 'closestPointOnMesh') targetMeshes = mc.listRelatives(target,s=1,ni=1,f=1) #if len(targetMeshes): # mc.warning('Multiple shapes found on \''+target+'\' follicles might not be connected properly') targetMesh = targetMeshes[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] def closestDistanceToMesh(position,target): cpom = mc.createNode( 'closestPointOnMesh') targetMesh = mc.listRelatives(target,ni=1,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) def mag(v1,v2): return sqrt(pow(v2[0]-v1[0],2) + pow(v2[1]-v1[1],2) + pow(v2[2]-v1[2],2)) attachThingsToThingsUI()
Attach to Closest Point On Curve
import maya.cmds as mc def attachToClosestPointOnCurve(): #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() 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)
Make UV Check lambert
import urllib2 import os import maya.cmds as cmds tempDir = cmds.internalVar(userTmpDir=True) uvFile = tempDir+'uv1024bis.jpg'; f = open(uvFile,'wb') err = f.write(urllib2.urlopen('http://berniebernie.fr/dump/uv1024.jpg').read()) f.close() shader=cmds.shadingNode("lambert",asShader=True,name="UVlambert") file_node=cmds.shadingNode("file",asTexture=True) file_text=cmds.shadingNode("place2dTexture",asUtility=True) shading_group= cmds.sets(renderable=True,noSurfaceShader=True,empty=True) cmds.connectAttr('%s.outColor' %shader ,'%s.surfaceShader' %shading_group) cmds.connectAttr('%s.outColor' %file_node, '%s.color' %shader) cmds.connectAttr('%s.coverage' %file_text ,'%s.coverage' %file_node) cmds.connectAttr('%s.translateFrame' %file_text ,'%s.translateFrame' %file_node) cmds.connectAttr('%s.rotateFrame' %file_text ,'%s.rotateFrame' %file_node) cmds.connectAttr('%s.mirrorU' %file_text ,'%s.mirrorU' %file_node) cmds.connectAttr('%s.mirrorV' %file_text ,'%s.mirrorV' %file_node) cmds.connectAttr('%s.stagger' %file_text ,'%s.stagger' %file_node) cmds.connectAttr('%s.wrapU' %file_text ,'%s.wrapU' %file_node) cmds.connectAttr('%s.wrapV' %file_text ,'%s.wrapV' %file_node) cmds.connectAttr('%s.repeatUV' %file_text ,'%s.repeatUV' %file_node) cmds.connectAttr('%s.offset' %file_text ,'%s.offset' %file_node) cmds.connectAttr('%s.rotateUV' %file_text ,'%s.rotateUV' %file_node) cmds.connectAttr('%s.noiseUV' %file_text ,'%s.noiseUV' %file_node) cmds.connectAttr('%s.vertexUvOne' %file_text ,'%s.vertexUvOne' %file_node) cmds.connectAttr('%s.vertexUvTwo' %file_text ,'%s.vertexUvTwo' %file_node) cmds.connectAttr('%s.vertexUvThree' %file_text ,'%s.vertexUvThree' %file_node) cmds.connectAttr('%s.vertexCameraOne' %file_text ,'%s.vertexCameraOne' %file_node) cmds.connectAttr('%s.outUV' %file_text ,'%s.uv' %file_node) cmds.connectAttr('%s.outUvFilterSize' %file_text ,'%s.uvFilterSize' %file_node) cmds.setAttr( '%s.fileTextureName' %file_node,uvFile,type="string" )
Check if latest ref
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 refCheckWindow(object): onlyMissing = True def __init__(self): print "\nProcessing! Be patient =)" self.buildWin() def reinitWin(*args): w = refCheckWindow() def buttonPush(*args): refPath = dirname(args[1]) refPath = refPath.replace('/', '\\') subprocess.Popen('explorer "%s"' % refPath) def buildWin(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')]))) if mc.window("checkRefs",ex=1): mc.deleteUI("checkRefs",window=1) mc.window("checkRefs",title='Check latest Refs',resizeToFitChildren=1,w=600) scrollLayout = cmds.scrollLayout(horizontalScrollBarThickness=16,verticalScrollBarThickness=16) mc.columnLayout(adjustableColumn=True, columnAlign='center',rowSpacing=10) mc.rowLayout(numberOfColumns=3) mc.text( label=' Checking if you have latest refs : ', align='left' ) mc.checkBox("cbox", label='Only show missing refs ', v=1 ) mc.button(w=55,l="Refresh",c=self.reinitWin) mc.setParent(upLevel=True) mc.separator() for ref in fileRefs: if ref != scene: curRefNamespace = mc.referenceQuery(ref,rfn=1) curRefParent = mc.referenceQuery(curRefNamespace,rfn=1,p=1) 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]; print ".", if( mc.checkBox("cbox",q=1,v=1) and refFileName!=latestRef): mc.rowLayout(numberOfColumns=6,ann=curRefParent) mc.separator() mc.button(w=50,l=refStepName,en=0) if curRefParent: col = [(col[0]+.6)/2,(col[1]+.6)/2,(col[2]+.6)/2] mc.button(w=150,l=refCharName,bgc=col) mc.text(w=370,l=" "+refFileName+" -> "+latestRef+" ") mc.button(w=55,l="browse",c=partial(self.buttonPush, ref)) mc.separator() mc.setParent(upLevel=True) mc.separator() mc.showWindow() w = refCheckWindow()