Files
2026-09-29 09:44:16 +00:00

354 lines
11 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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.