$fn=64; // --- PARAMETERS --- axe_thickness = 12; // Thickness of the entire model (Z-axis) handle_length = 160; // Total length of the handle handle_width = 22; // Width of the handle cable_hole_d = 6.0; // Diameter of the hole for the cable to rest in cable_slit_w = 3.5; // Width of the snap-in slit for the cable // Designed to print flat without supports. // Can be mounted to a desk edge using double-sided tape. module viking_axe() { difference() { // --- MAIN SOLID GEOMETRY --- union() { // Main Handle hull() { translate([0, 20, 0]) cylinder(d=handle_width, h=axe_thickness); translate([0, -handle_length + 15, 0]) cylinder(d=handle_width, h=axe_thickness); } // Pommel (Bottom of handle) hull() { translate([0, -handle_length + 15, 0]) cylinder(d=handle_width, h=axe_thickness); translate([0, -handle_length + 5, 0]) cylinder(d=handle_width + 10, h=axe_thickness); } // Axe Head Base (Eye) cylinder(d=handle_width + 12, h=axe_thickness); // Axe Blade hull() { translate([5, 0, 0]) cylinder(d=handle_width + 8, h=axe_thickness); translate([55, 40, 0]) cylinder(d=6, h=axe_thickness); // Top point translate([70, -5, 0]) cylinder(d=6, h=axe_thickness); // Mid edge translate([55, -70, 0]) cylinder(d=6, h=axe_thickness); // Bottom point (Beard) } } // --- CUTOUTS & SHAPING --- // Top curve of the blade translate([22, 45, -1]) cylinder(d=50, h=axe_thickness + 2); // Inner beard curve (Creates the classic Viking axe shape) translate([25, -45, -1]) cylinder(d=50, h=axe_thickness + 2); // Decorative Cutouts (Lightens the look, adds aesthetic) translate([35, 8, -1]) cylinder(d=10, h=axe_thickness + 2); translate([35, -12, -1]) cylinder(d=10, h=axe_thickness + 2); translate([48, -2, -1]) cylinder(d=10, h=axe_thickness + 2); // Lanyard/Hanging hole in the pommel translate([0, -handle_length + 5, -1]) cylinder(d=8, h=axe_thickness + 2); // Cable Slots (x, y, rotation angle) // Positioned along the curved edge of the blade cable_slot(61, 24, 20); cable_slot(68, 2, 5); cable_slot(65, -25, -15); cable_slot(58, -50, -25); } } module cable_slot(x, y, angle) { translate([x, y, -1]) { // Main circular hole for cable to rest freely cylinder(d=cable_hole_d, h=axe_thickness + 2); // Slit for cable insertion (snaps in) rotate([0, 0, angle]) translate([0, -cable_slit_w/2, 0]) cube([25, cable_slit_w, axe_thickness + 2]); } } // Render the object viking_axe();