def add_ellipse(path: Path, ellipse: ConstructionEllipse, segments=1, reset=True) -> None: """ Add an elliptical arc as multiple cubic Bèzier-curves to the given `path`, use :meth:`~ezdxf.math.ConstructionEllipse.from_arc` constructor of class :class:`~ezdxf.math.ConstructionEllipse` to add circular arcs. Auto-detect the connection point to the given `path`, if neither the start- nor the end point of the ellipse is close to the path end point, a line from the path end point to the ellipse start point will be added automatically (see :func:`add_bezier4p`). By default the start of an **empty** path is set to the start point of the ellipse, setting argument `reset` to ``False`` prevents this behavior. Args: path: :class:`~ezdxf.path.Path` object ellipse: ellipse parameters as :class:`~ezdxf.math.ConstructionEllipse` object segments: count of Bèzier-curve segments, at least one segment for each quarter (pi/2), ``1`` for as few as possible. reset: set start point to start of ellipse if path is empty """ if abs(ellipse.param_span) < 1e-9: return if len(path) == 0 and reset: path.start = ellipse.start_point add_bezier4p(path, cubic_bezier_from_ellipse(ellipse, segments))
def add_ellipse(self, ellipse: ConstructionEllipse, segments=1, reset=True) -> None: """ Add an elliptical arc as multiple cubic Bèzier-curves, use :meth:`~ezdxf.math.ConstructionEllipse.from_arc` constructor of class :class:`~ezdxf.math.ConstructionEllipse` to add circular arcs. Auto-detect connection point, if none is close a line from the path end point to the ellipse start point will be added (see :meth:`add_curves`). By default the start of an **empty** path is set to the start point of the ellipse, setting argument `reset` to ``False`` prevents this behavior. Args: ellipse: ellipse parameters as :class:`~ezdxf.math.ConstructionEllipse` object segments: count of Bèzier-curve segments, at least one segment for each quarter (pi/2), ``1`` for as few as possible. reset: set start point to start of ellipse if path is empty """ if len(self) == 0 and reset: self.start = ellipse.start_point self.add_curves(cubic_bezier_from_ellipse(ellipse, segments))
def bulge_to(p1: Vec3, p2: Vec3, bulge: float): if p1.isclose(p2): return center, start_angle, end_angle, radius = bulge_to_arc(p1, p2, bulge) ellipse = ConstructionEllipse.from_arc( center, radius, Z_AXIS, math.degrees(start_angle), math.degrees(end_angle), ) curves = list(cubic_bezier_from_ellipse(ellipse)) if curves[0].control_points[0].isclose(p2): curves = _reverse_bezier_curves(curves) self.add_curves(curves)
def bulge_to(p1: Vec3, p2: Vec3, bulge: float): if p1.isclose(p2, rel_tol=IS_CLOSE_TOL, abs_tol=0): return center, start_angle, end_angle, radius = bulge_to_arc(p1, p2, bulge) ellipse = ConstructionEllipse.from_arc( center, radius, Z_AXIS, math.degrees(start_angle), math.degrees(end_angle), ) curves = list(cubic_bezier_from_ellipse(ellipse)) curve0 = curves[0] cp0 = curve0.control_points[0] if cp0.isclose(p2, rel_tol=IS_CLOSE_TOL, abs_tol=0): curves = reverse_bezier_curves(curves) add_bezier4p(path, curves)