def setUp(self): """ Prepare an assembly with two subassemblies: one assembly representing a spherical lens behind a flat screen, and one asssembly representing a perfect mirror. The mirror will be placed at the two subassemblies' focus, so a paraxial ray will come back on the other side of the optical axis. Reference: In [1], the lensmaker equation """ # focal length = 1, thickness = 1/6 R = 1./6. back_surf = Surface(HemisphereGM(R), opt.RefractiveHomogenous(1., 1.5), location=N.r_[0., 0., -R/2.]) front_surf = Surface(HemisphereGM(R), opt.RefractiveHomogenous(1., 1.5), location=N.r_[0., 0., R/2.], rotation=rotx(N.pi/2.)[:3,:3]) front_lens = AssembledObject(surfs=[back_surf, front_surf]) back_surf = Surface(FlatGeometryManager(), opt.RefractiveHomogenous(1., 1.5), location=N.r_[0., 0., -0.01]) front_surf = Surface(FlatGeometryManager(), opt.RefractiveHomogenous(1., 1.5), location=N.r_[0., 0., 0.01]) glass_screen = AssembledObject(surfs=[back_surf, front_surf], transform=translate(0., 0., 0.5)) lens_assembly = Assembly(objects=[glass_screen, front_lens]) lens_assembly.set_transform(translate(0., 0., 1.)) full_assembly = Assembly(objects=[rect_one_sided_mirror(1., 1., 0.)], subassemblies = [lens_assembly]) self.engine = TracerEngine(full_assembly)
def setUp(self): """ Prepare an assembly with two subassemblies: one assembly representing a spherical lens behind a flat screen, and one asssembly representing a perfect mirror. The mirror will be placed at the two subassemblies' focus, so a paraxial ray will come back on the other side of the optical axis. Reference: In [1], the lensmaker equation """ # focal length = 1, thickness = 1/6 R = 1. / 6. back_surf = Surface(HemisphereGM(R), opt.RefractiveHomogenous(1., 1.5), location=N.r_[0., 0., -R / 2.]) front_surf = Surface(HemisphereGM(R), opt.RefractiveHomogenous(1., 1.5), location=N.r_[0., 0., R / 2.], rotation=rotx(N.pi / 2.)[:3, :3]) front_lens = AssembledObject(surfs=[back_surf, front_surf]) back_surf = Surface(RoundPlateGM(R), opt.RefractiveHomogenous(1., 1.5), location=N.r_[0., 0., -0.01]) front_surf = Surface(RoundPlateGM(R), opt.RefractiveHomogenous(1., 1.5), location=N.r_[0., 0., 0.01]) glass_screen = AssembledObject(surfs=[back_surf, front_surf], transform=translate(0., 0., 0.5)) lens_assembly = Assembly(objects=[glass_screen, front_lens]) lens_assembly.set_transform(translate(0., 0., 1.)) full_assembly = Assembly(objects=[rect_one_sided_mirror(1., 1., 0.)], subassemblies=[lens_assembly]) self.engine = TracerEngine(full_assembly)
class TestNestedAssemblies(unittest.TestCase): """ Create an assembly within an assembly, with an object, and check that all transformation activities are handled correctly. """ flat_only = True def setUp(self): self.eighth_circle_trans = generate_transform(N.r_[1., 0, 0], N.pi/4, N.c_[[0., 1, 0]]) self.surf = Surface(flat_surface.FlatGeometryManager(), \ optics_callables.perfect_mirror) self.obj = AssembledObject(surfs=[self.surf]) self.sub_assembly = Assembly() self.sub_assembly.add_object(self.obj, self.eighth_circle_trans) self.assembly = Assembly() self.assembly.add_assembly(self.sub_assembly, self.eighth_circle_trans) def test_initial_transforms(self): """Initial consrtruction yielded correct permanent and temporary transforms""" quarter_circle_trans = N.dot(self.eighth_circle_trans, self.eighth_circle_trans) # Surface transforms: N.testing.assert_array_almost_equal(self.surf._transform, N.eye(4)) N.testing.assert_array_almost_equal(self.surf._temp_frame, quarter_circle_trans) # Object transform: N.testing.assert_array_almost_equal(self.obj.get_transform(), self.eighth_circle_trans) # Subassembly transform: N.testing.assert_array_almost_equal(self.sub_assembly.get_transform(), self.eighth_circle_trans) def test_retransform_object(self): """Changing an object's transform yield's correct resaults after retransform""" self.obj.set_transform(N.eye(4)) self.assembly.transform_children() # Surface transforms: N.testing.assert_array_almost_equal(self.surf._transform, N.eye(4)) N.testing.assert_array_almost_equal(self.surf._temp_frame, self.eighth_circle_trans) # Object transform: N.testing.assert_array_almost_equal(self.obj.get_transform(), N.eye(4)) # Subassembly transform: N.testing.assert_array_almost_equal(self.sub_assembly.get_transform(), self.eighth_circle_trans) def test_retransform_subassembly(self): """Changing an assembly's transform yield's correct resaults after retransform""" self.sub_assembly.set_transform(N.eye(4)) self.assembly.transform_children() # Surface transforms: N.testing.assert_array_almost_equal(self.surf._transform, N.eye(4)) N.testing.assert_array_almost_equal(self.surf._temp_frame, self.eighth_circle_trans) # Object transform: N.testing.assert_array_almost_equal(self.obj.get_transform(), self.eighth_circle_trans) # Subassembly transform: N.testing.assert_array_almost_equal(self.sub_assembly.get_transform(), N.eye(4)) def test_interface(self): """Can call getters on an assembly etc.""" subs = self.assembly.get_assemblies() self.assertEqual(len(subs), 1) self.assertTrue(subs[0] is self.sub_assembly)
class TestNestedAssemblies(unittest.TestCase): """ Create an assembly within an assembly, with an object, and check that all transformation activities are handled correctly. """ flat_only = True def setUp(self): self.eighth_circle_trans = generate_transform(N.r_[1., 0, 0], N.pi / 4, N.c_[[0., 1, 0]]) self.surf = Surface(flat_surface.FlatGeometryManager(), \ optics_callables.perfect_mirror) self.obj = AssembledObject(surfs=[self.surf]) self.sub_assembly = Assembly() self.sub_assembly.add_object(self.obj, self.eighth_circle_trans) self.assembly = Assembly() self.assembly.add_assembly(self.sub_assembly, self.eighth_circle_trans) def test_initial_transforms(self): """Initial consrtruction yielded correct permanent and temporary transforms""" quarter_circle_trans = N.dot(self.eighth_circle_trans, self.eighth_circle_trans) # Surface transforms: N.testing.assert_array_almost_equal(self.surf._transform, N.eye(4)) N.testing.assert_array_almost_equal(self.surf._temp_frame, quarter_circle_trans) # Object transform: N.testing.assert_array_almost_equal(self.obj.get_transform(), self.eighth_circle_trans) # Subassembly transform: N.testing.assert_array_almost_equal(self.sub_assembly.get_transform(), self.eighth_circle_trans) def test_retransform_object(self): """Changing an object's transform yield's correct resaults after retransform""" self.obj.set_transform(N.eye(4)) self.assembly.transform_children() # Surface transforms: N.testing.assert_array_almost_equal(self.surf._transform, N.eye(4)) N.testing.assert_array_almost_equal(self.surf._temp_frame, self.eighth_circle_trans) # Object transform: N.testing.assert_array_almost_equal(self.obj.get_transform(), N.eye(4)) # Subassembly transform: N.testing.assert_array_almost_equal(self.sub_assembly.get_transform(), self.eighth_circle_trans) def test_retransform_subassembly(self): """Changing an assembly's transform yield's correct resaults after retransform""" self.sub_assembly.set_transform(N.eye(4)) self.assembly.transform_children() # Surface transforms: N.testing.assert_array_almost_equal(self.surf._transform, N.eye(4)) N.testing.assert_array_almost_equal(self.surf._temp_frame, self.eighth_circle_trans) # Object transform: N.testing.assert_array_almost_equal(self.obj.get_transform(), self.eighth_circle_trans) # Subassembly transform: N.testing.assert_array_almost_equal(self.sub_assembly.get_transform(), N.eye(4)) def test_interface(self): """Can call getters on an assembly etc.""" subs = self.assembly.get_assemblies() self.assertEqual(len(subs), 1) self.assertTrue(subs[0] is self.sub_assembly)