Example #1
0
def process_glass_data(glass_data):
    """ process GLA string for fictitious, catalog or private catalog glass """
    if isanumber(glass_data):  # process as fictitious glass code
        n, v = fictitious_glass_decode(float(glass_data))
        medium = Glass(n, v, '')

    else:  # look for glass name and optional catalog
        name_cat = glass_data.split('_')
        if len(name_cat) == 2:
            name, cat = name_cat
        elif len(name_cat) == 1:
            name, cat = glass_data, None
        if cat is not None:
            if cat.upper() == 'SCHOTT' and name[:1].upper() == 'N':
                name = name[:1] + '-' + name[1:]
            elif cat.upper() == 'OHARA' and name[:1].upper() == 'S':
                name = name[:1] + '-' + name[1:]
                if not name[-2:].isdigit() and name[-1].isdigit():
                    name = name[:-1] + ' ' + name[-1]
            try:
                medium = gfact.create_glass(name, cat)
            except glasserror.GlassNotFoundError as gerr:
                logging.info('%s glass data type %s not found', gerr.catalog,
                             gerr.name)
                logging.info('Replacing material with air.')
                medium = Air()
        else:  # name with no data. default to crown glass
            global _private_catalog_glasses
            if name in _private_catalog_glasses:
                medium = _private_catalog_glasses[name]
            else:
                medium = Glass(1.5, 60.0, name)
    return medium
Example #2
0
def create_surface_and_gap(surf_data,
                           radius_mode=False,
                           prev_medium=None,
                           wvl=550.0,
                           **kwargs):
    """ create a surface and gap where surf_data is a list that contains:
        [curvature, thickness, refractive_index, v-number] """
    s = surface.Surface()

    if radius_mode:
        if surf_data[0] != 0.0:
            s.profile.cv = 1.0 / surf_data[0]
        else:
            s.profile.cv = 0.0
    else:
        s.profile.cv = surf_data[0]

    if len(surf_data) > 2:
        if isanumber(surf_data[2]):  # assume all args are numeric
            if len(surf_data) < 3:
                if surf_data[2] == 1.0:
                    mat = m.Air()
                else:
                    mat = m.Medium(surf_data[2])
            else:
                mat = m.Glass(surf_data[2], surf_data[3], '')

        else:  # string args
            if surf_data[2].upper() == 'REFL':
                s.interact_mode = 'reflect'
                mat = prev_medium
            else:
                num_args = len(surf_data[2:])
                if num_args == 2:
                    name, cat = surf_data[2], surf_data[3]
                else:
                    name, cat = surf_data[2].split(',')

                try:
                    mat = gfact.create_glass(name, cat)
                except ge.GlassNotFoundError as gerr:
                    logging.info('%s glass data type %s not found',
                                 gerr.catalog, gerr.name)
                    logging.info('Replacing material with air.')
                    mat = m.Air()

    else:  # only curvature and thickness entered, set material to air
        mat = m.Air()

    thi = surf_data[1]
    g = gap.Gap(thi, mat)
    rndx = mat.rindex(wvl)
    tfrm = np.identity(3), np.array([0., 0., thi])

    return s, g, rndx, tfrm
Example #3
0
 def find_6_digit_code(self, name):
     """ process `name` as a 6 digit glass code"""
     if isanumber(name):
         if len(name) == 6:
             # process as a 6 digit code, no decimal point
             nd = 1 + float(name[:3]) / 1000
             vd = float(name[3:]) / 10
             medium = Glass(nd, vd, mat=name)
             self.track_contents['6 digit code'] += 1
             return medium
     else:
         return None
Example #4
0
 def add_surface(self, surf_data, **kwargs):
     """ add a surface where surf is a list that contains:
         [curvature, thickness, refractive_index, v-number] """
     radius_mode = self.opt_model.radius_mode
     mat = None
     if len(surf_data) > 2:
         if not isanumber(surf_data[2]):
             if surf_data[2].upper() == 'REFL':
                 mat = self.gaps[self.cur_surface].medium
     s, g, rn, tfrm = create_surface_and_gap(surf_data, prev_medium=mat,
                                             radius_mode=radius_mode,
                                             **kwargs)
     self.insert(s, g)
Example #5
0
    def __call__(self, sm, cur, cmd, inputs):
        """ process GLAS command for fictitious, catalog glass or mirror"""

        if cmd == "GCAT":
            inputs = inputs.split()
            # Check catalog names, only add those we recognize
            for gc in inputs:
                try:
                    gfact.get_glass_catalog(gc)
                except glasserror.GlassCatalogNotFoundError:
                    continue
                else:
                    self.glass_catalogs.append(gc)
            # If no catalogs were recognized, use the default set
            if len(self.glass_catalogs) == 0:
                self.glass_catalogs = gfact._cat_names
            self.track_contents["GCAT"] = inputs
            return True
        elif cmd == "GLAS":
            g = sm.gaps[cur]
            inputs = inputs.split()
            name = inputs[0]
            medium = None
            if name == 'MIRROR':
                sm.ifcs[cur].interact_mode = 'reflect'
                g.medium = sm.gaps[cur - 1].medium
                self.track_contents[name] += 1
                return True
            elif name == '___BLANK':
                nd = float(inputs[3])
                vd = float(inputs[4])
                g.medium = Glass(nd=nd, vd=vd, mat=glass_encode(nd, vd))
                self.track_contents[name] += 1
                return True
            elif isanumber(name):
                # process as a 6 digit code, no decimal point
                m = self.find_6_digit_code(name)
                if m is not None:
                    g.medium = m
                    self.track_contents['6 digit code'] += 1
                    return True
            else:  # must be a glass type
                medium = self.find_glass(name, '')
                g.medium = medium
                return True

        else:
            return False
Example #6
0
 def read_float(s):
     if s == 'Infinity':
         return float('inf')
     elif isanumber(s):
         return float(s)
     else:
         if s == 'undefined':
             return float('nan')
         elif s == 'AS':
             return 0.
         elif s == '':
             return 0.
         else:
             try:
                 return float(read_float(var_dists[s][0]))
             except:
                 return 0.
Example #7
0
 def setData(self, index, value, role):
     root = self.get_root_object()
     if role == Qt.EditRole:
         r = index.row()
         c = index.column()
         exec_str = ('root' + self.colEvalStr[c]).format(r)
         if not isanumber(value):
             value = "'" + value + "'"
         exec_str = exec_str + '=' + value
         try:
             exec(exec_str)
             self.update.emit(root, r)
             return True
         except IndexError:
             return False
         except SyntaxError:
             logging.info('Syntax error: "%s"', value)
             return False
     else:
         return False
    def add_surface(self, surf_data, **kwargs):
        """ add a surface where `surf_data` is a list that contains:

        [curvature, thickness, refractive_index, v-number, semi-diameter]

        The `curvature` entry is interpreted as radius if `radius_mode` is **True**

        The `thickness` is the signed thickness

        The `refractive_index, v-number` entry can have several forms:

            - **refractive_index, v-number**
            - **refractive_index** only -> constant index model
            - **'REFL'** -> set interact_mode to 'reflect'
            - **glass_name, catalog_name** as 1 or 2 strings
            - blank -> defaults to air

        The `semi-diameter` entry is optional

        """
        radius_mode = self.opt_model.radius_mode
        mat = None
        if len(surf_data) > 2:
            if not isanumber(surf_data[2]):
                if surf_data[2].upper() == 'REFL':
                    mat = self.gaps[self.cur_surface].medium
        s, g, rn, tfrm = create_surface_and_gap(surf_data,
                                                prev_medium=mat,
                                                radius_mode=radius_mode,
                                                **kwargs)
        self.insert(s, g)

        root_node = self.opt_model['part_tree'].root_node
        idx = self.cur_surface
        Node(f'i{idx}', id=s, tag='#ifc', parent=root_node)
        if gap is not None:
            Node(f'g{idx}',
                 id=(g, self.z_dir[idx]),
                 tag='#gap',
                 parent=root_node)
