diff --git a/pype/hosts/harmony/__init__.py b/pype/hosts/harmony/__init__.py index cdb8b407776..169786204e3 100644 --- a/pype/hosts/harmony/__init__.py +++ b/pype/hosts/harmony/__init__.py @@ -7,7 +7,45 @@ from pype import lib -def ensure_scene_settings(): +def set_scene_settings(settings): + func = """function func(args) + { + if (args[0]["fps"]) + { + scene.setFrameRate(args[0]["fps"]); + } + if (args[0]["frameStart"] && args[0]["frameEnd"]) + { + var duration = args[0]["frameEnd"] - args[0]["frameStart"] + 1 + if (frame.numberOf() > duration) + { + frame.remove( + duration, frame.numberOf() - duration + ); + } + if (frame.numberOf() < duration) + { + frame.insert( + duration, duration - frame.numberOf() + ); + } + + scene.setStartFrame(1); + scene.setStopFrame(duration); + } + if (args[0]["resolutionWidth"] && args[0]["resolutionHeight"]) + { + scene.setDefaultResolution( + args[0]["resolutionWidth"], args[0]["resolutionHeight"], 41.112 + ) + } + } + func + """ + harmony.send({"function": func, "args": [settings]}) + + +def get_asset_settings(): asset_data = lib.get_asset()["data"] fps = asset_data.get("fps") frame_start = asset_data.get("frameStart") @@ -15,7 +53,7 @@ def ensure_scene_settings(): resolution_width = asset_data.get("resolutionWidth") resolution_height = asset_data.get("resolutionHeight") - settings = { + return { "fps": fps, "frameStart": frame_start, "frameEnd": frame_end, @@ -23,6 +61,10 @@ def ensure_scene_settings(): "resolutionHeight": resolution_height } + +def ensure_scene_settings(): + settings = get_asset_settings() + invalid_settings = [] valid_settings = {} for key, value in settings.items(): @@ -47,41 +89,7 @@ def ensure_scene_settings(): # Garbage collect QApplication. del app - func = """function func(args) - { - if (args[0]["fps"]) - { - scene.setFrameRate(args[0]["fps"]); - } - if (args[0]["frameStart"] && args[0]["frameEnd"]) - { - var duration = args[0]["frameEnd"] - args[0]["frameStart"] + 1 - if (frame.numberOf() > duration) - { - frame.remove( - duration, frame.numberOf() - duration - ); - } - if (frame.numberOf() < duration) - { - frame.insert( - duration, duration - frame.numberOf() - ); - } - - scene.setStartFrame(1); - scene.setStopFrame(duration); - } - if (args[0]["resolutionWidth"] && args[0]["resolutionHeight"]) - { - scene.setDefaultResolution( - args[0]["resolutionWidth"], args[0]["resolutionHeight"], 41.112 - ) - } - } - func - """ - harmony.send({"function": func, "args": [valid_settings]}) + set_scene_settings(valid_settings) def install(): diff --git a/pype/plugins/harmony/publish/validate_scene_settings.py b/pype/plugins/harmony/publish/validate_scene_settings.py new file mode 100644 index 00000000000..260d64c42be --- /dev/null +++ b/pype/plugins/harmony/publish/validate_scene_settings.py @@ -0,0 +1,60 @@ +import json + +import pyblish.api + +import avalon.harmony +import pype.hosts.harmony + + +class ValidateSceneSettingsRepair(pyblish.api.Action): + """Repair the instance.""" + + label = "Repair" + icon = "wrench" + on = "failed" + + def process(self, context, plugin): + pype.hosts.harmony.set_scene_settings( + pype.hosts.harmony.get_asset_settings() + ) + + +class ValidateSceneSettings(pyblish.api.InstancePlugin): + """Ensure the scene settings are in sync with database.""" + + order = pyblish.api.ValidatorOrder + label = "Validate Scene Settings" + families = ["workfile"] + hosts = ["harmony"] + actions = [ValidateSceneSettingsRepair] + + def process(self, instance): + expected_settings = pype.hosts.harmony.get_asset_settings() + + func = """function func() + { + return { + "fps": scene.getFrameRate(), + "frameStart": scene.getStartFrame(), + "frameEnd": scene.getStopFrame(), + "resolutionWidth": scene.defaultResolutionX(), + "resolutionHeight": scene.defaultResolutionY() + }; + } + func + """ + current_settings = avalon.harmony.send({"function": func})["result"] + + invalid_settings = [] + for key, value in expected_settings.items(): + if value != current_settings[key]: + invalid_settings.append({ + "name": key, + "expected": value, + "current": current_settings[key] + }) + + msg = "Found invalid settings:\n{}".format( + json.dumps(invalid_settings, sort_keys=True, indent=4) + ) + assert not invalid_settings, msg