<reponame>DougRogers-DigitalFish/USD<filename>pxr/usdImaging/usdAppUtils/complexityArgs.py
#
# Copyright 2019 Pixar
#
# Licensed under the Apache License, Version 2.0 (the "Apache License")
# with the following modification; you may not use this file except in
# compliance with the Apache License and the following modification to it:
# Section 6. Trademarks. is deleted and replaced with:
#
# 6. Trademarks. This License does not grant permission to use the trade
#    names, trademarks, service marks, or product names of the Licensor
#    and its affiliates, except as required to comply with Section 4(c) of
#    the License and to reproduce the content of the NOTICE file.
#
# You may obtain a copy of the Apache License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the Apache License with the above modification is
# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the Apache License for the specific
# language governing permissions and limitations under the Apache License.
#

class RefinementComplexities(object):
    """
    An enum-like container of standard complexity settings.
    """

    class _RefinementComplexity(object):
        """
        Class which represents a level of mesh refinement complexity. Each
        level has a string identifier, a display name, and a float complexity
        value.
        """

        def __init__(self, compId, name, value):
            self._id = compId
            self._name = name
            self._value = value

        def __repr__(self):
            return self.id

        @property
        def id(self):
            return self._id

        @property
        def name(self):
            return self._name

        @property
        def value(self):
            return self._value

    LOW = _RefinementComplexity("low", "Low", 1.0)
    MEDIUM = _RefinementComplexity("medium", "Medium", 1.1)
    HIGH = _RefinementComplexity("high", "High", 1.2)
    VERY_HIGH = _RefinementComplexity("veryhigh", "Very High", 1.3)

    _ordered = (LOW, MEDIUM, HIGH, VERY_HIGH)

    @classmethod
    def ordered(cls):
        """
        Get a tuple of all complexity levels in order.
        """
        return cls._ordered

    @classmethod
    def fromId(cls, compId):
        """
        Get a complexity from its identifier.
        """
        matches = [comp for comp in cls._ordered if comp.id == compId]
        if len(matches) == 0:
            raise ValueError("No complexity with id '{}'".format(compId))
        return matches[0]

    @classmethod
    def fromName(cls, name):
        """
        Get a complexity from its display name.
        """
        matches = [comp for comp in cls._ordered if comp.name == name]
        if len(matches) == 0:
            raise ValueError("No complexity with name '{}'".format(name))
        return matches[0]

    @classmethod
    def next(cls, comp):
        """
        Get the next highest level of complexity. If already at the highest
        level, return it.
        """
        if comp not in cls._ordered:
            raise ValueError("Invalid complexity: {}".format(comp))
        nextIndex = min(
            len(cls._ordered) - 1,
            cls._ordered.index(comp) + 1)
        return cls._ordered[nextIndex]

    @classmethod
    def prev(cls, comp):
        """
        Get the next lowest level of complexity. If already at the lowest
        level, return it.
        """
        if comp not in cls._ordered:
            raise ValueError("Invalid complexity: {}".format(comp))
        prevIndex = max(0, cls._ordered.index(comp) - 1)
        return cls._ordered[prevIndex]


def AddCmdlineArgs(argsParser, defaultValue=RefinementComplexities.LOW,
        altHelpText=''):
    """
    Adds complexity-related command line arguments to argsParser.

    The resulting 'complexity' argument will be one of the standard
    RefinementComplexities.
    """
    helpText = altHelpText
    if not helpText:
        helpText = ('level of refinement to use (default=%(default)s)')

    argsParser.add_argument('--complexity', '-c', action='store',
        type=RefinementComplexities.fromId,
        default=defaultValue,
        choices=[c for c in RefinementComplexities.ordered()],
        help=helpText)

#
# Copyright 2019 Pixar
#
# Licensed under the Apache License, Version 2.0 (the "Apache License")
# with the following modification; you may not use this file except in
# compliance with the Apache License and the following modification to it:
# Section 6. Trademarks. is deleted and replaced with:
#
# 6. Trademarks. This License does not grant permission to use the trade
#    names, trademarks, service marks, or product names of the Licensor
#    and its affiliates, except as required to comply with Section 4(c) of
#    the License and to reproduce the content of the NOTICE file.
#
# You may obtain a copy of the Apache License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the Apache License with the above modification is
# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the Apache License for the specific
# language governing permissions and limitations under the Apache License.
#

