"""Exact canonical CST-to-spline conversion helpers."""
from __future__ import annotations
from dataclasses import asdict
from buffalo_wings.airfoil.internal.analytic import CstAirfoil
from buffalo_wings.airfoil.internal.base import Airfoil
from buffalo_wings.airfoil.internal.schema import SplineAirfoilSpec
from buffalo_wings.airfoil.internal.spline import SplineAirfoil
[docs]
def cst_airfoil_to_spline(
airfoil: Airfoil,
*,
include_source_spec: bool = False,
) -> SplineAirfoil:
"""
Convert one canonical CST airfoil into an exact Bezier spline airfoil.
Parameters
----------
airfoil : Airfoil
Airfoil to convert.
This exact conversion path requires a canonical ``CstAirfoil``.
include_source_spec : bool, default=False
Whether to embed a serializable snapshot of the source CST schema in
the spline provenance metadata.
Returns
-------
SplineAirfoil
Bezier-backed spline airfoil built from the exact canonical CST side
curves.
Raises
------
TypeError
If ``airfoil`` is not a canonical :class:`CstAirfoil`.
"""
if not isinstance(airfoil, CstAirfoil):
msg = "cst_airfoil_to_spline requires a canonical CstAirfoil."
raise TypeError(msg)
provenance: dict[str, object] = {
"source_type": "cst",
"construction": "exact_conversion",
"exact": True,
}
if include_source_spec:
provenance["source_spec"] = asdict(airfoil.spec)
return SplineAirfoil(
upper=airfoil.upper.exact_curve,
lower=airfoil.lower.exact_curve,
provenance=provenance,
)
[docs]
def cst_airfoil_to_spline_spec(
airfoil: Airfoil,
*,
include_source_spec: bool = False,
) -> SplineAirfoilSpec:
"""
Export one canonical CST airfoil as an exact spline schema definition.
Parameters
----------
airfoil : Airfoil
Airfoil to convert.
This exact conversion path requires a canonical ``CstAirfoil``.
include_source_spec : bool, default=False
Whether to embed a serializable snapshot of the source CST schema in
the spline provenance metadata.
Returns
-------
SplineAirfoilSpec
Bezier-backed spline schema definition built from the exact canonical
CST side curves.
Raises
------
TypeError
If ``airfoil`` is not a canonical :class:`CstAirfoil`.
"""
return cst_airfoil_to_spline(
airfoil,
include_source_spec=include_source_spec,
).spec