feat: integrate SimpleCADAPI 2.0.2 CAD workflows
This commit is contained in:
@@ -0,0 +1,108 @@
|
||||
"""Declare, propagate, validate, and serialize a dimension tolerance chain.
|
||||
|
||||
Run from the repository root with:
|
||||
uv run python examples/04_dimension_tolerance_chain.py
|
||||
"""
|
||||
|
||||
import json
|
||||
from pathlib import Path
|
||||
|
||||
import simplecadapi as scad
|
||||
|
||||
|
||||
OUT = Path("examples/out")
|
||||
|
||||
|
||||
@scad.model(graph_id="dimension_tolerance_chain")
|
||||
def build_model():
|
||||
housing_span = scad.var(
|
||||
name="housing_span",
|
||||
default=100.0,
|
||||
unit="mm",
|
||||
tolerance=0.15,
|
||||
comment="Internal housing span",
|
||||
)
|
||||
bearing_width = scad.var(
|
||||
name="bearing_width",
|
||||
default=2.0,
|
||||
unit="cm",
|
||||
tolerance=(-0.04, 0.05),
|
||||
tolerance_unit="mm",
|
||||
comment="Bearing width",
|
||||
)
|
||||
spacer_width = scad.var(
|
||||
name="spacer_width",
|
||||
default=79.4,
|
||||
unit="mm",
|
||||
tolerance=0.05,
|
||||
comment="Spacer width",
|
||||
)
|
||||
axial_clearance = housing_span - bearing_width - spacer_width
|
||||
|
||||
worst_case = scad.analyze_tolerance(
|
||||
value=axial_clearance,
|
||||
method="worst_case",
|
||||
)
|
||||
rss = scad.analyze_tolerance(value=axial_clearance, method="rss")
|
||||
|
||||
housing = scad.make_box_rsolid(
|
||||
width=housing_span,
|
||||
height=10.0,
|
||||
depth=10.0,
|
||||
tag_prefix="tolerance_chain.housing",
|
||||
result_tag="part.tolerance_chain.housing",
|
||||
)
|
||||
session = scad.get_active_session()
|
||||
if session is None:
|
||||
raise RuntimeError("dimension tolerance model has no active session")
|
||||
session.require_tolerance(
|
||||
value=axial_clearance,
|
||||
tolerance=(-0.25, 0.24),
|
||||
tolerance_unit="mm",
|
||||
method="worst_case",
|
||||
name="axial_clearance",
|
||||
)
|
||||
report = session.validate_tolerances(raise_on_failure=True)
|
||||
scad.capture_result(value=housing)
|
||||
return {
|
||||
"housing": housing,
|
||||
"worst_case": worst_case,
|
||||
"rss": rss,
|
||||
"report": report,
|
||||
}
|
||||
|
||||
|
||||
def main() -> None:
|
||||
OUT.mkdir(parents=True, exist_ok=True)
|
||||
result = build_model()
|
||||
report_data = result.value
|
||||
(OUT / "dimension_tolerance_chain.model.json").write_text(
|
||||
result.model_json,
|
||||
encoding="utf-8",
|
||||
)
|
||||
|
||||
worst_case = report_data["worst_case"]
|
||||
rss = report_data["rss"]
|
||||
print("housing_volume", round(report_data["housing"].get_volume(), 3))
|
||||
print(
|
||||
"worst_case",
|
||||
round(worst_case.nominal, 3),
|
||||
round(worst_case.lower_bound, 3),
|
||||
round(worst_case.upper_bound, 3),
|
||||
)
|
||||
print("result_unit", worst_case.dimension.name, worst_case.unit.symbol)
|
||||
print(
|
||||
"rss",
|
||||
round(rss.nominal, 3),
|
||||
round(rss.lower_bound, 3),
|
||||
round(rss.upper_bound, 3),
|
||||
)
|
||||
print("requirements_passed", report_data["report"].passed)
|
||||
print(
|
||||
"serialized_tolerance_graph",
|
||||
"tolerance_graph" in json.loads(result.model_json),
|
||||
)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user