Mayaの戻り値をClientで受け取る方法!!




takkun
どうも!たっくんです!

ClientからMayaを操作する方法はわかったけど、、、

Mayaからデータ
受け取れないの!?

っという方がいらっしゃるかと思いますので、Mayaの戻り値をClientで受け取る方法をご紹介したいと思います!(`・ω・´)ゞ

Clientを作って外部からMayaを操作する方法!!

2017.12.15

ログを表示する準備

Mayaから受け取ったデータを表示できるように、ログ用の「QTextEdit」を追加したいと思います!

import sys
from PySide import QtCore, QtGui, QtNetwork
 
class Client(QtGui.QWidget):
	def __init__(self, *args, **kwargs):
		super(Client, self).__init__(*args, **kwargs)
		 
		mainLayout = QtGui.QVBoxLayout(self)
		 
		self.__editor = QtGui.QTextEdit(self)
		self.__editor.setEnabled(False)
		mainLayout.addWidget(self.__editor)
		
		button = QtGui.QPushButton('Send', self)
		button.clicked.connect(self.send)
		mainLayout.addWidget(button)
		
		self.__log = QtGui.QTextEdit(self)
		self.__log.setEnabled(False)
		mainLayout.addWidget(self.__log)
		
		self.__tcpSocket = QtNetwork.QTcpSocket(self)
		self.__tcpSocket.error.connect(self.displayError)
		self.__tcpSocket.connected.connect(self.connected)
		self.__tcpSocket.connectToHost('127.0.0.1', 8888)
	 
	def connected(self):
		self.__editor.setEnabled(True)
		 
	def displayError(self, socketError):
		QtGui.QMessageBox.information(self, 'Client', self.__tcpSocket.errorString())
		
	def send(self):
		command = self.__editor.toPlainText()
		data = QtCore.QByteArray(command)
		self.__tcpSocket.write(data)
		 
		 
if __name__ == '__main__':
	app = QtGui.QApplication(sys.argv)
	window = Client()
	window.show()
	sys.exit(app.exec_())

データを受信した時の処理

QTcpSocketは、データを受信した時にシグナル「readyRead」を出してくれるので、これにスロット「receiveData」をコネクションします。受け取ったデータは「QByteArray」になるので、文字列として扱いたい場合は、メソッド「data」から取り出します!(*´ω`*)b

import sys
from PySide import QtCore, QtGui, QtNetwork
 
class Client(QtGui.QWidget):
	def __init__(self, *args, **kwargs):
		super(Client, self).__init__(*args, **kwargs)
		 
		mainLayout = QtGui.QVBoxLayout(self)
		 
		self.__editor = QtGui.QTextEdit(self)
		self.__editor.setEnabled(False)
		mainLayout.addWidget(self.__editor)
		
		button = QtGui.QPushButton('Send', self)
		button.clicked.connect(self.send)
		mainLayout.addWidget(button)
		
		self.__log = QtGui.QTextEdit(self)
		self.__log.setEnabled(False)
		mainLayout.addWidget(self.__log)
		
		self.__tcpSocket = QtNetwork.QTcpSocket(self)
		self.__tcpSocket.error.connect(self.displayError)
		self.__tcpSocket.readyRead.connect(self.receiveData)
		self.__tcpSocket.connected.connect(self.connected)
		self.__tcpSocket.connectToHost('127.0.0.1', 8888)
	 
	def connected(self):
		self.__editor.setEnabled(True)
		 
	def displayError(self, socketError):
		QtGui.QMessageBox.information(self, 'Client', self.__tcpSocket.errorString())
	
	def receiveData(self):
		receiveByteData = self.__tcpSocket.readAll()
		if receiveByteData.length() == 0:
			return
		
		self.__log.append(receiveByteData.data())
		
	def send(self):
		command = self.__editor.toPlainText()
		data = QtCore.QByteArray(command)
		self.__tcpSocket.write(data)
		 
		 
if __name__ == '__main__':
	app = QtGui.QApplication(sys.argv)
	window = Client()
	window.show()
	sys.exit(app.exec_())

実験!

上記のコードを実行して、Mayaからデータを受け取れるか確認してみます!(`・ω・´)ゞ

戻り値がちょっと扱いにくいデータですが、、、工夫次第でいろいろレスポンスを作れるかと思います!(`・ω・´)ゞ