1"""
2.. module:: convert
3    :platform: Unix, Windows
4    :synopsis: Helper module for converting rational and non-rational geometries to each other
5
6.. moduleauthor:: Onur Rauf Bingol <orbingol@gmail.com>
7
8"""
9
10from . import BSpline, NURBS
11from . import _convert as cvt
12
13
14def bspline_to_nurbs(obj, **kwargs):
15    """ Converts non-rational splines to rational ones.
16
17    :param obj: non-rational spline geometry
18    :type obj: BSpline.Curve, BSpline.Surface or BSpline.Volume
19    :return: rational spline geometry
20    :rtype: NURBS.Curve, NURBS.Surface or NURBS.Volume
21    :raises: TypeError
22    """
23    # B-Spline -> NURBS
24    if isinstance(obj, BSpline.Curve):
25        ret = cvt.convert_curve(obj, NURBS)
26    elif isinstance(obj, BSpline.Surface):
27        ret = cvt.convert_surface(obj, NURBS)
28    elif isinstance(obj, BSpline.Volume):
29        ret = cvt.convert_volume(obj, NURBS)
30    else:
31        raise TypeError("Input must be an instance of B-Spline curve, surface or volume")
32
33    return ret
34
35
36def nurbs_to_bspline(obj, **kwargs):
37    """ Converts rational splines to non-rational ones (if possible).
38
39    The possibility of converting a rational spline geometry to
40    a non-rational one depends on the weights vector.
41
42    :param obj: rational spline geometry
43    :type obj: NURBS.Curve, NURBS.Surface or NURBS.Volume
44    :return: non-rational spline geometry
45    :rtype: BSpline.Curve, BSpline.Surface or BSpline.Volume
46    :raises: TypeError
47    """
48    if not obj.rational:
49        raise TypeError("The input must be a rational geometry")
50
51    # Get keyword arguments
52    tol = kwargs.get('tol', 10e-8)
53
54    # Test for non-rational component extraction
55    for w in obj.weights:
56        if abs(w - 1.0) > tol:
57            print("Cannot extract non-rational components")
58            return obj
59
60    # NURBS -> B-Spline
61    if isinstance(obj, NURBS.Curve):
62        ret = cvt.convert_curve(obj, BSpline)
63    elif isinstance(obj, NURBS.Surface):
64        ret = cvt.convert_surface(obj, BSpline)
65    elif isinstance(obj, NURBS.Volume):
66        ret = cvt.convert_volume(obj, BSpline)
67    else:
68        raise TypeError("Input must be an instance of NURBS curve, surface or volume")
69
70    return ret
71