import pymel.core as pmc import maya.OpenMaya as OpenMaya # check for PySide2 or PySide try: from PySide.QtGui import * from PySide import QtCore, QtGui from shiboken import wrapInstance except ImportError: from PySide2.QtWidgets import * from PySide2 import QtCore, QtWidgets from shiboken2 import wrapInstance class EyeLidSetupUI(QMainWindow): def __init__(self, parent=None): super(EyeLidSetupUI, self).__init__(parent) self.setObjectName(windowObject) self.setWindowTitle("Eye Lid Setup") self.setMinimumSize(QtCore.QSize(200, 180)) self.setMaximumSize(QtCore.QSize(200, 180)) #Create menubar menubar = self.menuBar() fileMenu = menubar.addMenu('Edit Curve') self.actionCreateCrv = QAction('Create From Selection', self) fileMenu.addAction(self.actionCreateCrv) self.actionReverseCrv = QAction('Reverse Direction', self) fileMenu.addAction(self.actionReverseCrv) self.actionMirrorCrv = QAction('Mirror Curves', self) fileMenu.addAction(self.actionMirrorCrv) #Building a layout container = QWidget(self) self.gridLayout = QGridLayout(container) self.gridLayout.setHorizontalSpacing(0) self.setLayout(self.gridLayout) self.verticalLayout = QVBoxLayout() self.verticalLayout.setSpacing(3) #Menu Breakline setup self.menuLine = QFrame() self.menuLine.setFrameShape(QFrame.HLine) self.menuLine.setFrameShadow(QFrame.Sunken) self.verticalLayout.addWidget(self.menuLine) #Setup left right Layout self.horizontalLayout01 = QHBoxLayout() self.horizontalLayout01.setSpacing(2) self.setupLabel = QLabel('Setup Side:') self.horizontalLayout01.addWidget(self.setupLabel) self.horizontalLayout01.addItem(QSpacerItem(15, 20, QSizePolicy.Fixed, QSizePolicy.Minimum)) self.l_side_RB = QRadioButton('Left') self.l_side_RB.setChecked(True) self.horizontalLayout01.addWidget(self.l_side_RB) self.r_side_RB = QRadioButton('Right') self.horizontalLayout01.addWidget(self.r_side_RB) self.verticalLayout.addLayout(self.horizontalLayout01) #Top Breakline setup self.topLine = QFrame() self.topLine.setFrameShape(QFrame.HLine) self.topLine.setFrameShadow(QFrame.Sunken) self.verticalLayout.addWidget(self.topLine) #Eye Center Layout self.horizontalLayout02 = QHBoxLayout() self.horizontalLayout02.setSpacing(2) self.eyeCenterLabel = QLabel('Eye Center: ') self.horizontalLayout02.addWidget(self.eyeCenterLabel) self.eyeCenterLineEdit = QLineEdit() self.eyeCenterLineEdit.setFocusPolicy(QtCore.Qt.NoFocus) self.horizontalLayout02.addWidget(self.eyeCenterLineEdit) self.eyeCenterPB = QPushButton('<<') self.eyeCenterPB.setMinimumSize(QtCore.QSize(30, 20)) self.eyeCenterPB.setMaximumSize(QtCore.QSize(30, 20)) self.horizontalLayout02.addWidget(self.eyeCenterPB) self.verticalLayout.addLayout(self.horizontalLayout02) #Upperlid Layout self.horizontalLayout03 = QHBoxLayout() self.horizontalLayout03.setSpacing(2) self.upLidLabel = QLabel('UpLid Curve:') self.horizontalLayout03.addWidget(self.upLidLabel) self.upLidLineEdit = QLineEdit() self.upLidLineEdit.setFocusPolicy(QtCore.Qt.NoFocus) self.horizontalLayout03.addWidget(self.upLidLineEdit) self.upLidPB = QPushButton('<<') self.upLidPB.setMinimumSize(QtCore.QSize(30, 20)) self.upLidPB.setMaximumSize(QtCore.QSize(30, 20)) self.horizontalLayout03.addWidget(self.upLidPB) self.verticalLayout.addLayout(self.horizontalLayout03) #Lowerlid Layout self.horizontalLayout04 = QHBoxLayout() self.horizontalLayout04.setSpacing(2) self.loLidLabel = QLabel('LoLid Curve: ') self.horizontalLayout04.addWidget(self.loLidLabel) self.loLidLineEdit = QLineEdit() self.loLidLineEdit.setFocusPolicy(QtCore.Qt.NoFocus) self.horizontalLayout04.addWidget(self.loLidLineEdit) self.loLidPB = QPushButton("<<") self.loLidPB.setMinimumSize(QtCore.QSize(30, 20)) self.loLidPB.setMaximumSize(QtCore.QSize(30, 20)) self.horizontalLayout04.addWidget(self.loLidPB) self.verticalLayout.addLayout(self.horizontalLayout04) #Bottom Breakline setup self.bottomLine = QFrame() self.bottomLine.setFrameShape(QFrame.HLine) self.bottomLine.setFrameShadow(QFrame.Sunken) self.verticalLayout.addWidget(self.bottomLine) self.createSetupPB = QPushButton('Build Eye Rig') self.verticalLayout.addWidget(self.createSetupPB) self.gridLayout.addLayout(self.verticalLayout, 0, 0, 1, 1) self.setCentralWidget(container) self.signalsAndSlots() def signalsAndSlots(self): self.eyeCenterPB.clicked.connect(lambda: self.eyeCenterLineEdit.setText(str(pmc.selected()[0]))) self.upLidPB.clicked.connect(lambda: self.upLidLineEdit.setText(str(pmc.selected()[0]))) self.loLidPB.clicked.connect(lambda: self.loLidLineEdit.setText(str(pmc.selected()[0]))) self.actionCreateCrv.triggered.connect(lambda: pmc.polyToCurve(n='highResolution_crv', form=2,degree=1)) self.actionReverseCrv.triggered.connect(lambda: pmc.reverseCurve(pmc.selected()[0], ch=1, rpo=1)) self.actionMirrorCrv.triggered.connect(self.mirrorCrv) self.createSetupPB.clicked.connect(self.setupSide) def getUParam(self, pnt = [], crv = None): point = OpenMaya.MPoint(pnt[0],pnt[1],pnt[2]) curveFn = OpenMaya.MFnNurbsCurve(self.getDagPath(str(crv))) paramUtill=OpenMaya.MScriptUtil() paramPtr=paramUtill.asDoublePtr() isOnCurve = curveFn.isPointOnCurve(point) if isOnCurve == True: curveFn.getParamAtPoint(point , paramPtr,0.001,OpenMaya.MSpace.kObject ) else : point = curveFn.closestPoint(point,paramPtr,0.001,OpenMaya.MSpace.kObject) curveFn.getParamAtPoint(point , paramPtr,0.001,OpenMaya.MSpace.kObject ) param = paramUtill.getDouble(paramPtr) return param def getDagPath(self, objectName): if isinstance(objectName, list)==True: oNodeList=[] for o in objectName: selectionList = OpenMaya.MSelectionList() selectionList.add(o) oNode = OpenMaya.MDagPath() selectionList.getDagPath(0, oNode) oNodeList.append(oNode) return oNodeList else: selectionList = OpenMaya.MSelectionList() selectionList.add(objectName) oNode = OpenMaya.MDagPath() selectionList.getDagPath(0, oNode) return oNode def mirrorCrv(self): crvs = pmc.selected() if crvs == []: OpenMaya.MGlobal.displayWarning('Selected the eyelid curves you want to mirror') else: for crv in crvs: print crv if crv.getShape().type() != 'nurbsCurve': OpenMaya.MGlobal.displayWarning('The selected object is not a NurbsCurve') else: rSideCrv = pmc.duplicate(crv)[0] rSideCrv.scalePivotX.set(0) rSideCrv.sx.set(-1) print "Curves mirrored to the right side", pmc.select(cl=True) def setupSide(self): if self.l_side_RB.isChecked(): self.buildEyeRig('left') else: self.buildEyeRig('right') def buildEyeRig(self, setupSide): eyeCenter = pmc.PyNode(self.eyeCenterLineEdit.text()) lowerlidCrv = pmc.PyNode(self.loLidLineEdit.text()) upperlidCrv = pmc.PyNode(self.upLidLineEdit.text()) if setupSide == 'left': side = 'L_' else: side = 'R_' lidCntrlGrp = pmc.group(n='{0}lidCntrlGrp'.format(side), em=True) lidControlJntGrp = pmc.group(n='{0}lidControlJntGrp'.format(side), em=True) lidSkinJntGrp = pmc.group(n='{0}lidSkinJntsGrp'.format(side), em=True) lidCrvGrp = pmc.group(n='{0}lidCrvGrp'.format(side), em=True) lidLocGrp = pmc.group(n='{0}lidLocGrp'.format(side), em=True) posC = eyeCenter.getTranslation(ws=True) worldUplocator = pmc.spaceLocator(n='{0}eyeUpVec_LOC'.format(side)) worldUplocator.setTranslation(posC, space='world') worldUplocator.visibility.set(0) pmc.parent(worldUplocator, lidSkinJntGrp) for prefix in ['{0}up'.format(side), '{0}lo'.format(side)]: if prefix == '{0}up'.format(side): crv = upperlidCrv else: crv = lowerlidCrv pmc.delete(crv, ch=True) pmc.makeIdentity(crv,apply=True, t=True, r=True, s=True) jntGrp = pmc.group(n='{0}lidJntGrp'.format(prefix), em=True) locGrp = pmc.group(n='{0}lidLocGrp'.format(prefix), em=True) pmc.parent(locGrp, lidLocGrp) baseJntList = [] for v in range(crv.numCVs()): pmc.select(cl=True) skinJnt = pmc.joint(n='{0}lid_%02d_s'.format(prefix) % (v+1,)) skinJnt.radius.set(0.1) pos = crv.cv[v].getPosition(space='preTransform') skinJnt.setTranslation(pos, space='world') loc =pmc.spaceLocator(n='{0}lid_%02d_loc'.format(prefix) % (v+1,)) loc.setTranslation(pos, space='world') pmc.select(cl=True) jntC=pmc.joint(n='{0}lid_%02d_jnt'.format(prefix) % (v+1,)) jntC.radius.set(0.1) jntC.setTranslation(posC, space='world') baseJntList.append(jntC) pmc.joint(jntC, e=True, oj='xyz', secondaryAxisOrient='yup', ch=True, zso=True) aimconstraint = pmc.aimConstraint(loc, jntC, mo=False, weight=1, aimVector= (0,0,1), upVector = (0,1,0), worldUpType='objectrotation', worldUpObject=worldUplocator) pmc.parent(skinJnt, jntC) for each in [skinJnt, aimconstraint]: pmc.reorder(each, b=True) u = self.getUParam(pos, crv) name= loc.replace('_loc', '_pci') pci= pmc.createNode('pointOnCurveInfo', n=name) crv.worldSpace.connect(pci.inputCurve) pci.parameter.set(u) pci.position.connect(loc.t) pmc.parent(loc, locGrp) pmc.parent(jntC, jntGrp) pmc.parent(jntGrp, lidSkinJntGrp) loCrv = pmc.rebuildCurve(crv, ch=False, rpo=False, kep=True, s=4, d=3,tol=0.01, n='{0}lidLo_crv'.format(prefix))[0] for c in [crv, loCrv]: pmc.parent(c, lidCrvGrp) pmc.wire(crv, w=loCrv) numberOfJnts = len(baseJntList) midJntNum = abs(numberOfJnts / 2) midToCornerJntNum = midJntNum / 2 midToOutCornerNum = midJntNum + midToCornerJntNum midToInCornerNum = midJntNum - midToCornerJntNum bindToCurveJntList = [] for c in range(7): if c == 0 and prefix == '{0}up'.format(side): cvPos = loCrv.cv[c].getPosition(space='preTransform') grp = pmc.group(n='{0}inlid_POS'.format(side),em=True) sdk = pmc.group(n='{0}inlid_SDK'.format(side), em=True) cntrlCrv = pmc.circle(n='{0}inlid'.format(side), ch=False, r=0.05)[0] cntrlCrv.overrideEnabled.set(1) cntrlCrv.overrideColor.set(21) pmc.select(cl=True) jnt = pmc.joint(n='{0}inlid_s'.format(side), p=[0,0,0]) baseJnt = pmc.PyNode(baseJntList[0]) rot = baseJnt.getRotation()[1] elif c == 2: cvPos = loCrv.cv[c].getPosition(space='preTransform') grp = pmc.group(n='{0}InLid_POS'.format(prefix), em=True) sdk = pmc.group(n='{0}InLid_SDK'.format(prefix), em=True) cntrlCrv = pmc.circle(n='{0}InLid'.format(prefix), ch=False, r=0.03)[0] cntrlCrv.overrideEnabled.set(1) cntrlCrv.overrideColor.set(20) pmc.select(cl=True) jnt = pmc.joint(n='{0}InLid_s'.format(prefix), p=[0,0,0]) baseJnt = pmc.PyNode(baseJntList[midToInCornerNum-1]) rot = baseJnt.getRotation()[1] elif c == 3: cvPos = loCrv.cv[c].getPosition(space='preTransform') grp = pmc.group(em=True,n='{0}lid_POS'.format(prefix)) sdk = pmc.group(em=True,n='{0}lid_SDK'.format(prefix)) cntrlCrv = pmc.circle(n='{0}lid'.format(prefix), ch=False, r=0.05)[0] cntrlCrv.overrideEnabled.set(1) cntrlCrv.overrideColor.set(21) pmc.select(cl=True) jnt = pmc.joint(n='{0}lid_s'.format(prefix), p=[0,0,0]) baseJnt = pmc.PyNode(baseJntList[midJntNum-1]) rot = baseJnt.getRotation()[1] if prefix == '{0}up'.format(side): cntrlCrv.addAttr('blinkHeight', at='double', min=0, max=1, dv=0.25) cntrlCrv.blinkHeight.setKeyable(keyable=True) cntrlCrv.addAttr('secondaryCtrl', at='bool') cntrlCrv.secondaryCtrl.setKeyable(keyable=True) cntrlCrv.addAttr('blink', at='double', min=0, max=1) cntrlCrv.blink.setKeyable(keyable=True) elif c == 4: cvPos = loCrv.cv[c].getPosition(space='preTransform') grp = pmc.group(em=True,n='{0}OutLid_POS'.format(prefix)) sdk = pmc.group(em=True,n='{0}OutLid_SDK'.format(prefix)) cntrlCrv = pmc.circle(n='{0}OutLid'.format(prefix), ch=False, r=0.03)[0] cntrlCrv.overrideEnabled.set(1) cntrlCrv.overrideColor.set(20) pmc.select(cl=True) jnt = pmc.joint(n='{0}OutLid_s'.format(prefix), p=[0,0,0]) baseJnt = pmc.PyNode(baseJntList[midToOutCornerNum-1]) rot = baseJnt.getRotation()[1] elif c == 6 and prefix == '{0}up'.format(side): cvPos = loCrv.cv[c].getPosition(space='preTransform') grp = pmc.group(em=True,n='{0}outlid_POS'.format(side)) sdk = pmc.group(em=True,n='{0}outlid_SDK'.format(side)) cntrlCrv = pmc.circle(n='{0}outlid'.format(side), ch=False, r=0.05)[0] cntrlCrv.overrideEnabled.set(1) cntrlCrv.overrideColor.set(21) pmc.select(cl=True) jnt = pmc.joint(n='{0}outlid_s'.format(side), p=[0,0,0]) baseJnt = pmc.PyNode(baseJntList[-1]) rot = baseJnt.getRotation()[1] for a in ['sx', 'sy', 'sz', 'visibility']: cntrlCrv.attr(a).lock() cntrlCrv.attr(a).setKeyable(keyable=False) cntrlCrv.attr(a).showInChannelBox(inChannelBox=False) pmc.parent(jnt, lidControlJntGrp) pmc.parent(grp, lidCntrlGrp) pmc.parent(sdk,grp) pmc.parent(cntrlCrv,sdk) pmc.pointConstraint(cntrlCrv, jnt) bindToCurveJntList.append(jnt) grp.setTranslation(cvPos) grp.setRotation([0,rot,0]) pmc.PyNode('{0}lid'.format(prefix)).secondaryCtrl.connect(pmc.PyNode('{0}OutLid_POS'.format(prefix)).visibility) pmc.PyNode('{0}lid'.format(prefix)).secondaryCtrl.connect(pmc.PyNode('{0}InLid_POS'.format(prefix)).visibility) if prefix == '{0}up'.format(side): pmc.skinCluster(bindToCurveJntList, loCrv) else: bindToCurveJntList.append('{0}outlid_s'.format(side)) bindToCurveJntList.append('{0}inlid_s'.format(side)) pmc.skinCluster(bindToCurveJntList, loCrv) pmc.parentConstraint('{0}outlid'.format(side), '{0}uplid'.format(side), '{0}upOutLid_SDK'.format(side), mo=True) pmc.parentConstraint('{0}inlid'.format(side), '{0}uplid'.format(side), '{0}upInLid_SDK'.format(side), mo=True) pmc.parentConstraint('{0}inlid'.format(side), '{0}lolid'.format(side), '{0}loInLid_SDK'.format(side), mo=True) pmc.parentConstraint('{0}outlid'.format(side), '{0}lolid'.format(side), '{0}loOutLid_SDK'.format(side), mo=True) blinkCrv = pmc.duplicate('{0}uplidLo_crv'.format(side), n='{0}blink_crv'.format(side))[0] loLidBlinkCrv = pmc.duplicate(lowerlidCrv, n='{0}lolidBlink_crv'.format(side))[0] upLidBlinkCrv = pmc.duplicate(upperlidCrv, n='{0}uplidBlink_crv'.format(side))[0] blendShapeNode = pmc.blendShape('{0}uplidLo_crv'.format(side), '{0}lolidLo_crv'.format(side), blinkCrv, n='{0}eyeRig_BS'.format(side))[0] revNode = pmc.shadingNode('reverse',asUtility=True, n='{0}smartBlink_REV'.format(side)) pmc.PyNode('{0}uplid'.format(side)).blinkHeight.connect(blendShapeNode + '.{0}uplidLo_crv'.format(side)) pmc.PyNode('{0}uplid'.format(side)).blinkHeight.connect(revNode.inputX) revNode.outputX.connect(blendShapeNode + '.{0}lolidLo_crv'.format(side)) pmc.PyNode('{0}uplid'.format(side)).blinkHeight.set(1) wireNode = pmc.wire(upLidBlinkCrv, w=blinkCrv)[0] wireNode.scale[0].set(0) pmc.PyNode('{0}uplid'.format(side)).blinkHeight.set(0) wireNode = pmc.wire(loLidBlinkCrv, w=blinkCrv)[0] wireNode.scale[0].set(0) pmc.PyNode('{0}uplid'.format(side)).blinkHeight.set(0.25) upperBlinkBsNode = pmc.blendShape(upLidBlinkCrv, upperlidCrv)[0] pmc.PyNode('{0}uplid'.format(side)).blink.connect(upperBlinkBsNode + '.' + upLidBlinkCrv) lowerBlinkBsNode = pmc.blendShape(loLidBlinkCrv, lowerlidCrv)[0] pmc.PyNode('{0}lolid'.format(side)).blink.connect(lowerBlinkBsNode + '.' + loLidBlinkCrv) #clean up scene pmc.group(lidCntrlGrp, lidSkinJntGrp, n='{0}lid_parentToHeadGrp'.format(side)) parentToLocal = pmc.group(lidCrvGrp, lidControlJntGrp, lidLocGrp, n='{0}lid_parentToLocalGrp'.format(side)) parentToLocal.visibility.set(0) self.eyeCenterLineEdit.clear() self.upLidLineEdit.clear() self.loLidLineEdit.clear() self.setupSoftEye(eyeCenter, side) self.r_side_RB.setChecked(True) def setupSoftEye(self, eyeCenter, side): upLidSDK = pmc.PyNode('{0}uplid_SDK'.format(side)) loLidSDK = pmc.PyNode('{0}lolid_SDK'.format(side)) eyeRotatePivot = eyeCenter.getRotatePivot(space='world') upLidSDK.setRotatePivot(eyeRotatePivot, space='world') loLidSDK.setRotatePivot(eyeRotatePivot, space='world') clmpNode = pmc.createNode('clamp', n='{0}softEye_CLMP'.format(side)) eyeCenter.rotateX.connect(clmpNode.inputR) eyeCenter.rotateY.connect(clmpNode.inputG) clmpNode.outputR.connect(upLidSDK.rotateX) clmpNode.outputG.connect(upLidSDK.rotateY) clmpNode.outputR.connect(loLidSDK.rotateX) clmpNode.outputG.connect(loLidSDK.rotateY) if side == 'R_': mdNode = pmc.createNode("multiplyDivide", n="{0}softEye_MD".format(side)) eyeCenter.rotateX.connect(mdNode.input1X) eyeCenter.rotateY.connect(mdNode.input1Y) mdNode.input2Y.set(-1) mdNode.outputX.connect(clmpNode.inputR, f=True) mdNode.outputY.connect(clmpNode.inputG, f=True) clmpNode.minR.set(-15) clmpNode.maxR.set(15) clmpNode.minG.set(-20) clmpNode.maxG.set(20) ## UI Stuff import maya.OpenMayaUI as OpenMayaUI windowObject = "eyeLidSetupWin" def _getcls(name): try: result = getattr(QtGui, name, None) except: result = getattr(QtWidgets, name, None) if result is None: result = getattr(QtCore, name, None) return result def wrapinstance(ptr): ptr = long(ptr) qobj = wrapInstance(ptr, QtCore.QObject) metaobj = qobj.metaObject() realcls = None while realcls is None: realcls = _getcls(metaobj.className()) metaobj = metaobj.superClass() return wrapInstance(ptr, realcls) def get_maya_window(): winptr = OpenMayaUI.MQtUtil.mainWindow() if winptr is None: raise RuntimeError('No Maya window found.') window = wrapinstance(winptr) assert isinstance(window, QMainWindow) return window def mayaRun(): if pmc.window(windowObject, q=True, exists=True): pmc.deleteUI(windowObject) global gui gui = EyeLidSetupUI(get_maya_window()) gui.setWindowFlags(QtCore.Qt.Window) gui.setProperty("saveWindowPref", True) gui.show()