# pyright: reportUnusedCallResult=false, reportWildcardImportFromLibrary=false from build123d import * center_thickness = 10 mop_diameter = 40 mop_arc_size = 180 scraper_diameter = 40 scraper_arc_size = 180 arms_thickness = 5 clamp_length = 50 with BuildPart() as mop_scraper_holder: with BuildSketch() as profile: with BuildLine() as connecting_outline: arc_s = 170 mop_arc = CenterArc((0, (mop_diameter + center_thickness) / -2), mop_diameter / 2, 90 - (arc_s / 2), arc_s) scraper_arc = CenterArc((0, (scraper_diameter + center_thickness) / 2), scraper_diameter / 2, (arc_s / 2) - 90, -arc_s) Line(mop_arc @ 0, scraper_arc @ 0) Line(mop_arc @ 1, scraper_arc @ 1) screw_pos = scraper_arc @ 0.5 make_face() mop_arm = CenterArc((0, (mop_diameter + center_thickness) / -2), mop_diameter / 2, 90 - (mop_arc_size / 2), mop_arc_size) offset(mop_arm, amount=arms_thickness, side=Side.RIGHT) make_face() scraper_arm = CenterArc((0, (scraper_diameter + center_thickness) / 2), scraper_diameter / 2, (scraper_arc_size / 2) - 90, -scraper_arc_size) offset(scraper_arm, amount=arms_thickness, side=Side.LEFT) make_face() extrude(profile.sketch, clamp_length / 2) extrude(profile.sketch, -clamp_length / 2) fillet(mop_scraper_holder.edges().filter_by(Axis.Z), 2) with Locations(Plane((screw_pos.X, screw_pos.Y, 0)).rotated((-90, 0, 0))): CounterBoreHole(3 / 2, 5.6 / 2, 3.2) assert mop_scraper_holder.part is not None export_step(mop_scraper_holder.part, "mop_scraper_holder.step")