import os import math from ldmt_function.ldmt_loadUIFile import get_maya_window, load_ui_file import maya.OpenMayaUI as omui from ldmt_core import ldmt_cmds as ld from ldmt_function import ldmt_morphToUV from functools import partial import maya.cmds as cmds import maya.mel as mel try: from Qt.QtCore import * from Qt.QtGui import * from Qt.QtWidgets import * # from Qt.QtUiTools import * from Qt import __version__ from Qt.QtCompat import wrapInstance except ImportError: from Qt.QtCore import * from Qt.QtGui import * from Qt.QtUiTools import * from Qt import __version__ from Qt.QtCompat import wrapInstance import maya.OpenMaya as om import maya.api.OpenMaya as om2 import random import ast LDMTPATH = ld.getPath('LDMT') ldmt_uifile = LDMTPATH + '/ldmt_ui/ldmt_marvelousTool.ui' ldmt_window_name = 'ldmt_marvelousTool' ldmt_button_name = 'btn_'+ldmt_window_name.split('_')[1] ''' #UI ''' class ldmt_cls(QDialog): def __init__(self, parent = get_maya_window()): super(ldmt_cls, self).__init__(parent) self.window_name = ldmt_window_name self.setWindowTitle(ldmt_window_name) self.setWindowFlags(Qt.Window) self.move(QCursor.pos() + QPoint(50,-200)) # update status bar so it's not only show in help line window. self.set_ui() self.setupBtn() # self.statusbar.showMessage(ld.tag()) # self.installStartBar() def set_ui(self): main_layout = QVBoxLayout(self) self.ui = load_ui_file(ldmt_uifile) if self.ui is None: cmds.warning("UI file not found: {}".format(ldmt_uifile)) return main_layout.addWidget(self.ui) def setupBtn(self): self.ui.btn_flatten.clicked.connect(self.flatten) self.ui.btn_makePairs.clicked.connect(self.makePairs) self.ui.slider_blendshape.setMinimum(0) self.ui.slider_blendshape.setMaximum(100) self.ui.slider_blendshape.valueChanged.connect(self.blendshapeChange) # self.btn_makePairs.clicked.connect(self.makePairs) def blendshapeChange(self): blendValue = float(self.ui.slider_blendshape.value())/100 sel = cmds.ls(sl=1,o=1) for i in sel: selShape = cmds.listRelatives(i,s=1) selShape = selShape[0] wrapNode = cmds.listConnections(selShape,type="wrap") wrapNode = wrapNode[0] wrapNode_connections = cmds.listConnections(wrapNode) patternName = '' for j in wrapNode_connections: if j.endswith('_pattern'): patternName = j patternShape = cmds.listRelatives(patternName,s=1) patternShape = patternShape[0] blendshapeNode = cmds.listConnections(patternShape,type="blendShape") cmds.blendShape(blendshapeNode,e=1,w=(0,blendValue)) def flatten(self): from ldmt_function import ldmt_morphToGarment from ldmt_function import ldmt_normalFacet sel = cmds.ls(sl=1,o=1) selBB = cmds.polyEvaluate(b=1) garmentHeight = selBB[1][1]-selBB[1][0] garmentMaxX = selBB[0][1] patternList = [] for i in sel: pattern = ldmt_morphToGarment.runMorph2UV(i) newName = i+'_pattern' patternList.append(newName) cmds.rename(pattern,newName) cmds.select(patternList) ldmt_normalFacet.normalFacet() cmds.scale(garmentHeight,garmentHeight,garmentHeight) cmds.move(garmentMaxX,0,0) cmds.group(sel,n="ldmt_marvelousTool_garments#") cmds.group(patternList,n="ldmt_marvelousTool_patterns#") def makePairs(self): sel = cmds.ls(os=1) garments = cmds.listRelatives(sel[0]) # len(garments) patterns = cmds.listRelatives(sel[1]) # len(patterns) retopos = cmds.listRelatives(sel[2]) # len(retopos) retopos_BB_width = {} retopos_BB_length = {} retopos_BB_center = {} patterns_BB_width = {} patterns_BB_length = {} patterns_BB_center = {} # In case that uv doesn't exists. cmds.select(retopos,r=1) mel.eval("performPolyAutoProj 0;") cmds.select(sel,r=1) # In case wrong bb for i in retopos: cmds.polyMergeVertex(i, d=0.001) # Matching for i in retopos: BB = cmds.polyEvaluate(i,b=1) retopos_BB_width[i] = BB[0][1] - BB[0][0] retopos_BB_length[i] = BB[1][1] - BB[1][0] retopos_BB_center[i] = [(BB[0][1] + BB[0][0])/2, (BB[1][1] + BB[1][0])/2] for i in patterns: BB = cmds.polyEvaluate(i,b=1) patterns_BB_width[i] = BB[0][1] - BB[0][0] patterns_BB_length[i] = BB[1][1] - BB[1][0] patterns_BB_center[i] = [(BB[0][1] + BB[0][0])/2, (BB[1][1] + BB[1][0])/2] pair_pattern_retopo={} # len(pair_pattern_retopo) for i in patterns: for j in retopos: if abs(patterns_BB_width[i] - retopos_BB_width[j]) < 1 \ and abs(patterns_BB_length[i] - retopos_BB_length[j]) < 1 \ and abs(patterns_BB_center[i][0] - retopos_BB_center[j][0]) < 1 \ and abs(patterns_BB_center[i][1] - retopos_BB_center[j][1]) < 1: pair_pattern_retopo[i] = j for i in pair_pattern_retopo: cmds.transferAttributes(i,pair_pattern_retopo[i],transferUVs=1) for i in pair_pattern_retopo: cmds.select(pair_pattern_retopo[i],i,r=1) cmds.CreateWrap() for i in pair_pattern_retopo: pairGarment = i[:-8] pattern = i blendObjs = [pairGarment,pattern] # 0: target 1: origin blendName = cmds.blendShape(blendObjs,o='world',n='clothTransfer#') cmds.hide(sel[1]) cmds.displaySurface(sel[0],x=1) cmds.hide(sel[1]) cmds.displaySurface(sel[0],x=1) layerName = cmds.createDisplayLayer( n = "garment#", e=1) cmds.editDisplayLayerMembers(layerName,sel[0]) cmds.setAttr(layerName+'.displayType',2) def installStartBar(self): allQWidgets = self.findChildren(QWidget) for i in allQWidgets: i.installEventFilter(self) def eventFilter(self, obj, event ): '''Connect signals on mouse over''' if event.type() == QEvent.Enter: self.oldMessage = ld.tag() self.statusbar.showMessage(' '+obj.statusTip(),0) elif event.type() == QEvent.Leave: self.statusbar.showMessage(' '+self.oldMessage, 0) pass event.accept() return False # def closeEvent(self,event): # ld.turnToolBtnOff(self,ldmt_button_name) # cmds.deleteUI(ldmt_window_name) def ldmt_show(): if cmds.window(ldmt_window_name, exists=True): cmds.deleteUI(ldmt_window_name) app = QApplication.instance() dialog = ldmt_cls(parent=app.activeWindow()) dialog.show() app.exec_() if __name__ == '__main__': ldmt_show()