class RefinementComplexities(object):
    """
    An enum-like container of standard complexity settings.
    """

    class _RefinementComplexity(object):
        """
        Class which represents a level of mesh refinement complexity. Each
        level has a string identifier, a display name, and a float complexity
        value.
        """

        def __init__(self, compId, name, value):
            self._id = compId
            self._name = name
            self._value = value

        def __repr__(self):
            return self.id

        @property
        def id(self):
            return self._id

        @property
        def name(self):
            return self._name

        @property
        def value(self):
            return self._value

    LOW = _RefinementComplexity("low", "Low", 1.0)
    MEDIUM = _RefinementComplexity("medium", "Medium", 1.1)
    HIGH = _RefinementComplexity("high", "High", 1.2)
    VERY_HIGH = _RefinementComplexity("veryhigh", "Very High", 1.3)

    _ordered = (LOW, MEDIUM, HIGH, VERY_HIGH)

    @classmethod
    def ordered(cls):
        """
        Get a tuple of all complexity levels in order.
        """
        return cls._ordered

    @classmethod
    def fromId(cls, compId):
        """
        Get a complexity from its identifier.
        """
        matches = [comp for comp in cls._ordered if comp.id == compId]
        if len(matches) == 0:
            raise ValueError("No complexity with id '{}'".format(compId))
        return matches[0]

    @classmethod
    def fromName(cls, name):
        """
        Get a complexity from its display name.
        """
        matches = [comp for comp in cls._ordered if comp.name == name]
        if len(matches) == 0:
            raise ValueError("No complexity with name '{}'".format(name))
        return matches[0]

    @classmethod
    def next(cls, comp):
        """
        Get the next highest level of complexity. If already at the highest
        level, return it.
        """
        if comp not in cls._ordered:
            raise ValueError("Invalid complexity: {}".format(comp))
        nextIndex = min(
            len(cls._ordered) - 1,
            cls._ordered.index(comp) + 1)
        return cls._ordered[nextIndex]

    @classmethod
    def prev(cls, comp):
        """
        Get the next lowest level of complexity. If already at the lowest
        level, return it.
        """
        if comp not in cls._ordered:
            raise ValueError("Invalid complexity: {}".format(comp))
        prevIndex = max(0, cls._ordered.index(comp) - 1)
        return cls._ordered[prevIndex]


def AddCmdlineArgs(argsParser, defaultValue=RefinementComplexities.LOW,
        altHelpText=''):
    """
    Adds complexity-related command line arguments to argsParser.

    The resulting 'complexity' argument will be one of the standard
    RefinementComplexities.
    """
    helpText = altHelpText
    if not helpText:
        helpText = ('level of refinement to use (default=%(default)s)')

    argsParser.add_argument('--complexity', '-c', action='store',
        type=RefinementComplexities.fromId,
        default=defaultValue,
        choices=[c for c in RefinementComplexities.ordered()],
        help=helpText)
# # Copyright 2019 Pixar # # Licensed under the Apache License, Version 2.0 (the "Apache License") # with the following modification; you may not use this file except in # compliance with the Apache License and the following modification to it: # Section 6. Trademarks. is deleted and replaced with: # # 6. Trademarks. This License does not grant permission to use the trade #    names, trademarks, service marks, or product names of the Licensor #    and its affiliates, except as required to comply with Section 4(c) of #    the License and to reproduce the content of the NOTICE file. # # You may obtain a copy of the Apache License at # #     http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the Apache License with the above modification is # distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY # KIND, either express or implied. See the Apache License for the specific # language governing permissions and limitations under the Apache License. # An enum-like container of standard complexity settings. Class which represents a level of mesh refinement complexity. Each         level has a string identifier, a display name, and a float complexity         value. Get a tuple of all complexity levels in order. Get a complexity from its identifier. Get a complexity from its display name. Get the next highest level of complexity. If already at the highest         level, return it. Get the next lowest level of complexity. If already at the lowest         level, return it. Adds complexity-related command line arguments to argsParser.      The resulting 'complexity' argument will be one of the standard     RefinementComplexities.