def test_export_referenced_mesh(self): ref_cube, ref_joints, ref_skincluster = self.create_skinned_cube() ref_cube_name = ref_cube.nodeName() pm.skinPercent(ref_skincluster, ref_cube.vtx, transformValue=(ref_joints[2], 1.0)) with tempfile.TemporaryDirectory() as tempdir_name: # skin a cube and export it to a separate file ref_filename = os.path.join(tempdir_name, 'ref_test.ma') stuff = [ref_cube] + ref_joints pm.select(stuff, r=True) pm.exportSelected(ref_filename, type='mayaAscii', constructionHistory=True, force=True) # clean scene then reference in the file just exported self._clean_scene() file_reference = pm.createReference(ref_filename) ref_nodes = file_reference.nodes() ref_cube = [ r for r in ref_nodes if r.nodeName().endswith(ref_cube_name) ][0] # export the skin weights dest_filename = os.path.join(tempdir_name, 'test_weights.ma') skinio.export_skinned_mesh(ref_cube, dest_filename) # open the exported skin file pm.openFile(dest_filename, force=True) result_cube = skinutils.get_skinned_meshes_from_scene()[0] result_skincl = skinutils.get_skincluster(result_cube) result_joints = result_skincl.influenceObjects() result = skinutils.get_weighted_influences(result_cube.vtx[0]) expected = {result_joints[2]: 1.0} self.assertEqual(expected, result)
def test_exports_skinned_mesh_and_skeleton(self): test_cube, test_joints, test_skincluster = self.create_skinned_cube() with tempfile.TemporaryDirectory() as tempdir_name: dest_filename = os.path.join(tempdir_name, 'test_weights.ma') skinio.export_skinned_mesh(test_cube, dest_filename) pm.openFile(dest_filename, force=True) result_cube = skinutils.get_skinned_meshes_from_scene()[0] result_skincl = skinutils.get_skincluster(result_cube) result_joints = result_skincl.influenceObjects() self.assertEqual(len(test_joints), len(result_joints))
def test_multiple_mats_assigned_to_skinned_mesh(self): test_skinned_cube = self.create_cube() test_joints = [self.create_joint() for _ in range(5)] skincl = skinutils.bind_mesh_to_joints(test_skinned_cube, test_joints, maximumInfluences=5) mat1, _ = matutils.create_material('foo') mat2, _ = matutils.create_material('bar') matutils.assign_material(test_skinned_cube, mat1) matutils.assign_material(test_skinned_cube.f[0], mat2) skinned_meshes_from_scene = skinutils.get_skinned_meshes_from_scene() self.assertListEqual([test_skinned_cube], skinned_meshes_from_scene)
def test_does_not_export_extra_stuff(self): test_cube, test_joints, test_skincluster = self.create_skinned_cube() second_cube = self.create_cube() skinutils.bind_mesh_to_joints(second_cube, test_joints) sms = skinutils.get_skinned_meshes_from_scene() self.assertEqual(2, len(sms)) fake_rig_controller = self.create_transform_node() pm.parentConstraint(fake_rig_controller, test_joints[0]) with tempfile.TemporaryDirectory() as tempdir_name: dest_filename = os.path.join(tempdir_name, 'test_weights.ma') skinio.export_skinned_mesh(test_cube, dest_filename) pm.openFile(dest_filename, force=True) result_cube = skinutils.get_skinned_meshes_from_scene() self.assertEqual(1, len(result_cube)) default_trash = [x.getParent() for x in pm.ls(cameras=True)] default_trash.extend(pm.ls(type='joint')) stuff = [ x for x in pm.ls(type='transform') if x not in default_trash ] # [x for x in pm.ls(type='transform') if x not in pm.ls(defaultNodes=True, cameras=True)] self.assertEqual(1, len(stuff)) constraints = pm.ls(type='parentConstraint') self.assertEqual(0, len(constraints))
def test_get_skinned_meshes_from_scene(self): test_skinned_cubes = [self.create_cube() for x in range(3)] test_cube = self.create_cube() test_joints = [self.create_joint() for _ in range(5)] skinclusters = [] for each in test_skinned_cubes: skincl = skinutils.bind_mesh_to_joints(each, test_joints, maximumInfluences=5) skinclusters.append(skincl) skinned_meshes_from_scene = skinutils.get_skinned_meshes_from_scene() skinned_meshes_from_scene.sort() test_skinned_cubes.sort() self.assertListEqual(test_skinned_cubes, skinned_meshes_from_scene)
def _source_line_edit(self): text = self.ui.source_mesh_lineEdit.text() skinned_meshes = skinutils.get_skinned_meshes_from_scene() names = [x.nodeName() for x in skinned_meshes] node = None for mesh, name in zip(skinned_meshes, names): if text.lower() == name.lower(): node = mesh break if not node and text != '': for mesh, name in zip(skinned_meshes, names): if text.lower() in name.lower(): node = mesh break self.source_mesh = node self._do_source_line_edit_background_color() self._refresh_arrow_color()
def test_skinned_curve_in_scene(self): """ Should only return skinned meshes in the scene. Not skinned curves. """ test_skinned_cubes = [self.create_cube() for x in range(3)] test_curve = self.pm.curve(p=[(0, 0, 0), (3, 5, 6), (5, 6, 7), (9, 9, 9)]) test_joints = [self.create_joint() for _ in range(5)] curve_skincl = skinutils.bind_mesh_to_joints(test_curve, test_joints) skinclusters = [] for each in test_skinned_cubes: skincl = skinutils.bind_mesh_to_joints(each, test_joints, maximumInfluences=5) skinclusters.append(skincl) skinned_meshes_from_scene = skinutils.get_skinned_meshes_from_scene() skinned_meshes_from_scene.sort() test_skinned_cubes.sort() self.assertListEqual(test_skinned_cubes, skinned_meshes_from_scene)
def get_joint_counts_from_scene(skinned_meshes=None, progress_bar=None): skinned_meshes = skinned_meshes or skinutils.get_skinned_meshes_from_scene( ) if progress_bar: progress_bar.reset() progress_bar.set_maximum(len(skinned_meshes)) meshes_with_too_many_joints = {} for skinned_mesh in skinned_meshes: if progress_bar: progress_bar.update_label('Validating: {0}'.format( skinned_mesh.name())) skincl = skinutils.get_skincluster(skinned_mesh) skinned_influences = pm.skinCluster(skincl, weightedInfluence=True, q=True) if len(skinned_influences) > 64: meshes_with_too_many_joints[skinned_mesh] = skinned_influences if progress_bar: progress_bar.update_iterate_value() return meshes_with_too_many_joints
def get_non_normalized_verts_from_scene(skinned_meshes=None, progress_bar=None): skinned_meshes = skinned_meshes or skinutils.get_skinned_meshes_from_scene( ) if progress_bar: progress_bar.reset() chunks = [len(x.vtx) for x in skinned_meshes] progress_bar.set_chunks(chunks) non_normalized_verts = {} for skinned_mesh in skinned_meshes: if progress_bar: progress_bar.update_label_and_iter_chunk('Validating: {0}'.format( skinned_mesh.name())) skin_cluster = skinutils.get_skincluster(skinned_mesh) bad_vert_indexes_to_weight = skinutils.get_non_normalized_vert_indexes( skinned_mesh.vtx, skin_cluster) bad_verts = [skinned_mesh.vtx[i] for i in bad_vert_indexes_to_weight] if bad_verts: non_normalized_verts[skinned_mesh] = bad_vert_indexes_to_weight return non_normalized_verts
def get_extra_skeleton_roots_from_scene(skinned_meshes=None, progress_bar=None): skinned_meshes = skinned_meshes or skinutils.get_skinned_meshes_from_scene( ) if progress_bar: progress_bar.reset() progress_bar.set_maximum(len(skinned_meshes)) extra_skel_roots = {} for skinned_mesh in skinned_meshes: if progress_bar: progress_bar.update_label('Validating: {0}'.format( skinned_mesh.name())) root_joint = skinutils.get_root_joint_from_skinned_mesh(skinned_mesh) extra_roots = xformutils.get_extra_root_joints_from_root_joint( root_joint) if extra_roots: extra_skel_roots[skinned_mesh] = extra_roots if progress_bar: progress_bar.update_iterate_value() return extra_skel_roots
def get_exceeding_verts_from_scene(skinned_meshes=None, progress_bar=None): """Checks skinned_meshes for verts with more than four influences. If the caller does not provide skinned_meshes all skinned meshes detected in the Maya scene will be checked. """ skinned_meshes = skinned_meshes or skinutils.get_skinned_meshes_from_scene( ) exceeding_verts = {} if progress_bar: progress_bar.reset() chunks = [len(skm.vtx) for skm in skinned_meshes] progress_bar.set_chunks(chunks) for skinned_mesh in skinned_meshes: if progress_bar: progress_bar.update_label_and_iter_chunk('Validating: {0}'.format( skinned_mesh.name())) exceeding_verts_dict = skinutils.get_vert_indexes_with_exceeding_influences( skinned_mesh) if exceeding_verts_dict: exceeding_verts[skinned_mesh] = exceeding_verts_dict return exceeding_verts
def get_nodes_to_validate(self): return skinutils.get_skinned_meshes_from_scene()