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