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-
2716class 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