Example #9
0
    def process_glass_data(self, glass_data):
        if isanumber(glass_data):
            # process as a 6 digit code, no decimal point
            medium = self.find_6_digit_code(glass_data)
            if medium is not None:
                self.track_contents['6 digit code'] += 1
                return medium
            else:  # process as fictitious glass code
                nd, vd = fictitious_glass_decode(float(glass_data))
                medium = Glass(nd, vd, mat=glass_data)
                self.track_contents['fictitious glass'] += 1
                return medium
        else:  # look for glass name and optional catalog
            name_cat = glass_data.split('_')
            if len(name_cat) == 2:
                name, catalog = name_cat
            elif len(name_cat) == 1:
                name, catalog = glass_data, None

            if catalog is not None:
                if catalog.upper() == 'SCHOTT' and name[:1].upper() == 'N':
                    name = name[:1] + '-' + name[1:]
                elif catalog.upper() == 'OHARA' and name[:1].upper() == 'S':
                    name = name[:1] + '-' + name[1:]
                    if not name[-2:].isdigit() and name[-1].isdigit():
                        name = name[:-1] + ' ' + name[-1]

            medium = self.find_glass(name, catalog, always=False)
            if medium:
                return medium
            else:  # name with no data. default to crown glass
                global _private_catalog_glasses
                if name in _private_catalog_glasses:
                    medium = _private_catalog_glasses[name]
                else:
                    medium = Medium(1.5, 'not ' + name)
                return medium
Example #10
0
def create_surface_and_gap(surf_data,
                           radius_mode=False,
                           prev_medium=None,
                           wvl=550.0,
                           **kwargs):
    """ create a surface and gap where `surf_data` is a list that contains:

    [curvature, thickness, refractive_index, v-number, semi-diameter]
    
    The `curvature` entry is interpreted as radius if `radius_mode` is **True**

    The `thickness` is the signed thickness

    The `refractive_index, v-number` entry can have several forms:
        
        - **refractive_index, v-number**
        - **refractive_index** only -> constant index model
        - **'REFL'** -> set interact_mode to 'reflect'
        - **glass_name, catalog_name** as 1 or 2 strings
        - blank -> defaults to air

    The `semi-diameter` entry is optional
    """
    s = surface.Surface()

    if radius_mode:
        if surf_data[0] != 0.0:
            s.profile.cv = 1.0 / surf_data[0]
        else:
            s.profile.cv = 0.0
    else:
        s.profile.cv = surf_data[0]

    if len(surf_data) > 2:
        if isanumber(surf_data[2]):  # assume all args are numeric
            if len(surf_data) < 3:
                if surf_data[2] == 1.0:
                    mat = m.Air()
                else:
                    mat = m.Medium(surf_data[2])
            else:
                if surf_data[2] == 1.0:
                    mat = m.Air()
                else:
                    mat = m.Glass(surf_data[2], surf_data[3], '')

        else:  # string args
            if surf_data[2].upper() == 'REFL':
                s.interact_mode = 'reflect'
                mat = prev_medium
            else:
                num_str_args = 0
                for tkn in surf_data[2:]:
                    if isinstance(tkn, str) and len(tkn) > 0:
                        num_str_args += 1
                if num_str_args == 2:
                    name, cat = surf_data[2], surf_data[3]
                elif num_str_args == 1:
                    name, cat = surf_data[2].split(',')
                elif num_str_args == 0:
                    mat = m.Air()

                if num_str_args > 0:
                    try:
                        mat = gfact.create_glass(name, cat)
                    except ge.GlassNotFoundError as gerr:
                        logging.info('%s glass data type %s not found',
                                     gerr.catalog, gerr.name)
                        logging.info('Replacing material with air.')
                        mat = m.Air()

        if len(surf_data) >= 5:
            s.set_max_aperture(surf_data[4])

    else:  # only curvature and thickness entered, set material to air
        mat = m.Air()

    thi = surf_data[1]
    g = gap.Gap(thi, mat)
    rndx = mat.rindex(wvl)
    tfrm = np.identity(3), np.array([0., 0., thi])

    return s, g, rndx, tfrm