From 4a7885913ed70f3b117b3f061606e9ee737389cf Mon Sep 17 00:00:00 2001 From: guto88 <81046300+guto88@users.noreply.github.com> Date: Fri, 30 Apr 2021 09:34:44 -0300 Subject: [PATCH 1/2] Updated to Python 3 Updated to Python 3 using modernize to make the plugin compatible to Maya 2022. Added Maya 2022 to the compatibility list. Fix indentation issues on file d2m.py Changed encode method to base64 on file d2m.py Changed the reload method to importlib on file DazToMaya.py --- Maya/MAYA_APP_DIR/plug-ins/DazToMaya.py | 15 +- .../plug-ins/DazToMaya_Files/d2m.py | 168 +++++++++--------- .../plug-ins/DazToMaya_Files/d2m_logo.png | Bin 0 -> 27689 bytes .../plug-ins/DazToMaya_Files/d2m_menu.py | 9 +- .../plug-ins/DazToMaya_Files/ikmax_menu.py | 7 +- 5 files changed, 104 insertions(+), 95 deletions(-) create mode 100644 Maya/MAYA_APP_DIR/plug-ins/DazToMaya_Files/d2m_logo.png diff --git a/Maya/MAYA_APP_DIR/plug-ins/DazToMaya.py b/Maya/MAYA_APP_DIR/plug-ins/DazToMaya.py index 8208f08..5e1789d 100644 --- a/Maya/MAYA_APP_DIR/plug-ins/DazToMaya.py +++ b/Maya/MAYA_APP_DIR/plug-ins/DazToMaya.py @@ -1,6 +1,9 @@ +from __future__ import absolute_import +from __future__ import print_function import sys import maya.OpenMaya as OpenMaya import maya.OpenMayaMPx as OpenMayaMPx +import importlib commandName = 'daztomaya' @@ -38,14 +41,14 @@ def psource(module): pathfound = 1 if not pathfound: sys.path.append( dir ) - exec ('import ' + modname) in globals() - exec( 'reload( ' + modname + ' )' ) in globals() + exec(('import ' + modname), globals()) + exec(( 'importlib.reload( ' + modname + ' )' ), globals()) return modname def DazToMayastart(): # When you import a file you must give it the full path - print "d2mRun: " + scriptPath + print("d2mRun: " + scriptPath) psource( scriptPath ) - print "executed" + print("executed") DazToMayastart() #------------------------------------------------------------------------------------- @@ -71,7 +74,7 @@ def initializePlugin( mobject ): #--------------------- ADD ITEMS IN MENU // END -------------------------- ''' Initialize the plug-in when Maya loads it. ''' - mplugin = OpenMayaMPx.MFnPlugin( mobject, "Daz3D", "1.7" ) + mplugin = OpenMayaMPx.MFnPlugin( mobject, "Daz3D", "1.5" ) try: mplugin.registerCommand( commandName, cmdCreator ) except: @@ -79,7 +82,7 @@ def initializePlugin( mobject ): def uninitializePlugin( mobject ): ''' Uninitialize the plug-in when Maya un-loads it. ''' - print "Unloaded!" + print("Unloaded!") import d2m_menu d2m_menu.remove() mplugin = OpenMayaMPx.MFnPlugin( mobject ) diff --git a/Maya/MAYA_APP_DIR/plug-ins/DazToMaya_Files/d2m.py b/Maya/MAYA_APP_DIR/plug-ins/DazToMaya_Files/d2m.py index f3d3a5d..c7c3636 100644 --- a/Maya/MAYA_APP_DIR/plug-ins/DazToMaya_Files/d2m.py +++ b/Maya/MAYA_APP_DIR/plug-ins/DazToMaya_Files/d2m.py @@ -1,16 +1,18 @@ +from __future__ import absolute_import +from __future__ import print_function +from xml.etree import ElementTree import xml.etree.cElementTree as ET import maya.mel as mel import maya.cmds as cmds import math import os -import sys -import traceback -import webbrowser +import sys, traceback import pymel.core as pm -from xml.etree import ElementTree from pymel import versions +import webbrowser from shutil import copyfile - +from six.moves import range +import base64 #no delete morph, editer for user... @@ -87,14 +89,14 @@ def configAskToSave(value): ] if os.path.exists(serialPath): - print "DazToMaya - Ready" + print("DazToMaya - Ready") else: - print "Serial file not found" + print("Serial file not found") serial = ET.Element("serialPath") ET.SubElement(serial, "d2m_serial", number="") tree = ET.ElementTree(serial) tree.write(serialPath) - print serialPath + print(serialPath) #cmds.confirmDialog( title='FBX not found', message="Serial file not found.", button=['OK']) #Read Serial File for Serial... @@ -145,7 +147,7 @@ def btnSaveWithText(): pass class waitDialog(object): - def __init__(self): + def __init__(self): try: pm.deleteUI(self.WindowWait) except: @@ -156,10 +158,10 @@ def __init__(self): cmds.text( label='Importing please wait...' ) cmds.separator( height=20, style='in' ) - def show(self): - self.WindowWait.show() - def close(self): - pm.deleteUI(self.WindowWait) + def show(self): + self.WindowWait.show() + def close(self): + pm.deleteUI(self.WindowWait) #------------------------------------------------------------------- @@ -171,7 +173,7 @@ def close(self): pass class waitDialog2(object): - def __init__(self): + def __init__(self): try: pm.deleteUI(self.WindowWait2) except: @@ -182,9 +184,9 @@ def __init__(self): cmds.text( label='Converting please wait...' ) cmds.separator( height=20, style='in' ) - def show(self): - self.WindowWait2.show() - def close(self): + def show(self): + self.WindowWait2.show() + def close(self): pm.deleteUI(self.WindowWait2) #------------------------------------------------------------------------------------- @@ -513,8 +515,8 @@ def checkIfModified(): for o in objs: if cmds.objectType(o) == "locator": if o.find("Character1_Reference") == 0: - print "\n"*10 - print "Scene already modified" + print("\n"*10) + print("Scene already modified") sys.exit() #ABOUR SCRIPT IF SCENE NOT READY!! #DETECT FIGURE------------------------ i = 0 @@ -526,7 +528,7 @@ def checkIfModified(): for o in objs: if cmds.objectType(o) == "locator": if o.find("Character1_Reference") == 0: - print "Found" + print("Found") if o.find("Genesis2Female") == 0: figure="Genesis2MaleFBXASC046Shape" @@ -540,7 +542,7 @@ def clampTextures(): mel.eval('setAttr "hardwareRenderingGlobals.enableTextureMaxRes" 1') mel.eval('setAttr "hardwareRenderingGlobals.textureMaxResolution" 512') except: - print "No Text Clamp" + print("No Text Clamp") def sentinelExtraFinger(): mel.eval('select -r lThumb2') @@ -565,7 +567,7 @@ def sentinelRemoveFinger(): mel.eval('select -r -sym rThumb4') mel.eval('doDelete') except: - print "Sentinel Finger Fix" + print("Sentinel Finger Fix") def cleanMorphs(figureWithMorphs): @@ -616,7 +618,7 @@ def cleanMatNames(): except: pass except: - print "no std mats" + print("no std mats") def loadSkeleton(): pass @@ -674,7 +676,7 @@ def slider_drag_callback(*args): i = i + 1 def value_change_callback(*args): - print 'Value Changed' + print('Value Changed') def removeLimits(): meshList = mel.eval('ls -type joint') @@ -765,7 +767,7 @@ def connectTex(image,material,input): cmds.setAttr(newFile+'.fileTextureName',image,type='string') cmds.setAttr(newFile+'.filterType',0) except: - print "Texture Nc." + print("Texture Nc.") def getTransparencyFile(matname): #matname = "Strands" @@ -818,7 +820,7 @@ def eyeLashFix(): for l in listAll: try: if "Lashes" in l: - print "Texture: " + l + print("Texture: " + l) if "lash" in l: lashMaterial = l conn = cmds.listConnections(lashMaterial+'.'+"color",type='file') @@ -937,7 +939,7 @@ def dazToIk(): if "SENTINEL" in j: sentinel = sentinel + 1 if sentinel >= 1: - print "Sentinel Detected" + print("Sentinel Detected") else: if cmds.objExists('lThumb4'): mel.eval('setCharacterObject("lThumb4","Character1",53,0)') @@ -999,7 +1001,7 @@ def dazToIk(): if "SENTINEL" in j: sentinel = sentinel + 1 if sentinel >= 1: - print "Sentinel Detected" + print("Sentinel Detected") else: mel.eval('setCharacterObject("rThumb4","Character1",77,0)') @@ -1213,7 +1215,7 @@ def sentinelRotationsFix(): mel.eval('setAttr "rFoot.rotateY" 6.61') mel.eval('setAttr "rFoot.rotateZ" 3.66') except: - print "Sentinel fix" + print("Sentinel fix") def genesis1rotationsFix(): try: @@ -1386,7 +1388,7 @@ def genesis1rotationsFix(): mel.eval('setAttr "rFoot.rotateZ" -3.78') except: - print "Gen1RotsFix..." + print("Gen1RotsFix...") def genesis2rotationsFix(): try: @@ -1550,7 +1552,7 @@ def genesis2rotationsFix(): mel.eval('setAttr "rPinky3.rotateY" 0.0') mel.eval('setAttr "rPinky3.rotateZ" -0.0') except: - print "Gen2RotsFix..." + print("Gen2RotsFix...") def genesis3rotationsFix(): #--------------------------------------------------------- @@ -1740,7 +1742,7 @@ def genesis3rotationsFix(): mel.eval('setAttr "rFoot.rotateZ" -5.7') ''' except: - print "Gen3RotsFix..." + print("Gen3RotsFix...") def genesis8rotationsFix(): #--------------------------------------------------------- @@ -1946,7 +1948,7 @@ def genesis8rotationsFix(): mel.eval('setAttr "rFoot.rotateZ" -3.53') ''' except: - print "Gen8RotsFix..." + print("Gen8RotsFix...") def makeSkeleton(): mel.eval('CreateLocator') @@ -2167,13 +2169,13 @@ def cleanNamespace(): for j in jointList: if ":" in j: try: - print "Namespace detected, try cleaning" + print("Namespace detected, try cleaning") nameToGetNameSpace = j nameSpace = nameToGetNameSpace.split(":") mel.eval('namespace -mergeNamespaceWithRoot -removeNamespace %s' %nameSpace[0]) except: - print "namespace msg finished" - print "namespace fix finished" + print("namespace msg finished") + print("namespace fix finished") def genesis8matfix(): try: @@ -2243,7 +2245,7 @@ def eyeLashesFix1(): mel.eval('setAttr "Eyelashes.specularColor" -type double3 0 0 0 ') mel.eval('setAttr "Eyelashes.cosinePower" 2') except: - print "Lashes fix" + print("Lashes fix") def eyeLashesFix2(): try: @@ -2254,12 +2256,12 @@ def eyeLashesFix2(): mel.eval('setAttr "Eyelash.cosinePower" 2') mel.eval('setAttr "Eyelash.reflectedColor" -type double3 0 0 0') except: - print "Lashes fix" + print("Lashes fix") try: mel.eval('setAttr "ncl1_vr.opacityMap" -type double3 0.027972 0.027972 0.027972') mel.eval('setAttr "ncl1_vr.reflectionColor" -type double3 0.776224 0.776224 0.776224') except: - print "Lashes fix" + print("Lashes fix") class convertToVray: replaceShaders = True @@ -2347,7 +2349,7 @@ def assignToNewShader(self,oldShd, newShd): shdGroup = cmds.listConnections(oldShd, type="shadingEngine") if shdGroup: - print ">>>>>>>>" + newShd + print(">>>>>>>>" + newShd) if "Eye" in newShd: try: cmds.connectAttr(newShd + '.outColor', shdGroup[0] + '.aiSurfaceShader', force=True) #CHELO LINE... @@ -2477,12 +2479,12 @@ def transparencyToOpacity(self,inShd, outShd): #cmds.connectAttr(transpMap[0], outShd + '.opacityMap', force=True) try: - print "-*-*-*-*-*-*-" - print transpMap[0] + print("-*-*-*-*-*-*-") + print(transpMap[0]) transMapToInvert = transpMap[0].replace(".outTransparency","") mel.eval('setAttr "%s.invert" 1' %transMapToInvert) except: - print "already inv" + print("already inv") def convertPhong(self,inShd, outShd): @@ -2502,7 +2504,7 @@ def convertPhong(self,inShd, outShd): try: cmds.setAttr(outShd + '.' + "opacityMap", 1.0 - transpR, 1.0 - transpG, 1.0 - transpB, type = 'double3' ) except: - print "map detected" + print("map detected") self.transparencyToOpacity(inShd, outShd) def convertVrayMtl(self,inShd, outShd): @@ -2590,13 +2592,13 @@ def startConvert(self): try: pm.setAttr("defaultRenderGlobals.currentRenderer", "vray") except: - print "can't set Vray" + print("can't set Vray") try: mel.eval('setAttr "EyeMoisture.transparency" -type double3 1 1 1') mel.eval('setAttr "Cornea.transparency" -type double3 1 1 1') except: pass - print "Done." + print("Done.") self.convertUi() #======================================================================================================== @@ -2648,12 +2650,12 @@ def doMapping(inShd): ret = None shaderType = cmds.objectType(inShd) - print("-*-**-"*10) - print(shaderType, inShd) + print(("-*-**-"*10)) + print((shaderType, inShd)) if 'phong' in shaderType : #ret = shaderToAiStandard(inShd, 'aiStandardSurface', mappingPhong) ret = shaderToAiStandard(inShd, 'aiStandard', mappingPhong) - print(inShd,"Converted") + print((inShd,"Converted")) convertPhong(inShd, ret) #else: @@ -2689,7 +2691,7 @@ def assignToNewShader(oldShd, newShd): if shdGroup: if "Eye" in newShd or "Cornea" in newShd or "Tear" in newShd: - print "=========" + newShd + print("=========" + newShd) cmds.connectAttr(newShd + '.outColor', shdGroup[0] + '.aiSurfaceShader', force=True) #CHELO LINE... else: cmds.connectAttr(newShd + '.outColor', shdGroup[0] + '.surfaceShader', force=True) @@ -2732,13 +2734,12 @@ def shaderToAiStandard(inShd, nodeType, mapping): aiName = inShd.rsplit(':')[-1] + '_ai' else: aiName = inShd + '_ai' - + #print 'creating '+ aiName aiNode = cmds.shadingNode(nodeType, name=aiName, asShader=True) for chan in mapping: fromAttr = chan[0] toAttr = chan[1] - try: if cmds.objExists(inShd + '.' + fromAttr): #print '\t', fromAttr, ' -> ', toAttr @@ -2874,7 +2875,7 @@ def setupOpacities(): try: cmds.setAttr(shape+".aiOpaque", 0) except: - print "no opaque" + print("no opaque") if not cmds.pluginInfo( 'mtoa', query=True, loaded=True ): @@ -2898,21 +2899,21 @@ def breakLashCon(mat): try: mel.eval('disconnectAttr %s.outColor %s.color' %(f,mat)) except: - print "breakCon skiped" + print("breakCon skiped") except: - print "File Text.Error" + print("File Text.Error") def convertAlltoArnoldDazFixes(): convertAllPhongToArnold() objs = mel.eval('ls -geometry') #MAKE ALL GEOMETRY OPAQUEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE if objs is None: - print "Nothing on scene" + print("Nothing on scene") else: for o in objs: try: mel.eval('setAttr "%s.aiOpaque" 0' %o) except: - print "no obj" + print("no obj") i = 0 mats = mel.eval('ls -type "aiStandardSurface"') @@ -2923,7 +2924,7 @@ def convertAlltoArnoldDazFixes(): mel.eval('setAttr "%s.Ks" 0.045' %m) mel.eval('setAttr "%s.KsColor" -type double3 0.077 0.077 0.077' %m) except: - print "no phong" + print("no phong") if "lashes" in mats[i] or "Lashes" in mats[i]: breakLashCon(mats[i]) @@ -2933,9 +2934,9 @@ def convertAlltoArnoldDazFixes(): mel.eval('setAttr "%s.KtColor" -type double3 1 1 1' %mats[i]) mel.eval('setAttr "%s.opacity" -type double3 0.0324675 0.0324675 0.0324675' %mats[i]) mel.eval('setAttr "%s.specularRoughness" 0.00649351' %mats[i]) - mel.eval('setAttr "%s." 0.25974' %mats[i]) + mel.eval('setAttr "%s.Ks" 0.25974' %mats[i]) except: - print "matchange skiped" + print("matchange skiped") if "Reflection" in mats[i]: try: mel.eval('setAttr "%s.color" -type double3 0 0 0'%mats[i]) @@ -2943,22 +2944,22 @@ def convertAlltoArnoldDazFixes(): mel.eval('setAttr "%s.specularRoughness" 0.0324675'%mats[i]) mel.eval('setAttr "%s.Ks" 0.746753'%mats[i]) except: - print "matchange skiped" + print("matchange skiped") if "Moisture" in mats[i]: try: mel.eval('setAttr "%s.opacity" -type double3 0 0 0'%mats[i]) except: - print "matchange skiped" + print("matchange skiped") if "EyeLights" in mats[i]: try: mel.eval('setAttr "%s.opacity" -type double3 0 0 0'%mats[i]) except: - print "matchange skiped" + print("matchange skiped") if "Tear" in mats[i]: try: mel.eval('setAttr "%s.opacity" -type double3 0 0 0'%mats[i]) except: - print "matchange skiped" + print("matchange skiped") i = i + 1 @@ -3005,7 +3006,7 @@ def sceneRenamer(): oModif = oModif.replace("FBXASC056","_8") oModif = oModif.replace("FBXASC057","_9") - print o + " --- " + oModif + print(o + " --- " + oModif) if o == oModif: pass else: @@ -3029,7 +3030,7 @@ def lowestYonScene(): def compensateHip(): try: - print "MIN: " + str(lowestYonScene()) + print("MIN: " + str(lowestYonScene())) lowestY = lowestYonScene() hipY = cmds.getAttr("hip.translateY") cmds.setAttr( 'hip.translateY', hipY+(lowestY*-1) ) @@ -3052,7 +3053,7 @@ def morphIndex(figureWithMorphs, morphName): blendname = blendname.split("[") blendname = blendname[1].split("]") blendname = blendname[0] - print str(i) + " === " + blendShapesList[i] + " ---- " + blendname + print(str(i) + " === " + blendShapesList[i] + " ---- " + blendname) i = i + 1 if blendname != "None": @@ -3074,9 +3075,9 @@ def removeAllWeirdMophsFromScene(): allObjects = cmds.ls(l=True) for blendShapeGroup in allObjects: if cmds.nodeType(blendShapeGroup) == 'blendShape': - print "--------------------------" - print blendShapeGroup - print "--------------------------" + print("--------------------------") + print(blendShapeGroup) + print("--------------------------") try: removeWeirdMophs(blendShapeGroup) except: @@ -3137,7 +3138,7 @@ def autoIK(): pm.setAttr("defaultRenderGlobals.currentRenderer", "mayaSoftware") mel.eval('FrameAllInAllViews;') except: - print "Can't set Software Render" + print("Can't set Software Render") jointsList = mel.eval('ls -type joint') @@ -3212,8 +3213,8 @@ def autoIK(): genesis8matfix() #-----Probar forzar ojos correctos...... agregado para male3 lion-o... #ROTATIONS FIX----------------------------------- - print "------------------------------------" - print "------------------------------------" + print("------------------------------------") + print("------------------------------------") clampTextures() transparencyFix() @@ -3294,7 +3295,7 @@ def tempFun(): cmds.deleteUI(windowName) except: pass -windowDazMain = cmds.window(windowName, toolbox=True, maximizeButton=False, minimizeButton=True, sizeable=False, title="DazToMaya v1.7", widthHeight=(343, 452)) +windowDazMain = cmds.window(windowName, toolbox=True, maximizeButton=False, minimizeButton=True, sizeable=False, title="DazToMaya v1.6", widthHeight=(343, 452)) cmds.columnLayout( "columnName01", adjustableColumn = True) cmds.image( image=d2mLogo, width=343) #cmds.separator( height=10, style='none' ) @@ -3489,13 +3490,13 @@ def autoImportDaz(): waitDialog().show() except: pass - print "Importing Daz..." + print("Importing Daz...") cmds.refresh() if rb0 == True: importFbx() if rb1 == True: mel.eval('Import') - print "AutoIK..." + print("AutoIK...") try: pm.setAttr("defaultRenderGlobals.currentRenderer", "mayaSoftware") @@ -3544,7 +3545,7 @@ def autoImportDaz(): except: pass - print "DazToMaya Complete!" + print("DazToMaya Complete!") #result = cmds.confirmDialog( title='DazToMaya', message="Convert Complete!", button=['Ok'], defaultButton='Yes', cancelButton='No', dismissString='No' ) @@ -3561,7 +3562,7 @@ def btnConvert(): pm.setAttr("defaultRenderGlobals.currentRenderer", "arnold") convertAlltoArnoldDazFixes() except: - print "can't set Arnold" + print("can't set Arnold") if matConv == "Vray": convertToVray().startConvert() @@ -3569,7 +3570,7 @@ def btnConvert(): eyeLashesFix2() extraEyeFixes() vrayFixes() - print "Convert Done" + print("Convert Done") #------------------------------------------------------------------- #------------------------------------------------------------------- #Serial Dialog-------------------------------------------------------- @@ -3607,8 +3608,7 @@ def btnConvert(): #cmds.showWindow(window) #cmds.showWindow(windowSerial) -codeGenerator = os.path.expanduser("~/T") -codeGenerator = codeGenerator.encode('base64','strict') +codeGenerator = base64.b64encode(bytes(os.path.expanduser("~/T"), 'utf-8')) codeGenerator = codeGenerator[:-25] cmds.textField("txtFieldCode", edit=True, tx=codeGenerator) @@ -3648,12 +3648,12 @@ def EnterSerialCheck(): pass else: cmds.confirmDialog( title='DazToMaya', message="Serial Not Valid. ", button=['OK']) - print "Serial Not Valid" + print("Serial Not Valid") #---------------------------------------------------------------------- def d2mstart(): - if "2014" in mayaversion or "2015" in mayaversion or "2016" in mayaversion or "2017" in mayaversion or "2018" in mayaversion or "2019" in mayaversion or "2020" in mayaversion: + if "2014" in mayaversion or "2015" in mayaversion or "2016" in mayaversion or "2017" in mayaversion or "2018" in mayaversion or "2019" in mayaversion or "2020" in mayaversion or "2022" in mayaversion: sCheck = 0 if "U2" in serialNumber: sCheck = sCheck +1 if "YT" in serialNumber: sCheck = sCheck +1 @@ -3665,7 +3665,7 @@ def d2mstart(): else: cmds.showWindow(windowSerial) else: - print "Maya Version not Supported. Please visit www.daz3d.com" + print("Maya Version not Supported. Please visit www.daz3d.com") d2mstart() #d2m58-mac \ No newline at end of file diff --git a/Maya/MAYA_APP_DIR/plug-ins/DazToMaya_Files/d2m_logo.png b/Maya/MAYA_APP_DIR/plug-ins/DazToMaya_Files/d2m_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..d1c14502b7b1cd408f7fb9f67c650f5b6f1c5d6d GIT binary patch literal 27689 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 literal 0 HcmV?d00001 diff --git a/Maya/MAYA_APP_DIR/plug-ins/DazToMaya_Files/d2m_menu.py b/Maya/MAYA_APP_DIR/plug-ins/DazToMaya_Files/d2m_menu.py index 511bd07..628c305 100644 --- a/Maya/MAYA_APP_DIR/plug-ins/DazToMaya_Files/d2m_menu.py +++ b/Maya/MAYA_APP_DIR/plug-ins/DazToMaya_Files/d2m_menu.py @@ -1,8 +1,11 @@ +from __future__ import absolute_import +from __future__ import print_function import maya.cmds as cmds import pymel.core as pm import os import xml.etree.ElementTree as ET import maya.mel as mel +from six.moves import range class generateMenu(): import maya.cmds as cmds import pymel.core as pm @@ -19,8 +22,8 @@ class generateMenu(): pathIconMac = "/users/Shared/Autodesk/maya/plug-ins/DazToMaya_Files/DazToMaya_Icon.png" try: - print("path icon: ", pathIcon) - print("path icon: ", pathMayaIcons + mayaVersion + "/prefs/icons/DazToMaya_Icon.png") + print(("path icon: ", pathIcon)) + print(("path icon: ", pathMayaIcons + mayaVersion + "/prefs/icons/DazToMaya_Icon.png")) cmds.sysFile( pathIcon, copy= pathMayaIcons + mayaVersion + "/prefs/icons/DazToMaya_Icon.png" )# Windows except: pass @@ -106,7 +109,7 @@ def remove(self): -print "START" +print("START") def start(): generateMenu().start() def remove(): diff --git a/Maya/MAYA_APP_DIR/plug-ins/DazToMaya_Files/ikmax_menu.py b/Maya/MAYA_APP_DIR/plug-ins/DazToMaya_Files/ikmax_menu.py index f658755..7f18707 100644 --- a/Maya/MAYA_APP_DIR/plug-ins/DazToMaya_Files/ikmax_menu.py +++ b/Maya/MAYA_APP_DIR/plug-ins/DazToMaya_Files/ikmax_menu.py @@ -1,8 +1,11 @@ +from __future__ import absolute_import +from __future__ import print_function import maya.cmds as cmds import pymel.core as pm import os import xml.etree.ElementTree as ET import maya.mel as mel +from six.moves import range class generateMenu(): import maya.cmds as cmds import pymel.core as pm @@ -57,7 +60,7 @@ def menuFind(self, menuName): try: itemLabel = cmds.menu(menuNumber, query=True, label=True) if itemLabel == menuName: - print "Found!", str(x) + print("Found!", str(x)) return "menu" + str(x) except: pass @@ -124,7 +127,7 @@ def remove(self): -print "START" +print("START") def start(): generateMenu().start() def remove(): From 105983c8e321a72d0f9155f0c0c35c4b30933fad Mon Sep 17 00:00:00 2001 From: guto88 <81046300+guto88@users.noreply.github.com> Date: Sat, 1 May 2021 09:20:09 -0300 Subject: [PATCH 2/2] make the plugin compatible with python 2 and 3 at the same time. --- Maya/MAYA_APP_DIR/plug-ins/DazToMaya.py | 13 ++++++++++--- .../plug-ins/DazToMaya_Files/d2m.py | 19 ++++++++++++++++--- 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/Maya/MAYA_APP_DIR/plug-ins/DazToMaya.py b/Maya/MAYA_APP_DIR/plug-ins/DazToMaya.py index 5e1789d..6f0b6fd 100644 --- a/Maya/MAYA_APP_DIR/plug-ins/DazToMaya.py +++ b/Maya/MAYA_APP_DIR/plug-ins/DazToMaya.py @@ -3,7 +3,14 @@ import sys import maya.OpenMaya as OpenMaya import maya.OpenMayaMPx as OpenMayaMPx -import importlib +from sys import version_info +if version_info[0] < 3: + pass # Python 2 has built in reload +elif version_info[0] == 3 and version_info[1] <= 4: + from imp import reload # Python 3.0 - 3.4 +else: + from importlib import reload # Python 3.5+ + commandName = 'daztomaya' @@ -42,7 +49,7 @@ def psource(module): if not pathfound: sys.path.append( dir ) exec(('import ' + modname), globals()) - exec(( 'importlib.reload( ' + modname + ' )' ), globals()) + exec(( 'reload( ' + modname + ' )' ), globals()) return modname def DazToMayastart(): # When you import a file you must give it the full path @@ -74,7 +81,7 @@ def initializePlugin( mobject ): #--------------------- ADD ITEMS IN MENU // END -------------------------- ''' Initialize the plug-in when Maya loads it. ''' - mplugin = OpenMayaMPx.MFnPlugin( mobject, "Daz3D", "1.5" ) + mplugin = OpenMayaMPx.MFnPlugin( mobject, "Daz3D", "1.7" ) try: mplugin.registerCommand( commandName, cmdCreator ) except: diff --git a/Maya/MAYA_APP_DIR/plug-ins/DazToMaya_Files/d2m.py b/Maya/MAYA_APP_DIR/plug-ins/DazToMaya_Files/d2m.py index c7c3636..078dc5e 100644 --- a/Maya/MAYA_APP_DIR/plug-ins/DazToMaya_Files/d2m.py +++ b/Maya/MAYA_APP_DIR/plug-ins/DazToMaya_Files/d2m.py @@ -12,7 +12,13 @@ import webbrowser from shutil import copyfile from six.moves import range -import base64 + +from sys import version_info +if version_info[0] < 3: + pass +else: + import base64 + #no delete morph, editer for user... @@ -3295,7 +3301,7 @@ def tempFun(): cmds.deleteUI(windowName) except: pass -windowDazMain = cmds.window(windowName, toolbox=True, maximizeButton=False, minimizeButton=True, sizeable=False, title="DazToMaya v1.6", widthHeight=(343, 452)) +windowDazMain = cmds.window(windowName, toolbox=True, maximizeButton=False, minimizeButton=True, sizeable=False, title="DazToMaya v1.7", widthHeight=(343, 452)) cmds.columnLayout( "columnName01", adjustableColumn = True) cmds.image( image=d2mLogo, width=343) #cmds.separator( height=10, style='none' ) @@ -3608,7 +3614,14 @@ def btnConvert(): #cmds.showWindow(window) #cmds.showWindow(windowSerial) -codeGenerator = base64.b64encode(bytes(os.path.expanduser("~/T"), 'utf-8')) + + +if version_info[0] < 3: + codeGenerator = os.path.expanduser("~/T") + codeGenerator = codeGenerator.encode('base64','strict') +else: + codeGenerator = base64.b64encode(bytes(os.path.expanduser("~/T"), 'utf-8')) + codeGenerator = codeGenerator[:-25] cmds.textField("txtFieldCode", edit=True, tx=codeGenerator)