私はこの問題を 3 日間調査してきましたが、うまくいきませんでした。私はこれらすべてにまったく慣れていないので、見逃しているものがあるかもしれません。
問題が適用される対象: Maya.cmds、PyMel、および QThread または Thread のみを使用する評価済み MEL
このコードは、Maya に続く「mayapy」python インタープリタで実行するように設計されています。複数のインスタンスで同じエラーを再現する短い例を作成しました。
1 つのボタンは機能しますが、もう 1 つのボタンは機能しません。しかし、それらは同じコードを実行します。
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 つのボタンを作成します。1 つが実行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
実行するだけでなく、 toが必要start
です。スレッド化を行う別の方法がない限り、回避策はありますか?