Пример #1
0
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)
Пример #2
0
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()
Пример #3
0
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()
Пример #4
0
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()
Пример #5
0
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