← Work

Printability prediction

Twenty bracket designs, sliced, scored and ranked. The lightest design was the worst to print; a weighted index picked a 19 g design over both extremes, and four test prints agreed with the printability scores (a small qualitative check).

Four 3D-printed bracket designs on a desk
The four printed designs: the hand-modelled baseline (left) and three generative outcomes, on a Bambu Lab A1 Mini in PLA.
20 designsSliced and scored, including the baseline
65 → 9 gBaseline to lightest design
19 g pickChosen by a mass, volume, stress and printability index
4 printedAgreed with the scores; a small qualitative check
RoleSolo project
WhereNUS, ME3261 CAD/CAM
PeriodAug – Nov 2025
CodeGitHub ↗

What it is

Generative design can produce brackets that pass the stress check but print badly: small bases that peel, thin necks that wobble, and heavy supports. This project scores that risk before printing. I generated nineteen brackets in Fusion 360 alongside a hand-modelled baseline, pulled print metrics for each from the slicer, scored their printability, and trained a model that predicts the score from the design and slicer data. A solo term project for ME3261 Computer-Aided Design and Manufacturing.

The result is a workflow and a selection rule: the lightest design the solver produced (9 g) was the worst to print, and a weighted index across mass, volume, stress and printability picked a 19 g design over both the 65 g baseline and the 9 g extreme. Four test prints agreed with their printability scores, a small qualitative check. Code, dataset and environment are on GitHub.

Workflow

  1. Design space in Fusion 360. A bracket that carries a downward load from a loading region to a mounting face fixed by bolts, with obstacle regions for external rods. Preserved regions for the holes and faces; a starting shape the solver may change.
  2. Generative design runs. ABS as a stiffness proxy for PLA. Objective: minimise mass. Varied across runs: safety factor 1.5 or 1.0; minimum thickness 3.0, 2.5, 1.5 or 1.0 mm; overhang limit 45° or 70°; manufacturing constraints on or off; realistic or extended build orientations.
  3. Slicing. Nineteen outcomes plus one hand-modelled baseline exported as STL and sliced in Bambu Studio for the A1 Mini with default PLA settings and supports on. Recorded per design: support mass and volume, print time, total material.
  4. Scoring. Three geometric risk flags from inspecting each part and its slice preview (small base, thin neck, complexity), a slenderness ratio from the bounding box, and a printability score from 0.1 to 1.0.
  5. Model. Random Forest regressor (scikit-learn, 200 trees) on the 15 numeric features, 70/30 train/test split.
  6. Selection. A weighted index across mass, volume, stress and predicted printability to rank the designs.

The dataset

Twenty rows, one per design. Each carries its generative-design settings, the solver's mass, volume and peak von Mises stress, the four slicer metrics, the slenderness ratio, the three flags and the score. The extremes show the trade-off:

DesignMassPeak stressScore
Baseline (hand-modelled)65 g15 MPa1.0
GD_Realistic_1 (SF 1.5, 3 mm, 45°)38 g13.3 MPa0.9
GD_Unrestricted_2_1 (SF 1.0, 3 mm)19 g20 MPa0.75
GD_Unrestricted_4_2 (SF 1.0, 2.5 mm, 70°)9 g80 MPa0.1
GD_Unrestricted_5_x (SF 1.0, 1.5 mm, 70°)12–13 g89–96 MPa0.1

The solver took the bracket from 65 g to 9 g by raising stress from 15 to 80 MPa and the slenderness ratio from 2.5 to 3.8, and by shrinking the base to almost nothing.

The peak stresses are the maxima from Fusion's linear static solver. They sit at sharp features and load points, so they compare designs rather than predict failure. Even so, the 80–96 MPa peaks on the lightest designs are above what PLA can carry, one more reason the index ranks them below the 19 g pick. The designs were generated at a safety factor of 1.0 or 1.5 for this term project; a bracket for real use would be re-run at a higher factor.

Results

Random Forest feature importance Small-base flag 0.22, slenderness ratio 0.18, max von Mises stress 0.15, then material used, volume and mass at 0.07 each. 0.00 0.05 0.10 0.15 0.20 0.25 Feature importance (sums to 1 over all 15 features) Small-base flag: 0.221 Small-base flag 0.22 Slenderness ratio: 0.182 Slenderness ratio 0.18 Max von Mises stress: 0.146 Max von Mises stress 0.15 Material used: 0.074 Material used 0.07 Part volume: 0.074 Part volume 0.07 Part mass: 0.074 Part mass 0.07 Thin-neck flag: 0.072 Thin-neck flag 0.07 Complexity flag: 0.051 Complexity flag 0.05 Overhang angle: 0.036 Overhang angle 0.04 Support mass: 0.027 Support mass 0.03
Fig 1Feature importance across the 15 features.
Predicted against assigned printability score on the six held-out designs Six test points close to the diagonal; R squared 0.85, mean absolute error 0.095. 0 0 0.25 0.25 0.5 0.5 0.75 0.75 1 1 y = x Assigned 1, predicted 0.81 Assigned 0.1, predicted 0.13 Assigned 0.5, predicted 0.68 Assigned 0.9, predicted 0.83 Assigned 0.75, predicted 0.67 Assigned 0.8, predicted 0.78 Assigned score Predicted
Fig 2Predicted against assigned score on the six test designs.

Small-base flag, slenderness ratio and peak stress carry half the importance between them. Safety factor, minimum thickness and the unrestricted flag are at the bottom: the final geometry matters more than the settings that produced it. High peak stress tracks printability because the same aggressive optimisation that raises stress also thins the part.

The model scores R² 0.85 (MAE 0.095) on the six held-out designs, reproduced from the published script. I set the printability score partly from the three risk flags, and the same flags are inputs to the model, so the R² mostly reflects that scoring rule. The useful result is which measurable features carry the signal: base, slenderness and stress, not the solver settings.

Next steps for a real predictor: labels from repeated physical prints rather than judgement, the flags replaced by features measured automatically from the geometry, and more than one part family.

Physical check

Four designs went to the printer: the baseline and three generative outcomes spread across the score range. The prints followed their printability scores. The baseline and GD_Unrestricted_1_2 printed cleanly. The organic designs needed more support contact and were more delicate off the plate. The lightest design, scored 0.1, is the spindliest of the set and the one that broke in handling.

Printed baseline bracket
Fig 3Baseline: large base, blocky, score 1.0.
Printed high-score generative bracket
Fig 4GD_Unrestricted_1_2: printed cleanly, score 0.85.
Printed medium-score generative bracket
Fig 5GD_Unrestricted_Only_6: organic, more support, score 0.8.
Printed low-score generative bracket
Fig 6GD_Unrestricted_4_2, the 9 g design: two rings on a thin bar, score 0.1.
Broken low-score print next to a high-score one
Fig 7The same design after handling, broken at the bar.
Generative bracket with supports attached
Fig 8Support material still attached under the organic design.

Picking a design

Printability alone would pick the baseline, which is also the heaviest part. A weighted index balances four terms: 0.30 × (1 − mass) + 0.20 × (1 − volume) + 0.25 × (1 − stress) + 0.25 × printability, each min–max normalised across the twenty designs. The top of the ranking is GD_Unrestricted_2_1 at 0.82: 19 g, 20 MPa, printability 0.75. The baseline scores 0.49 and the 9 g design 0.55.

For a single material, mass and volume move together, so in effect half the index rewards a lighter part. That matches the generative-design objective, which was to minimise mass.

Key findings

  • Mass and printability pull apart. The solver's lightest designs were the hardest to print, which is why the selection index carries a printability term.
  • Geometry predicts printing. Base area, slenderness and thickness drove the printability score. The solver settings barely did.
Specification
ModuleME3261 Computer-Aided Design and Manufacturing, NUS; solo project, Aug – Nov 2025
ToolsFusion 360 generative design, Bambu Studio, Python (pandas, scikit-learn, matplotlib), Jupyter, Git
Dataset20 designs × 15 numeric features + score; printable.csv in the repo
ModelRandomForestRegressor, 200 trees, 70/30 split, random_state 42
ResultSelection index picked a 19 g, 20 MPa design; 4 test prints agreed with their printability scores (small qualitative check). Model R² 0.85 on 6 test designs (labels partly derived from input flags)
Printed4 designs on a Bambu Lab A1 Mini in PLA; outcomes consistent with the scores