def test_blend_tangent(self): p0 = np.array([0, 0, 0]) p1 = np.array([3, 0, 0]) v0 = np.array([3, 3, 0]) v1 = np.array([3, 3, 0]) curve = SvBezierCurve.from_points_and_tangents(p0, v0, v1, p1) v0r = curve.tangent(0) v1r = curve.tangent(1) self.assert_numpy_arrays_equal(v0r, v0) self.assert_numpy_arrays_equal(v1r, v1)
def process(self): if not any(socket.is_linked for socket in self.outputs): return start_s = self.inputs['Start'].sv_get() end_s = self.inputs['End'].sv_get() knot1_s = self.inputs[CONTROL1_SOCKET].sv_get() knot2_s = self.inputs[CONTROL2_SOCKET].sv_get() controls_s = self.inputs['ControlPoints'].sv_get(default=[[[[]]]]) start_s = ensure_nesting_level(start_s, 3) end_s = ensure_nesting_level(end_s, 3) knot1_s = ensure_nesting_level(knot1_s, 3) knot2_s = ensure_nesting_level(knot2_s, 3) controls_s = ensure_nesting_level(controls_s, 4) curves_out = [] controls_out = [] for starts, ends, knot1s, knot2s, controls_i in zip_long_repeat( start_s, end_s, knot1_s, knot2_s, controls_s): new_curves = [] new_controls = [] for start, end, knot1, knot2, controls in zip_long_repeat( starts, ends, knot1s, knot2s, controls_i): start, end = np.array(start), np.array(end) knot1, knot2 = np.array(knot1), np.array(knot2) if self.mode == CUBIC: curve = SvCubicBezierCurve(start, knot1, knot2, end) curve_controls = [ start.tolist(), knot1.tolist(), knot2.tolist(), end.tolist() ] elif self.mode == CUBIC_TANGENT: curve = SvBezierCurve.from_points_and_tangents( start, knot1, knot2, end) curve_controls = [ curve.p0.tolist(), curve.p1.tolist(), curve.p2.tolist(), curve.p3.tolist() ] elif self.mode == CUBIC_4PT: curve = SvCubicBezierCurve.from_four_points( start, knot1, knot2, end) curve_controls = [ curve.p0.tolist(), curve.p1.tolist(), curve.p2.tolist(), curve.p3.tolist() ] elif self.mode == QUADRATIC: curve = SvBezierCurve([start, knot1, end]) curve_controls = [p.tolist() for p in curve.points] else: # GENERIC if not controls: raise SvNoDataError( socket=self.inputs['ControlPoints'], node=self) if len(controls) < 2: raise Exception( "At least two control points are required to build a Bezier spline!" ) if self.is_cyclic: controls = controls + [controls[0]] curve = SvBezierCurve(controls) curve_controls = controls new_curves.append(curve) new_controls.extend(curve_controls) curves_out.append(new_curves) controls_out.append(new_controls) self.outputs['Curve'].sv_set(curves_out) self.outputs['ControlPoints'].sv_set(controls_out)