Skip to content

Instantly share code, notes, and snippets.

@mclavan
Last active September 26, 2023 05:35
Show Gist options
  • Save mclavan/276a2b26cab5bc22d882 to your computer and use it in GitHub Desktop.
Save mclavan/276a2b26cab5bc22d882 to your computer and use it in GitHub Desktop.
Ryan Roberts - Wrap Deformer
'''
Ryan Roberts - Wrap Deformer
rr_wrap.py
Description:
Ryan Robers created a simple function to create a wrap deformer.
The wrap deformer needs a little more than the deform command to get working.
Michael Clavan
I wanted to have the function also return the deformer to the user. So, my contributions are pretty minor.
I converted the wrap deformer into a pynode object type pm.nt.Wrap.
'''
import maya.cmds as cmds
import pymel.core as pm
def createWrap(*args,**kwargs):
influence=args[0]
surface = args[1]
shapes = cmds.listRelatives(influence,shapes=True)
influenceShape = shapes[0]
shapes = cmds.listRelatives(surface,shapes=True)
surfaceShape = shapes[0]
#create wrap deformer
weightThreshold = kwargs.get('weightThreshold',0.0)
maxDistance = kwargs.get('maxDistance',1.0)
exclusiveBind = kwargs.get('exclusiveBind',False)
autoWeightThreshold = kwargs.get('autoWeightThreshold',True)
falloffMode = kwargs.get('falloffMode',0)
wrapData = cmds.deformer(surface, type='wrap')
wrapNode = wrapData[0]
cmds.setAttr(wrapNode+'.weightThreshold',weightThreshold)
cmds.setAttr(wrapNode+'.maxDistance',maxDistance)
cmds.setAttr(wrapNode+'.exclusiveBind',exclusiveBind)
cmds.setAttr(wrapNode+'.autoWeightThreshold',autoWeightThreshold)
cmds.setAttr(wrapNode+'.falloffMode',falloffMode)
cmds.connectAttr(surface+'.worldMatrix[0]',wrapNode+'.geomMatrix')
#add influence
duplicateData = cmds.duplicate(influence,name=influence+'Base')
base = duplicateData[0]
shapes = cmds.listRelatives(base,shapes=True)
baseShape = shapes[0]
cmds.hide(base)
#create dropoff attr if it doesn't exist
if not cmds.attributeQuery('dropoff',n=influence,exists=True):
cmds.addAttr( influence, sn='dr', ln='dropoff', dv=4.0, min=0.0, max=20.0 )
cmds.setAttr( influence+'.dr', k=True )
#if type mesh
if cmds.nodeType(influenceShape) == 'mesh':
#create smoothness attr if it doesn't exist
if not cmds.attributeQuery('smoothness',n=influence,exists=True):
cmds.addAttr( influence, sn='smt', ln='smoothness', dv=0.0, min=0.0 )
cmds.setAttr( influence+'.smt', k=True )
#create the inflType attr if it doesn't exist
if not cmds.attributeQuery('inflType',n=influence,exists=True):
cmds.addAttr( influence, at='short', sn='ift', ln='inflType', dv=2, min=1, max=2 )
cmds.connectAttr(influenceShape+'.worldMesh',wrapNode+'.driverPoints[0]')
cmds.connectAttr(baseShape+'.worldMesh',wrapNode+'.basePoints[0]')
cmds.connectAttr(influence+'.inflType',wrapNode+'.inflType[0]')
cmds.connectAttr(influence+'.smoothness',wrapNode+'.smoothness[0]')
#if type nurbsCurve or nurbsSurface
if cmds.nodeType(influenceShape) == 'nurbsCurve' or cmds.nodeType(influenceShape) == 'nurbsSurface':
#create the wrapSamples attr if it doesn't exist
if not cmds.attributeQuery('wrapSamples',n=influence,exists=True):
cmds.addAttr( influence, at='short', sn='wsm', ln='wrapSamples', dv=10, min=1 )
cmds.setAttr( influence+'.wsm', k=True )
cmds.connectAttr(influenceShape+'.ws',wrapNode+'.driverPoints[0]')
cmds.connectAttr(baseShape+'.ws',wrapNode+'.basePoints[0]')
cmds.connectAttr(influence+'.wsm',wrapNode+'.nurbsSamples[0]')
cmds.connectAttr(influence+'.dropoff',wrapNode+'.dropoff[0]')
# I want to return a pyNode object for the wrap deformer.
# I do not see the reason to rewrite the code here into pymel.
# return wrapNode
return pm.nt.Wrap(wrapNode)
# selected = cmds.ls(sl=True)
# createWrap(selected[0],selected[1])
#
@Changelhc
Copy link

good job

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment