ayon-core/openpype/scripts/non_python_host_launch.py
Petr Kalis 136af34a71
AfterEffects: set frame range and resolution (#4983)
* OP-5660 - adding menu buttons to Set frame range in AE

* OP-5660 - refactored location of scripts

set_settings should be in lib as it is used elsewhere, but launch_logic and lib created circular dependency.
Moved main to launch logic as it is actually handling launching.

* OP-5660 - added set_settings to creator

When instance gets created, set frame range and resolution from DB.

* OP-5660 - minor fix

* OP-5660 - updated extension zip

* OP-5660 - updated documentation

* OP-5660 - fixed missing exception

* OP-5660 - fixed argument

* OP-5560 - fix imports

* OP-5660 - updated extension

* OP-5660 - add js alert message for buttons

* OP-5660 - repacked extension

Without Anastasyi showed success, but extension wasn't loaded.

* OP-5660 - make log message nicer

* OP-5660 - added log if workfile not saved

* OP-5660 - provide defaults to limit None exception

* OP-5660 - updated error message
2023-05-22 10:45:20 +02:00

108 lines
3.3 KiB
Python

"""Script wraps launch mechanism of non python host implementations.
Arguments passed to the script are passed to launch function in host
implementation. In all cases requires host app executable and may contain
workfile or others.
"""
import os
import sys
# Get current file to locate start point of sys.argv
CURRENT_FILE = os.path.abspath(__file__)
def show_error_messagebox(title, message, detail_message=None):
"""Function will show message and process ends after closing it."""
from qtpy import QtWidgets, QtCore
from openpype import style
app = QtWidgets.QApplication([])
app.setStyleSheet(style.load_stylesheet())
msgbox = QtWidgets.QMessageBox()
msgbox.setWindowTitle(title)
msgbox.setText(message)
if detail_message:
msgbox.setDetailedText(detail_message)
msgbox.setWindowModality(QtCore.Qt.ApplicationModal)
msgbox.show()
sys.exit(app.exec_())
def on_invalid_args(script_not_found):
"""Show to user message box saying that something went wrong.
Tell user that arguments to launch implementation are invalid with
arguments details.
Args:
script_not_found (bool): Use different message based on this value.
"""
title = "Invalid arguments"
joined_args = ", ".join("\"{}\"".format(arg) for arg in sys.argv)
if script_not_found:
submsg = "Where couldn't find script path:\n\"{}\""
else:
submsg = "Expected Host executable after script path:\n\"{}\""
message = "BUG: Got invalid arguments so can't launch Host application."
detail_message = "Process was launched with arguments:\n{}\n\n{}".format(
joined_args,
submsg.format(CURRENT_FILE)
)
show_error_messagebox(title, message, detail_message)
def main(argv):
# Modify current file path to find match in sys.argv which may be different
# on windows (different letter cases and slashes).
modified_current_file = CURRENT_FILE.replace("\\", "/").lower()
# Create a copy of sys argv
sys_args = list(argv)
after_script_idx = None
# Find script path in sys.argv to know index of argv where host
# executable should be.
for idx, item in enumerate(sys_args):
if item.replace("\\", "/").lower() == modified_current_file:
after_script_idx = idx + 1
break
# Validate that there is at least one argument after script path
launch_args = None
if after_script_idx is not None:
launch_args = sys_args[after_script_idx:]
host_name = os.environ["AVALON_APP"].lower()
if host_name == "photoshop":
# TODO refactor launch logic according to AE
from openpype.hosts.photoshop.api.lib import main
elif host_name == "aftereffects":
from openpype.hosts.aftereffects.api.launch_logic import main
elif host_name == "harmony":
from openpype.hosts.harmony.api.lib import main
else:
title = "Unknown host name"
message = (
"BUG: Environment variable AVALON_APP contains unknown"
" host name \"{}\""
).format(host_name)
show_error_messagebox(title, message)
return
if launch_args:
# Launch host implementation
main(*launch_args)
else:
# Show message box
on_invalid_args(after_script_idx is None)
if __name__ == "__main__":
main(sys.argv)