Source code for eppy.ext_field_functions

# Copyright (c) 2022 Santosh Philip
# =======================================================================
#  Distributed under the MIT License.
#  (See accompanying file LICENSE or copy at
#  http://opensource.org/licenses/MIT)
# =======================================================================
"""functions to deal with extensible fields
Moving the functions here is a work in progress"""


import eppy.iddgaps as iddgaps
import eppy.bunchhelpers as bunchhelpers


[docs]def getextensible(objidd): """return the extensible from the idd""" keys = objidd[0].keys() extkey = [key for key in keys if key.startswith("extensible")] if extkey: extens = extkey[0].split(":")[-1] return int(extens) else: return None
[docs]def extension_of_extensible(objidd, objblock, n): """generate the list of new vars needed to extend by n""" ext = getextensible(objidd) n = n // ext lastvars = endof_extensible(ext, objblock) alpha_lastvars = [i[0] for i in lastvars] int_lastvars = [int(i[1:]) for i in lastvars] lst = [] for alpha, start in zip(alpha_lastvars, int_lastvars): step = alpha_lastvars.count(alpha) rng = range(start + step, start + 1 + n * step, step) lst.append(["{}{}".format(alpha, item) for item in rng]) from itertools import chain return list(chain(*zip(*lst)))
[docs]def endof_extensible(extensible, thisblock): """get the vars from where extension happens""" return thisblock[-extensible:]
[docs]def increaseIDDfields(block, commdct, key_i, key_txt, n): """increase fields in IDD - ie in block and commdct""" extlst = extension_of_extensible(commdct[key_i], block[key_i], n) block[key_i] = block[key_i] + extlst commdct[key_i] = commdct[key_i] + [{}] * len(extlst) nofirstfields = [] # print(commdct[key_i]) iddgaps.a_missingkey_standard(commdct, key_i, key_txt, nofirstfields) objfields = [comm.get("field") for comm in commdct[key_i]] return objfields
# def increaseIDDfields_1(o_block, o_commdct, key_txt, n): # """increase fields in IDD - ie in block and commdct""" # print(o_commdct) # extlst = extension_of_extensible(o_commdct, o_block, n) # # o_block = o_block + extlst # o_block.append(extlst) # # o_commdct = o_commdct + [{}] * len(extlst) # o_commdct.append([{}] * len(extlst)) # nofirstfields = [] # # print(o_commdct) # iddgaps.a_missingkey_standard_1(o_commdct, key_txt, nofirstfields) # objfields = [comm.get("field") for comm in o_commdct] # return objfields
[docs]def islegalextensiblefield(objidd, fieldname): """return true if afieldname is an extensible field in objidd""" comm = objidd if getextensible(comm): if " " not in fieldname: # a space instead of a underscore will return True # the code below is a little wierd fields = iddgaps.getfields(comm) repnames_tuples = iddgaps.repeatingfieldsnames(fields, "0") repnames = [bunchhelpers.makefieldname(item[0]) for item in repnames_tuples] fieldname_spaces = fieldname.replace("_", " ") fieldname_spaces0 = bunchhelpers.replaceint(fieldname_spaces, "0") fieldname0 = bunchhelpers.makefieldname(fieldname_spaces0) expected = fieldname0 in repnames else: expected = False return expected
[docs]def extfieldint(fieldname, sep=None): """return the integer in the extensible field It there is more than one integer, it will return the last one""" if not sep: sep = "_" words = fieldname.split(sep) digits = [int(word) for word in words if word.isdigit()] if digits: return digits[-1] else: return None