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.
- {libreflow_extensions_sk_export_psd_layers-1.1.2 → libreflow_extensions_sk_export_psd_layers-1.1.4}/CHANGELOG.md +20 -0
- {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
- {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
- {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
- {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
- {libreflow_extensions_sk_export_psd_layers-1.1.2 → libreflow_extensions_sk_export_psd_layers-1.1.4}/MANIFEST.in +0 -0
- {libreflow_extensions_sk_export_psd_layers-1.1.2 → libreflow_extensions_sk_export_psd_layers-1.1.4}/README.md +0 -0
- {libreflow_extensions_sk_export_psd_layers-1.1.2 → libreflow_extensions_sk_export_psd_layers-1.1.4}/setup.cfg +0 -0
- {libreflow_extensions_sk_export_psd_layers-1.1.2 → libreflow_extensions_sk_export_psd_layers-1.1.4}/setup.py +0 -0
- {libreflow_extensions_sk_export_psd_layers-1.1.2 → libreflow_extensions_sk_export_psd_layers-1.1.4}/src/libreflow/__init__.py +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {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.
|
|
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
|
-
|
|
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
|
-
|
|
169
|
+
if self._task.name() == "bg_layout" :
|
|
125
170
|
|
|
126
|
-
|
|
127
|
-
|
|
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
|
-
#
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
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
|
-
|
|
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
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
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-
|
|
11
|
+
"date": "2025-05-09T17:15:06+0200",
|
|
12
12
|
"dirty": false,
|
|
13
13
|
"error": null,
|
|
14
|
-
"full-revisionid": "
|
|
15
|
-
"version": "1.1.
|
|
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.
|
|
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
|
|
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
|