def test_ruled_surface_1(self): """ Test that 1) SvCurveLerpSurface.build gives a NURBS surface for two NURBS curves; 2) the resulting surface is identical to generic ruled surface. """ control_points1 = np.array([[0, 0, 0], [0.5, 0, 0.5], [1, 0, 0]]) control_points2 = np.array([[0, 2, 0], [0.5, 3, 0.5], [1, 2, 0]]) # With non-trivial weights, this test will fail, # because the resulting surface will have different parametrization # comparing to generic ruled surface; however, the shape of the surface # will be correct anyway. weights1 = [1, 1, 1] weights2 = [1, 1, 1] knotvector = sv_knotvector.generate(degree=2, num_ctrlpts=3) curve1 = SvNativeNurbsCurve(2, knotvector, control_points1, weights1) curve2 = SvNativeNurbsCurve(2, knotvector, control_points2, weights2) surf1 = SvCurveLerpSurface(curve1, curve2) surf2 = SvCurveLerpSurface.build(curve1, curve2) self.assertTrue(isinstance(surf2, SvNativeNurbsSurface)) us = np.array([0, 0, 0.5, 0.5, 1, 1]) vs = np.array([0, 0.5, 0.5, 1, 0.5, 1]) pts1 = surf1.evaluate_array(us, vs) pts2 = surf2.evaluate_array(us, vs) self.assert_numpy_arrays_equal(pts1, pts2, precision=8, fail_fast=False)
def process(self): if not any(socket.is_linked for socket in self.outputs): return curve1_s = self.inputs['Curve1'].sv_get() curve2_s = self.inputs['Curve2'].sv_get() vmin_s = self.inputs['VMin'].sv_get() vmax_s = self.inputs['VMax'].sv_get() vmin_s = ensure_nesting_level(vmin_s, 2) vmax_s = ensure_nesting_level(vmax_s, 2) if isinstance(curve1_s[0], SvCurve): curve1_s = [curve1_s] if isinstance(curve2_s[0], SvCurve): curve2_s = [curve2_s] surface_out = [] for curve1s, curve2s, vmins, vmaxs in zip_long_repeat( curve1_s, curve2_s, vmin_s, vmax_s): for curve1, curve2, vmin, vmax in zip_long_repeat( curve1s, curve2s, vmins, vmaxs): if self.native: surface = SvCurveLerpSurface.build(curve1, curve2, vmin, vmax) else: surface = SvCurveLerpSurface(curve1, curve2) surface.v_bounds = (vmin, vmax) surface_out.append(surface) self.outputs['Surface'].sv_set(surface_out)
def __init__(self, curve1, curve2, curve3, curve4): curve1 = reparametrize_curve(curve1) curve2 = reparametrize_curve(curve2) curve3 = reparametrize_curve(curve3) curve4 = reparametrize_curve(curve4) self.curve1 = curve1 self.curve2 = curve2 self.curve3 = curve3 self.curve4 = curve4 self.linear1 = SvCurveLerpSurface.build(curve1, reverse_curve(curve3)) self.linear2 = SvCurveLerpSurface.build(curve2, reverse_curve(curve4)) self.c1_t_min, self.c1_t_max = curve1.get_u_bounds() self.c3_t_min, self.c3_t_max = curve3.get_u_bounds() self.corner1 = self.curve1.evaluate(self.c1_t_min) self.corner2 = self.curve1.evaluate(self.c1_t_max) self.corner3 = self.curve3.evaluate(self.c3_t_max) self.corner4 = self.curve3.evaluate(self.c3_t_min) self.normal_delta = 0.001