BlueRoseNote/06-DCC/Blender/Blender Python笔记.md

139 lines
3.5 KiB
Markdown
Raw Normal View History

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:添加多线程,防止退出。
```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()
```