2014-10-27 115 views
1

我需要某人在這個我的出口問題上的專業知識。API導出問題

它是如何工作:選擇攝像機(動畫與否是可選的)>>文件>>導出>>選擇文件類型:.chan(需要加載該腳本插件)

這裏是哪裏出了問題開始。它能夠創建一個.text文件,但是,它不會'導出'或將內容寫出到文本文件中,並且文件大小爲零字節。

我利用當前的API,它已被編碼,修改代碼在一些瑪雅CMDS添加

能有人好心幫我嗎?

import math, sys, string, os 

import maya.OpenMaya as OpenMaya 
import maya.OpenMayaMPx as OpenMayaMPx 
import maya.OpenMayaAnim as OpenMayaAnim 

import maya.cmds as cmds 
import maya.mel as mel 

kPluginTranslatorTypeName = "chan Export/Import" 
kVersionNumber = "0.5a" 

camSel = [] 
win_name = "chan_window" 

class CustomNodeTranslator(OpenMayaMPx.MPxFileTranslator): 
    def __init__(self): 
     OpenMayaMPx.MPxFileTranslator.__init__(self)  
    def haveWriteMethod(self): 
     return True 
    def haveReadMethod(self): 
     return True 
    def filter(self): 
     return " .chan" 
    def defaultExtension(self): 
     return "chan" 
    def writer(self, fileObject, optionString, accessMode): 
     try: 

      fullName = fileObject.fullName() 
      fileHandle = open(fullName,"w") 

      selectList = OpenMaya.MSelectionList() 

      OpenMaya.MGlobal.getActiveSelectionList(selectList) 
      node = OpenMaya.MObject() 
      depFn = OpenMaya.MFnDependencyNode() 
      path = OpenMaya.MDagPath() 
      iterator = OpenMaya.MItSelectionList(selectList) 

      animationTime = OpenMayaAnim.MAnimControl() 

      maxTime = int(animationTime.maxTime().value()) 
      minTime = int(animationTime.minTime().value()) 

      while (iterator.isDone() == 0): 

       iterator.getDependNode(node) 

       depFn.setObject(node) 

       iterator.getDagPath(path, node) 

       cameraObject = OpenMaya.MFnCamera(path) 

       transform = OpenMaya.MFnTransform(path) 

       chanMe = fileExporter(transform, minTime, maxTime, cameraObject) 

       for all in chanMe(): 
        fileHandle.write(all) 

       iterator.next() 

      fileHandle.close() 

     except: 
      sys.stderr.write("Failed to write file information\n") 
      raise 

    def processLine(self, lineStr): 

     self.importTheChan.writeFrameData(lineStr) 


class fileExporter(): 
    """ module for exporting chan files from application. arguments: object, startFrame, endFrame """ 

    def __init__(self, transform, startAnimation, endAnimation, cameraObj): 
     self.fileExport = [] 
     self.transform = transform 
     self.cameraObj = cameraObj 
     self.start = startAnimation 
     self.end = endAnimation 
     self.exportWin() 

    def exportWin(self): 
     self.expWindow = cmds.window(w=150, h=100, title = "Export Selection") 
     cmds.columnLayout(adjustableColumn=True) 
     form = cmds.formLayout(numberOfDivisions=100) 
     cmds.radioCollection() 
     self.chk1 = cmds.radioButton(label='option1', onc = self.opt1On, ofc = self.opt1Off) 
     self.chk2 = cmds.radioButton(label='option2', onc = self.opt2On, ofc = self.opt2Off) 
     self.okayBtn = cmds.button(label='okay!', command=self.runSel, width=150, height=35) 

     cmds.formLayout(form, edit=True, attachForm=[\ 
     (self.chk1, 'top', 15),\ 
     (self.chk1, 'left', 15),\ 
     (self.chk2, 'top', 30),\ 
     (self.chk2, 'left', 15),\ 
     (self.okayBtn, 'top', 50),\ 
     (self.okayBtn, 'left', 15)]) 

     cmds.showWindow(self.expWindow) 

    def opt1On(self, args): 
     print "User checked option1" 

     startAnimation = cmds.playbackOptions(query=True, minTime=True) 
     endAnimation = cmds.playbackOptions(query=True, maxTime=True) 

     self.start = startAnimation 
     self.end = endAnimation 

    def opt1Off(self, args): 
     print "User un-checked option1" 
     cmds.radioButton(self.chk2, edit = True, enable = True) 
     self.start = "" 
     self.end = "" 

    def opt2On(self, args): 
     print "User checked option2" 
     startAnimation = cmds.findKeyframe(which='first') 
     endAnimation = cmds.findKeyframe(which='last') 

     self.start = startAnimation 
     self.end = endAnimation 

     #self.start.append(int(startAnimation)) 
     #self.end.append(int(endAnimation)) 

    def opt2Off(self, args): 
     print "User un-checked option2" 
     self.start = "" 
     self.end = "" 

    def runSel(self, args): 
     chkVal1 = cmds.radioButton(self.chk1, query=True, sl=1) 
     chkVal2 = cmds.radioButton(self.chk2, query=True, sl=1) 

     if chkVal1 == 1: 
      print "opt1 Pressed!"  
      print self.start 
      print self.end 
      self.test() 
      self.closeWindow() 

     elif chkVal2 == 1: 
      print "opt2 Pressed!" 
      print self.start 
      print self.end 
      self.test() 
      self.closeWindow() 

     else: 
      cmds.warning("Check an option") 

    def closeWindow(self): 
     cmds.deleteUI(self.expWindow, window=True) 

    def test(self): 
     self.actualExp(self.transform, self.start, self.end, self.cameraObj) 


    def actualExp(self, transform, startAnimation, endAnimation, cameraObj): 
     mayaGlobal = OpenMaya.MGlobal() 
     mayaGlobal.viewFrame(OpenMaya.MTime(1)) 

     # Converts the float arguement into integer 
     for i in range(int(startAnimation), int(endAnimation + 1)): 

      focalLength = cameraObj.focalLength() 

      vFilmApp = cameraObj.verticalFilmAperture() 

      focalOut = 2 math.degrees(math.atan(vFilmApp 25.4/ (2 focalLength))) 

      myEuler = OpenMaya.MEulerRotation() 
      spc = OpenMaya.MSpace.kWorld 

      trans = transform.getTranslation(spc) 

      rotation = transform.getRotation(myEuler) 
      rotVector = OpenMaya.MVector(myEuler.asVector()) 

      self.fileExport.append((str(i) + '\t' + str(trans[0]) + "\t" + str(trans[1]) + "\t" + str(trans[2]) + "\t" + str(math.degrees(rotVector[0])) + "\t" + str(math.degrees(rotVector[1])) + "\t" + str(math.degrees(rotVector[2])) + "\t" + str(focalOut) + "\n")) 

      mayaGlobal.viewFrame(OpenMaya.MTime(i+1)) 

    def __call__(self, args): 
     return self.fileExport 

    def radianToDegree(self, radians): 
     outDegrees = 0.0 
     outDegrees = (float(radians)/(math.pi)) 180 
     return outDegrees 


