diff --git a/model/pointer.FCMacro b/model/pointer.FCMacro index c310bc1..e8d913b 100644 --- a/model/pointer.FCMacro +++ b/model/pointer.FCMacro @@ -41,9 +41,9 @@ BAT_L, BAT_W, BAT_H = 50.0, 12.0, 12.0 BAT_X, BAT_Y = BRD_X + BRD_L + 8.0 + 5.0, (W - BAT_W) / 2.0 BAT_CLIP_Y = 8.0 BTN_X, BTN_CY, BTN_HOLE_R = 28.0, W / 2.0, 10.0 -CAP_SHAFT_R, CAP_SHAFT_H = 9.6, WALL +CAP_SHAFT_R, CAP_SHAFT_H = 9.6, WALL + 1.0 # +1mm taller shaft so cap sits flush CAP_RIM_R, CAP_RIM_H = 12.0, 1.5 -NUBBIN_R, NUBBIN_H = 4.2, 1.0 +CAP_CAVITY_R, CAP_CAVITY_H = 5.2, 2.5 # Hollow cavity replaces nubbin — clears button dome BTN_DOME_R, BTN_DOME_SAG = 14.0, 0.6 PCB_BOT_Z = SPLIT_Z + 1.5 @@ -128,7 +128,11 @@ for cx, cy, ix, iy in [(BRD_X, BRD_Y, 1, 1), (BRD_X+BRD_L, BRD_Y, -1, 1), POST_R = 1.75 POST_TAPER_EXTRA = 0.3 # Extra radius at base POST_TAPER_H = 6.0 # Height over which the taper blends to nominal radius -for px, py in [(BTN_X+ox, BTN_CY+oy) for ox in [-POST_OFFS_X, POST_OFFS_X] for oy in [-POST_OFFS_Y, POST_OFFS_Y]]: +BACK_POST_SHIFT = POST_R # Shift back posts by half a post diameter +for ox in [-POST_OFFS_X, POST_OFFS_X]: + for oy in [-POST_OFFS_Y, POST_OFFS_Y]: + px = BTN_X + ox + (BACK_POST_SHIFT if ox > 0 else 0) + py = BTN_CY + oy post = cyl(POST_R, POST_H, px, py, WALL) # Tapered cone base: wider at bottom, blends to post radius at POST_TAPER_H taper = Part.makeCone(POST_R + POST_TAPER_EXTRA, POST_R, POST_TAPER_H, @@ -175,7 +179,9 @@ top_shell = top_shell.cut(box(rec_w, rec_d, RIDGE_H+TOL, L/2-rec_w/2, W-GROOVE_T # Button & Cap top_shell = top_shell.cut(cyl(BTN_HOLE_R, H, BTN_X, BTN_CY, SPLIT_Z)) top_shell = top_shell.cut(Part.makeSphere(BTN_DOME_R, Base.Vector(BTN_X, BTN_CY, H - WALL - BTN_DOME_R + BTN_DOME_SAG))) -cap = cyl(CAP_SHAFT_R, CAP_SHAFT_H).fuse(cyl(CAP_RIM_R, CAP_RIM_H, 0, 0, -CAP_RIM_H)).fuse(cyl(NUBBIN_R, NUBBIN_H, 0, 0, -CAP_RIM_H - NUBBIN_H)) +cap = cyl(CAP_SHAFT_R, CAP_SHAFT_H).fuse(cyl(CAP_RIM_R, CAP_RIM_H, 0, 0, -CAP_RIM_H)) +# Hollow cavity in bottom of shaft — button dome nests inside instead of a protruding nubbin +cap = cap.cut(cyl(CAP_CAVITY_R, CAP_CAVITY_H, 0, 0, -CAP_RIM_H)) cap_placed = cap.copy(); cap_placed.translate(Base.Vector(BTN_X, BTN_CY, H - CAP_SHAFT_H)) # ─── REGISTER ────────────────────────────────────────────────────────────────