libreflow.extensions.sk.export-psd-layers 1.1.2__tar.gz → 1.1.4__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.4}/CHANGELOG.md +20 -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.4}/PKG-INFO +21 -1
  3. {libreflow_extensions_sk_export_psd_layers-1.1.2 → libreflow_extensions_sk_export_psd_layers-1.1.4}/src/libreflow/extensions/sk/export_psd_layers/__init__.py +170 -46
  4. {libreflow_extensions_sk_export_psd_layers-1.1.2 → libreflow_extensions_sk_export_psd_layers-1.1.4}/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.4/src/libreflow.extensions.sk.export_psd_layers.egg-info}/PKG-INFO +21 -1
  6. {libreflow_extensions_sk_export_psd_layers-1.1.2 → libreflow_extensions_sk_export_psd_layers-1.1.4}/MANIFEST.in +0 -0
  7. {libreflow_extensions_sk_export_psd_layers-1.1.2 → libreflow_extensions_sk_export_psd_layers-1.1.4}/README.md +0 -0
  8. {libreflow_extensions_sk_export_psd_layers-1.1.2 → libreflow_extensions_sk_export_psd_layers-1.1.4}/setup.cfg +0 -0
  9. {libreflow_extensions_sk_export_psd_layers-1.1.2 → libreflow_extensions_sk_export_psd_layers-1.1.4}/setup.py +0 -0
  10. {libreflow_extensions_sk_export_psd_layers-1.1.2 → libreflow_extensions_sk_export_psd_layers-1.1.4}/src/libreflow/__init__.py +0 -0
  11. {libreflow_extensions_sk_export_psd_layers-1.1.2 → libreflow_extensions_sk_export_psd_layers-1.1.4}/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.4}/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.4}/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.4}/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.4}/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.4}/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.4}/versioneer.py +0 -0
@@ -19,6 +19,26 @@ Types of changes
19
19
 
20
20
  ## [Unreleased]
21
21
 
22
+ ## [1.1.4] - 2025-05-09
23
+
24
+ ### Fixed
25
+
26
+ * The exported image will now have the correct filename
27
+
28
+ ## [1.1.3] - 2025-04-30
29
+
30
+ ### Changed
31
+
32
+ * Action renamed to "Export" in actions submenu
33
+
34
+ ### Added
35
+
36
+ * BG Color projects will be exported as a png
37
+
38
+ ### Fixed
39
+
40
+ * Faster no_chara export in ExportPSDPreview
41
+
22
42
  ## [1.1.2] - 2025-04-25
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.2
3
+ Version: 1.1.4
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.4] - 2025-05-09
54
+
55
+ ### Fixed
56
+
57
+ * The exported image will now have the correct filename
58
+
59
+ ## [1.1.3] - 2025-04-30
60
+
61
+ ### Changed
62
+
63
+ * Action renamed to "Export" in actions submenu
64
+
65
+ ### Added
66
+
67
+ * BG Color projects will be exported as a png
68
+
69
+ ### Fixed
70
+
71
+ * Faster no_chara export in ExportPSDPreview
72
+
53
73
  ## [1.1.2] - 2025-04-25
54
74
 
55
75
  ### 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,66 @@ 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, name, format, path_format, source_revision):
104
+ mapped_name = "%s_%s" % (name, format)
105
+
106
+ file = None
107
+
108
+ if not self._files.has_mapped_name(mapped_name):
109
+ if format:
110
+ file = self._files.add_file(
111
+ name=name,
112
+ extension=format,
113
+ tracked=True,
114
+ default_path_format=path_format,
115
+ )
116
+ else:
117
+ file = self._files.add_folder(name, tracked=True)
118
+ else:
119
+ file = self._files[mapped_name]
120
+
121
+ revision_name = self.revision.get()
122
+
123
+ if not file.has_revision(revision_name):
124
+ r = file.add_revision(revision_name)
125
+ file.set_current_user_on_revision(revision_name)
126
+ else:
127
+ r = file.get_revision(revision_name)
128
+
129
+ r.comment.set(source_revision.comment.get())
130
+
131
+ file.ensure_last_revision_oid()
132
+
133
+ r.set_sync_status("Available")
134
+
135
+ img_path = r.get_path().replace("\\", "/")
136
+
137
+ if not os.path.exists(img_path):
138
+ os.makedirs(os.path.dirname(img_path), exist_ok=True)
139
+ else:
140
+ os.remove(img_path)
141
+
142
+ self._files.touch()
143
+
144
+ return r
77
145
 
78
146
  def run(self, button):
79
147
  if button == "Cancel":
@@ -91,55 +159,100 @@ class ExportPSDLayers(flow.Action):
91
159
 
92
160
  # Get revisions
93
161
  source_revision = self._file.get_revision(self.revision.get())
94
- render_revision = self.ensure_render_folder_revision()
95
162
 
96
163
  # Open photoshop file
97
164
  psb = PSDImage.open(source_revision.get_path())
98
165
 
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
166
 
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
- )
167
+ ############# BG LAYOUT PROCESS #############
123
168
 
124
- session.log_info(log_format.format(message=f'Exporting layer {layer_name}'))
169
+ if self._task.name() == "bg_layout" :
125
170
 
