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.
- {libreflow_extensions_sk_export_psd_layers-1.1.2 → libreflow_extensions_sk_export_psd_layers-1.1.3}/CHANGELOG.md +14 -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.3}/PKG-INFO +15 -1
- {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
- {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
- {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
- {libreflow_extensions_sk_export_psd_layers-1.1.2 → libreflow_extensions_sk_export_psd_layers-1.1.3}/MANIFEST.in +0 -0
- {libreflow_extensions_sk_export_psd_layers-1.1.2 → libreflow_extensions_sk_export_psd_layers-1.1.3}/README.md +0 -0
- {libreflow_extensions_sk_export_psd_layers-1.1.2 → libreflow_extensions_sk_export_psd_layers-1.1.3}/setup.cfg +0 -0
- {libreflow_extensions_sk_export_psd_layers-1.1.2 → libreflow_extensions_sk_export_psd_layers-1.1.3}/setup.py +0 -0
- {libreflow_extensions_sk_export_psd_layers-1.1.2 → libreflow_extensions_sk_export_psd_layers-1.1.3}/src/libreflow/__init__.py +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {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.
|
|
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
|
-
|
|
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
|
-
|
|
170
|
+
if self._task.name() == "bg_layout" :
|
|
125
171
|
|
|
126
|
-
|
|
127
|
-
|
|
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
|
-
#
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
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
|
-
|
|
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
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
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-
|
|
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,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
|
|
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
|