From ad5d32634ada838fdb77c7985aaf44738da0424b Mon Sep 17 00:00:00 2001 From: Marcus Ottosson Date: Fri, 14 Nov 2014 18:19:52 +0000 Subject: [PATCH 1/3] Adding support for multiple instances, as per #10 of pyblish-qml --- pyblish_maya/lib.py | 10 ++++++++-- pyblish_maya/pythonpath/userSetup.py | 15 ++++++++++++--- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/pyblish_maya/lib.py b/pyblish_maya/lib.py index 021c9e8..77bcdf3 100644 --- a/pyblish_maya/lib.py +++ b/pyblish_maya/lib.py @@ -140,5 +140,11 @@ def launch_gui(): if not pyblish_maya.gui: raise ValueError("No GUI registered") - import subprocess - subprocess.Popen(["python", pyblish_maya.gui]) + if not "ENDPOINT_PORT" in os.environ: + raise ValueError("Pyblish start-up script doesn't seem to " + "have been run, could not find the PORT variable") + + host = "Maya" + port = os.environ["ENDPOINT_PORT"] + gui = __import__(pyblish_maya.gui) + gui.run(host, port, async=True) diff --git a/pyblish_maya/pythonpath/userSetup.py b/pyblish_maya/pythonpath/userSetup.py index 8878751..d7f5efd 100644 --- a/pyblish_maya/pythonpath/userSetup.py +++ b/pyblish_maya/pythonpath/userSetup.py @@ -1,3 +1,5 @@ +import os +import random INTEGRATION = False ENDPOINT = False @@ -23,14 +25,21 @@ if ENDPOINT: # Listen for externally running interfaces - pyblish_endpoint.server.start(service=pyblish_maya.EndpointService) + port = random.randint(6000, 7000) + pyblish_endpoint.server.start( + service=pyblish_maya.EndpointService, + port=port) + + # Store reference to port for frontend(s) + os.environ["ENDPOINT_PORT"] = str(port) try: import pyblish_qml - pyblish_maya.register_gui("pyblish_qml") - print "Registing QML GUI" except ImportError: pass + else: + pyblish_maya.register_gui("pyblish_qml") + print "Registing QML GUI" print "Pyblish Endpoint started.." From f28acbba38935ad14d627cbe5dffc9a7474f9d53 Mon Sep 17 00:00:00 2001 From: Marcus Ottosson Date: Fri, 21 Nov 2014 16:15:24 +0000 Subject: [PATCH 2/3] Simplified Endpoint integration --- pyblish_maya/__init__.py | 77 +++++++++++++++++++++++++--- pyblish_maya/pythonpath/userSetup.py | 51 +++--------------- pyblish_maya/service.py | 41 +++++---------- 3 files changed, 89 insertions(+), 80 deletions(-) diff --git a/pyblish_maya/__init__.py b/pyblish_maya/__init__.py index acb9414..7280cf5 100644 --- a/pyblish_maya/__init__.py +++ b/pyblish_maya/__init__.py @@ -1,9 +1,74 @@ -from .lib import (register_plugins, - register_gui, - maintained_selection, - add_to_filemenu, - launch_gui) +import os +import random +import threading -from .service import EndpointService +from . import lib +from . import service gui = None + + +def setup(): + """Setup integration""" + # Underscore prevents makes it less visible from within Maya + + if has_endpoint() and has_frontend(): + setup_endpoint() + setup_frontend() + print "pyblish: Setting up frontend" + else: + pass + + setup_integration() + + +def has_endpoint(): + try: + __import__("pyblish_endpoint.server") + __import__("pyblish_endpoint.service") + except ImportError: + return False + return True + + +def has_frontend(): + try: + __import__("pyblish_qml") + except ImportError: + return False + return True + + +def setup_endpoint(): + import pyblish_endpoint.server + import pyblish_endpoint.service + + # Listen for externally running interfaces + port = random.randint(6000, 7000) + + def server(): + pyblish_endpoint.server.start_production_server( + service=service.MayaService, + port=port) + + worker = threading.Thread(target=server) + worker.daemon = True + worker.start() + + # Store reference to port for frontend(s) + os.environ["ENDPOINT_PORT"] = str(port) + + print "pyblish: Endpoint running @ %i" % port + + +def setup_frontend(): + lib.register_gui("pyblish_qml") + + +def setup_integration(): + lib.register_plugins() + + # If a frontend is installed, it will be added + # to the menu as an option-box. + lib.add_to_filemenu() + print "pyblish: Integration loaded.." diff --git a/pyblish_maya/pythonpath/userSetup.py b/pyblish_maya/pythonpath/userSetup.py index d7f5efd..5d0fc03 100644 --- a/pyblish_maya/pythonpath/userSetup.py +++ b/pyblish_maya/pythonpath/userSetup.py @@ -1,49 +1,10 @@ -import os -import random - -INTEGRATION = False -ENDPOINT = False try: - import pyblish_maya - INTEGRATION = True -except ImportError as e: - print "Couldn't find pyblish_maya on your PYTHONPATH: ", e - -try: - import pyblish_endpoint.server - ENDPOINT = True -except ImportError as e: - # If Endpoint isn't installed, Maya won't be able to communicate - # with externally running interfaces; such as the QML frontend. - pass - + __import__("pyblish_maya") -if INTEGRATION: - # Register Maya plugins upon startup - pyblish_maya.register_plugins() +except ImportError: + print "pyblish: Could not load integration" - if ENDPOINT: - # Listen for externally running interfaces - port = random.randint(6000, 7000) - pyblish_endpoint.server.start( - service=pyblish_maya.EndpointService, - port=port) - - # Store reference to port for frontend(s) - os.environ["ENDPOINT_PORT"] = str(port) - - try: - import pyblish_qml - except ImportError: - pass - else: - pyblish_maya.register_gui("pyblish_qml") - print "Registing QML GUI" - - print "Pyblish Endpoint started.." - - # Filemenu will append GUI only if there is an endpoint - # willing to communicate with it. - pyblish_maya.add_to_filemenu() - print "Pyblish integration loaded.." +else: + import pyblish_maya + pyblish_maya.setup() diff --git a/pyblish_maya/service.py b/pyblish_maya/service.py index 3829a72..a363110 100644 --- a/pyblish_maya/service.py +++ b/pyblish_maya/service.py @@ -1,5 +1,3 @@ -import pyblish.main -import pyblish.api # Dependencies import pyblish_endpoint.service @@ -7,33 +5,18 @@ from maya import utils -class EndpointService(pyblish_endpoint.service.EndpointService): - def instances(self): - return utils.executeInMainThreadWithResult(get_instances) +# def from_main_thread(func): +# """Decorator to make `func` execute from main thread""" +# def wrapper(*args, **kwargs): +# return utils.executeInMainThreadWithResult(func, *args, **kwargs) +# return wrapper - def publish(self): - return utils.executeInMainThreadWithResult(publish) +class MayaService(pyblish_endpoint.service.EndpointService): + def init(self, *args, **kwargs): + return utils.executeInMainThreadWithResult( + super(MayaService, self).init, *args, **kwargs) -def publish(): - pyblish.main.publish() - - -def get_instances(): - ctx = pyblish.api.Context() - plugins = pyblish.api.discover(type="selectors") - - instances = [] - for plugin in plugins: - for inst, err in plugin().process(ctx): - if err is not None: - instances.append({"instance": None, - "message": "Exception occured"}) - - for instance in ctx: - instances.append({ - "instance": instance.name, - "family": instance.data("family") - }) - - return instances + def process(self, *args, **kwargs): + return utils.executeInMainThreadWithResult( + super(MayaService, self).process, *args, **kwargs) From 199b9bceb6351881fa6562c5608b129e3b9d59ea Mon Sep 17 00:00:00 2001 From: Marcus Ottosson Date: Tue, 25 Nov 2014 16:41:54 +0000 Subject: [PATCH 3/3] Refactoring display for GUI --- pyblish_maya/__init__.py | 2 ++ pyblish_maya/lib.py | 20 ++++++++++++++++---- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/pyblish_maya/__init__.py b/pyblish_maya/__init__.py index 7280cf5..10d8224 100644 --- a/pyblish_maya/__init__.py +++ b/pyblish_maya/__init__.py @@ -7,6 +7,8 @@ gui = None +show = lib.show + def setup(): """Setup integration""" diff --git a/pyblish_maya/lib.py b/pyblish_maya/lib.py index 77bcdf3..3a4b8f6 100644 --- a/pyblish_maya/lib.py +++ b/pyblish_maya/lib.py @@ -1,8 +1,10 @@ # Standard library import os +import atexit import inspect import logging import contextlib +import subprocess # Pyblish libraries import pyblish.api @@ -107,7 +109,7 @@ def filemenu_handler(event): pyblish.main.publish_all() if event == "gui": - pyblish_maya.launch_gui() + pyblish_maya.show() if event == "validate": pyblish.main.validate_all() @@ -136,7 +138,7 @@ def filemenu_handler(event): divider=True) -def launch_gui(): +def show(console=False): if not pyblish_maya.gui: raise ValueError("No GUI registered") @@ -146,5 +148,15 @@ def launch_gui(): host = "Maya" port = os.environ["ENDPOINT_PORT"] - gui = __import__(pyblish_maya.gui) - gui.run(host, port, async=True) + + CREATE_NO_WINDOW = 0x08000000 + proc = subprocess.Popen(["python", "-m", "pyblish_qml.app", + "--host", host, + "--port", str(port)], + creationflags=CREATE_NO_WINDOW if not console else 0) + + # Kill child process on Maya exit + def kill_child(): + proc.kill() + + atexit.register(kill_child)