SCDrumz

sample mesh tool

May 30th, 2014
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.04 KB | None | 0 0
  1. import cPickle
  2. import json
  3.  
  4. from PySide import QtCore, QtGui
  5. import shiboken
  6.  
  7. import maya.cmds as cmds
  8. import maya.OpenMaya as om
  9. import maya.OpenMayaUI as omui
  10.  
  11. def getMainWindow():
  12.     ptr = omui.MQtUtil.mainWindow()
  13.     qObj = shiboken.wrapInstance(long(ptr), QtCore.QObject)
  14.     metaObj = qObj.metaObject()
  15.     cls = metaObj.className()
  16.     superCls = metaObj.superClass().className()
  17.     if hasattr(QtGui, cls):
  18.         base = getattr(QtGui, cls)
  19.     elif hasattr(QtGui, superCls):
  20.         base = getattr(QtGui, superCls)
  21.     else:
  22.         base = QtGui.QWidget
  23.     mainWin = shiboken.wrapInstance(long(ptr), base)
  24.     return mainWin
  25.  
  26. class MeshObject(object):
  27.     def __init__(self, obj=None, options=None):
  28.         super(MeshObject, self).__init__()
  29.  
  30.         if obj is not None:
  31.             self._parseObj(obj)
  32.         elif options is not None:
  33.             options = cPickle.loads(options)
  34.  
  35.     def data(self):
  36.         return json.dumps(self.meshes)
  37.  
  38.     def create(self, name=None):
  39.         if name is None:
  40.             name = "mesh"
  41.         transform = om.MFnTransform()
  42.         transform = transform.create()
  43.         transDepNode = om.MFnDependencyNode(transform)
  44.         transDepNode.setName(name)
  45.         for index, mesh in enumerate(self.meshes):
  46.             numVertices = mesh["numVerts"]
  47.             numPolygons = mesh["numPolys"]
  48.             verts = om.MPointArray()
  49.             for v in mesh["verts"]:
  50.                 verts.append(om.MPoint(v[0], v[1], v[2]))
  51.             polygonCounts = om.MIntArray()
  52.             for p in mesh["polyCounts"]:
  53.                 polygonCounts.append(p)
  54.             polygonConnects = om.MIntArray()
  55.             for p in mesh["polyConnects"]:
  56.                 polygonConnects.append(p)
  57.  
  58.             meshObj = om.MFnMesh()
  59.             meshObj = meshObj.create(numVertices, numPolygons, verts,
  60.                                      polygonCounts, polygonConnects, transform)
  61.             meshDepNode = om.MFnDependencyNode(meshObj)
  62.  
  63.             normalsArr = om.MVectorArray()
  64.             faceArr = om.MIntArray()
  65.             vertArr = om.MIntArray()
  66.             for n in mesh["normals"]:
  67.                 normalsArr.append(om.MVector(n[0], n[1], n[2]))
  68.             for face, count in enumerate(mesh["polyCounts"]):
  69.                 for i in range(count):
  70.                     faceArr.append(face)
  71.             for vert in mesh["polyConnects"]:
  72.                 vertArr.append(vert)
  73.             meshObj.setFaceVertexNormals(normalsArr, faceArr, vertArr)
  74.  
  75.     def _parseObj(self, objToParse):
  76.         sel = om.MSelectionList()
  77.         sel.add(objToParse)
  78.         obj = om.MObject()
  79.         path = om.MDagPath()
  80.         sel.getDagPath(0, path, obj)
  81.         if path.hasFn(om.MFn.kTransform):
  82.             transform = om.MFnTransform(path)
  83.             node = om.MFnDagNode(path)
  84.             if node.childCount() > 0:
  85.                 shapes = []
  86.                 for index in range(node.childCount()):
  87.                     childObj = node.child(index)
  88.                     if childObj.hasFn(om.MFn.kMesh):
  89.                         shapes.append(om.MFnMesh(childObj))
  90.                 if len(shapes) != 0:
  91.                     self.meshes = []
  92.                     for shape in shapes:
  93.                         meshInfo = {}
  94.                         meshInfo["numVerts"] = shape.numVertices()
  95.                         meshInfo["numPolys"] = shape.numPolygons()
  96.                         meshInfo["verts"] = []
  97.                         v = om.MPoint()
  98.                         for vIndex in range(shape.numVertices()):
  99.                             shape.getPoint(vIndex, v)
  100.                             meshInfo["verts"].append((v.x, v.y, v.z))
  101.  
  102.                         meshInfo["polyCounts"] = []
  103.                         meshInfo["polyConnects"] = []
  104.                         connectedVertsArr = om.MIntArray();
  105.                         for pIndex in range(shape.numPolygons()):
  106.                             meshInfo["polyCounts"].append(shape.polygonVertexCount(pIndex))
  107.                             shape.getPolygonVertices(pIndex, connectedVertsArr)
  108.                             for vIndex in range(connectedVertsArr.length()):
  109.                                 meshInfo["polyConnects"].append(int(connectedVertsArr[vIndex]))
  110.  
  111.                         meshInfo["normals"] = []
  112.                         normalsArr = om.MFloatVectorArray()
  113.                         shape.getNormals(normalsArr)
  114.                         for nIndex in range(normalsArr.length()):
  115.                             normal = normalsArr[nIndex]
  116.                             meshInfo["normals"].append((normal.x, normal.y, normal.z))
  117.  
  118.                         self.meshes.append(meshInfo)
  119.                 else:
  120.                     om.MGlobal.displayError("{0} has no valid meshes attached".format(path.fullPathName))
  121.             else:
  122.                 om.MGlobal.displayError("{0} has no child nodes.".format(path.fullPathName()))
  123.         else:
  124.             om.MGlobal.displayError("{0} is not a transform.".format(path.fullPathName()))
  125.  
  126.     def __repr__(self):
  127.         pass
  128.  
  129.     def __str__(self):
  130.         values = []
  131.         values.append("Mesh Object:\n")
  132.         values.append("    Meshes:\n")
  133.         for index, mesh in enumerate(self.meshes):
  134.             values.append("        Mesh {0}:\n".format(index))
  135.             values.append("            Number of Verts: {0}\n".format(mesh["numVerts"]))
  136.             values.append("            Number of Polys: {0}\n".format(mesh["numPolys"]))
  137.             values.append("            Verts:\n")
  138.             for v in mesh["verts"]:
  139.                 values.append("                {0}\n".format(v))
  140.             values.append("            Poly Counts:\n")
  141.             for i, p in enumerate(mesh["polyCounts"]):
  142.                 values.append("                {0}: {1}\n".format(i, p))
  143.             values.append("            Poly Connects:\n")
  144.             for i, p in enumerate(mesh["polyConnects"]):
  145.                 values.append("                {0}: {1}\n".format(i, p))
  146.             values.append("            Normals:\n")
  147.             for i, n in enumerate(mesh["normals"]):
  148.                 values.append("                {0}: {1}\n".format(i, n))
  149.  
  150.         return ''.join([val for val in values])
  151.  
  152. class MeshUI(QtGui.QMainWindow):
  153.     def __init__(self, parent=None):
  154.         super(MeshUI, self).__init__(parent)
  155.         self.setWindowTitle("Mesh Tool")
  156.  
  157.         widget = QtGui.QWidget()
  158.         layout = QtGui.QVBoxLayout()
  159.  
  160.         button = QtGui.QPushButton("Get Mesh Info")
  161.         button.clicked.connect(self.getInfo)
  162.         layout.addWidget(button)
  163.  
  164.         widget.setLayout(layout)
  165.         self.setCentralWidget(widget)
  166.         self.show()
  167.  
  168.     def getInfo(self):
  169.         objs = cmds.ls(selection=True, type="transform")
  170.         if len(objs) > 0:
  171.             for obj in objs:
  172.                 cObj = MeshObject(obj)
  173.                 print str(cObj)
  174.                 cObj.create()
  175.         else:
  176.             cmds.warning("Please select one or more root objects")
  177.  
  178. if __name__ == '__main__':
  179.     MeshUI(getMainWindow())
Advertisement
Add Comment
Please, Sign In to add comment