A good way to store mesh components in a set ?

52 visningar
Hoppa till det första olästa meddelandet

Alejandro

oläst,
17 juni 2021 19:44:252021-06-17
till Python Programming for Autodesk Maya
Hello guys!,

What would be the fastest solution to store all the face components for each object I select into its correspondent set?

I'm trying something like this:

mesh = maya.cmds.ls(selection=True, type='mesh')[0]
selection_list = OpenMaya.MSelectionList()
selection_list.add(mesh)
dag_path = selection_list.getDagPath(0)
mfn_mesh = OpenMaya.MFnMesh(dag_path)

v_count, ids = mfn_mesh.getTriangles()

but these are only triangle counts and vtx indexes, how could I have the full face element and store in a set ?

thank you !



Marcus Ottosson

oläst,
18 juni 2021 03:01:432021-06-18
till python_in...@googlegroups.com

Something like this should have you covered.

for mesh in cmds.ls(selection=True, type="mesh"):
    cmds.select("%s.f[0:]" % mesh)
    cmds.sets(name="%s_set" % mesh)

The .f[] syntax is for selecting faces, it’s what you see echoed in the Script Editor as you select a face interactively via the viewport.


--
You received this message because you are subscribed to the Google Groups "Python Programming for Autodesk Maya" group.
To unsubscribe from this group and stop receiving emails from it, send an email to python_inside_m...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/python_inside_maya/24a2b1e9-f975-4461-97a1-e1155b235973n%40googlegroups.com.

Alejandro

oläst,
18 juni 2021 07:38:532021-06-18
till Python Programming for Autodesk Maya
Thanks a lot Marcus, 

I was looking for an option with the API for speed, since I have scenes with more than 1k objects, do you think it's not needed in this case ?

Marcus Ottosson

oläst,
18 juni 2021 09:42:352021-06-18
till python_in...@googlegroups.com
You tell me. How long does it take currently? How often do you intend on running it? How long would you like it to take?

Alejandro

oläst,
18 juni 2021 09:56:392021-06-18
till Python Programming for Autodesk Maya
I made a few tests on the usual number of elements, 2k / 1k, and it goes smoothly, not bad!

Thanks a lot Marcus :)

Marcus Ottosson

oläst,
18 juni 2021 10:12:392021-06-18
till python_in...@googlegroups.com

Cool. :) It should be fast, you’re more or less passing the burden of actually iterating over the scene to those two commands which are already implemented in C++. So it’s likely that trying to replicate this via the Python API would be more expensive.


Juan Moraga

oläst,
18 juni 2021 12:54:492021-06-18
till python_in...@googlegroups.com
I totally agree. I had a problem like this before and I ended up using a method similar to Marcus'.
As an additional note, something I found handy in the past was the "-flatten" flag of the cmds.ls() command, which will return you a list with one item for each component (faces, verts etc.).

for mesh in cmds.ls(selection=True, type="transform"):
    faces = cmds.ls(mesh + ".f[0:]", fl = True)
    print(faces)

By the way, wouldn't the ls() in the for loop be with the type = "transform" flag instead of type = "mesh" flag?

Kind regards,





--
Juan Moraga
Lead Technical Director @ MondoTV

Portfolio: https://juanmoraga.carbonmade.com/
LInkedin: https://www.linkedin.com/in/juanmoragamartin/

Rudi Hammad

oläst,
19 juni 2021 08:26:112021-06-19
till Python Programming for Autodesk Maya
Not sure if that is what you are looking for, but if you want  to use the API you can do something like

mSel = OpenMaya.MSelectionList()
mSel.add("yourObject")
mDag = OpenMaya.MDagPath()
cmpMObj = OpenMaya.MObject()
mSel.getDagPath(0, mDag, cmpMObj)

faces = list()
mIt = OpenMaya.MItMeshPolygon(mDag, cmpMObj)
while not mIt.isDone():
    faces.append(mIt.index())
    mIt.next()
Svara alla
Svara författaren
Vidarebefordra
0 nya meddelanden