import sand3d as s3d
CUP_OUTER_RADIUS = 30.0
CUP_HEIGHT = 70.0
FLANGE_THICKNESS = 8.0
WALL_THICKNESS = 5.0
FLANGE_RECESS_RADIUS = 20.0
FLANGE_RECESS_DEPTH = 4.0
MOUNT_HOLE_RADIUS = 3.0
MOUNT_HOLE_SPACING = 40.0
RIB_HEIGHT = 25.0
RIB_RADIUS = 4.0
CHAMFER_DISTANCE = 2.0
OUTER_RADIUS = CUP_OUTER_RADIUS + FLANGE_THICKNESS
CAVITY_RADIUS = OUTER_RADIUS - WALL_THICKNESS
BASE_Z = RIB_HEIGHT
body = s3d.at(s3d.cylinder(class="tok-string">"Cup", 2 * OUTER_RADIUS, CUP_HEIGHT), z=BASE_Z)
upper_tool = s3d.at(s3d.cylinder(class="tok-string">"Upper opening tool", 2 * CUP_OUTER_RADIUS, FLANGE_THICKNESS + WALL_THICKNESS + 1.0), z=CUP_HEIGHT - FLANGE_THICKNESS + BASE_Z)
s3d.cut(body, upper_tool)
cavity = s3d.at(s3d.cylinder(class="tok-string">"Interior cavity tool", 2 * CAVITY_RADIUS, CUP_HEIGHT - 2 * WALL_THICKNESS), z=BASE_Z + WALL_THICKNESS)
s3d.cut(body, cavity)
recess_tool = s3d.at(s3d.cylinder(class="tok-string">"Bottom recess tool", 2 * FLANGE_RECESS_RADIUS, FLANGE_RECESS_DEPTH + WALL_THICKNESS + 1.0), z=BASE_Z - (WALL_THICKNESS + 1.0))
s3d.cut(body, recess_tool)
holes = s3d.grid(2, 1, MOUNT_HOLE_SPACING, on=body.face(class="tok-string">"top"))
s3d.hole(body, 2 * MOUNT_HOLE_RADIUS, on=holes, depth=CUP_HEIGHT + RIB_HEIGHT + WALL_THICKNESS + 1.0)
rib_x = CUP_OUTER_RADIUS - WALL_THICKNESS - RIB_RADIUS
rib = s3d.at(s3d.cylinder(class="tok-string">"Rib", 2 * RIB_RADIUS, RIB_HEIGHT), x=rib_x, z=0)
s3d.chamfer(body, CHAMFER_DISTANCE, edges=class="tok-string">"bottom")