// LapCounter P0 envelope concept, millimeters. NOT FIT-VERIFIED / NOT PRODUCTION CAD. // OpenSCAD: choose part="watch_front", "watch_back", "beacon" or "layout". // Must add actual board mounts, connector geometry, gasket groove and button mechanism. part="layout"; $fn=48; module rounded(w,h,d,r=7){linear_extrude(d)offset(r=r) square([w-2*r,h-2*r],center=true);} module front(){ difference(){ rounded(58,58,24); translate([0,0,-.1])rounded(54,54,22,5); translate([0,-3,21])rounded(27,24,5,2); // Generic lens recess. Actual display alignment remains open. translate([0,-3,23.2])rounded(33,30,2,3); // Side clearance envelopes, not actuated buttons. for(y=[-12,12])translate([27,y,13])rotate([0,90,0])cylinder(d=5,h=6); translate([0,28,9])cube([11,8,5],center=true); for(x=[-23,23],y=[-23,23])translate([x,y,21])cylinder(d=2.4,h=6); } for(y=[-33,33])difference(){translate([0,y,0])rounded(32,10,5,2);translate([0,y,2.5])cube([25,4,6],center=true);} } module back(){difference(){rounded(58,58,2);for(x=[-23,23],y=[-23,23])translate([x,y,-1])cylinder(d=2.4,h=4);}} module beacon(){difference(){rounded(85,105,40,9);translate([0,0,-1])rounded(81,101,38,7);translate([0,35,37])rounded(47,7,5,2);}} if(part=="watch_front")front(); if(part=="watch_back")back(); if(part=="beacon")beacon(); if(part=="layout"){translate([-85,0,0])front();translate([-15,0,0])back();translate([85,0,0])beacon();}