import rhinoscriptsyntax as rs # Clean the document rs.DeleteObjects(rs.AllObjects()) rs.EnableRedraw(False) # Feather point definitions tip_pt = (-5, -8, 0) tip_add = (-1.6, -1.7, 0) cen_pt = (0, 0, 0) pt_1 = (70, 70, -5) pt_2 = (30, 40, 10) pt_3 = (30, 0, -2) pt_4 = (45, 20, -2) pt_5 = (80, 65, -2) pt_6 = (0, 10, 0) pt_7 = (20, 40, 7) pt_8 = (60, 75, 0) #Number of any type of feather ft_1 = 30 ft_2 = 30 ft_3 = 31 ft_4 = 12 ft_5 = 18 #Rotation of the Wing x-Achse rotation_anglex = -5 #Rotation of the Wing y-Achse rotation_angley = 3 circle_radius = 0.5 # Radius for the sweep cross-section def create_sweep_along_curve(curve): """Create a round sweep along a curve using a circular cross-section.""" if not rs.IsCurve(curve): return start_point = rs.CurveStartPoint(curve) circle = rs.AddCircle(rs.PlaneFromNormal(start_point, rs.CurveTangent(curve, 0)), circle_radius) sweep = rs.AddSweep1(curve, [circle]) rs.DeleteObject(circle) # Clean up the circle return sweep circle_radius2 = 0.1 # Radius for the sweep cross-section def create_sweep_along_curvesmall(curve): """Create a round sweep along a curve using a circular cross-section.""" if not rs.IsCurve(curve): return start_point = rs.CurveStartPoint(curve) circle = rs.AddCircle(rs.PlaneFromNormal(start_point, rs.CurveTangent(curve, 0)), circle_radius2) sweep = rs.AddSweep1(curve, [circle]) rs.DeleteObject(circle) # Clean up the circle return sweep def make_feather1(): """Create a single feather and return its geometry.""" tip = rs.AddCurve((tip_pt, tip_add, cen_pt), degree=3) main_strand = rs.AddCurve((cen_pt, pt_2, pt_1), degree=3) line_1 = rs.AddCurve((cen_pt, pt_3, pt_4, pt_5, pt_1), degree=3) line_2 = rs.AddCurve((cen_pt, pt_6, pt_7, pt_8, pt_1), degree=3) feather_parts = [tip, main_strand, line_1, line_2] points_1 = rs.DivideCurve(line_1, 30) points_2 = rs.DivideCurve(main_strand, 30) points_3 = rs.DivideCurve(line_2, 30) if points_1 and points_2 and points_3: for i in range(1, len(points_1)): feather_parts.append(rs.AddCurve((points_1[i], points_2[i]))) feather_parts.append(rs.AddCurve((points_3[i], points_2[i]))) return feather_parts def create_feathers_along_curve(curve_id, count=5): division_points = rs.DivideCurve(curve_id, count) feather_base = make_feather1() if not feather_base or not feather_base[1]: return for i, point in enumerate(division_points): scale_factor = 1.0 - (i / float(count)) * 0.3 scale_center = rs.CurveStartPoint(feather_base[1]) feather_copy = rs.CopyObjects(feather_base) for obj in feather_copy: rs.ScaleObject(obj, scale_center, (scale_factor, scale_factor, scale_factor)) translation = rs.VectorCreate(point, cen_pt) rs.MoveObject(obj, translation) create_sweep_along_curve(feather_copy[1]) rs.DeleteObjects(feather_base) curve_points = [(-300, 0, 5), (-70, 50, 0), (0, 0, -5), (300, -200, -10), (600, -100, -15)] scripted_curve = rs.AddCurve(curve_points, degree=3) curve_points2 = [(-300, 50, 0), (-70, 100, -5), (40, 80, -10), (300, -150, -15), (600, -60, -20)] scripted_curve2 = rs.AddCurve(curve_points2, degree=3) curve_points3 = [(-300, -50, 10), (-70, -10, 5), (40, -80, 0), (300, -260, -5), (600, -120, -10)] scripted_curve3 = rs.AddCurve(curve_points3, degree=3) if scripted_curve: create_feathers_along_curve(scripted_curve, count=ft_1) if scripted_curve2: create_feathers_along_curve(scripted_curve2, count=ft_2) if scripted_curve3: create_feathers_along_curve(scripted_curve3, count=ft_3) def create_scaled_feathers(curves_with_scaling): for curve, count, scaling_factor in curves_with_scaling: if not rs.IsCurve(curve): continue division_points = rs.DivideCurve(curve, count) feather_base = make_feather1() if not feather_base or not feather_base[1]: return for i, point in enumerate(division_points): scale = scaling_factor * (1.0 - (i / float(count)) * 0.3) scale_center = rs.CurveStartPoint(feather_base[1]) feather_copy = rs.CopyObjects((feather_base[1],feather_base[2],feather_base[3])) translation = rs.VectorCreate(point, (0, 0, 0)) rs.ScaleObject(feather_copy, scale_center, (1, scale, 1)) rs.MoveObjects(feather_copy, translation) points_1 = rs.DivideCurveLength(feather_copy[1], 2.6) anzahl= len(points_1) points_2 = rs.DivideCurve(feather_copy[0], anzahl) points_3 = rs.DivideCurve(feather_copy[2], anzahl) if points_1 and points_2 and points_3: for i in range(1, len(points_1)): rs.AddCurve((points_1[i], points_2[i])) rs.AddCurve((points_3[i], points_2[i])) create_sweep_along_curve(feather_copy[0]) rs.DeleteObjects(feather_base) curve1 = rs.AddCurve([(630, -100, -10), (730, -50, -15), (830, 0, -20), (930, 50, -25), (1030, 100, -30)], degree=3) curves_with_scaling = [ (curve1, ft_4, 7) ] create_scaled_feathers(curves_with_scaling) def create_scaled_feathers2(curves_with_scaling2): for curve, count, scaling_factor in curves_with_scaling2: if not rs.IsCurve(curve): continue division_points2 = rs.DivideCurve(curve, count) feather_base = make_feather1() if not feather_base or not feather_base[1]: return for i, point in enumerate(division_points2): scale2 = scaling_factor * (1.0 - (i / float(count)) * (-0.7)) scale_center2 = rs.CurveStartPoint(feather_base[1]) feather_copy2 = rs.CopyObjects((feather_base[0],feather_base[1],feather_base[2],feather_base[3])) for obj in feather_copy2: rs.ScaleObject(obj, scale_center2, (1.5, scale2, 1)) translation = rs.VectorCreate(point, (0, 0, 0)) rs.MoveObject(obj, translation) points_1 = rs.DivideCurveLength(feather_copy2[2], 3.6) anzahl= len(points_1) points_2 = rs.DivideCurve(feather_copy2[1], anzahl) points_3 = rs.DivideCurve(feather_copy2[3], anzahl) if points_1 and points_2 and points_3: for i in range(1, len(points_1)): rs.AddCurve((points_1[i], points_2[i])) rs.AddCurve((points_3[i], points_2[i])) create_sweep_along_curve(feather_copy2[1]) rs.DeleteObjects(feather_base) curve2 = rs.AddCurve([(-280, 110, 0), (-70, 170, -5), (40, 130, -10), (300, -70, -15), (570, -30, -20)], degree=3) curves_with_scaling2 = [ (curve2, ft_5, 3) ] create_scaled_feathers2(curves_with_scaling2) def rotate_objects_x_axis(angle=rotation_anglex): objects = rs.AllObjects() # Rotationszentrum (origin) rotation_centerx = (0, 0, 0) # Rotationsachse (X-Achse) rotation_axisx = (1, 0, 0) # Drehung aller Objekte rs.RotateObjects(objects, rotation_centerx, angle, rotation_axisx) rotate_objects_x_axis() def rotate_objects_y_axis(angle=rotation_angley): objects = rs.AllObjects() # Rotationszentrum (origin) rotation_centery = (0, 0, 0) # Rotationsachse (X-Achse) rotation_axisy = (0, 1, 0) # Drehung aller Objekte rs.RotateObjects(objects, rotation_centery, angle, rotation_axisy) rotate_objects_y_axis() """ def sweep_everything(): sweep_base = rs.AllObjects(select=True) circle_base = rs.AddCircle((create_scaled_feathers2(curves_with_scaling2)), 0.1) rs.AddSweep1(sweep_base, circle_base, closed=False) sweep_everything() """ rs.EnableRedraw(True)