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.
- {libreflow_extensions_sk_export_psd_layers-1.1.1 → libreflow_extensions_sk_export_psd_layers-1.1.3}/CHANGELOG.md +20 -0
- {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
- {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
- {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
- {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
- {libreflow_extensions_sk_export_psd_layers-1.1.1 → libreflow_extensions_sk_export_psd_layers-1.1.3}/MANIFEST.in +0 -0
- {libreflow_extensions_sk_export_psd_layers-1.1.1 → libreflow_extensions_sk_export_psd_layers-1.1.3}/README.md +0 -0
- {libreflow_extensions_sk_export_psd_layers-1.1.1 → libreflow_extensions_sk_export_psd_layers-1.1.3}/setup.cfg +0 -0
- {libreflow_extensions_sk_export_psd_layers-1.1.1 → libreflow_extensions_sk_export_psd_layers-1.1.3}/setup.py +0 -0
- {libreflow_extensions_sk_export_psd_layers-1.1.1 → libreflow_extensions_sk_export_psd_layers-1.1.3}/src/libreflow/__init__.py +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {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.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
120
|
-
|
|
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
|
-
|
|
123
|
-
|
|
124
|
-
layer.name
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
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
|
-
|
|
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
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
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-
|
|
11
|
+
"date": "2025-04-30T12:49:37+0200",
|
|
12
12
|
"dirty": false,
|
|
13
13
|
"error": null,
|
|
14
|
-
"full-revisionid": "
|
|
15
|
-
"version": "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.
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|