Skip to content

Commit ddcbca0

Browse files
Merge pull request #2 from BigRoy/fusion-new-publisher
Fusion: New Publisher tweaks to PR
2 parents ef6cb62 + 9a25af3 commit ddcbca0

3 files changed

Lines changed: 60 additions & 80 deletions

File tree

openpype/hosts/fusion/api/pipeline.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -155,10 +155,12 @@ def get_containers(self):
155155
return ls()
156156

157157
def update_context_data(self, data, changes):
158-
print(data, changes)
158+
comp = get_current_comp()
159+
comp.SetData("openpype", data)
159160

160161
def get_context_data(self):
161-
return {}
162+
comp = get_current_comp()
163+
return comp.GetData("openpype") or {}
162164

163165

164166
def on_pyblish_instance_toggled(instance, old_value, new_value):

openpype/hosts/fusion/plugins/create/create_saver.py

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
Creator,
1313
CreatedInstance
1414
)
15+
from openpype.client import get_asset_by_name
1516

1617

1718
class CreateSaver(Creator):
@@ -87,15 +88,10 @@ def get_icon(self):
8788
return qtawesome.icon("fa.eye", color="white")
8889

8990
def update_instances(self, update_list):
90-
for update in update_list:
91-
instance = update.instance
91+
for created_inst, _changes in update_list:
9292

93-
# Get the new values after the changes by key, ignore old value
94-
new_data = {
95-
key: new for key, (_old, new) in update.changes.items()
96-
}
97-
98-
tool = instance.transient_data["tool"]
93+
new_data = created_inst.data_to_store()
94+
tool = created_inst.transient_data["tool"]
9995
self._update_tool_with_data(tool, new_data)
10096
self._imprint(tool, new_data)
10197

@@ -150,14 +146,22 @@ def _collect_unmanaged_saver(self, tool):
150146
asset = legacy_io.Session["AVALON_ASSET"]
151147
task = legacy_io.Session["AVALON_TASK"]
152148

149+
asset_doc = get_asset_by_name(project_name=project,
150+
asset_name=asset)
151+
153152
path = tool["Clip"][comp.TIME_UNDEFINED]
154153
fname = os.path.basename(path)
155154
fname, _ext = os.path.splitext(fname)
156-
subset = fname.rstrip(".")
155+
variant = fname.rstrip(".")
156+
subset = self.get_subset_name(
157+
variant=variant,
158+
task_name=task,
159+
asset_doc=asset_doc,
160+
project_name=project,
161+
)
157162

158163
attrs = tool.GetAttrs()
159164
passthrough = attrs["TOOLB_PassThrough"]
160-
variant = subset[len("render"):]
161165
return {
162166
# Required data
163167
"project": project,

openpype/hosts/fusion/plugins/create/create_workfile.py

Lines changed: 42 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,6 @@
1313
)
1414

1515

16-
def flatten_dict(d, parent_key=None, separator="."):
17-
items = []
18-
for key, v in d.items():
19-
new_key = parent_key + separator + key if parent_key else key
20-
if isinstance(v, collections.MutableMapping):
21-
items.extend(flatten_dict(v, new_key, separator=separator).items())
22-
else:
23-
items.append((new_key, v))
24-
return dict(items)
25-
26-
2716
class FusionWorkfileCreator(AutoCreator):
2817
identifier = "workfile"
2918
family = "workfile"
@@ -33,7 +22,7 @@ class FusionWorkfileCreator(AutoCreator):
3322

3423
create_allow_context_change = False
3524

36-
data_key = "openpype.workfile"
25+
data_key = "openpype_workfile"
3726

3827
def collect_instances(self):
3928

@@ -53,21 +42,17 @@ def collect_instances(self):
5342
self._add_instance_to_context(instance)
5443

5544
def update_instances(self, update_list):
56-
for update in update_list:
57-
instance = update.instance
58-
comp = instance.transient_data["comp"]
45+
for created_inst, _changes in update_list:
46+
comp = created_inst.transient_data["comp"]
5947
if not hasattr(comp, "SetData"):
6048
# Comp is not alive anymore, likely closed by the user
6149
self.log.error("Workfile comp not found for existing instance."
6250
" Comp might have been closed in the meantime.")
6351
continue
6452

