BimDataProvider
BimDataProvider – основной класс компонента.
Компонент работает с файлами данных модели и облаков точек.
Используемая файловая система определяется окружением компонента: в Node.js окружении, либо в небезопасном контексте браузерного окружения будет использоваться MEMFS - файловая система, работющая с файлами только в оперативной памяти.
В безопасном контексте браузерного окружения будет использоваться OPFS - файловая система, позволяющая работать с файлами на диске.
class BimDataProvider {
init(): Promise<void>;
createDataFile(id: string): Promise<IBimDataPart>;
openModelPart(dataFile: IBimDataPart): Promise<IBimDataModelPart | undefined>;
openModelPart(id: string, buffer: ArrayBuffer): Promise<IBimDataModelPart | undefined>;
openCloudPart(dataFile: IBimDataPart): Promise<IBimDataCloudPart | undefined>;
openCloudPart(id: string, buffer: ArrayBuffer): Promise<IBimDataCloudPart | undefined>;
dispose(): Promise<void>;
flushMemory(): Promise<void>;
}
Методы
init()
Метод инициализирует компонент.
init(): Promise<void>;
createDataFile()
Метод создает файл в файловой системе для чтения и записи.
createDataFile(id: string): Promise<IBimDataPart | undefined>;
где:
id
– уникальный идентификатор файла модели.
Возвращает объект-посредник для чтения и записи файла данных. Подробнее: IBimDataPart.
openModelPart()
Метод открывает файл модели для чтения и записи.
openModelPart(dataFile: IBimDataPart): Promise<IBimDataModelPart | undefined>;
openModelPart(id: string, buffer: ArrayBuffer): Promise<IBimDataModelPart | undefined>;
где:
dataFile
– объект посредник для чтения или записи файла данных. Подробнее: IBimDataPart.
или:
id
– уникальный идентификатор файла модели.
buffer
– массив данных файла модели.
Возвращает объект-посредник для чтения или записи файла модели, если удалось открыть файл. Подробнее: IBimDataModelPart.
В противном случае возвращает undefined
.
openCloudPart()
Метод открывает файл облака точек для чтения.
openCloudPart(dataFile: IBimDataPart): Promise<IBimDataModelPart | undefined>;
openCloudPart(id: string, buffer: ArrayBuffer): Promise<IBimDataCloudPart | undefined>;
где:
dataFile
– объект посредник для чтения или записи файла облака точек. Подробнее: IBimDataPart.
или:
id
– уникальный идентификатор файла облака точек.
buffer
– массив данных файла облака точек.
Возвращает объект-посредник для чтения файла облака точек, если удалось открыть файл. Подробнее: IBimDataCloudPart.
В противном случае возвращает undefined
.
dispose()
Метод завершает работу компонента и освобождает выделенные ресурсы.
dispose(): Promise<void>;
После завершения работы компонента чтение файлов модели и облаков точек через объекты-посредники невозможно.
flushMemory()
Метод освобождает память, выделенную компонентом, без завершения работы компонента.
flushMemory(): Promise<void>;
Метод не должен вызываться одновременно с чтением или записью файлов модели или облаков точек через объекты-посредники.
Пример использования
import { BimDataBigIntMaxValue, BimDataProvider } from "@pilotdev/pilot-bim-dataprovider";
// --- Работа с файлами частей модели ---
// Создаем и инициализируем компонент.
const bimDataProvider = new BimDataProvider();
await bimDataProvider.init();
// Получаем объект-посредник для чтения .bm файла.
const modelPart = await bimDataProvider.openModelPart("uniqueModelPartId", bmFileBuffer);
// Получаем список всех элементов части модели.
const elements = await modelPart.getAllElements();
// Получаем список всех тесселяций объектов модели.
const tesselations = await modelPart.getAllTessellations();
// Чтение тесселяций привело к выделению компонентом большого объема памяти. Освободим неиспользуемую память.
await bimDataProvider.flushMemory();
// Получаем последнюю версию свойств элемента модели.
const properties = await modelPart.getElementProperties(elements[5].guid, BimDataBigIntMaxValue);
// Завершаем работу с файлом модели, освобождаем объект-посредник.
await modelPart.close();
await modelPart.dispose();
// --- Работа с файлами облаков точек ---
// Получаем объект-посредник для чтения .cloudbm файла.
const cloudPart = await bimDataProvider.openCloudPart("uniqueCloudPartId", cloudbmFileBuffer);
// Получаем метаданные облака точек.
const metadata = cloudPart.getCloudMetadata();
// Получаем данные об иерархии октодерева облака точек.
const hierarchy = cloudPart.getCloudHierarchy();
// Получаем список точек узла октодерева.
const points = cloudPart.getCloudPoints(hierarchy[0].dataIndex);
// Завершаем работу с файлом облака точек, освобождаем объект-посредник.
await cloudPart.close();
await cloudPart.dispose();
// --- Работа с частичной записью файлов---
// Создаем объект-посредник для записи файла
const dataPart = await bimDataProvider.createDataFile("uniqueDataPartId");
// Пишем в файл по частям, где chunk0, chunk1, chunk2 - массивы данных в бинарном виде
await dataPart.write(chunk0, 0); // пишем в начало файла
await dataPart.write(chunk1, chunk0.byteLength); // продолжаем запись с того места где остановились
await dataPart.write(chunk2, chunk0.byteLength + chunk1.byteLength); // продолжаем запись с того места где остановились
const modelPart2 = await bimDataProvider.openModelPart(dataPart); // открываем файл как файл части модели
// Завершаем работу с файлом модели, освобождаем объект-посредник.
// Достаточно закрыть и освободить только modelPart2, dataPart закрывать и освобождать необязательно, так как он ссылается на тот же файл
await modelPart2.close();
await modelPart2.dispose();
// Завершаем работу компонента, освобождаем выделенные ресурсы.
await bimDataProvider.dispose();