forked from symek/hafarm
/
JsonRigObject.py
239 lines (185 loc) · 7.68 KB
/
JsonRigObject.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
import os
import json
class _JsonRigObject100(object):
def __init__(self, jsonfilepath):
self._latest = {}
self._extensions = []
self.force = False
with open(jsonfilepath) as json_file:
parms = json.load(json_file)
self._latest = parms['latest']
for ext in self._latest:
json_filepath = self._latest[ext]
if not os.path.exists(json_filepath):
print "[ HA ERROR ] Path '%s' not found. Skipped..." % json_filepath
continue
self._extensions += [ext]
with open(json_filepath) as json_file:
self._latest[ext] = json.load(json_file)
@staticmethod
def create(maya_scene_path):
path, _ = os.path.split(maya_scene_path)
jsrig = _JsonRigObject100(path + os.sep + 'rig.json')
return jsrig
def extension(self, short_name):
for ext in self._latest:
for set_obj in self._latest[ext]['export_sets']:
if set_obj['short_name'] == short_name:
return ext
return None
def export_sets(self, extension):
if extension in self._latest:
return dict( (x['short_name'], x['long_name']) for x in self._latest[extension]['export_sets'] )
else:
# TODO:
keys = self._latest.keys()
if keys == []:
raise Exception('[ HA ERROR ] No extensions in ')
print '[ HA WARNING ] No "%s" extension. Use "%s" ' % (extension, keys[0])
self.force = True
return dict( (x['short_name'], x['long_name']) for x in self._latest[keys[0]]['export_sets'] )
def all_export_sets(self):
ret = {}
for ext in self._extensions:
ret.update( self.export_sets(ext) )
return ret
def __str__(self):
return "JsonRigObject:: %s" % self._latest
class _JsonRigObject110(object):
_resolution_priorities = {0:'low', 1:'mid', 2: 'high'}
def __init__(self, jsonfilepath):
self._latest = {}
self._variants = {}
self._versions = {}
self._resolutions = []
self._asset_name = ''
self._top_resolution = -100
self.force = False
self._paths = {}
self._collection = {}
with open(jsonfilepath) as json_file:
parms = json.load(json_file)
self._latest = parms['latest']
self._asset_name = parms['job_asset_name']
_res = dict( (y,x) for x,y in self._resolution_priorities.iteritems() )
for var in self._latest:
_resolutions = {}
_versions = {}
for ver in self._latest[var]:
for res in self._latest[var][ver]:
if self._top_resolution < _res[res]:
self._top_resolution = _res[res]
self._resolutions += [ res ]
json_filepath = self._latest[var][ver][res]
if not os.path.exists(json_filepath):
print "[ HA ERROR ] Path '%s' not found. Skipped..." % json_filepath
continue
with open(json_filepath) as json_file:
_resolutions[res] = json.load(json_file)
self._paths[res] = _resolutions[res]['path']
_versions[ver] = _resolutions
self._variants[var] = _versions
@classmethod
def resolution_priorities(cls):
return cls._resolution_priorities
def asset_name(self):
return self._asset_name
@staticmethod
def create(maya_scene_path):
name = str(maya_scene_path).rsplit(os.sep,3)[-3]
path, _ = os.path.split(maya_scene_path)
jsrig = _JsonRigObject110(path + os.sep + name + '.json')
return jsrig
def path(self, short_name):
res = self.resolution(short_name)
# TODO: if short_name from another asset ? It is happens when reference_hires.py converts path
return self._paths.get(res,"")
def variant(self, short_name):
for var in self._variants:
for ver in self._latest[var]:
for res in self._variants[var][ver]:
for set_obj in self._variants[var][ver][res]['export_sets']:
if set_obj['short_name'] == short_name:
return var
return None
def top_resolution(self, short_name):
ret = self.resolution(short_name)
if ret == None:
ret = self._resolution_priorities[self._top_resolution]
return ret
def resolution(self, short_name):
for var in self._variants:
for ver in self._latest[var]:
for res in self._variants[var][ver]:
for set_obj in self._variants[var][ver][res]['export_sets']:
if set_obj['short_name'] == short_name:
return res
return None #self._resolution_priorities[self._top_resolution]
def export_sets(self, resolution):
if resolution in self._resolutions:
ret = {}
for var in self._variants:
for ver in self._latest[var]:
for res in self._variants[var][ver]:
if res == resolution:
ret.update( dict( (x['short_name'], x['long_name']) for x in self._variants[var][ver][res]['export_sets'] ) )
return ret
else:
# TODO:
res = self._resolution_priorities[self._top_resolution]
print '[ HA WARNING ] No "%s" resolution. Use "%s" ' % (resolution, res)
# TODO: refactor next line
self.force = True
return self.export_sets(res)
def all_export_sets(self):
ret = {}
for var in self._variants:
for ver in self._latest[var]:
for res in self._variants[var][ver]:
for set_obj in self._variants[var][ver][res]['export_sets']:
ret.update( self.export_sets(res) )
return ret
def all_export_sets2(self):
ret = {}
for var in self._variants:
for ver in self._latest[var]:
for res in self._variants[var][ver]:
for set_obj in self._variants[var][ver][res]['export_sets']:
ret.update( self.export_sets(res) )
return ret
def __iter__(self):
# For tests only, yet
for n,m in self._paths.iteritems():
yield n,m
def __str__(self):
return "JsonRigObject:: %s" % self._variants
class _JsonRigObjectDummy(object):
force = False
def extension(self, val):
return None
def export_sets(self, val):
return {}
def all_export_sets(self):
return {}
def path(self, val):
return ''
class JsonRigObjectFactory(type):
def __call__(cls, json_scene_path):
try:
return _JsonRigObject110(maya_scene_path)
except Exception, e:
print "[ HA WARNING ] Try to use 1.0.0", e
return _JsonRigObject100(maya_scene_path)
class JsonRigObject(object):
__metaclass__ = JsonRigObjectFactory
@staticmethod
def create(maya_scene_path):
try:
return _JsonRigObject110.create(maya_scene_path)
except Exception, e:
print "[ HA WARNING ] Try to use 1.0.0", e
try:
return _JsonRigObject100.create(maya_scene_path)
except Exception, e:
print "[ HA WARNING ] Skip", maya_scene_path, e
return _JsonRigObjectDummy()