PyQt и Maya, с threading = False? - PullRequest
       25

PyQt и Maya, с threading = False?

1 голос
/ 16 февраля 2012

Я занимаюсь этой проблемой уже 3 дня, но безуспешно. Я совсем новичок во всем этом, так что, может быть, мне чего-то не хватает.

Проблема относится к: Maya.cmds, PyMel и оцененному MEL с использованием QThread или просто Thread

Этот код предназначен для запуска на интерпретаторе python "mayapy", который следует за Maya. Я создал короткий пример, который повторно создает одну и ту же ошибку в нескольких случаях.

Одна кнопка работает, другая - нет. Но они запускают один и тот же код.

from PyQt4 import Qt

class doStuff( Qt.QThread ):
    taskProgress = Qt.pyqtSignal(int)

    # --------------------------------------------------------- #
    # Here things start to crash...
    def run( self ):

        # This works
        persp = mel.general.PyNode('persp')
        print persp.translateX.get()

        # This dont work
        poiLights = mel.general.ls( exactType="pointLight" ) 
        for light in poiLights:
            print light

        # This dont work
        geo = mel.general.PyNode('pPyramidShape1')
        print mel.modeling.polyEvaluate( geo, face=True )

        # Emit progress
        self.taskProgress.emit( 1 )

        return
    # END
    # --------------------------------------------------------- #

class ui( Qt.QWidget ):
    def __init__(self, parent=None):
        super(ui, self).__init__(parent)

        # Init QThread
        self.thread = doStuff()

        # Create Widgets
        buttonNo = Qt.QPushButton("Start - Dont work")
        buttonYes = Qt.QPushButton("Start - Works")

        # Setup Layout
        layout = Qt.QVBoxLayout()
        layout.addWidget( buttonYes )
        layout.addWidget( buttonNo )
        self.setLayout( layout )
        self.show()

        # --------------------------------
        # PROBLEM AREA: Button signals

        # This one dont work, but starts the thread correctly.
        self.connect( buttonNo, Qt.SIGNAL("clicked()"), self.thread.start )

        # This one works, but dont start the thread correctly.
        self.connect( buttonYes, Qt.SIGNAL("clicked()"), self.thread.run ) 

        # --------------------------------

        self.thread.taskProgress.connect( self.updateProgress )

        return

    # Feedback progress status
    def updateProgress( self, value ):
        print 'Current progress is:', value

        return

if __name__ == '__main__':

    import sys
    app = Qt.QApplication(sys.path)
    program = ui()

    # init maya
    import pymel.core as mel
    filePath = '/Users/ecker/Dropbox/Scripts/RibExporter/mayaScene3ani.ma'
    mel.openFile( filePath, f=True, o=True )

    sys.exit(app.exec_())

Этот код создает 2 кнопки, которые при нажатии начинают выполнять ту же функцию. Каждый выполняет thread.start и thread.run.

thread.start заставит поток работать должным образом, имея возможность передавать данные в интерфейс Qt (для индикатора выполнения), но большая часть кода Maya начнет возвращать все виды ошибок, подобных этой:

Traceback (most recent call last):
  File "/Users/ecker/Dropbox/Scripts/RibExporter/error_recreation2.py", line 22, in run
    poiLights = mel.general.ls( exactType="pointLight" ) 
  File "/Applications/Autodesk/maya2012/Maya.app/Contents/Frameworks/Python.framework/Versions/Current/lib/python2.6/site-packages/pymel/core/general.py", line 969, in ls
    res = _util.listForNone(cmds.ls(*args, **kwargs))
  File "/Applications/Autodesk/maya2012/Maya.app/Contents/Frameworks/Python.framework/Versions/Current/lib/python2.6/site-packages/pymel/internal/pmcmds.py", line 134, in wrappedCmd
    res = new_cmd(*new_args, **new_kwargs)
TypeError: Flag 'long' must be passed a boolean argument

Это логический аргумент, и независимо от того, какие аргументы я пытаюсь привести в каком формате и каким образом, он всегда будет давать ошибки, очень похожие на это. В той же строке res = new_cmd(*new_args, **new_kwargs) требуется логическое значение.

Мне нужно от thread до start, а не просто бежать. Если нет другого способа сделать нить, обходной путь?

1 Ответ

3 голосов
/ 17 февраля 2012

Maya плохо работает с потоками. Ключевым моментом здесь является использование maya.utils.executeInMainThreadWithResult.

http://download.autodesk.com/us/maya/2010help/index.html?url=Python_Python_and_threading.htm,topicNumber=d0e182779

Надеюсь, это поможет.

...