@thatopen/components 2.4.0-alpha.9 → 2.4.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.
Files changed (35) hide show
  1. package/dist/core/Components/index.d.ts +1 -1
  2. package/dist/core/ConfigManager/src/configurator.d.ts +5 -3
  3. package/dist/core/ShadowedScene/index.d.ts +1 -2
  4. package/dist/core/Types/src/component-with-ui.d.ts +8 -3
  5. package/dist/core/Types/src/config-types.d.ts +5 -0
  6. package/dist/core/Types/src/data-map.d.ts +3 -1
  7. package/dist/core/Types/src/data-set.d.ts +1 -2
  8. package/dist/core/Viewpoints/src/viewpoint.d.ts +2 -2
  9. package/dist/fragments/Classifier/index.d.ts +15 -2
  10. package/dist/fragments/IfcGeometryTiler/index.d.ts +1 -0
  11. package/dist/ifc/IfcIsolator/index.d.ts +24 -0
  12. package/dist/ifc/IfcPropertiesManager/index.d.ts +7 -3
  13. package/dist/ifc/IfcRelationsIndexer/index.d.ts +8 -18
  14. package/dist/ifc/IfcRelationsIndexer/src/newVersion.d.ts +51 -0
  15. package/dist/ifc/IfcRelationsIndexer/src/types.d.ts +16 -0
  16. package/dist/ifc/index.d.ts +1 -0
  17. package/dist/index.cjs +416 -240
  18. package/dist/index.min.cjs +3 -3
  19. package/dist/index.min.mjs +3 -3
  20. package/dist/index.mjs +417 -241
  21. package/dist/namespace.d.ts +3838 -3697
  22. package/dist/openbim/BCFTopics/index.d.ts +1 -2
  23. package/dist/openbim/BCFTopics/src/Topic.d.ts +5 -1
  24. package/dist/openbim/BCFTopics/src/bcf-topics-config.d.ts +1 -2
  25. package/dist/openbim/IDSSpecifications/index.d.ts +1 -2
  26. package/dist/openbim/IDSSpecifications/src/Specification.d.ts +4 -3
  27. package/dist/openbim/IDSSpecifications/src/facets/Attribute.d.ts +1 -0
  28. package/dist/openbim/IDSSpecifications/src/facets/Classification.d.ts +1 -0
  29. package/dist/openbim/IDSSpecifications/src/facets/Entity.d.ts +1 -0
  30. package/dist/openbim/IDSSpecifications/src/facets/Facet.d.ts +2 -1
  31. package/dist/openbim/IDSSpecifications/src/facets/Material.d.ts +1 -0
  32. package/dist/openbim/IDSSpecifications/src/facets/PartOf.d.ts +1 -0
  33. package/dist/openbim/IDSSpecifications/src/facets/Property.d.ts +3 -0
  34. package/dist/openbim/IDSSpecifications/src/types.d.ts +39 -20
  35. package/package.json +58 -58
package/dist/index.cjs CHANGED
@@ -3827,7 +3827,9 @@ class DataMap extends Map {
3827
3827
  this.onCleared.trigger();
3828
3828
  }
