From 180a45ac2e978c39cc93c6135cad79abad3d7fdb Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Fri, 30 Oct 2020 12:46:00 +0100 Subject: [PATCH] #663 - Added loader for different types Added basic Creator --- .../stubs/aftereffects_server_stub.py | 109 +++++++++++++++--- .../aftereffects/create/create_render.py | 52 +++++++++ .../load/{load_image.py => load_resource.py} | 50 ++++++-- pype/resources/app_icons/aftereffects.png | Bin 0 -> 25234 bytes 4 files changed, 188 insertions(+), 23 deletions(-) create mode 100644 pype/plugins/aftereffects/create/create_render.py rename pype/plugins/aftereffects/load/{load_image.py => load_resource.py} (59%) create mode 100644 pype/resources/app_icons/aftereffects.png diff --git a/pype/modules/websocket_server/stubs/aftereffects_server_stub.py b/pype/modules/websocket_server/stubs/aftereffects_server_stub.py index b7a056e3835..2168a9ee558 100644 --- a/pype/modules/websocket_server/stubs/aftereffects_server_stub.py +++ b/pype/modules/websocket_server/stubs/aftereffects_server_stub.py @@ -10,6 +10,7 @@ import logging log = logging.getLogger(__name__) + class AfterEffectsServerStub(): """ Stub for calling function on client (Photoshop js) side. @@ -47,7 +48,11 @@ def read(self, layer, layers_meta=None): return layers_meta.get(str(layer.id)) def get_metadata(self): - layers_data = {} + """ + Get stored JSON with metadata from AE.Metadata.Label field + Returns: + (dict) + """ res = self.websocketserver.call(self.client.call ('AfterEffects.get_metadata') ) @@ -85,7 +90,10 @@ def imprint(self, layer, data, all_layers=None, layers_meta=None): layers_meta[str(layer.id)] = data # Ensure only valid ids are stored. if not all_layers: - all_layers = self.get_items(False) + # loaders create FootagetItem now + all_layers = self.get_items(comps=True, + folders=False, + footages=True) item_ids = [int(item.id) for item in all_layers] cleaned_data = {} for id in layers_meta: @@ -103,8 +111,8 @@ def get_active_document_full_name(self): Returns just a name of active document via ws call Returns(string): file name """ - res = self.websocketserver.call(self.client.call - ('AfterEffects.get_active_document_full_name')) + res = self.websocketserver.call(self.client.call( + 'AfterEffects.get_active_document_full_name')) return res @@ -113,35 +121,96 @@ def get_active_document_name(self): Returns just a name of active document via ws call Returns(string): file name """ - res = self.websocketserver.call(self.client.call - ('AfterEffects.get_active_document_name')) + res = self.websocketserver.call(self.client.call( + 'AfterEffects.get_active_document_name')) return res - def get_items(self, layers=True): + def get_items(self, comps, folders=False, footages=False): + """ + Get all items from Project panel according to arguments. + There are mutliple different types: + CompItem (could have multiple layers - source for Creator) + FolderItem (collection type, currently not used + FootageItem (imported file - created by Loader) + Args: + comps (bool): return CompItems + folders (bool): return FolderItem + footages (bool: return FootageItem + + Returns: + (list) of namedtuples + """ res = self.websocketserver.call(self.client.call ('AfterEffects.get_items', - layers=layers) + comps=comps, + folders=folders, + footages=footages) ) return self._to_records(res) - def import_file(self, path, item_name): + def get_selected_items(self, comps, folders=False, footages=False): + """ + Same as get_items but using selected items only + Args: + comps (bool): return CompItems + folders (bool): return FolderItem + footages (bool: return FootageItem + + Returns: + (list) of namedtuples + + """ + res = self.websocketserver.call(self.client.call + ('AfterEffects.get_selected_items', + comps=comps, + folders=folders, + footages=footages) + ) + return self._to_records(res) + + def import_file(self, path, item_name, import_options=None): + """ + Imports file as a FootageItem. Used in Loader + Args: + path (string): absolute path for asset file + item_name (string): label for created FootageItem + import_options (dict): different files (img vs psd) need different + config + + """ res = self.websocketserver.call(self.client.call( 'AfterEffects.import_file', path=path, - item_name=item_name) + item_name=item_name, + import_options=import_options) ) - return self._to_records(res).pop() + records = self._to_records(res) + if records: + return records.pop() + + log.debug("Couldn't import {} file".format(path)) def replace_item(self, item, path, item_name): - """ item is currently comp, might be layer, investigate TODO """ + """ Replace FootageItem with new file + + Args: + item (dict): + path (string):absolute path + item_name (string): label on item in Project list + + """ self.websocketserver.call(self.client.call ('AfterEffects.replace_item', item_id=item.id, path=path, item_name=item_name)) def delete_item(self, item): - """ item is currently comp, might be layer, investigate TODO """ + """ Deletes FootageItem with new file + Args: + item (dict): + + """ self.websocketserver.call(self.client.call ('AfterEffects.delete_item', item_id=item.id @@ -151,6 +220,20 @@ def is_saved(self): # TODO return True + def set_label_color(self, item_id, color_idx): + """ + Used for highlight additional information in Project panel. + Green color is loaded asset, blue is created asset + Args: + item_id (int): + color_idx (int): 0-16 Label colors from AE Project view + """ + self.websocketserver.call(self.client.call + ('AfterEffects.set_label_color', + item_id=item_id, + color_idx=color_idx + )) + def save(self): """ Saves active document diff --git a/pype/plugins/aftereffects/create/create_render.py b/pype/plugins/aftereffects/create/create_render.py new file mode 100644 index 00000000000..f38a4766e46 --- /dev/null +++ b/pype/plugins/aftereffects/create/create_render.py @@ -0,0 +1,52 @@ +from avalon import api +from avalon.vendor import Qt +from avalon import aftereffects + +import logging + +log = logging.getLogger(__name__) + + +class CreateRender(api.Creator): + """Render folder for publish.""" + + name = "renderDefault" + label = "Render" + family = "render" + + def process(self): + # Photoshop can have multiple LayerSets with the same name, which does + # not work with Avalon. + txt = "Instance with name \"{}\" already exists.".format(self.name) + stub = aftereffects.stub() # only after After Effects is up + for layer in stub.get_items(comps=True, + folders=False, + footages=False): + if self.name.lower() == layer.name.lower(): + msg = Qt.QtWidgets.QMessageBox() + msg.setIcon(Qt.QtWidgets.QMessageBox.Warning) + msg.setText(txt) + msg.exec_() + return False + log.debug("options:: {}".format(self.options)) + print("options:: {}".format(self.options)) + if (self.options or {}).get("useSelection"): + log.debug("useSelection") + print("useSelection") + items = stub.get_selected_items(comps=True, + folders=False, + footages=False) + else: + items = stub.get_items(comps=True, + folders=False, + footages=False) + log.debug("items:: {}".format(items)) + print("items:: {}".format(items)) + if not items: + raise ValueError("Nothing to create. Select composition " + + "if 'useSelection' or create at least " + + "one composition.") + + for item in items: + stub.imprint(item, self.data) + stub.set_label_color(item.id, 14) # Cyan options 0 - 16 diff --git a/pype/plugins/aftereffects/load/load_image.py b/pype/plugins/aftereffects/load/load_resource.py similarity index 59% rename from pype/plugins/aftereffects/load/load_image.py rename to pype/plugins/aftereffects/load/load_resource.py index 245f66c728a..73b0a4aae35 100644 --- a/pype/plugins/aftereffects/load/load_image.py +++ b/pype/plugins/aftereffects/load/load_resource.py @@ -5,25 +5,55 @@ stub = aftereffects.stub() -class ImageLoader(api.Loader): +class ResourceLoader(api.Loader): """Load images Stores the imported asset in a container named after the asset. """ - families = ["image"] + families = ["image", + "render2d", + "source", + "plate", + "render", + "prerender", + "review", + "preview", + "workfile"] representations = ["*"] def load(self, context, name=None, namespace=None, data=None): - print("Load:::") - layer_name = lib.get_unique_layer_name(stub.get_items(False), - context["asset"]["name"], - name) + comp_name = lib.get_unique_layer_name(stub.get_items(comps=True), + context["asset"]["name"], + name) + + import_options = {} + + file = self.fname + + repr_cont = context["representation"]["context"] + if "#" not in file: + frame = repr_cont.get("frame") + if frame: + padding = len(frame) + file = file.replace(frame, "#" * padding) + import_options['sequence'] = True + + if not file: + repr_id = context["representation"]["_id"] + self.log.warning( + "Representation id `{}` is failing to load".format(repr_id)) + return + + file = file.replace("\\", "/") + if '.psd' in file: + import_options['ImportAsType'] = 'ImportAsType.COMP' + #with photoshop.maintained_selection(): - comp = stub.import_file(self.fname, layer_name) + comp = stub.import_file(self.fname, comp_name, import_options) self[:] = [comp] - namespace = namespace or layer_name + namespace = namespace or comp_name return aftereffects.containerise( name, @@ -44,7 +74,7 @@ def update(self, container, representation): layer_name = "{}_{}".format(context["asset"], context["subset"]) # switching assets if namespace_from_container != layer_name: - layer_name = lib.get_unique_layer_name(stub.get_items(False), + layer_name = lib.get_unique_layer_name(stub.get_items(comps=True), context["asset"], context["subset"]) else: # switching version - keep same name @@ -64,7 +94,7 @@ def remove(self, container): """ layer = container.pop("layer") stub.imprint(layer, {}) - stub.delete_layer(layer.id) + stub.delete_item(layer.id) def switch(self, container, representation): self.update(container, representation) diff --git a/pype/resources/app_icons/aftereffects.png b/pype/resources/app_icons/aftereffects.png new file mode 100644 index 0000000000000000000000000000000000000000..56754e2be2395f994a4c19cdefd59f8152ecfeb5 GIT binary patch literal 25234 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 R`S*c=fNi(2EU|Dq{ZH}GtZe`Q literal 0 HcmV?d00001