Exemplo n.º 1
0
    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)
Exemplo n.º 2
0
    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)