Skip to content

Commit 7ef09f5

Browse files
committed
Add eight modular aluminium extrusion sections and 48 presets
1 parent d031497 commit 7ef09f5

26 files changed

Lines changed: 1406 additions & 1 deletion

README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ The library uses independent part modules, including the requested bearing famil
7373
| Servo linkages | Single, double, cross, six-arm and disc horns; clamping arms; servo spline gears; pushrod, female/male threaded and cable clevis ends |
7474
| Pistons & rods | Compressor/engine hollow pistons and pneumatic disks; separate rings, seals and wrist pins; rods with bushings, bearing shells and removable big-end caps |
7575
| Enclosures & structural | Open enclosure, L bracket and round spacer |
76+
| Aluminium profiles | EU 1020/1030/1040/1050, 2020, 2040, GB1020H and 40 × 15 sections, with open slots, through bores and editable cut length |
7677

7778
Standard fastener selection starts with the available catalog thread and length sizes. **Custom dimensions** exposes thread pitch, handedness, coverage, start offset from the tip, length and smooth shoulder diameter. Choose a modeled helical thread, a smooth thread envelope or no thread. Countersunk nominal length includes the head; other headed fasteners use length under the head. Irrelevant fields disappear when a variant changes. Switching head or point type initializes sensible editable dimensions.
7879

@@ -100,6 +101,8 @@ The servo linkage extension adds 28 horn references, 16 servo gear presets (13 a
100101

101102
Find **Piston** and **Connecting rod** under **MOTION → PISTONS & CONNECTING RODS**. Piston catalog presets include all eight supplied nominal sizes: 42, 47, 48, 51, 65, 70, 80 and 90 mm. Other dimensions, pneumatic configurations and connecting-rod presets are editable prototype examples. Both packages support assembled, exploded and body-only states, with movable FreeCAD components. See [piston and connecting-rod coverage](docs/piston-linkages.md) for reference evidence, editing and verification.
102103

104+
Find **Aluminium extrusion / T-slot profile** under **STRUCTURAL → ALUMINIUM PROFILES**. Eight supplied sections have 48 presets; the four low EU profiles include all listed lengths from 50 to 550 mm. Other lengths and undimensioned internals remain editable prototype settings. See [aluminium profile coverage and cross sections](docs/aluminium-profiles.md).
105+
103106
The [native validation report](data/reference-expansion-native-validation.json) records FreeCAD solid checks, STEP round trips, sampled clearances and preview comparisons for the reference expansion. Repeatable ball-screw checks are documented in the [validation guide](docs/ball-screw-catalog.md#repeating-native-validation).
104107

105108
The [assembly export guide](docs/freecad-assemblies.md) explains component editing and the guided ball screw axis. Its [native audit](data/freecad-assembly-validation.json) covers 39 complete macros, independent component movement, STEP/FCStd reload and rollback cleanup.
Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
{
2+
"checkedAt": "2026-09-14T02:24:52.514432+00:00",
3+
"freecadVersion": [
4+
"1",
5+
"0",
6+
"2",
7+
"39319 (Git)",
8+
"https://github.com/FreeCAD/FreeCAD",
9+
"2025/08/05 20:19:07",
10+
"(HEAD detached at 1.0.2)",
11+
"256fc7eff3379911ab5daf88e10182c509aa8052"
12+
],
13+
"casesRequested": 8,
14+
"passed": 8,
15+
"failed": 0,
16+
"cases": [
17+
{
18+
"id": "eu1020",
19+
"codeSha256": "325f26a2d0568d4f49a504a20a8127735561f84782db4b8e35d8bd26530e75fb",
20+
"passed": true,
21+
"dimensions": [
22+
20.0,
23+
10.0,
24+
550.0
25+
],
26+
"volume": 66612.00999692145,
27+
"relativePreviewVolumeError": 9.12167340642459e-05,
28+
"sectionProbes": 513,
29+
"stepRoundtrip": true,
30+
"durationSeconds": 0.5223012500209734
31+
},
32+
{
33+
"id": "eu1030",
34+
"codeSha256": "8ca19245705becfb7226c9371db6435120538afdf91314f90d00b886f42b9ed9",
35+
"passed": true,
36+
"dimensions": [
37+
29.8,
38+
9.9,
39+
50.0
40+
],
41+
"volume": 8650.637166943268,
42+
"relativePreviewVolumeError": 1.095113674621564e-07,
43+
"sectionProbes": 513,
44+
"stepRoundtrip": true,
45+
"durationSeconds": 1.1483827090123668
46+
},
47+
{
48+
"id": "eu1040",
49+
"codeSha256": "5ea23c6ee008a40fad42a841a12302393cc546d53fca16dfd3c250542497a340",
50+
"passed": true,
51+
"dimensions": [
52+
40.0,
53+
10.0,
54+
550.0
55+
],
56+
"volume": 127578.08704699276,
57+
"relativePreviewVolumeError": 2.7522855341880526e-05,
58+
"sectionProbes": 512,
59+
"stepRoundtrip": true,
60+
"durationSeconds": 0.6409059999859892
61+
},
62+
{
63+
"id": "eu1050",
64+
"codeSha256": "e0c51a0920d9706cf02945233fc89b33426cecdd94d14160ad8b521b015d7af2",
65+
"passed": true,
66+
"dimensions": [
67+
50.0,
68+
10.0,
69+
50.0
70+
],
71+
"volume": 15550.97903062102,
72+
"relativePreviewVolumeError": 1.8494376714296133e-05,
73+
"sectionProbes": 513,
74+
"stepRoundtrip": true,
75+
"durationSeconds": 1.7316534160054289
76+
},
77+
{
78+
"id": "2020",
79+
"codeSha256": "3f6c3dcd3fb67dab5add279a01368d0beca4b3c93841bddf2f3dc84c46d8d680",
80+
"passed": true,
81+
"dimensions": [
82+
20.0,
83+
20.0,
84+
550.0
85+
],
86+
"volume": 87074.15121277061,
87+
"relativePreviewVolumeError": 4.933320525476424e-05,
88+
"sectionProbes": 512,
89+
"stepRoundtrip": true,
90+
"durationSeconds": 1.684963500010781
91+
},
92+
{
93+
"id": "2040",
94+
"codeSha256": "be48101cb540dce891f11c7c5682f9adace6cbb6b09a69d4218cabf35892c47a",
95+
"passed": true,
96+
"dimensions": [
97+
40.0,
98+
20.0,
99+
50.0
100+
],
101+
"volume": 17445.66233193571,
102+
"relativePreviewVolumeError": 4.4668895884106985e-05,
103+
"sectionProbes": 513,
104+
"stepRoundtrip": true,
105+
"durationSeconds": 1.326045791967772
106+
},
107+
{
108+
"id": "gb1020h",
109+
"codeSha256": "8bc10d314fb15318747cacdd0f7f4feed4d80f98bb3ab919664d382b7c67b4b5",
110+
"passed": true,
111+
"dimensions": [
112+
20.0,
113+
10.0,
114+
550.0
115+
],
116+
"volume": 63524.513503231086,
117+
"relativePreviewVolumeError": 2.7287810184666746e-05,
118+
"sectionProbes": 513,
119+
"stepRoundtrip": true,
120+
"durationSeconds": 0.8736510419985279
121+
},
122+
{
123+
"id": "eu1540",
124+
"codeSha256": "5999cefe5f719449fed9a7559af173ef284df9cb177d1fdc6c1e2886cac7a559",
125+
"passed": true,
126+
"dimensions": [
127+
40.0,
128+
15.0,
129+
50.0
130+
],
131+
"volume": 17305.173788344513,
132+
"relativePreviewVolumeError": 3.50602059783523e-05,
133+
"sectionProbes": 513,
134+
"stepRoundtrip": true,
135+
"durationSeconds": 0.6971765839844011
136+
}
137+
]
138+
}

docs/aluminium-profile-sections.svg

Lines changed: 1 addition & 0 deletions
Loading

docs/aluminium-profiles.md

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
# Aluminium profiles
2+
3+
Open **STRUCTURAL → ALUMINIUM PROFILES → Aluminium extrusion / T-slot profile**. Select a **Profile section**, then a **Cut length**. **Custom dimensions** exposes the cut length, slot dimensions, bore sizes and internal cavity settings. Changing the section resets its cross-section dimensions while retaining the current length. **Top** camera view looks down the extrusion axis to inspect the cross section.
4+
5+
![Modelled aluminium profile cross sections](aluminium-profile-sections.svg)
6+
7+
| Section | Actual width × height | Open slots | Internal openings | Presets |
8+
| ---------- | --------------------- | ------------------------------- | ------------------------------------ | ------------------------------------------ |
9+
| EU 1020 | 20 × 10 mm | One top T-slot | Two bores, Ø4.2 | Eleven lengths, 50–550 mm |
10+
| EU 1030 | 29.8 × 9.9 mm | One top T-slot, two side slots | None | Eleven lengths, 50–550 mm |
11+
| EU 1040 | 40 × 10 mm | Two top T-slots | Two bores, Ø3.2, and a centre cavity | Eleven lengths, 50–550 mm |
12+
| EU 1050 | 50 × 10 mm | Two top T-slots, two side slots | One bore, Ø4.3 | Eleven lengths, 50–550 mm |
13+
| 2020 | 20 × 20 mm | Four face slots | One bore, Ø5 | Reference section; 100 mm prototype length |
14+
| 2040 | 40 × 20 mm | Six face slots | Two bores, Ø5, and a centre cavity | Reference section; 100 mm prototype length |
15+
| GB1020H | 20 × 10 mm | Two side slots | One bore, Ø3.2 | Reference section; 100 mm prototype length |
16+
| EU 40 × 15 | 40 × 15 mm | One top T-slot, two side slots | Two bores, Ø4.4 | Reference section; 100 mm prototype length |
17+
18+
The 48 presets retain the ten supplied reference images. Only the four low EU sections have listed cut lengths, at 50 mm increments. The other section presets deliberately exclude their initial length from verified catalog dimensions. GB1020H keeps the printed width and side-opening tolerances. The three supplied mass-per-metre values remain source specifications and do not change the model's dimensions.
19+
20+
Unspecified cavity widths, bore positions, small radii and internal reliefs are editable prototype geometry. The EU1050 step uses both printed opening widths, 6.2 and 7.2 mm; its step height is illustrative. The 2040 slot depth is derived to preserve the annotated 1.5 mm diagonal web. The 40 × 15 drawing does not print a model code; `eu1540` is only the package's internal identifier. Alloy, temper and material strength are not inferred from the photographs.
21+
22+
The entire implementation is in `src/parts/aluminium-profile`. It can be exported and handed off independently with `npm run parts:export -- aluminium-profile <output-folder>`. Geometry and FreeCAD export share one cross-section definition; the macro creates one solid because each extrusion is a single physical component.
23+
24+
## Verification
25+
26+
`node --import tsx --test tests/aluminium-profile.test.ts` checks source coverage, complete configurations, closed outward meshes, through openings, real undercuts, length scaling, section changes and invalid cavity intersections.
27+
28+
The optional native check is:
29+
30+
```sh
31+
node --import tsx scripts/verify-aluminium-profiles.ts
32+
/Applications/FreeCAD.app/Contents/Resources/bin/python scripts/verify-aluminium-profiles.py
33+
```
34+
35+
Use a FreeCAD-capable Python on other platforms. Local FreeCAD 1.0.2 passed all eight sections: valid closed single solids, nominal bounds, preview/native volume, more than 500 cross-section probes per section, through-length continuity and STEP round trips. Results are recorded in `data/aluminium-profile-native-validation.json`. These native checks do not run in GitHub Pages CI.
306 KB
Loading
354 KB
Loading
435 KB
Loading
147 KB
Loading
129 KB
Loading
165 KB
Loading

0 commit comments

Comments
 (0)