126
- image = layer.composite(viewport=psb.bbox)
127
- image.save(output_path)
171
+ render_revision = self.ensure_render_folder_revision()
172
+ # JSON structure for layers order
173
+ layers_data = {
174
+ "from": os.path.basename(source_revision.get_path()),
175
+ "layers": [],
176
+ "hidden_layers": []
177
+ }
128
178
 
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)
179
+ # Export image layers
180
+ if os.path.exists(render_revision.get_path()) is False:
181
+ os.makedirs(render_revision.get_path())
182
+
183
+ folder_name = os.path.basename(render_revision.get_path())
184
+
185
+ for layer in reversed(psb):
186
+ # Remove invalid characters
187
+ layer_name = layer.name
188
+ match_invalid = re.search(r"[~\"#%&*:<>?/\\{|}]+", layer.name)
189
+ if match_invalid:
190
+ layer_name = layer_name.replace(match_invalid.group(0), '')
191
+
192
+ output_path = os.path.join(
193
+ render_revision.get_path(),
194
+ "{folder}-{layer}.png".format(folder=folder_name, layer=layer_name),
195
+ )
196
+
197
+ session.log_info(log_format.format(message=f'Exporting layer {layer_name}'))
198
+
199
+ image = layer.composite(viewport=psb.bbox)
200
+ image.save(output_path)
201
+
202
+ # Push layer in correct JSON data
203
+ layers_data["layers" if layer.visible else "hidden_layers"].append(
204
+ layer_name
205
+ )
206
+
207
+ # Export JSON data
208
+ json_object = json.dumps(layers_data)
209
+ json_path = os.path.join(render_revision.get_path(), "layers.json")
210
+
211
+ session.log_info(log_format.format(message='Saving layers.json'))
212
+ with open(json_path, "w") as outfile:
213
+ outfile.write(json_object)
214
+
215
+ session.log_info(log_format.format(message='Export complete'))
141
216
 
142
- session.log_info(log_format.format(message='Export complete'))
217
+ ############# BG COLOR PROCESS #############
218
+
219
+ if self._task.name() == "bg_color" :
220
+
221
+ default_file = self.get_default_file()
222
+
223
+ if default_file is not None:
224
+
225
+ render_revision = self._ensure_file(
226
+ name="bg_color",
227
+ format="png",
228
+ path_format=default_file.path_format.get(),
229
+ source_revision=source_revision
230
+ )
231
+
232
+ output_path = render_revision.get_path()
233
+
234
+ info_layer = psb.find("INFO")
235
+ if info_layer : info_layer.visible = False
236
+
237
+ LO_layer = psb.find("REF_LAYOUT")
238
+ if LO_layer : LO_layer.visible = False
239
+
240
+ DES_layer = psb.find("REF_DESIGN")
241
+ if DES_layer : DES_layer.visible = False
242
+
243
+ chara_layer = psb.find("character")
244
+ if chara_layer : chara_layer.visible = False
245
+
246
+ utils_layer = psb.find("_utils")
247
+ if utils_layer : utils_layer.visible = False
248
+
249
+ image = psb.composite(force=True)
250
+ image.save(output_path)
251
+
252
+ session.log_info(log_format.format(message='Export complete'))
253
+
254
+ else:
255
+ self.root().session().log_error("[Export PSD] BG Color Image default file do not exist")
143
256
 
144
257
  return self.get_result(close=True)
145
258
 
@@ -382,12 +495,22 @@ class ExportPSDPreview(flow.Action):
382
495
 
383
496
  output_path = f"{os.path.splitext(file_path)[0]}_no_chara.png"
384
497
 
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
- )
498
+ info_layer = psb.find("INFO")
499
+ if info_layer : info_layer.visible = False
500
+
501
+ LO_layer = psb.find("REF_LAYOUT")
502
+ if LO_layer : LO_layer.visible = False
503
+
504
+ DES_layer = psb.find("REF_DESIGN")
505
+ if DES_layer : DES_layer.visible = False
506
+
507
+ chara_layer = psb.find("character")
508
+ if chara_layer : chara_layer.visible = False
509
+
510
+ utils_layer = psb.find("_utils")
511
+ if utils_layer : utils_layer.visible = False
512
+
513
+ image = psb.composite(force=True)
391
514
 
392
515
  image.save(output_path)
393
516
 
@@ -577,6 +700,7 @@ def export_psd_layers(parent):
577
700
  if isinstance(parent, TrackedFile):
578
701
  r = flow.Child(ExportPSDLayers)
579
702
  r.name = "export_layers"
703
+ r.ui(label="Export")
580
704
  r.index = 50
581
705
  return r
582
706
 
@@ -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-05-09T17:15:06+0200",
12
12
  "dirty": false,
13
13
  "error": null,
14
- "full-revisionid": "1ec678249c80d17d3ebf3b7fc8bd986c62201092",
15
- "version": "1.1.2"
14
+ "full-revisionid": "23f431f22442d9b3740d494451f0bf983da044ab",
15
+ "version": "1.1.4"
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.4
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.4] - 2025-05-09
54
+
55
+ ### Fixed
56
+
57
+ * The exported image will now have the correct filename
58
+
59
+ ## [1.1.3] - 2025-04-30
60
+
61
+ ### Changed
62
+
63
+ * Action renamed to "Export" in actions submenu
64
+
65
+ ### Added
66
+
67
+ * BG Color projects will be exported as a png
68
+
69
+ ### Fixed
70
+
71
+ * Faster no_chara export in ExportPSDPreview
72
+
53
73
  ## [1.1.2] - 2025-04-25
54
74
 
55
75
  ### Fixed