@sequent-org/ifc-viewer 1.0.7-ci.10.0 → 1.0.10-ci.12.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
@@ -13,7 +13,12 @@ IFC 3D model viewer component for web applications. Основан на Three.js
13
13
  npm install @sequent-org/ifc-viewer
14
14
  ```
15
15
 
16
- 2. **Используйте в коде:**
16
+ 2. **Скопируйте WASM файл (один раз):**
17
+ ```bash
18
+ cp node_modules/web-ifc/web-ifc.wasm public/wasm/
19
+ ```
20
+
21
+ 3. **Используйте в коде:**
17
22
  ```javascript
18
23
  import { IfcViewer } from '@sequent-org/ifc-viewer'
19
24
 
@@ -25,7 +30,7 @@ IFC 3D model viewer component for web applications. Основан на Three.js
25
30
  await viewer.init()
26
31
  ```
27
32
 
28
- **Готово!** WASM файл автоматически загружается из пакета. Никаких дополнительных настроек не требуется.
33
+ **Готово!** Пакет автоматически найдет WASM файл по стандартным путям.
29
34
 
30
35
  ## 🚀 Установка
31
36
 
@@ -33,14 +38,21 @@ IFC 3D model viewer component for web applications. Основан на Three.js
33
38
  npm install @sequent-org/ifc-viewer
34
39
  ```
35
40
 
36
- ### Автоматическая настройка WASM
41
+ ### 📁 Настройка WASM файла
37
42
 
38
- **WASM файл автоматически включается в пакет** - никаких дополнительных настроек не требуется!
43
+ После установки пакета скопируйте WASM файл в публичную папку:
44
+
45
+ ```bash
46
+ # Скопируйте web-ifc.wasm в папку public/wasm/
47
+ cp node_modules/web-ifc/web-ifc.wasm public/wasm/
48
+ ```
39
49
 
40
- - WASM файл автоматически загружается из пакета
41
- - Не нужно копировать файлы в публичную папку
42
- - ✅ Работает "из коробки" в любом проекте
43
- - ✅ Совместимо с любыми сборщиками (Vite, Webpack, Rollup)
50
+ **Умный поиск:** Пакет автоматически ищет WASM файл по популярным путям:
51
+ - `/wasm/web-ifc.wasm` (рекомендуемый)
52
+ - `/web-ifc.wasm`
53
+ - `/wasm/`
54
+ - `/node_modules/web-ifc/web-ifc.wasm`
55
+ - И другие стандартные пути
44
56
 
45
57
  **Важно:** Пакет использует парсинг в главном потоке (Web Workers отключены) для максимальной совместимости с различными окружениями.
46
58
 
@@ -103,36 +115,47 @@ function showIfcModal(ifcUrl) {
103
115
  }
104
116
  ```
105
117
 
106
- **Настройка в Laravel:**
118
+ **Настройка WASM файла в Laravel:**
107
119
 
108
- WASM файл автоматически загружается из пакета. Дополнительная настройка не требуется!
120
+ 1. **Скопируйте WASM файл в public папку:**
121
+ ```bash
122
+ cp node_modules/web-ifc/web-ifc.wasm public/wasm/
123
+ ```
124
+
125
+ 2. **Или используйте Laravel Storage:**
126
+ ```bash
127
+ cp node_modules/web-ifc/web-ifc.wasm storage/app/public/
128
+ php artisan storage:link
129
+ ```
109
130
 
110
- **Для кастомных путей (опционально):**
131
+ 3. **Для кастомных путей:**
111
132
  ```javascript
112
133
  const viewer = new IfcViewer({
113
134
  container: container,
114
135
  ifcUrl: ifcUrl,
115
- wasmUrl: '/custom-path/web-ifc.wasm' // Только если нужен кастомный путь
136
+ wasmUrl: '/storage/web-ifc.wasm' // Путь к WASM в Laravel storage
116
137
  })
