Spaces:
Sleeping
Sleeping
| from __future__ import annotations | |
| from typing import Literal | |
| from pydantic import BaseModel, Field | |
| MaterialName = Literal["aluminum_6061", "aluminum_7075", "pla", "petg", "steel_1018"] | |
| FeatureType = Literal[ | |
| "rib", | |
| "lightening_hole", | |
| "boss", | |
| "fillet_marker", | |
| "hook_curve", | |
| "clamp_jaw", | |
| "stator_ring", | |
| "stator_tooth", | |
| "seat_panel", | |
| "chair_leg", | |
| "chair_back", | |
| "chair_crossbar", | |
| "decorative_curve", | |
| "generic_panel", | |
| "support_tube", | |
| "curved_tube", | |
| "flat_foot", | |
| "armrest", | |
| "headrest", | |
| "tabletop", | |
| "table_leg", | |
| ] | |
| class Feature(BaseModel): | |
| type: FeatureType | |
| x: float = 0.0 | |
| y: float = 0.0 | |
| x2: float = 0.0 | |
| y2: float = 0.0 | |
| width: float = 0.0 | |
| height: float = 0.0 | |
| radius: float = 0.0 | |
| note: str = "" | |
| class Hole(BaseModel): | |
| x: float | |
| y: float | |
| radius: float | |
| class Design(BaseModel): | |
| title: str = "Untitled design" | |
| rationale: str = "" | |
| material: MaterialName = "aluminum_6061" | |
| load_newtons: float = 120.0 | |
| load_point_x_mm: float = 90.0 | |
| load_point_y_mm: float = 0.0 | |
| base_length_mm: float = 105.0 | |
| base_width_mm: float = 44.0 | |
| base_thickness_mm: float = 4.0 | |
| fixed_holes: list[Hole] = Field(default_factory=list) | |
| features: list[Feature] = Field(default_factory=list) | |
| expected_failure_mode: str = "" | |
| action_plan: list[str] = Field(default_factory=list) | |
| class ToolAction(BaseModel): | |
| tool: str | |
| params: dict = Field(default_factory=dict) | |
| class Material(BaseModel): | |
| density_g_cm3: float | |
| yield_mpa: float | |
| young_mpa: float | |
| thermal_w_mk: float | |
| poisson: float = 0.33 | |
| MATERIALS: dict[str, Material] = { | |
| "aluminum_6061": Material(density_g_cm3=2.70, yield_mpa=276, young_mpa=69000, thermal_w_mk=167), | |
| "aluminum_7075": Material(density_g_cm3=2.81, yield_mpa=503, young_mpa=71700, thermal_w_mk=130), | |
| "pla": Material(density_g_cm3=1.24, yield_mpa=55, young_mpa=3500, thermal_w_mk=0.13), | |
| "petg": Material(density_g_cm3=1.27, yield_mpa=50, young_mpa=2100, thermal_w_mk=0.20), | |
| "steel_1018": Material(density_g_cm3=7.87, yield_mpa=370, young_mpa=200000, thermal_w_mk=51), | |
| } | |
| def sample_design() -> Design: | |
| return Design( | |
| title="Two-rib lightweight cantilever bracket", | |
| rationale=( | |
| "A broad thin base keeps bolt spacing stable, two diagonal ribs move material " | |
| "toward the bending load path, and small lightening holes reduce mass away " | |
| "from the fixed edge." | |
| ), | |
| material="aluminum_6061", | |
| load_newtons=120, | |
| load_point_x_mm=90, | |
| load_point_y_mm=0, | |
| base_length_mm=105, | |
| base_width_mm=44, | |
| base_thickness_mm=4, | |
| fixed_holes=[Hole(x=12, y=-13, radius=3), Hole(x=12, y=13, radius=3)], | |
| features=[ | |
| Feature(type="rib", x=16, y=-14, x2=88, y2=-4, width=5, height=18, note="lower diagonal rib"), | |
| Feature(type="rib", x=16, y=14, x2=88, y2=4, width=5, height=18, note="upper diagonal rib"), | |
| Feature(type="rib", x=18, y=0, x2=96, y2=0, width=4, height=12, note="center spine rib"), | |
| Feature(type="lightening_hole", x=52, y=-13, radius=4, note="low-stress pocket"), | |
| Feature(type="lightening_hole", x=52, y=13, radius=4, note="low-stress pocket"), | |
| Feature(type="boss", x=92, y=0, height=7, radius=6, note="load application boss"), | |
| ], | |
| expected_failure_mode="Bending stress at the fixed edge and rib roots.", | |
| action_plan=[ | |
| "Search the load path", | |
| "Add ribs along tension/compression lines", | |
| "Remove material from low-stress regions", | |
| "Run simulation", | |
| "Iterate dimensions", | |
| ], | |
| ) | |