# 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.