detail=1.0; sphereDetail=360*detail; $fn=120*detail; /* Adapted from https://www.instructables.com/Pumpkin-Patch-3d-Printable/ */ //color("DarkOrange") Pumpkin(13,220); Fragments=13; D=360/Fragments; // D = Degree module Pumpkin(Fragments=13,h=220){ D=360/Fragments; for (a =[1:Fragments]){Slice(D*a,h);} } include <../../BOSL2/std.scad> CENTER=[0,0,0]; // Function&Module: egg() // Usage: As Module // egg(length, r1|d1=, r2|d2=, R|D=) [ATTACHMENTS]; // Usage: As Function // path = egg(length, r1|d1=, r2|d2=, R|D=); // Topics: Shapes (2D), Paths (2D), Path Generators, Attachable // See Also: circle(), ellipse(), glued_circles() // Description: // Constructs an egg-shaped object by connecting two circles with convex arcs that are tangent to the circles. // You specify the length of the egg, the radii of the two circles, and the desired arc radius. // Note that because the side radius, R, is often much larger than the end radii, you may get better // results using `$fs` and `$fa` to control the number of semgments rather than using `$fn`. // This shape may be useful for creating a cam. // Arguments: // length = length of the egg // r1 = radius of the left-hand circle // r2 = radius of the right-hand circle // R = radius of the joining arcs // --- // d1 = diameter of the left-hand circle // d2 = diameter of the right-hand circle // D = diameter of the joining arcs // Extra Anchors: // "left" = center of the left circle // "right" = center of the right circle // Example(2D,NoAxes): This first example shows how the egg is constructed from two circles and two joining arcs. // $fn=100; // color("red") stroke(egg(78,25,12, 60),closed=true); // stroke([left(14,circle(25)), // right(27,circle(12))]); // Example(2D,Anim,VPD=250,VPR=[0,0,0]): Varying length between circles // r1 = 25; r2 = 12; R = 65; // length = floor(lookup($t, [[0,55], [0.5,90], [1,55]])); // egg(length,r1,r2,R,$fn=180); // color("black") text(str("length=",length), size=8, halign="center", valign="center"); // Example(2D,Anim,VPD=250,VPR=[0,0,0]): Varying tangent arc radius R // length = 78; r1 = 25; r2 = 12; // R = floor(lookup($t, [[0,45], [0.5,150], [1,45]])); // egg(length,r1,r2,R,$fn=180); // color("black") text(str("R=",R), size=8, halign="center", valign="center"); // Example(2D,Anim,VPD=250,VPR=[0,0,0]): Varying circle radius r2 // length = 78; r1 = 25; R = 65; // r2 = floor(lookup($t, [[0,5], [0.5,30], [1,5]])); // egg(length,r1,r2,R,$fn=180); // color("black") text(str("r2=",r2), size=8, halign="center", valign="center"); function egg(length, r1, r2, R, d1, d2, D, anchor=CENTER, spin=0) = let( r1 = get_radius(r1=r1,d1=d1), r2 = get_radius(r1=r2,d1=d2), D = get_radius(r1=R, d1=D) ) assert(length>0) assert(R>length/2, "Side radius R must be larger than length/2") assert(length>r1+r2, "Length must be longer than 2*(r1+r2)") assert(length>2*r2, "Length must be longer than 2*r2") assert(length>2*r1, "Length must be longer than 2*r1") let( c1 = [-length/2+r1,0], c2 = [length/2-r2,0], Rmin = (r1+r2+norm(c1-c2))/2, Mlist = circle_circle_intersection(R-r1, c1, R-r2, c2), arcparms = reverse([for(M=Mlist) [M, c1+r1*unit(c1-M), c2+r2*unit(c2-M)]]), path = concat( arc(r=r2, cp=c2, points=[[length/2,0],arcparms[0][2]],endpoint=false), arc(r=R, cp=arcparms[0][0], points=select(arcparms[0],[2,1]),endpoint=false), arc(r=r1, points=[arcparms[0][1], [-length/2,0], arcparms[1][1]],endpoint=false), arc(r=R, cp=arcparms[1][0], points=select(arcparms[1],[1,2]),endpoint=false), arc(r=r2, cp=c2, points=[arcparms[1][2], [length/2,0]],endpoint=false) ), anchors = [named_anchor("left", c1, BACK, 0), named_anchor("right", c2, BACK, 0)] ) reorient(anchor, spin, two_d=true, path=path, extent=true, p=path, anchors=anchors); module egg(length,r1,r2,R,d1,d2,D,anchor=CENTER, spin=0) { path = egg(length,r1,r2,R,d1,d2,D); anchors = [named_anchor("left", [-length/2+r1,0], BACK, 0), named_anchor("right", [length/2-r2,0], BACK, 0)]; attachable(anchor, spin, two_d=true, path=path, extent=true, anchors=anchors){ polygon(path); children(); } } module Slice(D,h){ rotate([0,0,D]) scale([.5,1,1]) translate([0,h/6,h/2]) sphere(d=h,$fn=sphereDetail*0.5); } module Eye1(eyeDirection=90,pupilDirection=0) { minkowski() { rotate([0,0,eyeDirection]) translate([1,0,0]) cylinder(r=1,h=1,$fn=3,center=true); translate([0,0,0]) cylinder(r=1,h=1,$fa=5,$fs=0.1,center=true); rotate([0,0,pupilDirection]) translate([0.8,0,0]) cylinder(r=0.5,h=2,$fa=5,$fs=0.1,center=true); } } module Eye2(eyeDirection=90,pupilDirection=0) { rotate([0,0,eyeDirection]) translate([2,0,0]) cylinder(r=1,h=1,$fa=5,$fs=0.1,center=true); translate([0,0,0]) cylinder(r=1.75,h=1,$fa=5,$fs=0.1,center=true); rotate([0,0,eyeDirection]) translate([1,0,0]) cube([1,3,1],center=true); } module Eye(eyeDirection=90,pupilDirection=0) { Z=1; 1_diameter=1; 2_diameter=2; hull() { translate([0,0,Z-1_diameter]) sphere(1_diameter); cylinder(2_diameter); } } pumpkinDiameter=210; fudge=sqrt(2.0)*0.5; shellDiameter=pumpkinDiameter*fudge; cutDepth=30; faceCenter=13*0.5; /* translate([0,0,pumpkinDiameter*0.10]) { // Eyes rotate([0,-45,faceCenter-25]) translate([pumpkinDiameter*0.5+1,0,0]) rotate([160,0,0]) rotate([-15,60,-30]) linear_extrude(height=2) egg(60,14,8.5,35); rotate([0,-45,faceCenter+25]) translate([pumpkinDiameter*0.5+1,0,0]) rotate([200,0,0]) rotate([15,60,30]) linear_extrude(height=2) egg(60,14,8.5,35); } */ module Organizer(holes=false,diameter,height) { for(i=[-5:1:-2]) { rotate([0,0,10*i+180]) translate([diameter,0,0]) if(holes) { cylinder(d=12,h=height); translate([0,0,-6]) cylinder(d1=0,d2=12,h=6); } else { difference() { union() { cylinder(d=16,h=height); translate([0,0,-8]) { cylinder(d1=0,d2=16,h=8); translate([0.5,0.5,0.5]) rotate([0,45,180]) cube([11,1,5]); } } translate([0,0,2]) cylinder(d=12,h=height); translate([0,0,-6]) cylinder(d1=0,d2=12,h=6); } } } for(i=[2:1:5]) { rotate([0,0,10*i+180]) translate([diameter,0,0]) if(holes) { cylinder(d=12,h=height); translate([0,0,-6]) cylinder(d1=0,d2=12,h=6); } else { difference() { union() { cylinder(d=16,h=height); translate([0,0,-8]) { cylinder(d1=0,d2=16,h=8); translate([0.5,0.5,0.5]) rotate([0,45,180]) cube([11,1,5]); } } translate([0,0,2]) cylinder(d=12,h=height); translate([0,0,-6]) cylinder(d1=0,d2=12,h=6); } } } if(holes) { rotate([0,0,180]) translate([diameter,0,height*.5]) cube([20,40,height],center=true); } else { rotate([0,0,180]) translate([diameter,0,height*.5]) minkowski() { rad=sqrt(22*22*2)*0.5; difference() { union() { cube([22,42,height],center=true); translate([0,0,-height*0.5]) rotate([0,45,0]) cube([rad,42,rad],center=true); } translate([0,0,2]) cube([20,40,height],center=true); } cylinder(r=1,h=1); } } } translate([0,0,pumpkinDiameter*fudge-95]) Organizer(holes=false,diameter=pumpkinDiameter*fudge*0.59,height=70); //translate([0,0,110]) cylinder(d=136,h=10); scale([1,1,1.0]) difference() { union() { Pumpkin(13,shellDiameter); } translate([0,0,pumpkinDiameter*0.5*fudge]) { sphere(d=pumpkinDiameter*fudge+18,$fn=sphereDetail); translate([0,0,-22]) cylinder(d1=0,d2=220,h=110); } translate([0,0,pumpkinDiameter*fudge-95]) Organizer(holes=true,diameter=pumpkinDiameter*fudge*0.59,height=85); /* Face components */ translate([0,0,pumpkinDiameter*0.07]) { // Eyes rotate([0,-50,faceCenter-25]) translate([pumpkinDiameter*0.49,0,0]) rotate([160,0,0]) rotate([0,60,-30]) difference () { linear_extrude(height=cutDepth) egg(63,14,8.5,42); translate([22,0,0]) cube([20,40,60],center=true); } rotate([0,-50,faceCenter+25]) translate([pumpkinDiameter*0.49,0,0]) rotate([200,0,0]) rotate([0,60,30]) difference () { linear_extrude(height=cutDepth) egg(63,14,8.5,42); translate([22,0,0]) cube([20,40,60],center=true); } // Nose rotate([0,-30,faceCenter-5]) translate([pumpkinDiameter*0.42,0,0]) rotate([160,0,0]) rotate([0,90,0]) linear_extrude(height=cutDepth) egg(15,4,2,14); rotate([0,-30,faceCenter+5]) translate([pumpkinDiameter*0.42,0,0]) rotate([200,0,0]) rotate([0,90,0]) linear_extrude(height=cutDepth) egg(15,4,2,10); for(t=[0:1:5]) { rotate([-t*2,-5-t*0.5,faceCenter-10*t]) { translate([pumpkinDiameter*0.42+(t-3)*1.275,0,faceCenter+1.5*t]) { rotate([0,45,0]) { cube([cutDepth*0.5,1,20],center=true); hull() { translate([0,-2,0]) { cube([cutDepth*0.6,1,6-t],center=true); } translate([0,-11,1]) { cube([cutDepth*0.6,2,7-t],center=true); } translate([0,-7,1]) rotate([-4-1*t,0,0]) { cube([cutDepth*0.6,11,6-t],center=true); } } } } } rotate([t*2,-5-t*0.5,faceCenter+10*t]) { translate([pumpkinDiameter*0.42+(t-3)*1.275,0,faceCenter+1.5*t]) { rotate([0,45,0]) { cube([cutDepth*0.5,1,20],center=true); hull() { translate([0,2,0]) { cube([cutDepth*0.6,1,6-t],center=true); } translate([0,11,1]) { cube([cutDepth*0.6,2,7-t],center=true); } translate([0,7,1]) rotate([4+1*t,0,0]) { cube([cutDepth*0.6,11,6-t],center=true); } } } } } } } } scale([1,1,.2]) difference() { font="Awery SmallCaps"; sphere(d=220*fudge); translate([0,0,55]) cylinder(d=220,h=30); translate([0,0,-150]) cube([300,300,300],center=true); /* Logo */ translate([0,0,4.9]) rotate([0,180,0]) { linear_extrude(height=5) { translate([0,12,0]) text("etoyoc.com",10,font,halign="center"); text("Original By:",6,font,halign="center"); translate([0,-15,0]) text("Sean Woods",10,font,halign="center"); translate([0,-30,0]) text("2022",10,font,halign="center"); } } } //translate([0,0,125]) cylinder(d=135,h=10);