Skip to content

Instantly share code, notes, and snippets.

@zclongpop123
Last active November 3, 2021 14:46
Show Gist options
  • Save zclongpop123/6dc3c78ebc0f322899f1e389f3148753 to your computer and use it in GitHub Desktop.
Save zclongpop123/6dc3c78ebc0f322899f1e389f3148753 to your computer and use it in GitHub Desktop.
检查对比资产信息
#========================================
# author: Changlong.Zang
# mail: zclongpop123@163.com
# time: Mon Oct 18 21:40:17 2021
#========================================
import os
import glob
import json
import md5
import maya.cmds as mc
import pymel.core as pm
import maya.OpenMaya as OpenMaya
from StringIO import StringIO
from pprint import pprint
#--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
def check_topology(geo):
'''
'''
str_data = StringIO()
geo_api_obj = pm.PyNode(geo).__apiobject__()
iterattor = OpenMaya.MItMeshPolygon(geo_api_obj)
vertex_index = OpenMaya.MIntArray()
while not iterattor.isDone():
iterattor.getVertices(vertex_index)
str_data.write(str(iterattor.index()))
str_data.write(' ')
str_data.write(','.join([str(x) for x in sorted(vertex_index)]))
str_data.write('\n')
iterattor.next()
#print str_data.getvalue()
return md5.new(str_data.getvalue()).hexdigest()
def check_hierarchy(srf_path, rig_path, cfx_path):
'''
'''
result = dict()
for mesh in mc.ls(mc.referenceQuery(srf_path, n=True), typ='mesh', long=True):
if mc.getAttr('{0}.io'.format(mesh)):
continue
srf_node = mc.listRelatives(mesh, p=True, fullPath=True)[0]
rig_node = srf_node.replace('SRF:', 'RIG:')
cfx_node = srf_node.replace('SRF:', 'CFX:')
#- SRF
if not mc.objExists(srf_node):
result.setdefault('srf', dict()).setdefault('toplogy', dict())[srf_node.replace('SRF:', '')] = 'Null'
result.setdefault('srf', dict()).setdefault('uvmap', dict())[srf_node.replace('SRF:', '')] = list()
else:
result.setdefault('srf', dict()).setdefault('toplogy', dict())[srf_node.replace('SRF:', '')] = check_topology(srf_node)
mfn = OpenMaya.MFnMesh(pm.PyNode(srf_node).__apimdagpath__())
uv_names = list()
mfn.getUVSetNames(uv_names)
result.setdefault('srf', dict()).setdefault('uvmap', dict())[srf_node.replace('SRF:', '')] = uv_names
uv_data = dict()
for uvset in uv_names:
u_array = OpenMaya.MFloatArray()
v_array = OpenMaya.MFloatArray()
mfn.getUVs(u_array, v_array, uvset)
uv_data[uvset] = {'u':len(u_array), 'v':len(v_array)}
result.setdefault('srf', dict()).setdefault('uvdata', dict())[srf_node.replace('SRF:', '')] = uv_data
#- RIG
if not mc.objExists(rig_node):
result.setdefault('rig', dict()).setdefault('toplogy', dict())[rig_node.replace('RIG:', '')] = 'Null'
else:
result.setdefault('rig', dict()).setdefault('toplogy', dict())[rig_node.replace('RIG:', '')] = check_topology(rig_node)
mfn = OpenMaya.MFnMesh(pm.PyNode(rig_node).__apimdagpath__())
uv_names = list()
mfn.getUVSetNames(uv_names)
result.setdefault('rig', dict()).setdefault('uvmap', dict())[rig_node.replace('RIG:', '')] = uv_names
uv_data = dict()
for uvset in uv_names:
u_array = OpenMaya.MFloatArray()
v_array = OpenMaya.MFloatArray()
mfn.getUVs(u_array, v_array, uvset)
uv_data[uvset] = {'u':len(u_array), 'v':len(v_array)}
result.setdefault('rig', dict()).setdefault('uvdata', dict())[rig_node.replace('RIG:', '')] = uv_data
#- CFX
if not mc.objExists(cfx_node):
result.setdefault('cfx', dict()).setdefault('toplogy', dict())[cfx_node.replace('CFX:', '')] = 'Null'
else:
result.setdefault('cfx', dict()).setdefault('toplogy', dict())[cfx_node.replace('CFX:', '')] = check_topology(cfx_node)
mfn = OpenMaya.MFnMesh(pm.PyNode(cfx_node).__apimdagpath__())
uv_names = list()
mfn.getUVSetNames(uv_names)
result.setdefault('cfx', dict()).setdefault('uvmap', dict())[cfx_node.replace('CFX:', '')] = uv_names
uv_data = dict()
for uvset in uv_names:
u_array = OpenMaya.MFloatArray()
v_array = OpenMaya.MFloatArray()
mfn.getUVs(u_array, v_array, uvset)
uv_data[uvset] = {'u':len(u_array), 'v':len(v_array)}
result.setdefault('cfx', dict()).setdefault('uvdata', dict())[cfx_node.replace('CFX:', '')] = uv_data
return result
def main(output):
'''
'''
for asset_root in glob.iglob('Z:/projects/huoshen/publish/asset/*/*'):
with open(output, 'r') as f:
if asset_root.replace('\\', '/') in f.read():
continue
if not os.path.isdir(asset_root):
continue
asset_name = os.path.basename(asset_root)
srf_file = os.path.join(asset_root, 'srf', '{0}.srf.surfacing'.format(asset_name), '{0}.ma'.format(asset_name))
if not os.path.isfile(srf_file):
continue
rig_file = os.path.join(asset_root, 'rig', '{0}.rig.rigging'.format(asset_name), '{0}.ma'.format(asset_name))
if not os.path.isfile(rig_file):
continue
cfx_file = os.path.join(asset_root, 'cfx', '{0}.cfx.cloth'.format(asset_name), '{0}.ma'.format(asset_name))
if not os.path.isfile(cfx_file):
# continue
cfx_file = rig_file
print(srf_file)
print(rig_file)
print(cfx_file)
print('\n')
mc.file(new=True, f=True)
mc.file(srf_file, ns='SRF', r=True)
mc.file(rig_file, ns='RIG', r=True)
mc.file(cfx_file, ns='CFX', r=True)
try:
result = check_hierarchy(srf_file, rig_file, cfx_file)
except:
result = dict()
with open(output, 'a') as f:
f.write(asset_root.replace('\\', '/'))
f.write('\r\n')
f.write(json.dumps(result, indent=4))
f.write('\r\n'*3)
# \srf\band_b.srf.surfacing
if __name__ == '__main__':
output = 'D:/check_data.txt'
with open(output, 'a') as f:
pass
main(output)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment