BimDataProvider
BimDataProvider – основной класс компонента.
Компонент работает с файлами данных модели и облаков точек.
Используемая файловая система определяется окружением компонента: в Node.js окружении, либо в небезопасном контексте браузерного окружения будет использоваться MEMFS - файловая система, работающая с файлами только в оперативной памяти.
В безопасном контексте браузерного окружения будет использоваться OPFS - файловая система, позволяющая работать с файлами на диске.
export type OpenOptions = {
chunkSize?: number
}
export type FlushMemoryOptions = {
flushRAM?: boolean,
flushCache?: boolean,
desiredCacheQuota?: number
}
type FSType = 'OPFS' | 'MEMFS';
class BimDataProvider {
get usedFSType(): FSType;
init(): Promise<void>;
createDataFile(id: string): Promise<IBimDataPart>;
openModelPart(dataFile: IBimDataPart): Promise<IBimDataModelPart>;
openModelPart(id: string, sourceData?: ArrayBuffer | ArrayBufferView | Blob | string, options?: OpenOptions): Promise<IBimDataModelPart>;
openCloudPart(dataFile: IBimDataPart): Promise<IBimDataCloudPart>;
openCloudPart(id: string, sourceData?: ArrayBuffer | ArrayBufferView | Blob | string, options?: OpenOptions): Promise<IBimDataCloudPart>;
dispose(): Promise<void>;
flushMemory(options?: FlushMemoryOptions): Promise<void>;
}
Свойства
usedFSType
Свойство определяет тип используемой файловой системы.
get usedFSType(): FSType;
где FSType - тип файловой системы: MEMFS или OPFS.
Методы
init()
Метод инициализирует компонент.
init(): Promise<void>;
createDataFile()
Метод создает файл в файловой системе для чтения и записи.
createDataFile(id: string): Promise<IBimDataPart>;
где:
id – уникальный идентификатор файла модели.
Возвращает объект-посредник для чтения и записи файла данных. Подробнее: IBimDataPart.
openModelPart()
Метод открывает файл модели для чтения и записи.
openModelPart(dataFile: IBimDataPart): Promise<IBimDataModelPart>;
openModelPart(id: string, sourceData?: ArrayBuffer | ArrayBufferView | Blob | string, options?: OpenOptions): Promise<IBimDataModelPart>;
где:
dataFile – объект посредник для чтения или записи файла данных. Подробнее: IBimDataPart.
или:
id – уникальный идентификатор файла модели.
sourceData – источник данных файла модели, может быть как массивом данных, так и строкой URL. Необязательный параметр.
options – опции открытия файла данных модели. Необязательный параметр.
Возвращает объект-посредник для чтения или записи файла модели, если удалось открыть файл. Подробнее: IBimDataModelPart.
openCloudPart()
Метод открывает файл облака точек для чтения.
openCloudPart(dataFile: IBimDataPart): Promise<IBimDataModelPart>;
openCloudPart(id: string, sourceData?: ArrayBuffer | ArrayBufferView | Blob | string, options?: OpenOptions): Promise<IBimDataCloudPart>;
где:
dataFile – объект посредник для чтения или записи файла облака точек. Подробнее: IBimDataPart.
или:
id – уникальный идентификатор файла модели.
sourceData – источник данных файла модели, может быть как массивом данных, так и строкой URL. Необязательный параметр.
options – опции открытия файла данных модели. Необязательный параметр.
Возвращает объект-посредник для чтения файла облака точек, если удалось открыть файл. Подробнее: IBimDataCloudPart.
dispose()
Метод завершает работу компонента и освобождает выделенные ресурсы.
dispose(): Promise<void>;
После завершения работы компонента чтение файлов модели и облаков точек через объекты-посредники невозможно.
flushMemory()
Метод освобождает память, выделенную компонентом, без завершения работы компонента.
flushMemory(options?: FlushMemoryOptions): Promise<void>;
где:
options – опции освобождения памяти. Необязательный параметр.
Метод не должен вызываться одновременно с чтением или записью файлов модели или облаков точек через объекты-посредники.
Пример использования
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({ flushRAM: true, flushCache: true });
// Получаем последнюю версию свойств элемента модели.
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, hierarchy[0].offset, hierarchy[0].size);
// Завершаем работу с файлом облака точек, освобождаем объект-посредник.
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); // открываем файл как файл части модели
dataPart.dipose(); // освобождаем объект-посредник.
// Завершаем работу с файлом модели, освобождаем объект-посредник.
await modelPart2.close();
await modelPart2.dispose();
// Завершаем работу компонента, освобождаем выделенные ресурсы.
await bimDataProvider.dispose();