Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python API导出问题_Python_Api_Maya - Fatal编程技术网

Python API导出问题

Python API导出问题,python,api,maya,Python,Api,Maya,在我的这个出口问题上,我需要有人的专业知识 工作原理:选择相机(动画或非动画是可选的)>>文件>>导出选择>>文件类型:.chan(需要将此脚本作为插件加载) 问题就从这里开始。它可以创建一个.text文件,但是,它不是“导出”或将内容写入文本文件,文件大小为零字节 我正在使用已编码的当前API,修改代码以添加一些maya CMD 有人能帮我吗 import math, sys, string, os import maya.OpenMaya as OpenMaya import maya.O

在我的这个出口问题上,我需要有人的专业知识

工作原理:选择相机(动画或非动画是可选的)>>文件>>导出选择>>文件类型:.chan(需要将此脚本作为插件加载)

问题就从这里开始。它可以创建一个.text文件,但是,它不是“导出”或将内容写入文本文件,文件大小为零字节

我正在使用已编码的当前API,修改代码以添加一些maya CMD

有人能帮我吗

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

\uuuu调用\uuuu
方法应该提供文件的内容。它返回
self.fileExport
,这是一个未填充的空列表。

这里的问题是插件的writer方法在调用时不会等待exportWin用户界面返回用户输入

chanMe=fileExporter(transform、minTime、maxTime、cameraObject)
用户输入输入时,以下语句已执行:

适用于所有通道()
fileHandle.write(全部)
迭代器
fileHandle.close()
这就是为什么像这些基于插件的文件导出器在选项框中隐藏了它们的选项UI。这些选项将在调用插件的writer()之前传递

您需要在另一个脚本文件中使用MEL导出选项UI代码(特定格式),并在调用的optionScriptName参数中指定该文件的名称。这个选项UI和writer插件本身之间的通信需要遵循一个通信协议。这说明了这个过程

理想情况下,writer()方法应该具有计算和导出所需的所有详细信息,而不必等待用户输入

或者,如果您希望拥有自己的UI窗口和对事物流的更多控制,您可以将导出器编写为一个简单的MEL/Python模块,而不是一个插件。您仍然可以使用API的强大功能


希望这有帮助

你认为如果我重新安排我的代码,它会工作吗?我仍然需要弹出UI,尽管您可能会将UI转换为布局对话框,并在创建fileExporter之前调用它,然后在创建时将收集的信息传递给fileExporter。看起来您可以在一个简单的老python脚本中完成大部分工作,而不是通过API。也许这会简化问题。我想我也尝试过类似的方法,但不起作用。我认为这可能是由于API的编码方式或其他原因,因为当用户选择对象>>文件>>导出选择时,导出会起作用,这是一种自动化的过程..我偶然发现了Rob站点,正如您所发布的。我完全不理解它,可能是因为我没有关于API的线索,比如文件应该放在哪里等等。它正在使更多的信息丢失