def _shadersBrowser(self, args): """ Open file dialog and set the shaders attribute """ ret = cmds.fileDialog2(fileFilter="Alembic (*.abc)", fileMode=1, dialogStyle=2, caption="Select Alembic File") if ret: selected = abcToApi.getCurrentSelection() cmds.setAttr("%s.abcShaders" % selected, ret[0], type="string") cmds.refreshEditorTemplates()
def _jsonBrowser(self, args): """ Open file dialog and set the jsonFile attribute """ ret = cmds.fileDialog2(fileFilter="Json (*.json)", fileMode=1, dialogStyle=2, caption="Select Json File") if ret: selected = abcToApi.getCurrentSelection() cmds.setAttr("%s.jsonFile" % selected, ret[0], type="string") cmds.refreshEditorTemplates()
def variantSetsChangeCommmand(unused, omg, node, variantSetName): val = cmds.optionMenuGrp(omg, q=True, value=True) variantAttr = 'usdVariantSet_%s' % variantSetName if not cmds.attributeQuery(variantAttr, node=node, exists=True): cmds.addAttr(node, ln=variantAttr, dt='string', internalSet=True) cmds.setAttr('%s.%s' % (node, variantAttr), val, type='string') resolvedVariant = '' usdPrim = UsdMaya.GetPrim(node) if usdPrim: variantSet = usdPrim.GetVariantSet(variantSetName) if variantSet: resolvedVariant = variantSet.GetVariantSelection() cmds.optionMenuGrp(omg, edit=True, extraLabel=resolvedVariant) cmds.refreshEditorTemplates()
def doIt( self, argList ): """Processes a SpeedTree SWA file for forest instance locations""" mc.select( clear=True ) #define variables swaFile = swaName = '' SpeedTreeForest = SpeedTreeAsset = '' SpeedTreeForestAssets = [] arrObjects = [] arrObjNames = [] arrObjCount = [] arrTranslate = [] upRot = [] rightRot = [] outRot = [] arrScale = [] arrInstances = [] partCloud = [] treeArray = [] oCount = tCount = 0 objTotalCount = 0 swaCount = 0 treeCount = 0 objLen = 0 processMode = 2 argsLen = argList.length() startInd = 2 #process mode if argsLen > 1: processMode = argList.asInt(0) swaFile = argList.asString(1) if processMode == 1: SpeedTreeForest = argList.asString(2) startInd = 3 if argsLen > startInd: for a in range( startInd, argsLen ): treeArray.append( argList.asString(a) ) treeCount = len( treeArray ) #get SWA file if processMode == 2 and swaFile == '': if MayaVersion >= 2012: try: swaFile = mc.fileDialog2( fileMode=1, caption="Select a SpeedTree SWA file", okc="Load", fileFilter="*.swa", dialogStyle=2 )[0] except: swaFile = '' else: swaFile = mc.fileDialog( mode=0, title='Select a SpeedTree SWA file', directoryMask='*.swa' ) swaExists = ( os.path.exists( swaFile ) and not os.path.isdir( swaFile ) ) if swaExists: swaName = swaFile.rpartition("/")[2] swaName = swaName[:-4] #reloading forest node if processMode == 1: if MayaVersion >= 2012: SpeedTreeForest = mc.rename( SpeedTreeForest, swaName + '_Forest' ) oldParticleSets = [] particleSetInds = mc.getAttr( SpeedTreeForest + '.particleSets', mi=1 ) if particleSetInds != None: for p in particleSetInds: particleSet = mc.connectionInfo( SpeedTreeForest + '.particleSets[' + str(p) + ']', sfd=1 ).split( '.' )[0] forestObject = mc.connectionInfo( SpeedTreeForest + '.forestObjects[' + str(p) + ']', sfd=1 ).split( '.' )[0] if particleSet != '': mc.removeMultiInstance( SpeedTreeForest + '.particleSets[' + str(p) + ']', b=True ) mc.removeMultiInstance( SpeedTreeForest + '.forestObjects[' + str(p) + ']', b=True ) if mc.objExists( forestObject ): mc.setAttr( forestObject + '.visibility', 1 ) oldParticleSets.append( particleSet ) particleSetShapes = mc.listRelatives( particleSet, s=1 ) if particleSetShapes != None and len( particleSetShapes ) > 0: particleSetShape = particleSetShapes[0] cons = mc.listConnections( particleSetShape, d=1 ) if cons != None and len( cons ) > 0: for c in cons: if ( mc.nodeType( c ) == 'instancer' ): oldParticleSets.append( c ) for s in oldParticleSets: if mc.objExists( s ): mc.delete( s ) else: SpeedTreeForest = mc.createNode( 'SpeedTreeForest', name=swaName + '_Forest' ) mc.setAttr( SpeedTreeForest + '.swaFile', swaFile, type='string' ) SpeedTreeForestAssets.append( SpeedTreeForest ) #create asset if MayaVersion >= 2009: if processMode == 1: SpeedTreeAsset = mc.container( q=True, findContainer=[ SpeedTreeForest ] ) if SpeedTreeAsset != '': if MayaVersion >= 2012: SpeedTreeAsset = mc.rename( SpeedTreeAsset, swaName ) mc.container( SpeedTreeAsset, edit=True, addNode=SpeedTreeForest, force=True ) else: #create container SpeedTreeAsset = mc.container( name=swaName, addNode=SpeedTreeForest, force=True ) #asset settings SpeedTreeFbxPath = mc.pluginInfo( 'SpeedTreeForest.py', path=True, query=True ) SpeedTreeFbxPart = SpeedTreeFbxPath.rpartition( '/' ) if MayaVersion >= 2011: SpeedTreeIconPath = SpeedTreeFbxPart[0] + '/icons/SpeedTreeForest.png' else: SpeedTreeIconPath = SpeedTreeFbxPart[0] + 'icons/out_SpeedTreeForest.xpm' if os.path.isfile( SpeedTreeIconPath ): mc.setAttr( SpeedTreeAsset + '.iconName', SpeedTreeIconPath, type='string' ) elif mc.objExists( SpeedTreeAsset + '.isAsset' ): mc.setAttr( SpeedTreeAsset + '.isAsset', 1 ) mc.setAttr( SpeedTreeAsset + '.viewMode', 0 ) #open SWA file swaData = open(swaFile, 'r') while True: line = swaData.readline() if len(line) == 0: break #EOF while len(line) == 1 or line == "\r\n": line = swaData.readline() if line != "" and line != "\t" and line != "\n" and line!= "\r\n": if line[(len(line) - 2):] == "\r\n": line = line[:(len(line) - 2)] elif line[(len(line) - 1):] == "\n": line = line[:(len(line) - 1)] arrObjNames.append( self.stStripIllegalChars( line ) ) line = swaData.readline() swaCount = int( line ) arrObjCount.append( swaCount ) for t in range(0, swaCount): line = swaData.readline() swa_instance = line.split(' ') #flip Y and Z and negate Z (Y-up conversion) arrTranslate.append( [float( swa_instance[0]), float( swa_instance[2] ), float( swa_instance[1] ) * -1] ) upRot.append( [float( swa_instance[3] ), float( swa_instance[4] ), float( swa_instance[5] )] ) rightRot.append( [float( swa_instance[6] ), float( swa_instance[7] ), float( swa_instance[8] )] ) outRot.append( self.stCross ( upRot[tCount], rightRot[tCount] ) ) arrScale.append( float( swa_instance[9][:-1] ) ) tCount = tCount + 1 j = 0 objLen = len( arrObjNames ) #handle tree entries for t in range( 0, objLen ): objName = arrObjNames[t][1:-1] arrInstances = [] #particle object partCloud = mc.particle( p=arrTranslate[objTotalCount:( objTotalCount + arrObjCount[t] )] ) partCloud[0] = mc.rename( partCloud[0], objName ) partCloud[1] = mc.listRelatives( partCloud[0], s=1 )[0] particleCons = mc.listConnections( partCloud[1], p=1, c=1 ) if len( particleCons ) == 4: mc.disconnectAttr( particleCons[0], particleCons[1] ) mc.disconnectAttr( particleCons[3], particleCons[2] ) mc.addAttr( partCloud[1], ln = 'rotationPP', dt='vectorArray', h=1 ) mc.addAttr( partCloud[1], ln = 'UserVector1PP', dt='vectorArray', h=1 ) if MayaVersion >= 2009 and SpeedTreeAsset != '': mc.container( SpeedTreeAsset, edit=True, addNode=partCloud, force=True ) connectedSets = mc.getAttr( SpeedTreeForest + '.particleSets', mi=1 ) setIndex = 0 if connectedSets != None: setIndex = len( connectedSets ) mc.connectAttr( partCloud[0] + '.message', SpeedTreeForest + '.particleSets[' + str( setIndex ) + ']' ) #handle instances objTotalCount = objTotalCount + arrObjCount[t] for i in range(0, arrObjCount[t]): #transpose the Z-up matrix mMatrix = om.MMatrix() toYupMatrix = om.MMatrix() instRotation = [ rightRot[j][0], rightRot[j][1], rightRot[j][2], 0, outRot[j][0], outRot[j][1], outRot[j][2], 0, upRot[j][0], upRot[j][1], upRot[j][2], 0, 0, 0, 0, 1 ] toYup = [ 1, 0, 0, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1 ] om.MScriptUtil.createMatrixFromList( instRotation, mMatrix ) om.MScriptUtil.createMatrixFromList( toYup, toYupMatrix ) yUpMatrix = mMatrix * toYupMatrix mTransformMtx = om.MTransformationMatrix( yUpMatrix ) eulerRot = mTransformMtx.eulerRotation() angles = [ math.degrees( angle ) for angle in ( eulerRot.x, eulerRot.y, eulerRot.z ) ] angles[0] += 90 mc.particle( e=True, attribute='rotationPP', order=i, vectorValue=angles ) mc.particle( e=True, attribute='UserVector1PP', order=i, vectorValue=( arrScale[j], arrScale[j], arrScale[j] ) ) j += 1 #create cache cacheDir = sceneCacheDir = swaDir = '' sceneFullPath = mc.file( q=True, sn=True ) projectDir = mc.workspace( q=True, rd=True ) if sceneFullPath != '': sceneName = sceneFullPath.rpartition( '/' )[2].rpartition( '.' )[0] else: strDateTime = 'tmp' dateTime = str( datetime.datetime.now() ) dateTime = dateTime.rpartition( ':' )[0] dateTime = re.split( '-| |:', dateTime ) if len( dateTime ) >= 5: strDateTime = dateTime[0] + dateTime[1] + dateTime[2] + '.' + dateTime[3] + dateTime[4] sceneName = getpass.getuser() + '.' + strDateTime particleDir = projectDir + 'particles' if not os.path.exists( particleDir ): os.mkdir( particleDir ) swaSceneDir = sceneName dynGlobalsNode = mc.dynGlobals( q=True, a=True ) curCacheDir = mc.getAttr( dynGlobalsNode + '.cacheDirectory' ) #copy cache from previous file save if curCacheDir != '' and curCacheDir != None and not os.path.exists( particleDir + '/' + swaSceneDir ): shutil.copytree( particleDir + '/' + curCacheDir, particleDir + '/' + swaSceneDir ) #or make a new folder for current scene cache elif not os.path.exists( particleDir + '/' + swaSceneDir ): os.mkdir( particleDir + '/' + swaSceneDir ) #saving over an old file, so keep cache folder else: swaSceneDir = curCacheDir if swaSceneDir != None and swaSceneDir != '': mc.dynExport( partCloud[0], atr=( 'position', 'rotationPP', 'UserVector1PP' ), f='cache', p=swaSceneDir ) mc.saveInitialState( partCloud[1] ) #add trees if treeCount > t: mc.assignSpeedTreeForestEntry( SpeedTreeForest, partCloud[1], treeArray[t], setIndex, objName ) if mc.getAttr( SpeedTreeForest + '.hs' ) == 1 and mc.objExists( treeArray[t] + '.visibility' ): #hide skeleton if there is one rootBone = '' treeHistory = mc.listHistory( treeArray[t] ) for h in treeHistory: if mc.nodeType( h ) == 'skinCluster': bindPose = mc.connectionInfo( h + '.bindPose', sfd=True ).split( '.' )[0] if bindPose != None and bindPose != '' and mc.objExists( bindPose ): rootBone = mc.connectionInfo( bindPose + '.members[0]', sfd=True ).split( '.' )[0] if rootBone != '' and mc.objExists( rootBone ): mc.setAttr( rootBone + '.visibility', 0 ) #hide source object mc.setAttr( treeArray[t] + '.visibility', 0 ) #if processMode == 0: mc.select( SpeedTreeForest ) if mel.eval( 'exists refreshEditorTemplates' ) and processMode == 0: mc.refreshEditorTemplates()
import maya.cmds as mc import maya.mel as mel import math import sys mc.refreshEditorTemplates() sys.setrecursionlimit(5000) #---------------------------関数定義------------------------------# def dot(vec1, vec2): return vec1[0] * vec2[0] + vec1[1] * vec2[1] def normalize(vec): _len = math.sqrt(vec[0]**2 + vec[1]**2) if (_len == 0.0): return False else: return [vec[0] / _len, vec[1] / _len] def nearAxis(vec): maxDotProduct = -10 index_maxDot = 0 for axis in axisList: dotResult = dot(vec, axis) if dotResult > maxDotProduct: maxDotProduct = dotResult
def refresh_editor(self, args): cmds.refreshEditorTemplates()