#coding:utf-8
import maya.cmds as cmds
import math
import datetime
import pymel.core as pm
UVS_OpenFlag = [1]
UVS_matchingConditions = [1, 0, 0, 0]
UVS_transformOption = [0, 1]
orgOBJ = []
TargetOBJ = []
UVS_sourTF = ‘UVS_sourTF’
UVS_TargetTF = ‘UVS_TargetTF’
def UV_Shader_TransfWin():
global UVS_OpenFlag
global UVS_matchingConditions
global UVS_transformOption
global orgOBJ
global TargetOBJ
cmds.window('UV_Shader_TransfWin', t='Batch Transform UV&Shader')
cmds.columnLayout('UVS_MainCL', adj=1, p='UV_Shader_TransfWin')
cmds.frameLayout('UVS_FirstFrame', p='UVS_MainCL', l='匹配条件'.decode('utf-8').encode('gbk'), bs='etchedOut')
cmds.rowLayout('First_row', nc=2, cw2=(120, 350), p='UVS_FirstFrame')
cmds.checkBox('VEF_CB', l='Vertex Edge Face', v=UVS_matchingConditions[0], p='First_row', w=120, cc='UVS_matchingConditions[0] = cmds.checkBox("VEF_CB",q = 1,v = 1)')
cmds.rowLayout('Thr_row', nc=3, cw3=(100, 100, 150), p='First_row')
cmds.checkBox('BB_CB', l='BoundingBox', p='Thr_row', w=100, v=UVS_matchingConditions[1], cc='UVS_matchingConditions[1] = cmds.checkBox("BB_CB",q = 1,v = 1)')
cmds.checkBox('Pos_CB', l='Position', p='Thr_row', w=100, v=UVS_matchingConditions[2], cc='UVS_matchingConditions[2] = cmds.checkBox("Pos_CB",q = 1,v = 1)')
cmds.checkBox('Name_CB', l='Name Without Prefix', p='Thr_row', w=150, v=UVS_matchingConditions[3], cc='UVS_matchingConditions[3] = cmds.checkBox("Name_CB",q = 1,v = 1)')
cmds.frameLayout('UVS_SecFrame', p='UVS_MainCL', l='传递选项'.decode('utf-8').encode('gbk'), bs='etchedOut')
cmds.rowLayout('Fourth_row', nc=2, cw2=(100, 100), p='UVS_SecFrame')
cmds.checkBox('UV_CB', l='UV', v=UVS_transformOption[0], p='Fourth_row', w=100, cc='UVS_transformOption[0] = cmds.checkBox("UV_CB",q = 1,v = 1)')
cmds.checkBox('Shader_CB', l='Shader', v=UVS_transformOption[1], p='Fourth_row', w=100, cc='UVS_transformOption[1] = cmds.checkBox("Shader_CB",q = 1,v = 1)')
cmds.separator(p='UVS_MainCL')
cmds.progressBar('UVS_prgBar', maxValue=100, h=10, p='UVS_MainCL')
cmds.separator(p='UVS_MainCL')
cmds.text('UVS_returnInfo', p='UVS_MainCL', l='')
cmds.separator(p='UVS_MainCL')
cmds.rowLayout('source_row', nc=5, cw5=(150, 30, 30, 30, 520), p='UVS_MainCL')
cmds.button(l='导入原始物体>>'.decode('utf-8').encode('gbk'), c=UVS_importObjects(0), bgc=[0.2, 0.2, 0.2], w=150, p='source_row')
cmds.button(l=u'+', c=UVS_addRemoveObjects(1,1), bgc=[0.2, 0.2, 0.2], w=30, p='source_row')
cmds.button(l=u'-', c=UVS_addRemoveObjects(0,1), bgc=[0.2, 0.2, 0.2], w=30, p='source_row')
cmds.text('UVS_sourNum', p='source_row', l=str(len(orgOBJ)), w=30, bgc=[0.2, 0.2, 0.2])
cmds.textField(UVS_sourTF, ed=0, p='source_row', tx=str(orgOBJ), w=520)
cmds.separator(p='UVS_MainCL')
cmds.rowLayout('Target_row', nc=5, cw5=(150, 30, 30, 30, 520), p='UVS_MainCL')
cmds.button(l='导入目标物体>>'.decode('utf-8').encode('gbk'), c=UVS_importObjects(1), bgc=[0.5, 0, 0], w=150, p='Target_row')
cmds.button(l=u'+', c=UVS_addRemoveObjects(1,0), bgc=[0.5, 0, 0], w=30, p='Target_row')
cmds.button(l=u'-', c=UVS_addRemoveObjects(0,0), bgc=[0.5, 0, 0], w=30, p='Target_row')
cmds.text('UVS_TargetNum', l=str(len(TargetOBJ)), p='Target_row', w=30, bgc=[0.5, 0, 0])
cmds.textField(UVS_TargetTF, ed=0, tx=str(TargetOBJ), p='Target_row', w=520)
cmds.separator(p='UVS_MainCL')
cmds.setParent( '..' )
cmds.button(p='UVS_MainCL', l='开始传递'.decode('utf-8').encode('gbk'), c=UVS_startTransfom)
cmds.button(p='UVS_MainCL', l='检查重命名'.decode('utf-8').encode('gbk'), c=check_the_rename)
cmds.button(p='UVS_MainCL', l='清理UV历史'.decode('utf-8').encode('gbk'), c=chearUVHistory)
cmds.showWindow('UV_Shader_TransfWin')
def UVS_addRemoveObjects(UVS_editMode, UVS_ObjectType_AR,*args):
getSelOBJ = cmds.ls(sl=1)
screenObj = cmds.filterExpand(sm=12)
if UVS_ObjectType_AR == 1:
if UVS_editMode == 1:
for i in screenObj:
if i not in orgOBJ:
orgOBJ.append(i)
elif UVS_editMode == 0:
for i in screenObj:
if i in orgOBJ:
orgOBJ.remove(i)
cmds.textField(‘UVS_sourTF’, e=1, tx=str(orgOBJ))
cmds.text(‘UVS_sourNum’, e=1, l=str(len(orgOBJ)))
elif UVS_ObjectType_AR == 0:
if UVS_editMode == 1:
for i in screenObj:
if i not in TargetOBJ:
TargetOBJ.append(i)
elif UVS_editMode == 0:
for i in screenObj:
if i in TargetOBJ:
TargetOBJ.remove(i)
cmds.textField(‘UVS_TargetTF’, e=1, tx=str(TargetOBJ))
cmds.text(‘UVS_TargetNum’, e=1, l=str(len(TargetOBJ)))
def UVS_importObjects(UVS_objectType,*args):
getSelOBJ = cmds.ls(sl=1)
screenObj = cmds.filterExpand(sm=12)
print(screenObj)
if UVS_objectType == 1:
cmds.textField(‘UVS_TargetTF’, e=1, tx=str(screenObj))
if screenObj == None:
cmds.text(‘UVS_TargetNum’, e=1, l=‘0’)
else :
cmds.text('UVS_TargetNum', e=1, l=str(len(screenObj)))
TargetOBJ[:] = []
if screenObj != None:
for i in screenObj:
TargetOBJ.append(i)
else:
cmds.textField('UVS_sourTF', e=1, tx=str(screenObj))
if screenObj == None:
cmds.text('UVS_sourNum', e=1, l='0')
else :
cmds.text('UVS_sourNum', e=1, l=str(len(screenObj)))
orgOBJ[:] = []
if screenObj != None:
for i in screenObj:
orgOBJ.append(i)
def UVS_startTransfom(*args):
global UVS_OpenFlag
global UVS_matchingConditions
global UVS_transformOption
global orgOBJ
global TargetOBJ
cmds.progressBar('UVS_prgBar', e=1, pr=0)
DupShader(orgOBJ)
cmds.text('UVS_returnInfo', e=1, bgc=[0, 0, 0], l='')
getTime = datetime.datetime(2011, 11, 01)
startTime = getTime.today()
# p = 1.0
prgValues = 0
prgValue = (1.0 / len(orgOBJ)) * 100.0
for i in orgOBJ:
if UVS_matchingConditions[0]:
getOrgVerts = cmds.polyEvaluate(i, v=1)
getOrgEdges = cmds.polyEvaluate(i, e=1)
getOrgFaces = cmds.polyEvaluate(i, f=1)
if UVS_matchingConditions[1]:
getOrgVerts = cmds.polyEvaluate(i, v=1)
getOrgBB = cmds.xform(i, q=1, bb=1, ws=1)
cacuOrgBBx = getOrgBB[3] - getOrgBB[0]
cacuOrgBBy = getOrgBB[4] - getOrgBB[1]
cacuOrgBBz = getOrgBB[5] - getOrgBB[2]
cacuOrgBBx_m = (getOrgBB[0] + getOrgBB[3]) / 2.0
cacuOrgBBy_m = (getOrgBB[1] + getOrgBB[4]) / 2.0
cacuOrgBBz_m = (getOrgBB[2] + getOrgBB[5]) / 2.0
for k in TargetOBJ:
checkValue = 1
if UVS_matchingConditions[0] and checkValue:
getTargetVerts = cmds.polyEvaluate(k, v=1)
getTargetEdges = cmds.polyEvaluate(k, e=1)
getTargetFaces = cmds.polyEvaluate(k, f=1)
if getOrgVerts != getTargetVerts or getOrgEdges != getTargetEdges or getOrgFaces != getTargetFaces:
checkValue = 0
else:
checkValue = 1
if UVS_matchingConditions[1] and checkValue:
getTargetBB = cmds.xform(k, q=1, bb=1, ws=1)
cacuTargetBBx = getTargetBB[3] - getTargetBB[0]
cacuTargetBBy = getTargetBB[4] - getTargetBB[1]
cacuTargetBBz = getTargetBB[5] - getTargetBB[2]
if abs(cacuOrgBBx - cacuTargetBBx) > 0.001 or abs(cacuOrgBBy - cacuTargetBBy) > 0.001 or abs(cacuOrgBBz - cacuTargetBBz) > 0.001:
checkValue = 0
else:
checkValue = 1
Num = 0
Orgdis = 0
for p in xrange(getOrgVerts):
orgPointPos = cmds.pointPosition((i + '.vtx[' + str(p) + ']'), w=1)
if (abs(orgPointPos[0] - cacuOrgBBx_m) > 0.01 or cacuTargetBBx < 0.01) and (abs(orgPointPos[1] - cacuOrgBBy_m) > 0.01 or cacuTargetBBy < 0.01) and (abs(orgPointPos[2] - cacuOrgBBz_m) > 0.01 or cacuTargetBBz < 0.01):
Num = p
Orgdis = datatypes.length(datatypes.Array([orgPointPos[idx] - getOrgBB[idx] for idx in xrange(3)]))
break
cacuTargetBBx_m = (getTargetBB[0] + getTargetBB[3]) / 2.0
cacuTargetBBy_m = (getTargetBB[1] + getTargetBB[4]) / 2.0
cacuTargetBBz_m = (getTargetBB[2] + getTargetBB[5]) / 2.0
TargetPos = cmds.pointPosition((k + '.vtx[' + str(Num) + ']'), w=1)
Targetdis = datatypes.length(datatypes.Array([TargetPos[idx] - getTargetBB[idx] for idx in xrange(3)]))
if abs(Orgdis - Targetdis) > 0.001:
checkValue = 0
else:
checkValue = 1
if UVS_matchingConditions[2] and checkValue:
getOrgPos = cmds.xform(i, q=1, ws=1, piv=1)
getTargetPos = cmds.xform(k, q=1, ws=1, piv=1)
if math.floor(getOrgPos[0]) != math.floor(getTargetPos[0]) or math.floor(getOrgPos[1]) != math.floor(getTargetPos[1]) or math.floor(getOrgPos[2]) != math.floor(getTargetPos[2]):
checkValue = 0
else:
checkValue = 1 and checkValue
if UVS_matchingConditions[3] and checkValue:
splitTargetName = k.split(':')[-1]
splitTargetNameAgain = splitTargetName.split('|')[-1]
splitOrgName = i.split(':')[-1]
splitOrgNameAgain = splitOrgName.split('|')[-1]
if splitOrgNameAgain != splitTargetNameAgain:
checkValue = 0
else:
checkValue = 1
if checkValue:
# print k
if UVS_transformOption[0] == 1:
cmds.polyTransfer(k, uv=1, ao=i)
# try:
# cmds.bakePartialHistory( k,ppt=True )
# except Exception,e:
# print '%s can not delete transfor history'%k
# cmds.bakePartialHistory( k,ppt=True )
if UVS_transformOption[1] == 1:
getSGs = cmds.listConnections(cmds.listRelatives(i, shapes=1, f=1)[0], destination=1, source=0, plugs=0, s=1, type="shadingEngine")
if len(getSGs) == 0:
print 'error'
elif len(getSGs) == 1:
cmds.sets(cmds.listRelatives(k, shapes=1, f=1)[0], fe=getSGs[0])
else:
for m in getSGs[0:]:
UVS_assignShaderToObj(i, k, m)
prgValues += prgValue
cmds.progressBar('UVS_prgBar', e=1, pr=math.ceil(prgValues))
# p = p + 1
endTime = getTime.today()
espTime = str(endTime - startTime)
showInfo = u'%s' % espTime
cmds.text('UVS_returnInfo', e=1, bgc=[0.5, 0.7, 1.0], l=showInfo)
def UVS_assignShaderToObj(sourceObject, TargetObject, sourceSG):
getObjects = cmds.sets(sourceSG, q=1)
facesForShadering = []
try:
for m in getObjects:
if m.split(’.’)[0] == sourceObject:
facesForShadering.append(TargetObject + ‘.’ + m.split(’.’)[1])
if len(facesForShadering) > 0:
cmds.sets(facesForShadering, fe=sourceSG)
except TypeError:
pass
def DupShader(reObj):
allMat = []
for i in reObj:
shadingGroups = cmds.listConnections(cmds.listRelatives(i, shapes=1, f=1)[0], destination=1, source=0, plugs=0, s=1, type="shadingEngine")
shaders = cmds.ls(cmds.listConnections(shadingGroups), materials=1)
for j in shaders:
if cmds.referenceQuery(j, isNodeReferenced=1):
allMat = list(set(allMat) | set(shaders))
delMat = [u'lambert1', u'particleCloud1']
allMat = list(set(allMat) - set(delMat))
# print(allMat)
for i in allMat:
cmds.hyperShade(o=i)
if len(cmds.ls(sl=1)) > 0:
newShader = cmds.duplicate(i, upstreamNodes=1)
cmds.hyperShade(a=newShader[0])
cmds.select(cl=1)
def check_the_rename(*args):
gate = cmds.ls(sl=True )
cmds.select(hi=True )
a = cmds.ls(sl=True)
print a
l = []
for i in a:
if i.find("|") != -1:
l.append(i)
for i in a:
if i.find("? != -1:
l.append(i)
print l
cmds.select(l)
def chearUVHistory(*args):
gate = cmds.ls(sl=True )
cmds.select(hi=True )
sel = cmds.ls(sl=True,type=“mesh”)
cmds.select(cl=True)
cmds.group( em=True, name='clear_up_grp' )
for i in sel:
l = []
sc = []
judge = 0
textureNode = cmds.connectionInfo("%s.inMesh"%i,sfd=True)
a = 0
while a < 30:
node = textureNode.split(".")[0]
gl = cmds.ls(node,showType=True)
print gl
try:
if gl[1] == 'blendShape':
judge = 1
if gl[1] == 'polyColorPerVertex' or gl[1] == 'polyTransfer' or gl[1] == 'deleteUVSet' or gl[1] == 'transferAttributes' or gl[1] == 'polyTweakUV':
l.append(gl[0])
l = set(l)
l = list(l)
elif gl[1] == 'blendShape' or gl[1] == 'skinCluster' or gl[1] == 'sculpt' or gl[1] == 'nonLinear' or gl[1] == "ffd":
sc.append(gl[0])
sc = set(sc)
sc = list(sc)
try:
textureNode = cmds.connectionInfo("%s.inputPolymesh"%node,sfd=True)
except:
try:
textureNode = cmds.connectionInfo("%s.inputGeometry"%node,sfd=True)
except:
try:
textureNode = cmds.connectionInfo("%s.input[0].inputGeometry"%node,sfd=True)
except:
textureNode = cmds.connectionInfo("%s.inMesh"%i,sfd=True)
except:
pass
a += 1
t = cmds.pickWalk(i,d='up')
if judge == 0:
cmds.select(t)
pm.runtime.BakeNonDefHistory()
elif judge == 1:
if len(l) == 0:
pass
else:
for s in sc:
cmds.setAttr("%s.envelope"%s,0)
dl = cmds.duplicate(rr=True)
for s in sc:
cmds.setAttr("%s.envelope"%s,1)
cmds.select(l)
cmds.delete()
cmds.blendShape(t[0],dl[0],n="%s_blendshape"%t[0])
cmds.setAttr("%s_blendshape.%s"%(t[0],t[0]),1)
cmds.parent(t[0],'clear_up_grp')
cmds.rename(t[0],"%s_backup"%t[0])
cmds.rename(dl[0],t[0])
def main():
if cmds.window(‘UV_Shader_TransfWin’,exists=True):
cmds.deleteUI(‘UV_Shader_TransfWin’,window=True)
if cmds.window('UV_Shader_TransfWin', q=1, ex=1) == 1:
cmds.showWindow('UV_Shader_TransfWin')
else:
try:
len(UVS_OpenFlag)
except:
UVS_OpenFlag = [1]
UVS_matchingConditions = [1, 0, 0, 0]
UVS_transformOption = [0, 1]
orgOBJ = []
TargetOBJ = []
finally:
UV_Shader_TransfWin()
if name==‘main’:
main()