Krioxbam
Krioxbam

Reputation: 25

How to retrieve the created vertices of cmds.polyExtrude on Maya

I'm writing a script to change the position of the vertices created by an extrude command given a specific vector. But I can't find a way to get the newly generated vertices/faces/edges.

I tried looking in cmds.getAttr('polyExtrudeFace1') or the query mode of cmds.polyExtrudeFacet, but I can't find the right attribute/flag to get what I need.

Upvotes: 2

Views: 638

Answers (2)

Green Cell
Green Cell

Reputation: 4783

When applying cmds.polyExtrudeFacet onto a mesh, Maya will automatically select the new faces. Knowing this, it's easy to convert the face components to the new vertexes:

cmds.polySphere(name="pSphere1") # Create a sphere to test with.
cmds.polyExtrudeFacet("pSphere1.f[10]") # Extrude a random face.
sel = cmds.polyListComponentConversion(cmds.ls("*.f[*]", sl=True), fromFace=True, toVertex=True) # Convert faces to verts. Filter `ls` to only get face selections.
cmds.select(sel) # Select the newly created vertexes.

Upvotes: 0

DrWeeny
DrWeeny

Reputation: 2512

Im not sure if there is a nice way to get the new extruded component ids but you can easily find it if you have a tool to get the before state. One other way would be to desactivate every construction nodes , enable the polyExtrudeFace one by one and fill up a dic and then re-enable everything. Here is an example to select the latest vertices on an extruded object :

'''
This script only work on the last polyExtrudeFace and on vertex
'''
# get the object
sel = cmds.ls(sl=True, o=True)
# get the extrude nodes, useful to create a dic with all polyExtrudeFace new component ids 
extrudenodes = [e for e in cmds.listHistory(sel) if cmds.nodeType(e) == 'polyExtrudeFace']
#current vtx count
current_vtx_nb = cmds.polyEvaluate(sel, v=1)
# disable a polyExtude
cmds.setAttr("{}.nodeState".format(extrudenodes[0]), 1)
# get the previous number
previous_vtx_nb = cmds.polyEvaluate(sel, v=1)
# re-enable it
cmds.setAttr("{}.nodeState".format(extrudenodes[0]), 0)
# get the range
nb = current_vtx_nb - previous_vtx_nb
mrang = [current_vtx_nb-nb,current_vtx_nb]
# recreate the vtx s3election
out = ['{}.vtx[{}]'.format(sel[0], i) for i in range(*mrang)]
# select the vertex
cmds.select(out)

EDIT :

here is an example of the building dictionnary loop :

import maya.cmds as cmds

'''
This script build the vertices data loop
'''

class Counter:
    idCounter = 0
    def __init__(self):
        Counter.idCounter += 1


def loopIncSel():
    'relaunch the command to loop throught all key of the dic'
    if sorted(dataExtrude.keys()):
        count = Counter().idCounter % len(dataExtrude.keys())
        k = dataExtrude.keys()[count]
        cmds.select(dataExtrude[k])


# get the object
sel = cmds.ls(sl=True, o=True)
# get the extrude nodes, useful to create a dic with all polyExtrudeFace new component ids 
extrudenodes = [e for e in cmds.listHistory(sel) if cmds.nodeType(e) == 'polyExtrudeFace']
# dic data :
dataExtrude = {}
for n in extrudenodes:
    cmds.setAttr("{}.nodeState".format(n), 1)

# reverse the processus to re-enable, 
# note that if there is node in between creating vertices and faces, it won't work
for n in extrudenodes[::-1]:
    # get the previous number
    previous_vtx_nb = cmds.polyEvaluate(sel, v=1)
    # re-enable it
    cmds.setAttr("{}.nodeState".format(n), 0)
    #current vtx count
    current_vtx_nb = cmds.polyEvaluate(sel, v=1)

    # get the range
    nb = current_vtx_nb - previous_vtx_nb
    mrang = [current_vtx_nb-nb,current_vtx_nb]
    # recreate the vtx s3election
    dataExtrude[n] = ['{}.vtx[{}]'.format(sel[0], i) for i in range(*mrang)]
# select the vertex
# cmds.select(dataExtrude['polyExtrudeFace3'])
loopIncSel()

Upvotes: 1

Related Questions