2012-02-16 2 views
1

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

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

Этот код предназначен для работы на «mayapy» питона переводчика, который следует Майю. Я создал короткий пример, который повторно создает ту же ошибку в нескольких экземплярах.

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

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 (для панели прогресса), но большая часть кода майя начнет возвращать все виды ошибок, как это:

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, а не просто запустить. Если есть другой способ сделать потоки, обходной путь?

ответ