@sequent-org/ifc-viewer 1.0.3-ci.6.0 → 1.0.3-ci.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -43,7 +43,8 @@ function showIfcModal(ifcUrl) {
43
43
 
44
44
  const viewer = new IfcViewer({
45
45
  container: container,
46
- ifcUrl: ifcUrl
46
+ ifcUrl: ifcUrl,
47
+ wasmUrl: '/storage/web-ifc.wasm' // Путь к WASM в Laravel storage
47
48
  // Минимальный режим по умолчанию - только просмотрщик с верхней панелью
48
49
  })
49
50
 
@@ -53,6 +54,28 @@ function showIfcModal(ifcUrl) {
53
54
  }
54
55
  ```
55
56
 
57
+ **Настройка WASM файла в Laravel:**
58
+
59
+ 1. Скопируйте `web-ifc.wasm` в папку `public/storage/`:
60
+ ```bash
61
+ cp node_modules/web-ifc/web-ifc.wasm public/storage/
62
+ ```
63
+
64
+ 2. Или используйте символическую ссылку:
65
+ ```bash
66
+ php artisan storage:link
67
+ # Затем скопируйте файл в storage/app/public/
68
+ ```
69
+
70
+ 3. Альтернативно, укажите путь к файлу в `node_modules`:
71
+ ```javascript
72
+ const viewer = new IfcViewer({
73
+ container: container,
74
+ ifcUrl: ifcUrl,
75
+ wasmUrl: '/node_modules/web-ifc/web-ifc.wasm'
76
+ })
77
+ ```
78
+
56
79
  ### Загрузка пользовательского файла
57
80
 
58
81
  ```javascript
@@ -74,6 +97,18 @@ fileInput.addEventListener('change', async (e) => {
74
97
  })
75
98
  ```
76
99
 
100
+ ### Кастомный путь к WASM файлу
101
+
102
+ ```javascript
103
+ const viewer = new IfcViewer({
104
+ container: '#viewer-container',
105
+ ifcUrl: '/models/building.ifc',
106
+ wasmUrl: '/custom-path/web-ifc.wasm' // Указываем свой путь к WASM
107
+ })
108
+
109
+ await viewer.init()
110
+ ```
111
+
77
112
  ## ⚙️ Опции конфигурации
78
113
 
79
114
  | Опция | Тип | По умолчанию | Описание |
@@ -81,12 +116,52 @@ fileInput.addEventListener('change', async (e) => {
81
116
  | `container` | `HTMLElement \| string` | **обязательно** | DOM элемент или селектор для контейнера |
82
117
  | `ifcUrl` | `string` | `null` | URL для загрузки IFC файла |
83
118
  | `ifcFile` | `File` | `null` | File объект для загрузки |
119
+ | `wasmUrl` | `string` | `null` | URL для загрузки WASM файла web-ifc |
84
120
  | `showSidebar` | `boolean` | `false` | Показывать боковую панель с деревом |
85
121
  | `showControls` | `boolean` | `false` | Показывать нижние кнопки управления |
86
122
  | `showToolbar` | `boolean` | `true` | Показывать верхнюю панель инструментов |
87
123
  | `autoLoad` | `boolean` | `true` | Автоматически загружать при инициализации |
88
124
  | `theme` | `string` | `'light'` | Тема интерфейса (`'light'` \| `'dark'`) |
89
125
 
126
+ ### 🔧 Подробное описание параметров
127
+
128
+ #### `wasmUrl` - Настройка пути к WASM файлу
129
+
130
+ Параметр `wasmUrl` позволяет указать кастомный путь к WASM файлу библиотеки `web-ifc`. Это особенно полезно при интеграции пакета в проекты с нестандартной структурой ресурсов.
131
+
132
+ **Особенности:**
133
+ - **По умолчанию**: Если не указан, используется автоматически определяемый путь из папки `public/wasm/`
134
+ - **Поддержка форматов**: Полные URL (`https://example.com/web-ifc.wasm`) и относительные пути (`/assets/web-ifc.wasm`)
135
+ - **Обратная совместимость**: При ошибке загрузки кастомного пути автоматически переключается на дефолтный
136
+ - **Обработка ошибок**: В консоль выводится предупреждение при неудачной настройке кастомного пути
137
+
138
+ **Примеры использования:**
139
+
140
+ ```javascript
141
+ // Относительный путь
142
+ const viewer1 = new IfcViewer({
143
+ container: '#viewer',
144
+ wasmUrl: '/assets/web-ifc.wasm'
145
+ })
146
+
147
+ // Полный URL
148
+ const viewer2 = new IfcViewer({
149
+ container: '#viewer',
150
+ wasmUrl: 'https://cdn.example.com/web-ifc.wasm'
151
+ })
152
+
153
+ // Путь с подпапкой
154
+ const viewer3 = new IfcViewer({
155
+ container: '#viewer',
156
+ wasmUrl: '/static/libs/web-ifc.wasm'
157
+ })
158
+ ```
159
+
160
+ **Когда использовать:**
161
+ - При размещении WASM файла в нестандартной папке
162
+ - При использовании CDN для статических ресурсов
163
+ - При интеграции в фреймворки с особой структурой ресурсов (Laravel, Next.js и т.д.)
164
+
90
165
  ## 🎯 API методы
91
166
 
92
167
  ### Основные методы
@@ -196,11 +271,56 @@ npm run test:manual
196
271
  - `.ifczip` - архивы IFC
197
272
  - `.zip` - ZIP архивы с IFC файлами
198
273
 
274
+ ## 🔧 Troubleshooting
275
+
276
+ ### Проблемы с WASM файлом
277
+
278
+ **Ошибка загрузки WASM:**
279
+ ```
280
+ Failed to load web-ifc.wasm
281
+ ```
282
+
283
+ **Решения:**
284
+ 1. **Проверьте путь к файлу:**
285
+ ```javascript
286
+ // Убедитесь, что файл доступен по указанному пути
287
+ const viewer = new IfcViewer({
288
+ container: '#viewer',
289
+ wasmUrl: '/correct-path/web-ifc.wasm'
290
+ })
291
+ ```
292
+
293
+ 2. **Проверьте CORS настройки:**
294
+ - Для локальной разработки используйте относительные пути
295
+ - Для продакшена настройте CORS для WASM файлов
296
+
297
+ 3. **Проверьте MIME-тип:**
298
+ ```nginx
299
+ # В nginx.conf
300
+ location ~* \.wasm$ {
301
+ add_header Content-Type application/wasm;
302
+ }
303
+ ```
304
+
305
+ 4. **Альтернативные пути:**
306
+ ```javascript
307
+ // Попробуйте разные варианты
308
+ wasmUrl: '/web-ifc.wasm' // корень
309
+ wasmUrl: '/assets/web-ifc.wasm' // папка assets
310
+ wasmUrl: '/static/web-ifc.wasm' // папка static
311
+ ```
312
+
313
+ **Отладка:**
314
+ - Откройте DevTools → Network и проверьте загрузку WASM файла
315
+ - Проверьте консоль на предупреждения о `wasmUrl`
316
+ - Убедитесь, что файл `web-ifc.wasm` существует и доступен
317
+
199
318
  ## 🔧 Системные требования
200
319
 
201
320
  - Node.js >= 16
202
- - Современный браузер с поддержкой WebGL
321
+ - Современный браузер с поддержкой WebGL и WebAssembly
203
322
  - Для работы требуются файлы `web-ifc.wasm` в публичной папке проекта
323
+ - Поддержка ES6 модулей в браузере
204
324
 
205
325
  ## 📄 Лицензия
206
326
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@sequent-org/ifc-viewer",
3
3
  "private": false,
4
- "version": "1.0.3-ci.6.0",
4
+ "version": "1.0.3-ci.7.0",
5
5
  "type": "module",
6
6
  "description": "IFC 3D model viewer component for web applications",
7
7
  "main": "src/index.js",
package/src/IfcViewer.js CHANGED
@@ -21,6 +21,7 @@ export class IfcViewer {
21
21
  * @param {HTMLElement|string} options.container - Контейнер для рендера (элемент или селектор)
22
22
  * @param {string} [options.ifcUrl] - URL для загрузки IFC файла
23
23
  * @param {File} [options.ifcFile] - File объект для загрузки IFC файла
24
+ * @param {string} [options.wasmUrl] - URL для загрузки WASM файла web-ifc
24
25
  * @param {boolean} [options.showSidebar=false] - Показывать ли боковую панель с деревом
25
26
  * @param {boolean} [options.showControls=false] - Показывать ли панель управления (нижние кнопки)
26
27
  * @param {boolean} [options.showToolbar=true] - Показывать ли верхнюю панель инструментов
@@ -47,8 +48,9 @@ export class IfcViewer {
47
48
  this.options = {
48
49
  ifcUrl: options.ifcUrl || null,
49
50
  ifcFile: options.ifcFile || null,
51
+ wasmUrl: options.wasmUrl || null,
50
52
  showSidebar: options.showSidebar === true, // по умолчанию false
51
- showControls: options.showControls === true, // по умолчанию false
53
+ showControls: options.showControls === true, // по умолчанию false
52
54
  showToolbar: options.showToolbar !== false, // по умолчанию true
53
55
  autoLoad: options.autoLoad !== false,
54
56
  theme: options.theme || 'light',
@@ -430,7 +432,7 @@ export class IfcViewer {
430
432
  throw new Error('Viewer должен быть инициализирован перед IfcService');
431
433
  }
432
434
 
433
- this.ifcService = new IfcService(this.viewer);
435
+ this.ifcService = new IfcService(this.viewer, this.options.wasmUrl);
434
436
  this.ifcService.init();
435
437
  }
436
438
 
@@ -12,9 +12,11 @@ import IFCWorkerUrl from 'web-ifc-three/IFCWorker.js?url';
12
12
  export class IfcService {
13
13
  /**
14
14
  * @param {import('../viewer/Viewer').Viewer} viewer
15
+ * @param {string} [wasmUrl] - URL для загрузки WASM файла web-ifc
15
16
  */
16
- constructor(viewer) {
17
+ constructor(viewer, wasmUrl = null) {
17
18
  this.viewer = viewer;
19
+ this.wasmUrl = wasmUrl;
18
20
  this.loader = null;
19
21
  this.lastModel = null; // THREE.Object3D модели IFC
20
22
  this.lastFileName = null;
@@ -27,15 +29,19 @@ export class IfcService {
27
29
  this.loader = new IFCLoader();
28
30
  // Отключаем Web Worker: временно парсим в главном потоке для стабильности
29
31
  try { this.loader.ifcManager.useWebWorkers?.(false); } catch(_) {}
30
- // Путь к wasm файлу (скопируйте web-ifc.wasm в public/wasm)
31
- try {
32
- // Преобразуем URL файла wasm в URL каталога и передадим в воркер
33
- const wasmDir = new URL('.', WEBIFC_WASM_URL).href;
34
- this.loader.ifcManager.setWasmPath(wasmDir);
35
- // Дополнительно подстрахуемся передачей полного файла, если версия это поддерживает
36
- try { this.loader.ifcManager.setWasmPath(WEBIFC_WASM_URL); } catch(_) {}
37
- } catch (_) {
38
- this.loader.ifcManager.setWasmPath('/wasm/');
32
+
33
+ // Настройка пути к WASM файлу
34
+ if (this.wasmUrl) {
35
+ // Используем переданный пользователем URL
36
+ try {
37
+ this.loader.ifcManager.setWasmPath(this.wasmUrl);
38
+ } catch (_) {
39
+ console.warn('IfcService: не удалось установить пользовательский wasmUrl:', this.wasmUrl);
40
+ this._setDefaultWasmPath();
41
+ }
42
+ } else {
43
+ // Используем путь по умолчанию
44
+ this._setDefaultWasmPath();
39
45
  }
40
46
  try {
41
47
  this.loader.ifcManager.applyWebIfcConfig?.({
@@ -48,6 +54,22 @@ export class IfcService {
48
54
  } catch(_) {}
49
55
  }
50
56
 
57
+ /**
58
+ * Устанавливает путь к WASM файлу по умолчанию
59
+ * @private
60
+ */
61
+ _setDefaultWasmPath() {
62
+ try {
63
+ // Преобразуем URL файла wasm в URL каталога и передадим в воркер
64
+ const wasmDir = new URL('.', WEBIFC_WASM_URL).href;
65
+ this.loader.ifcManager.setWasmPath(wasmDir);
66
+ // Дополнительно подстрахуемся передачей полного файла, если версия это поддерживает
67
+ try { this.loader.ifcManager.setWasmPath(WEBIFC_WASM_URL); } catch(_) {}
68
+ } catch (_) {
69
+ this.loader.ifcManager.setWasmPath('/wasm/');
70
+ }
71
+ }
72
+
51
73
  /**
52
74
  * Возвращает пространственную структуру IFC (иерархия) для активной модели
53
75
  * Структура: { expressID, type, children: [...] }