import maya.OpenMaya as om
selection=om.MSelectionList()
om.MGlobal.getActiveSelectionList(selection)
dagpath=om.MDagPath()
selection.getDagPath(0, dagpath)
faces=om.MItMeshPolygon(dagpath)
vertex=om.MItMeshVertex(dagpath)
meshfn=om.MFnMesh(dagpath)
normalvectors=om.MVectorArray()
previndex=om.MScriptUtil()
previndex.createFromInt(0)
previndexPtr=previndex.asIntPtr()
area=om.MScriptUtil()
area.createFromDouble(0.0)
areaPtr=area.asDoublePtr()
vertexperpoly = om.MIntArray()
vertexlist = om.MIntArray()
skipvertex = []
while not faces.isDone():
vertexperpoly.append(faces.polygonVertexCount())
faces.next()
meshfn.getVertices(vertexperpoly,vertexlist)
faces.reset()
for j in xrange(faces.count()):
faces.setIndex(j, previndexPtr)
n = om.MVector()
faces.getNormal(n, om.MSpace.kWorld)
for i in xrange(faces.polygonVertexCount()):
facepoints=om.MPointArray()
faces.getPoints(facepoints, om.MSpace.kWorld)
v1 = None
v2 = None
if i == 0:
v1=facepoints[i+1]-facepoints[i]
v2=facepoints[i+2]-facepoints[i]
else:
v1=facepoints[i-1]-facepoints[i]
v2=facepoints[i+2]-facepoints[i]
angle = v1.angle(v2)
currentvertex=faces.vertexIndex(i)
if currentvertex in skipvertex:
continue
vertex.setIndex(currentvertex, previndexPtr)
hoodfaces=om.MIntArray()
vertex.getConnectedFaces(hoodfaces)
for f in hoodfaces:
if f == j:
continue
faces.setIndex(f, previndexPtr)
currentnormal = om.MVector()
faces.getArea(areaPtr, om.MSpace.kWorld)
faces.getNormal(currentnormal, om.MSpace.kWorld)
scalar = (area.getDouble(areaPtr)) * angle
n += currentnormal * scalar
n.normalize() #normalize vertex normal
normalvectors.append(n) #append to normal vector array
skipvertex.append(currentvertex)
meshfn.setVertexNormals(normalvectors,vertexlist,om.MSpace.kWorld)
I get this :
// Error: (kInvalidParameter): No element at given index
# Traceback (most recent call last):
# File "<maya console>", line 52, in <module>
# File "S:\Maya_2017_DI\build\Release\runTime\Python\Lib\site-packages\maya\OpenMaya.py", line 8714, in vertexIndex
# RuntimeError: (kInvalidParameter): No element at given index //
the MItMeshPolygon.vertexIndex fails , but it shouldn't :'(
my code is based on a trick with face relative index range (0 - (face vert count-1))
and this method would've allow me to get globel space index to set it for vertex iterator (MItMeshVertex) right after