117
138
  ```
118
139
 
119
- **Важно для Laravel:** Пакет работает "из коробки" без дополнительных настроек Vite.
140
+ **Важно для Laravel:** Убедитесь, что Vite настроен для обслуживания статических файлов из `public/` папки.
120
141
 
121
142
  ## 🔧 Особенности и совместимость
122
143
 
123
144
  ### ✅ Что включено в пакет
124
145
 
125
146
  - **Автономные стили** - не требует Tailwind CSS, Bootstrap или других фреймворков
126
- - **Автоматический WASM** - файл автоматически включается в пакет
147
+ - **Умный поиск WASM** - автоматический поиск по популярным путям
127
148
  - **Отключенные Web Workers** - парсинг в главном потоке для максимальной совместимости
128
149
  - **Fallback защита** - автоматическое переключение на резервные пути при ошибках WASM
129
150
  - **Обработка ошибок** - graceful degradation при критических ошибках
130
- - **Поддержка wasmUrl** - гибкая настройка пути к WASM файлу (опционально)
151
+ - **Поддержка wasmUrl** - гибкая настройка пути к WASM файлу
152
+ - **Патч совместимости Three.js** - автоматическое исправление проблем с mergeGeometries
131
153
 
132
154
  ### 🚫 Что НЕ включено
133
155
 
134
156
  - **IFCWorker** - Web Workers отключены для предотвращения проблем интеграции
135
157
  - **Внешние зависимости** - все стили и ресурсы включены в пакет
158
+ - **WASM файл** - нужно скопировать из node_modules (один раз)
136
159
 
137
160
  ### 🎯 Совместимость
138
161
 
@@ -394,6 +417,25 @@ Failed to load IFCWorker.js
394
417
  npm list @sequent-org/ifc-viewer
395
418
  ```
396
419
 
420
+ ### Проблемы совместимости с Three.js
421
+
422
+ **Ошибка mergeGeometries:**
423
+ ```
424
+ mergeGeometries is not a function
425
+ ```
426
+
427
+ **Решение:** Пакет автоматически применяет патч совместимости для Three.js 0.149+. Если проблемы продолжаются:
428
+
429
+ 1. **Проверьте версию Three.js:**
430
+ ```bash
431
+ npm list three
432
+ ```
433
+
434
+ 2. **Убедитесь, что используется Three.js 0.149+:**
435
+ ```bash
436
+ npm install three@^0.149.0
437
+ ```
438
+
397
439
  2. **Очистите кэш:**
