# IFC Viewer SDK

Vložitelný IFC prohlížeč jako komponenta pro FM / CAFM / pasportizační / BIM aplikace.
SDK je **stabilní veřejný kontrakt** mezi IFC viewerem a hostitelskou aplikací: pracuje
s objekty přes **GlobalId**, je řízený událostmi a plně skrývá interní knihovny
(web-ifc / thatopen / three).

- **Verze SDK:** 1.1.0 (Semantic Versioning — breaking změna veřejného API zvýší MAJOR)
- **Bez frameworku:** použitelné z JS, TS, Reactu, Vue, Angularu i prostého HTML
- **Offline / same-origin:** IFC se parsuje a vykresluje v prohlížeči; data neopouštějí zařízení
- **Dvě integrační varianty:** přímé JS SDK, nebo iframe + `postMessage`

## Instalační balík ke stažení

Celá distribuce v jednom archivu (bundly, `web-ifc.wasm`, TypeScript definice, React
wrapper, ukázkové integrace a dokumentace):

**➜ [Stáhnout `ifc-viewer-sdk-1.1.0.zip`](/downloads/ifc-viewer-sdk-1.1.0.zip)**

> Přímá URL k balíku: `https://viewer.fmleven.cz/downloads/ifc-viewer-sdk-1.1.0.zip`

### Obsah balíku

| Soubor | Popis |
|--------|-------|
| `ifc-viewer-sdk.js` | SDK, IIFE global `IFCViewerSDK` (pro prosté `<script>`) |
| `ifc-viewer-sdk.esm.js` | SDK jako ES modul (bundler / `<script type="module">`) |
| `ifc-viewer-client.js` / `.esm.js` | Tenký host-side klient pro iframe integraci |
| `ifc-viewer.d.ts` | TypeScript definice veřejného API |
| `web-ifc.wasm` | WASM parser IFC (jednovlákno; **povinné**) |
| `web-ifc-mt.wasm`, `web-ifc-mt.worker.js` | Vícevláknová varianta (volitelné; vyžaduje COOP/COEP) |
| `react/IFCViewer.jsx` | React wrapper (volitelné) |
| `examples/` | Ukázkové integrace (přímá + iframe) |
| `docs/`, `INSTALL.md` | Dokumentace a instalační postup |

## Instalační postup

### Předpoklady
- SDK i `web-ifc.wasm` servírujte ze **stejného původu** (same-origin) jako stránku.
- Server musí posílat MIME `application/wasm` pro `.wasm`.
- Prohlížeč s **WebGL2**. Bez potřeby `unsafe-eval` (bundly jsou CSP-safe).
- Vícevlákno navíc vyžaduje hlavičky `COOP: same-origin` + `COEP: require-corp`
  (jinak zůstaňte u jednovlákna, výchozí).

### 1) Rozbalte balík na svůj web
Nahrajte obsah do statické cesty, např. `/sdk/`:
```
/sdk/ifc-viewer-sdk.js
/sdk/ifc-viewer-sdk.esm.js
/sdk/ifc-viewer.d.ts
/sdk/web-ifc.wasm
/sdk/web-ifc-mt.wasm
/sdk/web-ifc-mt.worker.js
```

### 2A) Prostý `<script>` (global `IFCViewerSDK`)
```html
<div id="ifc-viewer" style="width:100%;height:600px"></div>
<script src="/sdk/ifc-viewer-sdk.js"></script>
<script>
  const { IFCViewer } = IFCViewerSDK;
  const viewer = new IFCViewer({ container: "#ifc-viewer", theme: "light" });
  await viewer.init();
  await viewer.loadModel({ url: "/models/model.ifc" });
  viewer.on("objectClicked", (e) => console.log(e.modelId, e.globalId, e.ifcClass));
</script>
```
Cesta k `web-ifc.wasm` se při načtení přes `<script>` odvodí z adresáře skriptu;
jinak: `new IFCViewer({ container:"#v", wasm:{ path:"/sdk/", absolute:true } })`.

### 2B) ESM / bundler
```js
import { IFCViewer } from "/sdk/ifc-viewer-sdk.esm.js";
const viewer = new IFCViewer({ container: "#ifc-viewer" });
await viewer.init();
```

### 2C) iframe + postMessage
Bez zavádění three/web-ifc do vaší aplikace vložte viewer jako `<iframe>` a řiďte ho
klientem `ifc-viewer-client.js` — viz `examples/iframe-integration/` a
[iframe-integration.md](iframe-integration.md).

### 2D) React
```jsx
import { IFCViewer } from "./react/IFCViewer.jsx";
<IFCViewer src="/models/model.ifc" theme="light" onObjectClick={(e) => …} />
```

### 3) Ověření
Stránka se načte bez chyb; po `loadModel` je vidět 3D model; klik na prvek vyvolá
`objectClicked` s `globalId`. Kompletní postup je i v `INSTALL.md` uvnitř balíku.

## Rychlý start

```html
<script src="/sdk/ifc-viewer-sdk.js"></script>
<div id="ifc-viewer" style="width:100%;height:600px"></div>
<script>
  const { IFCViewer } = IFCViewerSDK;
  const viewer = new IFCViewer({ container: "#ifc-viewer" });
  await viewer.init();
  await viewer.loadModel({ url: "/models/model.ifc" });

  viewer.on("objectClicked", (e) => {
    console.log(e.modelId, e.globalId, e.ifcClass);  // → napojení na FM databázi
  });
</script>
```

ESM varianta:

```js
import { IFCViewer } from "@leven/ifc-viewer";   // sdk/dist/ifc-viewer-sdk.esm.js
```

## Obsah dokumentace

| Dokument | Téma |
|----------|------|
| [getting-started.md](getting-started.md) | Instalace, inicializace, konfigurace |
| [loading-models.md](loading-models.md) | Načítání IFC (soubor, URL, ArrayBuffer, autorizace, federace) |
| [selection.md](selection.md) | Výběr objektů a událost výběru |
| [properties.md](properties.md) | Standardizované IFC vlastnosti |
| [visibility.md](visibility.md) | Zobrazení, skrytí, izolace |
| [colors.md](colors.md) | Zvýraznění a barvy skupin |
| [camera.md](camera.md) | Ovládání kamery, pohledy, ViewerState |
| [events.md](events.md) | Event systém |
| [iframe-integration.md](iframe-integration.md) | iframe + postMessage most |
| [api-reference.md](api-reference.md) | Kompletní referenční přehled API |

## Architektura

```
HOST APPLICATION  (FM / CAFM / Pasport / BIM)
        │  veřejné API (GlobalId, ViewerState)
        ▼
IFC INTEGRATION LAYER  (IFCViewer fasáda — tento SDK)
        │  ViewerCore (na UI nezávislé jádro)
        ▼
IFC VIEWER CORE  (web-ifc / thatopen / three — skryté)
        ▲  Events
        └──────────────► HOST APPLICATION
```

Interní knihovny nejsou součástí veřejného API a lze je vyměnit bez změny kontraktu.

## Bezpečnost dat

Viz [Bezpečnost](#) níže a `iframe-integration.md`. IFC data se bez explicitní
konfigurace neodesílají na žádný externí server: `IFC → prohlížeč → lokální parsing →
WebGL`. Vlastní zdroj (URL/hlavičky/loader) určuje hostitel. Telemetrie: SDK žádnou
neodesílá.
