libreflow.extensions.sk.export-psd-layers 1.1.2__tar.gz → 1.1.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (17) hide show
  1. {libreflow_extensions_sk_export_psd_layers-1.1.2 → libreflow_extensions_sk_export_psd_layers-1.1.3}/CHANGELOG.md +14 -0
  2. {libreflow_extensions_sk_export_psd_layers-1.1.2/src/libreflow.extensions.sk.export_psd_layers.egg-info → libreflow_extensions_sk_export_psd_layers-1.1.3}/PKG-INFO +15 -1
  3. {libreflow_extensions_sk_export_psd_layers-1.1.2 → libreflow_extensions_sk_export_psd_layers-1.1.3}/src/libreflow/extensions/sk/export_psd_layers/__init__.py +165 -46
  4. {libreflow_extensions_sk_export_psd_layers-1.1.2 → libreflow_extensions_sk_export_psd_layers-1.1.3}/src/libreflow/extensions/sk/export_psd_layers/_version.py +3 -3
  5. {libreflow_extensions_sk_export_psd_layers-1.1.2 → libreflow_extensions_sk_export_psd_layers-1.1.3/src/libreflow.extensions.sk.export_psd_layers.egg-info}/PKG-INFO +15 -1
  6. {libreflow_extensions_sk_export_psd_layers-1.1.2 → libreflow_extensions_sk_export_psd_layers-1.1.3}/MANIFEST.in +0 -0
  7. {libreflow_extensions_sk_export_psd_layers-1.1.2 → libreflow_extensions_sk_export_psd_layers-1.1.3}/README.md +0 -0
  8. {libreflow_extensions_sk_export_psd_layers-1.1.2 → libreflow_extensions_sk_export_psd_layers-1.1.3}/setup.cfg +0 -0
  9. {libreflow_extensions_sk_export_psd_layers-1.1.2 → libreflow_extensions_sk_export_psd_layers-1.1.3}/setup.py +0 -0
  10. {libreflow_extensions_sk_export_psd_layers-1.1.2 → libreflow_extensions_sk_export_psd_layers-1.1.3}/src/libreflow/__init__.py +0 -0
  11. {libreflow_extensions_sk_export_psd_layers-1.1.2 → libreflow_extensions_sk_export_psd_layers-1.1.3}/src/libreflow/extensions/__init__.py +0 -0
  12. {libreflow_extensions_sk_export_psd_layers-1.1.2 → libreflow_extensions_sk_export_psd_layers-1.1.3}/src/libreflow/extensions/sk/__init__.py +0 -0
  13. {libreflow_extensions_sk_export_psd_layers-1.1.2 → libreflow_extensions_sk_export_psd_layers-1.1.3}/src/libreflow.extensions.sk.export_psd_layers.egg-info/SOURCES.txt +0 -0
  14. {libreflow_extensions_sk_export_psd_layers-1.1.2 → libreflow_extensions_sk_export_psd_layers-1.1.3}/src/libreflow.extensions.sk.export_psd_layers.egg-info/dependency_links.txt +0 -0
  15. {libreflow_extensions_sk_export_psd_layers-1.1.2 → libreflow_extensions_sk_export_psd_layers-1.1.3}/src/libreflow.extensions.sk.export_psd_layers.egg-info/requires.txt +0 -0
  16. {libreflow_extensions_sk_export_psd_layers-1.1.2 → libreflow_extensions_sk_export_psd_layers-1.1.3}/src/libreflow.extensions.sk.export_psd_layers.egg-info/top_level.txt +0 -0
  17. {libreflow_extensions_sk_export_psd_layers-1.1.2 → libreflow_extensions_sk_export_psd_layers-1.1.3}/versioneer.py +0 -0
@@ -19,6 +19,20 @@ Types of changes
19
19
 
20
20
  ## [Unreleased]
21
21
 
22
+ ## [1.1.3] - 2025-04-30
23
+
24
+ ### Changed
25
+
26
+ * Action renamed to "Export" in actions submenu
27
+
28
+ ### Added
29
+
30
+ * BG Color projects will be exported as a png
31
+
32
+ ### Fixed
33
+
34
+ * Faster no_chara export in ExportPSDPreview
35
+
22
36
  ## [1.1.2] - 2025-04-25
