def find_multi_mod_folders(self): """ Some mods contain many mas files in a folder, e.g. F1_1988_Tracks Try to spot them by checking the number of mas files in a revision folder. Mod folder structure is <mod name>\<revision>\*.mas The REAL test is to look for more than one .SCN file for tracks and .VEH files for cars (also found in all_vehicles.ini) rF2 installed_folder: 'vehicles' or 'locations' """ rF2_dir = os.path.join(rF2root, 'Installed') _mods = getListOfFiles(os.path.join(rF2_dir, self.installed_folder), pattern='*', recurse=False) multi_mas = list() multi_mfts = list() for _mod_folder, _mod in _mods: _revs = getListOfFiles(_mod_folder, pattern='*', recurse=False) for _rev in _revs: _mas_files = getListOfFiles(_rev[0], pattern='*.mas', recurse=True) if len(_mas_files) > 10: multi_mas.append(_mod) _mft_files = getListOfFiles(_rev[0], pattern='*.mft', recurse=True) multi_mfts += _mft_files pass return multi_mas, multi_mfts
def changeCar(vehPath=r'Norma_M30-LMP3_2017\1.51', vehName='NORMAM30_08'): if vehName == '': return "VehFile not in rFactory's car data file.\nPlease edit entry" # if vehPath is for example Installed\vehicles\Norma_M30-LMP3_2017\1.50 # check for Installed\vehicles\Norma_M30-LMP3_2017\1.51 # which is an update. We have to use that. try: _vehFile = os.path.join(rF2root, vehPath) _vehPath, __ = os.path.split(_vehFile) _versions = getListOfFiles(_vehPath, '*.*') _vehPath = _versions[-1][0] except BaseException: return "Data file error '%s'" % _vehFile _vehFile = os.path.join(_vehPath, vehName).replace( '\\', '\\\\\\\\') # +'.veh' no longer required allTracks = os.path.join(rF2root, r'UserData\player\All Tracks & Cars.cch') _text3, error = readFile(allTracks) _edit3 = [r'( *SinglePlayerVehicle *=).*', r'\1"' + _vehFile + '"'] _edit5 = [r'( *SinglePlayerFilter *=).*', r'\1""'] # blank it _edited = __edit(_text3, [_edit3, _edit5], doubleSlash=False) writeFile(allTracks, _edited) return 'OK'
def get_data_files_and_timestamps(self): """ rFactory datafiles_folder: 'CarDatafilesFolder' or 'TrackDatafilesFolder' """ _mft_files = getListOfFiles(self.datafiles_folder, pattern='*.txt', recurse=False) self.data_files_and_timestamps = dict() for folder in _mft_files: _timestamp = os.path.getmtime(folder[0]) self.data_files_and_timestamps[folder[0].lower()] = _timestamp return self.data_files_and_timestamps
def dir_files_in_mas_files(self, folder): """ Dict of mas files and the files they contain """ masFiles = getListOfFiles(folder, '*.mas') _pop = os.getcwd() # save current directory os.chdir(os.path.dirname(masFiles[0][0])) files = dict() for mas in masFiles: # We need to record mas file name as well files[mas[1]] = self.dir_files_in_single_mas_file(mas[1]) os.chdir(_pop) return files
def get_mfts_and_timestamps(self): """ rF2 installed_folder: 'vehicles' or 'locations' """ rF2_dir = os.path.join(rF2root, 'Installed') _mft_files = getListOfFiles(os.path.join(rF2_dir, self.installed_folder), pattern='*.mft', recurse=True) self.mfts_and_timestamps = dict() for folder in _mft_files: _folder = folder[0].lower() # os.path.dirname( _timestamp = os.path.getmtime(_folder) self.mfts_and_timestamps[_folder] = _timestamp return self.mfts_and_timestamps
def find_single_mod_folders(self): """ Find ALL folders with .MFT files then subtract multi-mod folders Looks like none of the multifold rF2 installed_folder: 'vehicles' or 'locations' """ rF2_dir = os.path.join(rF2root, 'Installed') all_mfts = getListOfFiles(os.path.join(rF2_dir, self.installed_folder), pattern='*.mft', recurse=True) self.multis, multi_mfts = self.find_multi_mod_folders() # all_mfts, list of folder, mft tuples # self.multis, list of folders # multi_mfts, list of folder, mft tuples for mmft in multi_mfts: for i, mft in enumerate(all_mfts): if mft[1] == mmft[1]: del all_mfts[i] return all_mfts
def __init__(self, parentFrame): """ Put this into the parent frame """ self.settings = {} self.vars = {} xPadding = 10 ############################################# vehicles_path = os.path.join(rF2root, 'Installed', 'Vehicles') vehicles = getListOfFiles(vehicles_path, pattern='*') tkFrame_vehicles = tk.LabelFrame(parentFrame, text='Vehicles', padx=xPadding) tkFrame_vehicles.grid(column=0, row=0, sticky='ew') # find the widest v = [x[1] for x in vehicles] w = max(v, key=len) self.tkVehicleListbox = tk.Listbox(tkFrame_vehicles, selectmode=tk.EXTENDED, width=len(w) - 2, height=min(20, len(vehicles))) self.tkVehicleListbox.grid(rowspan=2) # tkVehicleScrollbar = tk.Scrollbar(tkFrame_vehicles, orient="vertical") tkVehicleScrollbar.config(command=self.tkVehicleListbox.yview) tkVehicleScrollbar.grid(column=1, row=0, sticky='ns', rowspan=2) for __, _v in vehicles: self.tkVehicleListbox.insert(tk.END, _v) self.tkVehicleListbox.activate(1) if _main: # Double click selects the server self.tkVehicleListbox.bind("<Double-Button-1>", self.copy_vehicles) ############################################ tk.Button(tkFrame_vehicles, text="=>", command=self.copy_vehicles).\ grid(column=2, row=0, pady=20, padx=xPadding) tk.Button(tkFrame_vehicles, text="<=", command=self.uncopy_vehicles).\ grid(column=2, row=1, pady=20, padx=xPadding) ############################################# self.tkSelectedVehicleListbox = tk.Listbox(tkFrame_vehicles, selectmode=tk.EXTENDED, width=20, height=min( 20, len(vehicles))) self.tkSelectedVehicleListbox.grid(column=3, row=0, rowspan=2) ############################################# ############################################# locations_path = os.path.join(rF2root, 'Installed', 'Locations') locations = getListOfFiles(locations_path, pattern='*') tkFrame_locations = tk.LabelFrame(parentFrame, text='Locations', padx=xPadding) tkFrame_locations.grid(column=2, row=0, sticky='ew') # find the widest l = [x[1] for x in locations] w = max(l, key=len) self.tkLocationListbox = tk.Listbox(tkFrame_locations, selectmode=tk.EXTENDED, width=len(w) - 2, height=min(20, len(locations))) self.tkLocationListbox.grid(rowspan=2) # tkLocationScrollbar = tk.Scrollbar(tkFrame_locations, orient="vertical") tkLocationScrollbar.config(command=self.tkLocationListbox.yview) tkLocationScrollbar.grid(column=1, row=0, sticky='ns', rowspan=2) for __, _v in locations: self.tkLocationListbox.insert(tk.END, _v) self.tkLocationListbox.activate(1) if _main: # Double click selects the server self.tkLocationListbox.bind("<Double-Button-1>", self.copy_locations) ############################################ tk.Button(tkFrame_locations, text="=>", command=self.copy_locations).\ grid(column=2, row=0, pady=20, padx=xPadding) tk.Button(tkFrame_locations, text="<=", command=self.uncopy_locations).grid(column=2, row=1, pady=20, padx=xPadding) ############################################# self.tkSelectedLocationListbox = tk.Listbox(tkFrame_locations, selectmode=tk.EXTENDED, width=20, height=min( 20, len(locations))) self.tkSelectedLocationListbox.grid(column=3, row=0, rowspan=2)
def multi_mod(self, folder): """ Multiple mods in one folder with a single MFT file Generator function, returns one mod each time Generator version broke when run in VS debugger, OK when run as Python file or exe for _tags, cache_write in tdf.multi_mod(folder): """ rF2_dir = os.path.join(rF2root, 'Installed') mft_files = getListOfFiles(os.path.join(rF2_dir, self.installed_folder, folder), pattern='*.mft', recurse=True) mas_files = getListOfFiles(os.path.join(rF2_dir, self.installed_folder, folder), pattern='*.mas', recurse=True) results = list() for _mod in mas_files: cache_write = False _mft_tags = self._get_mft_tags(mft_files[0][0]) # Get the name if 'Date' in _mft_tags: _mft_tags['Date'] = translate_date(_mft_tags['Date']) else: _mft_tags['Date'] = '' _mft_tags['Name'] = _mod[1][:-4] cached_tag_name = _mft_tags['Name'] cached_tags = self.cache_o.get_values(cached_tag_name) if not cached_tags: # Newly-installed mod files = self.dir_files_in_single_mas_file(_mod[0]) if 'Track Name' in _mft_tags: del _mft_tags['Track Name'] for _tag, _val in _mft_tags.items(): cached_tags[_tag] = _val cached_tags['Rating'] = '***' # Default cached_tags, cache_write = self._read_mas_file( cached_tags, _mod[0], files) if cache_write: cached_tags['strippedName'] = cached_tags['Name'] cached_tags = parse_name(cached_tags) cached_tags = parse_mfr_model(cached_tags) for tag, val in cached_tags.items(): self.cache_o.set_value(cached_tag_name, tag, val) if 'Latitude' in cached_tags: # It's a track tag = 'Track Name' val = cached_tags['strippedName'].replace('_', ' ').strip() cached_tags[tag] = val self.cache_o.set_value(cached_tag_name, tag, val) else: if not _mod[0] + '\n' in self.unusable_mas_files: self.unusable_mas_files.append(_mod[0] + '\n') writeFile(unusableMasFilesFile, self.unusable_mas_files) if cache_write: for tag, val in _mft_tags.items(): self.cache_o.set_value(cached_tag_name, tag, val) for _tag in []: # ['Desc', 'Name', 'strippedName']: if _tag in _mft_tags: cached_tags[_tag] = _mft_tags[_tag] results.append([cached_tags, cache_write]) return results