65-
# TODO: It appears sometimes this could be 'nested'
66-
# Get the new values after the changes by key, ignore old value
67-
new_data = {
68-
key: new for key, (_old, new) in update.changes.items()
69-
}
70-
self._imprint(comp, new_data)
53+
# Imprint data into the comp
54+
data = created_inst.data_to_store()
55+
comp.SetData(self.data_key, data)
7156

7257
def create(self, options=None):
7358

@@ -76,61 +61,50 @@ def create(self, options=None):
7661
self.log.error("Unable to find current comp")
7762
return
7863

79-
# TODO: Is this really necessary?
80-
# Force kill any existing "workfile" instances
64+
existing_instance = None
8165
for instance in self.create_context.instances:
8266
if instance.family == self.family:
83-
self.log.debug(f"Removing instance: {instance}")
84-
self._remove_instance_from_context(instance)
67+
existing_instance = instance
68+
break
8569

8670
project_name = legacy_io.Session["AVALON_PROJECT"]
8771
asset_name = legacy_io.Session["AVALON_ASSET"]
8872
task_name = legacy_io.Session["AVALON_TASK"]
8973
host_name = legacy_io.Session["AVALON_APP"]
9074

91-
asset_doc = get_asset_by_name(project_name, asset_name)
92-
subset_name = self.get_subset_name(
93-
self.default_variant, task_name, asset_doc,
94-
project_name, host_name
95-
)
96-
data = {
97-
"asset": asset_name,
98-
"task": task_name,
99-
"variant": self.default_variant
100-
}
101-
data.update(self.get_dynamic_data(
102-
self.default_variant,
103-
task_name,
104-
asset_doc,
105-
project_name,
106-
host_name,
107-
data
108-
))
109-
110-
instance = CreatedInstance(
111-
family=self.family,
112-
subset_name=subset_name,
113-
data=data,
114-
creator=self
115-
)
116-
instance.transient_data["comp"] = comp
117-
self._add_instance_to_context(instance)
118-
119-
self._imprint(comp, data)
75+
if existing_instance is None:
76+
asset_doc = get_asset_by_name(project_name, asset_name)
77+
subset_name = self.get_subset_name(
78+
self.default_variant, task_name, asset_doc,
79+
project_name, host_name
80+
)
81+
data = {
82+
"asset": asset_name,
83+
"task": task_name,
84+
"variant": self.default_variant
85+
}
86+
data.update(self.get_dynamic_data(
87+
self.default_variant, task_name, asset_doc,
88+
project_name, host_name, None
89+
))
90+
91+
new_instance = CreatedInstance(
92+
self.family, subset_name, data, self
93+
)
94+
self._add_instance_to_context(new_instance)
95+
96+
elif (
97+
existing_instance["asset"] != asset_name
98+
or existing_instance["task"] != task_name
99+
):
100+
asset_doc = get_asset_by_name(project_name, asset_name)
101+
subset_name = self.get_subset_name(
102+
self.default_variant, task_name, asset_doc,
103+
project_name, host_name
104+
)
105+
existing_instance["asset"] = asset_name
106+
existing_instance["task"] = task_name
107+
existing_instance["subset"] = subset_name
120108

121109
def get_icon(self):
122110
return qtawesome.icon("fa.file-o", color="white")
123-
124-
def _imprint(self, comp, data):
125-
126-
# TODO: Should this keys persist or not? I'd prefer not
127-
# Do not persist the current context for the Workfile
128-
for key in ["variant", "subset", "asset", "task"]:
129-
data.pop(key, None)
130-
131-
# Flatten any potential nested dicts
132-
data = flatten_dict(data, separator=".")
133-
134-
# Prefix with data key openpype.workfile
135-
data = {f"{self.data_key}.{key}" for key, value in data.items()}
136-
comp.SetData(data)

0 commit comments

Comments
 (0)