Files
cadSet/text-to-cad/models/cad-router-v1/gear_28t_4mm/gear_28t_4mm.py
T
2026-07-22 19:38:36 +08:00

79 lines
2.7 KiB
Python

"""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()