@sequent-org/ifc-viewer 1.0.7-ci.10.0 → 1.0.14-ci.13.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 +41 -14
- package/package.json +2 -4
- package/src/compat/three-compat-patch.js +58 -0
- package/src/ifc/IfcService.js +30 -14
package/README.md
CHANGED
|
@@ -25,7 +25,7 @@ IFC 3D model viewer component for web applications. Основан на Three.js
|
|
|
25
25
|
await viewer.init()
|
|
26
26
|
```
|
|
27
27
|
|
|
28
|
-
**Готово!**
|
|
28
|
+
**Готово!** Пакет полностью автоматический - никаких дополнительных настроек не требуется.
|
|
29
29
|
|
|
30
30
|
## 🚀 Установка
|
|
31
31
|
|
|
@@ -33,14 +33,20 @@ IFC 3D model viewer component for web applications. Основан на Three.js
|
|
|
33
33
|
npm install @sequent-org/ifc-viewer
|
|
34
34
|
```
|
|
35
35
|
|
|
36
|
-
### ✨
|
|
36
|
+
### ✨ Полная автоматизация
|
|
37
37
|
|
|
38
|
-
|
|
38
|
+
**Никаких дополнительных настроек не требуется!** Пакет автоматически:
|
|
39
39
|
|
|
40
|
-
- ✅ WASM файл
|
|
41
|
-
- ✅
|
|
42
|
-
- ✅
|
|
43
|
-
- ✅
|
|
40
|
+
- ✅ Находит WASM файл из node_modules
|
|
41
|
+
- ✅ Применяет патч совместимости Three.js
|
|
42
|
+
- ✅ Отключает Web Workers для стабильности
|
|
43
|
+
- ✅ Работает в любом проекте "из коробки"
|
|
44
|
+
|
|
45
|
+
**Умный поиск WASM:** Пакет автоматически ищет файл по путям:
|
|
46
|
+
- `/node_modules/web-ifc/web-ifc.wasm` (основной путь)
|
|
47
|
+
- `/wasm/web-ifc.wasm` (если скопировали в public/wasm/)
|
|
48
|
+
- `/web-ifc.wasm` (если скопировали в корень public/)
|
|
49
|
+
- И другие стандартные пути
|
|
44
50
|
|
|
45
51
|
**Важно:** Пакет использует парсинг в главном потоке (Web Workers отключены) для максимальной совместимости с различными окружениями.
|
|
46
52
|
|
|
@@ -105,14 +111,14 @@ function showIfcModal(ifcUrl) {
|
|
|
105
111
|
|
|
106
112
|
**Настройка в Laravel:**
|
|
107
113
|
|
|
108
|
-
WASM файл автоматически загружается из
|
|
114
|
+
WASM файл автоматически загружается из node_modules. Дополнительная настройка не требуется!
|
|
109
115
|
|
|
110
116
|
**Для кастомных путей (опционально):**
|
|
111
117
|
```javascript
|
|
112
118
|
const viewer = new IfcViewer({
|
|
113
119
|
container: container,
|
|
114
120
|
ifcUrl: ifcUrl,
|
|
115
|
-
wasmUrl: '/
|
|
121
|
+
wasmUrl: '/storage/web-ifc.wasm' // Только если нужен кастомный путь
|
|
116
122
|
})
|
|
117
123
|
```
|
|
118
124
|
|
|
@@ -123,16 +129,18 @@ const viewer = new IfcViewer({
|
|
|
123
129
|
### ✅ Что включено в пакет
|
|
124
130
|
|
|
125
131
|
- **Автономные стили** - не требует Tailwind CSS, Bootstrap или других фреймворков
|
|
126
|
-
-
|
|
132
|
+
- **Умный поиск WASM** - автоматический поиск по популярным путям
|
|
127
133
|
- **Отключенные Web Workers** - парсинг в главном потоке для максимальной совместимости
|
|
128
134
|
- **Fallback защита** - автоматическое переключение на резервные пути при ошибках WASM
|
|
129
135
|
- **Обработка ошибок** - graceful degradation при критических ошибках
|
|
130
|
-
- **Поддержка wasmUrl** - гибкая настройка пути к WASM файлу
|
|
136
|
+
- **Поддержка wasmUrl** - гибкая настройка пути к WASM файлу
|
|
137
|
+
- **Патч совместимости Three.js** - автоматическое исправление проблем с mergeGeometries
|
|
131
138
|
|
|
132
139
|
### 🚫 Что НЕ включено
|
|
133
140
|
|
|
134
141
|
- **IFCWorker** - Web Workers отключены для предотвращения проблем интеграции
|
|
135
142
|
- **Внешние зависимости** - все стили и ресурсы включены в пакет
|
|
143
|
+
- **WASM файл** - нужно скопировать из node_modules (один раз)
|
|
136
144
|
|
|
137
145
|
### 🎯 Совместимость
|
|
138
146
|
|
|
@@ -394,6 +402,25 @@ Failed to load IFCWorker.js
|
|
|
394
402
|
npm list @sequent-org/ifc-viewer
|
|
395
403
|
```
|
|
396
404
|
|
|
405
|
+
### Проблемы совместимости с Three.js
|
|
406
|
+
|
|
407
|
+
**Ошибка mergeGeometries:**
|
|
408
|
+
```
|
|
409
|
+
mergeGeometries is not a function
|
|
410
|
+
```
|
|
411
|
+
|
|
412
|
+
**Решение:** Пакет автоматически применяет патч совместимости для Three.js 0.149+. Если проблемы продолжаются:
|
|
413
|
+
|
|
414
|
+
1. **Проверьте версию Three.js:**
|
|
415
|
+
```bash
|
|
416
|
+
npm list three
|
|
417
|
+
```
|
|
418
|
+
|
|
419
|
+
2. **Убедитесь, что используется Three.js 0.149+:**
|
|
420
|
+
```bash
|
|
421
|
+
npm install three@^0.149.0
|
|
422
|
+
```
|
|
423
|
+
|
|
397
424
|
2. **Очистите кэш:**
|
|
398
425
|
```bash
|
|
399
426
|
npm cache clean --force
|
|
@@ -457,9 +484,9 @@ Cannot resolve module '@sequent-org/ifc-viewer'
|
|
|
457
484
|
|
|
458
485
|
При помощи с интеграцией пакета учитывайте:
|
|
459
486
|
|
|
460
|
-
1. **WASM файл автоматически
|
|
487
|
+
1. **WASM файл автоматически найден** - никаких дополнительных настроек не требуется
|
|
461
488
|
2. **Web Workers отключены** - не пытайтесь их включить
|
|
462
|
-
3. **Используйте параметр wasmUrl** только для кастомных путей
|
|
489
|
+
3. **Используйте параметр wasmUrl** только для кастомных путей к WASM файлу
|
|
463
490
|
4. **Пакет полностью автономен** - не требует внешних CSS фреймворков
|
|
464
491
|
5. **Поддерживает все современные фреймворки** - React, Vue, Angular, Laravel
|
|
465
492
|
6. **Работает "из коробки"** - просто установите и используйте
|
|
@@ -467,7 +494,7 @@ Cannot resolve module '@sequent-org/ifc-viewer'
|
|
|
467
494
|
### Отладка
|
|
468
495
|
|
|
469
496
|
- Проверьте консоль на сообщение "Web Workers отключены"
|
|
470
|
-
- WASM файл автоматически загружается из
|
|
497
|
+
- WASM файл автоматически загружается из node_modules
|
|
471
498
|
- Используйте DevTools → Network для проверки загрузки ресурсов
|
|
472
499
|
- При проблемах используйте параметр `wasmUrl` для кастомного пути
|
|
473
500
|
|
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.
|
|
4
|
+
"version": "1.0.14-ci.13.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": [
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
// Патч совместимости для Three.js 0.149+ и web-ifc-three
|
|
2
|
+
// web-ifc-three ожидает mergeGeometries, но в новой версии Three.js его нет
|
|
3
|
+
|
|
4
|
+
import * as THREE from 'three';
|
|
5
|
+
import { mergeBufferGeometries } from 'three/examples/jsm/utils/BufferGeometryUtils.js';
|
|
6
|
+
|
|
7
|
+
// Создаем совместимую функцию mergeGeometries
|
|
8
|
+
function createMergeGeometries() {
|
|
9
|
+
return function mergeGeometries(geometries, useGroups = false) {
|
|
10
|
+
if (!Array.isArray(geometries) || geometries.length === 0) return null;
|
|
11
|
+
const prepared = [];
|
|
12
|
+
for (const g of geometries) {
|
|
13
|
+
if (!g) continue;
|
|
14
|
+
const geom = g.isBufferGeometry ? g : new THREE.BufferGeometry().copy(g);
|
|
15
|
+
// Гарантируем наличие индекса, иначе mergeBufferGeometries может падать
|
|
16
|
+
if (!geom.index) {
|
|
17
|
+
const position = geom.getAttribute('position');
|
|
18
|
+
if (!position) continue;
|
|
19
|
+
const count = position.count;
|
|
20
|
+
const IndexArray = count > 65535 ? Uint32Array : Uint16Array;
|
|
21
|
+
const indices = new IndexArray(count);
|
|
22
|
+
for (let i = 0; i < count; i++) indices[i] = i;
|
|
23
|
+
geom.setIndex(new THREE.BufferAttribute(indices, 1));
|
|
24
|
+
}
|
|
25
|
+
prepared.push(geom);
|
|
26
|
+
}
|
|
27
|
+
if (prepared.length === 0) {
|
|
28
|
+
const empty = new THREE.BufferGeometry();
|
|
29
|
+
empty.setAttribute('position', new THREE.Float32BufferAttribute([], 3));
|
|
30
|
+
empty.setIndex(new THREE.BufferAttribute(new Uint16Array(0), 1));
|
|
31
|
+
return empty;
|
|
32
|
+
}
|
|
33
|
+
const merged = mergeBufferGeometries(prepared, useGroups);
|
|
34
|
+
if (merged) return merged;
|
|
35
|
+
const fallback = new THREE.BufferGeometry();
|
|
36
|
+
fallback.setAttribute('position', new THREE.Float32BufferAttribute([], 3));
|
|
37
|
+
fallback.setIndex(new THREE.BufferAttribute(new Uint16Array(0), 1));
|
|
38
|
+
return fallback;
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Экспортируем совместимую функцию
|
|
43
|
+
export const mergeGeometries = createMergeGeometries();
|
|
44
|
+
export { mergeBufferGeometries };
|
|
45
|
+
|
|
46
|
+
// Патчим глобальный THREE если доступен
|
|
47
|
+
if (typeof window !== 'undefined' && window.THREE) {
|
|
48
|
+
try {
|
|
49
|
+
const BufferGeometryUtils = window.THREE.BufferGeometryUtils || {};
|
|
50
|
+
if (!BufferGeometryUtils.mergeGeometries) {
|
|
51
|
+
BufferGeometryUtils.mergeGeometries = mergeGeometries;
|
|
52
|
+
window.THREE.BufferGeometryUtils = BufferGeometryUtils;
|
|
53
|
+
console.log('✅ Three.js патч: mergeGeometries добавлен в глобальный THREE');
|
|
54
|
+
}
|
|
55
|
+
} catch (error) {
|
|
56
|
+
console.warn('Three.js патч: не удалось применить к глобальному THREE:', error.message);
|
|
57
|
+
}
|
|
58
|
+
}
|
package/src/ifc/IfcService.js
CHANGED
|
@@ -2,11 +2,11 @@
|
|
|
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
|
+
// Патч совместимости будет применен после инициализации WASM
|
|
9
|
+
|
|
10
10
|
export class IfcService {
|
|
11
11
|
/**
|
|
12
12
|
* @param {import('../viewer/Viewer').Viewer} viewer
|
|
@@ -41,6 +41,9 @@ export class IfcService {
|
|
|
41
41
|
// Настройка конфигурации web-ifc
|
|
42
42
|
this._setupWebIfcConfig();
|
|
43
43
|
|
|
44
|
+
// Применяем патч совместимости Three.js после успешной инициализации
|
|
45
|
+
this._applyThreeJsPatch();
|
|
46
|
+
|
|
44
47
|
} catch (error) {
|
|
45
48
|
console.error('IfcService: критическая ошибка инициализации:', error);
|
|
46
49
|
this._handleCriticalError(error);
|
|
@@ -81,18 +84,14 @@ export class IfcService {
|
|
|
81
84
|
paths.push(this.wasmUrl);
|
|
82
85
|
}
|
|
83
86
|
|
|
84
|
-
// 2.
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
} catch (_) {}
|
|
93
|
-
|
|
94
|
-
// 3. Резервные пути для обратной совместимости
|
|
95
|
-
paths.push('/wasm/', '/wasm/web-ifc.wasm', '/web-ifc.wasm');
|
|
87
|
+
// 2. Популярные пути по умолчанию (в порядке приоритета)
|
|
88
|
+
paths.push(
|
|
89
|
+
'/node_modules/web-ifc/web-ifc.wasm', // Прямо из node_modules (самый надежный)
|
|
90
|
+
'/wasm/web-ifc.wasm', // Стандартный путь в public/wasm/
|
|
91
|
+
'/web-ifc.wasm', // Корневой путь
|
|
92
|
+
'./web-ifc.wasm', // Относительный путь
|
|
93
|
+
'web-ifc.wasm' // Просто имя файла
|
|
94
|
+
);
|
|
96
95
|
|
|
97
96
|
return paths;
|
|
98
97
|
}
|
|
@@ -114,6 +113,23 @@ export class IfcService {
|
|
|
114
113
|
}
|
|
115
114
|
}
|
|
116
115
|
|
|
116
|
+
/**
|
|
117
|
+
* Применяет патч совместимости для Three.js 0.149+
|
|
118
|
+
* @private
|
|
119
|
+
*/
|
|
120
|
+
_applyThreeJsPatch() {
|
|
121
|
+
try {
|
|
122
|
+
// Динамически импортируем патч совместимости
|
|
123
|
+
import('../compat/three-compat-patch.js').then(() => {
|
|
124
|
+
console.log('✅ IfcService: Патч совместимости Three.js применен');
|
|
125
|
+
}).catch(error => {
|
|
126
|
+
console.warn('IfcService: не удалось применить патч совместимости:', error.message);
|
|
127
|
+
});
|
|
128
|
+
} catch (error) {
|
|
129
|
+
console.warn('IfcService: ошибка при применении патча совместимости:', error.message);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
117
133
|
/**
|
|
118
134
|
* Обработка критических ошибок инициализации
|
|
119
135
|
* @private
|