23
37
 
24
38
  ### Fixed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: libreflow.extensions.sk.export_psd_layers
3
- Version: 1.1.2
3
+ Version: 1.1.3
4
4
  Home-page: https://gitlab.com/lfs.coop/libreflow/libreflow_launcher
5
5
  Author: Thomas Thiebaut
6
6
  Author-email: autor@les-fees-speciales.coop
@@ -50,6 +50,20 @@ Types of changes
50
50
 
51
51
  ## [Unreleased]
52
52
 
53
+ ## [1.1.3] - 2025-04-30
54
+
55
+ ### Changed
56
+
57
+ * Action renamed to "Export" in actions submenu
58
+
59
+ ### Added
60
+
61
+ * BG Color projects will be exported as a png
62
+
63
+ ### Fixed
64
+
65
+ * Faster no_chara export in ExportPSDPreview
66
+
53
67
  ## [1.1.2] - 2025-04-25
54
68
 
55
69
  ### Fixed
@@ -21,6 +21,7 @@ class ExportPSDLayers(flow.Action):
21
21
 
22
22
  _file = flow.Parent()
23
23
  _files = flow.Parent(2)
24
+ _task = flow.Parent(3)
24
25
  _shot = flow.Parent(5)
25
26
  _sequence = flow.Parent(7)
26
27
 
@@ -38,6 +39,13 @@ class ExportPSDLayers(flow.Action):
38
39
  )
39
40
 
40
41
  def needs_dialog(self):
42
+ msg = ""
43
+ if self._task.name() == "bg_layout":
44
+ msg = "<b>Layout : Photoshop Project layers will be exported separately</b>"
45
+ elif self._task.name() == "bg_color":
46
+ msg = "<b>BG Color : Photoshop Project will be exported as a single image</b>"
47
+
48
+ self.message.set(msg)
41
49
  return True
42
50
 
43
51
  def get_buttons(self):
@@ -74,6 +82,67 @@ class ExportPSDLayers(flow.Action):
74
82
  self._files.touch()
75
83
 
76
84
  return revision
85
+
86
+ def get_default_file(self):
87
+ mng = self.root().project().get_task_manager()
88
+ default_files = mng.default_files.get()
89
+ for file_name, task_names in default_files.items():
90
+ if 'bg_color.png' in file_name:
91
+ task = default_files[file_name][0]
92
+ file_mapped_name = file_name.replace(".", '_')
93
+ break
94
+
95
+ dft_task = mng.default_tasks[task]
96
+ if not dft_task.files.has_mapped_name(file_mapped_name): # check default file
97
+ # print(f'Scene Builder - default task {task_name} has no default file {filename} -> use default template')
98
+ return None
99
+
100
+ dft_file = dft_task.files[file_mapped_name]
101
+ return dft_file
102
+
103
+ def _ensure_file(self, file_name):
104
+ mapped_name = file_name.replace('.', '_')
105
+ f = None
106
+
107
+ if not self._files.has_mapped_name(mapped_name):
108
+ name, ext = os.path.splitext(file_name)
109
+ if ext:
110
+ f = self._files.add_file(name, ext[1:], tracked=True)
111
+ else:
112
+ f = self._files.add_folder(name, tracked=True)
113
+ else:
114
+ f = self._files[mapped_name]
115
+
116
+ return f
117
+
118
+ def _ensure_file_revision(self):
119
+
120
+ file = self._ensure_file("bg_color.png")
121
+ revision_name = self.revision.get()
122
+ source_revision = self._file.get_revision(self.revision.get())
123
+
124
+ if not file.has_revision(revision_name):
125
+ r = file.add_revision(revision_name)
126
+ file.set_current_user_on_revision(revision_name)
127
+ else:
128
+ r = file.get_revision(revision_name)
129
+
130
+ r.comment.set(source_revision.comment.get())
131
+
132
+ file.ensure_last_revision_oid()
133
+
134
+ r.set_sync_status("Available")
135
+
136
+ img_path = r.get_path().replace("\\", "/")
137
+
138
+ if not os.path.exists(img_path):
139
+ os.makedirs(os.path.dirname(img_path), exist_ok=True)
140
+ else:
141
+ os.remove(img_path)
142
+
143
+ self._files.touch()
144
+
145
+ return r
77
146
 
