Source code for eytelwein.belt_conveyor_design.extended.minimum_pulley_diameter

"""Public Pint wrappers for minimum pulley diameter calculations."""

from pint import Quantity

from eytelwein.belt_conveyor_design.extended._minimum_pulley_diameter import (
    _resulting_force_from_belt_tensions_and_wrap_angle,
)
from eytelwein.main.units import get_unit_registry

u = get_unit_registry()


[docs] def resulting_force_from_belt_tensions_and_wrap_angle( belt_tension_upper: Quantity, belt_tension_lower: Quantity, wrap_angle: Quantity, unit: str = "kilonewton", precision: int | None = 2, ) -> Quantity: """Calculate resulting force from belt tensions and wrap angle. Converts force quantities to newtons and angle to radians, validates physical constraints, then computes the resulting force magnitude. Parameters ---------- belt_tension_upper : Quantity Upper (tight side) belt tension quantity. belt_tension_lower : Quantity Lower (slack side) belt tension quantity. wrap_angle : Quantity Wrap angle quantity (angle dimension). unit : str, optional Output unit, by default ``"kilonewton"``. precision : int | None, optional Decimal rounding precision, by default ``2``. Use ``None`` to skip rounding. Returns ------- Quantity Resulting force in requested unit. Raises ------ ValueError If unit conversion fails or physical constraints are violated (negative tensions). """ try: belt_tension_upper_n = belt_tension_upper.to(u.newton) belt_tension_lower_n = belt_tension_lower.to(u.newton) wrap_angle_rad = wrap_angle.to(u.radian) except Exception as e: raise ValueError(f"Error in converting units: {e}") from e # Validate physical constraints if belt_tension_upper_n.magnitude < 0: raise ValueError( f"belt_tension_upper cannot be negative, got {belt_tension_upper_n.magnitude}" ) if belt_tension_lower_n.magnitude < 0: raise ValueError( f"belt_tension_lower cannot be negative, got {belt_tension_lower_n.magnitude}" ) # Ensure the unit is valid try: pint_unit = u.parse_units(unit) except Exception as exc: raise ValueError(f"Invalid unit: {unit}. Error: {exc}") from exc # Calculate the resulting force force = ( _resulting_force_from_belt_tensions_and_wrap_angle( belt_tension_upper_n.magnitude, belt_tension_lower_n.magnitude, wrap_angle_rad.magnitude, ) * u.newton ) # First convert to the requested output unit result = force.to(pint_unit) # Then apply precision if specified if precision is not None: result = round(result, precision) return result