Skip to content

Instantly share code, notes, and snippets.

@moppius
Forked from mclavan/rr_wrap.py
Last active February 14, 2017 21:16
Show Gist options
  • Save moppius/74ca6f17f0f4f4541b4ac1c3de976079 to your computer and use it in GitHub Desktop.
Save moppius/74ca6f17f0f4f4541b4ac1c3de976079 to your computer and use it in GitHub Desktop.
Ryan Roberts - Wrap Deformer
'''
Ryan Roberts - Wrap Deformer
rr_wrap.py
Description:
Ryan Roberts 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.
Paul Greveson:
Removed all dependencies on maya.cmds and used some more PyMel methods to clean up code.
Also added some simple checks to prevent errors, and removed redundant comments.
Fixed the argument order (it was inverse of Maya defaults of surfaces followed by influence object)
'''
import pymel.core as pm
def create_wrap(*args,**kwargs):
surface = args[0]
influence=args[1]
influenceShape = influence.getShape()
surfaceShape = surface.getShape()
if influenceShape is None or surfaceShape is None:
pm.warning("One or more inputs had no shape node - cannot create Wrap deformer!")
return None
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 = pm.deformer(surface, type='wrap')
wrapNode = wrapData[0]
wrapNode.setAttr('weightThreshold', weightThreshold)
wrapNode.setAttr('maxDistance', maxDistance)
wrapNode.setAttr('exclusiveBind', exclusiveBind)
wrapNode.setAttr('autoWeightThreshold', autoWeightThreshold)
wrapNode.setAttr('falloffMode', falloffMode)
pm.connectAttr(surface + '.worldMatrix[0]', wrapNode + '.geomMatrix')
duplicateData = pm.duplicate(influence, name=influence + 'Base')
base = duplicateData[0]
baseShape = base.getShape()
base.hide()
if not pm.attributeQuery('dropoff', n=influence, exists=True):
influence.addAttr('dropoff', sn='dr', dv=4.0, min=0.0, max=20.0)
influence.setAttr('dr', k=True)
if influenceShape.nodeType() == 'mesh':
if not pm.attributeQuery('smoothness', n=influence, exists=True):
influence.addAttr('smoothness', sn='smt', dv=0.0, min=0.0)
influence.setAttr('smt', k=True)
if not pm.attributeQuery('inflType', n=influence, exists=True):
influence.addAttr('inflType', at='short', sn='ift', dv=2, min=1, max=2)
pm.connectAttr(influenceShape + '.worldMesh', wrapNode + '.driverPoints[0]')
pm.connectAttr(baseShape + '.worldMesh', wrapNode + '.basePoints[0]')
pm.connectAttr(influence + '.inflType', wrapNode + '.inflType[0]')
pm.connectAttr(influence + '.smoothness', wrapNode + '.smoothness[0]')
if influenceShape.nodeType() == 'nurbsCurve' or influenceShape.nodeType() == 'nurbsSurface':
if not pm.attributeQuery('wrapSamples', n=influence, exists=True):
influence.addAttr('wrapSamples', at='short', sn='wsm', dv=10, min=1)
influence.setAttr('wsm', k=True)
pm.connectAttr(influenceShape + '.ws', wrapNode + '.driverPoints[0]')
pm.connectAttr(baseShape + '.ws', wrapNode + '.basePoints[0]')
pm.connectAttr(influence + '.wsm', wrapNode + '.nurbsSamples[0]')
pm.connectAttr(influence + '.dropoff', wrapNode + '.dropoff[0]')
return pm.nt.Wrap(wrapNode)
# sel = pm.ls(sl=True)
# create_wrap(sel[0], sel[1])
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment