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();