// replacement for "Stealth" courier bag clip // scruss - 2018-02 // there's not much to customize here, sorry web_thick=1.6; clasp_thick= 6; strap_thick=5; strap_wide=26; outer_catch=32.284; // max width of clasp inner_catch=27.368; big_edge=40; eps=1e-3; $fn=64; module half_clasp() { polygon(points=[[-24.517366, 20.006714], [-25.135416, 19.980875], [-25.579834, 19.893542], [-25.745198, 19.817578], [-25.878524, 19.715258], [-25.982393, 19.58245], [-26.060425, 19.416052], [-26.154992, 18.966984], [-26.190649, 18.338081], [-26.195816, 17.49989], [-26.195816, 14.999784], [-26.195816, 12.500194], [-26.195816, 10.00009], [-26.195816, 7.499984], [-26.195816, 4.999878], [-26.195816, 2.499772], [-26.195816, 0.0], [-9.292972, 0.0], [-9.292972, 3.499712], [-9.292972, 6.999755], [-9.292972, 9.503478], [-9.258866, 10.657413], [-9.15758, 11.524543], [-8.992216, 12.146729], [-8.765873, 12.563757], [-8.481653, 12.817487], [-8.141621, 12.947713], [-7.749397, 12.996287], [-7.307564, 13.003511], [-5.812565, 13.003511], [-5.307686, 12.962685], [-4.83743, 12.84693], [-4.41265, 12.662963], [-4.043164, 12.419049], [-3.738273, 12.122943], [-3.508313, 11.78343], [-3.363102, 11.407742], [-3.312459, 11.003634], [-3.312459, 0.0], [0.985986, 0.0], [0.98547, 1.791276], [26.684676, 1.791276], [27.143561, 1.837785], [27.571443, 1.970076], [27.958499, 2.180399], [28.29543, 2.458418], [28.573449, 2.795865], [28.783772, 3.182921], [28.916063, 3.610802], [28.962572, 4.069688], [28.962572, 8.82702], [27.845845, 8.82702], [27.845845, 4.069688], [27.821556, 3.840246], [27.752828, 3.626304], [27.644307, 3.433034], [27.501164, 3.264053], [27.328563, 3.125043], [27.131676, 3.020141], [26.915152, 2.953995], [26.684676, 2.930739], [0.984953, 2.909043], [0.997355, 9.267314], [1.094507, 9.769091], [1.301729, 10.210408], [1.600936, 10.586611], [1.974556, 10.893054], [2.404504, 11.12353], [2.874243, 11.273908], [3.365169, 11.338504], [3.859713, 11.312654], [5.743319, 11.352444], [7.631575, 11.43306], [9.512598, 11.44494], [10.445874, 11.390682], [11.372432, 11.278025], [11.845272, 11.170022], [12.302608, 11.010859], [13.192993, 10.608299], [14.088029, 10.208325], [14.551566, 10.052777], [15.032674, 9.949425], [16.845483, 9.660553], [17.757055, 9.562369], [18.686714, 9.553056], [19.72076, 9.651758], [20.737235, 9.829008], [21.739241, 10.069821], [22.730912, 10.358693], [23.276098, 10.575734], [23.781494, 10.853753], [24.756111, 11.486789], [25.845967, 12.098638], [26.324491, 12.46244], [26.512594, 12.684648], [26.654186, 12.943029], [26.757024, 13.253605], [26.811282, 13.566248], [26.815409, 13.877857], [26.76735, 14.185849], [26.666065, 14.486605], [26.508969, 14.777544], [26.295544, 15.055046], [26.023726, 15.316012], [25.534867, 15.633305], [25.022754, 15.826059], [24.493587, 15.945431], [23.952018, 16.043616], [23.423885, 16.122681], [22.891618, 16.165056], [21.818815, 16.174359], [20.741878, 16.142319], [19.66805, 16.142319], [10.541992, 16.142319], [11.469584, 13.684071], [0.849561, 13.695956], [0.4408, 13.765203], [0.070797, 13.90783], [-0.258382, 14.115052], [-0.544153, 14.377052], [-0.782898, 14.684526], [-0.973067, 15.028692], [-1.11156, 15.400245], [-1.195793, 15.789886], [-1.195793, 16.557797], [-1.195793, 17.003765], [-1.195793, 18.501865], [-1.202511, 19.003126], [-1.246952, 19.37778], [-1.367875, 19.644947], [-1.60352, 19.821681], [-1.990576, 19.927101], [-2.568319, 19.97981], [-4.445723, 19.999964], [-7.695654, 19.999964], [-10.945585, 19.999964], [-14.195516, 19.999964], [-16.195911, 19.999964], [-18.696016, 19.999964], [-21.195605, 19.999964], [-23.695711, 19.999964], [-24.517366, 20.006714]]); } module half_web() { polygon(points=[[0.0, 9.414078], [0.0, 0.0], [29.67519, 0.0], [29.649353, 0.514362], [29.580623, 1.023892], [29.363582, 2.036751], [29.12432, 3.048576], [28.962572, 4.069701], [28.904694, 5.479435], [28.910896, 7.04058], [28.962572, 8.827034], [27.845845, 8.827034], [27.845845, 4.069701], [27.821556, 3.84026], [27.752828, 3.626318], [27.644307, 3.433047], [27.501164, 3.264066], [27.328563, 3.125056], [27.131676, 3.020154], [26.915152, 2.954009], [26.684676, 2.930754], [24.720971, 2.876494], [21.567676, 2.801045], [19.675285, 2.796912], [17.6413, 2.836703], [15.518432, 2.936438], [13.358874, 3.113687], [11.213786, 3.383957], [9.136393, 3.763777], [8.139038, 3.999938], [7.177856, 4.270208], [6.259566, 4.575613], [5.390885, 4.918746], [4.578015, 5.301667], [3.827157, 5.726448], [3.145544, 6.194636], [2.538863, 6.709335], [2.014347, 7.271575], [1.578198, 7.88394], [1.237134, 8.548499], [0.997355, 9.267319], [0.972034, 9.414078], [0.0, 9.414078]]); } module clasp() { offset(r=0.5)offset(r=-0.5)union() { half_clasp(); mirror([0,1])half_clasp(); } } module web() { offset(r=0.5)offset(r=-0.5)union() { half_web(); mirror([0,1])half_web(); } } // model is flipped over for easy printing rotate([180,0,0])difference() { intersection() { // intersect the 2d profile with the rounded pin profile union(){ // this union defines the 2D profile of the clasp linear_extrude(height=clasp_thick, center=true)clasp(); linear_extrude(height=web_thick, center=true)web(); // add stiffening ribs to the catches translate([-1,(inner_catch)/2,0])rotate([0,90,0])cylinder(d=clasp_thick/3, h=20); translate([-1,-(inner_catch)/2,0])rotate([0,90,0])cylinder(d=clasp_thick/3, h=20); } union() { // rounded pin profile plus rounded buckle extrusion translate([-eps,0,0])hull(){ translate([0,(outer_catch-clasp_thick)/2,0])rotate([0,90,0])cylinder(d=clasp_thick, h=40); translate([0,-(outer_catch-clasp_thick)/2,0])rotate([0,90,0])cylinder(d=clasp_thick, h=40); } hull(){ translate([0,(big_edge-clasp_thick)/2,0])rotate([0,-90,0])cylinder(d=clasp_thick, h=40); translate([0,-(big_edge-clasp_thick)/2,0])rotate([0,-90,0])cylinder(d=clasp_thick, h=40); } } } union() { // this union defines the strap cutout and quick fit notch translate([-15,0,0])rotate([0,-45,0])linear_extrude(height=50, center=true)offset(r=1)square([strap_thick-2, strap_wide-2], center=true); translate([-10,0,2])cube([2*strap_thick,strap_wide/3, 10], center=true); // plus some unnecessary text translate([-26,0,0])rotate([90,0,-90])linear_extrude(height=1, center=true)text("SKELF", font="Roboto:style=Bold Italic", size=clasp_thick*0.7, spacing=1.1, halign="center", valign="center"); } }