I have ported Julian's Answer to Python but I am getting an error:
// Error: Cannot find procedure "isValidAttrName". //
Any ideas?
"""
import maya, os, sys
cmds = maya.cmds
#Save file here as "vfxOverflow.py"
devPath = "/home/samh/"
print sys.path
if devPath not in sys.path:
#sys.path = list(sys.path.replace(devPath + ":","")
sys.path.insert(0,devPath)
import vfxOverflow
reload(vfxOverflow)
#maya.cmds.delete("locator*")
maya.cmds.file(new=True,force=True)
newGrid = maya.cmds.polyPlane(ch=False,o=True,width=25,height=25,cuv=2,sw=10,sh=10)[0]
newGridShape = maya.cmds.listRelatives(shapes=True)[0]
maya.cmds.select(newGridShape)
vfxOverflow.paintedLocators()
"""
import maya
def makeLocatorsAtVertices( shapeNode,template=True):
polyE = maya.cmds.polyEvaluate()
count = polyE["vertex"]
positions = [maya.cmds.getAttr("%s.vt[%d]" % (shapeNode,i) )[0] for i in range(count)]
locators = ["%s" % maya.cmds.spaceLocator(position=(0,0,0))[0] for i in range(count)]
[maya.cmds.setAttr("%s.translateX" % locators[i],positions[i][0]) for i in range(count)]
[maya.cmds.setAttr("%s.translateY" % locators[i],positions[i][1]) for i in range(count)]
[maya.cmds.setAttr("%s.translateZ" % locators[i],positions[i][2]) for i in range(count)]
[maya.cmds.setAttr("%s.template"%i,template) for i in locators]
return locators
def paintedLocators(attrs = ["tx","ty","tz","rx","ry","rz","sx","sy","sz"], attributePrefix = "feather",scaleMax=5.0,transMax=5.0):
shape = maya.cmds.ls(selection=True,dag=True,type="mesh")[0]
locs = makeLocatorsAtVertices(shape)
count = len(locs)
isFirst = 1
counter = 0
print attrs
for i in attrs:
print i
isScale = ("s"==i[0])
isRotation = ("r"==i[0])
isTranslation = ("t"==i[0])
print maya.cmds.addAttr(shape,longName="%s_%s" % (attributePrefix,i),defaultValue=0.5,indexMatters=True,multi=True,attributeType="float")
print maya.cmds.makePaintable( "mesh", "%s_%s" % (attributePrefix,i),attrType = "multiFloat")
for j in range(count):
attributeData = "%s.%s_%s[%d]" % (shape,attributePrefix,i,j)
print maya.cmds.getAttr(attributeData)
locatorData = "%s.%s" % (locs[j],i)
if isScale:
maya.cmds.expression(string="%s=1 + (%s - 0.5)*%s" % (locatorData,attributeData,2*scaleMax))
if isRotation:
maya.cmds.expression(string="%s=(%s - 0.5)*%s" % (locatorData,attributeData,2*180))
if isTranslation:
initialLocation = maya.cmds.getAttr("%s.%s" % (locs[j],i))
maya.cmds.expression(string="%s=%s + (%s - 0.5)*%s" % (locatorData,initialLocation,attributeData,2*transMax))