def make_curve(self, vertices, radiuses): if self.cyclic: last_fillet = calc_fillet(vertices[-1], vertices[0], vertices[1], radiuses[0]) prev_edge_start = last_fillet.p2 radiuses = radiuses[1:] + [radiuses[0]] corners = list(zip(vertices, vertices[1:], vertices[2:], radiuses)) corners.append( (vertices[-2], vertices[-1], vertices[0], radiuses[-1])) corners.append( (vertices[-1], vertices[0], vertices[1], radiuses[0])) else: prev_edge_start = vertices[0] corners = zip(vertices, vertices[1:], vertices[2:], radiuses) curves = [] centers = [] for v1, v2, v3, radius in corners: fillet = calc_fillet(v1, v2, v3, radius) if fillet is not None: edge_direction = np.array( fillet.p1) - np.array(prev_edge_start) edge_len = np.linalg.norm(edge_direction) edge = SvLine(prev_edge_start, edge_direction / edge_len) edge.u_bounds = (0.0, edge_len) arc = fillet.get_curve() prev_edge_start = fillet.p2 curves.append(edge) curves.append(arc) centers.append(fillet.matrix) else: edge = SvLine.from_two_points(prev_edge_start, v2) prev_edge_start = v2 curves.append(edge) if not self.cyclic: edge_direction = np.array(vertices[-1]) - np.array(prev_edge_start) edge_len = np.linalg.norm(edge_direction) edge = SvLine(prev_edge_start, edge_direction / edge_len) edge.u_bounds = (0.0, edge_len) curves.append(edge) if self.make_nurbs: if self.concat: curves = [ curve.to_nurbs().elevate_degree(target=2) for curve in curves ] else: curves = [curve.to_nurbs() for curve in curves] if self.concat: concat = concatenate_curves(curves, scale_to_unit=self.scale_to_unit) return concat, centers else: return curves, centers
def process(self): if not any(socket.is_linked for socket in self.outputs): return point1_s = self.inputs['Point1'].sv_get() point2_s = self.inputs['Point2'].sv_get() direction_s = self.inputs['Direction'].sv_get() u_min_s = self.inputs['UMin'].sv_get() u_max_s = self.inputs['UMax'].sv_get() point1_s = ensure_nesting_level(point1_s, 3) point2_s = ensure_nesting_level(point2_s, 3) direction_s = ensure_nesting_level(direction_s, 3) u_min_s = ensure_nesting_level(u_min_s, 2) u_max_s = ensure_nesting_level(u_max_s, 2) curves_out = [] for point1s, point2s, directions, u_mins, u_maxs in zip_long_repeat( point1_s, point2_s, direction_s, u_min_s, u_max_s): new_curves = [] for point1, point2, direction, u_min, u_max in zip_long_repeat( point1s, point2s, directions, u_mins, u_maxs): point1 = np.array(point1) if self.mode == 'AB': direction = np.array(point2) - point1 line = SvLine(point1, direction) line.u_bounds = (u_min, u_max) new_curves.append(line) if self.join: curves_out.extend(new_curves) else: curves_out.append(new_curves) self.outputs['Curve'].sv_set(curves_out)
def make_curve(self, vertices, radiuses): if self.cyclic: last_fillet = calc_fillet(vertices[-1], vertices[0], vertices[1], radiuses[0]) prev_edge_start = last_fillet.p2 radiuses = radiuses[1:] + [radiuses[0]] corners = list(zip(vertices, vertices[1:], vertices[2:], radiuses)) corners.append( (vertices[-2], vertices[-1], vertices[0], radiuses[-1])) corners.append( (vertices[-1], vertices[0], vertices[1], radiuses[0])) else: prev_edge_start = vertices[0] corners = zip(vertices, vertices[1:], vertices[2:], radiuses) curves = [] centers = [] for v1, v2, v3, radius in corners: fillet = calc_fillet(v1, v2, v3, radius) edge_direction = np.array(fillet.p1) - np.array(prev_edge_start) edge_len = np.linalg.norm(edge_direction) edge = SvLine(prev_edge_start, edge_direction / edge_len) edge.u_bounds = (0.0, edge_len) arc = fillet.get_curve() prev_edge_start = fillet.p2 curves.append(edge) curves.append(arc) centers.append(fillet.matrix) if not self.cyclic: edge_direction = np.array(vertices[-1]) - np.array(prev_edge_start) edge_len = np.linalg.norm(edge_direction) edge = SvLine(prev_edge_start, edge_direction / edge_len) edge.u_bounds = (0.0, edge_len) curves.append(edge) if self.concat: concat = SvConcatCurve(curves, scale_to_unit=self.scale_to_unit) return concat, centers else: return curves, centers