import struct import os import logging import asset_reader import cStringIO import maya.api.OpenMaya as OpenMaya import maya.cmds as mc import maya.mel as mm import xml.etree.ElementTree as ET from zipfile import ZipFile logger = logging.getLogger(__name__) logger.setLevel(logging.DEBUG) class LXFLoader(object): def __init__(self): self.material_index = {} def get_material(self): self.material_index = {} material_data = asset_reader.asset_extract(material_only=True) if not material_data: logger.warning('Can\'t extract material info') return False root = ET.fromstring(material_data) gMainProgressBar = mm.eval('$tmp = $gMainProgressBar') mc.progressBar(gMainProgressBar, edit=True, beginProgress=True, isInterruptable=True, status='Reading LDD materials ...', maxValue=len(root)) logger.info('Get material data ...') for materail in root: if mc.progressBar(gMainProgressBar, query=True, isCancelled=True): mc.progressBar(gMainProgressBar, edit=True, endProgress=True) return False mat_id = materail.get('MatID') mat_r = materail.get('Red') mat_g = materail.get('Green') mat_b = materail.get('Blue') mat_a = materail.get('Alpha') if mat_id not in self.material_index.keys(): self.material_index[mat_id] = {'r': int(mat_r), 'g': int(mat_g), 'b': int(mat_b), 'a': int(mat_a)} mc.progressBar(gMainProgressBar, edit=True, step=1) mc.progressBar(gMainProgressBar, edit=True, endProgress=True) return True @staticmethod def get_lxfml_name(zipf): name_list = zipf.namelist() for name in name_list: if os.path.splitext(name)[-1] in ['.LXFML']: return name return '' @staticmethod def get_geometry(design_id, part_data_map, output=None, debug=True): def convert_to_obj(v_list, n_list, f_ids, output_file): with open(output_file, 'w') as f: f.write("# OBJ file\n") for vid in range(0, len(v_list), 3): f.write('v %s %s %s\n' % (v_list[vid], v_list[vid + 1], v_list[vid + 2])) f.write('\n') for nid in range(0, len(n_list), 3): f.write('vn %s %s %s\n' % (n_list[nid], n_list[nid + 1], n_list[nid + 2])) f.write('\n') for fid in range(0, len(f_ids), 3): f.write('f %s %s %s\n' % (f_ids[fid] + 1, f_ids[fid + 1] + 1, f_ids[fid + 2] + 1)) if design_id not in part_data_map.keys(): return False, [], [], [] vertex = [] normal = [] index = [] g_buffer = part_data_map[design_id] f = cStringIO.StringIO(g_buffer) # Read header part struct.unpack('