def transform(self, m: Matrix44) -> "Arc": """Transform ARC entity by transformation matrix `m` inplace. Raises ``NonUniformScalingError()`` for non uniform scaling. """ ocs = OCSTransform(self.dxf.extrusion, m) super()._transform(ocs) s: float = self.dxf.start_angle e: float = self.dxf.end_angle if not math.isclose(arc_angle_span_deg(s, e), 360.0): ( self.dxf.start_angle, self.dxf.end_angle, ) = ocs.transform_ccw_arc_angles_deg(s, e) self.post_transform(m) return self
def test_reflections(self, s, e, rotation, sx, sy): m = Matrix44.chain( Matrix44.scale(sx, sy, 1), Matrix44.z_rotate(rotation), ) expected_start = m.transform(Vec3.from_deg_angle(s)) expected_end = m.transform(Vec3.from_deg_angle(e)) expected_angle_span = arc_angle_span_deg(s, e) ocs = OCSTransform(Z_AXIS, m) new_s, new_e = ocs.transform_ccw_arc_angles_deg(s, e) wcs_start = ocs.new_ocs.to_wcs(Vec3.from_deg_angle(new_s)) wcs_end = ocs.new_ocs.to_wcs(Vec3.from_deg_angle(new_e)) assert arc_angle_span_deg(new_s, new_e) == pytest.approx( expected_angle_span ) assert wcs_start.isclose(expected_start) assert wcs_end.isclose(expected_end)
def test_rotation(self, s, e, rotation): ocs = OCSTransform(Z_AXIS, Matrix44.z_rotate(math.radians(rotation))) new_angles = normalize_angles(*ocs.transform_ccw_arc_angles_deg(s, e)) assert new_angles == pytest.approx( normalize_angles(s + rotation, e + rotation) )
def test_no_transformation(self, s, e): ocs = OCSTransform(Z_AXIS, Matrix44()) assert ocs.transform_ccw_arc_angles_deg(s, e) == pytest.approx([s, e])