Skip to content

exposure_classes

codes.eurocode.en_1992_1_1_2004.chapter_4_durability_and_cover._base_classes.exposure_classes

Module for the concrete exposure classes according to Table 4.1 from EN 1992-1-1: Chapter 4 - Durability and cover to reinforcement.

Classes:

  • Exposure

    Parent class for individual exposure classes.

  • ExposureClassesBase

    Parent class which serves as a container for the Exposure classes.

codes.eurocode.en_1992_1_1_2004.chapter_4_durability_and_cover._base_classes.exposure_classes.Exposure

Bases: Enum

Parent class for individual exposure classes.

This class handles the ordering/comparison operations, that's why it is decorated with total_ordering (As recommended by PEP8). On top of that, it handles a couple of methods which will be used by its subclasses.

codes.eurocode.en_1992_1_1_2004.chapter_4_durability_and_cover._base_classes.exposure_classes.Exposure.description_of_the_environment abstractmethod

description_of_the_environment() -> str

Description of the environment based on the instance.

Returns:

  • str

    description of the environment based on the instance

Source code in blueprints/codes/eurocode/en_1992_1_1_2004/chapter_4_durability_and_cover/_base_classes/exposure_classes.py
112
113
114
115
116
117
118
119
120
@abstractmethod
def description_of_the_environment(self) -> str:
    """Description of the environment based on the instance.

    Returns
    -------
    str
        description of the environment based on the instance
    """

codes.eurocode.en_1992_1_1_2004.chapter_4_durability_and_cover._base_classes.exposure_classes.Exposure.exposure_class_description abstractmethod staticmethod

exposure_class_description() -> str

Description of subclasses to be implemented in each subclass.

Returns:

  • str

    description of the specific exposure class

Source code in blueprints/codes/eurocode/en_1992_1_1_2004/chapter_4_durability_and_cover/_base_classes/exposure_classes.py
101
102
103
104
105
106
107
108
109
110
@staticmethod
@abstractmethod
def exposure_class_description() -> str:
    """Description of subclasses to be implemented in each subclass.

    Returns
    -------
    str
        description of the specific exposure class
    """

codes.eurocode.en_1992_1_1_2004.chapter_4_durability_and_cover._base_classes.exposure_classes.Exposure.notation classmethod

notation() -> str

Returns the notation of the exposure class.

Returns:

  • str

    notation of the exposure class, e.g. "XC", "XD", etc.

Source code in blueprints/codes/eurocode/en_1992_1_1_2004/chapter_4_durability_and_cover/_base_classes/exposure_classes.py
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
@classmethod
def notation(cls) -> str:
    """Returns the notation of the exposure class.

    Returns
    -------
    str
        notation of the exposure class, e.g. "XC", "XD", etc.
    """
    options = cls.options()
    # Look for this pattern in the options: Uppercase letters followed by at least one digit
    # If the pattern is found, return the Uppercase letters part
    for option in options:
        match = re.match(r"([A-Z]+)(\d+)", option)
        if match:
            return match.group(1)
    raise ValueError(
        f"No valid notation found for {cls.__name__}.\n"
        "Either adhere to the pattern of Uppercase letters followed by at least one digit for Enum values, "
        "or implement the notation method in the subclass."
    )

codes.eurocode.en_1992_1_1_2004.chapter_4_durability_and_cover._base_classes.exposure_classes.Exposure.options classmethod

options() -> list[str]

Return all the possible options within a subclass.

Returns:

  • list[str]

    all the possible class designations within a specific exposure class

Source code in blueprints/codes/eurocode/en_1992_1_1_2004/chapter_4_durability_and_cover/_base_classes/exposure_classes.py
90
91
92
93
94
95
96
97
98
99
@classmethod
def options(cls) -> list[str]:
    """Return all the possible options within a subclass.

    Returns
    -------
    list[str]
        all the possible class designations within a specific exposure class
    """
    return [m._value_ for m in cls.__members__.values()]

codes.eurocode.en_1992_1_1_2004.chapter_4_durability_and_cover._base_classes.exposure_classes.Exposure.snake_case classmethod

snake_case() -> str

Converts the name of a subclass to snake_case which can be used in a parametrization class.

Returns:

  • str

    the name of a subclass in snake_case

