def on_loadWeightsButton_clicked(self): for mesh in selected(): sc = mel.findRelatedSkinCluster(mesh) if not sc: continue sc = ls(sc)[0] doc = ElementTree(file=path + mesh.nodeName().replace('|', '').replace(':', '.') + '.xml') influences = [inf.attrib['name'] for inf in doc.findall('//Influence')] for i, vtx in enumerate(doc.findall('//Vertex')): weights = [(influences[int(w.attrib['influence'])], float(w.attrib['value'])) for w in vtx.findall('Weight')] skinPercent(sc, '%s.vtx[%d]' % (mesh, i), transformValue=weights)
def on_loadWeightsButton_clicked(self): for mesh in selected(): sc = mel.findRelatedSkinCluster(mesh) if not sc: continue sc = ls(sc)[0] doc = ElementTree( file=path + mesh.nodeName().replace('|', '').replace(':', '.') + '.xml') influences = [ inf.attrib['name'] for inf in doc.findall('//Influence') ] for i, vtx in enumerate(doc.findall('//Vertex')): weights = [(influences[int(w.attrib['influence'])], float(w.attrib['value'])) for w in vtx.findall('Weight')] skinPercent(sc, '%s.vtx[%d]' % (mesh, i), transformValue=weights)
def export_skin_weights(self): format, ext = str(self.format.text()), str(self.formatExt.text()) format = self.name_pat.sub( \ lambda m: '%(name)' + m.group(1)[1:], format) path = Path(self.path.text()) # Validate selection. sel = selected() if not sel: error('Selection is empty.') # Find the skin cluster. sc = mel.findRelatedSkinCluster(sel[0]) skin_cluster = None for s in sel: sc = mel.findRelatedSkinCluster(s) if sc: skin_cluster = ls(sc)[0] break if not skin_cluster: error('No skin cluster found.') for mesh in sel: mesh_element = Element('Mesh', name=mesh) xml_tree = ElementTree(mesh_element) sc = mel.findRelatedSkinCluster(mesh) if not sc: continue sc = ls(sc)[0] influences = sc.influenceObjects() inf_tag = SubElement(mesh_element, 'Influences') for i, inf in enumerate(influences): SubElement(inf_tag, 'Influence', index=str(i), name=inf) #joints = ls(ios, type='joint') #if len(joints) < len(ios): # error('Remove non-joint influences before exporting to Massive.') # TODO: progress bar name = format % dict(name=mesh.name().replace('|', '') \ .replace(':', '.')) + ext with open(path / name, 'w') as f: #f.write(os.linesep + '# influences') #for i, inf in enumerate(ios): # if inf in influences: # inf_index = influences.index(j) # else: # influences += (inf,) # inf_index = len(influences) #f.write('%sdeformer %d %s' % (os.linesep, i, inf)) #f.write(os.linesep) vertices = SubElement(mesh_element, 'Vertices') #f.write(os.linesep + '# weights') for i, vtx in enumerate(mesh.vtx): vertex = SubElement(vertices, 'Vertex', pos=str(vtx.getPosition())) #f.write('%s%d: ' % (os.linesep, vi)) for ii, inf in enumerate(influences): weight_val = skinPercent(sc, '%s.vtx[%d]' % (mesh, i), transform=inf, query=True) if weight_val: SubElement(vertex, 'Weight', influence=str(ii), value=str(weight_val)) #f.write(' %d %f' % (ii, weight_val)) #f.write(os.linesep + ':') rough_string = tostring(xml_tree.getroot(), 'utf-8') reparsed = minidom.parseString(rough_string) f.write(reparsed.toprettyxml(indent='\t'))