Source code for shape_generator.example_cross_sections
from .helpers import Circle
from .shape_generator import CrossSection
import json
import os
import numpy as np
[docs]class EggSection(CrossSection):
    """
    egg shaped cross section
    .. figure:: images/ei.gif
            :align: center
            :alt: egg
            :figclass: align-center
            Egg Section (DWA-A 110, 2006)
    """
[docs]    def __init__(self, r, label=None):
        """init
        egg shaped cross section
        Args:
            r (float): radius of the egg
            label (str): name/label/number of the cross section; dafault = "Ei <width>/<height>"
            description (str): optional description of the cross section
        """
        R = 3 * r
        rho = r / 2
        height = r * 3
        width = r * 2
        # h1 = rho - (r + rho) / (R - rho) * rho
        h1 = 0.2 * r
        if label is None:
            label = f'Ei {width:0.0f}/{height:0.0f}'
        CrossSection.__init__(self, label=label, width=width, height=height)
        self.add(Circle(rho, x_m=rho))
        self.add(h1)
        self.add(Circle(R, x_m=2 * r, y_m=-(R - r)))
        self.add(2 * r)
        self.add(Circle(r, x_m=2 * r))  
[docs]class CircleSection(CrossSection):
    """
    circle cross section
    .. figure:: images/kreis1.gif
            :align: center
            :alt: circle
            :figclass: align-center
            Circle Section (DWA-A 110, 2006)
    """
[docs]    def __init__(self, r, label=None):
        """init
        circle cross section
        Args:
            r (float): radius of the circle
            label (str): name/label/number of the cross section; dafault = "DN <diameter>"
            description (str): optional description of the cross section
        """
        d = 2 * r
        height = d
        width = d
        if label is None:
            label = f'DN {d:0.0f}'
        CrossSection.__init__(self, label=label, width=width, height=height)
        self.add(Circle(r, x_m=r))  
# -------------------------------------------------
# Cross-sections pre-defined in SWMM
SWMM_STD_CROSS_SECTION_CURVES = json.load(
    open(os.path.join(os.path.dirname(__file__), 'swmm_std_cross_section_curves.json'), 'r'))
[docs]def swmm_std_cross_sections(shape, height=1):
    """
    get a SWMM pre-defined cross-section
    Args:
        shape (str): name of the cross-section. one of:
            - ARCH
            - CIRCULAR
            - EGG
            - HORSESHOE
            - GOTHIC
            - CATENARY
            - SEMIELLIPTICAL
            - BASKETHANDLE
            - SEMICIRCULAR
            - HORIZ_ELLIPSE
            - VERT_ELLIPSE
        height (float): height of the cross-section
    Returns:
        CrossSection:
    """
    if shape not in SWMM_STD_CROSS_SECTION_CURVES:
        return
    rel_with = SWMM_STD_CROSS_SECTION_CURVES[shape]
    rel_heights = np.linspace(0, 1, len(rel_with))
    cross_section = CrossSection(shape, height=height)
    for x, y in zip(rel_heights, rel_with):
        if (y == 0) and (x in (0, 1)):
            continue
        cross_section.add(x, y / 2)
    return cross_section