def __init__(self, u_bounds, v_bounds, u_spline_constructor, v_splines, reparametrize_v_splines=True): if reparametrize_v_splines: self.v_splines = [ reparametrize_curve(spline) for spline in v_splines ] else: for spline in v_splines: m, M = spline.get_u_bounds() if m != 0.0 or M != 1.0: raise Exception("one of splines has to be reparametrized") self.v_splines = v_splines self.u_spline_constructor = u_spline_constructor self.u_bounds = u_bounds self.v_bounds = v_bounds # Caches # v -> Spline self._u_splines = {} # (u,v) -> vertex self._eval_cache = {} # (u,v) -> normal self._normal_cache = {}
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
def to_nurbs(self, implementation=SvNurbsCurve.NATIVE): control_points = self.spline.get_control_points() degree = self.spline.get_degree() n_points = degree + 1 knotvector = sv_knotvector.generate(degree, n_points) t_segments = self.spline.get_t_segments() segments = [SvNurbsCurve.build(implementation, degree, knotvector, points) for points in control_points] segments = [reparametrize_curve(segment, t_min, t_max) for segment, (t_min, t_max) in zip(segments, t_segments)] # pairs = [f"#{i}: {t_min}-{t_max}: {segment.evaluate(t_min)} -- {segment.evaluate(t_max)}" for i, (segment, (t_min, t_max)) in enumerate(zip(segments, t_segments))] # pairs = ", ".join(pairs) # print(f"S: {pairs}") return concatenate_nurbs_curves(segments)
def process(self): if not any(socket.is_linked for socket in self.outputs): return curve_s = self.inputs['Curve'].sv_get() tmin_s = self.inputs['NewTMin'].sv_get() tmax_s = self.inputs['NewTMax'].sv_get() curve_s = ensure_nesting_level(curve_s, 2, data_types=(SvCurve, )) tmin_s = ensure_nesting_level(tmin_s, 2) tmax_s = ensure_nesting_level(tmax_s, 2) curve_out = [] for curves, tmins, tmaxs in zip_long_repeat(curve_s, tmin_s, tmax_s): new_curves = [] for curve, t_min, t_max in zip_long_repeat(curves, tmins, tmaxs): new_curve = reparametrize_curve(curve, t_min, t_max) new_curves.append(new_curve) curve_out.append(new_curves) self.outputs['Curve'].sv_set(curve_out)