def testPathLengthCalculation(self): cube = create_cuboid(2, 4, 6) beam_axis = Vector3([1.0, 0.0, 0.0]) gauge_volume = Vector3([0.0, 0.0, 0.0]) diff_axis = [Vector3([0.0, 1.0, 0.0]), Vector3([0.0, 0.0, 1.0])] lengths = path_length_calculation(cube, gauge_volume, beam_axis, diff_axis) np.testing.assert_array_almost_equal(lengths, [4.0, 3.0], decimal=5) beam_axis = Vector3([0.0, -1.0, 0.0]) lengths = path_length_calculation(cube, gauge_volume, beam_axis, diff_axis) np.testing.assert_array_almost_equal(lengths, [6.0, 5.0], decimal=5) # No hit beam_axis = Vector3([0.0, -1.0, 0.0]) cube.vertices = cube.vertices - [0.0, 10.0, 0.0] lengths = path_length_calculation(cube, gauge_volume, beam_axis, diff_axis) np.testing.assert_array_almost_equal(lengths, [0.0, 0.0], decimal=5) # single detector diff_axis = [Vector3([0.0, 0.0, 1.0])] cube.vertices = cube.vertices + [0.0, 10.0, 0.0] length = path_length_calculation(cube, gauge_volume, beam_axis, diff_axis) self.assertAlmostEqual(*length, 5.0, 5) # beam outside at gauge volume cylinder = create_tube(2, 4, 6) beam_axis = Vector3([0.0, -1.0, 0.0]) diff_axis = [Vector3([0.0, -1.0, 0.0])] length = path_length_calculation(cylinder, gauge_volume, beam_axis, diff_axis) self.assertAlmostEqual(*length, 0.0, 5) # beam cross more than a 2 faces cylinder.vertices = cylinder.vertices - [0.0, 3.0, 0.0] length = path_length_calculation(cylinder, gauge_volume, beam_axis, diff_axis) self.assertAlmostEqual(*length, 4.0, 5) # diff beam does not hit cube = create_cuboid(depth=0.0) cube.vertices = cube.vertices - [0.0, 1.0, 0.0] length = path_length_calculation(cube, gauge_volume, beam_axis, diff_axis) self.assertAlmostEqual(*length, 0.0, 5)
def testClosestTriangleToPoint(self): cube = create_cuboid(2, 2, 2) faces = cube.vertices[cube.indices].reshape(-1, 9) points = np.array([[0.0, 1.0, 0.0], [2.0, 0.5, -0.1]]) face = closest_triangle_to_point(faces, points) np.testing.assert_array_almost_equal(face[0], faces[2], decimal=5) np.testing.assert_array_almost_equal(face[1], faces[9], decimal=5)
def createPositioningStack(): y_axis = create_cuboid(200, 10, 200) z_axis = create_cylinder(25, 50) q1 = Link("Z", [0.0, 0.0, 1.0], [0.0, 0.0, 0.0], Link.Type.Revolute, -3.14, 3.14, 0, z_axis) q2 = Link("Y", [0.0, 1.0, 0.0], [0.0, 0.0, 0.0], Link.Type.Prismatic, -200.0, 200.0, 0, y_axis) s = SerialManipulator("", [q1, q2], custom_order=[1, 0], base=Matrix44.fromTranslation([0.0, 0.0, 50.0])) return PositioningStack(s.name, s)
def redo(self): if self.option == InsertSampleOptions.Replace: self.old_sample = self.presenter.model.sample if self.primitive == Primitives.Tube: mesh = create_tube(**self.args) elif self.primitive == Primitives.Sphere: mesh = create_sphere(**self.args) elif self.primitive == Primitives.Cylinder: mesh = create_cylinder(**self.args) else: mesh = create_cuboid(**self.args) self.sample_key = self.presenter.model.addMeshToProject(self.name, mesh, option=self.option)
def testStackToString(self): q1 = Link("X", [1.0, 0.0, 0.0], [0.0, 0.0, 0.0], Link.Type.Prismatic, -180.0, 120.0, -10) first = SerialManipulator("first", [q1]) y_axis = create_cuboid(200, 10, 200) z_axis = create_cylinder(25, 50) q1 = Link("Z", [0.0, 0.0, 1.0], [0.0, 0.0, 0.0], Link.Type.Revolute, -3.14, 3.14, 1.57, z_axis) q2 = Link("Y", [0.0, 1.0, 0.0], [0.0, 0.0, 0.0], Link.Type.Prismatic, -200.0, 200.0, 0, y_axis) second = SerialManipulator("second", [q1, q2], custom_order=[1, 0], base=Matrix44.fromTranslation( [0.0, 0.0, 50.0])) stack = PositioningStack("New Stack", first) stack.addPositioner(second) stack.links[0].ignore_limits = True stack.links[1].locked = True stack_string = stack_to_string(stack) new_stack = stack_from_string(stack_string) for l1, l2 in zip(stack.links, new_stack.links): self.assertEqual(l1.ignore_limits, l2.ignore_limits) self.assertEqual(l1.locked, l2.locked) self.assertEqual(l1.type, l2.type) self.assertEqual(l1.upper_limit, l2.upper_limit) self.assertEqual(l1.lower_limit, l2.lower_limit) np.testing.assert_array_almost_equal(l1.home, l2.home) np.testing.assert_array_almost_equal(l1.joint_axis, l2.joint_axis) np.testing.assert_array_almost_equal(new_stack.set_points, stack.set_points) np.testing.assert_array_almost_equal(new_stack.fixed.base, stack.fixed.base) np.testing.assert_array_almost_equal(new_stack.fixed.tool, stack.fixed.tool) np.testing.assert_array_almost_equal(new_stack.fixed.order, stack.fixed.order) np.testing.assert_array_almost_equal(new_stack.auxiliary[0].base, stack.auxiliary[0].base) np.testing.assert_array_almost_equal(new_stack.auxiliary[0].tool, stack.auxiliary[0].tool) np.testing.assert_array_almost_equal(new_stack.auxiliary[0].order, stack.auxiliary[0].order)
def testManager(self): manager = CollisionManager(5) self.assertEqual(manager.max_size, 5) geometry = [create_cuboid(), create_cuboid()] transform = [ Matrix44.identity(), Matrix44.fromTranslation([0, 0, 0.5]) ] manager.addColliders(geometry, transform, movable=True) self.assertEqual(len(manager.queries), 2) self.assertEqual(len(manager.colliders), 2) manager.addColliders([create_cuboid()], [Matrix44.fromTranslation([0, 0, 2.0])]) self.assertEqual(len(manager.queries), 2) self.assertEqual(len(manager.colliders), 3) manager.createAABBSets() self.assertListEqual(manager.collide(), [True, True, False]) manager.clear() self.assertEqual(len(manager.queries), 0) self.assertEqual(len(manager.colliders), 0) geometry = [create_cuboid(), create_cuboid(), create_cuboid()] transform = [ Matrix44.identity(), Matrix44.fromTranslation([0, 0, 0.5]), Matrix44.fromTranslation([0, 0, 1.5]) ] manager.addColliders(geometry, transform, CollisionManager.Exclude.Consecutive, movable=True) manager.createAABBSets() self.assertListEqual(manager.collide(), [False, False, False]) manager.clear() transform = [ Matrix44.identity(), Matrix44.identity(), Matrix44.identity() ] manager.addColliders(geometry, transform, CollisionManager.Exclude.All, movable=True) manager.createAABBSets() self.assertListEqual(manager.collide(), [False, False, False])
def setUp(self): mock_instrument_entity = self.createMock( "sscanss.core.instrument.simulation.InstrumentEntity") self.mock_process = self.createMock( "sscanss.core.instrument.simulation.Process") self.mock_logging = self.createMock( "sscanss.core.instrument.simulation.logging") self.mock_process.is_alive.return_value = False Collimator = namedtuple("Collimator", ["name"]) Jaws = namedtuple("Jaws", ["beam_direction", "positioner"]) Detector = namedtuple( "Detector", ["diffracted_beam", "positioner", "current_collimator"]) self.mock_instrument = mock.create_autospec(Instrument) self.mock_instrument.positioning_stack = self.createPositioningStack() self.mock_instrument.jaws = Jaws([1.0, 0.0, 0.0], self.createPositioner()) self.mock_instrument.gauge_volume = [0.0, 0.0, 0.0] self.mock_instrument.q_vectors = [[-0.70710678, 0.70710678, 0.0], [-0.70710678, -0.70710678, 0.0]] self.mock_instrument.detectors = { "North": Detector([0.0, 1.0, 0.0], self.createPositioner(), Collimator("4mm")), "South": Detector([0.0, -1.0, 0.0], None, Collimator("2mm")), } self.mock_instrument.beam_in_gauge_volume = True meshes = None offsets = [] transforms = [] for mesh, transform in self.mock_instrument.positioning_stack.model(): if meshes is None: meshes = mesh else: meshes.append(meshes) transforms.append(transform) offsets.append(len(meshes.indices)) beam_stop = create_cuboid(100, 100, 100) beam_stop.translate([0.0, 100.0, 0.0]) transforms.append(Matrix44.identity()) meshes.append(beam_stop) offsets.append(len(meshes.indices)) mock_instrument_entity.return_value.vertices = meshes.vertices mock_instrument_entity.return_value.indices = meshes.indices mock_instrument_entity.return_value.transforms = transforms mock_instrument_entity.return_value.offsets = offsets mock_instrument_entity.return_value.keys = { "Positioner": 2, "Beam_stop": 3 } self.sample = {"sample": create_cuboid(50.0, 100.000, 200.000)} self.points = np.rec.array( [([0.0, -90.0, 0.0], True), ([0.0, 0.0, 0.0], True), ([0.0, 90.0, 0.0], True), ([0.0, 0.0, 10.0], False)], dtype=POINT_DTYPE, ) self.vectors = np.zeros((4, 6, 1), dtype=np.float32) self.alignment = Matrix44.identity()