Example #1
0
 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)
Example #2
0
 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)
Example #4
0
 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)
Example #6
0
 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)
Example #8
0
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
Example #9
0
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
Example #10
0
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
Example #11
0
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
Example #12
0
 def get_nodes_to_validate(self):
     return skinutils.get_skinned_meshes_from_scene()