398
440
  ```bash
399
441
  npm cache clean --force
@@ -457,17 +499,17 @@ Cannot resolve module '@sequent-org/ifc-viewer'
457
499
 
458
500
  При помощи с интеграцией пакета учитывайте:
459
501
 
460
- 1. **WASM файл автоматически включен** - никаких дополнительных настроек не требуется
502
+ 1. **Обязательно скопируйте WASM файл** в публичную папку проекта (один раз)
461
503
  2. **Web Workers отключены** - не пытайтесь их включить
462
- 3. **Используйте параметр wasmUrl** только для кастомных путей (опционально)
504
+ 3. **Используйте параметр wasmUrl** для кастомных путей к WASM файлу
463
505
  4. **Пакет полностью автономен** - не требует внешних CSS фреймворков
464
506
  5. **Поддерживает все современные фреймворки** - React, Vue, Angular, Laravel
465
- 6. **Работает "из коробки"** - просто установите и используйте
507
+ 6. **Умный поиск WASM** - автоматически найдет файл по стандартным путям
466
508
 
467
509
  ### Отладка
468
510
 
469
511
  - Проверьте консоль на сообщение "Web Workers отключены"
470
- - WASM файл автоматически загружается из пакета
512
+ - Убедитесь, что WASM файл скопирован в публичную папку
471
513
  - Используйте DevTools → Network для проверки загрузки ресурсов
472
514
  - При проблемах используйте параметр `wasmUrl` для кастомного пути
473
515
 
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.7-ci.10.0",
4
+ "version": "1.0.10-ci.12.0",
5
5
  "type": "module",
6
6
  "description": "IFC 3D model viewer component for web applications",
7
7
  "main": "src/index.js",
@@ -10,12 +10,10 @@
10
10
  ".": {
11
11
  "import": "./src/index.js"
12
12
  },
13
- "./style.css": "./src/style.css",
14
- "./wasm/web-ifc.wasm": "./wasm/web-ifc.wasm"
13
+ "./style.css": "./src/style.css"
15
14
  },
16
15
  "files": [
17
16
  "src/",
18
- "wasm/",
19
17
  "README.md"
20
18
  ],
21
19
  "keywords": [
@@ -2,11 +2,62 @@
2
2
  // Требует three@^0.149 и web-ifc-three совместимой версии
3
3
 
4
4
  import { IFCLoader } from "web-ifc-three/IFCLoader";
5
- // Автоматический импорт WASM файла из пакета
6
- import WEBIFC_WASM_URL from '/wasm/web-ifc.wasm?url';
7
5
  // Примечание: IFCWorker не используется, так как мы отключаем Web Workers
8
6
  // для стабильности работы в различных окружениях
9
7
 
8
+ // Патч совместимости для Three.js 0.149+
9
+ // web-ifc-three ожидает mergeGeometries, но в новой версии Three.js его нет
10
+ import * as THREE from 'three';
11
+ import { mergeBufferGeometries } from 'three/examples/jsm/utils/BufferGeometryUtils.js';
12
+
13
+ // Создаем совместимую функцию mergeGeometries
14
+ function createMergeGeometries() {
15
+ return function mergeGeometries(geometries, useGroups = false) {
16
+ if (!Array.isArray(geometries) || geometries.length === 0) return null;
17
+ const prepared = [];
18
+ for (const g of geometries) {
19
+ if (!g) continue;
20
+ const geom = g.isBufferGeometry ? g : new THREE.BufferGeometry().copy(g);
21
+ // Гарантируем наличие индекса, иначе mergeBufferGeometries может падать
22
+ if (!geom.index) {
23
+ const position = geom.getAttribute('position');
24
+ if (!position) continue;
25
+ const count = position.count;
26
+ const IndexArray = count > 65535 ? Uint32Array : Uint16Array;
27
+ const indices = new IndexArray(count);
28
+ for (let i = 0; i < count; i++) indices[i] = i;
29
+ geom.setIndex(new THREE.BufferAttribute(indices, 1));
30
+ }
31
+ prepared.push(geom);
32
+ }
33
+ if (prepared.length === 0) {
34
+ const empty = new THREE.BufferGeometry();
35
+ empty.setAttribute('position', new THREE.Float32BufferAttribute([], 3));
36
+ empty.setIndex(new THREE.BufferAttribute(new Uint16Array(0), 1));
37
+ return empty;
38
+ }
39
+ const merged = mergeBufferGeometries(prepared, useGroups);
40
+ if (merged) return merged;
41
+ const fallback = new THREE.BufferGeometry();
42
+ fallback.setAttribute('position', new THREE.Float32BufferAttribute([], 3));
43
+ fallback.setIndex(new THREE.BufferAttribute(new Uint16Array(0), 1));
44
+ return fallback;
45
+ };
46
+ }
47
+
48
+ // Патчим BufferGeometryUtils если нужно
49
+ if (typeof window !== 'undefined' && window.THREE) {
50
+ try {
51
+ const BufferGeometryUtils = window.THREE.BufferGeometryUtils || {};
52
+ if (!BufferGeometryUtils.mergeGeometries) {
53
+ BufferGeometryUtils.mergeGeometries = createMergeGeometries();
54
+ window.THREE.BufferGeometryUtils = BufferGeometryUtils;
55
+ }
56
+ } catch (error) {
57
+ console.warn('IfcService: не удалось применить патч совместимости:', error.message);
58
+ }
59
+ }
60
+
10
61
  export class IfcService {
11
62
  /**
12
63
  * @param {import('../viewer/Viewer').Viewer} viewer
@@ -81,18 +132,15 @@ export class IfcService {
81
132
  paths.push(this.wasmUrl);
82
133
  }
83
134
 
84
- // 2. WASM файл из пакета (автоматически включен в сборку)
85
- try {
86
- paths.push(WEBIFC_WASM_URL);
87
- } catch (_) {}
88
-
89
- try {
90
- const wasmDir = new URL('.', WEBIFC_WASM_URL).href;
91
- paths.push(wasmDir);
92
- } catch (_) {}
93
-
94
- // 3. Резервные пути для обратной совместимости
95
- paths.push('/wasm/', '/wasm/web-ifc.wasm', '/web-ifc.wasm');
135
+ // 2. Популярные пути по умолчанию
136
+ paths.push(
137
+ '/wasm/web-ifc.wasm', // Стандартный путь в public/wasm/
138
+ '/web-ifc.wasm', // Корневой путь
139
+ '/wasm/', // Директория wasm
140
+ '/node_modules/web-ifc/web-ifc.wasm', // Прямо из node_modules
141
+ './web-ifc.wasm', // Относительный путь
142
+ 'web-ifc.wasm' // Просто имя файла
143
+ );
96
144
 
97
145
  return paths;
98
146
  }