Пример #1
0
    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)
Пример #2
0
    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)
Пример #3
0
 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)
Пример #4
0
    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)
Пример #5
0
    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)
Пример #6
0
    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])
Пример #7
0
    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()