def _get_full_guideline(self, gldict, device=None): if device and fpiswire(device): qty_typeclass = Length else: qty_typeclass = int oqty_min = self._get_guideline_param( 'oqty_min', gldict, default=1, typeclass=qty_typeclass ) oqty_multiple = self._get_guideline_param( 'oqty_multiple', gldict, default=1, typeclass=qty_typeclass ) baseline_qty = self._get_guideline_param( 'baseline_qty', gldict, default=0, typeclass=qty_typeclass ) excess_min_pc = self._get_guideline_param( 'excess_min_pc', gldict, default=0, typeclass=Decimal ) excess_min_qty = self._get_guideline_param( 'excess_min_qty', gldict, default=0, typeclass=qty_typeclass ) excess_max_qty = self._get_guideline_param( 'excess_max_qty', gldict, default=-1, typeclass=qty_typeclass ) return oqty_min, oqty_multiple, baseline_qty, \ excess_min_pc, excess_min_qty, excess_max_qty
def get_devices(): rval = [] for device, desc in electronics.DEVICE_CLASSES_DOC: rval.append( (device, electronics.fpiswire(device), electronics.fpismodlen(device), electronics.no_fp(device), desc) ) return rval
def get_devices(): rval = [] for device, desc in electronics.DEVICE_CLASSES_DOC: rval.append( (device, electronics.fpiswire(device), electronics.fpismodlen(device), electronics.no_fp(device), desc)) return rval
def collapse_wires(self): for line in self.lines: device, value, footprint = parse_ident(line.ident) if device is None: continue if fpiswire(device): newident = device + ' ' + value newline = self.find_by_ident(newident) if newline is None: line.ident = newident else: newline.merge_line(line) self.lines.remove(line)
def sourcing_info_qty(self, qty): from tendril.inventory.guidelines import electronics_qty from tendril.sourcing.electronics import get_sourcing_information from tendril.sourcing.electronics import SourcingException if fpiswire(self.device): iqty = Length(qty) else: iqty = qty iqty = electronics_qty.get_compliant_qty(self.ident, iqty) try: vsi = get_sourcing_information(self.ident, iqty, allvendors=True) except SourcingException: vsi = [] return vsi
def indicative_sourcing_info(self): if self._indicative_sourcing_info is None: from tendril.inventory.guidelines import electronics_qty from tendril.sourcing.electronics import get_sourcing_information from tendril.sourcing.electronics import SourcingException if fpiswire(self.device): iqty = Length("1m") else: iqty = 1 iqty = electronics_qty.get_compliant_qty(self.ident, iqty) try: vsi = get_sourcing_information(self.ident, iqty, allvendors=True) except SourcingException: vsi = [] self._indicative_sourcing_info = vsi return self._indicative_sourcing_info
def uquantity(self): device, value, footprint = parse_ident(self.ident) if device is None: logger.warning("Device not identified : " + self.ident) elif fpiswire(device): try: elen = Length(footprint) * Decimal(0.1) if elen < Length('5mm'): elen = Length('5mm') elif elen > Length('1inch'): elen = Length('1inch') return len(self.refdeslist) * (Length(footprint) + elen) except ValueError: logger.error( "Problem parsing length for ident : " + self.ident ) raise return len(self.refdeslist)
def sourcing_info_qty(self, qty): # TODO Complete Migration try: from tendril.inventory.guidelines import electronics_qty from tendril.sourcing.electronics import get_sourcing_information from tendril.sourcing.electronics import SourcingException except ImportError: return [] if fpiswire(self.device) and not isinstance(qty, Length): iqty = Length(qty) else: iqty = qty iqty = electronics_qty.get_compliant_qty(self.ident, iqty) try: vsi = get_sourcing_information(self.ident, iqty, allvendors=True) except SourcingException: vsi = [] return vsi
def uquantity(self): device, value, footprint = parse_ident(self.ident) if device is None: # TODO # logger.warning("Device not identified : " + self.ident) pass elif fpiswire(device): try: elen = Length(footprint) * Decimal(0.1) if elen < Length('5mm'): elen = Length('5mm') elif elen > Length('1inch'): elen = Length('1inch') return len(self.refdeslist) * (Length(footprint) + elen) except ValueError: logger.error( "Problem parsing length for ident : " + self.ident ) raise return len(self.refdeslist)
def _get_full_guideline(self, gldict, device=None): if device and fpiswire(device): qty_typeclass = Length else: qty_typeclass = int oqty_min = self._get_guideline_param('oqty_min', gldict, default=1, typeclass=qty_typeclass) oqty_multiple = self._get_guideline_param('oqty_multiple', gldict, default=1, typeclass=qty_typeclass) baseline_qty = self._get_guideline_param('baseline_qty', gldict, default=0, typeclass=qty_typeclass) excess_min_pc = self._get_guideline_param('excess_min_pc', gldict, default=0, typeclass=Decimal) excess_min_qty = self._get_guideline_param('excess_min_qty', gldict, default=0, typeclass=qty_typeclass) excess_max_qty = self._get_guideline_param('excess_max_qty', gldict, default=-1, typeclass=qty_typeclass) return oqty_min, oqty_multiple, baseline_qty, \ excess_min_pc, excess_min_qty, excess_max_qty
def create_obom_from_listing(component_list, head): obom_descriptor = OutputElnBomDescriptor(head, None, head, None) obom = OutputBom(obom_descriptor) for line in component_list: device, value, footprint = parse_ident(line['ident']) from tendril.boms.electronics import EntityElnComp item = EntityElnComp() item.define('Undef', device, value, footprint) if device and fpiswire(device): length = Length(line['qty']) if length > 0: wireitem = EntityElnComp() wireitem.define( 'Undef', device, value, str(length) ) obom.insert_component(wireitem) else: num = int(line['qty']) if num > 0: for i in range(num): obom.insert_component(item) return obom
def load_cobom_from_file(f, name, tf=None, verbose=True, generic=False): bomlist = [] header = [] reader = csv.reader(f) for line in reader: line = [elem.strip() for elem in line] if line[0] == 'device': header = line break if verbose: logger.info('Inserting External Boms') oboms = [] for head in header[1:-1]: if verbose: logger.info('Creating Bom : ' + head) obom_descriptor = OutputElnBomDescriptor(head, None, head, None) obom = OutputBom(obom_descriptor) oboms.append(obom) for line in reader: line = [elem.strip() for elem in line] if line[0] == '': continue if line[0] == 'END': break if tf and not tf.has_contextual_repr(line[0]): logger.warn('{0} Possibly not recognized'.format(line[0])) if tf: device, value, footprint = parse_ident( tf.get_canonical_repr(line[0]), generic=generic ) else: device, value, footprint = parse_ident(line[0], generic=generic) logger.debug("Trying to insert line : " + line[0]) # print base_tf.get_canonical_repr(line[0]) from tendril.boms.electronics import EntityElnComp item = EntityElnComp() item.define('Undef', device, value, footprint) for idx, col in enumerate(line[1:-1]): if col != '': if device and fpiswire(device): length = Length(col) if length > 0: wireitem = EntityElnComp() wireitem.define( 'Undef', device, value, str(length) ) oboms[idx].insert_component(wireitem) else: num = int(col) if num > 0: for i in range(num): oboms[idx].insert_component(item) for obom in oboms: if verbose: logger.info('Inserting External Bom : ' + obom.descriptor.configname) bomlist.append(obom) cobom = CompositeOutputBom( bomlist, name=name ) return cobom
def create_output_bom(self, configname, groupname=None): if configname not in self.configurations.configuration_names: raise ValueError outbomdescriptor = OutputElnBomDescriptor( self.configurations.pcbname, self.configurations.projectfolder, configname, self.configurations, groupname=groupname ) outbom = OutputBom(outbomdescriptor) if groupname is None: is_group_bom = False outgroups = self.configurations.configuration_grouplist(configname) # noqa else: is_group_bom = True outgroups = [groupname] genlist = self.configurations.configuration_genlist(configname) gen_refdeslist = None if genlist is not None: gen_refdeslist = genlist.keys() sjlist = self.configurations.configuration_sjlist(configname) sj_refdeslist = None if sjlist is not None: sj_refdeslist = sjlist.keys() ctx = self._validation_context _policy_ge = ConfigGroupPolicy(ctx, self._group_policy.known_groups) _policy_sj = ConfigSJPolicy(ctx) for group in outgroups: grpobj = self.find_group(group) if grpobj is None: e = ConfigGroupError(_policy_ge, group) self._validation_errors.add(e) continue for comp in grpobj.complist: if gen_refdeslist is not None and \ comp.refdes in gen_refdeslist: # TODO Verify refdes has Generator status in schematic if fpiswire(comp.device): comp.footprint = genlist[comp.refdes] else: comp.value = genlist[comp.refdes] if sj_refdeslist is not None and comp.refdes in sj_refdeslist: if not comp.fillstatus == 'CONF': e = ConfigSJUnexpectedError(_policy_sj, comp.refdes, comp.fillstatus) self._validation_errors.add(e) if sjlist[comp.refdes]: logger.debug("Setting Fillstatus : " + comp.refdes) comp.fillstatus = '' else: logger.debug("Clearing Fillstatus : " + comp.refdes) comp.fillstatus = 'DNP' outbom.insert_component(comp) motifconfs = self.configurations.configuration_motiflist(configname) if motifconfs is None: outbom.sort_by_ident() outbom.validation_errors.add(self._validation_errors) return outbom if self._configured_for != configname: self.configure_motifs(configname) for key, motifconf in motifconfs.iteritems(): motif = self.get_motif_by_refdes(key) if motif is None: # This error would already have beed reported when # motifs were configured. logger.error("Motif not defined : " + key) continue for item in motif.get_line_gen(): item_group = item.data['group'] if item_group == 'unknown' or item_group in outgroups and \ item.data['fillstatus'] != 'DNP': outbom.insert_component(EntityElnComp(item)) outbom.sort_by_ident() outbom.validation_errors.add(self._validation_errors) return outbom
def create_output_bom(self, configname, groupname=None): if configname not in self.configurations.configuration_names: raise ValueError outbomdescriptor = OutputElnBomDescriptor( self.configurations.pcbname, self.configurations.projectfolder, configname, self.configurations, groupname=groupname ) outbom = OutputBom(outbomdescriptor) if groupname is None: is_group_bom = False outgroups = self.configurations.configuration_grouplist(configname) # noqa else: is_group_bom = True outgroups = [groupname] genlist = self.configurations.configuration_genlist(configname) gen_refdeslist = None if genlist is not None: gen_refdeslist = genlist.keys() sjlist = self.configurations.configuration_sjlist(configname) sj_refdeslist = None if sjlist is not None: sj_refdeslist = sjlist.keys() ctx = self._validation_context _policy_ge = ConfigGroupPolicy(ctx, self._group_policy.known_groups) _policy_sj = ConfigSJPolicy(ctx) for group in outgroups: grpobj = self.find_group(group) if grpobj is None: e = ConfigGroupError(_policy_ge, group) self._validation_errors.add(e) continue for comp in grpobj.complist: if gen_refdeslist is not None and \ comp.refdes in gen_refdeslist: # TODO Verify refdes has Generator status in schematic if fpiswire(comp.device): comp.footprint = genlist[comp.refdes] else: comp.value = genlist[comp.refdes] if sj_refdeslist is not None and comp.refdes in sj_refdeslist: if not comp.fillstatus == 'CONF': e = ConfigSJUnexpectedError(_policy_sj, comp.refdes, comp.fillstatus) self._validation_errors.add(e) if sjlist[comp.refdes]: logger.debug("Setting Fillstatus : " + comp.refdes) comp.fillstatus = '' else: logger.debug("Clearing Fillstatus : " + comp.refdes) comp.fillstatus = 'DNP' outbom.insert_component(comp) motifconfs = self.configurations.configuration_motiflist(configname) if motifconfs is None: outbom.sort_by_ident() outbom.validation_errors.add(self._validation_errors) return outbom if self._configured_for != configname: self.configure_motifs(configname) for key, motifconf in motifconfs.iteritems(): motif = self.get_motif_by_refdes(key) if motif is None: # This error would already have beed reported when # motifs were configured. logger.error("Motif not defined : " + key) continue for item in motif.get_line_gen(): item_group = self.find_tgroup(item).groupname if item_group == 'unknown' or item_group in outgroups and \ item.data['fillstatus'] != 'DNP': outbom.insert_component(EntityElnComp(item)) outbom.sort_by_ident() outbom.validation_errors.add(self._validation_errors) return outbom
def is_wire(self): return fpiswire(self.device)