# creator 
def translatorCreator(): 
    return OpenMayaMPx.asMPxPtr(CustomNodeTranslator()) 

# initialize the script plug-in 
def initializePlugin(mobject): 
    mplugin = OpenMayaMPx.MFnPlugin(mobject) 

    try: 
     mplugin.registerFileTranslator(kPluginTranslatorTypeName, None, translatorCreator) 
    except: 
     sys.stderr.write("Failed to register translator: %s" % kPluginTranslatorTypeName) 
     raise 

# uninitialize the script plug-in 
def uninitializePlugin(mobject): 
    mplugin = OpenMayaMPx.MFnPlugin(mobject) 
    try: 
     mplugin.deregisterFileTranslator(kPluginTranslatorTypeName) 
    except: 
     sys.stderr.write("Failed to deregister translator: %s" % kPluginTranslatorTypeName) 
     raise 

回答

1

__call__方法是什麼應該提供的文件的內容。它返回self.fileExport,這是一個沒有被填充的空列表。

+0

您是否認爲如果我重新安排我的代碼,它會有效嗎?我仍然需要用戶界面彈出,雖然 – dissidia 2014-10-29 02:26:48

+0

您可能會將UI變成LayoutDialog並在創建fileExporter之前調用它,然後在創建時將收集的信息傳遞給FileExporter。 看起來你可以在普通的舊python腳本中完成大部分工作,而不是通過API。也許這會簡化問題。 – theodox 2014-10-29 05:29:11

+0

我想我嘗試過類似的方法,但它不起作用。我認爲這可能是由於API的編碼方式或某些因素,因爲導出在用戶選擇對象>>文件>>導出選擇時起作用,這是一種自動化過程。 – dissidia 2014-10-29 06:39:36

0

這裏的問題是插件的作者方法不會等待你的exportWin UI,當你調用

chanMe = fileExporter(transform, minTime, maxTime, cameraObject) 

由當時的用戶輸入的輸入,語句返回用戶輸入,遵循已執行:

for all in chanMe(): 
    fileHandle.write(all) 

    iterator.next() 

    fileHandle.close() 

那就是爲什麼基於插件的文件導出像這些有自己的選擇UI選項框中侷促。這些選項將在調用插件的writer()之前傳遞。

您將需要在另一個腳本文件中使用MEL導出選項UI代碼(以某種特定格式),並在registerFileTranslator調用的optionsScriptName參數中指定該文件的名稱。在此選項UI和寫入器插件本身之間進行通信時需要遵循一個通信協議。 RobTheBloke's awesome post說明了這個過程。

理想情況下,writer()方法應該具有計算和導出所需的所有細節,而無需等待用戶輸入。或者,如果您更喜歡擁有自己的UI窗口並更好地控制事物流,則可以將導出器不是作爲插件編寫,而是作爲簡單的MEL/Python模塊編寫。您仍然可以使用API​​的強大功能。

希望這有助於!

+0

我已經在Rob網站上找到你發佈。由於某些原因,我完全不理解它,可能是因爲我沒有關於API的線索,比如文件應放在哪裏等等。 – dissidia 2014-10-31 04:54:20