def from_arc(cls, entity: 'DXFGraphic') -> 'Spline': """ Create a new SPLINE entity from a CIRCLE, ARC or ELLIPSE entity. The new SPLINE entity has no owner, no handle, is not stored in the entity database nor assigned to any layout! """ dxftype = entity.dxftype() if dxftype == 'ELLIPSE': ellipse = cast('Ellipse', entity).construction_tool() elif dxftype == 'CIRCLE': ellipse = ConstructionEllipse.from_arc( center=entity.dxf.get('center', NULLVEC), radius=abs(entity.dxf.get('radius', 1.0)), extrusion=entity.dxf.get('extrusion', Z_AXIS), ) elif dxftype == 'ARC': ellipse = ConstructionEllipse.from_arc( center=entity.dxf.get('center', NULLVEC), radius=abs(entity.dxf.get('radius', 1.0)), extrusion=entity.dxf.get('extrusion', Z_AXIS), start_angle=entity.dxf.get('start_angle', 0), end_angle=entity.dxf.get('end_angle', 360)) else: raise TypeError('CIRCLE, ARC or ELLIPSE entity required.') spline = Spline.new(dxfattribs=entity.graphic_properties(), doc=entity.doc) s = BSpline.from_ellipse(ellipse) spline.dxf.degree = s.degree spline.dxf.flags = Spline.RATIONAL spline.control_points = s.control_points spline.knots = s.knots() spline.weights = s.weights() return spline
def test_rational_spline_from_elliptic_arc_has_expected_parameters(): ellipse = ConstructionEllipse( center=(1, 1), major_axis=(2, 0), ratio=0.5, start_param=0, end_param=math.pi / 2, ) spline = rational_bspline_from_ellipse(ellipse) assert spline.degree == 2 cpoints = spline.control_points assert len(cpoints) == 3 assert cpoints[0].isclose((3, 1, 0)) assert cpoints[1].isclose((3, 2, 0)) assert cpoints[2].isclose((1, 2, 0)) weights = spline.weights() assert len(weights) == 3 assert weights[0] == 1.0 assert weights[1] == math.cos(math.pi / 4) assert weights[2] == 1.0 # as BSpline constructor() s2 = BSpline.from_ellipse(ellipse) assert spline.control_points == s2.control_points
def from_arc(cls, entity: "DXFGraphic") -> "Spline": """Create a new SPLINE entity from a CIRCLE, ARC or ELLIPSE entity. The new SPLINE entity has no owner, no handle, is not stored in the entity database nor assigned to any layout! """ dxftype = entity.dxftype() if dxftype == "ELLIPSE": ellipse = cast("Ellipse", entity).construction_tool() elif dxftype == "CIRCLE": ellipse = ConstructionEllipse.from_arc( center=entity.dxf.get("center", NULLVEC), radius=abs(entity.dxf.get("radius", 1.0)), extrusion=entity.dxf.get("extrusion", Z_AXIS), ) elif dxftype == "ARC": ellipse = ConstructionEllipse.from_arc( center=entity.dxf.get("center", NULLVEC), radius=abs(entity.dxf.get("radius", 1.0)), extrusion=entity.dxf.get("extrusion", Z_AXIS), start_angle=entity.dxf.get("start_angle", 0), end_angle=entity.dxf.get("end_angle", 360), ) else: raise TypeError("CIRCLE, ARC or ELLIPSE entity required.") spline = Spline.new(dxfattribs=entity.graphic_properties(), doc=entity.doc) s = BSpline.from_ellipse(ellipse) spline.dxf.degree = s.degree spline.dxf.flags = Spline.RATIONAL spline.control_points = s.control_points # type: ignore spline.knots = s.knots() # type: ignore spline.weights = s.weights() # type: ignore return spline
# ------------------------------------------------------------------------------ # Create SPLINE from ELLIPSE # # The BSpline.from_ellipse() method creates a rational B-spline that is a # perfect elliptic arc. # ------------------------------------------------------------------------------ doc, msp = new_doc() ellipse = msp.add_ellipse( (0, 0), major_axis=(3, 0), ratio=0.7, start_param=math.radians(30), end_param=math.radians(330), dxfattribs={"layer": "ENTITY"}, ) s = BSpline.from_ellipse(ellipse.construction_tool()) spline = msp.add_spline(dxfattribs={"layer": "SPLINE"}) spline.apply_construction_tool(s) add_control_frame(spline) add_control_polyline(spline) save(DIR / "spline_from_ellipse.dxf") # ------------------------------------------------------------------------------ # Open unclamped SPLINE by control points # ------------------------------------------------------------------------------ doc, msp = new_doc() spline = msp.add_spline(dxfattribs={"layer": "SPLINE"}) spline.set_uniform(points)