class SceneFile(object): """An abstract representation of a Scene file.""" def __init__(self, path=None): self.folder_path = Path() self.descriptor = 'main' self.task = None self.ver = 1 self.ext = '.ma' scene = pmc.system.sceneName() if not path and scene: path = scene if not path and not scene: log.warning("Unable to initalise SceneFile object from a new" "scene. Please specify a path.") return self._init_from_path(path) @property def filename(self): pattern = "{descriptor}_{task}_v{ver:03d}{ext}" return pattern.format(descriptor=self.descriptor, task=self.task, ver=self.ver, ext=self.ext) @property def path(self): return self.folder_path / self.filename def _init_from_path(self, path): path = Path(path) self.folder_path = path.parent self.ext = path.ext self.descriptor, self.task, ver = path.name.stripext().split("_") self.ver = int(ver.split("v")[-1]) def save(self): """Saves the scene file. Returns: Path: The path to the scene if successful. """ try: return pmc.system.saveAs(self.path) except RuntimeError as err: log.warning("Missing directories in path. Creating directories...") self.folder_path.makedirs_p() return pmc.system.saveAs(self.path)
class SceneFile(object): """An abstract representation of a Scene file.""" def __init__(self, path=None): self.folder_path = Path() self.descriptor = 'main' self.task = None self.ver = 1 self.ext = '.ma' scene = pmc.system.sceneName() if not path and scene: path = scene if not path and not scene: log.warning("Unable to initialize SceneFile object from a new " "scene. Please specify a path.") return self._init_from_path(path) @property def filename(self): pattern = "{descriptor}_{task}_v{ver:03d}{ext}" return pattern.format(descriptor=self.descriptor, task=self.task, ver=self.ver, ext=self.ext) @property def path(self): return self.folder_path / self.filename def _init_from_path(self, path): path = Path(path) self.folder_path = path.parent self.ext = path.ext self.descriptor, self.task, ver = path.name.stripext().split("_") self.ver = int(ver.split("v")[-1]) def save(self): """Saves the scene file. Returns: Path: The path to the scene file if successful """ try: return pmc.system.saveAs(self.path) except RuntimeError as err: log.warning("Missing directories in path. Creating directories...") self.folder_path.makedirs_p() return pmc.system.saveAs(self.path) def next_avail_ver(self): """Return the next available version number in the folder.""" pattern = "{descriptor}_{task}_v*{ext}".format( descriptor=self.descriptor, task=self.task, ext=self.ext) matching_scenefiles = [] for file_ in self.folder_path.files(): if file_.name.fnmatch(pattern): matching_scenefiles.append(file_) if not matching_scenefiles: return 1 matching_scenefiles.sort(reverse=True) latest_scenefile = matching_scenefiles[0] latest_scenefile = latest_scenefile.name.stripext() latest_ver_num = int(latest_scenefile.split("_v")[-1]) return latest_ver_num + 1 def increment_save(self): """Increments the version and saves the scene file. If the existing version of a file already exist, it should increment from the largest version number available in the folder. Returns: Path: The path to the scene file if successful """ self.ver = self.next_avail_ver() self.save()
class SceneFile(object): def __init__(self, path=None): self.folder_path = Path() self.descriptor = 'main' self.task = None self.ver = 1 self.ext = '.ma' scene = pmc.system.sceneName() if not path and scene: path = scene if not path and not scene: log.warning("Unable to initialise SceneFile object from an new scene." "please specify a path.") return self._init_from_path(path) @property def filename(self): pattern = "{descriptor}_{task}_v{ver:03d}{ext}" return pattern.format(descriptor=self.descriptor, task=self.task, ver=self.ver, ext=self.ext) @property def path(self): return self.folder_path / self.filename def _init_from_path(self, path): path = Path(path) self.folder_path = path.parent self.ext = path.ext self.descriptor, self.task, ver = path.name.stripext().split("_") self.ver = int(ver.split("v")[-1]) def save(self): try: return pmc.system.saveAs(self.path) except RuntimeError: log.warning("Missing directories in path. Creating folders...") self.folder_path.makedirs_p() return pmc.system.saveAs(self.path) def next_avail_ver(self): pattern = "{descriptor}_{task}_v*{ext}".format(descriptor=self.descriptor, task=self.task, ext=self.ext) matching_scenefiles = [] for file_ in self.folder_path.files(): if file_.name.fnmatch(pattern): matching_scenefiles.append(file_) if not matching_scenefiles: return 1 matching_scenefiles.sort(reverse=True) latest_scenefile = matching_scenefiles[0] latest_scenefile = latest_scenefile.name.stripext() latest_ver_num = int(latest_scenefile.split("_v")[-1]) return latest_ver_num + 1 def increment_save(self): self.ver += self.next_avail_ver() self.save()
class SceneFile(object): """This class represents a DCC software scene file Predefine naming conventions when naming new methods. Attributes: dir (str, optional): Directory to scene file, defaults to '' descriptor (str, optional): Short descriptor of scene file, defaults to "main" version (int, optional): Version number, defaults to 1 ext (str, optional): Extension. Defaults to "ma" """ def __init__(self, dir='', descriptor='main', version=1, ext="ma"): """Defines class properties when created (like constructor)""" filePath = Path( os.path.normpath( cmds.file(query=True, sn=True, shortName=False, withoutCopyNumber=True))) filePathSplit = os.path.split(filePath) regex = r'([a-zA-Z]+)_v([0-9]+).([a-z]+)' if (re.match(regex, filePathSplit[1])): filePathDescriptor = filePathSplit[1].split("_") filePathVersion = filePathDescriptor[1].split(".") filePathNum = self._extractNum(filePathVersion[0]) self._dir = Path(filePathSplit[0]) self.descriptor = filePathDescriptor[0] self.version = filePathNum self.ext = filePathVersion[1] else: self._dir = dir self.descriptor = descriptor self.version = version self.ext = ext @property def dir(self): return Path(self._dir) @dir.setter def dir(self, arg): self._dir = Path(arg) def basename(self): """Returns a scene file name as a string e.g. ship_v001.ma""" name_pattern = "{descriptor}_v{version:03d}.{ext}" name = name_pattern.format(descriptor=self.descriptor, version=self.version, ext=self.ext) return name def path(self): """Returns a path to scene file""" return Path(self.dir) / self.basename() def _parseFile(self, fileNames, searchVal): """Returns highest number associated with matching search value""" highestValue = -1 for file in fileNames: f_split = file.split(".") f_Version = f_split[0].split("_") if len(f_Version) < 2: pass elif searchVal in f_Version: for el in f_Version: test = self._extractNum(el) if test > highestValue: highestValue = test print(highestValue) return highestValue def _extractNum(self, x): """Extracts all digits in a string, then returns as an integer""" str = ''.join(filter(lambda i: i.isdigit(), x)) if str == '': str = '0' return int(str) def save(self): """Saves the scene file. Returns: :obj:'Path': Path to scene file, or None otherwise""" try: pmc.system.saveAs(self.path()) except RuntimeError: log.warning("Directory missing. Generating new directory...") self._dir.makedirs_p() pmc.system.saveAs(self.path()) pass def increment_and_save(self): """Detects any existing files, and determines the next version to save""" allFiles = os.listdir(self.dir) saveVersion = self._parseFile(allFiles, self.descriptor) if saveVersion == -1: self.version = 1 self.save() else: print(self.version) saveVersion = saveVersion + 1 self.version = saveVersion print(self.version) self.save()
class SceneFile(object): """Initialises attributes when class is instantiated""" def __init__(self, dir='', descriptor='main', version=1, ext="ma"): if pmc.system.isModified(): self.dir = Path(dir) self.descriptor = descriptor self.version = version self.ext = ext else: temp_path = Path(pmc.system.sceneName()) self.dir = temp_path.parent file_name = temp_path.name file_part = file_name.split("_v") if len(file_part) != 2: raise RuntimeError("File name must contain _v") self.descriptor = file_part[0] version = file_part[1].split(".")[0] self.version = int(version) self.ext = file_part[1].split(".")[1] @property def dir(self): return self._dir @dir.setter def dir(self, val): self._dir = Path(val) """Return a scene file name""" def basename(self): name_pattern = "{descriptor}_v{version:03d}.{ext}" name = name_pattern.format(descriptor=self.descriptor, version=self.version, ext=self.ext) return name """Retuns a path to scene file""" def path(self): return Path(self.dir) / self.basename() """Saves the scene file""" def save(self): try: pmc.system.saveAs(self.path()) except RuntimeError: log.warning("Missing directories. Creating directories.") self.dir.makedirs_p() pmc.system.saveAs(self.path()) """Increments the version and saves the scene file, incrementing from next largest number available.""" def increment_and_save(self): files_list = self.dir.listdir() scene_list = list() for file in files_list: file_path = Path(file) scene = file_path.name if self.is_scene_file(scene): scene_list.append(scene) new_version = self.version current_scenes = [ x for x in scene_list if x.split("_v")[0] == self.descriptor ] for scene in current_scenes: version_name = scene.split("_v")[1].split(".")[0] version = int(version_name) if version > self.version: new_version = version self.version = new_version + 1 self.save() def is_scene_file(self, filename): file_parts = filename.split("_v") if len(file_parts) != 2: return False file_version = file_parts[1].split(".") if len(file_version) != 2: return False if file_version[1] != "ma": return False if len(file_version[0]) != 3 or not file_version[0].isdigit(): return False return True