78
147
  def run(self, button):
79
148
  if button == "Cancel":
@@ -91,55 +160,94 @@ class ExportPSDLayers(flow.Action):
91
160
 
92
161
  # Get revisions
93
162
  source_revision = self._file.get_revision(self.revision.get())
94
- render_revision = self.ensure_render_folder_revision()
95
163
 
96
164
  # Open photoshop file
97
165
  psb = PSDImage.open(source_revision.get_path())
98
166
 
99
- # JSON structure for layers order
100
- layers_data = {
101
- "from": os.path.basename(source_revision.get_path()),
102
- "layers": [],
103
- "hidden_layers": []
104
- }
105
167
 
106
- # Export image layers
107
- if os.path.exists(render_revision.get_path()) is False:
108
- os.makedirs(render_revision.get_path())
109
-
110
- folder_name = os.path.basename(render_revision.get_path())
111
-
112
- for layer in reversed(psb):
113
- # Remove invalid characters
114
- layer_name = layer.name
115
- match_invalid = re.search(r"[~\"#%&*:<>?/\\{|}]+", layer.name)
116
- if match_invalid:
117
- layer_name = layer_name.replace(match_invalid.group(0), '')
118
-
119
- output_path = os.path.join(
120
- render_revision.get_path(),
121
- "{folder}-{layer}.png".format(folder=folder_name, layer=layer_name),
122
- )
168
+ ############# BG LAYOUT PROCESS #############
123
169
 
124
- session.log_info(log_format.format(message=f'Exporting layer {layer_name}'))
170
+ if self._task.name() == "bg_layout" :
125
171
 
126
- image = layer.composite(viewport=psb.bbox)
127
- image.save(output_path)
172
+ render_revision = self.ensure_render_folder_revision()
173
+ # JSON structure for layers order
174
+ layers_data = {
175
+ "from": os.path.basename(source_revision.get_path()),
176
+ "layers": [],
177
+ "hidden_layers": []
178
+ }
128
179
 
129
- # Push layer in correct JSON data
130
- layers_data["layers" if layer.visible else "hidden_layers"].append(
131
- layer_name
132
- )
133
-
134
- # Export JSON data
135
- json_object = json.dumps(layers_data)
136
- json_path = os.path.join(render_revision.get_path(), "layers.json")
137
-
138
- session.log_info(log_format.format(message='Saving layers.json'))
139
- with open(json_path, "w") as outfile:
140
- outfile.write(json_object)
180
+ # Export image layers
181
+ if os.path.exists(render_revision.get_path()) is False:
182
+ os.makedirs(render_revision.get_path())
183
+
184
+ folder_name = os.path.basename(render_revision.get_path())
185
+
186
+ for layer in reversed(psb):
187
+ # Remove invalid characters
188
+ layer_name = layer.name
189
+ match_invalid = re.search(r"[~\"#%&*:<>?/\\{|}]+", layer.name)
190
+ if match_invalid:
191
+ layer_name = layer_name.replace(match_invalid.group(0), '')
192
+
193
+ output_path = os.path.join(
194
+ render_revision.get_path(),
195
+ "{folder}-{layer}.png".format(folder=folder_name, layer=layer_name),
196
+ )
197
+
198
+ session.log_info(log_format.format(message=f'Exporting layer {layer_name}'))
199
+
200
+ image = layer.composite(viewport=psb.bbox)
201
+ image.save(output_path)
202
+
203
+ # Push layer in correct JSON data
204
+ layers_data["layers" if layer.visible else "hidden_layers"].append(
205
+ layer_name
206
+ )
207
+
208
+ # Export JSON data
209
+ json_object = json.dumps(layers_data)
210
+ json_path = os.path.join(render_revision.get_path(), "layers.json")
211
+
212
+ session.log_info(log_format.format(message='Saving layers.json'))
213
+ with open(json_path, "w") as outfile:
214
+ outfile.write(json_object)
215
+
216
+ session.log_info(log_format.format(message='Export complete'))
141
217
 
