A fully parametric FreeCAD add-on (Workbench) for generating custom wooden pallets with optional side-wall crates.
All geometry is driven by internal-dimension parameters and updates automatically on recompute.
- Parametric pallet runners (count, width, height, spacing)
- Auto-calculated top deck planks with gap control
- Optional left/right and front/back side-wall frames
- Vertical reinforcement posts at configurable spacing
- Outer skin panel (single rectangular sheet per side)
- Structured logging to FreeCAD Report View + rotating log file
- Simple Task Panel UI for editing all parameters
- Euro-pallet preset
- BOM (Bill of Materials) export to CSV
- TechDraw 2D drawing export (optional)
X → Internal Width (left–right)
Y → Internal Length (front–back)
Z → Height (up)
Origin: bottom-left-front corner of the INTERNAL cavity
"Internal dimensions" refer to the clear space above the top deck surface and between the inner faces of side walls.
The pallet base (runners + deck) sits below Z = 0 of the internal cavity; side walls surround X and/or Y extents.
- Clone or download this repository.
- Copy (or symlink) the
src/PalletTool/folder into your FreeCADModdirectory:- Linux:
~/.local/share/FreeCAD/Mod/PalletTool - macOS:
~/Library/Application Support/FreeCAD/Mod/PalletTool - Windows:
%APPDATA%\FreeCAD\Mod\PalletTool
- Linux:
- Restart FreeCAD.
- Switch to the Pallet Tool workbench from the workbench selector.
Not yet published. Follow manual steps above.
- Open FreeCAD, switch to Pallet Tool workbench.
- Click Create Pallet from the toolbar or menu.
- A Task Panel opens — enter your internal dimensions and toggle options.
- Click OK. A
Palletobject appears in the model tree. - To edit, double-click the
Palletobject to reopen the Task Panel.
| Parameter | Type | Default | Description |
|---|---|---|---|
InternalWidth |
Length | 1000 mm | Clear internal width (X) |
InternalLength |
Length | 1200 mm | Clear internal length (Y) |
InternalHeight |
Length | 800 mm | Clear internal height of side walls |
RunnerWidth |
Length | 100 mm | Runner cross-section width (X) |
RunnerHeight |
Length | 50 mm | Runner cross-section height (Z) |
RunnerCount |
Integer | 3 | Number of runners |
DeckPlankWidth |
Length | 100 mm | Plank width (X direction) |
DeckPlankThickness |
Length | 50 mm | Plank thickness (Z) |
DeckPlankGap |
Length | 8 mm | Gap between planks |
EnableSideWalls |
Bool | True | Enable left/right walls |
EnableEndWalls |
Bool | False | Enable front/back walls |
FrameMemberWidth |
Length | 50 mm | Frame timber cross-section width |
FrameMemberHeight |
Length | 50 mm | Frame timber cross-section height |
ReinforcementSpacing |
Length | 1200 mm | Max c/c spacing of vertical posts |
SidePanelThickness |
Length | 15 mm | Outer skin panel thickness |
freecad-pallet-tool/
├── src/
│ └── PalletTool/
│ ├── __init__.py # Workbench registration
│ ├── PalletFeature.py # FeaturePython object + ViewProvider
│ ├── PalletGeometry.py # Pure geometry computation
│ ├── PalletTaskPanel.py # Qt Task Panel UI
│ ├── PalletCommands.py # FreeCAD commands (toolbar actions)
│ ├── PalletLogging.py # Structured logging helper
│ ├── PalletBOM.py # BOM export helper
│ └── PalletPresets.py # Named presets (Euro pallet, etc.)
├── resources/
│ ├── icons/
│ │ └── PalletTool.svg
│ └── ui/
│ └── PalletPanel.ui # Qt Designer file (optional, UI built in Python)
├── tests/
│ ├── test_geometry.py
│ ├── test_bom.py
│ └── generate_sample.py # Headless FCStd generation script
├── docs/
│ └── architecture.md
├── .github/
│ └── workflows/
│ └── ci.yml
├── pyproject.toml
├── LICENSE
└── README.md
# Lint
pip install ruff
ruff check src/
# Run geometry unit tests (no FreeCAD needed for pure math)
python -m pytest tests/ -vMIT — see LICENSE.