Source code in blueprints/codes/eurocode/en_1992_1_1_2004/chapter_4_durability_and_cover/_base_classes/exposure_classes.py
122
123
124
125
126
127
128
129
130
131
@classmethod
def snake_case(cls) -> str:
    """Converts the name of a subclass to snake_case which can be used in a parametrization class.

    Returns
    -------
    str
        the name of a subclass in snake_case
    """
    return re.sub(r"(?<!^)(?=[A-Z])", "_", cls.__name__).lower()

codes.eurocode.en_1992_1_1_2004.chapter_4_durability_and_cover._base_classes.exposure_classes.ExposureClassesBase dataclass

ExposureClassesBase()

Parent class which serves as a container for the Exposure classes.

Exposure classes related to environmental conditions in accordance with EN 206-1

codes.eurocode.en_1992_1_1_2004.chapter_4_durability_and_cover._base_classes.exposure_classes.ExposureClassesBase.no_risk property

no_risk: bool

Check if all exposure classes are 'Not applicable' (specified by _not_applicable_key).

This represents X0 class designation according to table 4.1 from EN 1992-1-1:2004.

Returns:

  • bool

    True if all exposure classes are equal to _not_applicable_key ("Not applicable" by default)

codes.eurocode.en_1992_1_1_2004.chapter_4_durability_and_cover._base_classes.exposure_classes.ExposureClassesBase.from_exposure_list classmethod

from_exposure_list(exposure_classes: Sequence[str]) -> Self

Create an instance from a sequence of exposure classes.

Examples:

>>> exposure_classes = ["XC1", "XD1", "XS1"]
>>> ConcreteExposureClasses().from_exposure_list(exposure_classes)
ConcreteExposureClasses(
    carbonation=<Carbonation.XC1: 'XC1'>,
    chloride=<Chloride.XD1: 'XD1'>,
    chloride_seawater=<ChlorideSeawater.XS1: 'XS1'>,
    freeze_thaw=<FreezeThaw.NA: 'Not applicable'>,
    chemical=<Chemical.NA: 'Not applicable'>
)

Parameters:

  • exposure_classes (Sequence[str]) –

    sequence of exposure classes, order is not important. If an exposure class is not provided, but is defined in the init, it is set to the value of _not_applicable_key ("Not applicable"). You can use capital letters or lowercase letters, the method is case-insensitive. For example, "XC1" and "xc1" are both valid.

Returns:

  • Self

    instance created from the list

Source code in blueprints/codes/eurocode/en_1992_1_1_2004/chapter_4_durability_and_cover/_base_classes/exposure_classes.py
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
@classmethod
def from_exposure_list(cls, exposure_classes: Sequence[str]) -> Self:
    """Create an instance from a sequence of exposure classes.

    Examples
    --------
    >>> exposure_classes = ["XC1", "XD1", "XS1"]
    >>> ConcreteExposureClasses().from_exposure_list(exposure_classes)
    ConcreteExposureClasses(
        carbonation=<Carbonation.XC1: 'XC1'>,
        chloride=<Chloride.XD1: 'XD1'>,
        chloride_seawater=<ChlorideSeawater.XS1: 'XS1'>,
        freeze_thaw=<FreezeThaw.NA: 'Not applicable'>,
        chemical=<Chemical.NA: 'Not applicable'>
    )

    Parameters
    ----------
    exposure_classes : Sequence[str]
        sequence of exposure classes, order is not important.
        If an exposure class is not provided, but is defined in the __init__, it is set to the value of _not_applicable_key ("Not applicable").
        You can use capital letters or lowercase letters, the method is case-insensitive.
        For example, "XC1" and "xc1" are both valid.

    Returns
    -------
    Self
        instance created from the list
    """
    exposures: dict[str, Exposure] = {}
    classifications: dict[str, type[Exposure]] = {arg.notation(): arg for kw, arg in cls.__init__.__annotations__.items() if kw != "return"}

    for exposure_str in exposure_classes:
        classification = classifications.get(exposure_str[:2].upper())
        if classification is None:
            raise ValueError(f"Invalid exposure class: '{exposure_str}'")
        classification_name = classification.snake_case()
        if classification_name in exposures:
            raise ValueError(f"Duplication Error: There are multiple instances of '{classification.__name__}' class.")
        exposures[classification_name] = classification[exposure_str.upper()]

    for classification in classifications.values():
        classification_name = classification.snake_case()
        if classification_name not in exposures:
            exposures.setdefault(classification_name, classification(cls._not_applicable_key))

    return cls(**exposures)