libreflow.extensions.sk.export-psd-layers 1.1.1__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.1 → libreflow_extensions_sk_export_psd_layers-1.1.3}/CHANGELOG.md +20 -0
  2. {libreflow_extensions_sk_export_psd_layers-1.1.1/src/libreflow.extensions.sk.export_psd_layers.egg-info → libreflow_extensions_sk_export_psd_layers-1.1.3}/PKG-INFO +21 -1
  3. {libreflow_extensions_sk_export_psd_layers-1.1.1 → libreflow_extensions_sk_export_psd_layers-1.1.3}/src/libreflow/extensions/sk/export_psd_layers/__init__.py +165 -39
  4. {libreflow_extensions_sk_export_psd_layers-1.1.1 → 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.1 → libreflow_extensions_sk_export_psd_layers-1.1.3/src/libreflow.extensions.sk.export_psd_layers.egg-info}/PKG-INFO +21 -1
  6. {libreflow_extensions_sk_export_psd_layers-1.1.1 → libreflow_extensions_sk_export_psd_layers-1.1.3}/MANIFEST.in +0 -0
  7. {libreflow_extensions_sk_export_psd_layers-1.1.1 → libreflow_extensions_sk_export_psd_layers-1.1.3}/README.md +0 -0
  8. {libreflow_extensions_sk_export_psd_layers-1.1.1 → libreflow_extensions_sk_export_psd_layers-1.1.3}/setup.cfg +0 -0
  9. {libreflow_extensions_sk_export_psd_layers-1.1.1 → libreflow_extensions_sk_export_psd_layers-1.1.3}/setup.py +0 -0
  10. {libreflow_extensions_sk_export_psd_layers-1.1.1 → libreflow_extensions_sk_export_psd_layers-1.1.3}/src/libreflow/__init__.py +0 -0
  11. {libreflow_extensions_sk_export_psd_layers-1.1.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → libreflow_extensions_sk_export_psd_layers-1.1.3}/versioneer.py +0 -0
@@ -19,6 +19,26 @@ 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
+
36
+ ## [1.1.2] - 2025-04-25
37
+
38
+ ### Fixed
39
+
40
+ * Export layers action: layers with invalid filename characters break the script
41
+
22
42
  ## [1.1.1] - 2025-04-24
23
43
 
24
44
  ### Fixed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: libreflow.extensions.sk.export_psd_layers
3
- Version: 1.1.1
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,26 @@ 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
+
67
+ ## [1.1.2] - 2025-04-25
68
+
69
+ ### Fixed
70
+
71
+ * Export layers action: layers with invalid filename characters break the script
72
+
53
73
  ## [1.1.1] - 2025-04-24
54
74
 
55
75
  ### Fixed
@@ -1,4 +1,5 @@
1
1
  import os
2
+ import re
2
3
  import json
3
4
  import gazu
4
5
  import time
@@ -20,6 +21,7 @@ class ExportPSDLayers(flow.Action):
20
21
 
21
22
  _file = flow.Parent()
22
23
  _files = flow.Parent(2)
24
+ _task = flow.Parent(3)
23
25
  _shot = flow.Parent(5)
24
26
  _sequence = flow.Parent(7)
25
27
 
@@ -37,6 +39,13 @@ class ExportPSDLayers(flow.Action):
37
39
  )
38
40
 
39
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)
40
49
  return True
41
50
 
42
51
  def get_buttons(self):
@@ -73,6 +82,67 @@ class ExportPSDLayers(flow.Action):
73
82
  self._files.touch()
74
83
 
75
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
76
146
 
77
147
  def run(self, button):
78
148
  if button == "Cancel":
@@ -90,49 +160,94 @@ class ExportPSDLayers(flow.Action):
90
160
 
91
161
  # Get revisions
92
162
  source_revision = self._file.get_revision(self.revision.get())
93
- render_revision = self.ensure_render_folder_revision()
94
163
 
95
164
  # Open photoshop file
96
165
  psb = PSDImage.open(source_revision.get_path())
97
166
 
98
- # JSON structure for layers order
99
- layers_data = {
100
- "from": os.path.basename(source_revision.get_path()),
101
- "layers": [],
102
- "hidden_layers": []
103
- }
104
167
 
105
- # Export image layers
106
- if os.path.exists(render_revision.get_path()) is False:
107
- os.makedirs(render_revision.get_path())
108
-
109
- folder_name = os.path.basename(render_revision.get_path())
168
+ ############# BG LAYOUT PROCESS #############
110
169
 
111
- for layer in reversed(psb):
112
- output_path = os.path.join(
113
- render_revision.get_path(),
114
- "{folder}-{layer}.png".format(folder=folder_name, layer=layer.name),
115
- )
170
+ if self._task.name() == "bg_layout" :
116
171
 
117
- session.log_info(log_format.format(message=f'Exporting layer {layer.name}'))
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
+ }
118
179
 
119
- image = layer.composite(viewport=psb.bbox)
120
- image.save(output_path)
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())
121
185
 
122
- # Push layer in correct JSON data
123
- layers_data["layers" if layer.visible else "hidden_layers"].append(
124
- layer.name
125
- )
126
-
127
- # Export JSON data
128
- json_object = json.dumps(layers_data)
129
- json_path = os.path.join(render_revision.get_path(), "layers.json")
130
-
131
- session.log_info(log_format.format(message='Saving layers.json'))
132
- with open(json_path, "w") as outfile:
133
- outfile.write(json_object)
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'))
134
217
 
135
- 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")
136
251
 
137
252
  return self.get_result(close=True)
138
253
 
@@ -375,12 +490,22 @@ class ExportPSDPreview(flow.Action):
375
490
 
376
491
  output_path = f"{os.path.splitext(file_path)[0]}_no_chara.png"
377
492
 
378
- image = psb.composite(
379
- layer_filter=lambda layer: layer.is_visible()
380
- and "character" not in layer.name
381
- and "INFO" not in layer.name
382
- and "REF" not in layer.name
383
- )
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)
384
509
 
385
510
  image.save(output_path)
386
511
 
@@ -570,6 +695,7 @@ def export_psd_layers(parent):
570
695
  if isinstance(parent, TrackedFile):
571
696
  r = flow.Child(ExportPSDLayers)
572
697
  r.name = "export_layers"
698
+ r.ui(label="Export")
573
699
  r.index = 50
574
700
  return r
575
701
 
@@ -8,11 +8,11 @@ import json
8
8
 
9
9
  version_json = '''
10
10
  {
11
- "date": "2025-04-24T20:10:00+0200",
11
+ "date": "2025-04-30T12:49:37+0200",
12
12
  "dirty": false,
13
13
  "error": null,
14
- "full-revisionid": "d8c0a2802f81b741854451ee913921df9a2d43d0",
15
- "version": "1.1.1"
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.1
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,26 @@ 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
+
67
+ ## [1.1.2] - 2025-04-25
68
+
69
+ ### Fixed
70
+
71
+ * Export layers action: layers with invalid filename characters break the script
72
+
53
73
  ## [1.1.1] - 2025-04-24
54
74
 
55
75
  ### Fixed