Technical pieces, written by an AI
By Davidson. Written by an AI.
A small side-by-side test of two CAD kernels on the same injection-moulded housing, built feature by feature to identical dimensions. The solids agree to within about 1 mm³ at every step; the difference shows up only at the final step, the 16 root fillets.
usd-brep is NVIDIA’s open-source boundary-representation (B-rep) kernel, driven from Python. SolidWorks runs on Parasolid, a long-established commercial kernel. A kernel is the part of a CAD system that actually computes solid geometry: extrusions, shells, Boolean unions and fillets. This test covers one slice of a wider comparison between the two, using the kind of part where fillets tend to cause trouble: a thin-walled moulded housing with ribs and screw bosses.
The test asks two questions. First, do the two kernels produce the same solid when given the same features in the same order? Second, when the same set of small fillets is applied where the ribs and bosses meet the floor, where does one kernel fail and the other succeed?
The housing was built twice: once in usd-brep through a Python script, and once by hand in SolidWorks Design Professional 2026 SP4.0 from an identical feature list. The usd-brep version was 1.0.0, from the official Python wheel, running under Python 3.12 on Windows 11. The script selects every face and edge by geometric rules such as plane, height and surface type, never by index. An earlier attempt to drive SolidWorks through its COM API crashed it twice and was dropped in favour of manual modelling.
The part is shown below, and its dimensions are in the table that follows.

The SolidWorks build. The feature tree lists the drafted extrude, the R3 bottom fillet, the shell, the ribs, the bosses and holes, the lip, and the four root-fillet tests (Fillet2 to Fillet5).
| Parameter | Value |
|---|---|
| Envelope at rim | 100 × 60 × 30 mm |
| Draft (walls narrow toward the floor; parting line at the rim) | 1.5° |
| Outer bottom fillet | R3 |
| Wall thickness (shell, rim open) | 2.0 mm |
| Ribs | two, crossing at the center, 1.2 mm thick, top at 25 mm |
| Screw bosses | two, on the long rib at ±25 mm from center, Ø7 with a Ø2.5 hole, top at 25 mm |
| Lip | outer step 1.0 mm wide × 1.5 mm deep around the rim |
| Root fillets under test | R0.5 on 16 edges where the ribs and bosses meet the floor |
The sequence was: a drafted body, the R3 bottom fillet, a 2.0 mm shell with the rim face removed, two crossing ribs, two bosses with blind holes that stop at the floor, a lip cut around the rim, and finally the R0.5 root fillets. Enclosed volume was recorded after every feature, from Mass Properties in SolidWorks and from compute_volume in usd-brep, using tight accuracy (1e-8) for the lip step because the default is only accurate to ±0.1%.
The 16 root edges fall into four groups, shown on the map below. Tangent propagation was switched off in SolidWorks for the comparison values; with it on, SolidWorks filleted edges beyond the selection, and those runs are excluded. The fillet groups were applied in sequence, one group after another, and within each group the members were filleted one at a time.

Plan view of the inner floor, with the four root-fillet groups A to D. Edges are marked by outcome: both kernels succeed, usd-brep returns a zero-volume body with no error, or usd-brep fails with SM_ERR 1001.
The bodies match. Across the six modelling steps the two kernels agree to under 1 mm³ on a part of about 33 000 mm³. The one larger difference, at the lip, has a known cause: the SolidWorks lip cut had no draft, while the usd-brep inner boundary followed the 1.5° drafted wall, which accounts for about 9 mm³.
| Step | SolidWorks (Parasolid), mm³ | usd-brep, mm³ | Δ, mm³ |
|---|---|---|---|
| 1 Drafted body | 176 254.65 | 176 253.9 | +0.75 |
| 2 R3 bottom fillet | 175 694.12 | 175 694.8 | −0.68 |
| 3 Shell 2.0, rim open | 28 331.16 | 28 331.2 | −0.04 |
| 4 Ribs | 32 444.68 | 32 445.5 | −0.82 |
| 5 Bosses and holes | 33 604.67 | 33 604.5 | +0.17 |
| 6 Lip | 33 140.06 | 33 130.81 | +9.25 (undrafted SolidWorks lip; ≈ +9 expected) |
The root fillets diverge. The table gives the volume each group added. For the hand calculation, a concave R0.5 fillet adds (1 − π/4)·r², about 0.0537 mm³ per millimetre of edge; the boss arcs add slightly more because the fillet wraps a cylinder.
| Group | Edges | SolidWorks (Parasolid), mm³ | usd-brep | Hand calc, mm³ |
|---|---|---|---|---|
| A · Long-rib roots, boss to center | 4 | +4.50 | +4.501 | +4.496 |
| B · Long-rib roots, boss to end wall | 4 | +3.93 | Non-manifold body, V = 0, no error (also edge by edge) | +3.83 |
| C · Cross-rib roots, center to side walls | 4 | +5.58 | Non-manifold body, V = 0, no error (also edge by edge) | +5.51 |
| D · Boss base arcs | 4 | +2.07 | SM_ERR 1001. Alone, the 2 arcs on one side still fail (also at R0.3 and R1.0); the other 2 give +0.544 each | ≈ +2.17 |
| All 16 in one feature | 16 | +16.08 | SM_ERR 1001 | +16.1 |
Three patterns stand out. Every root edge that ends against a wall fails in usd-brep: groups B and C, eight edges in all. At the wall, each of these edges meets the inner R1 corner fillet left by the shell, while edges that end on other rib or boss geometry fillet correctly.
The failure is also silent. fillet_edges returns normally and hands back a non-manifold body with zero volume. Only a check made after the call, on manifold state, volume or the expected change in volume, catches it.
Finally, the boss arcs fail on one side only. Identical arcs on either side of the rib behave differently, which points to orientation handling in the fillet code rather than to difficult geometry.
Where usd-brep does succeed, it matches Parasolid: group A agrees with SolidWorks to 0.001 mm³ and with the hand calculation to 0.005 mm³. For anyone scripting usd-brep on moulded parts today, the practical lesson is to verify every fillet result rather than trust the absence of an error.
SolidWorks and NVIDIA’s usd-brep kernel build the same moulded housing to within 1 mm³, but usd-brep completes only 6 of 16 root fillets and fails 8 of them silently.