import unittest import cadquery as Cq from nhf.checks import binary_intersection, pairwise_intersection from nhf.parts import joints, handle, metric_threads class TestJoints(unittest.TestCase): def test_joint_hirth(self): j = joints.HirthJoint() obj = j.generate() self.assertIsInstance( obj.val().solids(), Cq.Solid, msg="Hirth joint must be in one piece") def test_joints_hirth_assembly(self): for n_tooth in [16, 20, 24]: with self.subTest(n_tooth=n_tooth): j = joints.HirthJoint() assembly = j.assembly() isect = binary_intersection(assembly) self.assertLess(isect.Volume(), 1e-6, "Hirth joint assembly must not have intersection") def test_joints_comma_assembly(self): joints.comma_assembly() def test_torsion_joint(self): j = joints.TorsionJoint() assembly = j.rider_track_assembly() bbox = assembly.toCompound().BoundingBox() self.assertAlmostEqual(bbox.zlen, j.total_height) def torsion_joint_collision_case(self, joint: joints.TorsionJoint, slot: int): assembly = joint.rider_track_assembly(slot) bbox = assembly.toCompound().BoundingBox() self.assertAlmostEqual(bbox.zlen, joint.total_height) self.assertEqual(pairwise_intersection(assembly), []) def test_torsion_joint_collision(self): j = joints.TorsionJoint() for slot in range(j.rider_n_slots): with self.subTest(slot=slot): self.torsion_joint_collision_case(j, slot) class TestHandle(unittest.TestCase): def test_handle_assembly(self): h = handle.Handle() assembly = h.connector_insertion_assembly() bbox = assembly.toCompound().BoundingBox() self.assertAlmostEqual(bbox.xlen, h.diam) self.assertAlmostEqual(bbox.ylen, h.diam) assembly = h.connector_one_side_insertion_assembly() bbox = assembly.toCompound().BoundingBox() self.assertAlmostEqual(bbox.xlen, h.diam) self.assertAlmostEqual(bbox.ylen, h.diam) class TestMetricThreads(unittest.TestCase): def test_major_radius(self): major = 3.0 t = metric_threads.external_metric_thread(major, 0.5, 4.0, z_start= -0.85, top_lead_in=True) bbox = t.val().BoundingBox() self.assertAlmostEqual(bbox.xlen, major, places=3) self.assertAlmostEqual(bbox.ylen, major, places=3) if __name__ == '__main__': unittest.main()