def create_inp_build_instructions(inpA, inpB, path, filename, comments=''): """ pass in two inp file paths and produce a spreadsheet showing the differences found in each of the INP sections. These differences should then be used whenever we need to rebuild this model from the baseline reference model. Note: this should be split into a func that creates a overall model "diff" that can then be written as a BI file or used programmatically """ allsections_a = funcs.complete_inp_headers(inpA) modela = swmmio.Model(inpA) modelb = swmmio.Model(inpB) #create build insructions folder if not os.path.exists(path): os.makedirs(path) filepath = os.path.join(path, filename) + '.txt' # xlpath = os.path.join(path, filename) + '.xlsx' # excelwriter = pd.ExcelWriter(xlpath) # vc_utils.create_change_info_sheet(excelwriter, modela, modelb) problem_sections = [ '[TITLE]', '[CURVES]', '[TIMESERIES]', '[RDII]', '[HYDROGRAPHS]' ] with open(filepath, 'w') as newf: #write meta data metadata = { #'Baseline Model':modela.inp.path, #'ID':filename, 'Parent Models': { 'Baseline': { inpA: vc_utils.modification_date(inpA) }, 'Alternatives': { inpB: vc_utils.modification_date(inpB) } }, 'Log': { filename: comments } } #print metadata vc_utils.write_meta_data(newf, metadata) for section in allsections_a['order']: if section not in problem_sections: #calculate the changes in the current section changes = INPDiff(modela, modelb, section) data = pd.concat( [changes.removed, changes.added, changes.altered]) #vc_utils.write_excel_inp_section(excelwriter, allsections_a, section, data) vc_utils.write_inp_section( newf, allsections_a, section, data, pad_top=False, na_fill='NaN') #na fill fixes SNOWPACK blanks spaces issue
def create_inp_build_instructions(inpA, inpB, path, filename, comments=''): """ pass in two inp file paths and produce a spreadsheet showing the differences found in each of the INP sections. These differences should then be used whenever we need to rebuild this model from the baseline reference model. Note: this should be split into a func that creates a overall model "diff" that can then be written as a BI file or used programmatically """ allsections_a = funcs.complete_inp_headers(inpA) modela = swmmio.Model(inpA) modelb = swmmio.Model(inpB) #create build insructions folder if not os.path.exists(path): os.makedirs(path) filepath = os.path.join(path, filename) + '.txt' # xlpath = os.path.join(path, filename) + '.xlsx' # excelwriter = pd.ExcelWriter(xlpath) # vc_utils.create_change_info_sheet(excelwriter, modela, modelb) problem_sections = ['[TITLE]', '[CURVES]', '[TIMESERIES]', '[RDII]', '[HYDROGRAPHS]'] with open (filepath, 'w') as newf: #write meta data metadata = { #'Baseline Model':modela.inp.path, #'ID':filename, 'Parent Models':{ 'Baseline':{inpA:vc_utils.modification_date(inpA)}, 'Alternatives':{inpB:vc_utils.modification_date(inpB)} }, 'Log':{filename:comments} } #print metadata vc_utils.write_meta_data(newf, metadata) for section in allsections_a['order']: if section not in problem_sections: #calculate the changes in the current section changes = INPDiff(modela, modelb, section) data = pd.concat([changes.removed, changes.added, changes.altered]) #vc_utils.write_excel_inp_section(excelwriter, allsections_a, section, data) vc_utils.write_inp_section(newf, allsections_a, section, data, pad_top=False, na_fill='NaN') #na fill fixes SNOWPACK blanks spaces issue
def propagate_changes_from_baseline(baseline_dir, alternatives_dir, combi_dir, version_id='', comments=''): #stuff """ if the baseline model has changes that need to be propogated to all models, iterate through each model and rebuild the INPs with the new baseline and existing build instructions. update the build instructions to reflect the revision date of the baseline. """ version_id += '_' + datetime.now().strftime("%y%m%d%H%M%S") #collect the directories of all models #model_dirs = [os.listdir(os.path.join(alternatives_dir, x)) for x in os.listdir(alternatives_dir)] model_dirs = [ ] #[os.path.join(alternatives_dir, alt, imp_level) for imp_level in os.listdir(os.path.join(alternatives_dir, alt)) for alt in os.listdir(alternatives_dir)] for alt in os.listdir(alternatives_dir): #print alt #iterate through each implementation level of each alternative for imp_level in os.listdir(os.path.join(alternatives_dir, alt)): #create or refresh the build instructions file for the alternatives model_dirs.append(os.path.join(alternatives_dir, alt, imp_level)) model_dirs += [os.path.join(combi_dir, x) for x in os.listdir(combi_dir)] #print model_dirs baseline = Model(baseline_dir) baseinp = baseline.inp.filePath for model_dir in model_dirs: model = Model(model_dir) vc_directory = os.path.join(model_dir, 'vc') latest_bi = vc_utils.newest_file(vc_directory) #update build instructions metdata and build the new inp bi = inp.BuildInstructions(latest_bi) bi.metadata['Parent Models']['Baseline'] = { baseinp: vc_utils.modification_date(baseinp) } bi.metadata['Log'].update({version_id: comments}) bi.save(vc_directory, version_id + '.txt') print 'rebuilding {} with changes to baseline'.format(model.name) bi.build(baseline_dir, model.inp.filePath) #overwrite old inp
def propagate_changes_from_baseline(baseline_dir, alternatives_dir, combi_dir, version_id='', comments=''): #stuff """ if the baseline model has changes that need to be propogated to all models, iterate through each model and rebuild the INPs with the new baseline and existing build instructions. update the build instructions to reflect the revision date of the baseline. """ version_id += '_' + datetime.now().strftime("%y%m%d%H%M%S") #collect the directories of all models model_dirs = [] for alt in os.listdir(alternatives_dir): #print alt #iterate through each implementation level of each alternative for imp_level in os.listdir(os.path.join(alternatives_dir, alt)): #create or refresh the build instructions file for the alternatives model_dirs.append(os.path.join(alternatives_dir, alt, imp_level)) model_dirs += [os.path.join(combi_dir, x) for x in os.listdir(combi_dir)] #print model_dirs baseline = Model(baseline_dir) baseinp = baseline.inp.path for model_dir in model_dirs: model = Model(model_dir) vc_directory = os.path.join(model_dir, 'vc') latest_bi = vc_utils.newest_file(vc_directory) #update build instructions metdata and build the new inp bi = inp.BuildInstructions(latest_bi) bi.metadata['Parent Models']['Baseline'] = {baseinp:vc_utils.modification_date(baseinp)} bi.metadata['Log'].update({version_id:comments}) bi.save(vc_directory, version_id+'.txt') print('rebuilding {} with changes to baseline'.format(model.name)) bi.build(baseline_dir, model.inp.path) #overwrite old inp