@sequent-org/ifc-viewer 1.0.2-ci.2.0 → 1.0.2-ci.5.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 +211 -0
- package/package.json +29 -7
- package/src/IfcViewer.js +785 -0
- package/src/index.js +13 -0
- package/src/style.css +2 -2
- package/src/styles-local.css +414 -0
- package/.github/workflows/npm-publish.yml +0 -39
- package/console-log.txt +0 -1924
- package/fragments.html +0 -46
- package/index.html +0 -101
- package/postcss.config.cjs +0 -7
- package/tailwind.config.cjs +0 -5
- package/vite.config.js +0 -36
package/README.md
ADDED
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
# @sequent-org/ifc-viewer
|
|
2
|
+
|
|
3
|
+
IFC 3D model viewer component for web applications. Основан на Three.js и web-ifc для просмотра BIM моделей в браузере.
|
|
4
|
+
|
|
5
|
+
**✨ Полностью автономный пакет** - не требует внешних CSS фреймворков (Tailwind, Bootstrap и т.д.).
|
|
6
|
+
|
|
7
|
+
## 🚀 Установка
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm install @sequent-org/ifc-viewer
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## 📋 Основное использование
|
|
14
|
+
|
|
15
|
+
### Простой пример
|
|
16
|
+
|
|
17
|
+
```javascript
|
|
18
|
+
import { IfcViewer } from '@sequent-org/ifc-viewer'
|
|
19
|
+
|
|
20
|
+
// Создание просмотрщика с автозагрузкой модели (минимальный режим)
|
|
21
|
+
const viewer = new IfcViewer({
|
|
22
|
+
container: document.getElementById('viewer-container'),
|
|
23
|
+
ifcUrl: '/path/to/model.ifc'
|
|
24
|
+
// showSidebar: false (по умолчанию)
|
|
25
|
+
// showControls: false (по умолчанию)
|
|
26
|
+
// showToolbar: true (по умолчанию)
|
|
27
|
+
})
|
|
28
|
+
|
|
29
|
+
await viewer.init()
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### Интеграция в Laravel + Vite
|
|
33
|
+
|
|
34
|
+
В Laravel проекте с Vite:
|
|
35
|
+
|
|
36
|
+
```javascript
|
|
37
|
+
// В вашем JS файле
|
|
38
|
+
import { IfcViewer } from '@sequent-org/ifc-viewer'
|
|
39
|
+
|
|
40
|
+
function showIfcModal(ifcUrl) {
|
|
41
|
+
const modal = document.getElementById('ifc-modal')
|
|
42
|
+
const container = modal.querySelector('.modal-content')
|
|
43
|
+
|
|
44
|
+
const viewer = new IfcViewer({
|
|
45
|
+
container: container,
|
|
46
|
+
ifcUrl: ifcUrl
|
|
47
|
+
// Минимальный режим по умолчанию - только просмотрщик с верхней панелью
|
|
48
|
+
})
|
|
49
|
+
|
|
50
|
+
viewer.init().then(() => {
|
|
51
|
+
modal.style.display = 'flex'
|
|
52
|
+
})
|
|
53
|
+
}
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### Загрузка пользовательского файла
|
|
57
|
+
|
|
58
|
+
```javascript
|
|
59
|
+
const viewer = new IfcViewer({
|
|
60
|
+
container: '#viewer-container',
|
|
61
|
+
autoLoad: false // не загружать автоматически
|
|
62
|
+
// По умолчанию только верхняя панель, загрузка через кнопку "📁 Загрузить"
|
|
63
|
+
})
|
|
64
|
+
|
|
65
|
+
await viewer.init()
|
|
66
|
+
|
|
67
|
+
// Альтернативно: программная загрузка файла
|
|
68
|
+
const fileInput = document.getElementById('file-input')
|
|
69
|
+
fileInput.addEventListener('change', async (e) => {
|
|
70
|
+
const file = e.target.files[0]
|
|
71
|
+
if (file) {
|
|
72
|
+
await viewer.loadModel(file)
|
|
73
|
+
}
|
|
74
|
+
})
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## ⚙️ Опции конфигурации
|
|
78
|
+
|
|
79
|
+
| Опция | Тип | По умолчанию | Описание |
|
|
80
|
+
|-------|-----|--------------|----------|
|
|
81
|
+
| `container` | `HTMLElement \| string` | **обязательно** | DOM элемент или селектор для контейнера |
|
|
82
|
+
| `ifcUrl` | `string` | `null` | URL для загрузки IFC файла |
|
|
83
|
+
| `ifcFile` | `File` | `null` | File объект для загрузки |
|
|
84
|
+
| `showSidebar` | `boolean` | `false` | Показывать боковую панель с деревом |
|
|
85
|
+
| `showControls` | `boolean` | `false` | Показывать нижние кнопки управления |
|
|
86
|
+
| `showToolbar` | `boolean` | `true` | Показывать верхнюю панель инструментов |
|
|
87
|
+
| `autoLoad` | `boolean` | `true` | Автоматически загружать при инициализации |
|
|
88
|
+
| `theme` | `string` | `'light'` | Тема интерфейса (`'light'` \| `'dark'`) |
|
|
89
|
+
|
|
90
|
+
## 🎯 API методы
|
|
91
|
+
|
|
92
|
+
### Основные методы
|
|
93
|
+
|
|
94
|
+
```javascript
|
|
95
|
+
// Инициализация просмотрщика
|
|
96
|
+
await viewer.init()
|
|
97
|
+
|
|
98
|
+
// Загрузка модели
|
|
99
|
+
await viewer.loadModel('/path/to/model.ifc') // по URL
|
|
100
|
+
await viewer.loadModel(fileObject) // File объект
|
|
101
|
+
|
|
102
|
+
// Управление интерфейсом
|
|
103
|
+
viewer.setSidebarVisible(true)
|
|
104
|
+
viewer.setTheme('dark')
|
|
105
|
+
|
|
106
|
+
// Получение информации
|
|
107
|
+
const modelInfo = viewer.getModelInfo()
|
|
108
|
+
const threeViewer = viewer.getViewer()
|
|
109
|
+
const ifcService = viewer.getIfcService()
|
|
110
|
+
|
|
111
|
+
// Освобождение ресурсов
|
|
112
|
+
viewer.dispose()
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
## 📡 События
|
|
116
|
+
|
|
117
|
+
Просмотрщик отправляет пользовательские события:
|
|
118
|
+
|
|
119
|
+
```javascript
|
|
120
|
+
const container = document.getElementById('viewer-container')
|
|
121
|
+
|
|
122
|
+
// Готовность к работе
|
|
123
|
+
container.addEventListener('ifcviewer:ready', (e) => {
|
|
124
|
+
console.log('Просмотрщик готов', e.detail.viewer)
|
|
125
|
+
})
|
|
126
|
+
|
|
127
|
+
// Модель загружена
|
|
128
|
+
container.addEventListener('ifcviewer:model-loaded', (e) => {
|
|
129
|
+
console.log('Модель загружена', e.detail.model)
|
|
130
|
+
})
|
|
131
|
+
|
|
132
|
+
// Ошибка
|
|
133
|
+
container.addEventListener('ifcviewer:error', (e) => {
|
|
134
|
+
console.error('Ошибка просмотрщика', e.detail.error)
|
|
135
|
+
})
|
|
136
|
+
|
|
137
|
+
// Освобождение ресурсов
|
|
138
|
+
container.addEventListener('ifcviewer:disposed', (e) => {
|
|
139
|
+
console.log('Ресурсы освобождены')
|
|
140
|
+
})
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
## 🎨 Стили
|
|
144
|
+
|
|
145
|
+
**Стили подключаются автоматически** при импорте пакета и полностью **автономны** - не требуют Tailwind CSS, Bootstrap или других внешних фреймворков.
|
|
146
|
+
|
|
147
|
+
Если нужно подключить стили отдельно:
|
|
148
|
+
|
|
149
|
+
```javascript
|
|
150
|
+
import '@sequent-org/ifc-viewer/style.css'
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
**Преимущества локальных стилей:**
|
|
154
|
+
- ✅ Полная автономность пакета
|
|
155
|
+
- ✅ Нет конфликтов с CSS фреймворками сайта
|
|
156
|
+
- ✅ Меньший размер bundle'а
|
|
157
|
+
- ✅ Быстрая загрузка без внешних зависимостей
|
|
158
|
+
|
|
159
|
+
## 🎛️ Функции верхней панели
|
|
160
|
+
|
|
161
|
+
При включенной опции `showToolbar` доступны следующие инструменты:
|
|
162
|
+
|
|
163
|
+
### Качество рендеринга
|
|
164
|
+
- **Low** - Низкое качество для слабых устройств
|
|
165
|
+
- **Med** - Среднее качество (по умолчанию)
|
|
166
|
+
- **High** - Высокое качество для детального просмотра
|
|
167
|
+
|
|
168
|
+
### Стили отображения
|
|
169
|
+
- **Edges** - Показ/скрытие контуров граней
|
|
170
|
+
- **Flat** - Переключение плоского/гладкого затенения
|
|
171
|
+
|
|
172
|
+
### Секущие плоскости
|
|
173
|
+
- **Clip X/Y/Z** - Активация секущих плоскостей по осям
|
|
174
|
+
- При активации появляются слайдеры для точной настройки позиции
|
|
175
|
+
- Одновременно активна только одна плоскость
|
|
176
|
+
|
|
177
|
+
### Загрузка файлов
|
|
178
|
+
- **📁 Загрузить** - Кнопка выбора IFC файла пользователем
|
|
179
|
+
|
|
180
|
+
## 🧪 Тестирование
|
|
181
|
+
|
|
182
|
+
Для локального тестирования пакета:
|
|
183
|
+
|
|
184
|
+
```bash
|
|
185
|
+
git clone <repo-url>
|
|
186
|
+
cd ifc-viewer
|
|
187
|
+
npm install
|
|
188
|
+
npm run test:manual
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
Откроется страница `test.html` с интерактивными тестами.
|
|
192
|
+
|
|
193
|
+
## 📦 Поддерживаемые форматы
|
|
194
|
+
|
|
195
|
+
- `.ifc` - стандартные IFC файлы
|
|
196
|
+
- `.ifczip` - архивы IFC
|
|
197
|
+
- `.zip` - ZIP архивы с IFC файлами
|
|
198
|
+
|
|
199
|
+
## 🔧 Системные требования
|
|
200
|
+
|
|
201
|
+
- Node.js >= 16
|
|
202
|
+
- Современный браузер с поддержкой WebGL
|
|
203
|
+
- Для работы требуются файлы `web-ifc.wasm` в публичной папке проекта
|
|
204
|
+
|
|
205
|
+
## 📄 Лицензия
|
|
206
|
+
|
|
207
|
+
MIT License
|
|
208
|
+
|
|
209
|
+
## 🤝 Поддержка
|
|
210
|
+
|
|
211
|
+
Для вопросов и предложений создавайте Issues в репозитории проекта.
|
package/package.json
CHANGED
|
@@ -1,25 +1,47 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sequent-org/ifc-viewer",
|
|
3
3
|
"private": false,
|
|
4
|
-
"version": "1.0.2-ci.
|
|
4
|
+
"version": "1.0.2-ci.5.0",
|
|
5
5
|
"type": "module",
|
|
6
|
+
"description": "IFC 3D model viewer component for web applications",
|
|
7
|
+
"main": "src/index.js",
|
|
8
|
+
"module": "src/index.js",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"import": "./src/index.js"
|
|
12
|
+
},
|
|
13
|
+
"./style.css": "./src/style.css"
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"src/",
|
|
17
|
+
"public/wasm/",
|
|
18
|
+
"README.md"
|
|
19
|
+
],
|
|
20
|
+
"keywords": [
|
|
21
|
+
"ifc",
|
|
22
|
+
"3d",
|
|
23
|
+
"viewer",
|
|
24
|
+
"bim",
|
|
25
|
+
"three.js",
|
|
26
|
+
"web-ifc"
|
|
27
|
+
],
|
|
28
|
+
"repository": {
|
|
29
|
+
"type": "git",
|
|
30
|
+
"url": "git+https://github.com/sequent-org/ifc-viewer.git"
|
|
31
|
+
},
|
|
6
32
|
"publishConfig": {
|
|
7
33
|
"access": "public"
|
|
8
34
|
},
|
|
9
35
|
"scripts": {
|
|
10
36
|
"dev": "vite",
|
|
11
37
|
"build": "vite build",
|
|
12
|
-
"preview": "vite preview"
|
|
38
|
+
"preview": "vite preview",
|
|
39
|
+
"test:manual": "vite dev --open test.html"
|
|
13
40
|
},
|
|
14
41
|
"devDependencies": {
|
|
15
|
-
"@tailwindcss/postcss": "^4.1.13",
|
|
16
|
-
"autoprefixer": "^10.4.21",
|
|
17
|
-
"postcss": "^8.5.6",
|
|
18
|
-
"tailwindcss": "^4.1.13",
|
|
19
42
|
"vite": "^7.1.2"
|
|
20
43
|
},
|
|
21
44
|
"dependencies": {
|
|
22
|
-
"daisyui": "^5.1.12",
|
|
23
45
|
"three": "^0.149.0",
|
|
24
46
|
"web-ifc": "^0.0.39",
|
|
25
47
|
"web-ifc-three": "^0.0.126"
|