2014-10-27 114 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