$fn=64; // --- Parameters --- tolerance = 0.2; wheel_radius = 25; wheel_thickness = 6; pin_radius = 4; base_length = 60; base_width = 70; base_thickness = 3; text_size = 6; detent_radius = 1.5; // --- Print Layout --- translate([-35, 0, 0]) score_base(); translate([35, 0, 0]) score_wheel(); // --- Modules --- module score_wheel() { difference() { // Main wheel body cylinder(r=wheel_radius, h=wheel_thickness); // Center hole for pin translate([0, 0, -1]) cylinder(r=pin_radius + tolerance, h=wheel_thickness + 2); // Bottom chamfer to help snap fit translate([0, 0, -0.1]) cylinder(r1=pin_radius + 1.5, r2=pin_radius + tolerance, h=1.5); // Outer grip notches for(i=[0:19]) { rotate([0, 0, i * 18]) translate([wheel_radius, 0, -1]) cylinder(r=2, h=wheel_thickness + 2); } // Detent grooves underneath for clicking mechanism for(i=[0:9]) { rotate([0, 0, i * 36]) translate([0, -(wheel_radius - 12), -0.1]) cylinder(r1=detent_radius + tolerance, r2=0.5, h=detent_radius + 0.1 + tolerance); } // Score numbers on top for(i=[0:9]) { rotate([0, 0, i * 36]) translate([0, -(wheel_radius - 6), wheel_thickness - 1]) linear_extrude(2) text(str(i), size=text_size, halign="center", valign="center"); } } } module score_base() { union() { // Main base plate rounded_rect(base_length, base_width, base_thickness, 5); // Center split-pin for snap fit difference() { union() { cylinder(r=pin_radius, h=base_thickness + wheel_thickness); // Snap lip translate([0, 0, base_thickness + wheel_thickness]) cylinder(r1=pin_radius + 0.6, r2=pin_radius - 0.5, h=1.5); } // Split down the middle for flexibility translate([-pin_radius - 1, -0.5, base_thickness + 1]) cube([pin_radius * 2 + 2, 1, wheel_thickness + 2]); } // Detent bump translate([0, -(wheel_radius - 12), base_thickness - 0.1]) cylinder(r1=detent_radius, r2=0.5, h=detent_radius + 0.1); // Indicator arrow translate([0, -(wheel_radius + 2), base_thickness - 0.1]) linear_extrude(wheel_thickness - 1 + 0.1) polygon([[-4, -6], [4, -6], [0, 2]]); // Label translate([0, 28, base_thickness - 0.1]) linear_extrude(1.1) text("SCORE", size=6, halign="center", valign="center"); } } module rounded_rect(l, w, h, r) { hull() { translate([-l/2 + r, -w/2 + r, 0]) cylinder(r=r, h=h); translate([ l/2 - r, -w/2 + r, 0]) cylinder(r=r, h=h); translate([-l/2 + r, w/2 - r, 0]) cylinder(r=r, h=h); translate([ l/2 - r, w/2 - r, 0]) cylinder(r=r, h=h); } }