354 lines
11 KiB
Markdown
354 lines
11 KiB
Markdown
# Expolinc Component Library Reference
|
||
|
||
## Overview
|
||
|
||
`ExpolincLib` is a Python module for FreeCAD that provides parametric models of all Expolinc exhibition system components. Each component is a `App::FeaturePython` parametric object — changes to parameters automatically regenerate the geometry.
|
||
|
||
## Module Structure
|
||
|
||
```
|
||
ExpolincLib/
|
||
├── __init__.py # Package init, version, imports
|
||
├── specs.py # Official Expolinc specifications and constants
|
||
├── classic_frame.py # Classic Frame system components
|
||
├── light_frame.py # Light Frame backlit system components
|
||
├── connectors.py # Corner and inline connectors
|
||
├── accessories.py # Storage rooms, doors, shelves
|
||
├── layouts.py # Booth layout assembly functions
|
||
└── bom.py # Bill of materials generation
|
||
```
|
||
|
||
## Common Parameters
|
||
|
||
All components share these standard parameters:
|
||
|
||
| Parameter | Type | Default | Description |
|
||
|---|---|---|---|
|
||
| `width` | float (mm) | — | Component width |
|
||
| `height` | float (mm) | — | Component height |
|
||
| `system` | string | `"classic_frame"` | System type: `"classic_frame"` or `"light_frame"` |
|
||
| `placement` | Placement | `App.Placement()` | Position and rotation in the document |
|
||
|
||
---
|
||
|
||
## Classic Frame
|
||
|
||
### `ClassicFrameWall`
|
||
|
||
Creates a complete Classic Frame wall assembly: aluminum frame + SEG fabric graphic + support feet.
|
||
|
||
**Parameters:**
|
||
|
||
| Parameter | Type | Range | Default | Description |
|
||
|---|---|---|---|---|
|
||
| `width` | int (mm) | 500, 950, 1950, 2950, 3950, 4950 | 1950 | Wall width |
|
||
| `height` | int (mm) | 2500, 3000 | 2500 | Wall height |
|
||
| `is_double_sided` | bool | — | `false` | Double-sided (graphic on both sides) |
|
||
| `finish` | string | `"silver"`, `"white"`, `"black"` | `"silver"` | Profile anodized finish |
|
||
| `include_feet` | bool | — | `true` | Include support feet |
|
||
| `include_graphic` | bool | — | `true` | Include SEG fabric graphic |
|
||
| `graphic_color` | tuple (R,G,B) | 0–255 per channel | `(255,255,255)` | Placeholder graphic color |
|
||
|
||
**Available sizes:**
|
||
|
||
| Width (mm) | Height 2500mm | Height 3000mm |
|
||
|---|---|---|
|
||
| 500 | ✓ | ✓ |
|
||
| 950 | ✓ | ✓ |
|
||
| 1950 | ✓ | ✓ |
|
||
| 2950 | ✓ | ✓ |
|
||
| 3950 | ✓ | ✓ |
|
||
| 4950 | ✓ | ✓ |
|
||
|
||
**Example:**
|
||
|
||
```python
|
||
from ExpolincLib.classic_frame import ClassicFrameWall
|
||
|
||
wall = ClassicFrameWall(
|
||
width=2950,
|
||
height=2500,
|
||
is_double_sided=True,
|
||
finish="silver"
|
||
)
|
||
doc.addObject("Part::FeaturePython", "Wall_2950x2500", wall)
|
||
```
|
||
|
||
### `ClassicFrameProfile`
|
||
|
||
A single aluminum extrusion profile (one section of a frame). Used internally by `ClassicFrameWall`.
|
||
|
||
**Parameters:** `length`, `profile_type` (`"horizontal"`, `"vertical"`), `finish`
|
||
|
||
---
|
||
|
||
## Light Frame
|
||
|
||
### `LightFrameWall`
|
||
|
||
Creates a backlit Light Frame wall: LED frame, diffuser panel, LED strip, power supply.
|
||
|
||
**Parameters:**
|
||
|
||
| Parameter | Type | Range | Default | Description |
|
||
|---|---|---|---|---|
|
||
| `width` | int (mm) | 500, 950, 1950, 2950, 3950, 4950 | 1950 | Wall width |
|
||
| `height` | int (mm) | 2500, 3000 | 2500 | Wall height |
|
||
| `led_temperature` | int (K) | 2700–6500 | 4000 | LED color temperature in Kelvin |
|
||
| `brightness` | int (lm) | 500–3000 | 1000 | LED brightness in lumens |
|
||
| `diffuser_type` | string | `"opal"`, `"microprism"` | `"opal"` | Diffuser type |
|
||
| `include_driver` | bool | — | `true` | Include LED driver/power supply |
|
||
|
||
**Example:**
|
||
|
||
```python
|
||
from ExpolincLib.light_frame import LightFrameWall
|
||
|
||
backlit = LightFrameWall(
|
||
width=2950,
|
||
height=2500,
|
||
led_temperature=4000,
|
||
brightness=1500
|
||
)
|
||
```
|
||
|
||
---
|
||
|
||
## Connectors
|
||
|
||
### `CornerConnector90`
|
||
|
||
Creates a 90° corner connector joining two walls at right angles.
|
||
|
||
**Parameters:** `wall_thickness`, `finish`
|
||
|
||
### `InlineConnector180`
|
||
|
||
Creates an inline connector joining two wall sections end-to-end.
|
||
|
||
**Parameters:** `wall_thickness`, `finish`
|
||
|
||
### `TConnector`
|
||
|
||
Creates a T-connector for three-way junctions.
|
||
|
||
**Parameters:** `wall_thickness`, `finish`
|
||
|
||
**Example:**
|
||
|
||
```python
|
||
from ExpolincLib.connectors import CornerConnector90
|
||
|
||
corner = CornerConnector90(wall_thickness=40, finish="silver")
|
||
```
|
||
|
||
The `layouts.py` module automatically places appropriate connectors when building booth layouts.
|
||
|
||
---
|
||
|
||
## Accessories
|
||
|
||
### `StorageRoom`
|
||
|
||
Creates an enclosed storage room attached to a wall.
|
||
|
||
| Parameter | Type | Default | Description |
|
||
|---|---|---|---|
|
||
| `width` | int (mm) | 1950 | Room width |
|
||
| `depth` | int (mm) | 1000 | Room depth |
|
||
| `height` | int (mm) | 2500 | Room height |
|
||
| `has_door` | bool | `true` | Include access door |
|
||
| `door_type` | string | `"hinged"` | `"hinged"` or `"sliding"` |
|
||
| `has_shelving` | bool | `false` | Include interior shelves |
|
||
|
||
### `BoothDoor`
|
||
|
||
A door panel for integration into a wall.
|
||
|
||
| Parameter | Type | Default | Description |
|
||
|---|---|---|---|
|
||
| `width` | int (mm) | 900 | Door width |
|
||
| `height` | int (mm) | 2200 | Door height |
|
||
| `type` | string | `"hinged"` | `"hinged"`, `"sliding"`, `"pocket"` |
|
||
| `handle_style` | string | `"pull"` | `"pull"`, `"push"`, `"recessed"` |
|
||
|
||
### `Shelf`
|
||
|
||
A shelf unit for accessory display.
|
||
|
||
| Parameter | Type | Default | Description |
|
||
|---|---|---|---|
|
||
| `width` | int (mm) | 950 | Shelf width |
|
||
| `depth` | int (mm) | 400 | Shelf depth |
|
||
| `count` | int | 3 | Number of shelf levels |
|
||
|
||
---
|
||
|
||
## Data Sources
|
||
|
||
Spec data for `specs.py` is sourced from Expolinc's official materials. All values have been verified against the following sources:
|
||
|
||
| Source | URL | Data |
|
||
|---|---|---|
|
||
| **Expolinc website** — Classic Frame | `expolinc.com/exhibition-stands/classic-frame` | Widths, heights, weights per size, finish options |
|
||
| **Expolinc website** — Light Frame | `expolinc.com/exhibition-stands/light-frame` | Widths, heights, weights, LED options |
|
||
| **Expolinc Catalog 2020/2021** (PDF) | `sgpweb.com/wp-content/uploads/2021/08/Expolinc-Catalog-2020.2021-1.pdf` | Full product catalog with dimensions and specs |
|
||
| **Expolinc Panel Guide 2024** (PDF) | `sesoma.fi/media/wysiwyg/Datasheets/Expolinc_Panel_Guide_Eng_2024.pdf` | Panel thickness, SEG graphic specs |
|
||
| **Expolinc Google Drive** | `drive.google.com/drive/folders/1dc39tZQXvJbQbA7aKwICUiL6y6gq9miC` | CAD files, setup instructions, templates |
|
||
|
||
### 3D Models (Reference Only)
|
||
|
||
Expolinc provides 3D models in SketchUp format. These are **not directly convertible to parametric FreeCAD objects**, but are useful as dimensional reference for building the parametric library:
|
||
|
||
- **SketchUp 3D Warehouse**: `3dwarehouse.sketchup.com/by/expolinc` — official 3D models (.skp)
|
||
- **Google Drive** (per product): Each product folder contains a `3D files/` subdirectory
|
||
|
||
> **Conversion note**: FreeCAD cannot open `.skp` files directly. For reference use, export from SketchUp to Collada (.dae) or OBJ, then import into FreeCAD as a static mesh. The geometry will be non-parametric — use it to verify profile shapes, connector details, and dimensions, then rebuild as FeaturePython parametric objects.
|
||
|
||
#### Recommended Approach
|
||
|
||
Do **not** build an automated SketchUp → FreeCAD pipeline. Here's why:
|
||
|
||
1. **3D Warehouse has no public API** — automated downloading requires scraping (ToS violation)
|
||
2. **Even with perfect conversion**, the output is a static "dumb solid" — you cannot change `width` and have geometry regenerate
|
||
3. The parametric `FeaturePython` objects that ExpolincLib needs must be **hand-coded** anyway
|
||
|
||
**Instead, do this:**
|
||
|
||
1. **Manually download** the SketchUp 3D models from the 3D Warehouse or Google Drive once
|
||
2. **Open in SketchUp** (free version) and export as STL
|
||
3. **Import into FreeCAD** — Part → Create Shape from Mesh → Convert to Solid → Refine. This gives you a reference solid you can measure
|
||
4. **Write the FeaturePython code** manually, using the reference solid for profile cross-sections, connector dimensions, and assembly details
|
||
5. **Cross-check dimensions** against the verified weight/size tables from the official website
|
||
|
||
This produces the parametric library the project actually needs, without the complexity and legal risk of an automated conversion pipeline.
|
||
|
||
### Verified Data
|
||
|
||
The weight and size data in this document have been **confirmed accurate** against the official Expolinc website (retrieved 2026-05-30):
|
||
|
||
| Width × Height | Website | Docs | Match |
|
||
|---|---|---|---|
|
||
| 0.5 × 2.5 m | 8.3 kg | 8.3 kg | ✓ |
|
||
| 0.95 × 2.5 m | 10.5 kg | 10.5 kg | ✓ |
|
||
| 1.95 × 2.5 m | 14.5 kg | 14.5 kg | ✓ |
|
||
| 2.95 × 2.5 m | 16.5 kg | 16.5 kg | ✓ |
|
||
| 3.95 × 2.5 m | 20.4 kg | 20.4 kg | ✓ |
|
||
| 4.95 × 2.5 m | 25.0 kg | 25.0 kg | ✓ |
|
||
|
||
## Specifications (specs.py)
|
||
|
||
The `specs.py` module contains Expolinc dimensional data and constraints used throughout the library.
|
||
|
||
```python
|
||
# Available sizes
|
||
CLASSIC_FRAME_SIZES = {
|
||
"widths": [500, 950, 1950, 2950, 3950, 4950], # mm
|
||
"heights": [2500, 3000], # mm
|
||
}
|
||
|
||
# Weight tables (kg per component)
|
||
CLASSIC_FRAME_WEIGHTS = {
|
||
(1950, 2500): 14.5,
|
||
(2950, 2500): 16.5,
|
||
(3950, 2500): 20.4,
|
||
(4950, 2500): 25.0,
|
||
(1950, 3000): 18.3,
|
||
(2950, 3000): 23.3,
|
||
(3950, 3000): 26.3,
|
||
(4950, 3000): 28.5,
|
||
}
|
||
|
||
# Material properties
|
||
ALUMINUM_PROFILE = {
|
||
"material": "AlMgSi0.5 (EN AW-6060)",
|
||
"finish": "Silver anodized (E6/EV1)",
|
||
"profile_thickness": 1.5, # mm
|
||
"frame_depth": 40, # mm
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## Layout Functions (layouts.py)
|
||
|
||
### `build_inline_booth(doc, width, depth, height, **kwargs)`
|
||
|
||
Creates an inline (row) booth — one back wall with optional side walls.
|
||
|
||
**Returns:** `dict` with keys `walls`, `connectors`, `accessories`, `bom_data`
|
||
|
||
### `build_corner_booth(doc, wall_a, wall_b, height, **kwargs)`
|
||
|
||
Creates a corner booth — two walls at 90° with access from two aisles.
|
||
|
||
### `build_peninsula_booth(doc, width, depth, height, **kwargs)`
|
||
|
||
Creates a peninsula booth — U-shaped, open on three sides.
|
||
|
||
### `build_island_booth(doc, width, depth, height, **kwargs)`
|
||
|
||
Creates an island booth — four walls, open on all sides.
|
||
|
||
### `build_custom_booth(doc, wall_specs, **kwargs)`
|
||
|
||
Creates a booth from a list of wall specifications (arbitrary arrangement).
|
||
|
||
**Common kwargs:**
|
||
|
||
| Parameter | Type | Default | Description |
|
||
|---|---|---|---|
|
||
| `backlit_walls` | list[int] | `[]` | Indices of walls to make backlit |
|
||
| `storage_rooms` | list[dict] | `[]` | Storage room config per wall |
|
||
| `add_connectors` | bool | `true` | Auto-add connectors between walls |
|
||
| `grid_size` | int (mm) | 990 | Layout grid alignment |
|
||
|
||
---
|
||
|
||
## BOM Generation (bom.py)
|
||
|
||
### `generate_bom(doc, format="dict")`
|
||
|
||
Traverses the FreeCAD document and collects all Expolinc components into a bill of materials.
|
||
|
||
**Returns format:**
|
||
|
||
```python
|
||
{
|
||
"project": "My Booth",
|
||
"date": "2026-05-30",
|
||
"layout": "island",
|
||
"dimensions": {"width": 6000, "depth": 4000, "height": 2500},
|
||
"components": [
|
||
{
|
||
"id": "CF-4950-2500",
|
||
"system": "classic_frame",
|
||
"type": "wall",
|
||
"quantity": 2,
|
||
"width": 4950,
|
||
"height": 2500,
|
||
"weight_kg": 25.0,
|
||
"total_weight_kg": 50.0,
|
||
},
|
||
...
|
||
],
|
||
"totals": {
|
||
"component_count": 12,
|
||
"total_weight_kg": 120.5,
|
||
"seg_area_m2": 49.5,
|
||
"connector_count": {"90deg": 4, "180deg": 0, "T": 0},
|
||
"transport_cases": [
|
||
{"type": "Standard Case XL", "quantity": 2}
|
||
],
|
||
}
|
||
}
|
||
```
|
||
|
||
### `export_bom_to_csv(doc, filepath)`
|
||
|
||
Exports BOM to CSV file.
|
||
|
||
### `export_bom_to_spreadsheet(doc)`
|
||
|
||
Creates a FreeCAD Spreadsheet object with BOM data in the current document.
|