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
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
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
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)
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
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.
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)
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
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