Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from pymel.all import *
- import maya.OpenMaya as OpenMaya
- import maya.mel as mel
- import maya.cmds as cmds
- import time
- step = 100
- ######################################
- def mag(p1,p2):
- return ((p1[0]-p2[0])**2+(p1[1]-p2[1])**2+(p1[2]-p2[2])**2)**.5
- def fillOptimized():
- if(len(ls(sl=1))):
- obj=cmds.ls(sl=1)[0]
- objList = OpenMaya.MSelectionList()
- objList.add(obj)
- path = OpenMaya.MDagPath()
- objList.getDagPath(0,path)
- path.extendToShape()
- closest = OpenMaya.MMeshIntersector()
- closest.create(path.node(),path.inclusiveMatrix())
- try:
- particleFill(rs=step,maxX=1,maxY=1,maxZ=1,minX=0,minY=0,minZ=0,pd=1,cp=1)
- except:
- pass
- part = cmds.ls(sl=1)[0]
- partShape = cmds.listRelatives(part,shapes=1)[0]
- nplist = OpenMaya.MSelectionList()
- nplist.add(partShape)
- npobj = OpenMaya.MObject()
- nplist.getDependNode(0,npobj)
- npnode = OpenMaya.MFnDependencyNode(npobj)
- nplug = npnode.findPlug("position")
- nhdl = nplug.asMDataHandle()
- ndata = OpenMaya.MFnVectorArrayData(nhdl.data())
- points = OpenMaya.MVectorArray()
- points.copy(ndata.array())
- delete(part)
- rayons=OpenMaya.MDoubleArray()
- for p in range(points.length()):
- mpom = OpenMaya.MPointOnMesh()
- closest.getClosestPoint(OpenMaya.MPoint(points[p]),mpom)
- closestPoint = mpom.getPoint()
- rayons.append(mag(points[p],closestPoint))
- newPoints,newRayons = OpenMaya.MVectorArray(),OpenMaya.MDoubleArray()
- while points.length()>0:
- print "%s problem points still left..." % points.length()
- action,p,max,maxId = 0,OpenMaya.MVector(),-1.0,-1
- for i in range(points.length()):
- if rayons[i]>max:
- max,p,maxId=rayons[i],points[i],i
- points.remove(maxId)
- rayons.remove(maxId)
- newPoints.append(p)
- newRayons.append(max*1.2)
- i=0
- while i<points.length():
- if mag(p,points[i])<rayons[i]+max:
- points.remove(i)
- rayons.remove(i)
- else:
- i=i+1
- #note: the default nParticle creation mode should be set to "points"
- part = cmds.nParticle()[1]
- plist = OpenMaya.MSelectionList()
- plist.add(part)
- newNPObj = OpenMaya.MObject()
- plist.getDependNode(0,newNPObj)
- newNPNode = OpenMaya.MFnDependencyNode(newNPObj)
- newPosPlug = newNPNode.findPlug("position")
- newNPHdl = newPosPlug.asMDataHandle()
- newposdata = OpenMaya.MFnVectorArrayData(newNPHdl.data())
- newposdata.set(newPoints)
- newPosPlug.setMObject(newposdata.object())
- prt = newNPNode.findPlug("particleRenderType")
- prt.setInt(4)
- isg = newNPNode.findPlug("ignoreSolverGravity")
- isg.setInt(1)
- tattr = OpenMaya.MFnTypedAttribute()
- rpp = tattr.create("radiusPP","rpp",OpenMaya.MFnData.kDoubleArray)
- newNPNode.addAttribute(rpp)
- rppPlug = newNPNode.findPlug("radiusPP")
- rpphdl = rppPlug.asMDataHandle()
- rppdata = OpenMaya.MFnDoubleArrayData(rpphdl.data())
- rppdata.set(newRayons)
- rppPlug.setMObject(rppdata.object())
- print "finished."
- else:
- print("no mesh selected !")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement