@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 +61 -19
- package/package.json +2 -4
- package/src/ifc/IfcService.js +62 -14
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
|
-
**Готово!**
|
|
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
|
-
###
|
|
41
|
+
### 📁 Настройка WASM файла
|
|
37
42
|
|
|
38
|
-
|
|
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
|
-
|
|
41
|
-
-
|
|
42
|
-
-
|
|
43
|
-
-
|
|
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: '/
|
|
136
|
+
wasmUrl: '/storage/web-ifc.wasm' // Путь к WASM в Laravel storage
|
|
116
137
|
})
|
|
117
138
|
```
|
|
118
139
|
|
|
119
|
-
**Важно для Laravel:**
|
|
140
|
+
**Важно для Laravel:** Убедитесь, что Vite настроен для обслуживания статических файлов из `public/` папки.
|
|
120
141
|
|
|
121
142
|
## 🔧 Особенности и совместимость
|
|
122
143
|
|
|
123
144
|
### ✅ Что включено в пакет
|
|
124
145
|
|
|
125
146
|
- **Автономные стили** - не требует Tailwind CSS, Bootstrap или других фреймворков
|
|
126
|
-
-
|
|
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.
|
|
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.
|
|
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": [
|
package/src/ifc/IfcService.js
CHANGED
|
@@ -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.
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
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
|
}
|