diff --git a/package.json b/package.json index 47142b8c9..a2a07adc4 100644 --- a/package.json +++ b/package.json @@ -10,8 +10,9 @@ "dev": "vite --host", "build-core": "yarn workspace @thatopen/components build", "build-front": "yarn workspace @thatopen/components-front build", + "build-libraries": "yarn build-core && yarn build-front", "build-examples": "vite build --config ./vite.config-examples.ts", - "build": "yarn build-examples && yarn build-core && yarn build-front" + "build": "yarn build-examples && yarn build-libraries" }, "license": "MIT", "homepage": "https://github.com/ThatOpen/engine_components#readme", diff --git a/packages/components-front/src/fragments/FragmentIfcStreamer/src/fragment-stream-loader.ts b/packages/components-front/src/fragments/FragmentIfcStreamer/src/fragment-stream-loader.ts index 25a1c2aad..11ee605c4 100644 --- a/packages/components-front/src/fragments/FragmentIfcStreamer/src/fragment-stream-loader.ts +++ b/packages/components-front/src/fragments/FragmentIfcStreamer/src/fragment-stream-loader.ts @@ -170,7 +170,7 @@ export class FragmentStreamLoader const groupArrayBuffer = await groupData.arrayBuffer(); const groupBuffer = new Uint8Array(groupArrayBuffer); const fragments = this.components.get(OBC.FragmentManager); - const group = fragments.load(groupBuffer, coordinate); + const group = fragments.load(groupBuffer, { coordinate }); this.world.scene.three.add(group); const { opaque, transparent } = group.geometryIDs; @@ -242,7 +242,7 @@ export class FragmentStreamLoader const fetched = await fetch(this.url + indexesFile); const rels = await fetched.text(); const indexer = this.components.get(OBC.IfcRelationsIndexer); - indexer.relationMaps[group.uuid] = indexer.getRelationsMapFromJSON(rels); + indexer.setRelationMap(group, indexer.getRelationsMapFromJSON(rels)); } this.culler.needsUpdate = true; diff --git a/packages/components/src/fragments/FragmentManager/index.ts b/packages/components/src/fragments/FragmentManager/index.ts index 4e20bedde..416c798cb 100644 --- a/packages/components/src/fragments/FragmentManager/index.ts +++ b/packages/components/src/fragments/FragmentManager/index.ts @@ -1,6 +1,9 @@ import { Fragment, FragmentsGroup, Serializer } from "@thatopen/fragments"; import * as THREE from "three"; +import * as FRAGS from "@thatopen/fragments"; import { Component, Components, Event, Disposable } from "../../core"; +import { RelationsMap } from "../../ifc/IfcRelationsIndexer/src/types"; +import { IfcRelationsIndexer } from "../../ifc/IfcRelationsIndexer"; /** * Object that can efficiently load binary files that contain @@ -76,12 +79,28 @@ export class FragmentManager extends Component implements Disposable { } /** - * Loads one or many fragments into the scene. - * @param data - the bytes containing the data for the fragments to load. - * @param coordinate - whether this fragmentsgroup should be federated with the others. - * @returns the list of IDs of the loaded fragments. + * Loads a binar file that contain fragment geometry. + * @param data - The binary data to load. + * @param config - Optional configuration for loading. + * @param config.coordinate - Whether to apply coordinate transformation. Default is true. + * @param config.properties - Ifc properties to set on the loaded fragments. Not to be used when streaming. + * @returns The loaded FragmentsGroup. */ - load(data: Uint8Array, coordinate = true) { + load( + data: Uint8Array, + config?: Partial<{ + coordinate: boolean; + properties: FRAGS.IfcProperties; + relationsMap: RelationsMap; + }>, + ) { + const defaultConfig: { + coordinate: boolean; + properties?: FRAGS.IfcProperties; + relationsMap?: RelationsMap; + } = { coordinate: true }; + const _config = { ...defaultConfig, config }; + const { coordinate, properties, relationsMap } = _config; const model = this._loader.import(data); for (const fragment of model.items) { fragment.group = model; @@ -91,6 +110,13 @@ export class FragmentManager extends Component implements Disposable { this.coordinate([model]); } this.groups.set(model.uuid, model); + if (properties) { + model.setLocalProperties(properties); + } + if (relationsMap) { + const indexer = this.components.get(IfcRelationsIndexer); + indexer.setRelationMap(model, relationsMap); + } this.onFragmentsLoaded.trigger(model); return model; } diff --git a/packages/components/src/ifc/IfcRelationsIndexer/index.ts b/packages/components/src/ifc/IfcRelationsIndexer/index.ts index 9f8ad23bf..5d4f4a50a 100644 --- a/packages/components/src/ifc/IfcRelationsIndexer/index.ts +++ b/packages/components/src/ifc/IfcRelationsIndexer/index.ts @@ -120,7 +120,11 @@ export class IfcRelationsIndexer extends Component implements Disposable { if (!model.hasProperties) throw new Error("FragmentsGroup properties not found"); - const relationsMap: RelationsMap = new Map(); + let relationsMap = this.relationMaps[model.uuid]; + if (relationsMap) { + return relationsMap; + } + relationsMap = new Map(); for (const rel of this._ifcRels) { await IfcPropertiesUtils.getRelationMap( @@ -349,3 +353,5 @@ export class IfcRelationsIndexer extends Component implements Disposable { this.onDisposed.reset(); } } + +export type { InverseAttribute } from "./src/types";