def test_circle_equal_1(self): circle1 = SvCircle(Matrix(), 1.0) x = np.array([1, 0, 0]) origin = np.array([0, 0, 0]) z = np.array([0, 0, 1]) circle2 = SvCircle(center=origin, normal=z, vectorx=x) ts = np.linspace(0, pi / 2, num=50) pts1 = circle1.evaluate_array(ts) pts2 = circle2.evaluate_array(ts) self.assert_numpy_arrays_equal(pts1, pts2, precision=8)
class SvConstPipeSurface(SvSurface): __description__ = "Pipe" def __init__(self, curve, radius, algorithm = FRENET, resolution=50): self.curve = curve self.radius = radius self.circle = SvCircle(Matrix(), radius) self.algorithm = algorithm self.normal_delta = 0.001 self.u_bounds = self.circle.get_u_bounds() if algorithm in {FRENET, ZERO, TRACK_NORMAL}: self.calculator = DifferentialRotationCalculator(curve, algorithm, resolution) def get_u_min(self): return self.u_bounds[0] def get_u_max(self): return self.u_bounds[1] def get_v_min(self): return self.curve.get_u_bounds()[0] def get_v_max(self): return self.curve.get_u_bounds()[1] def evaluate(self, u, v): return self.evaluate_array(np.array([u]), np.array([v]))[0] def get_matrix(self, tangent): return MathutilsRotationCalculator.get_matrix(tangent, scale=1.0, axis=2, algorithm = self.algorithm, scale_all=False) def get_matrices(self, ts): if self.algorithm in {FRENET, ZERO, TRACK_NORMAL}: return self.calculator.get_matrices(ts) elif self.algorithm in {HOUSEHOLDER, TRACK, DIFF}: tangents = self.curve.tangent_array(ts) matrices = np.vectorize(lambda t : self.get_matrix(t), signature='(3)->(3,3)')(tangents) return matrices else: raise Exception("Unsupported algorithm") def evaluate_array(self, us, vs): profile_vectors = self.circle.evaluate_array(us) u_min, u_max = self.circle.get_u_bounds() v_min, v_max = self.curve.get_u_bounds() profile_vectors = np.transpose(profile_vectors[np.newaxis], axes=(1, 2, 0)) extrusion_start = self.curve.evaluate(v_min) extrusion_points = self.curve.evaluate_array(vs) extrusion_vectors = extrusion_points - extrusion_start matrices = self.get_matrices(vs) profile_vectors = (matrices @ profile_vectors)[:,:,0] result = extrusion_vectors + profile_vectors result = result + extrusion_start return result
def test_circle_2(self): circle = SvCircle(Matrix(), 1.0) t_max = pi + 0.3 circle.u_bounds = (0, t_max) nurbs = circle.to_nurbs() ts = np.array([0, pi / 2, pi, t_max]) points = nurbs.evaluate_array(ts) expected_points = circle.evaluate_array(ts) self.assert_numpy_arrays_equal(points, expected_points, precision=6)