Only this pageAll pages
Powered by GitBook
1 of 51

The BIM Whale Project

Loading...

Introduction

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Getting Started

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Configuration

Loading...

Demos

Loading...

Loading...

Loading...

Industry Foundation Classes, IFC

Loading...

Loading...

Loading...

IFC Sample Files

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Developer

Loading...

Loading...

Links

Here's a collection usefull links.

The BIM Whale Project

Here are some links related to TBW project.

BIMWHALE.js Repository

Demo

Demo Repository

IFC Sample Files

SaaS App | www.bimvalen.se

Industry Foundation Classes, IFC

Here are some useful links related to IFC.

IFC Specifications Database

IFC2x3 TC1 Documentation

IFC4.1 Documentation

STEP

Here are some useful links related to the Standard for the Exchange of Product model data, STEP.

General information

EXPRESS

STEP-file

FAQ

What does The BIM Whale do?

Parse so-called User Defined IFC Property Sets from an IFC file.

What does The BIM Whale NOT do?

  • Parse entity attributes

  • Parse geometry

  • Follow the EXPRESS standard

  • etc. etc.

What is an IFC file?

Industry Foundation Classes (IFC) is a standardized, digital description of a BIM model.

See for more information.

What is a STEP file?

A STEP-File is the file format that IFC uses.

Again, see for more information.

Is this code "hand made"?

Yes, the code is hand made. The parsing is not derived from an EXPRESS definition.

Is the code ready for production?

No, not yet. See open for more info

IFC
IFC
issues

Abbreviations

Abbreviation

Meaning

AEC

Architecture, Engineering, and Construction.

BIM

Building Information Modelling

CAD

Computer Aided Design

IFC

Industry Foundation Classes

TBW

The BIM Whale

Config

The config object consist of four required properties:

  1. Required Entities

  2. Selected Entities

  3. Selected Property Sets

  4. All Entities

The config object is passed into BIMWHALE.js's constructor function as a paramter:

The showed us the easiest way to pass in this object:

Notice that some properties are JavaScript objects as well. Here's a summary of the properties within the Config object:

Required Entities

These are the required IFC Entities. BIMWHALE.js will not work without these. They are hardcoded into the logic. You should NOT change these.

Selected Entities

These are the selected IFC Entities. There's no need to get all IFC Entities. For example, an architect may not be intrested in HVAC components.

This requires that you to have a basic understanding of the IFC schema and its entities. Here are two major categories:

Notice how the object is structured. The key must be in uppercase. The value can have any form.

Selected Property Sets

These are the selected Property Sets. Again, there's no need to get all Property Sets. Please notice that the logic is case senstive. The name must match exactly.

Leave the array empty to include all Property Sets

All Entities

All entites are simply requiredEntities and selectedEntities combined. The is used to join these objects.

All entities ( requiredEntities + selectedEntities )

Property Name

Type

Description

requiredEntities

{ [key: string]: string }

Required IFC entites

selectedEntities

{ [key: string]: string }

Selected IFC entites

selectedPropertySets

string[ ]

Selected Property Sets

allEntities

example
Building Elements
HVAC, Plumbing, Electrical, Fire
spread operator

{ [key: string]: string }

new BIMWHALE.file(lines, config);
var config = {
    requiredEntities:{
        IFCPROPERTYSINGLEVALUE: "IfcPropertySingleValue",
        IFCRELDEFINESBYPROPERTIES: "IfcRelDefinesByProperties",
        IFCPROPERTYSET: "IfcPropertySet",
    },
    selectedEntities:{
        IFCDOOR: "IfcDoor",
        IFCWALLSTANDARDCASE: "IfcWallStandardCase",
    },
    selectedPropertySets: ["Custom_Pset"],
    allEntities:{
          ...requiredEntities,
          ...selectedEntities,
    },
};
var file = document.getElementById('myFile').files[0];
var reader = new FileReader();
reader.onload = function(e) {
    var lines = e.target.result.split(/\r\n|\n/);
    var ifcFile = new BIMWHALE.file(lines, config);
    var ifcEntites = file.parseIfcFile();
};
reader.readAsText(file);
  
var requiredEntities = {
    IFCPROPERTYSINGLEVALUE: "IfcPropertySingleValue",
    IFCRELDEFINESBYPROPERTIES: "IfcRelDefinesByProperties",
    IFCPROPERTYSET: "IfcPropertySet",
};
var selectedEntities = {
    IFCDOOR: "IfcDoor",
    IFCWALLSTANDARDCASE: "IfcWallStandardCase",
};
var selectedPropertySets = ["Custom_Pset"];
var selectedPropertySets = [];
var allEntities = {
    ...requiredEntities,
    ...selectedEntities,
};

What is IFC?

Introduction

Industry Foundation Classes (IFC) is an international standard for Building Information Model (BIM) data (buildingSMART, 2020a). The standard, ISO 16739-1, is used to exchanged BIM data among software applications used by the various participants in the AEC industry (ISO, 2020a).

IFC is developed and mainteined by buildingSMART International and is used with openBIM (buildingSMART, 2020b). According to (ISO, 2020a), the IFC specifies:

  1. A data schema

  2. An exchange file format structure

1. Data Schema

The data schema is defined in:

  • EXPRESS data specification language, ,

2. Exchange File Format Structure

The exchange file formats structure is used for exchanging and sharing the data according to the data schema. The exchange file formats structure is defined in:

  • Clear text encoding of the exchange structure,

In more detail

Let's try to explain IFC in layman's terms.

1. Data Schema

According to (, the IFC data schema describes:

  • identities and semantics

    • name, machine-readable unique identifier, object type or function

  • characteristics or attributes

2. Exchange File Format Structure

Whereas the Exchange File Format Structure allows the data described to be transferred from one computer system to another.

Example: The .IFC file can be used to transfer the BIM model from to

Example

In this example we're going to take a look at a window. Please note that this section will simply introduce the data schema and STEP-file. We will explain how these works in detail later.

1. Data Schema

IFC2x Edition 3 Technical Corrigendum 1, or simply , describes a window like this:

To clarify: This is the data schema for a window class. The window is defined using the EXPRESS data specification language ().

This is an abstract representation of a window object. I.e. this window doesn't exist in our building.

2. Exchange File Format Structure

The STEP-file, , describes the window object like this:

This is an representation of a physical window. I.e. this window exist somewhere in our building.

Summary

IFC is an international standard by buildingSMART International. It has two parts;

  1. A data schema, EXPRESS

  2. A file format, STEP-File

Use the tab above to switch between the EXPRESS data schema and the STEP-file

In summary:

  • The data schema, EXPRESS, specifies: How an object should be represented

  • The file format, STEP-file, specifies: An actual object

Notice that we need both the data schema and the file format to understand our BIM model.

In other words:

  • The data schema is the manual

  • The file format is the usage of the manual

In object oriented programming words:

  • The data schema, EXPRESS, is the class

  • The file format, STEP-file, is the object

Editor's note:

I know that this can hard to understand. Please, take a good look at this article. Read it agian, think and reflect about the content.

material, color, thermal properties, etc.
  • relationships

    • locations, connections, ownership, etc.

  • abstract concepts

    • performance, costing, etc.

  • processes

    • installation, operations, etc.

  • people

    • owners, designers, contractors, suppliers, etc.

  • Etc.

  • ISO 10303-11
    ISO 10303-21
    buildingSMART, 2020b)
    Revit
    Solibri
    IFC2x3
    ISO 10303-11
    ISO 10303-21
    ENTITY IfcWindow
    	SUBTYPE OF (IfcBuildingElement);
    		OverallHeight : OPTIONAL IfcPositiveLengthMeasure;
    		OverallWidth : OPTIONAL IfcPositiveLengthMeasure;
    END_ENTITY;
    #13067= IFCWINDOW('2cXV28XOjE6f6irgi0CO$D',#42,'M_Fixed:0915 x 1830mm:353953',$,'M_Fixed:0915 x 1830mm',#35337,#13061,'353953',1830.,914.999999999999);
    ENTITY IfcWindow
    	SUBTYPE OF (IfcBuildingElement);
    		OverallHeight : OPTIONAL IfcPositiveLengthMeasure;
    		OverallWidth : OPTIONAL IfcPositiveLengthMeasure;
    END_ENTITY;
    #13067= IFCWINDOW('2cXV28XOjE6f6irgi0CO$D',#42,'M_Fixed:0915 x 1830mm:353953',$,'M_Fixed:0915 x 1830mm',#35337,#13061,'353953',1830.,914.999999999999);

    EXPRESS

    Introduction

    Let's take a look a very basic EXPRESS data model.

    We have defined a custom schema called Family. We have a Person class within this schema. The person has one attribute: name. The name is represented as a string.

    If you are familiar with object oriented programming, then this should feel very straight forward. If not, check out:

    • , or

    Window Example

    Let's take a look at our previous example, the window:

    We can see that we each "object" (window, wall, door, roof, etc.) is an ENTITY. Again, notice how we use the following format to specify an "object":

    Here's a list of some common building elements. These are defined in IFC2x Edition 3 Technical Corrigendum 1 schema, SCHEMA IFC2X3;. Again, notice how each building element ("object") is its own ENTITY.

    Let's go back to our window. This is a Window class defined using the EXPRESS data model format.

    Take a look at line 5 and 6. We can see that we have two attributes:

    1. Overall Height

    2. Overall Width

    Missing Attributes?

    Let's continue with our Window example. We saw that the windows has two attrbitues. However, according to the , we're missing some attributes:

    We can verify this by looking at the STEP-file. This has clearly more than two attributes:

    We have 10 different attributes. Notice that we don't understand what any of these attributes mean.

    Let's dive deep into EXPRESS

    How does this work? How can we have more than two attributes?

    Well, the answer lies within the EXPRESS definition. Take a close look at the 4th line above. We can see that IfcWindow is an subtype of an IfcBuildingElement. Here's the EXPRESS data model forIfcBuildingElement:

    Notice how the IfcBuildingElement itself is a subtype of IfcElement (see line 25 above). Let's continue down the rabbit hole...

    Again, notice how our IfcElement is a subtype of IfcProduct (see line 13 above). Let's continue...

    Our IfcProduct is a subtype of IfcObject (see line 11 above).

    Our IfcObject is a subtype of IfcObjectDefinition (see line 10 above). Let's continue...

    Our IfcObjectDefinition is a subtype of IfcRoot (see line 5 above). We are almost done...

    Finally, we have reached the end!

    Inheritance

    We call this behaivor inheritance.

    • IfcWindow

      • IfcBuildingElement

        • IfcProduct

    Let's flip this "graph". This will make things a bit easier to explain.

    • IfcRoot

      • IfcObjectDefinition

        • IfcObject

    We can see that IfcRoot has four different attributes; GlobalId, OwnerHistory, Name, Description. The IfcObjectDefinition will inherit these attributes. This means that the IfcWindow will inherit these attributes.

    The IfcWindow will inherit all attributes from its parent entities.

    Summary

    If we use inheritance, we can see what each attribute in the STEP-file actually mean:

    Or, we can simply look at the inheritance graph in the :

    Editor's note:

    I know that this can hard to understand. Please, take a good look at this article. Read it agian, think and reflect about the content.

    SCHEMA Family;
    
    ENTITY Person
         name: STRING;
    END_ENTITY;

    #35337

    #7

    #13061

    #8

    353953

    #9

    1830.

    #10

    914.999999999999999

    IfcObject

    • IfcObjectDefinition

      • IfcRoot

    IfcProduct
    • IfcBuildingElement

      • IfcWindow

    $

    IfcObject

    ObectType

    M_Fixed:0915 x 1830mm:353953

    IfcProduct

    ObectPlacement

    #35337

    IfcProduct

    Representation

    #13061

    IfcElement

    Tag

    353953

    IfcWindow

    OverallHeight

    1830.

    IfcWindow

    OverallWidth

    914.999999999999999

    Schema

    Family

    Class Name

    Person

    Class Attribute

    Name

    Attribute

    Value

    #1

    2cXV28XOjE6f6irgi0CO$D

    #2

    #42

    #3

    M_Fixed:0915 x 1830mm:353953

    #4

    $

    #5

    M_Fixed:0915 x 1830mm:353953

    Inhertited from

    Attribute

    Value

    IfcRoot

    GlobalId

    2cXV28XOjE6f6irgi0CO$D

    IfcRoot

    Own

    #42

    IfcRoot

    Name

    M_Fixed:0915 x 1830mm:353953

    IfcRoot

    JavaScript Classes
    Python Classes
    documentation
    documentation
    https://standards.buildingsmart.org/IFC/RELEASE/IFC2x3/FINAL/HTML/ifcsharedbldgelements/entities.htm
    https://standards.buildingsmart.org/IFC/RELEASE/IFC2x3/FINAL/HTML/ifcsharedbldgelements/lexical/ifcwindow.htm

    #6

    Description

    ENTITY IfcWindow
    	SUBTYPE OF (IfcBuildingElement);
    		OverallHeight : OPTIONAL IfcPositiveLengthMeasure;
    		OverallWidth : OPTIONAL IfcPositiveLengthMeasure;
    END_ENTITY;
    ENTITY { NAME }
        // content goes here
    END_ENTITY;
    SCHEMA IFC2X3; 
    
    ENTITY IfcWindow
    	SUBTYPE OF (IfcBuildingElement);
    		OverallHeight : OPTIONAL IfcPositiveLengthMeasure;
    		OverallWidth : OPTIONAL IfcPositiveLengthMeasure;
    END_ENTITY;
    #13067= IFCWINDOW('2cXV28XOjE6f6irgi0CO$D',#42,'M_Fixed:0915 x 1830mm:353953',$,'M_Fixed:0915 x 1830mm',#35337,#13061,'353953',1830.,914.999999999999);
    SCHEMA IFC2X3; 
    
    ENTITY IfcWindow
    	SUBTYPE OF (IfcBuildingElement);
    		OverallHeight : OPTIONAL IfcPositiveLengthMeasure;
    		OverallWidth : OPTIONAL IfcPositiveLengthMeasure;
    END_ENTITY;
    SCHEMA IFC2X3; 
    
    ENTITY IfcBuildingElement
    	 ABSTRACT SUPERTYPE OF (ONEOF
    		(IfcBeam
    		,IfcBuildingElementComponent
    		,IfcBuildingElementProxy
    		,IfcColumn
    		,IfcCovering
    		,IfcCurtainWall
    		,IfcDoor
    		,IfcFooting
    		,IfcMember
    		,IfcPile
    		,IfcPlate
    		,IfcRailing
    		,IfcRamp
    		,IfcRampFlight
    		,IfcRoof
    		,IfcSlab
    		,IfcStair
    		,IfcStairFlight
    		,IfcWall
    		,IfcWindow))
     	SUBTYPE OF (IfcElement);
    END_ENTITY;
    ENTITY IfcElement
    	 ABSTRACT SUPERTYPE OF (ONEOF
    		(IfcBuildingElement
    		,IfcDistributionElement
    		,IfcElectricalElement
    		,IfcElementAssembly
    		,IfcElementComponent
    		,IfcEquipmentElement
    		,IfcFeatureElement
    		,IfcFurnishingElement
    		,IfcTransportElement
    		,IfcVirtualElement))
     	SUBTYPE OF (IfcProduct);
    		Tag : OPTIONAL IfcIdentifier;
     INVERSE
    		HasStructuralMember : SET [0:?] OF IfcRelConnectsStructuralElement FOR RelatingElement;
    		FillsVoids : SET [0:1] OF IfcRelFillsElement FOR RelatedBuildingElement;
    		ConnectedTo : SET [0:?] OF IfcRelConnectsElements FOR RelatingElement;
    		HasCoverings : SET [0:?] OF IfcRelCoversBldgElements FOR RelatingBuildingElement;
    		HasProjections : SET [0:?] OF IfcRelProjectsElement FOR RelatingElement;
    		ReferencedInStructures : SET [0:?] OF IfcRelReferencedInSpatialStructure FOR RelatedElements;
    		HasPorts : SET [0:?] OF IfcRelConnectsPortToElement FOR RelatedElement;
    		HasOpenings : SET [0:?] OF IfcRelVoidsElement FOR RelatingBuildingElement;
    		IsConnectionRealization : SET [0:?] OF IfcRelConnectsWithRealizingElements FOR RealizingElements;
    		ProvidesBoundaries : SET [0:?] OF IfcRelSpaceBoundary FOR RelatedBuildingElement;
    		ConnectedFrom : SET [0:?] OF IfcRelConnectsElements FOR RelatedElement;
    		ContainedInStructure : SET [0:1] OF IfcRelContainedInSpatialStructure FOR RelatedElements;
    END_ENTITY;
    ENTITY IfcProduct
    			 ABSTRACT SUPERTYPE OF (ONEOF
    				(IfcAnnotation
    				,IfcElement
    				,IfcGrid
    				,IfcPort
    				,IfcProxy
    				,IfcSpatialStructureElement
    				,IfcStructuralActivity
    				,IfcStructuralItem))
    			 SUBTYPE OF (IfcObject);
    					ObjectPlacement : OPTIONAL IfcObjectPlacement;
    					Representation : OPTIONAL IfcProductRepresentation;
    			 INVERSE
    					ReferencedBy : SET [0:?] OF IfcRelAssignsToProduct FOR RelatingProduct;
    			 WHERE
    					WR1 : (EXISTS(Representation) AND EXISTS(ObjectPlacement))
                    		OR (EXISTS(Representation) AND 
                           (NOT('IFC2X3.IFCPRODUCTDEFINITIONSHAPE' IN TYPEOF(Representation))))
                        OR (NOT(EXISTS(Representation)));
    END_ENTITY;
    ENTITY IfcObject
    	 ABSTRACT SUPERTYPE OF (ONEOF
    			(IfcActor
    			,IfcControl
    			,IfcGroup
    			,IfcProcess
    			,IfcProduct
    			,IfcProject
    			,IfcResource))
    	 SUBTYPE OF (IfcObjectDefinition);
    			ObjectType : OPTIONAL IfcLabel;
    	 INVERSE
    				IsDefinedBy : SET [0:?] OF IfcRelDefines FOR RelatedObjects;
    	 WHERE
    				WR1 : SIZEOF(QUERY(temp <* IsDefinedBy | 'IFC2X3.IFCRELDEFINESBYTYPE' IN TYPEOF(temp))) <= 1;
    END_ENTITY;
    ENTITY IfcObjectDefinition
    	 ABSTRACT SUPERTYPE OF (ONEOF
    			(IfcObject
    			,IfcTypeObject))
    	 SUBTYPE OF (IfcRoot);
    	 INVERSE
    		HasAssignments : SET [0:?] OF IfcRelAssigns FOR RelatedObjects;
    		IsDecomposedBy : SET [0:?] OF IfcRelDecomposes FOR RelatingObject;
    		Decomposes : SET [0:1] OF IfcRelDecomposes FOR RelatedObjects;
    		HasAssociations : SET [0:?] OF IfcRelAssociates FOR RelatedObjects;
    END_ENTITY;
    ENTITY IfcRoot
     ABSTRACT SUPERTYPE OF (ONEOF
    	(IfcObjectDefinition
    	,IfcPropertyDefinition
    	,IfcRelationship));
    	GlobalId : IfcGloballyUniqueId;
    	OwnerHistory : IfcOwnerHistory;
    	Name : OPTIONAL IfcLabel;
    	Description : OPTIONAL IfcText;
     UNIQUE
    	UR1 : GlobalId;
    END_ENTITY;
    #13067= IFCWINDOW('2cXV28XOjE6f6irgi0CO$D',#42,'M_Fixed:0915 x 1830mm:353953',$,'M_Fixed:0915 x 1830mm',#35337,#13061,'353953',1830.,914.999999999999);

    STEP-file

    Introduction

    Let's take a look at our Window example.

    This lines follows this encoding template:

    1. Instance Name

    2. Entity Name

    3. Attributes

    We can express this template in two different ways:

    1. Instance Name = 2. Entity name(3. Attributes)

    We have, in this example:

    STEP-file Encoding

    Here are some basic encoding rules

    Again, this can be visualized as:

    #Instance Name = Entity name(Attributes)

    Or, as our example:

    #13067 = IFCWINDOW('2cXV28X...)

    Or, as a single line:

    Additional Notes

    Editor's note:

    I know that this can hard to understand. Please, take a good look at this article. Read it agian, think and reflect about the content.

    Work in progress...

    #13067= IFCWINDOW('2cXV28XOjE6f6irgi0CO$D',#42,'M_Fixed:0915 x 1830mm:353953',$,'M_Fixed:0915 x 1830mm',#35337,#13061,'353953',1830.,914.999999999999);

    ;

    Name

    Value

    Instance Name

    #13067

    Entity Name

    IFCWINDOW

    Attributes

    '2cXV28XOjE6f6irgi0CO$D', #42,'M_Fixed:0915 x 1830mm:353953',

    $,

    'M_Fixed:0915 x 1830mm',

    #35337,

    #13061,

    '353953',

    1830.,

    914.999999999999

    Name

    Description

    Instance Name

    The instance name must consist of a positive integer. The instance name is only valid locally within the STEP-file.

    • If the same content is exported again, the instance names may be different.

    The instance name is also used to reference other entity instances through attribute values or aggregate members.

    • The referenced instance may be defined before or after the current instance.

    Entity Name

    Instances are represented by writing the name of the entity in capital letters and then followed by the attribute values in the defined order within parentheses.

    Attributes

    • Only explicit attributes get mapped

      • Inverse, Derived and re-declared attributes are not listed since their values can be deduced from the other ones.

    • Unset attribute values are given as "$".

    • Multuple values are comma separated

    Mapping of other data types

    Example

    Enumeration, boolean and logical values are given in capital letters with a leading and trailing do

    .TRUE.

    Integers and real values are used identical to typical programming languages

    123

    String values are given in quotes.

    "My string"

    For characters with a code greater than 126 a special encoding is used. The character sets as defined in ISO 8859 and 10646 are supported.

    N/A

    The elements of aggregates (SET, BAG, LIST, ARRAY) are given in parentheses, separated by ",".

    (1,2,3)

    Each entity instance is ended with a semi-colon

    #13067= IFCWINDOW('2cXV28...);

    Additional Notes

    Here are some additional notes regarding TBW project.

    LinksFAQAbbreviations

    BIMWHALE.js docs

    Additional developer resources can be found here:

    https://github.bimvalen.se/docs/index.html

    BIMWHALE.js Documentation

    Advanced Project

    Advanced Project

    The Advanced project sample file can be downloaded from here:

    Make sure you right click, and select "Save as".

    Sources

    buildingSMART, 2020a. Industry Foundation Classes (IFC). [Online] Available at: https://www.buildingsmart.org/standards/bsi-standards/industry-foundation-classes/ [Accessed 2020-12-18].

    BuildingSMART, 2020b. Industry Foundation Classes (IFC) - An Introduction. [Online] Available at: https://technical.buildingsmart.org/standards/ifc/ [Accessed 2020-12-18].

    ISO, 2020a. ISO 16739-1:2018. [Online] Available at: https://www.iso.org/standard/70303.html [Accessed 2020-12-18].

    ISO, 2020b. ISO 16739-1:2018. [Online] Available at: [Accessed 2020-12-18].

    https://www.iso.org/standard/70303.html

    3. BIM-valen

    TBW is also available as a SaaS app. The website consist of three different tools that handles IFC files. It uses BIMWHALE.js behind the scenes.

    www.bimvalen.se

    N.B The website is currently only avaible in Swedish. Once complete, it will get translated into English.

    www.bimvalen.se

    Welcome

    Welcome to The BIM Whale Project's documentation.

    Please note: This website is currently under construction!

    What is The BIM Whale Project?

    Introduction

    How do I use The BIM Whale (BIMWHALE.js) on my website?

    Getting Started

    How do I configure The BIM Whale (BIMWHALE.js)?

    Configuration

    What is IFC?

    Industry Foundation Classes, IFC

    The BIM Whale Project

    The BIM Whale (Swedish: BIM-valen) is a project about Industry Foundation Classes (IFC). The project is is abbreviated as: TBW (The BIM Whale).

    The BIM Whale Project's primary logo

    The aim of TBW is to:

    I: Introduce and explain the basics of IFC II: Teach people how to parse an IFC file and retrieve basic information

    In more specific terms, the goal of this project is to:

    A: Provide a simple and fast IFC parser B: Provide learning resources (documentation, videos, power points) to people within the AEC industry

    To clarify, the focus with The BIM Whale Project is to educate people. The code itself and its functionality are secondary.

    Content

    TBW consists of three different parts:

    1. A JavaScript module | BIMWHALE.js

    2. Documentation | This website

    3. A SaaS app | www.bimvalen.se

    Detailed instructions

    Step by step

    Step 1

    Create a HTML page with an Input FileUpload Object. We'll call our input myFile.

    Step 2

    Make sure you include TBW before your main function.

    Step 3

    Get the selected file using a classical DOM selector. See for more information.

    Step 4

    Use the to read the content of the IFC file. We will assume that the input is a correct IFC file. In other words, we will assume that the file contains text. That's why we call reader.readAsText(file).

    Step 5

    The onload property will handle the actual reading of the file. See for more info. Notice that we .

    Step 6

    Use BIMWHALE.js. by:

    1. Creating a new BIMWHAlE object

    1. Calling the method parseIfcFile()

    Please note that the config object is missing at this moment.

    Final result

    The final result should look like this:

    Please note that this code doesn't output the result. You won't see anything on your screen.

    Simply log the IFC Entities like this:

    Congratulations, you are now ready for the .

    2. Docs

    Goal B has been realized here; this website you are at right now. Please note that BIMWHALE.js has additional documention. These docs are intended for those who want to dive into the nitty gritty.

    https://github.bimvalen.se/docs/index.html

    BIMWHALE.js Documentation

    Using files from web applications
    FileReader API
    FileReader.onload
    split each line
    Simple Example
    <!DOCTYPE html>
    <html>
    <body>
      <h3>Example</h3>
      <input type="file" id="myIfcFile">
      <button onclick="myFile()">Click me</button>
      <script>
        function myFunction() {
          // TODO
        }
      </script>
    </body>
    </html>
    <script src="https://cdn.jsdelivr.net/gh/andrewisen/bim-whale/dist/BIMWHALE.min.js"></script>
      
    <script>
        function myFunction() {
            // TODO
        }
    </script>
    
    <script>
        function myFunction() {
            const ifcFile = document.getElementById('myFile').files[0];
        }
    </script>
     <script>
        function myFunction() {
            var file = document.getElementById('myFile').files[0];
            var reader = new FileReader();
            reader.onload = function(e) {
                // TODO
            };
            reader.readAsText(file);
        }
    </script>
    <script src="https://cdn.jsdelivr.net/gh/andrewisen/bim-whale/dist/BIMWHALE.min.js"></script>
      <script>
        function myFunction() {
            var file = document.getElementById('myFile').files[0];
            var reader = new FileReader();
            reader.onload = function(e) {
                var lines = e.target.result.split(/\r\n|\n/);
                // TODO
            };
            reader.readAsText(file);
        }
    </script>
    
    new BIMWHALE.file(lines, config);
    var ifcEntites = file.parseIfcFile();
    <!DOCTYPE html>
    <html>
    <body>
      <h3>Example</h3>
      <input type="file" id="myFile">
      <button onclick="myFunction()">Click me</button>
      <script src="https://cdn.jsdelivr.net/gh/andrewisen/bim-whale/dist/BIMWHALE.min.js"></script>
      <script>
        function myFunction() {
            var file = document.getElementById('myFile').files[0];
            var reader = new FileReader();
            reader.onload = function(e) {
                var lines = e.target.result.split(/\r\n|\n/);
                var ifcFile = new BIMWHALE.IfcFile(lines, config);
                var ifcEntites = ifcFile.parseIfcFile();
            };
            reader.readAsText(file);
        }
      </script>
    </body>
    </html>
     var ifcEntites = file.parseIfcFile();
     console.log(ifcEntites)

    What are Property Sets?

    Our BIM model was created in Revit.

    Revit 2021

    We have created our own IFC export setup. With our custom setup, Revit exports a Property Set called Custom_Pset. This means that each object (each door, wall, window, etc.) will have a property set called Custom_Pset.

    Custom IFC export

    We can open our exported IFC file in Solibri Anywhere. Our information that we want to parse is avaible in the tab Custom_Pset.

    Solibri Anywhere

    A property set is simply a set of properties

    Simple Example

    This example will use the Simple Wall sample file.

    Make sure you read the detailed instructions before continuing

    We are looking to retrieve the Property Set called Custom_Pset. Custom_Pset occurs five times in our file, see below:

    #370= IFCPROPERTYSET('2WRKEbxzHDcwyFLp2OWZN6',#42,'Custom_Pset',$,(#365,#366,#367,#368,#369));
    #420= IFCPROPERTYSET('0GscS$MUj8VORpWhZ8HE9A',#42,'Custom_Pset','',(#410,#411,#412,#413,#414,#415,#416,#417,#418,#419));
    #603= IFCPROPERTYSET('1CXc3dmFPFfQbCU$bHsAfS',#42,'Custom_Pset','',(#593,#594,#595,#596,#597,#598,#599,#600,#601,#602));
    #735= IFCPROPERTYSET('3CUt_fMl9Df9OKgw$sNH0T',#42,'Custom_Pset',$,(#729,#730,#731,#732,#733,#734));
    #762= IFCPROPERTYSET('081bdaxsT7tvi7VV3hCTqa',#42,'Custom_Pset','',(#761))

    These lines are not in a human-readable form. We cannot interpret this data. BIMWHALE.js will help us retrive and parse this data. Take a very quick at the input/output then go ahead to the next step.

    Getting Started

    Installation

    You can download the latest version of BIMWHALE.js from the content delivery network (CDN) .

    Final result

    You can check out the final result on , or use the box below.

    What are Property Sets?
    ISO-10303-21;
    HEADER;
    
    /******************************************************************************************
    * STEP Physical File produced by: The EXPRESS Data Manager Version 5.02.0100.07 : 28 Aug 2013
    * Module:                         EDMstepFileFactory/EDMstandAlone
    * Creation date:                  Wed Oct 28 18:06:27 2020
    * Host:                           desktop
    * Database:                       C:\Users\andre\AppData\Local\Temp\1d5c9ec4-3372-4075-8f09-942daf5120f6\c6a3f380-df47-414e-a6ff-0f212625bc9d\ifc
    * Database version:               5507
    * Database creation date:         Wed Oct 28 18:06:26 2020
    * Schema:                         IFC2X3
    * Model:                          DataRepository.ifc
    * Model creation date:            Wed Oct 28 18:06:26 2020
    * Header model:                   DataRepository.ifc_HeaderModel
    * Header model creation date:     Wed Oct 28 18:06:26 2020
    * EDMuser:                        sdai-user
    * EDMgroup:                       sdai-group
    * License ID and type:            5605 : Permanent license. Expiry date: 
    * EDMstepFileFactory options:     020000
    ******************************************************************************************/
    FILE_DESCRIPTION(('ViewDefinition [CoordinationView_V2.0, QuantityTakeOffAddOnView]'),'2;1');
    FILE_NAME('// PROJECT/NUMBER //','2020-10-28T18:06:27',(''),(''),'The EXPRESS Data Manager Version 5.02.0100.07 : 28 Aug 2013','21.1.0.108 - Exporter 21.1.0.108 - Alternate UI 21.1.0.108','');
    FILE_SCHEMA(('IFC2X3'));
    ENDSEC;
    
    DATA;
    #1= IFCORGANIZATION($,'Autodesk Revit 2021 (ENU)',$,$,$);
    #5= IFCAPPLICATION(#1,'2021','Autodesk Revit 2021 (ENU)','Revit');
    #6= IFCCARTESIANPOINT((0.,0.,0.));
    #9= IFCCARTESIANPOINT((0.,0.));
    #11= IFCDIRECTION((1.,0.,0.));
    #13= IFCDIRECTION((-1.,0.,0.));
    #15= IFCDIRECTION((0.,1.,0.));
    #17= IFCDIRECTION((0.,-1.,0.));
    #19= IFCDIRECTION((0.,0.,1.));
    #21= IFCDIRECTION((0.,0.,-1.));
    #23= IFCDIRECTION((1.,0.));
    #25= IFCDIRECTION((-1.,0.));
    #27= IFCDIRECTION((0.,1.));
    #29= IFCDIRECTION((0.,-1.));
    #31= IFCAXIS2PLACEMENT3D(#6,$,$);
    #32= IFCLOCALPLACEMENT(#149,#31);
    #35= IFCPERSON($,'//','//',('AUTHOR'),$,$,$,$);
    #38= IFCORGANIZATION($,'// ORGANIZATION/NAME //','// ORGANIZATION/DESCRIPTION //',$,$);
    #39= IFCPERSONANDORGANIZATION(#35,#38,$);
    #42= IFCOWNERHISTORY(#39,#5,$,.NOCHANGE.,$,$,$,1603900718);
    #43= IFCSIUNIT(*,.LENGTHUNIT.,.MILLI.,.METRE.);
    #44= IFCSIUNIT(*,.LENGTHUNIT.,$,.METRE.);
    #45= IFCSIUNIT(*,.AREAUNIT.,$,.SQUARE_METRE.);
    #46= IFCSIUNIT(*,.VOLUMEUNIT.,$,.CUBIC_METRE.);
    #47= IFCSIUNIT(*,.PLANEANGLEUNIT.,$,.RADIAN.);
    #48= IFCDIMENSIONALEXPONENTS(0,0,0,0,0,0,0);
    #49= IFCMEASUREWITHUNIT(IFCRATIOMEASURE(0.0174532925199433),#47);
    #50= IFCCONVERSIONBASEDUNIT(#48,.PLANEANGLEUNIT.,'DEGREE',#49);
    #51= IFCSIUNIT(*,.MASSUNIT.,.KILO.,.GRAM.);
    #52= IFCDERIVEDUNITELEMENT(#51,1);
    #53= IFCDERIVEDUNITELEMENT(#44,-3);
    #54= IFCDERIVEDUNIT((#52,#53),.MASSDENSITYUNIT.,$);
    #56= IFCDERIVEDUNITELEMENT(#44,4);
    #57= IFCDERIVEDUNIT((#56),.MOMENTOFINERTIAUNIT.,$);
    #59= IFCSIUNIT(*,.TIMEUNIT.,$,.SECOND.);
    #60= IFCSIUNIT(*,.FREQUENCYUNIT.,$,.HERTZ.);
    #61= IFCSIUNIT(*,.THERMODYNAMICTEMPERATUREUNIT.,$,.KELVIN.);
    #62= IFCSIUNIT(*,.THERMODYNAMICTEMPERATUREUNIT.,$,.DEGREE_CELSIUS.);
    #63= IFCDERIVEDUNITELEMENT(#51,1);
    #64= IFCDERIVEDUNITELEMENT(#61,-1);
    #65= IFCDERIVEDUNITELEMENT(#59,-3);
    #66= IFCDERIVEDUNIT((#63,#64,#65),.THERMALTRANSMITTANCEUNIT.,$);
    #68= IFCSIUNIT(*,.LENGTHUNIT.,.DECI.,.METRE.);
    #69= IFCDERIVEDUNITELEMENT(#44,3);
    #70= IFCDERIVEDUNITELEMENT(#59,-1);
    #71= IFCDERIVEDUNIT((#69,#70),.VOLUMETRICFLOWRATEUNIT.,$);
    #73= IFCSIUNIT(*,.ELECTRICCURRENTUNIT.,$,.AMPERE.);
    #74= IFCSIUNIT(*,.ELECTRICVOLTAGEUNIT.,$,.VOLT.);
    #75= IFCSIUNIT(*,.POWERUNIT.,$,.WATT.);
    #76= IFCSIUNIT(*,.FORCEUNIT.,.KILO.,.NEWTON.);
    #77= IFCSIUNIT(*,.ILLUMINANCEUNIT.,$,.LUX.);
    #78= IFCSIUNIT(*,.LUMINOUSFLUXUNIT.,$,.LUMEN.);
    #79= IFCSIUNIT(*,.LUMINOUSINTENSITYUNIT.,$,.CANDELA.);
    #80= IFCDERIVEDUNITELEMENT(#51,-1);
    #81= IFCDERIVEDUNITELEMENT(#44,-2);
    #82= IFCDERIVEDUNITELEMENT(#59,3);
    #83= IFCDERIVEDUNITELEMENT(#78,1);
    #84= IFCDERIVEDUNIT((#80,#81,#82,#83),.USERDEFINED.,'Luminous Efficacy');
    #86= IFCDERIVEDUNITELEMENT(#44,1);
    #87= IFCDERIVEDUNITELEMENT(#59,-1);
    #88= IFCDERIVEDUNIT((#86,#87),.LINEARVELOCITYUNIT.,$);
    #90= IFCSIUNIT(*,.PRESSUREUNIT.,$,.PASCAL.);
    #91= IFCDERIVEDUNITELEMENT(#44,-2);
    #92= IFCDERIVEDUNITELEMENT(#51,1);
    #93= IFCDERIVEDUNITELEMENT(#59,-2);
    #94= IFCDERIVEDUNIT((#91,#92,#93),.USERDEFINED.,'Friction Loss');
    #96= IFCDERIVEDUNITELEMENT(#51,1);
    #97= IFCDERIVEDUNITELEMENT(#44,1);
    #98= IFCDERIVEDUNITELEMENT(#59,-2);
    #99= IFCDERIVEDUNITELEMENT(#44,-1);
    #100= IFCDERIVEDUNIT((#96,#97,#98,#99),.LINEARFORCEUNIT.,$);
    #102= IFCDERIVEDUNITELEMENT(#51,1);
    #103= IFCDERIVEDUNITELEMENT(#44,1);
    #104= IFCDERIVEDUNITELEMENT(#59,-2);
    #105= IFCDERIVEDUNITELEMENT(#44,-2);
    #106= IFCDERIVEDUNIT((#102,#103,#104,#105),.PLANARFORCEUNIT.,$);
    #108= IFCUNITASSIGNMENT((#43,#45,#46,#50,#51,#54,#57,#59,#60,#62,#66,#71,#73,#74,#75,#76,#77,#78,#79,#84,#88,#90,#94,#100,#106));
    #110= IFCAXIS2PLACEMENT3D(#6,$,$);
    #111= IFCDIRECTION((6.12303176911189E-17,1.));
    #113= IFCGEOMETRICREPRESENTATIONCONTEXT($,'Model',3,0.01,#110,#111);
    #116= IFCGEOMETRICREPRESENTATIONSUBCONTEXT('Axis','Model',*,*,*,*,#113,$,.GRAPH_VIEW.,$);
    #118= IFCGEOMETRICREPRESENTATIONSUBCONTEXT('Body','Model',*,*,*,*,#113,$,.MODEL_VIEW.,$);
    #119= IFCGEOMETRICREPRESENTATIONSUBCONTEXT('Box','Model',*,*,*,*,#113,$,.MODEL_VIEW.,$);
    #120= IFCGEOMETRICREPRESENTATIONSUBCONTEXT('FootPrint','Model',*,*,*,*,#113,$,.MODEL_VIEW.,$);
    #121= IFCPROJECT('2nxdYR2RHCDBiKJulbA_QU',#42,'// PROJECT/NUMBER //',$,$,'// PROJECT/NAME //','// PROJECT/STATUS //',(#113),#108);
    #127= IFCPOSTALADDRESS($,$,$,$,('Enter address here'),$,'','Boston','','MA');
    #131= IFCBUILDING('2nxdYR2RHCDBiKJulbA_QV',#42,'// BUILDING/NAME //',$,$,#32,$,'// BUILDING/NAME //',.ELEMENT.,$,$,#127);
    #137= IFCAXIS2PLACEMENT3D(#6,$,$);
    #138= IFCLOCALPLACEMENT(#32,#137);
    #140= IFCBUILDINGSTOREY('2nxdYR2RHCDBiKJuiQr1XP',#42,'Level 1',$,'Level:8mm Head',#138,$,'Level 1',.ELEMENT.,0.);
    #142= IFCCARTESIANPOINT((0.,0.,4000.));
    #144= IFCAXIS2PLACEMENT3D(#142,$,$);
    #937= IFCAXIS2PLACEMENT3D(#6,#19,#13);
    #823= IFCRELCONTAINEDINSPATIALSTRUCTURE('3Zu5Bv0LOHrPC10066FoQQ',#42,$,$,(#219,#572),#140);
    #148= IFCAXIS2PLACEMENT3D(#6,$,$);
    #149= IFCLOCALPLACEMENT($,#148);
    #150= IFCSITE('2nxdYR2RHCDBiKJulbA_QS',#42,'Default',$,$,#149,$,$,.ELEMENT.,(42,21,31,181945),(-71,-3,-24,-263305),0.,$,$);
    #154= IFCPROPERTYSINGLEVALUE('Category',$,IFCLABEL('Project Information'),$);
    #155= IFCPROPERTYSET('2fyIDpiXL2EOHb_molX$RM',#42,'Pset_ProductRequirements',$,(#154));
    #160= IFCRELDEFINESBYPROPERTIES('2Zkk7MDtv5UPXO7lnY9Pfr',#42,$,$,(#150),#155);
    #164= IFCPROPERTYSINGLEVALUE('Author',$,IFCTEXT('// AUTHOR //'),$);
    #165= IFCPROPERTYSINGLEVALUE('Building Name',$,IFCTEXT('// BUILDING/NAME //'),$);
    #166= IFCPROPERTYSINGLEVALUE('Organization Description',$,IFCTEXT('// ORGANIZATION/DESCRIPTION //'),$);
    #167= IFCPROPERTYSINGLEVALUE('Organization Name',$,IFCTEXT('// ORGANIZATION/NAME //'),$);
    #168= IFCPROPERTYSINGLEVALUE('Category',$,IFCLABEL('Project Information'),$);
    #169= IFCPROPERTYSINGLEVALUE('Client Name',$,IFCTEXT('// CLIENT/NAME //'),$);
    #170= IFCPROPERTYSINGLEVALUE('Project Address',$,IFCTEXT('Enter address here'),$);
    #171= IFCPROPERTYSINGLEVALUE('Project Issue Date',$,IFCTEXT('// ISSUE DATE //'),$);
    #172= IFCPROPERTYSINGLEVALUE('Project Name',$,IFCTEXT('// PROJECT/NAME //'),$);
    #173= IFCPROPERTYSINGLEVALUE('Project Number',$,IFCTEXT('// PROJECT/NUMBER //'),$);
    #174= IFCPROPERTYSINGLEVALUE('Project Status',$,IFCTEXT('// PROJECT/STATUS //'),$);
    #175= IFCPROPERTYSET('27PCKGLxT4mxtV86o6mgBW',#42,'Identity Data',$,(#164,#165,#166,#167));
    #177= IFCRELDEFINESBYPROPERTIES('27PCKGLxT4mxtV8Mo6mgBW',#42,$,$,(#150),#175);
    #180= IFCPROPERTYSET('3qEsWJfw50zAS2DD_Fn$yp',#42,'Other',$,(#168,#169,#170,#171,#172,#173,#174));
    #182= IFCRELDEFINESBYPROPERTIES('2O3RVoVXf1igF5Ze9BKwLp',#42,$,$,(#150),#180);
    #185= IFCCARTESIANPOINT((-1693.30861181816,-5.56914852525364,0.));
    #187= IFCAXIS2PLACEMENT3D(#185,$,$);
    #188= IFCLOCALPLACEMENT(#138,#187);
    #190= IFCCARTESIANPOINT((4000.,0.));
    #192= IFCPOLYLINE((#9,#190));
    #194= IFCSHAPEREPRESENTATION(#116,'Axis','Curve2D',(#192));
    #197= IFCCARTESIANPOINT((2000.,0.));
    #199= IFCAXIS2PLACEMENT2D(#197,#25);
    #200= IFCRECTANGLEPROFILEDEF(.AREA.,$,#199,4000.,200.);
    #201= IFCAXIS2PLACEMENT3D(#6,$,$);
    #202= IFCEXTRUDEDAREASOLID(#200,#201,#19,4000.);
    #203= IFCCOLOURRGB($,0.501960784313725,0.501960784313725,0.501960784313725);
    #204= IFCSURFACESTYLERENDERING(#203,0.,$,$,$,$,IFCNORMALISEDRATIOMEASURE(0.5),IFCSPECULAREXPONENT(64.),.NOTDEFINED.);
    #205= IFCSURFACESTYLE('Default Wall',.BOTH.,(#204));
    #207= IFCPRESENTATIONSTYLEASSIGNMENT((#205));
    #209= IFCSTYLEDITEM(#202,(#207),$);
    #212= IFCSHAPEREPRESENTATION(#118,'Body','SweptSolid',(#202));
    #215= IFCPRODUCTDEFINITIONSHAPE($,$,(#194,#212));
    #219= IFCWALLSTANDARDCASE('1F6umJ5H50aeL3A1As_wTm',#42,'Basic Wall:Bearing Wall:346660',$,'Basic Wall:Bearing Wall',#188,#215,'346660');
    #228= IFCQUANTITYLENGTH('Height',$,$,4000.);
    #229= IFCQUANTITYLENGTH('Length',$,$,4000.);
    #230= IFCQUANTITYLENGTH('Width',$,$,200.);
    #231= IFCQUANTITYAREA('GrossFootprintArea',$,$,0.8);
    #232= IFCQUANTITYVOLUME('NetVolume',$,$,3200000000.);
    #233= IFCQUANTITYAREA('NetSideArea',$,$,16000000.);
    #234= IFCQUANTITYAREA('NetSideArea',$,$,14.04739);
    #235= IFCQUANTITYVOLUME('NetVolume',$,$,2.809478);
    #236= IFCELEMENTQUANTITY('1tNGP0o7zCuxUSDLATNaK3',#42,'BaseQuantities',$,$,(#228,#229,#230,#231,#232,#233,#234,#235));
    #238= IFCRELDEFINESBYPROPERTIES('0Vgcm4Chb6OxnMJMYOlkea',#42,$,$,(#219),#236);
    #242= IFCMATERIAL('Default Wall');
    #245= IFCPRESENTATIONSTYLEASSIGNMENT((#205));
    #247= IFCSTYLEDITEM($,(#245),$);
    #249= IFCSTYLEDREPRESENTATION(#113,'Style','Material',(#247));
    #252= IFCMATERIALDEFINITIONREPRESENTATION($,$,(#249),#242);
    #255= IFCMATERIALLAYER(#242,200.,$);
    #257= IFCMATERIALLAYERSET((#255),'Basic Wall:Bearing Wall');
    #260= IFCMATERIALLAYERSETUSAGE(#257,.AXIS2.,.NEGATIVE.,100.);
    #261= IFCWALLTYPE('1F6umJ5H50aeL3A1As_wV9',#42,'Basic Wall:Bearing Wall',$,$,(#332,#334,#336,#338,#340,#343,#346,#349,#352,#355,#359,#363,#370),$,'346781',$,.STANDARD.);
    #263= IFCPROPERTYSINGLEVALUE('Base Constraint',$,IFCLABEL('Level: Level 1'),$);
    #264= IFCPROPERTYSINGLEVALUE('Base Extension Distance',$,IFCLENGTHMEASURE(0.),$);
    #265= IFCPROPERTYSINGLEVALUE('Base is Attached',$,IFCBOOLEAN(.F.),$);
    #266= IFCPROPERTYSINGLEVALUE('Base Offset',$,IFCLENGTHMEASURE(0.),$);
    #267= IFCPROPERTYSINGLEVALUE('Cross-Section',$,IFCIDENTIFIER('Vertical'),$);
    #268= IFCPROPERTYSINGLEVALUE('Location Line',$,IFCIDENTIFIER('Wall Centerline'),$);
    #269= IFCPROPERTYSINGLEVALUE('Related to Mass',$,IFCBOOLEAN(.F.),$);
    #270= IFCPROPERTYSINGLEVALUE('Room Bounding',$,IFCBOOLEAN(.T.),$);
    #271= IFCPROPERTYSINGLEVALUE('Top Constraint',$,IFCLABEL('Level: Level 2'),$);
    #272= IFCPROPERTYSINGLEVALUE('Top Extension Distance',$,IFCLENGTHMEASURE(0.),$);
    #273= IFCPROPERTYSINGLEVALUE('Top is Attached',$,IFCBOOLEAN(.F.),$);
    #274= IFCPROPERTYSINGLEVALUE('Top Offset',$,IFCLENGTHMEASURE(0.),$);
    #275= IFCPROPERTYSINGLEVALUE('Unconnected Height',$,IFCLENGTHMEASURE(4000.),$);
    #276= IFCPROPERTYSINGLEVALUE('Phase Created',$,IFCLABEL('New Construction'),$);
    #277= IFCPROPERTYSINGLEVALUE('Enable Analytical Model',$,IFCBOOLEAN(.F.),$);
    #278= IFCPROPERTYSINGLEVALUE('Structural',$,IFCBOOLEAN(.F.),$);
    #279= IFCPROPERTYSINGLEVALUE('Structural Usage',$,IFCIDENTIFIER('Non-bearing'),$);
    #280= IFCPROPERTYSINGLEVALUE('Area',$,IFCAREAMEASURE(14.04739),$);
    #281= IFCPROPERTYSINGLEVALUE('Length',$,IFCLENGTHMEASURE(4000.),$);
    #282= IFCPROPERTYSINGLEVALUE('Volume',$,IFCVOLUMEMEASURE(2.809478),$);
    #283= IFCPROPERTYSINGLEVALUE('Category',$,IFCLABEL('Walls'),$);
    #284= IFCPROPERTYSINGLEVALUE('Family',$,IFCLABEL('Basic Wall: Bearing Wall'),$);
    #285= IFCPROPERTYSINGLEVALUE('Family and Type',$,IFCLABEL('Basic Wall: Bearing Wall'),$);
    #286= IFCPROPERTYSINGLEVALUE('Type',$,IFCLABEL('Basic Wall: Bearing Wall'),$);
    #287= IFCPROPERTYSINGLEVALUE('Type Id',$,IFCLABEL('Basic Wall: Bearing Wall'),$);
    #288= IFCPROPERTYSINGLEVALUE('Absorptance',$,IFCREAL(0.7),$);
    #289= IFCPROPERTYSINGLEVALUE('Roughness',$,IFCINTEGER(3),$);
    #290= IFCPROPERTYSINGLEVALUE('Coarse Scale Fill Color',$,IFCINTEGER(0),$);
    #291= IFCPROPERTYSINGLEVALUE('Function',$,IFCIDENTIFIER('Exterior'),$);
    #292= IFCPROPERTYSINGLEVALUE('Width',$,IFCLENGTHMEASURE(200.),$);
    #293= IFCPROPERTYSINGLEVALUE('Wrapping at Ends',$,IFCIDENTIFIER('None'),$);
    #294= IFCPROPERTYSINGLEVALUE('Wrapping at Inserts',$,IFCIDENTIFIER('Do not wrap'),$);
    #295= IFCPROPERTYSINGLEVALUE('Assembly Code',$,IFCTEXT('_ASSEMBLY-CODE_'),$);
    #296= IFCPROPERTYSINGLEVALUE('Assembly Description',$,IFCTEXT(''),$);
    #297= IFCPROPERTYSINGLEVALUE('Description',$,IFCTEXT('_DESCRIPTION_'),$);
    #298= IFCPROPERTYSINGLEVALUE('Fire Rating',$,IFCTEXT('_FIRE-RATING_'),$);
    #299= IFCPROPERTYSINGLEVALUE('Keynote',$,IFCTEXT('_KEYNOTE_'),$);
    #300= IFCPROPERTYSINGLEVALUE('Manufacturer',$,IFCTEXT('_MANUFACTURER_'),$);
    #301= IFCPROPERTYSINGLEVALUE('Model',$,IFCTEXT('MODEL'),$);
    #302= IFCPROPERTYSINGLEVALUE('Type Comments',$,IFCTEXT('_TYPE-COMMENTS_'),$);
    #303= IFCPROPERTYSINGLEVALUE('Type Mark',$,IFCTEXT('_TYPE-MARK_'),$);
    #304= IFCPROPERTYSINGLEVALUE('Type Name',$,IFCTEXT('Bearing Wall'),$);
    #305= IFCPROPERTYSINGLEVALUE('URL',$,IFCTEXT('_URL_'),$);
    #306= IFCPROPERTYSINGLEVALUE('Family Name',$,IFCTEXT('Basic Wall'),$);
    #307= IFCPROPERTYSET('1F6umJ5H50aeL3BWQs_wTm',#42,'Constraints',$,(#263,#264,#265,#266,#267,#268,#269,#270,#271,#272,#273,#274,#275));
    #309= IFCRELDEFINESBYPROPERTIES('1F6umJ5H50aeL3BmQs_wTm',#42,$,$,(#219),#307);
    #312= IFCPROPERTYSET('1F6umJ5H50aeL3BX2s_wTm',#42,'Dimensions',$,(#280,#281,#282));
    #314= IFCRELDEFINESBYPROPERTIES('1F6umJ5H50aeL3Bn2s_wTm',#42,$,$,(#219),#312);
    #317= IFCPROPERTYSET('0Orq4sVkf4nuhG2_KyNA6v',#42,'Other',$,(#283,#284,#285,#286,#287));
    #319= IFCRELDEFINESBYPROPERTIES('2piNnh9PP7P9X83hwTczmI',#42,$,$,(#219),#317);
    #322= IFCPROPERTYSET('1F6umJ5H50aeL3BXss_wTm',#42,'Phasing',$,(#276));
    #324= IFCRELDEFINESBYPROPERTIES('1F6umJ5H50aeL3Bnss_wTm',#42,$,$,(#219),#322);
    #327= IFCPROPERTYSET('1F6umJ5H50aeL3BX_s_wTm',#42,'Structural',$,(#277,#278,#279));
    #329= IFCRELDEFINESBYPROPERTIES('1F6umJ5H50aeL3Bn_s_wTm',#42,$,$,(#219),#327);
    #332= IFCPROPERTYSET('1F6umJ5H50aeL3Ba_s_wV9',#42,'Analytical Properties',$,(#288,#289));
    #334= IFCPROPERTYSET('1F6umJ5H50aeL3BXQs_wV9',#42,'Construction',$,(#291,#292,#293,#294));
    #336= IFCPROPERTYSET('1F6umJ5H50aeL3BXUs_wV9',#42,'Graphics',$,(#290));
    #338= IFCPROPERTYSET('1F6umJ5H50aeL3BXEs_wV9',#42,'Identity Data',$,(#295,#296,#297,#298,#299,#300,#301,#302,#303,#304,#305));
    #340= IFCPROPERTYSET('3SvvqA__r5DgpdHwQyK3Bd',#42,'Other',$,(#283,#306));
    #342= IFCPROPERTYSINGLEVALUE('FireRating',$,IFCLABEL('_FIRE-RATING_'),$);
    #343= IFCPROPERTYSET('2FgIvz$DH78OxbP_6aQM2V',#42,'Pset_ConcreteElementGeneral',$,(#342));
    #345= IFCPROPERTYSINGLEVALUE('Roughness',$,IFCPOSITIVELENGTHMEASURE(914.4),$);
    #346= IFCPROPERTYSET('1oVspYgob9zvAirDJdqqfX',#42,'Pset_ElementShading',$,(#345));
    #348= IFCPROPERTYSINGLEVALUE('Manufacturer',$,IFCLABEL('_MANUFACTURER_'),$);
    #349= IFCPROPERTYSET('1aTixl2HD13BY1fMD6Ca95',#42,'Pset_ManufacturerTypeInformation',$,(#348));
    #351= IFCPROPERTYSINGLEVALUE('Category',$,IFCLABEL('Walls'),$);
    #352= IFCPROPERTYSET('3TpEitt5fAtunT40jgEguw',#42,'Pset_ProductRequirements',$,(#351));
    #354= IFCPROPERTYSINGLEVALUE('Reference',$,IFCIDENTIFIER('Bearing Wall'),$);
    #355= IFCPROPERTYSET('3G$HLInsX3ceLuR_J74pJp',#42,'Pset_QuantityTakeOff',$,(#354));
    #357= IFCPROPERTYSINGLEVALUE('Description',$,IFCTEXT('_DESCRIPTION_'),$);
    #358= IFCPROPERTYSINGLEVALUE('Reference',$,IFCLABEL('Bearing Wall'),$);
    #359= IFCPROPERTYSET('30Z0TShUL41BB0lNR6torP',#42,'Pset_ReinforcementBarPitchOfWall',$,(#357,#358));
    #361= IFCPROPERTYSINGLEVALUE('FireRating',$,IFCLABEL('_FIRE-RATING_'),$);
    #362= IFCPROPERTYSINGLEVALUE('IsExternal',$,IFCBOOLEAN(.F.),$);
    #363= IFCPROPERTYSET('1F6umJ5H50aeL38__s_wV9',#42,'Pset_WallCommon',$,(#354,#361,#362));
    #365= IFCPROPERTYSINGLEVALUE('TypeMark',$,IFCLABEL('_TYPE-MARK_'),$);
    #366= IFCPROPERTYSINGLEVALUE('Keynote',$,IFCLABEL('_KEYNOTE_'),$);
    #367= IFCPROPERTYSINGLEVALUE('TypeDescription',$,IFCTEXT('_DESCRIPTION_'),$);
    #368= IFCPROPERTYSINGLEVALUE('Width',$,IFCLENGTHMEASURE(200.),$);
    #369= IFCPROPERTYSINGLEVALUE('Hyperlink',$,IFCTEXT('_URL_'),$);
    #370= IFCPROPERTYSET('2WRKEbxzHDcwyFLp2OWZN6',#42,'Custom_Pset',$,(#365,#366,#367,#368,#369));
    #386= IFCPROPERTYSINGLEVALUE('FireRating',$,IFCLABEL('_FIRE-RATING_'),$);
    #387= IFCPROPERTYSET('3P2gpigy5Bxf21UPLtfxGn',#42,'Pset_ConcreteElementGeneral',$,(#386));
    #389= IFCPROPERTYSINGLEVALUE('Roughness',$,IFCPOSITIVELENGTHMEASURE(914.4),$);
    #390= IFCPROPERTYSET('3oPqgsplnDQBBauhDymfTT',#42,'Pset_ElementShading',$,(#389));
    #392= IFCPROPERTYSINGLEVALUE('Manufacturer',$,IFCLABEL('_MANUFACTURER_'),$);
    #393= IFCPROPERTYSET('0sSV0IAmn1$hYjAOaeItMd',#42,'Pset_ManufacturerTypeInformation',$,(#392));
    #395= IFCPROPERTYSINGLEVALUE('Category',$,IFCLABEL('Walls'),$);
    #396= IFCPROPERTYSET('0BJealGbf6YvPiyaIcPtbR',#42,'Pset_ProductRequirements',$,(#395));
    #398= IFCPROPERTYSET('3B2kERP3j9yuxt6oSMSCYK',#42,'Pset_QuantityTakeOff',$,(#354));
    #400= IFCPROPERTYSINGLEVALUE('Description',$,IFCTEXT('_DESCRIPTION_'),$);
    #401= IFCPROPERTYSINGLEVALUE('Reference',$,IFCLABEL('Bearing Wall'),$);
    #402= IFCPROPERTYSET('35fO62eKf7eBj26c0ZGCYK',#42,'Pset_ReinforcementBarPitchOfWall',$,(#400,#401));
    #404= IFCPROPERTYSINGLEVALUE('FireRating',$,IFCLABEL('_FIRE-RATING_'),$);
    #405= IFCPROPERTYSINGLEVALUE('IsExternal',$,IFCBOOLEAN(.T.),$);
    #406= IFCPROPERTYSINGLEVALUE('ExtendToStructure',$,IFCBOOLEAN(.F.),$);
    #407= IFCPROPERTYSINGLEVALUE('LoadBearing',$,IFCBOOLEAN(.F.),$);
    #408= IFCPROPERTYSET('1F6umJ5H50aeL38__s_wTm',#42,'Pset_WallCommon',$,(#354,#404,#405,#406,#407));
    #410= IFCPROPERTYSINGLEVALUE('TypeMark',$,IFCLABEL('_TYPE-MARK_'),$);
    #411= IFCPROPERTYSINGLEVALUE('Keynote',$,IFCLABEL('_KEYNOTE_'),$);
    #412= IFCPROPERTYSINGLEVALUE('StoreyName',$,IFCTEXT('Level: Level 1'),$);
    #413= IFCPROPERTYSINGLEVALUE('TypeDescription',$,IFCTEXT('_DESCRIPTION_'),$);
    #414= IFCPROPERTYSINGLEVALUE('StatusConstruction',$,IFCLABEL('New Construction'),$);
    #415= IFCPROPERTYSINGLEVALUE('NetArea',$,IFCAREAMEASURE(14.04739),$);
    #416= IFCPROPERTYSINGLEVALUE('Height',$,IFCLENGTHMEASURE(4000.),$);
    #417= IFCPROPERTYSINGLEVALUE('Width',$,IFCLENGTHMEASURE(200.),$);
    #418= IFCPROPERTYSINGLEVALUE('Length',$,IFCLENGTHMEASURE(4000.),$);
    #419= IFCPROPERTYSINGLEVALUE('Hyperlink',$,IFCTEXT('_URL_'),$);
    #420= IFCPROPERTYSET('0GscS$MUj8VORpWhZ8HE9A',#42,'Custom_Pset','',(#410,#411,#412,#413,#414,#415,#416,#417,#418,#419));
    #422= IFCRELDEFINESBYPROPERTIES('2MFCuX$Tz2sPZWU81naSyy',#42,$,$,(#219),#387);
    #425= IFCRELDEFINESBYPROPERTIES('2zJMZ6wET4dgTHfaIfMtfO',#42,$,$,(#219),#390);
    #428= IFCRELDEFINESBYPROPERTIES('1X0JGVfDf1W9F9IK$qt1Lk',#42,$,$,(#219),#393);
    #431= IFCRELDEFINESBYPROPERTIES('1Ol9CkDoP5Dun0TKKnif29',#42,$,$,(#219),#396);
    #434= IFCRELDEFINESBYPROPERTIES('0JqUYZ7Z16zQrsbalAuwUh',#42,$,$,(#219),#398);
    #437= IFCRELDEFINESBYPROPERTIES('2qcAwIAOvEYPa5s9UuUorV',#42,$,$,(#219),#402);
    #440= IFCRELDEFINESBYPROPERTIES('1xmcmfIjT6CR2StfT5_wlv',#42,$,$,(#219),#408);
    #443= IFCRELDEFINESBYPROPERTIES('36lLKbnX5EwwW25YA80Mtv',#42,$,$,(#219),#420);
    #446= IFCCLASSIFICATION('http://www.csiorg.net/uniformat','1998',$,'Uniformat');
    #448= IFCCLASSIFICATIONREFERENCE('http://www.csiorg.net/uniformat','_ASSEMBLY-CODE_',$,#446);
    #449= IFCRELASSOCIATESCLASSIFICATION('1Tbe43SmzDeheUB6aGPLmp',#42,'Uniformat Classification','',(#219),#448);
    #452= IFCCARTESIANPOINT((-533.5,-1124.));
    #454= IFCCARTESIANPOINT((533.5,-1124.));
    #456= IFCCARTESIANPOINT((533.5,1086.));
    #458= IFCCARTESIANPOINT((457.5,1086.));
    #460= IFCCARTESIANPOINT((457.5,-1048.));
    #462= IFCCARTESIANPOINT((-457.5,-1048.));
    #464= IFCCARTESIANPOINT((-457.5,1086.));
    #466= IFCCARTESIANPOINT((-533.5,1086.));
    #468= IFCPOLYLINE((#452,#454,#456,#458,#460,#462,#464,#466,#452));
    #470= IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,'Outside door',#468);
    #471= IFCCARTESIANPOINT((457.500000000001,200.,1086.));
    #473= IFCAXIS2PLACEMENT3D(#471,#15,#11);
    #474= IFCEXTRUDEDAREASOLID(#470,#473,#19,24.9999999999945);
    #475= IFCCARTESIANPOINT((-1124.,-533.499999999997));
    #477= IFCCARTESIANPOINT((1086.,-533.499999999997));
    #479= IFCCARTESIANPOINT((1086.,-457.500000000007));
    #481= IFCCARTESIANPOINT((-1048.,-457.500000000007));
    #483= IFCCARTESIANPOINT((-1048.,457.500000000002));
    #485= IFCCARTESIANPOINT((1086.,457.500000000002));
    #487= IFCCARTESIANPOINT((1086.,533.500000000003));
    #489= IFCCARTESIANPOINT((-1124.,533.500000000003));
    #491= IFCPOLYLINE((#475,#477,#479,#481,#483,#485,#487,#489,#475));
    #493= IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,'Outside door',#491);
    #494= IFCCARTESIANPOINT((457.500000000003,-25.,1086.));
    #496= IFCAXIS2PLACEMENT3D(#494,#15,#21);
    #497= IFCEXTRUDEDAREASOLID(#493,#496,#19,25.0000000000056);
    #498= IFCCARTESIANPOINT((-5.32907051820075E-15,0.));
    #500= IFCAXIS2PLACEMENT2D(#498,#23);
    #501= IFCRECTANGLEPROFILEDEF(.AREA.,'Outside door',#500,51.,915.);
    #502= IFCCARTESIANPOINT((457.5,174.500000000001,0.));
    #504= IFCAXIS2PLACEMENT3D(#502,#19,#15);
    #505= IFCEXTRUDEDAREASOLID(#501,#504,#19,2134.);
    #506= IFCCOLOURRGB($,0.462745098039216,0.274509803921569,0.2);
    #507= IFCSURFACESTYLERENDERING(#506,0.,$,$,$,$,IFCNORMALISEDRATIOMEASURE(0.5),IFCSPECULAREXPONENT(128.),.NOTDEFINED.);
    #508= IFCSURFACESTYLE('Door - Frame',.BOTH.,(#507));
    #510= IFCPRESENTATIONSTYLEASSIGNMENT((#508));
    #512= IFCSTYLEDITEM(#474,(#510),$);
    #515= IFCSTYLEDITEM(#497,(#510),$);
    #518= IFCCOLOURRGB($,0.823529411764706,0.623529411764706,0.372549019607843);
    #519= IFCSURFACESTYLERENDERING(#518,0.,$,$,$,$,IFCNORMALISEDRATIOMEASURE(0.5),IFCSPECULAREXPONENT(128.),.NOTDEFINED.);
    #520= IFCSURFACESTYLE('Door - Panel',.BOTH.,(#519));
    #522= IFCPRESENTATIONSTYLEASSIGNMENT((#520));
    #524= IFCSTYLEDITEM(#505,(#522),$);
    #527= IFCSHAPEREPRESENTATION(#118,'Body','SweptSolid',(#474,#497,#505));
    #529= IFCAXIS2PLACEMENT3D(#6,$,$);
    #530= IFCREPRESENTATIONMAP(#529,#527);
    #532= IFCDOORLININGPROPERTIES('1F6umJ5H50aeL3A1Es_wUF',#42,'M_Single-Flush:Outside door:346843',$,$,$,$,$,$,$,$,$,$,$,$);
    #533= IFCDOORPANELPROPERTIES('1F6umJ5H50aeL3A12s_wUF',#42,'M_Single-Flush:Outside door:346843',$,$,.SWINGING.,$,.NOTDEFINED.,$);
    #534= IFCDOORSTYLE('1F6umJ5H50aeL3A0Us_wOq',#42,'M_Single-Flush:Outside door',$,$,(#532,#533,#702,#704,#706,#708,#710,#712,#715,#719,#722,#725,#727,#735),(#530),'49480',.SINGLE_SWING_RIGHT.,.NOTDEFINED.,.F.,.F.);
    #539= IFCMATERIAL('Door - Frame');
    #540= IFCPRESENTATIONSTYLEASSIGNMENT((#508));
    #542= IFCSTYLEDITEM($,(#540),$);
    #544= IFCSTYLEDREPRESENTATION(#113,'Style','Material',(#542));
    #546= IFCMATERIALDEFINITIONREPRESENTATION($,$,(#544),#539);
    #549= IFCMATERIAL('Door - Panel');
    #550= IFCPRESENTATIONSTYLEASSIGNMENT((#520));
    #552= IFCSTYLEDITEM($,(#550),$);
    #554= IFCSTYLEDREPRESENTATION(#113,'Style','Material',(#552));
    #556= IFCMATERIALDEFINITIONREPRESENTATION($,$,(#554),#549);
    #559= IFCMATERIALLIST((#539,#549));
    #561= IFCCARTESIANTRANSFORMATIONOPERATOR3D($,$,#6,1.,$);
    #562= IFCMAPPEDITEM(#530,#561);
    #564= IFCSHAPEREPRESENTATION(#118,'Body','MappedRepresentation',(#562));
    #566= IFCPRODUCTDEFINITIONSHAPE($,$,(#564));
    #568= IFCCARTESIANPOINT((764.191388181842,94.4308514747393,0.));
    #570= IFCAXIS2PLACEMENT3D(#568,#19,#13);
    #938= IFCLOCALPLACEMENT(#915,#937);
    #572= IFCDOOR('1F6umJ5H50aeL3A1As_wUF',#42,'M_Single-Flush:Outside door:346843',$,'M_Single-Flush:Outside door',#938,#566,'346843',2134.,915.);
    #575= IFCMATERIALLIST((#539,#549));
    #577= IFCPROPERTYSINGLEVALUE('FireRating',$,IFCLABEL('--FIRE_CODE--'),$);
    #578= IFCPROPERTYSET('1MAvBog6f9YfPSrRA3TNJX',#42,'Pset_ConcreteElementGeneral',$,(#577));
    #580= IFCPROPERTYSINGLEVALUE('Reference',$,IFCIDENTIFIER('Outside door'),$);
    #581= IFCPROPERTYSINGLEVALUE('FireRating',$,IFCLABEL('--FIRE_CODE--'),$);
    #582= IFCPROPERTYSINGLEVALUE('ThermalTransmittance',$,IFCTHERMALTRANSMITTANCEMEASURE(3.7021),$);
    #583= IFCPROPERTYSET('1F6umJ5H50aeL38_As_wUF',#42,'Pset_DoorCommon',$,(#362,#580,#581,#582));
    #585= IFCPROPERTYSINGLEVALUE('Manufacturer',$,IFCLABEL('--TYPE_COMMENTS_'),$);
    #586= IFCPROPERTYSET('2aWAgDA5DBTx6ubccoEHuL',#42,'Pset_ManufacturerTypeInformation',$,(#585));
    #588= IFCPROPERTYSINGLEVALUE('Category',$,IFCLABEL('Doors'),$);
    #589= IFCPROPERTYSET('37$b9ZV6bEV9w4ajZ6Vuro',#42,'Pset_ProductRequirements',$,(#588));
    #591= IFCPROPERTYSET('1VUx5P6tv2FRM5czFXIoYd',#42,'Pset_QuantityTakeOff',$,(#580));
    #593= IFCPROPERTYSINGLEVALUE('TypeMark',$,IFCLABEL('20'),$);
    #594= IFCPROPERTYSINGLEVALUE('Keynote',$,IFCLABEL('--KEYNOTE--'),$);
    #595= IFCPROPERTYSINGLEVALUE('StoreyName',$,IFCTEXT('Level: Level 1'),$);
    #596= IFCPROPERTYSINGLEVALUE('TypeDescription',$,IFCTEXT('--DESCRIPTION--'),$);
    #597= IFCPROPERTYSINGLEVALUE('StatusConstruction',$,IFCLABEL('New Construction'),$);
    #598= IFCPROPERTYSINGLEVALUE('NetArea',$,IFCAREAMEASURE(3.18957899999998),$);
    #599= IFCPROPERTYSINGLEVALUE('Height',$,IFCLENGTHMEASURE(2134.),$);
    #600= IFCPROPERTYSINGLEVALUE('Width',$,IFCLENGTHMEASURE(915.),$);
    #601= IFCPROPERTYSINGLEVALUE('SillHeight',$,IFCLENGTHMEASURE(0.),$);
    #602= IFCPROPERTYSINGLEVALUE('Hyperlink',$,IFCTEXT('--URL--'),$);
    #603= IFCPROPERTYSET('1CXc3dmFPFfQbCU$bHsAfS',#42,'Custom_Pset','',(#593,#594,#595,#596,#597,#598,#599,#600,#601,#602));
    #605= IFCRELDEFINESBYPROPERTIES('14RxrffgjD6QlWHKtlQTAN',#42,$,$,(#572),#578);
    #609= IFCRELDEFINESBYPROPERTIES('04ckjvoyL25Q50h8x6sUPv',#42,$,$,(#572),#583);
    #612= IFCRELDEFINESBYPROPERTIES('0$6_vvQgz7_eKsnZrkKoIw',#42,$,$,(#572),#586);
    #615= IFCRELDEFINESBYPROPERTIES('1UyD_HmPHBougIcmoJRJ7m',#42,$,$,(#572),#589);
    #618= IFCRELDEFINESBYPROPERTIES('2lpvQgxsjEfPta9gxkQaM5',#42,$,$,(#572),#591);
    #621= IFCRELDEFINESBYPROPERTIES('26uNI57VnEBgae2CZ9gqtr',#42,$,$,(#572),#603);
    #624= IFCQUANTITYLENGTH('Height','',$,2134.);
    #625= IFCQUANTITYLENGTH('Width','',$,915.);
    #626= IFCQUANTITYAREA('Area','area measured in geometry',$,3.18957899999998);
    #627= IFCELEMENTQUANTITY('39uqRwTJT9qhACjvMcPpu_',#42,'BaseQuantities',$,$,(#624,#625,#626));
    #629= IFCRELDEFINESBYPROPERTIES('1QmkCV1Kz2MfAPznLVFMCy',#42,$,$,(#572),#627);
    #632= IFCCLASSIFICATIONREFERENCE('http://www.csiorg.net/uniformat','--ASSEMBLY_CODE--',$,#446);
    #633= IFCRELASSOCIATESCLASSIFICATION('2nmxXpeUXAOQtHOkOFmKTR',#42,'Uniformat Classification','',(#572),#632);
    #636= IFCPROPERTYSINGLEVALUE('Level',$,IFCLABEL('Level: Level 1'),$);
    #637= IFCPROPERTYSINGLEVALUE('Sill Height',$,IFCLENGTHMEASURE(0.),$);
    #638= IFCPROPERTYSINGLEVALUE('Area',$,IFCAREAMEASURE(3.18957899999998),$);
    #639= IFCPROPERTYSINGLEVALUE('Volume',$,IFCVOLUMEMEASURE(0.119856109999999),$);
    #640= IFCPROPERTYSINGLEVALUE('Mark',$,IFCTEXT('1'),$);
    #641= IFCPROPERTYSINGLEVALUE('Category',$,IFCLABEL('Doors'),$);
    #642= IFCPROPERTYSINGLEVALUE('Family',$,IFCLABEL('M_Single-Flush: Outside door'),$);
    #643= IFCPROPERTYSINGLEVALUE('Family and Type',$,IFCLABEL('M_Single-Flush: Outside door'),$);
    #644= IFCPROPERTYSINGLEVALUE('Head Height',$,IFCLENGTHMEASURE(2134.),$);
    #645= IFCPROPERTYSINGLEVALUE('Host Id',$,IFCLABEL('Basic Wall: Bearing Wall'),$);
    #646= IFCPROPERTYSINGLEVALUE('Type',$,IFCLABEL('M_Single-Flush: Outside door'),$);
    #647= IFCPROPERTYSINGLEVALUE('Type Id',$,IFCLABEL('M_Single-Flush: Outside door'),$);
    #648= IFCPROPERTYSINGLEVALUE('Analytic Construction',$,IFCTEXT('Metal'),$);
    #649= IFCPROPERTYSINGLEVALUE('Define Thermal Properties by',$,IFCIDENTIFIER('Schematic Type'),$);
    #650= IFCPROPERTYSINGLEVALUE('Heat Transfer Coefficient (U)',$,IFCREAL(3.7021),$);
    #651= IFCPROPERTYSINGLEVALUE('Solar Heat Gain Coefficient',$,IFCREAL(0.),$);
    #652= IFCPROPERTYSINGLEVALUE('Thermal Resistance (R)',$,IFCREAL(0.270116960643959),$);
    #653= IFCPROPERTYSINGLEVALUE('Visual Light Transmittance',$,IFCREAL(0.),$);
    #654= IFCPROPERTYSINGLEVALUE('Door Material',$,IFCLABEL('Door - Panel'),$);
    #655= IFCPROPERTYSINGLEVALUE('Frame Material',$,IFCLABEL('Door - Frame'),$);
    #656= IFCPROPERTYSINGLEVALUE('Function',$,IFCIDENTIFIER('Interior'),$);
    #657= IFCPROPERTYSINGLEVALUE('Wall Closure',$,IFCIDENTIFIER('By host'),$);
    #658= IFCPROPERTYSINGLEVALUE('Height',$,IFCLENGTHMEASURE(2134.),$);
    #659= IFCPROPERTYSINGLEVALUE('Thickness',$,IFCLENGTHMEASURE(51.),$);
    #660= IFCPROPERTYSINGLEVALUE('Trim Projection Ext',$,IFCLENGTHMEASURE(25.),$);
    #661= IFCPROPERTYSINGLEVALUE('Trim Projection Int',$,IFCLENGTHMEASURE(25.),$);
    #662= IFCPROPERTYSINGLEVALUE('Trim Width',$,IFCLENGTHMEASURE(76.),$);
    #663= IFCPROPERTYSINGLEVALUE('Width',$,IFCLENGTHMEASURE(915.),$);
    #664= IFCPROPERTYSINGLEVALUE('Assembly Code',$,IFCTEXT('--ASSEMBLY_CODE--'),$);
    #665= IFCPROPERTYSINGLEVALUE('Code Name',$,IFCTEXT(''),$);
    #666= IFCPROPERTYSINGLEVALUE('Description',$,IFCTEXT('--DESCRIPTION--'),$);
    #667= IFCPROPERTYSINGLEVALUE('Fire Rating',$,IFCTEXT('--FIRE_CODE--'),$);
    #668= IFCPROPERTYSINGLEVALUE('Keynote',$,IFCTEXT('--KEYNOTE--'),$);
    #669= IFCPROPERTYSINGLEVALUE('Manufacturer',$,IFCTEXT('--TYPE_COMMENTS_'),$);
    #670= IFCPROPERTYSINGLEVALUE('Model',$,IFCTEXT('--MODEL--'),$);
    #671= IFCPROPERTYSINGLEVALUE('OmniClass Number',$,IFCTEXT('23.30.10.00'),$);
    #672= IFCPROPERTYSINGLEVALUE('OmniClass Title',$,IFCTEXT('Doors'),$);
    #673= IFCPROPERTYSINGLEVALUE('Type Mark',$,IFCTEXT('20'),$);
    #674= IFCPROPERTYSINGLEVALUE('Type Name',$,IFCTEXT('Outside door'),$);
    #675= IFCPROPERTYSINGLEVALUE('URL',$,IFCTEXT('--URL--'),$);
    #676= IFCPROPERTYSINGLEVALUE('Family Name',$,IFCTEXT('M_Single-Flush'),$);
    #677= IFCPROPERTYSET('1F6umJ5H50aeL3BWQs_wUF',#42,'Constraints',$,(#636,#637));
    #679= IFCRELDEFINESBYPROPERTIES('1F6umJ5H50aeL3BmQs_wUF',#42,$,$,(#572),#677);
    #682= IFCPROPERTYSET('1F6umJ5H50aeL3BX2s_wUF',#42,'Dimensions',$,(#638,#639));
    #684= IFCRELDEFINESBYPROPERTIES('1F6umJ5H50aeL3Bn2s_wUF',#42,$,$,(#572),#682);
    #687= IFCPROPERTYSET('1F6umJ5H50aeL3BXEs_wUF',#42,'Identity Data',$,(#640));
    #689= IFCRELDEFINESBYPROPERTIES('1F6umJ5H50aeL3BnEs_wUF',#42,$,$,(#572),#687);
    #692= IFCPROPERTYSET('2BegeYd3fCOeVyUmGr0qxL',#42,'Other',$,(#641,#642,#643,#644,#645,#646,#647));
    #694= IFCRELDEFINESBYPROPERTIES('1QrXJ2z1rFTuQboBVeLF$Z',#42,$,$,(#572),#692);
    #697= IFCPROPERTYSET('1F6umJ5H50aeL3BXss_wUF',#42,'Phasing',$,(#276));
    #699= IFCRELDEFINESBYPROPERTIES('1F6umJ5H50aeL3Bnss_wUF',#42,$,$,(#572),#697);
    #702= IFCPROPERTYSET('3W2Tu2KKr66wtPVQ1PGsDC',#42,'Analytical Properties',$,(#648,#649,#650,#651,#652,#653));
    #704= IFCPROPERTYSET('3W2Tu2KKr66wtPVVbPGsDC',#42,'Construction',$,(#656,#657));
    #706= IFCPROPERTYSET('3W2Tu2KKr66wtPVVzPGsDC',#42,'Dimensions',$,(#658,#659,#660,#661,#662,#663));
    #708= IFCPROPERTYSET('3W2Tu2KKr66wtPVVnPGsDC',#42,'Identity Data',$,(#296,#664,#665,#666,#667,#668,#669,#670,#671,#672,#673,#674,#675));
    #710= IFCPROPERTYSET('3W2Tu2KKr66wtPVVjPGsDC',#42,'Materials and Finishes',$,(#654,#655));
    #712= IFCPROPERTYSET('0KOXzzKarFERoTS0N7cfbD',#42,'Other',$,(#641,#676));
    #714= IFCPROPERTYSINGLEVALUE('FireRating',$,IFCLABEL('--FIRE_CODE--'),$);
    #715= IFCPROPERTYSET('0YRN2fpNzDoxoXFEOdBeJw',#42,'Pset_ConcreteElementGeneral',$,(#714));
    #717= IFCPROPERTYSINGLEVALUE('FireRating',$,IFCLABEL('--FIRE_CODE--'),$);
    #718= IFCPROPERTYSINGLEVALUE('ThermalTransmittance',$,IFCTHERMALTRANSMITTANCEMEASURE(3.7021),$);
    #719= IFCPROPERTYSET('3W2Tu2KKr66wtPS0rPGsDC',#42,'Pset_DoorCommon',$,(#362,#580,#717,#718));
    #721= IFCPROPERTYSINGLEVALUE('Manufacturer',$,IFCLABEL('--TYPE_COMMENTS_'),$);
    #722= IFCPROPERTYSET('0LOQqn1NfDkwoxFtCajotd',#42,'Pset_ManufacturerTypeInformation',$,(#721));
    #724= IFCPROPERTYSINGLEVALUE('Category',$,IFCLABEL('Doors'),$);
    #725= IFCPROPERTYSET('2b6m9MCNn679Y43LRC330T',#42,'Pset_ProductRequirements',$,(#724));
    #727= IFCPROPERTYSET('0F4CuoFTLEvRXd3x$a9K3$',#42,'Pset_QuantityTakeOff',$,(#580));
    #729= IFCPROPERTYSINGLEVALUE('TypeMark',$,IFCLABEL('20'),$);
    #730= IFCPROPERTYSINGLEVALUE('Keynote',$,IFCLABEL('--KEYNOTE--'),$);
    #731= IFCPROPERTYSINGLEVALUE('TypeDescription',$,IFCTEXT('--DESCRIPTION--'),$);
    #732= IFCPROPERTYSINGLEVALUE('Height',$,IFCLENGTHMEASURE(2134.),$);
    #733= IFCPROPERTYSINGLEVALUE('Width',$,IFCLENGTHMEASURE(915.),$);
    #734= IFCPROPERTYSINGLEVALUE('Hyperlink',$,IFCTEXT('--URL--'),$);
    #735= IFCPROPERTYSET('3CUt_fMl9Df9OKgw$sNH0T',#42,'Custom_Pset',$,(#729,#730,#731,#732,#733,#734));
    #751= IFCPROPERTYSINGLEVALUE('Name',$,IFCLABEL('Level 1'),$);
    #752= IFCPROPERTYSET('0$99IJGkP9Q86lu5rnKYUN',#42,'Pset_AirSideSystemInformation',$,(#751));
    #754= IFCPROPERTYSINGLEVALUE('AboveGround',$,IFCLOGICAL(.U.),$);
    #755= IFCPROPERTYSET('3Zu5Bv0LOHrPC12_o6FoQQ',#42,'Pset_BuildingStoreyCommon',$,(#754));
    #757= IFCPROPERTYSINGLEVALUE('Name',$,IFCLABEL('Level 1'),$);
    #758= IFCPROPERTYSINGLEVALUE('Category',$,IFCLABEL('Levels'),$);
    #759= IFCPROPERTYSET('1E$wH_IvL0u9KdSridkQHO',#42,'Pset_ProductRequirements',$,(#757,#758));
    #761= IFCPROPERTYSINGLEVALUE('SpaceName',$,IFCLABEL('Level 1'),$);
    #762= IFCPROPERTYSET('081bdaxsT7tvi7VV3hCTqa',#42,'Custom_Pset','',(#761));
    #764= IFCRELDEFINESBYPROPERTIES('0Jv9wzDiT2Fx3l2pN5PrZ7',#42,$,$,(#140),#752);
    #768= IFCRELDEFINESBYPROPERTIES('1uZQMUSkv6FAgEXy9GtiEh',#42,$,$,(#140),#755);
    #771= IFCRELDEFINESBYPROPERTIES('1FuE$sx5j7jhZwoEQu$YIS',#42,$,$,(#140),#759);
    #774= IFCRELDEFINESBYPROPERTIES('1ThjSvkAT6B8HzMssSW$IW',#42,$,$,(#140),#762);
    #777= IFCPROPERTYSINGLEVALUE('Elevation',$,IFCLENGTHMEASURE(0.),$);
    #778= IFCPROPERTYSINGLEVALUE('Computation Height',$,IFCLENGTHMEASURE(0.),$);
    #779= IFCPROPERTYSINGLEVALUE('Building Story',$,IFCBOOLEAN(.T.),$);
    #780= IFCPROPERTYSINGLEVALUE('Name',$,IFCTEXT('Level 1'),$);
    #781= IFCPROPERTYSINGLEVALUE('Category',$,IFCLABEL('Levels'),$);
    #782= IFCPROPERTYSINGLEVALUE('Family',$,IFCLABEL('Level: 8mm Head'),$);
    #783= IFCPROPERTYSINGLEVALUE('Family and Type',$,IFCLABEL('Level: 8mm Head'),$);
    #784= IFCPROPERTYSINGLEVALUE('Type',$,IFCLABEL('Level: 8mm Head'),$);
    #785= IFCPROPERTYSINGLEVALUE('Type Id',$,IFCLABEL('Level: 8mm Head'),$);
    #786= IFCPROPERTYSINGLEVALUE('Elevation Base',$,IFCIDENTIFIER('Project Base Point'),$);
    #787= IFCPROPERTYSINGLEVALUE('Color',$,IFCINTEGER(0),$);
    #788= IFCPROPERTYSINGLEVALUE('Line Pattern',$,IFCLABEL('Centre'),$);
    #789= IFCPROPERTYSINGLEVALUE('Line Weight',$,IFCIDENTIFIER('1'),$);
    #790= IFCPROPERTYSINGLEVALUE('Symbol',$,IFCLABEL('M_Level Head - Circle: M_Level Head - Circle'),$);
    #791= IFCPROPERTYSINGLEVALUE('Symbol at End 1 Default',$,IFCBOOLEAN(.F.),$);
    #792= IFCPROPERTYSINGLEVALUE('Symbol at End 2 Default',$,IFCBOOLEAN(.T.),$);
    #793= IFCPROPERTYSINGLEVALUE('Type Name',$,IFCTEXT('8mm Head'),$);
    #794= IFCPROPERTYSINGLEVALUE('Family Name',$,IFCTEXT('Level'),$);
    #795= IFCPROPERTYSET('3Zu5Bv0LOHrPC11XI6FoQQ',#42,'Constraints',$,(#777));
    #797= IFCRELDEFINESBYPROPERTIES('3Zu5Bv0LOHrPC11nI6FoQQ',#42,$,$,(#140),#795);
    #800= IFCPROPERTYSET('3Zu5Bv0LOHrPC11WA6FoQQ',#42,'Dimensions',$,(#778));
    #802= IFCRELDEFINESBYPROPERTIES('3Zu5Bv0LOHrPC11mA6FoQQ',#42,$,$,(#140),#800);
    #805= IFCPROPERTYSET('3Zu5Bv0LOHrPC11W66FoQQ',#42,'Identity Data',$,(#278,#779,#780));
    #807= IFCRELDEFINESBYPROPERTIES('3Zu5Bv0LOHrPC11m66FoQQ',#42,$,$,(#140),#805);
    #810= IFCPROPERTYSET('0eCyo1mQf61RRDb8LkFhbB',#42,'Other',$,(#781,#782,#783,#784,#785));
    #812= IFCRELDEFINESBYPROPERTIES('3$zaZUyoL6L9DrOV9RtgBX',#42,$,$,(#140),#810);
    #815= IFCPROPERTYSET('3Zu5Bv0LOHrPC11XI6FoQS',#42,'Constraints(Type)',$,(#786));
    #817= IFCPROPERTYSET('3Zu5Bv0LOHrPC11WM6FoQS',#42,'Graphics(Type)',$,(#787,#788,#789,#790,#791,#792));
    #819= IFCPROPERTYSET('3Zu5Bv0LOHrPC11W66FoQS',#42,'Identity Data(Type)',$,(#793));
    #821= IFCPROPERTYSET('2qVnE7UtTDKAGidujFAE08',#42,'Other(Type)',$,(#781,#794));
    #828= IFCRELAGGREGATES('2usGHf9Nj3g8$vNhPcOa4J',#42,$,$,#121,(#150));
    #832= IFCRELAGGREGATES('0YbgX$FVvBg9IJMkBorzcZ',#42,$,$,#150,(#131));
    #836= IFCRELAGGREGATES('27PCKGLxT4mxtV9cw6mgBW',#42,$,$,#131,(#140));
    #840= IFCPROPERTYSINGLEVALUE('NumberOfStoreys',$,IFCINTEGER(1),$);
    #841= IFCPROPERTYSINGLEVALUE('IsLandmarked',$,IFCLOGICAL(.U.),$);
    #842= IFCPROPERTYSET('27PCKGLxT4mxtVBOQ6mgBW',#42,'Pset_BuildingCommon',$,(#840,#841));
    #844= IFCPROPERTYSINGLEVALUE('Category',$,IFCLABEL('Project Information'),$);
    #845= IFCPROPERTYSET('2HlE6XRD5D2u$q88QiyvCI',#42,'Pset_ProductRequirements',$,(#844));
    #847= IFCRELDEFINESBYPROPERTIES('1ThDg46v99hhPo_cQYW0rR',#42,$,$,(#131),#842);
    #851= IFCRELDEFINESBYPROPERTIES('041QPVCJrABucJbKRNgMWb',#42,$,$,(#131),#845);
    #854= IFCPROPERTYSINGLEVALUE('Author',$,IFCTEXT('// AUTHOR //'),$);
    #855= IFCPROPERTYSINGLEVALUE('Building Name',$,IFCTEXT('// BUILDING/NAME //'),$);
    #856= IFCPROPERTYSINGLEVALUE('Organization Description',$,IFCTEXT('// ORGANIZATION/DESCRIPTION //'),$);
    #857= IFCPROPERTYSINGLEVALUE('Organization Name',$,IFCTEXT('// ORGANIZATION/NAME //'),$);
    #858= IFCPROPERTYSINGLEVALUE('Client Name',$,IFCTEXT('// CLIENT/NAME //'),$);
    #859= IFCPROPERTYSINGLEVALUE('Project Address',$,IFCTEXT('Enter address here'),$);
    #860= IFCPROPERTYSINGLEVALUE('Project Issue Date',$,IFCTEXT('// ISSUE DATE //'),$);
    #861= IFCPROPERTYSINGLEVALUE('Project Name',$,IFCTEXT('// PROJECT/NAME //'),$);
    #862= IFCPROPERTYSINGLEVALUE('Project Number',$,IFCTEXT('// PROJECT/NUMBER //'),$);
    #863= IFCPROPERTYSINGLEVALUE('Project Status',$,IFCTEXT('// PROJECT/STATUS //'),$);
    #864= IFCPROPERTYSET('0s2Cq7Qr16Ox1rbEEIxz2G',#42,'Identity Data',$,(#854,#855,#856,#857));
    #866= IFCRELDEFINESBYPROPERTIES('28SWhRx5b0sf$MJWcMt2nE',#42,$,$,(#131),#864);
    #869= IFCPROPERTYSET('1CDFHAzCT93vZFGBuRrsae',#42,'Other',$,(#168,#858,#859,#860,#861,#862,#863));
    #871= IFCRELDEFINESBYPROPERTIES('2DcsKHXrrAPwYRZm$ohYq2',#42,$,$,(#131),#869);
    #874= IFCRELASSOCIATESMATERIAL('1wE5zd2gDCvQcFXdkvgcaL',#42,$,$,(#219),#260);
    #876= IFCRELASSOCIATESMATERIAL('3GYCaV5cTDC9Pr0aWWgagz',#42,$,$,(#261),#257);
    #879= IFCRELASSOCIATESMATERIAL('1FhLk1Yhr9qfrZHn1ibg3k',#42,$,$,(#534),#559);
    #882= IFCRELASSOCIATESMATERIAL('0fx8ZLmDfAMv9ssKwx6$_9',#42,$,$,(#572),#575);
    #884= IFCRELDEFINESBYTYPE('3Nexmy3HT5DQH5On6RkB_B',#42,$,$,(#219),#261);
    #887= IFCRELDEFINESBYTYPE('3wpnK4sXnFpBOVHc68PX9l',#42,$,$,(#572),#534);
    #890= IFCRELDEFINESBYPROPERTIES('0tF1p_d896seH5amYBxeZq',#42,$,$,(#140),#815);
    #893= IFCRELDEFINESBYPROPERTIES('0E5e8bTTXAVwon56y69uPu',#42,$,$,(#140),#817);
    #896= IFCRELDEFINESBYPROPERTIES('1BJ83_hCTCVfyD3$5h98Nf',#42,$,$,(#140),#819);
    #899= IFCRELDEFINESBYPROPERTIES('2i4fyR0Hz3ChSGqhPoEuwU',#42,$,$,(#140),#821);
    #902= IFCCARTESIANPOINT((1067.,457.5));
    #904= IFCAXIS2PLACEMENT2D(#902,#27);
    #905= IFCRECTANGLEPROFILEDEF(.AREA.,$,#904,915.,2134.);
    #906= IFCAXIS2PLACEMENT3D(#6,#17,#19);
    #907= IFCEXTRUDEDAREASOLID(#905,#906,#19,200.);
    #908= IFCSHAPEREPRESENTATION(#118,'Body','SweptSolid',(#907));
    #910= IFCPRODUCTDEFINITIONSHAPE($,$,(#908));
    #912= IFCCARTESIANPOINT((2457.5,100.,0.));
    #914= IFCAXIS2PLACEMENT3D(#912,$,$);
    #915= IFCLOCALPLACEMENT(#188,#914);
    #917= IFCOPENINGELEMENT('1F6umJ5H50aeL3A06s_wUF',#42,'M_Single-Flush:Outside door:346843:1',$,'Opening',#915,#910,'346843');
    #922= IFCRELVOIDSELEMENT('1F6umJ5H50aeL3A0Qs_wUF',#42,$,$,#219,#917);
    #925= IFCQUANTITYLENGTH('Depth',$,$,200.);
    #926= IFCQUANTITYLENGTH('Height',$,$,915.);
    #927= IFCQUANTITYLENGTH('Width',$,$,2134.);
    #928= IFCELEMENTQUANTITY('2bznKwbC9EfhuYS7RbVHuS',#42,'BaseQuantities',$,$,(#925,#926,#927));
    #930= IFCRELDEFINESBYPROPERTIES('18rPOfDATBfOF$7p8CMdFK',#42,$,$,(#917),#928);
    #934= IFCRELFILLSELEMENT('3trX3C1YDCOBtTtvk1SC8E',#42,$,$,#917,#572);
    #941= IFCPRESENTATIONLAYERASSIGNMENT('A-DOOR-____-OTLN',$,(#527,#564),$);
    #943= IFCPRESENTATIONLAYERASSIGNMENT('A-WALL-____-OTLN',$,(#194,#212,#908),$);
    ENDSEC;
    
    END-ISO-10303-21;

    Print the Result

    The final thing we need to do is to output the result. With a simple console.log, we get:

    {
      "#219": {
        entityName: "IfcWallStandardCase",
        instanceName: "#219",
        attributes: {
          parsed: [
            "1F6umJ5H50aeL3A1As_wTm",
            "#42",
            "Basic Wall:Bearing Wall:346660",
            "$",
            "Basic Wall:Bearing Wall",
            "#188",
            "#215",
            "346660"
          ]
        },
        properties: {
          Custom_Pset: {
            TypeMark: "_TYPE-MARK_",
            Keynote: "_KEYNOTE_",
            StoreyName: "Level: Level 1",
            TypeDescription: "_DESCRIPTION_",
            StatusConstruction: "New Construction",
            NetArea: "14.04739",
            Height: "4000.",
            Width: "200.",
            Length: "4000.",
            Hyperlink: "_URL_"
          }
        }
      },
      "#572": {
        entityName: "IfcDoor",
        instanceName: "#572",
        attributes: {
          parsed: [
            "1F6umJ5H50aeL3A1As_wUF",
            "#42",
            "M_Single-Flush:Outside door:346843",
            "$",
            "M_Single-Flush:Outside door",
            "#938",
            "#566",
            "346843",
            "2134.",
            "915."
          ]
        },
        properties: {
          Custom_Pset: {
            TypeMark: "20",
            Keynote: "--KEYNOTE--",
            StoreyName: "Level: Level 1",
            TypeDescription: "--DESCRIPTION--",
            StatusConstruction: "New Construction",
            NetArea: "3.18957899999998",
            Height: "2134.",
            Width: "915.",
            SillHeight: "0.",
            Hyperlink: "--URL--"
          }
        }
      }
    }

    Print Property Set

    Let's take a minitue to prettify the result. We can implement this simple function:

    function printPropertySet(entites, myPropertySet) {
        for (var entitiy in entites) {
            for (var propertySet in entites[entitiy].properties) {
                if (propertySet === myPropertySet) {
                    console.log(entites[entitiy].properties[pset]);
                }
            }
        }
    }

    Calling this function will give us a prittier result:

    {
      TypeMark: "_TYPE-MARK_",
      Keynote: "_KEYNOTE_",
      StoreyName: "Level: Level 1",
      TypeDescription: "_DESCRIPTION_",
      StatusConstruction: "New Construction",
      NetArea: "14.04739",
      Height: "4000.",
      Width: "200.",
      Length: "4000.",
      Hyperlink: "_URL_"
    }
    {
      TypeMark: "20",
      Keynote: "--KEYNOTE--",
      StoreyName: "Level: Level 1",
      TypeDescription: "--DESCRIPTION--",
      StatusConstruction: "New Construction",
      NetArea: "3.18957899999998",
      Height: "2134.",
      Width: "915.",
      SillHeight: "0.",
      Hyperlink: "--URL--"
    }

    Good job! You are now ready for the Advanced Example

    {
      TypeMark: "_TYPE-MARK_",
      Keynote: "_KEYNOTE_",
      StoreyName: "Level: Level 1",
      TypeDescription: "_DESCRIPTION_",
      StatusConstruction: "New Construction",
      NetArea: "14.04739",
      Height: "4000.",
      Width: "200.",
      Length: "4000.",
      Hyperlink: "_URL_"
    }
    {
      TypeMark: "20",
      Keynote: "--KEYNOTE--",
      StoreyName: "Level: Level 1",
      TypeDescription: "--DESCRIPTION--",
      StatusConstruction: "New Construction",
      NetArea: "3.18957899999998",
      Height: "2134.",
      Width: "915.",
      SillHeight: "0.",
      Hyperlink: "--URL--"
    }
    Not sure what a CDN is?
    Check out:

    To get the latest version, simply include this snippet in your HTML:

    If you want a specific realase of BIMWHALE.js, then head to:

    https://www.jsdelivr.com/package/gh/andrewisen/bim-whale

    Go to the folder dist and select bundle.min.js. Notice the dropdown in the picture below. It says 0.0.1. This indicates which realease you are at.

    jsDelivr
    <script src="https://cdn.jsdelivr.net/gh/andrewisen/bim-whale/dist/BIMWHALE.min.js"></script>
    What is a Content Delivery Network (CDN)?
    Codepen

    Advanced Example

    Let's build something more practical. Make sure you have read and understood the Simple Example. Before we begin, let's list some feature that the previous example lacked:

    • The config was hard coded. There was no way for the user to change it.

    • The infromation was only logged in the console. A regular user couldn't see the result.

    Add Basic HTML Page

    Let's add an input:

     <input type="file" id="myIfcFile">

    A simple approach to run a function on each file change:

     <input type="file" id="myIfcFile" onchange="myFunction()">

    The detailed insctructions covered the bascis of reading a file and using BIMWHALE.js.

    var file = document.getElementById('myIfcFile').files[0];
    var reader = new FileReader();
    reader.onload = function(e) {
      var lines = e.target.result.split(/\r\n|\n/);
      // TODO
    };
    reader.readAsText(file);

    Our HTML should look something like this:

    <!DOCTYPE html>
    <html>
        <body>
            <h3>Advanced Example</h3>
            <!-- Input -->
            <input type="file" id="myIfcFile" onchange="myFunction()" />
            <!-- Bootstrap, jQuery, DataTables -->
            <link
                rel="stylesheet"
                type="text/css"
                href="https://cdn.datatables.net/v/bs4-4.1.1/jq-3.3.1/dt-1.10.22/datatables.min.css"
            />
            <script
                type="text/javascript"
                src="https://cdn.datatables.net/v/bs4-4.1.1/jq-3.3.1/dt-1.10.22/datatables.min.js"
            ></script>
            <!-- BIMWHALE.js -->
            <script src="https://cdn.jsdelivr.net/gh/andrewisen/bim-whale/dist/bundle.min.js"></script>
            <script>
                function myFunction() {
                    var file = document.getElementById("myIfcFile").files[0];
                    var reader = new FileReader();
                    reader.onload = function (e) {
                        var lines = e.target.result.split(/\r\n|\n/);
                        // Create new BIMWHALE.js object
                        var ifcFile = new BIMWHALE.IfcFile(lines, config);
                        // Parse file and get IFC entiteis
                        var ifcEntites = ifcFile.parseIfcFile();
                        console.log(ifcEntites);
                    };
                    reader.readAsText(file);
                }
            </script>
        </body>
    </html>

    Add Config - part 1

    Let's contiue by allowing the user to select options. Since we already use jQuery, we're going to use Select2 as well. Feel free to use any other alternative. We are going to use select2@4.0.13 for this example.

    <link href="https://cdn.jsdelivr.net/npm/select2@4.0.13/dist/css/select2.min.css" rel="stylesheet" />
    <script src="https://cdn.jsdelivr.net/npm/select2@4.0.13/dist/js/select2.min.js"></script>

    Let's add a select box above the file input. We will name this selectedEntitesInput.

    <!-- Input -->
    <select
        id="selectedEntitesInput"
        name="selectedEntites[]"
        multiple="multiple"
        style="width: 100%"
        required
    ></select>
    <input type="file" id="myIfcFile" onchange="myFunction()" />
    

    Let's configure select2. We're going to load our data from an array.

    Here's a staring template. Again, a list of IFC building elements can be found here.

    Our HTML should look something like this:

    Add Config - part 2

    Let's convert the select2 input to something we can use. We are going to use spread syntax in this example.

     var selectedEntities = {};
    $("#selectedEntitesInput")
        .val()
        .forEach((entity) => {
            selectedEntities = {
                ...selectedEntities,
                [entity.toUpperCase()]: entity,
            };
        });

    This might look very complicated, but don't worry.

    1. We simply get our selection by calling $("#selectedEntitesInput").val()

    2. We create an object for each selected entity using.forEach((entity) =>

    3. We use an . Our emtpy object, selectedEntities, gets populated.

    Our HTML should look something like this:

    $(document).ready(function () {
        // select2
        $("#selectedEntitesInput").select2({
            data: data,
            placeholder: "Select which entities to include",
        });
    });
    var data = [
        {
            text: "Shared Building Elements",
            children: [
                {
                    id: "IfcDoor",
                    text: "IfcDoor",
                },
                {
                    id: "IfcWallStandardCase",
                    text: "IfcWallStandardCase",
                },
                {
                    id: "IfcWindow",
                    text: "IfcWindow",
                },
            ],
        },
    ];
    arrow function expression

    Create a Table

    Let's output our result to a table using DataTables.

    <table class="table table-hover" id="ifcTable" width="100%"></table>

    We need to populate the table ourselves... this might be a bit tricky to do. Here's an example to help you get started. See Ajax sourced data for more information.

    var data = [];
    Object.values(ifcEntites).forEach((entity) => {
        Object.keys(entity.properties).forEach(
            (propertySet) => {
                Object.keys(
                    entity.properties[propertySet]
                ).forEach((property) => {
                    data = [
                        ...data,
                        [
                            entity.instanceName,
                            entity.attributes.parsed[0],
                            entity.entityName,
                            entity.attributes.parsed[2],
                            propertySet,
                            property,
                            entity.properties[propertySet][
                                property
                            ],
                        ],
                    ];
                });
            }
        );
    });
    

    Our HTML should look something like this:

    <!DOCTYPE html>
    <html>
        <body>
            <h3>Advanced Example</h3>
            <!-- Input -->
            <select
                id="selectedEntitesInput"
                name="selectedEntites[]"
                multiple="multiple"
                style="width: 100%"
                required
            ></select>
            <input type="file" id="myIfcFile" onchange="myFunction()" />
            <!-- Bootstrap, jQuery, DataTables -->
            <link
                rel="stylesheet"
                type="text/css"
                href="https://cdn.datatables.net/v/bs4-4.1.1/jq-3.3.1/dt-1.10.22/datatables.min.css"
            />
            <script
                type="text/javascript"
                src="https://cdn.datatables.net/v/bs4-4.1.1/jq-3.3.1/dt-1.10.22/datatables.min.js"
            ></script>
            <!-- Select2 -->
            <link
                href="https://cdn.jsdelivr.net/npm/select2@4.0.13/dist/css/select2.min.css"
                rel="stylesheet"
            />
            <script src="https://cdn.jsdelivr.net/npm/select2@4.0.13/dist/js/select2.min.js"></script>
            <!-- BIMWHALE.js -->
            <script src="https://cdn.jsdelivr.net/gh/andrewisen/bim-whale/dist/bundle.min.js"></script>
            <script>
                // Select
                $(document).ready(function () {
                    var data = [
                        {
                            text: "Shared Building Elements",
                            children: [
                                {
                                    id: "IfcDoor",
                                    text: "IfcDoor",
                                },
                                {
                                    id: "IfcWallStandardCase",
                                    text: "IfcWallStandardCase",
                                },
                                {
                                    id: "IfcWindow",
                                    text: "IfcWindow",
                                },
                            ],
                        },
                    ];
                    $("#selectedEntitesInput").select2({
                        data: data,
                        placeholder: "Select which entities to include",
                    });
                });
                // File Input
                function myFunction() {
                    var file = document.getElementById("myIfcFile").files[0];
                    var reader = new FileReader();
                    reader.onload = function (e) {
                        var lines = e.target.result.split(/\r\n|\n/);
                        // Create new BIMWHALE.js object
                        var ifcFile = new BIMWHALE.IfcFile(lines, config);
                        // Parse file and get IFC entiteis
                        var ifcEntites = ifcFile.parseIfcFile();
                        console.log(ifcEntites);
                    };
                    reader.readAsText(file);
                }
            </script>
        </body>
    </html>
    
    <!DOCTYPE html>
    <html>
        <body>
            <h3>Advanced Example</h3>
            <!-- Input -->
            <select
                id="selectedEntitesInput"
                name="selectedEntites[]"
                multiple="multiple"
                style="width: 100%"
                required
            ></select>
            <input type="file" id="myIfcFile" onchange="myFunction()" />
            <!-- Bootstrap, jQuery, DataTables -->
            <link
                rel="stylesheet"
                type="text/css"
                href="https://cdn.datatables.net/v/bs4-4.1.1/jq-3.3.1/dt-1.10.22/datatables.min.css"
            />
            <script
                type="text/javascript"
                src="https://cdn.datatables.net/v/bs4-4.1.1/jq-3.3.1/dt-1.10.22/datatables.min.js"
            ></script>
            <!-- Select2 -->
            <link
                href="https://cdn.jsdelivr.net/npm/select2@4.0.13/dist/css/select2.min.css"
                rel="stylesheet"
            />
            <script src="https://cdn.jsdelivr.net/npm/select2@4.0.13/dist/js/select2.min.js"></script>
            <!-- BIMWHALE.js -->
            <script src="https://cdn.jsdelivr.net/gh/andrewisen/bim-whale/dist/bundle.min.js"></script>
            <script>
                // Select
                $(document).ready(function () {
                    var data = [
                        {
                            text: "Shared Building Elements",
                            children: [
                                {
                                    id: "IfcDoor",
                                    text: "IfcDoor",
                                },
                                {
                                    id: "IfcWallStandardCase",
                                    text: "IfcWallStandardCase",
                                },
                                {
                                    id: "IfcWindow",
                                    text: "IfcWindow",
                                },
                            ],
                        },
                    ];
                    $("#selectedEntitesInput").select2({
                        data: data,
                        placeholder: "Select which entities to include",
                    });
                });
                // File Input
                function myFunction() {
                    let selectedEntities = {};
                    $("#selectedEntitesInput")
                        .val()
                        .forEach((entity) => {
                            selectedEntities = {
                                ...selectedEntities,
                                [entity.toUpperCase()]: entity,
                            };
                        });
                    var requiredEntities = {
                        IFCPROPERTYSINGLEVALUE: "IfcPropertySingleValue",
                        IFCRELDEFINESBYPROPERTIES: "IfcRelDefinesByProperties",
                        IFCPROPERTYSET: "IfcPropertySet",
                    };
                    var selectedPropertySets = [];
                    var allEntities = {
                        ...requiredEntities,
                        ...selectedEntities,
                    };
                    var config = {
                        requiredEntities,
                        selectedEntities,
                        selectedPropertySets,
                        allEntities,
                    };
    
                    var file = document.getElementById("myIfcFile").files[0];
                    var reader = new FileReader();
                    reader.onload = function (e) {
                        var lines = e.target.result.split(/\r\n|\n/);
                        // Create new BIMWHALE.js object
                        var ifcFile = new BIMWHALE.IfcFile(lines, config);
                        // Parse file and get IFC entiteis
                        var ifcEntites = ifcFile.parseIfcFile();
                        console.log(ifcEntites);
                    };
                    reader.readAsText(file);
                }
            </script>
        </body>
    </html>
    
    <!DOCTYPE html>
    <html>
        <body>
            <h3>Advanced Example</h3>
            <!-- Input -->
            <select
                id="selectedEntitesInput"
                name="selectedEntites[]"
                multiple="multiple"
                style="width: 100%"
                required
            ></select>
            <input type="file" id="myIfcFile" onchange="myFunction()" />
    
            <!-- Table  -->
            <table class="table table-hover" id="ifcTable" width="100%"></table>
    
            <!-- Bootstrap, jQuery, DataTables -->
            <link
                rel="stylesheet"
                type="text/css"
                href="https://cdn.datatables.net/v/bs4-4.1.1/jq-3.3.1/dt-1.10.22/datatables.min.css"
            />
            <script
                type="text/javascript"
                src="https://cdn.datatables.net/v/bs4-4.1.1/jq-3.3.1/dt-1.10.22/datatables.min.js"
            ></script>
            <!-- Select2 -->
            <link
                href="https://cdn.jsdelivr.net/npm/select2@4.0.13/dist/css/select2.min.css"
                rel="stylesheet"
            />
            <script src="https://cdn.jsdelivr.net/npm/select2@4.0.13/dist/js/select2.min.js"></script>
            <!-- BIMWHALE.js -->
            <script src="https://cdn.jsdelivr.net/gh/andrewisen/bim-whale/dist/bundle.min.js"></script>
           
            <script>
                // Select
                $(document).ready(function () {
                    var data = [
                        {
                            text: "Shared Building Elements",
                            children: [
                                {
                                    id: "IfcDoor",
                                    text: "IfcDoor",
                                },
                                {
                                    id: "IfcWallStandardCase",
                                    text: "IfcWallStandardCase",
                                },
                                {
                                    id: "IfcWindow",
                                    text: "IfcWindow",
                                },
                            ],
                        },
                    ];
                    $("#selectedEntitesInput").select2({
                        data: data,
                        placeholder: "Select which entities to include",
                    });
                });
                // File Input
                function myFunction() {
                    // Get selected entities
                    let selectedEntities = {};
                    $("#selectedEntitesInput")
                        .val()
                        .forEach((entity) => {
                            selectedEntities = {
                                ...selectedEntities,
                                [entity.toUpperCase()]: entity,
                            };
                        });
                    // Build config
                    var requiredEntities = {
                        IFCPROPERTYSINGLEVALUE: "IfcPropertySingleValue",
                        IFCRELDEFINESBYPROPERTIES: "IfcRelDefinesByProperties",
                        IFCPROPERTYSET: "IfcPropertySet",
                    };
                    var selectedPropertySets = [];
                    var allEntities = {
                        ...requiredEntities,
                        ...selectedEntities,
                    };
                    var config = {
                        requiredEntities,
                        selectedEntities,
                        selectedPropertySets,
                        allEntities,
                    };
                    // Read IFC file
                    var file = document.getElementById("myIfcFile").files[0];
                    var reader = new FileReader();
                    reader.onload = function (e) {
                        var lines = e.target.result.split(/\r\n|\n/);
                        // Create new BIMWHALE.js object
                        var ifcFile = new BIMWHALE.IfcFile(lines, config);
                        // Parse file and get IFC entiteis
                        var ifcEntites = ifcFile.parseIfcFile();
                        // Generate table data
                        var data = [];
                        Object.values(ifcEntites).forEach((entity) => {
                            Object.keys(entity.properties).forEach(
                                (propertySet) => {
                                    Object.keys(
                                        entity.properties[propertySet]
                                    ).forEach((property) => {
                                        data = [
                                            ...data,
                                            [
                                                entity.instanceName,
                                                entity.attributes.parsed[0],
                                                entity.entityName,
                                                entity.attributes.parsed[2],
                                                propertySet,
                                                property,
                                                entity.properties[propertySet][
                                                    property
                                                ],
                                            ],
                                        ];
                                    });
                                }
                            );
                        });
                        // Genereate DataTable
                        var ifcTable = $("#ifcTable").DataTable({
                            data: data,
                            searching: false,
                            columns: [
                                {
                                    title: "Id",
                                    data: 0,
                                },
                                {
                                    title: "GUID",
                                    data: 1,
                                },
                                {
                                    title: "Entity",
                                    data: 2,
                                },
                                {
                                    title: "Name",
                                    data: 3,
                                },
                                {
                                    title: "Property Set",
                                    data: 4,
                                },
                                {
                                    title: "Property Name",
                                    data: 5,
                                },
                                {
                                    title: "Property Value",
                                    data: 6,
                                },
                            ],
                        });
                    };
                    reader.readAsText(file);
                }
            </script>
        </body>
    </html>
    

    Final Touches

    Let's make things a bit prettier. Since we use Boostrap, we will use ther layout system. First, we wrap everything inside a container.

    <div class="container">
        <h3>Advanced Example</h3>
        <!-- Input -->
        <select
            id="selectedEntitesInput"
            name="selectedEntites[]"
            multiple="multiple"
            style="width: 100%"
            required
        ></select>
        <input type="file" id="myIfcFile" onchange="myFunction()" />
        
        <!-- Table  -->
        <table class="table table-hover" id="ifcTable" width="100%"></table>
    </div>

    Then, let's add some spacing. We'll simply add py-2 to each element and a py-4 to the container.

    Our website should look like this:

    Getting Started

    Let's install our prerequisites. We will use the . DataTable has an excellent documentation if you get stuck. Anyways, go to their download page:

    We are going to use Boostrap 4 (not 5).

    We'll select both jQuery 3 & Boostrap 4.

    And we'll use CDN

    Demos

    WIP

    <div class="container py-4">
        <h3 class="py-2">Advanced Example</h3>
        <!-- Input -->
        <select
            class="py-2"
            id="selectedEntitesInput"
            name="selectedEntites[]"
            multiple="multiple"
            style="width: 100%"
            required
        ></select>
        <input
            class="py-2"
            type="file"
            id="myIfcFile"
            onchange="myFunction()"
        />
        
        <!-- Table  -->
        <table
            class="py-2 table table-hover"
            id="ifcTable"
            width="100%"
        ></table>
    </div>
    Demo 1
    Demo 2 (in Swedish)
    as our donwload method.

    Simply copy the two lines and paste into your HTML.

    Our HTML should look something like this:

    Notice that this example might use outdated links. Go to the DataTables website and get the latest links.

    DataTables CDN
    https://datatables.net/download/

    Sample files

    The IFC sample files are hosted on GitHub.

    The BIM Whale contains 6 different sample files.

    • Simple Wall

    • Many Simple Walls

    lease notice that you have to right click and select "Save as" (or a similar option).

    Example

    Notice that left clicking will open only the file in a new tab.

    Many Simple Walls

    Many Simple Walls

    The Many simple walls sample file can be downloaded from here:

    Make sure you right click, and select "Save as".

    <!DOCTYPE html>
    <html>
    <body>
        <h3>Advanced Example</h3>
        <link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/v/bs4-4.1.1/jq-3.3.1/dt-1.10.22/datatables.min.css"/>
        <script type="text/javascript" src="https://cdn.datatables.net/v/bs4-4.1.1/jq-3.3.1/dt-1.10.22/datatables.min.js"></script
    </body>
    </html>
    Tall Building
    Large Building
    Basic House
    Advanced Project

    1. BIMWHALE.js

    Goal A, Provide a simple and fast IFC parser, has been realized as BIMWHALE.js. It is a client-side IFC parser built using TypeScript.

    Not sure what TypeScript is? Check out TypeScript in 100 Seconds

    The TypeScript code has been compiled into regular JavaScript using Webpack. That's why it is called BIMWHALE.js. Check out the Getting Started pages for more information.

    Get Property Set

    Let's reuse our example in the Detailed instructions section.

    <!DOCTYPE html>
    <html>
    <body>
      <h3>Example</h3>
      <input type="file" id="myFile">
      <button onclick="myFunction()">Click me</button>
      <script src="https://cdn.jsdelivr.net/gh/andrewisen/bim-whale/dist/BIMWHALE.min.js"></script>
      <script>
        var config = {
            requiredEntities:{
                IFCPROPERTYSINGLEVALUE: "IfcPropertySingleValue",
                IFCRELDEFINESBYPROPERTIES: "IfcRelDefinesByProperties",
                IFCPROPERTYSET: "IfcPropertySet",
            },
            selectedEntities:{
                IFCDOOR: "IfcDoor",
                IFCWALLSTANDARDCASE: "IfcWallStandardCase",
            },
            selectedPropertySets: ["Custom_Pset"],
            allEntities:{
                  ...requiredEntities,
                  ...selectedEntities,
            },
        };
        function myFunction() {
            var file = document.getElementById('myFile').files[0];
            var reader = new FileReader();
            reader.onload = function(e) {
                var lines = e.target.result.split(/\r\n|\n/);
                var ifcFile = new BIMWHALE.IfcFile(lines, config);
                var ifcEntites = ifcFile.parseIfcFile();
            };
            reader.readAsText(file);
        }
      </script>
    </body>
    </html>

    Config

    Required entities

    The first thing we are going to configure is the required entities. These three should do fine.

    Notice how the object is structured. The key must be in uppercase. The value can have any form.

    Selected Entities

    There's no need to get all IfcEntities. Let's specify which entities we want.

    Our sample file has only a door and a wall. It would be unnecessary to try to get the roofs, floors, windows, etc.

    A list of common Ifc Entites can be found here:

    Selected Property Set

    Also, there's no need to get all Property Sets. Let's specify which we want. Leave the array blank to include all Property Sets.

    Notice how the object is structured.

    This is an array, not an object.

    All Entities

    The can be used to join the two arrays

    Config Object

    Our final config object is constructed as:

    Prerequisites

    Boostrap

    We will use Bootstrap as the CSS framework.

    DataTables

    Regular Bootstrap tables lacks any functionality. will add that.

    jQuery

    Both Bootstrap and DataTables require .

    Select2

    We are going to use to extend the select boxes.

    var requiredEntities = {
        IFCPROPERTYSINGLEVALUE: "IfcPropertySingleValue",
        IFCRELDEFINESBYPROPERTIES: "IfcRelDefinesByProperties",
        IFCPROPERTYSET: "IfcPropertySet",
    };
    spread operator
    DataTables
    jQuery
    select2

    Quick Start

    This is a quick start guide - i.e. this is intended for those who are exprienced in web development. Check out the detailed instructions for a more detailed explanation.

    1. Use a FileReader

    2. Create a new BIMWHALE object

    3. Call parseIfcFile()

    You are now done! If you have understood the snippet above, then head over to . Otherwise, check the for a for a more in-depth explanation.

    The Final Result

    You can check out the final result on Codepen, use the box below or see the full source below.

    Full Source: If you been following this example step by step, you should have something like this:

    Good luck with your own project :)

    Demo 2 (in Swedish)

    The second demo is available here:

    http://bimvalen.se

    The website is currently only available in Swedish. You can use Google Translate in the mean time.

    Demo 2# - www.bimvalen.se

    Demo 1

    The demo can be found here:

    https://github.bimvalen.se/public/

    Public demo

    Simple Wall

    Simple Wall

    The Simple wall sample file can be downloaded from here:

    Make sure you right click, and select "Save as".

    GitHub - andrewisen/bim-whale-demo: The public demo for The BIM WhaleGitHub
    GitHub - andrewisen/bim-whale-ifc-samples: IFC sample files for the BIM WhaleGitHub
    GitHub - andrewisen/bim-whale: A client-side IFC parserGitHub
    https://github.bimvalen.se/public/github.bimvalen.se
    Start Page of IFC2x3 Final Documentationstandards.buildingsmart.org
    GitHub - andrewisen/bim-whale-ifc-samples: IFC sample files for the BIM WhaleGitHub
    GitHub - andrewisen/bim-whale: A client-side IFC parserGitHub
    var selectedEntities = {
        IFCDOOR: "IfcDoor",
        IFCWALLSTANDARDCASE: "IfcWallStandardCase",
    };
    var selectedPropertySets = ["Custom_Pset"];
    var allEntities = {
        ...requiredEntities,
        ...selectedEntities,
    };
    var config = {
        requiredEntities,
        selectedEntities,
        selectedPropertySets,
        allEntities
    };
    <!DOCTYPE html>
    <html>
    <body>
    <div class="container py-4">
        <h3 class="py-2">Advanced Example</h3>
        <!-- Input -->
        <select
            class="py-2"
            id="selectedEntitesInput"
            name="selectedEntites[]"
            multiple="multiple"
            style="width: 100%"
            required
        ></select>
        <input
            class="py-2"
            type="file"
            id="myIfcFile"
            onchange="myFunction()"
        />
    
        <!-- Table  -->
        <table
            class="py-2 table table-hover"
            id="ifcTable"
            width="100%"
        ></table>
    </div>
    <!-- Bootstrap, jQuery, DataTables -->
    <link
        rel="stylesheet"
        type="text/css"
        href="https://cdn.datatables.net/v/bs4-4.1.1/jq-3.3.1/dt-1.10.22/datatables.min.css"
    />
    <script
        type="text/javascript"
        src="https://cdn.datatables.net/v/bs4-4.1.1/jq-3.3.1/dt-1.10.22/datatables.min.js"
    ></script>
    <!-- Select2 -->
    <link
        href="https://cdn.jsdelivr.net/npm/select2@4.0.13/dist/css/select2.min.css"
        rel="stylesheet"
    />
    <script src="https://cdn.jsdelivr.net/npm/select2@4.0.13/dist/js/select2.min.js"></script>
    <!-- BIMWHALE.js -->
    <script src="https://cdn.jsdelivr.net/gh/andrewisen/bim-whale/dist/bundle.min.js"></script>
    
    <script>
    // Select
    $(document).ready(function () {
        var data = [
            {
                text: "Shared Building Elements",
                children: [
                    {
                        id: "IfcDoor",
                        text: "IfcDoor",
                    },
                    {
                        id: "IfcWallStandardCase",
                        text: "IfcWallStandardCase",
                    },
                    {
                        id: "IfcWindow",
                        text: "IfcWindow",
                    },
                ],
            },
        ];
        $("#selectedEntitesInput").select2({
            data: data,
            placeholder: "Select which entities to include",
        });
    });
    // File Input
    function myFunction() {
        // Get selected entities
        let selectedEntities = {};
        $("#selectedEntitesInput")
            .val()
            .forEach((entity) => {
                selectedEntities = {
                    ...selectedEntities,
                    [entity.toUpperCase()]: entity,
                };
            });
        // Build config
        var requiredEntities = {
            IFCPROPERTYSINGLEVALUE: "IfcPropertySingleValue",
            IFCRELDEFINESBYPROPERTIES: "IfcRelDefinesByProperties",
            IFCPROPERTYSET: "IfcPropertySet",
        };
        var selectedPropertySets = [];
        var allEntities = {
            ...requiredEntities,
            ...selectedEntities,
        };
        var config = {
            requiredEntities,
            selectedEntities,
            selectedPropertySets,
            allEntities,
        };
        // Read IFC file
        var file = document.getElementById("myIfcFile").files[0];
        var reader = new FileReader();
        reader.onload = function (e) {
            var lines = e.target.result.split(/\r\n|\n/);
            // Create new BIMWHALE.js object
            var ifcFile = new BIMWHALE.IfcFile(lines, config);
            // Parse file and get IFC entiteis
            var ifcEntites = ifcFile.parseIfcFile();
            // Generate table data
            var data = [];
            Object.values(ifcEntites).forEach((entity) => {
                Object.keys(entity.properties).forEach(
                    (propertySet) => {
                        Object.keys(
                            entity.properties[propertySet]
                        ).forEach((property) => {
                            data = [
                                ...data,
                                [
                                    entity.instanceName,
                                    entity.attributes.parsed[0],
                                    entity.entityName,
                                    entity.attributes.parsed[2],
                                    propertySet,
                                    property,
                                    entity.properties[propertySet][
                                        property
                                    ],
                                ],
                            ];
                        });
                    }
                );
            });
            // Genereate DataTable
            var ifcTable = $("#ifcTable").DataTable({
                data: data,
                searching: false,
                columns: [
                    {
                        title: "Id",
                        data: 0,
                    },
                    {
                        title: "GUID",
                        data: 1,
                    },
                    {
                        title: "Entity",
                        data: 2,
                    },
                    {
                        title: "Name",
                        data: 3,
                    },
                    {
                        title: "Property Set",
                        data: 4,
                    },
                    {
                        title: "Property Name",
                        data: 5,
                    },
                    {
                        title: "Property Value",
                        data: 6,
                    },
                ],
            });
        };
        reader.readAsText(file);
    }
    </script>
    </body>
    </html>
    
    var file = document.getElementById('myFile').files[0];
    var reader = new FileReader();
    reader.onload = function(e) {
        var lines = e.target.result.split(/\r\n|\n/);
        var ifcFile = new BIMWHALE.IfcFile(lines, config);
        var ifcEntites = ifcFile.parseIfcFile();
    };
    reader.readAsText(file);
    Simple Example
    Detialed Instructions
    IFC4 Documentationstandards.buildingsmart.org
    ISO 10303Wikipedia
    EXPRESS (data modeling language)Wikipedia
    Logo
    Logo
    Logo
    Logo
    Logo
    Logo

    Basic House

    The Basic House sample file can be downloaded from here:

    Make sure you right click, and select "Save as".

    Basic House

    Tall Building

    The Tall building sample file can be downloaded from here:

    Make sure you right click, and select "Save as".

    Large Building

    The Large building sample file can be downloaded from here:

    Make sure you right click, and select "Save as".

    http://bimvalen.sebimvalen.se
    IFC Schema Specifications - buildingSMART TechnicalbuildingSMART Technical
    ISO 10303-21Wikipedia
    Tall Building
    Large Building
    Logo
    Logo
    https://raw.githubusercontent.com/andrewisen/bim-whale-ifc-samples/main/AdvancedProject/IFC/AdvancedProject.ifcraw.githubusercontent.com
    Logo
    https://raw.githubusercontent.com/andrewisen/bim-whale-ifc-samples/main/ManySimpleWalls/IFC/ManySimpleWalls.ifcraw.githubusercontent.com
    https://raw.githubusercontent.com/andrewisen/bim-whale-ifc-samples/main/SimpleWall/IFC/SimpleWall.ifcraw.githubusercontent.com
    https://raw.githubusercontent.com/andrewisen/bim-whale-ifc-samples/main/SimpleWall/IFC/SimpleWall.ifcraw.githubusercontent.com
    Logo
    IFCSHAREDBLDGELEMENTSstandards.buildingsmart.org
    https://codepen.io/andrewisen/pen/oNzqKyL
    DataTables | Javascript table librarydatatables.net
    jQueryjQuery
    Logo
    Getting Started | Select2 - The jQuery replacement for select boxesselect2.org
    Bootstrapgetbootstrap
    Logo
    https://raw.githubusercontent.com/andrewisen/bim-whale-ifc-samples/main/BasicHouse/IFC/BasicHouse.ifcraw.githubusercontent.com
    https://raw.githubusercontent.com/andrewisen/bim-whale-ifc-samples/main/TallBuilding/IFC/TallBuilding.ifcraw.githubusercontent.com
    https://raw.githubusercontent.com/andrewisen/bim-whale-ifc-samples/main/LargeBuilding/IFC/LargeBuilding.ifcraw.githubusercontent.com
    Logo
    Logo
    https://codepen.io/andrewisen/pen/MWjPdJr