142
- session.log_info(log_format.format(message='Export complete'))
218
+ ############# BG COLOR PROCESS #############
219
+
220
+ if self._task.name() == "bg_color" :
221
+
222
+ default_file = self.get_default_file()
223
+ if default_file is not None:
224
+ render_revision = self._ensure_file_revision()
225
+
226
+ output_path = render_revision.get_path()
227
+ print(output_path)
228
+
229
+ info_layer = psb.find("INFO")
230
+ if info_layer : info_layer.visible = False
231
+
232
+ LO_layer = psb.find("REF_LAYOUT")
233
+ if LO_layer : LO_layer.visible = False
234
+
235
+ DES_layer = psb.find("REF_DESIGN")
236
+ if DES_layer : DES_layer.visible = False
237
+
238
+ chara_layer = psb.find("character")
239
+ if chara_layer : chara_layer.visible = False
240
+
241
+ utils_layer = psb.find("_utils")
242
+ if utils_layer : utils_layer.visible = False
243
+
244
+ image = psb.composite(force=True)
245
+ image.save(output_path)
246
+
247
+ session.log_info(log_format.format(message='Export complete'))
248
+
249
+ else:
250
+ self.root().session().log_error("[Export PSD] BG Color Image default file do not exist")
143
251
 
144
252
  return self.get_result(close=True)
145
253
 
@@ -382,12 +490,22 @@ class ExportPSDPreview(flow.Action):
382
490
 
383
491
  output_path = f"{os.path.splitext(file_path)[0]}_no_chara.png"
384
492
 
385
- image = psb.composite(
386
- layer_filter=lambda layer: layer.is_visible()
387
- and "character" not in layer.name
388
- and "INFO" not in layer.name
389
- and "REF" not in layer.name
390
- )
493
+ info_layer = psb.find("INFO")
494
+ if info_layer : info_layer.visible = False
495
+
496
+ LO_layer = psb.find("REF_LAYOUT")
497
+ if LO_layer : LO_layer.visible = False
498
+
499
+ DES_layer = psb.find("REF_DESIGN")
500
+ if DES_layer : DES_layer.visible = False
501
+
502
+ chara_layer = psb.find("character")
503
+ if chara_layer : chara_layer.visible = False
504
+
505
+ utils_layer = psb.find("_utils")
506
+ if utils_layer : utils_layer.visible = False
507
+
508
+ image = psb.composite(force=True)
391
509
 
392
510
  image.save(output_path)
393
511
 
@@ -577,6 +695,7 @@ def export_psd_layers(parent):
577
695
  if isinstance(parent, TrackedFile):
578
696
  r = flow.Child(ExportPSDLayers)
579
697
  r.name = "export_layers"
698
+ r.ui(label="Export")
580
699
  r.index = 50
581
700
  return r
582
701
 
@@ -8,11 +8,11 @@ import json
8
8
 
9
9
  version_json = '''
10
10
  {
11
- "date": "2025-04-25T13:00:12+0200",
11
+ "date": "2025-04-30T12:49:37+0200",
12
12
  "dirty": false,
13
13
  "error": null,
14
- "full-revisionid": "1ec678249c80d17d3ebf3b7fc8bd986c62201092",
15
- "version": "1.1.2"
14
+ "full-revisionid": "29b29736439c19dd3cb518df7412975b1f14e04b",
15
+ "version": "1.1.3"
16
16
  }
17
17
  ''' # END VERSION_JSON
18
18
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: libreflow.extensions.sk.export_psd_layers
3
- Version: 1.1.2
3
+ Version: 1.1.3
4
4
  Home-page: https://gitlab.com/lfs.coop/libreflow/libreflow_launcher
5
5
  Author: Thomas Thiebaut
6
6
  Author-email: autor@les-fees-speciales.coop
@@ -50,6 +50,20 @@ Types of changes
50
50
 
51
51
  ## [Unreleased]
52
52
 
53
+ ## [1.1.3] - 2025-04-30
54
+
55
+ ### Changed
56
+
57
+ * Action renamed to "Export" in actions submenu
58
+
59
+ ### Added
60
+
61
+ * BG Color projects will be exported as a png
62
+
63
+ ### Fixed
64
+
65
+ * Faster no_chara export in ExportPSDPreview
66
+
53
67
  ## [1.1.2] - 2025-04-25
54
68
 
55
69
  ### Fixed