def add_spline(path: Path, spline: BSpline, level=4, reset=True) -> None: """ Add a B-spline as multiple cubic Bèzier-curves. Non-rational B-splines of 3rd degree gets a perfect conversion to cubic bezier curves with a minimal count of curve segments, all other B-spline require much more curve segments for approximation. Auto-detect the connection point to the given `path`, if neither the start- nor the end point of the B-spline is close to the path end point, a line from the path end point to the start point of the B-spline will be added automatically. (see :meth:`add_bezier4p`). By default the start of an **empty** path is set to the start point of the spline, setting argument `reset` to ``False`` prevents this behavior. Args: path: :class:`~ezdxf.path.Path` object spline: B-spline parameters as :class:`~ezdxf.math.BSpline` object level: subdivision level of approximation segments reset: set start point to start of spline if path is empty """ if len(path) == 0 and reset: path.start = spline.point(0) if spline.degree == 3 and not spline.is_rational and spline.is_clamped: curves = [Bezier4P(points) for points in spline.bezier_decomposition()] else: curves = spline.cubic_bezier_approximation(level=level) add_bezier4p(path, curves)
def random_point_comparision_to_nurbs_python(spline: BSpline, count: int = 10): curve = spline.to_nurbs_python_curve() for _ in range(count): t = random.random() p1 = spline.point(t) p2 = curve.evaluate_single(t) assert p1.isclose(p2)