81 lines
2.5 KiB
Markdown
81 lines
2.5 KiB
Markdown
# .wcadlib – Block-Bibliotheks-Paket-Spezifikation
|
||
|
||
WebCAD-Block-Bibliotheken können als `.wcadlib`-Paket geteilt werden.
|
||
Es gibt zwei Formate:
|
||
|
||
## Format 1: JSON-Paket (F1)
|
||
|
||
Ein einzelnes JSON-File mit folgender Struktur:
|
||
|
||
```json
|
||
{
|
||
"format": "wcadlib",
|
||
"version": 1,
|
||
"exported_at": "2026-08-29T00:00:00.000Z",
|
||
"folders": [
|
||
{ "id": "f1", "name": "Veranstaltungstechnik", "parent_id": null }
|
||
],
|
||
"blocks": [
|
||
{
|
||
"name": "Stuhl-Reihe",
|
||
"folder_id": "f1",
|
||
"block_data": "[{...CADElement-Array als JSON-String...]}",
|
||
"svg_data": "<svg ...>"
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
- `block_data` = JSON-String eines **CADElement-Arrays**
|
||
- `svg_data` = eigenständiges SVG (Thumbnail), optional
|
||
- Ordner-Hierarchie via `parent_id` (Import ordnet IDs neu zu)
|
||
|
||
**Endpoints:** `GET /api/global-blocks/export`, `POST /api/global-blocks/import`
|
||
(schreibend: nur library-admin/Rolle admin, siehe H3)
|
||
|
||
## Format 2: ZIP-Paket (F7)
|
||
|
||
Ein echtes ZIP-Archiv mit fester Struktur:
|
||
|
||
```
|
||
library.wcadlib.zip
|
||
├── manifest.json { "format": "wcadlib-zip", "version": 1,
|
||
│ "exported_at": "...", "block_count": N, "folder_count": M }
|
||
├── blocks.json { "folders": [...], "blocks": [
|
||
│ { "name", "folder_id", "block_data",
|
||
│ "thumbnail": "thumbs/<id>.svg" } ] }
|
||
└── thumbs/
|
||
└── <blockId>.svg Thumbnails, Referenz aus blocks.json
|
||
```
|
||
|
||
- `manifest.format` MUSS `wcadlib-zip` sein (sonst 400)
|
||
- `blocks.json` MUSS vorhanden sein (sonst 400); `blocks`-Array Pflicht
|
||
- `thumbnail` verweist relativ auf `thumbs/<id>.svg`
|
||
|
||
**Endpoints:**
|
||
- `GET /api/global-blocks/export-zip` → `application/zip`
|
||
- `POST /api/global-blocks/import-zip` (Body = ZIP als application/zip;
|
||
schreibend: nur library-admin)
|
||
|
||
## Validierungsregeln (Import)
|
||
|
||
| Fehler | HTTP |
|
||
|---|---|
|
||
| Kein valides ZIP (Format 2) | 400 |
|
||
| blocks.json fehlt / invalides JSON | 400 |
|
||
| manifest.format unbekannt | 400 |
|
||
| Kein JSON/blocks-Array (Format 1) | 400 |
|
||
| Nicht authentifiziert | 401 |
|
||
| Rolle != admin (schreibend) | 403 |
|
||
|
||
## CAD-Element-Konventionen (block_data)
|
||
|
||
- `rect`: `x/y` = **Zentrum** der BBox
|
||
- `circle`/`arc`: `el.x/el.y` = **Zentrum**, Winkel in Grad (0° = 3 Uhr, CCW)
|
||
- `line`: `properties.x1/y1/x2/y2`
|
||
- `polyline`/`polygon`: `properties.points`
|
||
- `block_instance`: `properties.blockId` + optional `attrValues` (D12)
|
||
|
||
Beim Drop auf die Zeichenfläche werden Element-IDs neu generiert und
|
||
die Position per Drop-Punkt übersetzt – der Bestand bleibt unverändert.
|