"""Utility methods for meshes.
:created: 05/03/2017
:author: Benoit GIELLY <benoit.gielly@gmail.com>
"""
from __future__ import absolute_import
import logging
from maya import cmds
from maya.api import OpenMaya
import bgdev.utils.decorator
LOG = logging.getLogger(__name__)
[docs]def mesh_combine_and_keep(nodes=None, visible=True):
"""Combine meshes and keep the original."""
nodes = nodes or cmds.ls(selection=True)
name = nodes[0].rsplit("_", 1)[0]
# mesh combine
combined, unite = cmds.polyUnite(nodes, constructionHistory=True)
combined = cmds.rename(combined, name + "_combined")
unite = cmds.rename(unite, name + "_polyUnite")
# parent combined mesh
parent = cmds.listRelatives(nodes[0], parent=True)
cmds.parent(combined, parent)
cmds.reorder(combined, front=True)
# turn shapes back on and parent them under their original transform
for each in nodes:
transform = cmds.listRelatives(each, children=True)[0]
shape = cmds.listRelatives(transform, shapes=True)[0]
cmds.parent(shape, each, relative=True, shape=True)
cmds.setAttr(shape + ".intermediateObject", False)
cmds.delete(transform)
cmds.setAttr(shape + ".visibility", visible)
return combined
[docs]@bgdev.utils.decorator.UNDO
def mesh_reorder_callback():
"""Reorder or remap vertices of selected mesh(es)."""
cmds.loadPlugin("meshReorder", quiet=True)
if not cmds.selectPref(query=True, trackSelectionOrder=True):
cmds.selectPref(trackSelectionOrder=True)
cmds.select(clear=True)
LOG.warning(
'Turning on the "Track selection order" option. '
"Please, select your vertices again!"
)
return
vertice = cmds.ls(orderedSelection=True, flatten=True)
if len(vertice) == 3:
cmds.meshReorder(*vertice)
elif len(vertice) == 6:
cmds.meshRemap(*vertice)
else:
LOG.error("Please, select 3 vertices of one or each meshes")
[docs]@bgdev.utils.decorator.UNDO
def find_phantom_vertices(fix=False):
"""Find meshes with incorrect amount of vertices.
Args:
fix (bool): Apply a fix to remove phantom vertices when True.
"""
if cmds.objExists("PHANTOM_VERTICES_SET"):
cmds.delete("PHANTOM_VERTICES_SET")
bad_meshes = []
it_meshes = OpenMaya.MItDependencyNodes(OpenMaya.MFn.kMesh)
while not it_meshes.isDone():
dag = OpenMaya.MDagPath.getAPathTo(it_meshes.thisNode())
it_vertice = OpenMaya.MItMeshVertex(dag)
while not it_vertice.isDone():
if not it_vertice.getConnectedEdges():
bad_meshes.append(dag.fullPathName())
it_vertice.next()
it_meshes.next()
if not bad_meshes:
LOG.info("Scene seems clean, well done!")
return
if not fix:
cmds.sets(bad_meshes, name="PHANTOM_VERTICES_SET")
LOG.info("Phantom vertices found, adding the meshes to a set!")
return
# a "safe" way to cleanup the phantom vertices is to extrude one edge
# and removing the face it has created.
for each in bad_meshes:
cmds.polyExtrudeEdge(
"{0}.e[1]".format(each),
translateZ=True,
constructionHistory=False,
)
face_id = cmds.polyEvaluate(each, face=True) - 1
cmds.delete(
"{0}.f[{1}]".format(each, face_id), constructionHistory=False,
)