import unittest import maya.cmds as cmds import artv2.components.base_components.rig_asset as rig_asset import artv2.components.root as root import artv2.components.biped_leg as leg import os import tempfile def format_position(pos): return [float("{0:.3f}".format(pos[0])), float("{0:.3f}".format(pos[1])), float("{0:.3f}".format(pos[2]))] class Leg_Component_Tests(unittest.TestCase): """ Class containing tests for leg module creation and manipulation. """ def _create_asset(self): new_asset = rig_asset.RigAsset() self.assertEquals(new_asset.name, "asset") self.assertEquals(new_asset.network_node, "asset_metadata") return new_asset def _create_leg_inst(self, prefix): root.Root() leg_inst = leg.BipedLeg(prefix=prefix) leg_inst.parent = "root" return leg_inst def test_create_leg(self): self._create_asset() l_leg_inst = self._create_leg_inst("l") l_leg_inst.num_calf_twists = 2 self.assertEquals(len(l_leg_inst.joint_mover.get_created_joints()), 7) l_leg_inst.num_thigh_twists = 2 self.assertEquals(len(l_leg_inst.joint_mover.get_created_joints()), 9) l_leg_inst.has_ball_joint = False self.assertEquals(len(l_leg_inst.joint_mover.get_created_joints()), 7) l_leg_inst.has_ball_joint = True self.assertEquals(len(l_leg_inst.joint_mover.get_created_joints()), 9) def test_invalid_property_value(self): self._create_asset() root.Root() l_leg_inst = leg.BipedLeg(prefix="l") with self.assertRaises(RuntimeError): l_leg_inst.num_calf_twists = 5.5 with self.assertRaises(RuntimeError): l_leg_inst.has_ball_joint = 0 with self.assertRaises(RuntimeError): l_leg_inst.num_thigh_twists = 4 with self.assertRaises(RuntimeError): l_leg_inst.num_thigh_twists = "test" with self.assertRaises(RuntimeError): l_leg_inst.num_thigh_twists = "2.5" def test_copy_paste_settings(self): self._create_asset() root.Root() l_leg_inst = leg.BipedLeg(prefix="l") r_leg_inst = leg.BipedLeg(prefix="r", side="right") l_leg_inst.num_calf_twists = 2 l_leg_inst.num_thigh_twists = 2 l_leg_inst.copy_settings() self.assertEquals(r_leg_inst.num_thigh_twists, 0) self.assertEquals(r_leg_inst.num_calf_twists, 0) self.assertTrue(os.path.exists(os.path.join(tempfile.gettempdir(), "artv2Settings.txt"))) r_leg_inst.paste_settings() self.assertEquals(r_leg_inst.num_thigh_twists, 2) self.assertEquals(r_leg_inst.num_calf_twists, 2) def test_reset_settings(self): self._create_asset() root.Root() l_leg_inst = leg.BipedLeg(prefix="l") self.assertEquals(len(l_leg_inst.joint_mover.get_created_joints()), 5) l_leg_inst.num_calf_twists = 2 l_leg_inst.num_thigh_twists = 2 l_leg_inst.has_ball_joint = False self.assertEquals(len(l_leg_inst.joint_mover.get_created_joints()), 7) l_leg_inst.reset_settings() self.assertEquals(len(l_leg_inst.joint_mover.get_created_joints()), 5) self.assertEquals(l_leg_inst.num_calf_twists, 0) self.assertEquals(l_leg_inst.num_thigh_twists, 0) self.assertEquals(l_leg_inst.has_ball_joint, True) def test_delete_module(self): self._create_asset() root.Root() l_leg_inst = leg.BipedLeg(prefix="l") r_leg_inst = leg.BipedLeg(prefix="r", side="right") l_leg_inst.parent = "root" r_leg_inst.parent = "l_thigh" component_containers = l_leg_inst.joint_mover.get_containers() guide_nodes = component_containers[1].getNodeList() utility_nodes = component_containers[2].getNodeList() l_leg_inst.delete() self.assertFalse(cmds.objExists("l_leg_metadata")) for each in guide_nodes: self.assertFalse(cmds.objExists(each.nodeName())) for each in utility_nodes: self.assertFalse(cmds.objExists(each.nodeName())) self.assertEquals(r_leg_inst.parent, "root") def test_bake_offsets(self): self._create_asset() root.Root() l_leg_inst = leg.BipedLeg(prefix="l") l_leg_inst.joint_mover.aim_helper.toggle_aim_mode() cmds.setAttr("l_leg_calf_mover_offset.translateY", -30) pre_offset_position = format_position(cmds.xform("l_leg_calf_mover_offset", q=True, ws=True, t=True)) pre_main_position = format_position(cmds.xform("l_leg_calf_mover", q=True, ws=True, t=True)) pre_foot_position = format_position(cmds.xform("l_leg_foot_mover", q=True, ws=True, t=True)) self.assertNotEquals(pre_main_position, pre_offset_position) l_leg_inst.joint_mover.bake_offsets() post_offset_position = format_position(cmds.xform("l_leg_calf_mover_offset", q=True, ws=True, t=True)) post_main_position = format_position(cmds.xform("l_leg_calf_mover", q=True, ws=True, t=True)) post_foot_position = format_position(cmds.xform("l_leg_foot_mover", q=True, ws=True, t=True)) self.assertEquals(post_main_position, post_offset_position) self.assertEquals(pre_foot_position, post_foot_position) def test_pin_component(self): self._create_asset() root.Root() l_leg_inst = leg.BipedLeg(prefix="l") l_leg_inst.parent = "root" pre_leg_position = format_position(cmds.xform("l_leg_thigh_mover", q=True, ws=True, t=True)) l_leg_inst.joint_mover.toggle_pin_component() self.assertTrue(l_leg_inst.network_node.pinned.get()) cmds.setAttr("master_root_mover.translateX", 100) post_leg_position = format_position(cmds.xform("l_leg_thigh_mover", q=True, ws=True, t=True)) self.assertEquals(pre_leg_position, post_leg_position) l_leg_inst.joint_mover.toggle_pin_component() cmds.setAttr("master_root_mover.translateX", 0) new_leg_position = format_position(cmds.xform("l_leg_thigh_mover", q=True, ws=True, t=True)) self.assertNotEquals(post_leg_position, new_leg_position) def test_aim_mode(self): self._create_asset() root.Root() l_leg_inst = leg.BipedLeg(prefix="l") l_leg_inst.joint_mover.aim_helper.toggle_aim_mode() self.assertEquals(l_leg_inst.network_node.isAiming.get(), True) self.assertNotEquals(len(l_leg_inst.network_node.aimModeConstraints.connections()), 0) # move the knee out and then test if the thigh offset orientations have changed. original_orientation = cmds.xform("l_leg_thigh_mover_offset", q=True, ws=True, ro=True) cmds.setAttr("l_leg_calf_mover_offset.translateY", -30) new_orientation = cmds.xform("l_leg_thigh_mover_offset", q=True, ws=True, ro=True) self.assertNotEquals(original_orientation, new_orientation) # turn off aim mode and double check attrs once again l_leg_inst.joint_mover.aim_helper.toggle_aim_mode() self.assertEquals(l_leg_inst.network_node.isAiming.get(), False) self.assertEquals(len(l_leg_inst.network_node.aimModeConstraints.connections()), 0) # move the knee again and test if the thigh offset orientations did not change. original_orientation = cmds.xform("l_leg_thigh_mover_offset", q=True, ws=True, ro=True) cmds.setAttr("l_leg_calf_mover_offset.translateY", 0) new_orientation = cmds.xform("l_leg_thigh_mover_offset", q=True, ws=True, ro=True) self.assertEquals(original_orientation, new_orientation) def test_right_side(self): self._create_asset() root.Root() l_leg_inst = leg.BipedLeg(prefix="l") r_leg_inst = leg.BipedLeg(prefix="r", side="right") test_leg_inst = leg.BipedLeg(prefix="test") l_joints = sorted(l_leg_inst.joint_mover.get_driven_joints()) r_joints = sorted(r_leg_inst.joint_mover.get_driven_joints()) test_joints = sorted(test_leg_inst.joint_mover.get_driven_joints()) for i in range(len(l_joints)): l_joint = cmds.xform(l_joints[i].nodeName(), q=True, ws=True, ro=True) r_joint = cmds.xform(r_joints[i].nodeName(), q=True, ws=True, ro=True) test_joint = cmds.xform(test_joints[i].nodeName(), q=True, ws=True, ro=True) self.assertNotEquals(l_joint, r_joint) self.assertEquals(l_joint, test_joint) def test_duplicate(self): self._create_asset() root.Root() leg_inst = leg.BipedLeg(prefix="l", side="right") leg_inst.num_thigh_twists = 2 leg_inst.parent = "root" cmds.setAttr("l_leg_thigh_mover.translateZ", -65) cmds.setAttr("l_leg_thigh_mover.rotateX", -3) cmds.setAttr("l_leg_thigh_mover.rotateY", -8) cmds.setAttr("l_leg_thigh_mover.rotateZ", 42) cmds.setAttr("l_leg_thigh_mover.scaleX", .319) cmds.setAttr("l_leg_thigh_mover.scaleY", .319) cmds.setAttr("l_leg_thigh_mover.scaleZ", .319) cmds.setAttr("l_leg_calf_mover.rotateX", 1.5) cmds.setAttr("l_leg_calf_mover.rotateY", -27) cmds.setAttr("l_leg_calf_mover.rotateZ", -45) cmds.setAttr("master_root_mover.scaleX", 2.5) cmds.setAttr("master_root_mover.scaleY", 2.5) cmds.setAttr("master_root_mover.scaleZ", 2.5) cmds.setAttr("master_root_mover.translateZ", 60) duplicate_inst = leg_inst.duplicate() self.assertEquals(duplicate_inst.num_thigh_twists, 2) self.assertEquals(duplicate_inst.parent, "root") self.assertEquals(cmds.getAttr("l_leg_01_thigh_mover.tz"), cmds.getAttr("l_leg_thigh_mover.tz")) self.assertEquals(cmds.getAttr("l_leg_01_thigh_mover.rx"), cmds.getAttr("l_leg_thigh_mover.rx")) self.assertEquals(cmds.getAttr("l_leg_01_thigh_mover.ry"), cmds.getAttr("l_leg_thigh_mover.ry")) self.assertEquals(cmds.getAttr("l_leg_01_thigh_mover.rz"), cmds.getAttr("l_leg_thigh_mover.rz")) self.assertEquals(cmds.getAttr("l_leg_01_thigh_mover.sx"), cmds.getAttr("l_leg_thigh_mover.sx")) self.assertEquals(cmds.getAttr("l_leg_01_thigh_mover.sy"), cmds.getAttr("l_leg_thigh_mover.sy")) self.assertEquals(cmds.getAttr("l_leg_01_thigh_mover.sz"), cmds.getAttr("l_leg_thigh_mover.sz")) self.assertEquals(cmds.getAttr("l_leg_01_calf_mover.rx"), cmds.getAttr("l_leg_calf_mover.rx")) self.assertEquals(cmds.getAttr("l_leg_01_calf_mover.ry"), cmds.getAttr("l_leg_calf_mover.ry")) self.assertEquals(cmds.getAttr("l_leg_01_calf_mover.rz"), cmds.getAttr("l_leg_calf_mover.rz")) self.assertEquals(cmds.getAttr("l_leg_01_thigh_mover_grp.sx"), cmds.getAttr("l_leg_thigh_mover_grp.sx")) self.assertEquals(cmds.getAttr("l_leg_01_thigh_mover_grp.sy"), cmds.getAttr("l_leg_thigh_mover_grp.sy")) self.assertEquals(cmds.getAttr("l_leg_01_thigh_mover_grp.sz"), cmds.getAttr("l_leg_thigh_mover_grp.sz")) self.assertEquals(cmds.getAttr("l_leg_01_thigh_mover_grp.tz"), cmds.getAttr("l_leg_thigh_mover_grp.tz")) dupe2 = leg_inst.duplicate() dupe3 = leg_inst.duplicate() self.assertEquals(dupe2.suffix, "_02") self.assertEquals(dupe3.suffix, "_03") def test_create_mirror(self): self._create_asset() root.Root() left_leg_inst = leg.BipedLeg(prefix="l") left_leg_inst.parent = "root" cmds.setAttr("l_leg_thigh_mover.translateZ", -20) cmds.setAttr("l_leg_thigh_mover.rotateX", 40) cmds.setAttr("master_root_mover.scaleX", 2.5) cmds.setAttr("master_root_mover.scaleY", 2.5) cmds.setAttr("master_root_mover.scaleZ", 2.5) cmds.setAttr("master_root_mover.translateZ", 60) right_leg_inst = left_leg_inst.create_mirror(prefix="r", suffix="", parent="root") left_movers = left_leg_inst.joint_mover.get_movers() left_global_movers = sorted(left_movers.get("global")) right_movers = right_leg_inst.joint_mover.get_movers() right_global_movers = sorted(right_movers.get("global")) self.assertEquals(cmds.getAttr("r_leg_thigh_mover.translateZ"), 20) self.assertEquals(cmds.getAttr("r_leg_thigh_mover.rotateX"), 40) self.assertEquals(cmds.getAttr("r_leg_thigh_mover_grp.scaleX"), 2.5) for mover in left_global_movers: index = left_global_movers.index(mover) loc = cmds.spaceLocator()[0] cmds.delete(cmds.parentConstraint(mover.nodeName(), loc)[0]) group = cmds.group(empty=True) cmds.parent(loc, group) cmds.setAttr(group + ".scaleX", -1) loc_pos = format_position(cmds.xform(loc, q=True, ws=True, t=True)) mirror_pos = format_position(cmds.xform(right_global_movers[index].nodeName(), q=True, ws=True, t=True)) self.assertEquals(loc_pos, mirror_pos) def test_delete_mirror(self): self._create_asset() root.Root() left_leg_inst = leg.BipedLeg(prefix="l") left_leg_inst.parent = "root" right_leg_inst = left_leg_inst.create_mirror(prefix="r", suffix="", parent="root") left_leg_inst.delete() self.assertEquals(right_leg_inst.network_node.has_mirror.get(), False) self.assertEquals(len(right_leg_inst.network_node.mirror_component.connections()), 0) def test_mirror_transforms(self): self._create_asset() root.Root() left_leg_inst = leg.BipedLeg(prefix="l") left_leg_inst.parent = "root" left_leg_inst.create_mirror(prefix="r", suffix="", parent="root") cmds.setAttr("l_leg_thigh_mover.translateZ", -20) cmds.setAttr("l_leg_thigh_mover.rotateX", 40) left_leg_inst.joint_mover.mirror_transforms() self.assertEquals(cmds.getAttr("r_leg_thigh_mover.translateZ"), 20) self.assertEquals(cmds.getAttr("r_leg_thigh_mover.rotateX"), 40)