2023-08-16 14:50:18 +08:00
|
|
|
|
# 使用Pyside6以及非基础模块
|
|
|
|
|
安装Pyside6
|
|
|
|
|
```
|
|
|
|
|
pip install PySide6
|
|
|
|
|
```
|
|
|
|
|
默认情况下需要添加路径才能调用下载的库,执行以下代码即可:
|
|
|
|
|
```python
|
|
|
|
|
import sys
|
|
|
|
|
import pathlib
|
|
|
|
|
my_python_path = "C:\Python311\Lib\site-packages"
|
|
|
|
|
sys.path.insert(0, my_python_path)
|
|
|
|
|
```
|
|
|
|
|
## 其他模块
|
|
|
|
|
对于一些非基础模块,比如PySide6.QtWebSockets,需要执行以下命令进行安装:
|
|
|
|
|
```bash
|
|
|
|
|
pip install PySide6-Addons
|
|
|
|
|
```
|
2023-08-16 16:55:46 +08:00
|
|
|
|
|
|
|
|
|
# WebSocketServer for Blender
|
|
|
|
|
https://github.com/KoltesDigital/websocket-server-for-blender
|
|
|
|
|
|
|
|
|
|
## Pyside6实现
|
|
|
|
|
TODO:添加多线程,防止退出。
|
2023-08-16 17:00:21 +08:00
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
|
server = QWebSocketServer()
|
|
|
|
|
thread = QtCore.QThread()
|
|
|
|
|
server.moveTOThread(thread)
|
|
|
|
|
server.finished.connect(thread.quit)
|
|
|
|
|
thread.started.connect(model.func_to_run)
|
|
|
|
|
thread.finished.connect(fun_to_run_after_thread_finished)
|
|
|
|
|
thread.start()
|
2023-08-16 17:39:30 +08:00
|
|
|
|
thread.start()
|
2023-08-16 17:00:21 +08:00
|
|
|
|
```
|
|
|
|
|
|
2023-08-16 16:55:46 +08:00
|
|
|
|
```python
|
|
|
|
|
# blender --background test.blend --python mytest.py -- example args 123
|
|
|
|
|
import sys
|
|
|
|
|
import pathlib
|
|
|
|
|
# import pyside6
|
|
|
|
|
my_python_path = "C:\Python311\Lib\site-packages"
|
|
|
|
|
sys.path.insert(0, my_python_path)
|
|
|
|
|
|
|
|
|
|
import bpy
|
|
|
|
|
from PySide6.QtNetwork import QHostAddress
|
|
|
|
|
from PySide6.QtWebSockets import QWebSocket
|
|
|
|
|
from PySide6.QtWebSockets import QWebSocketServer
|
|
|
|
|
|
|
|
|
|
class QRetargetWebsocketServer(QWebSocketServer):
|
|
|
|
|
def __init__(self):
|
|
|
|
|
super(QRetargetWebsocketServer, self).__init__("RetargetWebsocketServer", QWebSocketServer.NonSecureMode)
|
|
|
|
|
self.closed.connect(self.onClosed)
|
|
|
|
|
self.newConnection.connect(self.onNewConnection)
|
|
|
|
|
|
|
|
|
|
def onClosed():
|
|
|
|
|
print('connect closed!')
|
|
|
|
|
|
|
|
|
|
def onNewConnection(self, context, event):
|
|
|
|
|
client: QWebSocket = self.nextPendingConnection()
|
|
|
|
|
client.textMessageReceived.connect(self.onTextReceived)
|
|
|
|
|
|
|
|
|
|
def onTextReceived(self, text: str):
|
|
|
|
|
client: QWebSocket = self.sender()
|
|
|
|
|
|
|
|
|
|
if text == "Retarget":
|
|
|
|
|
print("Retarget")
|
|
|
|
|
client.sendTextMessage("Retarget")
|
|
|
|
|
else:
|
|
|
|
|
print("text:", text)
|
|
|
|
|
|
|
|
|
|
# 提取输出的命
|
|
|
|
|
argv = sys.argv
|
|
|
|
|
print(argv)
|
|
|
|
|
# argv = argv[argv.index("--") + 1:] # get all args after "--"
|
|
|
|
|
# print(argv) # --> ['example', 'args', '123']
|
|
|
|
|
|
|
|
|
|
WebSocketServer = QRetargetWebsocketServer()
|
|
|
|
|
WebSocketServer.listen(QHostAddress.LocalHost,9091)
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
# Http Server
|
|
|
|
|
```python
|
|
|
|
|
bl_info = {
|
|
|
|
|
"name": "My Awesome Server",
|
|
|
|
|
"blender": (2, 80, 0),
|
|
|
|
|
"category": "Object",
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
from http.server import BaseHTTPRequestHandler, HTTPServer
|
|
|
|
|
import threading
|
|
|
|
|
import bpy
|
|
|
|
|
|
|
|
|
|
class MyServer(BaseHTTPRequestHandler):
|
|
|
|
|
def do_GET(self):
|
|
|
|
|
if self.path == '/test':
|
|
|
|
|
self.send_response(200)
|
|
|
|
|
self.send_header('Content-type','text/html')
|
|
|
|
|
self.end_headers()
|
|
|
|
|
message = "This is a test page2."
|
|
|
|
|
self.wfile.write(bytes(message, "utf8"))
|
|
|
|
|
else:
|
|
|
|
|
self.send_response(404)
|
|
|
|
|
self.send_header('Content-type','text/html')
|
|
|
|
|
self.end_headers()
|
|
|
|
|
message = "404 Not Found."
|
|
|
|
|
self.wfile.write(bytes(message, "utf8"))
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
httpd = None
|
|
|
|
|
thread = None
|
|
|
|
|
thread2 = None
|
|
|
|
|
|
|
|
|
|
def start_server():
|
|
|
|
|
global httpd
|
|
|
|
|
|
|
|
|
|
server_address = ('localhost', 8080)
|
|
|
|
|
# Server is not running, start it
|
|
|
|
|
httpd = HTTPServer(server_address, MyServer)
|
|
|
|
|
print("Server started")
|
|
|
|
|
httpd.serve_forever()
|
|
|
|
|
|
|
|
|
|
def stop_server():
|
|
|
|
|
global httpd
|
|
|
|
|
global thread
|
|
|
|
|
httpd.shutdown()
|
|
|
|
|
thread.join()
|
|
|
|
|
print("Server stopped")
|
|
|
|
|
|
|
|
|
|
def stop_server_thread():
|
|
|
|
|
global thread2
|
|
|
|
|
thread2 = threading.Thread(target=stop_server)
|
|
|
|
|
thread2.start()
|
|
|
|
|
|
|
|
|
|
def register():
|
|
|
|
|
global thread
|
|
|
|
|
print("Hello World")
|
|
|
|
|
|
|
|
|
|
# Start the server on a new thread
|
|
|
|
|
thread = threading.Thread(target=start_server)
|
|
|
|
|
thread.daemon = True
|
|
|
|
|
thread.start()
|
|
|
|
|
|
|
|
|
|
def unregister():
|
|
|
|
|
print("Goodbye World")
|
|
|
|
|
|
|
|
|
|
stop_server_thread()
|
|
|
|
|
global thread2
|
|
|
|
|
thread2.join()
|
2023-12-13 22:02:04 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
# Blender CMD 启用插件
|
|
|
|
|
>./blender -b --addons animation_nodes,meshlint [file] --python [myscript.py]
|
|
|
|
|
|
|
|
|
|
这样就可以指定启用某某插件
|