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

3.7 KiB
Raw Blame History

使用Pyside6以及非基础模块

安装Pyside6

pip install PySide6

默认情况下需要添加路径才能调用下载的库,执行以下代码即可:

import sys
import pathlib
my_python_path = "C:\Python311\Lib\site-packages"
sys.path.insert(0, my_python_path)

其他模块

对于一些非基础模块比如PySide6.QtWebSockets需要执行以下命令进行安装

pip install PySide6-Addons

WebSocketServer for Blender

https://github.com/KoltesDigital/websocket-server-for-blender

Pyside6实现

TODO:添加多线程,防止退出。

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()

# 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

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()