1
+ #python janeApe.py
2
+ #Created by Conor Holds | twitter.com/ConorHolds
3
+
4
+ #### NOTES ABOUT THIS SCRIPT ####
5
+ #Requires a PSD file containing all possible variants of the art you want to generate.
6
+ # All layers in the PSD file should be hidden before running this script.
7
+
8
+
9
+ #### PACKAGE IMPORTS ####
10
+ from psd_tools import PSDImage
11
+ import random
12
+ import csv
13
+ import os
14
+ import time
15
+ import json
16
+ import sys , getopt
17
+
18
+ from psd_tools .psd .image_resources import LayerGroupEnabledIDs
19
+ ####~~~ END OF PACKAGE IMPORTS ~~~####
20
+
21
+
22
+ #### GENERATIVE ART FUNCTIONS ####
23
+
24
+ def showLayers (psd , layer , sub_layer = None ):
25
+ print ("Setting layer to visible - " + str (layer ), str (sub_layer ))
26
+
27
+ group_layer = next (filter (lambda x : x .name == layer , psd ))
28
+ if group_layer .is_group ():
29
+ if sub_layer :
30
+ group_child_layer = next (filter (lambda x : x .name == sub_layer , group_layer ))
31
+ group_child_layer .visible = True
32
+ else :
33
+ for layer in group_layer :
34
+ layer .visible = True
35
+ group_layer .visible = True
36
+
37
+ return psd
38
+
39
+
40
+ def hideLayers (psd ,layer , sub_layer = None ):
41
+ group_layer = next (filter (lambda x : x .name == layer , psd ))
42
+
43
+ if group_layer .is_group ():
44
+ if sub_layer :
45
+ group_child_layer = next (filter (lambda x : x .name == sub_layer , group_layer ))
46
+ group_child_layer .visible = False
47
+ else :
48
+ for layer in group_layer :
49
+ layer .visible = False
50
+ group_layer .visible = False
51
+
52
+ print ("Setting layer to visible - " + str (layer ), str (sub_layer ))
53
+ return psd
54
+
55
+
56
+ def saveImage (psd , individualImageNumber , outputFolder ):
57
+ image = psd .compose (force = True )
58
+ nameForImage = str (individualImageNumber ) + ".png"
59
+ pathForImage = os .path .join (outputFolder , nameForImage )
60
+ image .save (pathForImage )
61
+ return
62
+
63
+
64
+ ##The main image creation step##
65
+ def createImages (psd , traits_file , output_dir , effects_layer , offset ):
66
+ f = open (traits_file )
67
+
68
+ data = json .load (f )
69
+ individual_image_number = offset
70
+
71
+ for val in data [0 ].items ():
72
+ if val [0 ] != "id" :
73
+ psd = hideLayers (psd , val [0 ], None )
74
+
75
+ for data_set in data [offset :]:
76
+ print ("Starting to create image number: " + str (individual_image_number ))
77
+
78
+ for val in data_set .items ():
79
+ if val [0 ] != "id" and val [1 ] != "No Traits" :
80
+ psd = showLayers (psd , val [0 ], val [1 ])
81
+ if effects_layer :
82
+ psd = showLayers (psd , effects_layer , None )
83
+
84
+ saveImage (psd , individual_image_number , output_dir )
85
+
86
+ for val in data_set .items ():
87
+ if val [0 ] != "id" :
88
+ psd = hideLayers (psd , val [0 ], None )
89
+ if effects_layer :
90
+ psd = hideLayers (psd , effects_layer , None )
91
+
92
+ print ("Finished creating image number: " + str (individual_image_number ))
93
+ print ("-----------------------------------------------------" )
94
+ individual_image_number += 1
95
+
96
+ ####~~~ END OF GENERATIVE ART FUNCTIONS ~~~####
97
+
98
+
99
+ #### THE MAIN PROGRAM ####
100
+ def main (photoshop_file , output_dir , traits_file , effects_layer , offset ):
101
+ psd = PSDImage .open (photoshop_file )
102
+ if not os .path .exists (output_dir ):
103
+ os .makedirs (output_dir )
104
+ createImages (psd , traits_file , output_dir , effects_layer , offset )
105
+ return print ('Program Completed' )
106
+
107
+ ####~~~ END THE MAIN PROGRAM ~~~####
108
+
109
+
110
+ #### RUN THE PROGRAM ####
111
+ if __name__ == "__main__" :
112
+ argv = sys .argv [1 :]
113
+ photoshop_file = ''
114
+ output_dir = ''
115
+ traits_file = ''
116
+ offset = 0
117
+ effects_layer = None
118
+ if len (argv ) == 0 :
119
+ print ('psd_layer_generator.py -p <psd> -o <output directory> -t <traits json> -e <effects layer> -n <offset>' )
120
+ sys .exit (2 )
121
+ try :
122
+ opts , args = getopt .getopt (argv ,"hp:o:t:e:n:" )
123
+ except getopt .GetoptError :
124
+ print ('psd_layer_generator.py -p <psd> -o <output directory> -t <traits json> -e <effects layer> -n <offset>' )
125
+ sys .exit (2 )
126
+ for opt , arg in opts :
127
+ if opt == '-h' :
128
+ print ('psd_layer_generator.py -p <psd> -o <output directory> -t <traits json> -e <effects layer> -n <offset>' )
129
+ sys .exit ()
130
+ elif opt in ("-p" ):
131
+ photoshop_file = arg
132
+ elif opt in ("-o" ):
133
+ output_dir = arg
134
+ elif opt in ("-t" ):
135
+ traits_file = arg
136
+ elif opt in ("-e" ):
137
+ effects_layer = arg
138
+ elif opt in ("-n" ):
139
+ offset = int (arg )
140
+ main (photoshop_file , output_dir , traits_file , effects_layer , offset )
0 commit comments