$fn = 64; // --- Parameters --- pot_rim_thickness = 5.0; // Thickness of the pot rim pot_rim_depth = 20.0; // How far the clip goes down the pot rim wall_thickness = 3.0; // General wall thickness for strength clip_width = 15.0; // Width of the clip probe_diameter = 6.0; // Diameter of the moisture meter probe holder_extension = 20.0; // Distance to extend into the pot from the rim holder_height = 12.0; // Height of the probe holding section // --- Main Model --- union() { // 1. Pot Rim Clip (Inverted U-Shape) difference() { // Main solid block cube([clip_width, pot_rim_thickness + wall_thickness * 2, pot_rim_depth + wall_thickness]); // Inner cutout for the pot rim translate([-1, wall_thickness, -1]) cube([clip_width + 2, pot_rim_thickness, pot_rim_depth + 1]); } // 2. Extension Arm // Connects the pot clip to the probe holder translate([0, pot_rim_thickness + wall_thickness * 2 - 0.1, pot_rim_depth + wall_thickness - holder_height]) cube([clip_width, holder_extension + 0.1, holder_height]); // 3. Probe Clip (Quick Release Snap-Fit) translate([clip_width / 2, pot_rim_thickness + wall_thickness * 2 + holder_extension, pot_rim_depth + wall_thickness - holder_height]) difference() { // Outer cylinder body cylinder(d=probe_diameter + wall_thickness * 2, h=holder_height); // Inner cutout for the probe translate([0, 0, -1]) cylinder(d=probe_diameter, h=holder_height + 2); // Quick release slot (creates the C-shape for snap-fit) // Starts slightly offset from center to retain the probe securely translate([-probe_diameter * 0.4, probe_diameter * 0.3, -1]) cube([probe_diameter * 0.8, probe_diameter + wall_thickness + 1, holder_height + 2]); } }