"""Parametric 28-tooth spur gear generated with SimpleCADAPI.""" import json from pathlib import Path import simplecadapi as scad N_TEETH = 28 MODULE_MM = 1.0 PRESSURE_ANGLE_DEG = 20.0 THICKNESS_MM = 4.0 BORE_DIAMETER_MM = 5.0 ADDENDUM_FACTOR = 1.0 CLEARANCE_FACTOR = 0.25 BACKLASH_MM = 0.0 def generate() -> None: output_dir = Path(__file__).resolve().parent with scad.GraphSession() as session: gear_blank = scad.std.gear.make_spur_gear_rsolid( n_teeth=N_TEETH, module=MODULE_MM, pressure_angle=PRESSURE_ANGLE_DEG, gear_height=THICKNESS_MM, addendum_factor=ADDENDUM_FACTOR, clearance_factor=CLEARANCE_FACTOR, backlash=BACKLASH_MM, ) blank_faces = scad.ql.select(items=gear_blank.get_faces()).all() print("gear_blank_faces", len(blank_faces)) bore = scad.make_cylinder_rsolid( radius=BORE_DIAMETER_MM / 2.0, height=THICKNESS_MM + 2.0, bottom_face_center=(0.0, 0.0, -1.0), axis=(0.0, 0.0, 1.0), ) gear = scad.cut_rsolid(gear_blank, bore, skip_non_intersecting=False) gear = scad.apply_tag(shape=gear, tag="role.power_transmission.gear") final_faces = scad.ql.select(items=gear.get_faces()).all() final_edges = scad.ql.select(items=gear.get_edges()).all() print("final_topology", {"faces": len(final_faces), "edges": len(final_edges)}) model_json = scad.export_model_json(session=session, indent=2) (output_dir / "gear_28t_4mm.model.json").write_text(model_json, encoding="utf-8") scad.export_step(shapes=gear, filename=str(output_dir / "gear_28t_4mm.step")) scad.export_stl(shapes=gear, filename=str(output_dir / "gear_28t_4mm.stl")) pitch_diameter_mm = MODULE_MM * N_TEETH outside_diameter_mm = MODULE_MM * (N_TEETH + 2.0 * ADDENDUM_FACTOR) root_diameter_mm = MODULE_MM * ( N_TEETH - 2.0 * (ADDENDUM_FACTOR + CLEARANCE_FACTOR) ) validation = { "n_teeth": N_TEETH, "pitch_diameter_mm": pitch_diameter_mm, "outside_diameter_mm": outside_diameter_mm, "root_diameter_mm": root_diameter_mm, "thickness_mm": THICKNESS_MM, "bore_diameter_mm": BORE_DIAMETER_MM, "volume_mm3": round(gear.get_volume(), 6), "faces": len(final_faces), "edges": len(final_edges), "tags": scad.list_tags(shape=gear), "graph_nodes": session.graph.node_count, } (output_dir / "validation.json").write_text( json.dumps(validation, indent=2, ensure_ascii=False) + "\n", encoding="utf-8", ) print("validation", validation) if __name__ == "__main__": generate()