$fn = 64; // --- Parametric Variables --- base_radius = 45; base_thickness = 4; hole_radius = 2.5; // 5mm diameter pegs tolerance = 0.15; // Friction fit tolerance arm_length = 55; arm_width = 10; arm_thickness = 4; clip_radius = 12; // Fits standard 6-inch scale figure waists // --- Print Layout --- // Arranged flat on the XY plane for easy 3D printing Base(); translate([-30, 60, 0]) Arm(); translate([-30, 75, 0]) Arm(); translate([-40, 100, 0]) Waist_Clip(); translate([10, 100, 0]) Base_Mount(); for(i = [0:2]) { translate([35 + i*12, 100, 0]) Pin(); } // --- Modules --- module Base() { difference() { // Main hexagonal base for stability cylinder(h=base_thickness, r=base_radius, $fn=6); // Center peg hole translate([0, 0, -1]) cylinder(h=base_thickness+2, r=hole_radius); // Inner ring of adjustable peg holes for(i = [0:60:359]) { rotate([0, 0, i]) translate([base_radius*0.5, 0, -1]) cylinder(h=base_thickness+2, r=hole_radius); } // Outer ring of adjustable peg holes for(i = [30:60:359]) { rotate([0, 0, i]) translate([base_radius*0.8, 0, -1]) cylinder(h=base_thickness+2, r=hole_radius); } } } module Arm() { difference() { hull() { cylinder(h=arm_thickness, r=arm_width/2); translate([arm_length, 0, 0]) cylinder(h=arm_thickness, r=arm_width/2); } // Joint holes translate([0, 0, -1]) cylinder(h=arm_thickness+2, r=hole_radius); translate([arm_length, 0, -1]) cylinder(h=arm_thickness+2, r=hole_radius); } } module Waist_Clip() { difference() { union() { // Flexible C-clamp body (2.5mm wall thickness) cylinder(h=arm_thickness, r=clip_radius + 2.5); // Tang for arm connection translate([-arm_width/2, 0, 0]) cube([arm_width, clip_radius + 15, arm_thickness]); } // Inner cutout for figure waist translate([0, 0, -1]) cylinder(h=arm_thickness+2, r=clip_radius); // Front opening for snapping onto figure translate([-clip_radius*0.75, -clip_radius-5, -1]) cube([clip_radius*1.5, clip_radius+5, arm_thickness+2]); // Connection hole translate([0, clip_radius + 9, -1]) cylinder(h=arm_thickness+2, r=hole_radius); } } module Base_Mount() { // Connects the flat arm to the flat base, providing pitch rotation difference() { union() { // Peg that inserts into the base cylinder(h=8.1, r=hole_radius - tolerance); // Collar translate([0, 0, 8]) cylinder(h=2.1, r=arm_width/2); // Upright support translate([-arm_width/2, -arm_thickness/2, 10]) cube([arm_width, arm_thickness, arm_width/2 + 0.1]); // Hinge round top translate([0, 0, 10 + arm_width/2]) rotate([-90, 0, 0]) cylinder(h=arm_thickness, r=arm_width/2, center=true); } // Horizontal hole for the pin translate([0, 0, 10 + arm_width/2]) rotate([-90, 0, 0]) cylinder(h=arm_thickness + 2, r=hole_radius, center=true); } } module Pin() { union() { // Pin head cylinder(h=1.5, r=hole_radius + 1.5); // Pin shaft (length covers two overlapping arm segments) translate([0, 0, 1.4]) cylinder(h=arm_thickness*2 + 0.5, r=hole_radius - tolerance); } }