From aec3ff0e3d7098e242ad4c1cd0cd0576076f9725 Mon Sep 17 00:00:00 2001 From: Gyedo Jeon Date: Mon, 28 Jun 2010 21:20:49 +0000 Subject: [PATCH] Added feature to export to Maya --- direct/src/leveleditor/LevelEditorBase.py | 16 +++++ direct/src/leveleditor/LevelEditorUIBase.py | 13 +++- direct/src/leveleditor/MayaConverter.py | 75 +++++++++++++++------ 3 files changed, 81 insertions(+), 23 deletions(-) diff --git a/direct/src/leveleditor/LevelEditorBase.py b/direct/src/leveleditor/LevelEditorBase.py index 766d7b07af..6e6ea64789 100755 --- a/direct/src/leveleditor/LevelEditorBase.py +++ b/direct/src/leveleditor/LevelEditorBase.py @@ -356,6 +356,22 @@ class LevelEditorBase(DirectObject): mayaConverter = MayaConverter(self.ui, self, modelname, callBack, None, False) mayaConverter.Show() + def exportToMaya(self, mayaFileName): + exportRootNP = render + self.exportToMayaCB(mayaFileName, exportRootNP) + + def exportToMayaCB(self, mayaFileName, exportRootNP): + bamFileName = mayaFileName + ".bam" + + if base.direct.selected.last: + obj = self.objectMgr.findObjectByNodePath(base.direct.selected.last) + if obj: + exportRootNP = obj[OG.OBJ_NP] + + exportRootNP.writeBamFile(bamFileName) + mayaConverter = MayaConverter(self.ui, self, mayaFileName, None, None, False, FROM_BAM_TO_MAYA) + mayaConverter.Show() + def updateStatusReadout(self, status, color=None): if status: # add new status line, first check to see if it already exists diff --git a/direct/src/leveleditor/LevelEditorUIBase.py b/direct/src/leveleditor/LevelEditorUIBase.py index f9cd1cec95..bd53ee8c2d 100755 --- a/direct/src/leveleditor/LevelEditorUIBase.py +++ b/direct/src/leveleditor/LevelEditorUIBase.py @@ -102,6 +102,7 @@ ID_NEW = 101 ID_OPEN = 102 ID_SAVE = 103 ID_SAVE_AS = 104 +ID_EXPORT_TO_MAYA = 105 ID_DUPLICATE = 201 ID_MAKE_LIVE = 202 @@ -126,6 +127,7 @@ class LevelEditorUIBase(WxPandaShell): ID_OPEN : ("&Open", "LE-OpenScene"), ID_SAVE : ("&Save", "LE-SaveScene"), ID_SAVE_AS : ("Save &As", None), + ID_EXPORT_TO_MAYA : ("Export to Maya", None), wx.ID_EXIT : ("&Quit", "LE-Quit"), ID_DUPLICATE : ("&Duplicate", "LE-Duplicate"), ID_MAKE_LIVE : ("Make &Live", "LE-MakeLive"), @@ -169,6 +171,9 @@ class LevelEditorUIBase(WxPandaShell): menuItem = self.menuFile.Insert(3, ID_SAVE_AS, self.MENU_TEXTS[ID_SAVE_AS][0]) self.Bind(wx.EVT_MENU, self.onSaveAs, menuItem) + menuItem = self.menuFile.Insert(4, ID_EXPORT_TO_MAYA, self.MENU_TEXTS[ID_EXPORT_TO_MAYA][0]) + self.Bind(wx.EVT_MENU, self.onExportToMaya, menuItem) + self.menuEdit = wx.Menu() self.menuBar.Insert(1, self.menuEdit, "&Edit") @@ -450,6 +455,12 @@ class LevelEditorUIBase(WxPandaShell): dialog.Destroy() return result + def onExportToMaya(self, evt): + dialog = wx.FileDialog(None, "Choose a file", os.getcwd(), "", "*.mb", wx.SAVE) + if dialog.ShowModal() == wx.ID_OK: + self.editor.exportToMaya(dialog.GetPath()) + dialog.Destroy() + def onDuplicate(self, evt): self.editor.objectMgr.duplicateSelected() @@ -627,4 +638,4 @@ class CurveDegreeUI(wx.Dialog): self.parent.editor.curveEditor.degree = 3 if(str(self.degree.GetSelection())=='2'): self.parent.editor.curveEditor.degree = 4 - self.Destroy() \ No newline at end of file + self.Destroy() diff --git a/direct/src/leveleditor/MayaConverter.py b/direct/src/leveleditor/MayaConverter.py index 5ffe121e68..ec5d3835c7 100755 --- a/direct/src/leveleditor/MayaConverter.py +++ b/direct/src/leveleditor/MayaConverter.py @@ -1,6 +1,5 @@ from direct.wxwidgets.WxAppShell import * import os, re, shutil - import ObjectGlobals as OG CLOSE_STDIN = "" @@ -72,8 +71,11 @@ class Process: else: return 1, None +FROM_MAYA_TO_EGG = 0 +FROM_BAM_TO_MAYA = 1 + class MayaConverter(wx.Dialog): - def __init__(self, parent, editor, mayaFile, callBack=None, obj=None, isAnim=False): + def __init__(self, parent, editor, mayaFile, callBack=None, obj=None, isAnim=False, convertMode=FROM_MAYA_TO_EGG): wx.Dialog.__init__(self, parent, id=wx.ID_ANY, title="Maya Converter", pos=wx.DefaultPosition, size=(300, 200)) @@ -81,6 +83,7 @@ class MayaConverter(wx.Dialog): self.obj = obj self.isAnim = isAnim self.callBack = callBack + self.mayaFile = mayaFile self.mainPanel = wx.Panel(self, -1) sizer = wx.BoxSizer(wx.VERTICAL) @@ -92,48 +95,76 @@ class MayaConverter(wx.Dialog): sizer2.Add(self.output, 1, wx.EXPAND, 0) self.mainPanel.SetSizer(sizer2) - if self.isAnim: - if self.obj: - command = 'maya2egg -uo ft -a chan %s -o %s.anim.egg'%(mayaFile, mayaFile) - self.process = Process(self, command, lambda p0=None, p1=mayaFile: self.onProcessEnded(p0, p1)) - else: - command = 'maya2egg -uo ft -a model %s -o %s.model.egg'%(mayaFile, mayaFile) - self.process = Process(self, command, lambda p0=None, p1=mayaFile: self.onModelProcessEnded(p0, p1)) + if convertMode == FROM_MAYA_TO_EGG: + self.convertFromMaya() + elif convertMode == FROM_BAM_TO_MAYA: + self.convertToMaya() else: - command = 'maya2egg -uo ft %s -o %s.egg'%(mayaFile, mayaFile) - self.process = Process(self, command, lambda p0=None, p1=mayaFile: self.onProcessEnded(p0, p1)) - + pass + self.timer = wx.Timer(self, -1) self.Bind(wx.EVT_TIMER, self.onPoll, self.timer) self.timer.Start(100) + + def convertFromMaya(self): + if self.isAnim: + if self.obj: + command = 'maya2egg -uo ft -a chan %s -o %s.anim.egg'%(self.mayaFile, self.mayaFile) + self.process = Process(self, command, lambda p0=None: self.onProcessEnded(p0)) + else: + command = 'maya2egg -uo ft -a model %s -o %s.model.egg'%(self.mayaFile, self.mayaFile) + self.process = Process(self, command, lambda p0=None: self.onModelProcessEnded(p0)) + else: + command = 'maya2egg -uo ft %s -o %s.egg'%(self.mayaFile, self.mayaFile) + self.process = Process(self, command, lambda p0=None: self.onProcessEnded(p0)) + + def convertToMaya(self): + bamFileName = self.mayaFile + ".bam" + eggFileName = self.mayaFile + ".egg" + command = 'bam2egg %s -o %s'%(bamFileName, eggFileName) + self.process = Process(self, command, lambda p0=None: self.onBam2EggEnded(p0)) + + def onEgg2MayaEnded(self, evt): + self.process.CloseInp() + for i in self.process.Poll(): + self.output.AppendText(i) + self.process = None + + def onBam2EggEnded(self, evt): + self.process.CloseInp() + for i in self.process.Poll(): + self.output.AppendText(i) + eggFileName = self.mayaFile + ".egg" + command = 'egg2maya -ui ft -uo ft %s -o %s'%(eggFileName, self.mayaFile) + self.process = Process(self, command, lambda p0=None: self.onEgg2MayaEnded(p0)) def onPoll(self, evt): if self.process: for i in self.process.Poll(): self.output.AppendText(i) - def onModelProcessEnded(self, evt, mayaFile): + def onModelProcessEnded(self, evt): self.process.CloseInp() for i in self.process.Poll(): self.output.AppendText(i) self.process = None - command = 'maya2egg -uo ft -a chan %s -o %s.anim.egg'%(mayaFile, mayaFile) - self.process = Process(self, command, lambda p0 = None, p1=mayaFile: self.onProcessEnded(p0, p1)) + command = 'maya2egg -uo ft -a chan %s -o %s.anim.egg'%(self.mayaFile, self.mayaFile) + self.process = Process(self, command, lambda p0 = None: self.onProcessEnded(p0)) - def onProcessEnded(self, evt, mayaFile): + def onProcessEnded(self, evt): self.process.CloseInp() for i in self.process.Poll(): self.output.AppendText(i) - self.output.AppendText('Converting %s is finished\n'%mayaFile) + self.output.AppendText('Converting %s is finished\n'%self.mayaFile) self.process = None - name = os.path.basename(mayaFile) + name = os.path.basename(self.mayaFile) if self.isAnim: if self.obj: objDef = self.obj[OG.OBJ_DEF] objNP = self.obj[OG.OBJ_NP] - animName = "%s.anim.egg"%mayaFile + animName = "%s.anim.egg"%self.mayaFile if animName not in objDef.anims: objDef.anims.append(animName) name = os.path.basename(animName) @@ -143,11 +174,11 @@ class MayaConverter(wx.Dialog): self.editor.ui.objectPropertyUI.updateProps(self.obj) return else: - modelName = "%s.model.egg"%mayaFile - animName = "%s.anim.egg"%mayaFile + modelName = "%s.model.egg"%self.mayaFile + animName = "%s.anim.egg"%self.mayaFile result = [name, modelName, animName] else: - modelName = "%s.egg"%mayaFile + modelName = "%s.egg"%self.mayaFile result = [name, modelName] if self.callBack: