79 lines
2.7 KiB
Python
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()
|