3829
3829
  /**
3830
- * Sets the value for the specified key in the map and triggers the appropriate event (onItemSet or onItemUpdated).
3830
+ * Sets the value for the specified key in the map.
3831
+ * If the item is new, then onItemSet is triggered.
3832
+ * If the item is already in the map, then onItemUpdated is triggered.
3831
3833
  *
3832
3834
  * @param key - The key of the item to set.
3833
3835
  * @param value - The value of the item to set.
@@ -3877,6 +3879,97 @@ class DataMap extends Map {
3877
3879
  }
3878
3880
  class ComponentWithUI extends Component {
3879
3881
  }
3882
+ class ControlsUtils {
3883
+ static isEntry(item) {
3884
+ const types = /* @__PURE__ */ new Set([
3885
+ "Boolean",
3886
+ "Color",
3887
+ "Text",
3888
+ "Number",
3889
+ "Select",
3890
+ "Vector3",
3891
+ "TextSet",
3892
+ "None"
3893
+ ]);
3894
+ return types.has(item.type);
3895
+ }
3896
+ static copySchema(schema, copy = {}) {
3897
+ for (const name in schema) {
3898
+ const entry = schema[name];
3899
+ if (this.isEntry(entry)) {
3900
+ copy[name] = this.copyEntry(entry);
3901
+ } else {
3902
+ copy[name] = {};
3903
+ this.copySchema(entry, copy[name]);
3904
+ }
3905
+ }
3906
+ return copy;
3907
+ }
3908
+ static copyEntry(controlEntry) {
3909
+ if (controlEntry.type === "Boolean") {
3910
+ const entry = controlEntry;
3911
+ return {
3912
+ type: entry.type,
3913
+ value: entry.value
3914
+ };
3915
+ }
3916
+ if (controlEntry.type === "Color") {
3917
+ const entry = controlEntry;
3918
+ return {
3919
+ type: entry.type,
3920
+ value: entry.value.clone()
3921
+ };
3922
+ }
3923
+ if (controlEntry.type === "Text") {
3924
+ const entry = controlEntry;
3925
+ return {
3926
+ type: entry.type,
3927
+ value: entry.value
3928
+ };
3929
+ }
3930
+ if (controlEntry.type === "Number") {
3931
+ const entry = controlEntry;
3932
+ return {
3933
+ type: entry.type,
3934
+ value: entry.value,
3935
+ min: entry.min,
3936
+ max: entry.max,
3937
+ interpolable: entry.interpolable
3938
+ };
3939
+ }
3940
+ if (controlEntry.type === "Select") {
3941
+ const entry = controlEntry;
3942
+ return {
3943
+ type: entry.type,
3944
+ value: entry.value,
3945
+ multiple: entry.multiple,
3946
+ options: new Set(entry.options)
3947
+ };
3948
+ }
3949
+ if (controlEntry.type === "Vector3") {
3950
+ const entry = controlEntry;
3951
+ return {
3952
+ type: entry.type,
3953
+ value: entry.value.clone()
3954
+ };
3955
+ }
3956
+ if (controlEntry.type === "TextSet") {
3957
+ const entry = controlEntry;
3958
+ return {
3959
+ type: entry.type,
3960
+ value: new Set(entry.value)
3961
+ };
3962
+ }
3963
+ if (controlEntry.type === "None") {
3964
+ const entry = controlEntry;
3965
+ return {
3966
+ type: entry.type,
3967
+ value: entry.value
3968
+ };
3969
+ }
3970
+ throw new Error("Invalid entry!");
3971
+ }
3972
+ }
3880
3973
  class EventManager {
3881
3974
  constructor() {
3882
3975
  /**
@@ -5385,7 +5478,7 @@ const _Components = class _Components {
5385
5478
  /**
5386
5479
  * The version of the @thatopen/components library.
5387
5480
  */
5388
- __publicField(_Components, "release", "2.4.0-alpha.1");
5481
+ __publicField(_Components, "release", "2.4.0");
5389
5482
  let Components = _Components;
5390
5483
  class SimpleWorld extends Base {
5391
5484
  constructor() {
@@ -5552,76 +5645,69 @@ class Configurator {
5552
5645
  configManager.list.set(this.uuid, this);
5553
5646
  }
5554
5647
  get controls() {
5555
- const copy = {};
5556
- for (const name in this._config) {
5557
- const entry = this._config[name];
5558
- copy[name] = this.copyEntry(entry);
5559
- }
5560
- return copy;
5648
+ return ControlsUtils.copySchema(this._config);
5561
5649
  }
5562
- copyEntry(controlEntry) {
5563
- if (controlEntry.type === "Boolean") {
5564
- const entry = controlEntry;
5565
- return {
5566
- type: entry.type,
5567
- value: entry.value
5568
- };
5569
- }
5570
- if (controlEntry.type === "Color") {
5571
- const entry = controlEntry;
5572
- return {
5573
- type: entry.type,
5574
- value: entry.value.clone()
5575
- };
5576
- }
5577
- if (controlEntry.type === "Text") {
5578
- const entry = controlEntry;
5579
- return {
5580
- type: entry.type,
5581
- value: entry.value
5582
- };
5583
- }
5584
- if (controlEntry.type === "Number") {
5585
- const entry = controlEntry;
5586
- return {
5587
- type: entry.type,
5588
- value: entry.value,
5589
- min: entry.min,
5590
- max: entry.max,
5591
- interpolable: entry.interpolable
5592
- };
5593
- }
5594
- if (controlEntry.type === "Select") {
5595
- const entry = controlEntry;
5596
- return {
5597
- type: entry.type,
5598
- value: entry.value,
5599
- multiple: entry.multiple,
5600
- options: new Set(entry.options)
5601
- };
5602
- }
5603
- if (controlEntry.type === "Vector3") {
5604
- const entry = controlEntry;
5605
- return {
5606
- type: entry.type,
5607
- value: entry.value.clone()
5608
- };
5609
- }
5610
- if (controlEntry.type === "TextSet") {
5611
- const entry = controlEntry;
5612
- return {
5613
- type: entry.type,
5614
- value: new Set(entry.value)
5615
- };
5650
+ set(data) {
5651
+ for (const name in data) {
5652
+ if (name in this) {
5653
+ const key = name;
5654
+ this[key] = data[name].value;
5655
+ }
5656
+ }
5657
+ }
5658
+ export(controls = this._config, exported = {}) {
5659
+ for (const id in controls) {
5660
+ const control = controls[id];
5661
+ const isControl = ControlsUtils.isEntry(control);
5662
+ if (isControl) {
5663
+ if (control.type === "Color") {
5664
+ const { r, g, b } = control.value;
5665
+ exported[id] = { ...control, value: { r, g, b } };
5666
+ } else if (control.type === "Vector3") {
5667
+ const { x, y, z } = control.value;
5668
+ exported[id] = { ...control, value: { x, y, z } };
5669
+ } else if (control.type === "TextSet") {
5670
+ const value = Array.from(control.value);
5671
+ exported[id] = { ...control, value };
5672
+ } else if (control.type === "Select") {
5673
+ const options = Array.from(control.options);
5674
+ exported[id] = { ...control, options };
5675
+ } else {
5676
+ exported[id] = { ...control };
5677
+ }
5678
+ } else {
5679
+ exported[id] = {};
5680
+ this.export(control, exported[id]);
5681
+ }
5682
+ }
5683
+ return exported;
5684
+ }
5685
+ import(exported, imported = {}, first = true) {
5686
+ for (const id in exported) {
5687
+ const control = exported[id];
5688
+ const isControl = ControlsUtils.isEntry(control);
5689
+ if (isControl) {
5690
+ if (control.type === "Color") {
5691
+ const { r, g, b } = control.value;
5692
+ imported[id] = { ...control, value: new THREE__namespace.Color(r, g, b) };
5693
+ } else if (control.type === "Vector3") {
5694
+ const { x, y, z } = control.value;
5695
+ imported[id] = { ...control, value: new THREE__namespace.Vector3(x, y, z) };
5696
+ } else if (control.type === "TextSet") {
5697
+ imported[id] = { ...control, value: new Set(control.value) };
5698
+ } else if (control.type === "Select") {
5699
+ imported[id] = { ...control, options: new Set(control.options) };
5700
+ } else {
5701
+ imported[id] = { ...control };
5702
+ }
5703
+ } else {
5704
+ imported[id] = {};
5705
+ this.import(control, imported[id], false);
5706
+ }
5616
5707
  }
5617
- if (controlEntry.type === "None") {
5618
- const entry = controlEntry;
5619
- return {
5620
- type: entry.type,
5621
- value: entry.value
5622
- };
5708
+ if (first) {
5709
+ this.set(imported);
5623
5710
  }
5624
- throw new Error("Invalid entry!");
5625
5711
  }
5626
5712
  }
5627
5713
  const _ConfigManager = class _ConfigManager extends Component {
@@ -11089,6 +11175,9 @@ class SimplePlane {
11089
11175
  * @param {boolean} state - The new enabled state.
11090
11176
  */
11091
11177
  set enabled(state) {
11178
+ if (this.world.isDisposing) {
11179
+ return;
11180
+ }
11092
11181
  if (!this.world.renderer) {
11093
11182
  throw new Error("No renderer found for clipping plane!");
11094
11183
  }
@@ -15331,7 +15420,8 @@ const GeometryTypes = /* @__PURE__ */ new Set([
15331
15420
  3958567839,
15332
15421
  2513912981,
15333
15422
  2830218821,
15334
- 427810014
15423
+ 427810014,
15424
+ 2916149573
15335
15425
  ]);
15336
15426
  const _IfcJsonExporter = class _IfcJsonExporter extends Component {
15337
15427
  constructor(components) {
@@ -15885,7 +15975,7 @@ const _IfcPropertiesManager = class _IfcPropertiesManager extends Component {
15885
15975
  */
15886
15976
  async newPset(model, name, description) {
15887
15977
  const schema = _IfcPropertiesManager.getIFCSchema(model);
15888
- const { ownerHistoryHandle } = await this.getOwnerHistory(model);
15978
+ const { handle: ownerHistoryHandle } = await this.getOwnerHistory(model);
15889
15979
  const psetGlobalId = this.newGUID(model);
15890
15980
  const psetName = new WEBIFC__namespace[schema].IfcLabel(name);
15891
15981
  const psetDescription = description ? new WEBIFC__namespace[schema].IfcText(description) : null;
@@ -15897,18 +15987,8 @@ const _IfcPropertiesManager = class _IfcPropertiesManager extends Component {
15897
15987
  []
15898
15988
  );
15899
15989
  pset.expressID = this.getNewExpressID(model);
15900
- const relGlobalId = this.newGUID(model);
15901
- const rel = new WEBIFC__namespace[schema].IfcRelDefinesByProperties(
15902
- relGlobalId,
15903
- ownerHistoryHandle,
15904
- null,
15905
- null,
15906
- [],
15907
- new WEBIFC__namespace.Handle(pset.expressID)
15908
- );
15909
- rel.expressID = this.getNewExpressID(model);
15910
- await this.setData(model, pset, rel);
15911
- return { pset, rel };
15990
+ await this.setData(model, pset);
15991
+ return { pset };
15912
15992
  }
15913
15993
  /**
15914
15994
  * Removes a Property Set (Pset) from the given model.
@@ -16023,7 +16103,7 @@ const _IfcPropertiesManager = class _IfcPropertiesManager extends Component {
16023
16103
  indexer.addEntitiesRelation(
16024
16104
  model,
16025
16105
  psetID,
16026
- { type: WEBIFC__namespace.IFCRELDEFINESBYPROPERTIES, inv: "IsDefinedBy" },
16106
+ { type: WEBIFC__namespace.IFCRELDEFINESBYPROPERTIES, inv: "DefinesOcurrence" },
16027
16107
  ...expressIDs
16028
16108
  );
16029
16109
  }
@@ -16071,7 +16151,7 @@ const _IfcPropertiesManager = class _IfcPropertiesManager extends Component {
16071
16151
  if (!relName) {
16072
16152
  throw new Error(`IfcPropertiesManager: ${relName} is unsoported.`);
16073
16153
  }
16074
- const schema = model.ifcMetadata.schema;
16154
+ const schema = _IfcPropertiesManager.getIFCSchema(model);
16075
16155
  const attributePositions = ifcRelAttrsPosition[relName];
16076
16156
  const RelClass = WEBIFC__namespace[schema][relName];
16077
16157
  if (!(attributePositions && RelClass)) {
@@ -16122,7 +16202,9 @@ const _IfcPropertiesManager = class _IfcPropertiesManager extends Component {
16122
16202
  for (const expressID of changes) {
16123
16203
  const data = await model.getProperties(expressID);
16124
16204
  if (!data) {
16125
- ifcApi.DeleteLine(modelID, expressID);
16205
+ const existed = ifcApi.GetLine(modelID, expressID);
16206
+ if (existed)
16207
+ ifcApi.DeleteLine(modelID, expressID);
16126
16208
  } else {
16127
16209
  ifcApi.WriteLine(modelID, data);
16128
16210
  }
@@ -16219,9 +16301,9 @@ const _IfcPropertiesManager = class _IfcPropertiesManager extends Component {
16219
16301
  throw new Error("No OwnerHistory was found.");
16220
16302
  }
16221
16303
  const keys = Object.keys(ownerHistories).map((key) => parseInt(key, 10));
16222
- const ownerHistory = ownerHistories[keys[0]];
16223
- const ownerHistoryHandle = new WEBIFC__namespace.Handle(ownerHistory.expressID);
16224
- return { ownerHistory, ownerHistoryHandle };
16304
+ const entity = ownerHistories[keys[0]];
16305
+ const handle = new WEBIFC__namespace.Handle(entity.expressID);
16306
+ return { entity, handle };
16225
16307
  }
16226
16308
  registerChange(model, ...expressID) {
16227
16309
  if (!this.changeMap[model.uuid]) {
@@ -16326,7 +16408,7 @@ const _IfcRelationsIndexer = class _IfcRelationsIndexer extends Component {
16326
16408
  __publicField(this, "onFragmentsDisposed", (data) => {
16327
16409
  delete this.relationMaps[data.groupID];
16328
16410
  });
16329
- // Use to create the corresponding IfcRelationship
16411
+ // Used to create the corresponding IfcRelationship with the IfcPropertiesManager
16330
16412
  __publicField(this, "_changeMap", {});
16331
16413
  /**
16332
16414
  * An event that is triggered when entities are related in a BIM model.
@@ -16349,43 +16431,26 @@ const _IfcRelationsIndexer = class _IfcRelationsIndexer extends Component {
16349
16431
  return;
16350
16432
  const relatingID = relAttrs[relatingKey].value;
16351
16433
  const relatedIDs = relAttrs[relatedKey].map((el) => el.value);
16352
- const index = this.getAttributeIndex(relating);
16353
- if (index !== null) {
16354
- let currentMap = relationsMap.get(relatingID);
16355
- if (!currentMap) {
16356
- currentMap = /* @__PURE__ */ new Map();
16357
- relationsMap.set(relatingID, currentMap);
16358
- }
16359
- let indexMap = currentMap.get(index);
16360
- if (!indexMap) {
16361
- indexMap = [];
16362
- currentMap.set(index, indexMap);
16363
- }
16364
- for (const id of relatedIDs) {
16365
- indexMap.push(id);
16366
- }
16434
+ const indexMap = this.getEntityRelations(
16435
+ relationsMap,
16436
+ relatingID,
16437
+ relating
16438
+ );
16439
+ for (const id of relatedIDs) {
16440
+ indexMap.push(id);
16367
16441
  }
16368
16442
  for (const id of relatedIDs) {
16369
- const index2 = this.getAttributeIndex(related);
16370
- if (index2 === null)
16371
- continue;
16372
- let currentMap = relationsMap.get(id);
16373
- if (!currentMap) {
16374
- currentMap = /* @__PURE__ */ new Map();
16375
- relationsMap.set(id, currentMap);
16376
- }
16377
- let relations = currentMap.get(index2);
16378
- if (!relations) {
16379
- relations = [];
16380
- currentMap.set(index2, relations);
16381
- }
16443
+ const relations = this.getEntityRelations(relationsMap, id, related);
16382
16444
  relations.push(relatingID);
16383
16445
  }
16384
16446
  }
16385
16447
  getAttributeIndex(inverseAttribute) {
16386
16448
  const index = this._inverseAttributes.indexOf(inverseAttribute);
16387
- if (index === -1)
16388
- return null;
16449
+ if (index === -1) {
16450
+ throw new Error(
16451
+ `IfcRelationsIndexer: ${inverseAttribute} is not a valid IFC Inverse Attribute name or its not supported yet by this component.`
16452
+ );
16453
+ }
16389
16454
  return index;
16390
16455
  }
16391
16456
  /**
@@ -16419,28 +16484,27 @@ const _IfcRelationsIndexer = class _IfcRelationsIndexer extends Component {
16419
16484
  * representation of the relations indexed by entity expressIDs and relation types.
16420
16485
  * @throws An error if the model does not have properties loaded.
16421
16486
  */
16422
- async process(model) {
16487
+ async process(model, config) {
16423
16488
  if (!model.hasProperties)
16424
16489
  throw new Error("FragmentsGroup properties not found");
16425
16490
  let relationsMap = this.relationMaps[model.uuid];
16426
- if (relationsMap) {
16427
- return relationsMap;
16491
+ if (!relationsMap) {
16492
+ relationsMap = /* @__PURE__ */ new Map();
16493
+ this.relationMaps[model.uuid] = relationsMap;
16428
16494
  }
16429
- relationsMap = /* @__PURE__ */ new Map();
16430
- for (const relType of this._ifcRels) {
16431
- const relsAttrs = await model.getAllPropertiesOfType(relType);
16432
- if (!relsAttrs) {
16495
+ const entities = model.getLocalProperties();
16496
+ if (!entities)
16497
+ return relationsMap;
16498
+ const relationsToProcess = (config == null ? void 0 : config.relationsToProcess) ?? this._ifcRels;
16499
+ for (const [_, entity] of Object.entries(entities)) {
16500
+ if (!relationsToProcess.includes(entity.type))
16433
16501
  continue;
16434
- }
16435
- const relInverseAttributes = this._relToAttributesMap.get(relType);
16502
+ const relInverseAttributes = this._relToAttributesMap.get(entity.type);
16436
16503
  if (!relInverseAttributes) {
16437
16504
  continue;
16438
16505
  }
16439
16506
  const { forRelated: related, forRelating: relating } = relInverseAttributes;
16440
- for (const expressID in relsAttrs) {
16441
- const relAttrs = relsAttrs[expressID];
16442
- this.indexRelations(relationsMap, relAttrs, related, relating);
16443
- }
16507
+ this.indexRelations(relationsMap, entity, related, relating);
16444
16508
  }
16445
16509
  this.setRelationMap(model, relationsMap);
16446
16510
  return relationsMap;
@@ -16482,26 +16546,33 @@ const _IfcRelationsIndexer = class _IfcRelationsIndexer extends Component {
16482
16546
  *
16483
16547
  * @param model The `FragmentsGroup` model containing the entity, or its UUID.
16484
16548
  * @param expressID The unique identifier of the entity within the model.
16485
- * @param relationName The IFC schema inverse attribute of the relation to search for (e.g., "IsDefinedBy", "ContainsElements").
16486
- * @returns An array of express IDs representing the related entities, or `null` if no relations are found
16487
- * or the specified relation name is not indexed.
16488
- */
16489
- getEntityRelations(model, expressID, relationName) {
16490
- const id = model instanceof FRAGS.FragmentsGroup ? model.uuid : model;
16491
- const indexMap = this.relationMaps[id];
16492
- if (!indexMap) {
16493
- throw new Error(
16494
- `IfcRelationsIndexer: model ${id} has no relations indexed.`
16495
- );
16549
+ * @param attribute The IFC schema inverse attribute of the relation to search for (e.g., "IsDefinedBy", "ContainsElements").
16550
+ * @returns An array of express IDs representing the related entities. If the array is empty, no relations were found.
16551
+ */
16552
+ getEntityRelations(model, expressID, attribute) {
16553
+ const index = this.getAttributeIndex(attribute);
16554
+ let relationsMap;
16555
+ if (model instanceof FRAGS.FragmentsGroup) {
16556
+ relationsMap = this.relationMaps[model.uuid];
16557
+ } else if (typeof model === "string") {
16558
+ relationsMap = this.relationMaps[model];
16559
+ } else {
16560
+ relationsMap = model;
16496
16561
  }
16497
- const entityRelations = indexMap.get(expressID);
16498
- const attributeIndex = this.getAttributeIndex(relationName);
16499
- if (entityRelations === void 0 || attributeIndex === null) {
16500
- return null;
16562
+ if (!relationsMap && (model instanceof FRAGS.FragmentsGroup || typeof model === "string")) {
16563
+ relationsMap = /* @__PURE__ */ new Map();
16564
+ const id = model instanceof FRAGS.FragmentsGroup ? model.uuid : model;
16565
+ this.relationMaps[id] = relationsMap;
16566
+ }
16567
+ let entityRelations = relationsMap.get(expressID);
16568
+ if (!entityRelations) {
16569
+ entityRelations = /* @__PURE__ */ new Map();
16570
+ relationsMap.set(expressID, entityRelations);
16501
16571
  }
16502
- const relations = entityRelations.get(attributeIndex);
16572
+ let relations = entityRelations.get(index);
16503
16573
  if (!relations) {
16504
- return null;
16574
+ relations = [];
16575
+ entityRelations.set(index, relations);
16505
16576
  }
16506
16577
  return relations;
16507
16578
  }
@@ -16622,8 +16693,6 @@ const _IfcRelationsIndexer = class _IfcRelationsIndexer extends Component {
16622
16693
  const set = /* @__PURE__ */ new Set();
16623
16694
  for (const [id, map] of relations) {
16624
16695
  const index = this.getAttributeIndex(inv);
16625
- if (index === null)
16626
- throw new Error("IfcRelationsIndexer: invalid inverse attribute name");
16627
16696
  const rels = map.get(index);
16628
16697
  if (rels && rels.includes(expressID))
16629
16698
  set.add(id);
@@ -16649,28 +16718,17 @@ const _IfcRelationsIndexer = class _IfcRelationsIndexer extends Component {
16649
16718
  );
16650
16719
  if (!existingRelations) {
16651
16720
  const attributeIndex = this.getAttributeIndex(relationName);
16652
- if (!attributeIndex) {
16653
- throw new Error(
16654
- `IfcRelationsIndexer: ${relationName} is not a valid relation name.`
16655
- );
16656
- }
16657
16721
  const entityRelations = this.relationMaps[model.uuid].get(expressID);
16658
16722
  entityRelations == null ? void 0 : entityRelations.set(attributeIndex, relIDs);
16659
16723
  } else {
16660
16724
  existingRelations.push(...relIDs);
16661
16725
  }
16662
16726
  }
16663
- // removeEntitiesRelation(
16664
- // model: FragmentsGroup,
16665
- // relatingID: number,
16666
- // relationName: InverseAttribute,
16667
- // ...relatedIDs: number[]
16668
- // ) {}
16669
16727
  /**
16670
16728
  * Converts the relations made into actual IFC data.
16671
16729
  *
16672
16730
  * @remarks This function iterates through the changes made to the relations and applies them to the corresponding BIM model.
16673
- * It only make sense to use if the relations need to be write in the IFC file.
16731
+ * It only make sense to use it if the relations need to be write in the IFC file.
16674
16732
  *
16675
16733
  * @returns A promise that resolves when all the relation changes have been applied.
16676
16734
  */
@@ -16714,9 +16772,11 @@ const _IfcRelationsIndexer = class _IfcRelationsIndexer extends Component {
16714
16772
  }
16715
16773
  addEntitiesRelation(model, relatingID, rel, ...relatedIDs) {
16716
16774
  const { type, inv } = rel;
16717
- const relationsMap = this.relationMaps[model.uuid];
16718
- if (!relationsMap)
16719
- return;
16775
+ let relationsMap = this.relationMaps[model.uuid];
16776
+ if (!relationsMap) {
16777
+ relationsMap = /* @__PURE__ */ new Map();
16778
+ this.relationMaps[model.uuid] = relationsMap;
16779
+ }
16720
16780
  if (!this._ifcRels.includes(type))
16721
16781
  return;
16722
16782
  const relInvAttrs = relToAttributesMap.get(type);
@@ -16762,35 +16822,11 @@ const _IfcRelationsIndexer = class _IfcRelationsIndexer extends Component {
16762
16822
  relatingData.related.add(...relatedExpressID);
16763
16823
  }
16764
16824
  for (const id of relatingExpressID) {
16765
- let currentMap = relationsMap.get(id);
16766
- if (!currentMap) {
16767
- currentMap = /* @__PURE__ */ new Map();
16768
- relationsMap.set(id, currentMap);
16769
- }
16770
- const index = this.getAttributeIndex(relating);
16771
- if (index !== null) {
16772
- let indexMap = currentMap.get(index);
16773
- if (!indexMap) {
16774
- indexMap = [];
16775
- currentMap.set(index, indexMap);
16776
- }
16777
- indexMap.push(...relatedExpressID);
16778
- }
16825
+ const indexMap = this.getEntityRelations(model, id, relating);
16826
+ indexMap.push(...relatedExpressID);
16779
16827
  }
16780
16828
  for (const id of relatedExpressID) {
16781
- let currentMap = relationsMap.get(id);
16782
- if (!currentMap) {
16783
- currentMap = /* @__PURE__ */ new Map();
16784
- relationsMap.set(id, currentMap);
16785
- }
16786
- const index = this.getAttributeIndex(related);
16787
- if (index === null)
16788
- continue;
16789
- let relations = currentMap.get(index);
16790
- if (!relations) {
16791
- relations = [];
16792
- currentMap.set(index, relations);
16793
- }
16829
+ const relations = this.getEntityRelations(model, id, related);
16794
16830
  relations.push(...relatingExpressID);
16795
16831
  }
16796
16832
  }
@@ -21539,9 +21575,9 @@ const _Topic = class _Topic {
21539
21575
  __publicField(this, "_type", _Topic.default.type);
21540
21576
  __publicField(this, "_status", _Topic.default.status);
21541
21577
  __publicField(this, "_priority", _Topic.default.priority);
21542
- __publicField(this, "_stage", _Topic.default.priority);
21578
+ __publicField(this, "_stage", _Topic.default.stage);
21543
21579
  __publicField(this, "_assignedTo", _Topic.default.assignedTo);
21544
- __publicField(this, "_labels", _Topic.default.labels);
21580
+ __publicField(this, "_labels", _Topic.default.labels ?? /* @__PURE__ */ new Set());
21545
21581
  __publicField(this, "_components");
21546
21582
  this._components = components;
21547
21583
  const manager = components.get(BCFTopics);
@@ -21867,8 +21903,7 @@ ${tags}
21867
21903
  __publicField(_Topic, "default", {
21868
21904
  title: "BCF Topic",
21869
21905
  type: "Issue",
21870
- status: "Active",
21871
- labels: /* @__PURE__ */ new Set()
21906
+ status: "Active"
21872
21907
  });
21873
21908
  let Topic = _Topic;
21874
21909
  const extensionsImporter = (manager, extensionsXML) => {
@@ -22128,8 +22163,9 @@ const _BCFTopics = class _BCFTopics extends Component {
22128
22163
  if (data) {
22129
22164
  topic.guid = data.guid ?? topic.guid;
22130
22165
  topic.set(data);
22166
+ } else {
22167
+ this.list.set(topic.guid, topic);
22131
22168
  }
22132
- this.list.set(topic.guid, topic);
22133
22169
  return topic;
22134
22170
  }
22135
22171
  /**
@@ -23019,6 +23055,84 @@ const _BoundingBoxer = class _BoundingBoxer extends Component {
23019
23055
  };
23020
23056
  __publicField(_BoundingBoxer, "uuid", "d1444724-dba6-4cdd-a0c7-68ee1450d166");
23021
23057
  let BoundingBoxer = _BoundingBoxer;
23058
+ const _IfcIsolator = class _IfcIsolator extends Component {
23059
+ constructor(components) {
23060
+ super(components);
23061
+ /** {@link Component.enabled} */
23062
+ __publicField(this, "enabled", true);
23063
+ components.add(_IfcIsolator.uuid, this);
23064
+ }
23065
+ async getIsolatedElements(webIfc, modelID, elementIDs) {
23066
+ const isolatedElementIDs = /* @__PURE__ */ new Set();
23067
+ function addElementAndReferences(elementID) {
23068
+ if (isolatedElementIDs.has(elementID))
23069
+ return;
23070
+ const element = webIfc.GetLine(modelID, elementID);
23071
+ if (!element)
23072
+ return;
23073
+ isolatedElementIDs.add(elementID);
23074
+ for (const prop in element) {
23075
+ const value = element[prop];
23076
+ if (value && value.constructor.name === "Handle" && value.value > 0) {
23077
+ addElementAndReferences(value.value);
23078
+ } else if (Array.isArray(value)) {
23079
+ value.forEach((refID) => {
23080
+ if (refID && refID.constructor.name === "Handle" && refID.value > 0) {
23081
+ addElementAndReferences(refID.value);
23082
+ }
23083
+ });
23084
+ }
23085
+ }
23086
+ }
23087
+ for (const elementID of elementIDs) {
23088
+ addElementAndReferences(elementID);
23089
+ }
23090
+ const arr = [];
23091
+ for (const elementID of isolatedElementIDs) {
23092
+ arr.push(elementID);
23093
+ }
23094
+ arr.sort((a, b) => {
23095
+ return a - b;
23096
+ });
23097
+ const isolatedElements = [];
23098
+ arr.forEach((elementID) => {
23099
+ const element = webIfc.GetLine(modelID, elementID);
23100
+ isolatedElements.push(element);
23101
+ });
23102
+ return isolatedElements;
23103
+ }
23104
+ /**
23105
+ * Exports isolated elements to the new model.
23106
+ * @param webIfc The instance of [web-ifc](https://github.com/ThatOpen/engine_web-ifc) to use.
23107
+ * @param modelID ID of the new IFC model.
23108
+ * @param isolatedElements The array of isolated elements
23109
+ */
23110
+ async export(webIfc, modelID, isolatedElements) {
23111
+ isolatedElements.forEach((element) => {
23112
+ webIfc.WriteLine(modelID, element);
23113
+ });
23114
+ const data = webIfc.SaveModel(modelID);
23115
+ return data;
23116
+ }
23117
+ async splitIfc(webIfc, ifcFile, idsToExtract) {
23118
+ const ifcBuffer = new Uint8Array(ifcFile);
23119
+ const modelID = webIfc.OpenModel(ifcBuffer);
23120
+ const isolated = await this.getIsolatedElements(
23121
+ webIfc,
23122
+ modelID,
23123
+ idsToExtract
23124
+ );
23125
+ const newModelID = webIfc.CreateModel({ schema: WEBIFC__namespace.Schemas.IFC2X3 });
23126
+ const data = await this.export(webIfc, newModelID, isolated);
23127
+ return data;
23128
+ }
23129
+ };
23130
+ /**
23131
+ * A unique identifier for the component.
23132
+ * This UUID is used to register the component within the Components system.
23133
+ */
23134
+ __publicField(_IfcIsolator, "uuid", "6eb0ba2f-71c0-464e-bcec-2d7c335186b2");
23135
+ let IfcIsolator = _IfcIsolator;
23022
23136
  const _IfcFinderQuery = class _IfcFinderQuery {
23023
23137
  constructor(components) {
23024
23138
  /**
@@ -23985,7 +24099,7 @@ const _Classifier = class _Classifier extends Component {
23985
24099
  `Classifier: model relations of ${model.name || model.uuid} have to exists to group by spatial structure.`
23986
24100
  );
23987
24101
  }
23988
- const systemName = "spatialStructures";
24102
+ const systemName = config.systemName ?? "spatialStructures";
23989
24103
  const noProps = config.useProperties === void 0;
23990
24104
  const useProperties = noProps || config.useProperties;
23991
24105
  for (const [expressID] of modelRelations) {
@@ -24110,19 +24224,18 @@ const _Classifier = class _Classifier extends Component {
24110
24224
  };
24111
24225
  }
24112
24226
  }
24113
- return JSON.stringify(exported);
24227
+ return exported;
24114
24228
  }
24115
24229
  /**
24116
24230
  * Imports a classification previously exported with .export().
24117
24231
  * @param data the serialized classification to import.
24118
24232
  */
24119
24233
  import(data) {
24120
- const imported = JSON.parse(data);
24121
- for (const systemName in imported) {
24234
+ for (const systemName in data) {
24122
24235
  if (!this.list[systemName]) {
24123
24236
  this.list[systemName] = {};
24124
24237
  }
24125
- const system = imported[systemName];
24238
+ const system = data[systemName];
24126
24239
  for (const groupName in system) {
24127
24240
  const group = system[groupName];
24128
24241
  this.list[systemName][groupName] = {
@@ -24686,16 +24799,27 @@ const _IfcGeometryTiler = class _IfcGeometryTiler extends Component {
24686
24799
  this._assets = [];
24687
24800
  }
24688
24801
  async streamGeometries() {
24689
- let buffer = this._streamSerializer.export(this._geometries);
24802
+ const exportMap = /* @__PURE__ */ new Map();
24803
+ for (const [id, value] of this._geometries) {
24804
+ exportMap.set(id, value);
24805
+ if (exportMap.size > this.settings.minGeometrySize) {
24806
+ await this.outputGeometries(exportMap);
24807
+ }
24808
+ }
24809
+ await this.outputGeometries(exportMap);
24810
+ this._geometries.clear();
24811
+ this._geometryCount = 0;
24812
+ }
24813
+ async outputGeometries(exportMap) {
24814
+ let buffer = this._streamSerializer.export(exportMap);
24690
24815
  let data = {};
24691
- for (const [id, { boundingBox: boundingBox2, hasHoles }] of this._geometries) {
24816
+ for (const [id, { boundingBox: boundingBox2, hasHoles }] of exportMap) {
24692
24817
  data[id] = { boundingBox: boundingBox2, hasHoles };
24693
24818
  }
24694
24819
  await this.onGeometryStreamed.trigger({ data, buffer });
24695
24820
  data = null;
24696
24821
  buffer = null;
24697
- this._geometries.clear();
24698
- this._geometryCount = 0;
24822
+ exportMap.clear();
24699
24823
  }
24700
24824
  registerGeometryData(group, itemID, geometry, asset, geometryID, transpGeometryID) {
24701
24825
  const geometryData = this._visitedGeometries.get(transpGeometryID);
@@ -25125,8 +25249,8 @@ class Viewpoint {
25125
25249
  *
25126
25250
  * @returns A Promise that resolves when the camera has been set.
25127
25251
  */
25128
- async go(transition = true) {
25129
- const { camera } = this.world;
25252
+ async go(world, transition = true) {
25253
+ const { camera } = world ?? this.world;
25130
25254
  if (!camera.hasCameraControls()) {
25131
25255
  throw new Error(
25132
25256
  "Viewpoint: the world's camera need controls to set the viewpoint."
@@ -25190,8 +25314,8 @@ class Viewpoint {
25190
25314
  * @throws An error if the world's camera does not have camera controls.
25191
25315
  * @throws An error if the world's renderer is not available.
25192
25316
  */
25193
- updateCamera() {
25194
- const { camera, renderer } = this.world;
25317
+ updateCamera(world) {
25318
+ const { camera, renderer } = world ?? this.world;
25195
25319
  if (!renderer) {
25196
25320
  throw new Error("Viewpoint: the world needs to have a renderer!");
25197
25321
  }
@@ -26268,21 +26392,17 @@ class IDSFacet {
26268
26392
  this.addCheckResult(checkLog, checks);
26269
26393
  let pass = false;
26270
26394
  if (facetParameter.type === "simple") {
26271
- const parameter2 = facetParameter.parameter;
26272
- pass = value === parameter2;
26395
+ pass = value === facetParameter.parameter;
26273
26396
  }
26274
26397
  if (facetParameter.type === "enumeration") {
26275
- const parameter2 = facetParameter.parameter;
26276
- pass = parameter2.includes(value);
26398
+ pass = facetParameter.parameter.includes(value);
26277
26399
  }
26278
26400
  if (facetParameter.type === "pattern") {
26279
- const parameter2 = facetParameter.parameter;
26280
- const regex = new RegExp(parameter2);
26401
+ const regex = new RegExp(facetParameter.parameter);
26281
26402
  pass = regex.test(String(value));
26282
26403
  }
26283
26404
  if (facetParameter.type === "length") {
26284
- const parameter2 = facetParameter.parameter;
26285
- const { min, length, max } = parameter2;
26405
+ const { min, length, max } = facetParameter.parameter;
26286
26406
  if (length !== void 0) {
26287
26407
  pass = String(value).length === length;
26288
26408
  }
@@ -26366,6 +26486,7 @@ const getParameterXML = (name, parameter) => {
26366
26486
  class IDSAttribute extends IDSFacet {
26367
26487
  constructor(components, name) {
26368
26488
  super(components);
26489
+ __publicField(this, "facetType", "Attribute");
26369
26490
  __publicField(this, "name");
26370
26491
  __publicField(this, "value");
26371
26492
  this.name = name;
@@ -26502,6 +26623,7 @@ class IDSAttribute extends IDSFacet {
26502
26623
  class IDSClassification extends IDSFacet {
26503
26624
  constructor(components, system) {
26504
26625
  super(components);
26626
+ __publicField(this, "facetType", "Classification");
26505
26627
  __publicField(this, "system");
26506
26628
  __publicField(this, "value");
26507
26629
  __publicField(this, "uri");
@@ -26784,6 +26906,7 @@ class IDSClassification extends IDSFacet {
26784
26906
  class IDSEntity extends IDSFacet {
26785
26907
  constructor(components, name) {
26786
26908
  super(components);
26909
+ __publicField(this, "facetType", "Entity");
26787
26910
  __publicField(this, "name");
26788
26911
  __publicField(this, "predefinedType");
26789
26912
  this.name = name;
@@ -26912,11 +27035,13 @@ class IDSEntity extends IDSFacet {
26912
27035
  class IDSProperty extends IDSFacet {
26913
27036
  constructor(components, propertySet, baseName) {
26914
27037
  super(components);
27038
+ __publicField(this, "facetType", "Property");
26915
27039
  __publicField(this, "propertySet");
26916
27040
  __publicField(this, "baseName");
26917
27041
  __publicField(this, "value");
26918
27042
  __publicField(this, "dataType");
26919
27043
  __publicField(this, "uri");
27044
+ // These are defined by the IDS specification
26920
27045
  __publicField(this, "_unsupportedTypes", [
26921
27046
  WEBIFC__namespace.IFCCOMPLEXPROPERTY,
26922
27047
  WEBIFC__namespace.IFCPHYSICALCOMPLEXQUANTITY
@@ -27112,10 +27237,43 @@ class IDSProperty extends IDSFacet {
27112
27237
  (name) => name.endsWith("Value") || name.endsWith("Values")
27113
27238
  );
27114
27239
  }
27115
- // IFCPROPERTYSET from type must be get as well
27116
- async getPsets(model, expressID) {
27240
+ async getPsetProps(model, attrs, propsListName) {
27241
+ const attrsClone = structuredClone(attrs);
27242
+ const props = [];
27243
+ const list = attrsClone[propsListName];
27244
+ if (!list)
27245
+ return props;
27246
+ for (const { value } of list) {
27247
+ const propAttrs = await model.getProperties(value);
27248
+ if (propAttrs)
27249
+ props.push(propAttrs);
27250
+ }
27251
+ attrsClone[propsListName] = props;
27252
+ return attrsClone;
27253
+ }
27254
+ async getTypePsets(model, expressID) {
27117
27255
  const sets = [];
27118
27256
  const indexer = this.components.get(IfcRelationsIndexer);
27257
+ const types = indexer.getEntityRelations(model, expressID, "IsTypedBy");
27258
+ if (!(types && types[0]))
27259
+ return sets;
27260
+ const typeAttrs = await model.getProperties(types[0]);
27261
+ if (!(typeAttrs && "HasPropertySets" in typeAttrs && Array.isArray(typeAttrs.HasPropertySets))) {
27262
+ return sets;
27263
+ }
27264
+ for (const { value } of typeAttrs.HasPropertySets) {
27265
+ const psetAttrs = await model.getProperties(value);
27266
+ if (!(psetAttrs && "HasProperties" in psetAttrs && Array.isArray(psetAttrs.HasProperties))) {
27267
+ continue;
27268
+ }
27269
+ const pset = await this.getPsetProps(model, psetAttrs, "HasProperties");
27270
+ sets.push(pset);
27271
+ }
27272
+ return sets;
27273
+ }
27274
+ async getPsets(model, expressID) {
27275
+ const sets = await this.getTypePsets(model, expressID);
27276
+ const indexer = this.components.get(IfcRelationsIndexer);
27119
27277
  const definitions = indexer.getEntityRelations(
27120
27278
  model,
27121
27279
  expressID,
@@ -27130,15 +27288,8 @@ class IDSProperty extends IDSFacet {
27130
27288
  const propsListName = this.getItemsAttrName(attrs.type);
27131
27289
  if (!propsListName)
27132
27290
  continue;
27133
- const attrsClone = structuredClone(attrs);
27134
- const props = [];
27135
- for (const { value } of attrsClone[propsListName]) {
27136
- const propAttrs = await model.getProperties(value);
27137
- if (propAttrs)
27138
- props.push(propAttrs);
27139
- }
27140
- attrsClone[propsListName] = props;
27141
- sets.push(attrsClone);
27291
+ const pset = await this.getPsetProps(model, attrs, propsListName);
27292
+ sets.push(pset);
27142
27293
  }
27143
27294
  return sets;
27144
27295
  }
@@ -27147,8 +27298,9 @@ class IDSProperty extends IDSFacet {
27147
27298
  // Work must to be done to convert numerical value units to IDS-nominated standard units https://github.com/buildingSMART/IDS/blob/development/Documentation/UserManual/units.md
27148
27299
  evalValue(attrs, checks) {
27149
27300
  const valueKey = this.getValueKey(attrs);
27301
+ const valueAttr = attrs[valueKey];
27150
27302
  if (this.value) {
27151
- if (!valueKey) {
27303
+ if (!valueAttr) {
27152
27304
  checks == null ? void 0 : checks.push({
27153
27305
  parameter: "Value",
27154
27306
  currentValue: null,
@@ -27157,17 +27309,16 @@ class IDSProperty extends IDSFacet {
27157
27309
  });
27158
27310
  return false;
27159
27311
  }
27160
- const valueAttr = attrs[valueKey];
27161
27312
  const facetValue = structuredClone(this.value);
27162
27313
  if (valueAttr.name === "IFCLABEL" && facetValue.type === "simple") {
27163
27314
  facetValue.parameter = String(facetValue.parameter);
27164
27315
  }
27165
27316
  if ((attrs.type === WEBIFC__namespace.IFCPROPERTYLISTVALUE || attrs.type === WEBIFC__namespace.IFCPROPERTYENUMERATEDVALUE) && Array.isArray(valueAttr)) {
27166
- const values = valueAttr.map((value2) => value2.value);
27167
- const matchingValue = valueAttr.find((value2) => {
27317
+ const values = valueAttr.map((value) => value.value);
27318
+ const matchingValue = valueAttr.find((value) => {
27168
27319
  if (!facetValue)
27169
27320
  return false;
27170
- return this.evalRequirement(value2.value, facetValue, "Value");
27321
+ return this.evalRequirement(value.value, facetValue, "Value");
27171
27322
  });
27172
27323
  checks == null ? void 0 : checks.push({
27173
27324
  currentValue: values,
@@ -27187,8 +27338,7 @@ class IDSProperty extends IDSFacet {
27187
27338
  }
27188
27339
  if (!valueKey)
27189
27340
  return true;
27190
- const value = attrs[valueKey];
27191
- if (value.type === 3 && value.value === 2) {
27341
+ if (valueAttr.type === 3 && valueAttr.value === 2) {
27192
27342
  checks == null ? void 0 : checks.push({
27193
27343
  parameter: "Value",
27194
27344
  currentValue: null,
@@ -27197,7 +27347,7 @@ class IDSProperty extends IDSFacet {
27197
27347
  });
27198
27348
  return false;
27199
27349
  }
27200
- if (value.type === 1 && value.value.trim() === "") {
27350
+ if (valueAttr.type === 1 && valueAttr.value.trim() === "") {
27201
27351
  checks == null ? void 0 : checks.push({
27202
27352
  parameter: "Value",
27203
27353
  currentValue: "",
@@ -27213,6 +27363,15 @@ class IDSProperty extends IDSFacet {
27213
27363
  return true;
27214
27364
  const valueKey = this.getValueKey(attrs);
27215
27365
  const valueAttr = attrs[valueKey];
27366
+ if (!valueAttr) {
27367
+ checks == null ? void 0 : checks.push({
27368
+ parameter: "DataType",
27369
+ currentValue: null,
27370
+ pass: false,
27371
+ requiredValue: this.dataType
27372
+ });
27373
+ return false;
27374
+ }
27216
27375
  if ((attrs.type === WEBIFC__namespace.IFCPROPERTYLISTVALUE || attrs.type === WEBIFC__namespace.IFCPROPERTYENUMERATEDVALUE) && Array.isArray(valueAttr) && valueAttr[0]) {
27217
27376
  const valueType = valueAttr[0].name;
27218
27377
  const result2 = this.evalRequirement(
@@ -27258,6 +27417,20 @@ class IDSSpecification {
27258
27417
  this.ifcVersion.add(version);
27259
27418
  }
27260
27419
  }
27420
+ set(data) {
27421
+ const _data = data;
27422
+ const _this = this;
27423
+ for (const key in data) {
27424
+ if (key === "identifier")
27425
+ continue;
27426
+ const value = _data[key];
27427
+ if (key in this)
27428
+ _this[key] = value;
27429
+ }
27430
+ const manager = this.components.get(IDSSpecifications);
27431
+ manager.list.set(this.identifier, this);
27432
+ return this;
27433
+ }
27261
27434
  /**
27262
27435
  * Tests the model to test against the specification's requirements.
27263
27436
  *
@@ -27303,8 +27476,9 @@ class IDSSpecification {
27303
27476
  const getParameterValue = (property) => {
27304
27477
  if (!property)
27305
27478
  return void 0;
27306
- const result = { type: "simple" };
27479
+ const result = {};
27307
27480
  if ("simpleValue" in property) {
27481
+ result.type = "simple";
27308
27482
  result.parameter = property.simpleValue;
27309
27483
  }
27310
27484
  if ("restriction" in property) {
@@ -27595,6 +27769,7 @@ exports.ComponentWithUI = ComponentWithUI;
27595
27769
  exports.Components = Components;
27596
27770
  exports.ConfigManager = ConfigManager;
27597
27771
  exports.Configurator = Configurator;
27772
+ exports.ControlsUtils = ControlsUtils;
27598
27773
  exports.CullerRenderer = CullerRenderer;
27599
27774
  exports.Cullers = Cullers;
27600
27775
  exports.DataMap = DataMap;
@@ -27623,6 +27798,7 @@ exports.IfcFinder = IfcFinder;
27623
27798
  exports.IfcFinderQuery = IfcFinderQuery;
27624
27799
  exports.IfcFragmentSettings = IfcFragmentSettings;
27625
27800
  exports.IfcGeometryTiler = IfcGeometryTiler;
27801
+ exports.IfcIsolator = IfcIsolator;
27626
27802
  exports.IfcJsonExporter = IfcJsonExporter;
27627
27803
  exports.IfcLoader = IfcLoader;
27628
27804
  exports.IfcPropertiesManager = IfcPropertiesManager;