Ichthys Pipe (stl)
Open Scad:
// --- PARAMETERS --- tube_radius = 0.6; // Outside radius of the pipe wall_thickness = 0.15; // Thickness of the tube wall $fn = 30; // Smoothness of the tubes
// VISUAL CHECK: Set to false to see the full model! // Set to true to slice it in half and verify it's hollow. slice_open = false;
// Calculate the inner radius for hollowing inner_radius = tube_radius - wall_thickness;
// --- THE FISH COORDINATE PATH --- fish_points = [ [ 7.0, 2.0, 0], // 0: Top of the tail fin (Open End) [ 5.0, 0.0, 0], // 1: Tail intersection [ 1.0, 2.5, 0], // 2: Top curve of the body [-3.0, 0.0, 0], // 3: Nose of the fish (CLOSED MOUTH) [ 1.0, -2.5, 0], // 4: Bottom curve of the body [ 5.0, 0.0, 0], // 5: Tail intersection [ 7.0, -2.0, 0] // 6: Bottom of the tail fin (Open End) ];
// --- MAIN SOLID / HOLLOW GENERATION --- difference() { // 1. Outer Solid Tube Mesh fish_tube_chain(fish_points, tube_radius);
// 2. Inner Subtracted Tube Mesh (The hollow core) fish_tube_chain(fish_points, inner_radius); // 3. True End-Capping Cutters (Only at the tail ends now) // Top Tail Open Hole punch_hole(fish_points[0], fish_points[1], inner_radius); // Bottom Tail Open Hole punch_hole(fish_points[6], fish_points[5], inner_radius); // --- VISUAL CUTAWAY --- if (slice_open) { // Shaves off the front half so you can peer inside translate([-5, 0, -2]) cube([15, 5, 4]); }}
// --- HELPER MODULES ---
// Creates a continuous chain of hull segments module fish_tube_chain(points_list, r_size) { for (i = [0 : len(points_list) - 2]) { hull() { translate(points_list[i]) sphere(r = r_size); translate(points_list[i + 1]) sphere(r = r_size); } } }
// Dynamically creates a cylinder pointing outward from an endpoint to slice it open cleanly module punch_hole(end_pt, next_pt, r_size) { dir = end_pt - next_pt; // Vector pointing toward the outside exit len_dir = norm(dir); unit_dir = dir / len_dir;
// Position the cutting cylinder slightly inside the tube and extending outward translate(end_pt - unit_dir * 0.2) hull() { translate([0,0,0]) sphere(r = r_size); translate(unit_dir * 2) sphere(r = r_size); // Pulls a cutting core outward }}




.png&w=3840&q=75)













