@sequent-org/ifc-viewer 1.0.2-ci.5.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 +122 -2
- package/package.json +1 -1
- package/src/IfcViewer.js +4 -2
- package/src/ifc/IfcService.js +32 -10
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
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
|
|
package/src/ifc/IfcService.js
CHANGED
|
@@ -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
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
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: [...] }
|