├── webpack.ts
├── .gitignore
├── typedoc.json
├── tsconfig.json
├── src
├── step-parser
│ ├── functions
│ │ ├── set-step-attributes.ts
│ │ ├── set-step-instance-name.ts
│ │ ├── set-step-entity-name.ts
│ │ ├── get-step-attributes.ts
│ │ └── parse-step-entity-instance-attributes.ts
│ ├── interfaces
│ │ └── step-interface.ts
│ ├── methods
│ │ ├── _parse-step-file.ts
│ │ ├── save-step-entity-instance.ts
│ │ └── generate-step-entity-instance.ts
│ └── step-parser.ts
├── ifc-parser
│ ├── methods
│ │ ├── _parse-ifc-file.ts
│ │ ├── map-property-single-values-to-property-set.ts
│ │ └── map-property-sets-to-generic-entities.ts
│ └── ifc-parser.ts
├── config
│ └── example.config.ts
└── utils
│ └── ifc-definitions.ts
├── checkDeno.ts
├── webpack.config.js
├── LICENSE
├── package.json
├── .github
└── workflows
│ └── main.yml
├── example.index.ts
├── tests
├── BIMWHALE.test.ts
└── SimpleWall.ifc
├── dist
├── BIMWHALE.min.js
└── BIMWHALE.js
├── README.md
└── typedoc.md
/webpack.ts:
--------------------------------------------------------------------------------
1 | export { IfcFile } from "./src/ifc-parser/ifc-parser.ts";
2 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # BIM Whale
2 | */*/config.ts
3 | /docs
4 | index.ts
5 | *.ifc
6 | !tests/*.ifc
7 |
8 | # Generic
9 | makefile
10 | /.vscode
11 | /node_modules
12 |
13 | # MacOS generated files
14 | .DS_Store
15 | .DS_Store?
--------------------------------------------------------------------------------
/typedoc.json:
--------------------------------------------------------------------------------
1 | {
2 | "inputFiles": ["./src/"],
3 | "mode": "file",
4 | "out": "./docs",
5 | "name": "BIMWHALE.js Documentation",
6 | "ignoreCompilerErrors": true,
7 | "hideGenerator": true,
8 | "readme": "typedoc.md"
9 | }
10 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | // https://webpack.js.org/guides/typescript/
2 | {
3 | "compilerOptions": {
4 | "outDir": "./dist/",
5 | "noImplicitAny": true,
6 | "module": "ES6",
7 | "target": "es5",
8 | "allowJs": true
9 | },
10 | "include": ["src/**/*", "webpack.ts"]
11 | }
12 |
--------------------------------------------------------------------------------
/src/step-parser/functions/set-step-attributes.ts:
--------------------------------------------------------------------------------
1 | import type { IEntityInstance } from "../interfaces/step-interface.ts";
2 |
3 | // Set STEP Attributes, e.g. '1F6...',#42,'M_Single-Flush...',$,...`
4 | const setStepAttributes = (_: {
5 | line: string;
6 | entityInstance: IEntityInstance;
7 | parsedAttributes: string[];
8 | }) => {
9 | const { line, parsedAttributes } = _;
10 | let { entityInstance } = _;
11 | entityInstance.attributes = {
12 | parsed: parsedAttributes,
13 | };
14 | };
15 |
16 | export { setStepAttributes };
17 |
--------------------------------------------------------------------------------
/src/step-parser/functions/set-step-instance-name.ts:
--------------------------------------------------------------------------------
1 | import type { IEntityInstance } from "../interfaces/step-interface.ts";
2 |
3 | /**
4 | * Set STEP Instance Name, eg. #572
5 | * @param _
6 | */
7 | const setStepInstanceName = (_: {
8 | line: string;
9 | entityInstance: IEntityInstance;
10 | }) => {
11 | const {
12 | line,
13 | entityInstance: { instanceEndIndex },
14 | } = _;
15 | let { entityInstance } = _;
16 | entityInstance.instanceName = line.substring(0, instanceEndIndex);
17 | };
18 |
19 | export { setStepInstanceName };
20 |
--------------------------------------------------------------------------------
/src/step-parser/functions/set-step-entity-name.ts:
--------------------------------------------------------------------------------
1 | import type { IEntityInstance } from "../interfaces/step-interface.ts";
2 |
3 | // Set STEP Entity Name, e.g. IFCDOOR
4 | const setStepEntityName = (_: {
5 | line: string;
6 | entityInstance: IEntityInstance;
7 | }) => {
8 | const {
9 | line,
10 | entityInstance: { instanceEndIndex },
11 | entityInstance: { entityStartIndex },
12 | } = _;
13 | let { entityInstance } = _;
14 | entityInstance.entityName = line.substring(
15 | instanceEndIndex + 2,
16 | entityStartIndex
17 | );
18 | };
19 |
20 | export { setStepEntityName };
21 |
--------------------------------------------------------------------------------
/src/step-parser/interfaces/step-interface.ts:
--------------------------------------------------------------------------------
1 | interface IEntityInstance {
2 | // Instance, eg. #572
3 | instanceName: string;
4 | instanceStartIndex: number;
5 | instanceEndIndex: number;
6 | // Entity, e.g. IFCDOOR
7 | entityName: string;
8 | entityStartIndex: number;
9 | entityEndIndex: number;
10 |
11 | attributes?: {
12 | raw?: string;
13 | parsed?: string[];
14 | };
15 | }
16 |
17 | // interface IEnties {
18 | // [key: string]: IEntityInstance;
19 | // }
20 | interface IEnties {
21 | [key: string]: { [key: string]: IEntityInstance };
22 | }
23 |
24 | export type { IEntityInstance, IEnties };
25 |
--------------------------------------------------------------------------------
/src/step-parser/functions/get-step-attributes.ts:
--------------------------------------------------------------------------------
1 | import type { IEntityInstance } from "../interfaces/step-interface.ts";
2 | import { parseStepEntityInstanceAttributes } from "./parse-step-entity-instance-attributes.ts";
3 |
4 | // Get STEP Attributes, e.g. '1F6...',#42,'M_Single-Flush...',$,...`
5 | const getStepAttributes = (_: {
6 | line: string;
7 | entityInstance: IEntityInstance;
8 | }) => {
9 | const { line } = _;
10 | let { entityInstance } = _;
11 | return parseStepEntityInstanceAttributes(
12 | line.substring(entityInstance.entityStartIndex + 1, line.length - 2),
13 | entityInstance.entityName
14 | );
15 | };
16 |
17 | export { getStepAttributes };
18 |
--------------------------------------------------------------------------------
/checkDeno.ts:
--------------------------------------------------------------------------------
1 | import { config } from "./src/config/config.ts";
2 |
3 | /*
4 | * ## Read File
5 | * The Deno way to read files, [read More](https://deno.land/std/fs).
6 | */
7 | async function readFile(path: string): Promise {
8 | return await Deno.readTextFile(path);
9 | }
10 |
11 | /*
12 | * ## Main
13 | * Main will {@link readFile | read the file } asynchronously and split each line into a an array.
14 | * The array will then be parsed into an IFC Object.
15 | */
16 | async function main(path: string) {
17 | readFile(path).then((response) => {
18 | const lines: string[] = response.split(/\r\n|\n/);
19 | console.log(lines);
20 | });
21 | }
22 |
23 | const { filePath } = config;
24 | main(filePath);
25 |
--------------------------------------------------------------------------------
/src/ifc-parser/methods/_parse-ifc-file.ts:
--------------------------------------------------------------------------------
1 | import { IfcFile } from "../ifc-parser.ts";
2 |
3 | /**
4 | * Iterates over each line.
5 | * Only include the so-called __DATA section__.
6 | * One can assume that each line will contain an equal sign (=).
7 | *
8 | * __Example:__
9 | * ```#572= IFCDOOR('...');```
10 | *
11 | */
12 | function _parseIfcFile(this: IfcFile) {
13 | this.parseStepFile(); // Inherited from the class StepFile
14 | this.mapPropertySingleValuesToPropertySet();
15 | this.mapPropertySetsToGenericEntities();
16 | return this.entityInstances.genericEntityInstances;
17 | }
18 |
19 | // Underscore is used to distinguish this function as a method that belongs to IfcFile
20 | export { _parseIfcFile };
21 |
--------------------------------------------------------------------------------
/webpack.config.js:
--------------------------------------------------------------------------------
1 | const path = require("path");
2 |
3 | module.exports = {
4 | entry: "./webpack.ts",
5 | module: {
6 | rules: [
7 | {
8 | test: /\.tsx?$/,
9 | use: "ts-loader",
10 | exclude: [/node_modules/],
11 | },
12 | ],
13 | },
14 | resolve: {
15 | extensions: [".tsx", ".ts", ".js"],
16 | },
17 | output: {
18 | filename:
19 | process.env.DENO_ENV === "production"
20 | ? "BIMWHALE.min.js"
21 | : "BIMWHALE.js",
22 | path: path.resolve(__dirname, "dist"),
23 | library: "BIMWHALE",
24 | },
25 | optimization: {
26 | minimize: process.env.DENO_ENV === "production" ? true : false,
27 | },
28 | mode: "production",
29 | };
30 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2020 André "MG" Wisén
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/src/step-parser/methods/_parse-step-file.ts:
--------------------------------------------------------------------------------
1 | import { StepFile } from "../step-parser.ts";
2 | /**
3 | * The method method will:
4 | * 1. Iterate over each line in the IFC file
5 | * 2. Generate a so-called `step instance` from each line
6 | *
7 | * First and foremost, there's no need to include the so-called __HEADER section__.
8 | * We only want to include data (that's available in the __DATA section__.)
9 | * One can simply assume that each line will contain an equal sign (=).
10 | *
11 | * __Example:__
12 | * ```#572= IFCDOOR('...');```
13 | */
14 | function _parseStepFile(this: StepFile) {
15 | const linesLength = this.lines.length;
16 | for (let index = 0; index < linesLength; index++) {
17 | const line = this.lines[index];
18 | // Only include data (from the DATA section)
19 | if (line.indexOf("=") === -1) continue;
20 | const entityInstance = this.generateStepEntityInstance(line);
21 | if (entityInstance !== undefined)
22 | this.saveStepEntityInstance(entityInstance);
23 | }
24 | }
25 |
26 | // Underscore is used to distinguish this function as a method that belongs to StepFile
27 | export { _parseStepFile };
28 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "BIMWHALE.js",
3 | "version": "0.0.6",
4 | "description": "A simple & fast client-side IFC parser",
5 | "main": "webpack.ts",
6 | "directories": {
7 | "doc": "docs"
8 | },
9 | "dependencies": {
10 | "ts-loader": "^8.0.14",
11 | "typedoc": "^0.19.2",
12 | "typescript": "^4.1.3",
13 | "webpack": "^5.13.0",
14 | "webpack-cli": "^4.3.1"
15 | },
16 | "scripts": {
17 | "build": "webpack",
18 | "docs": "typedoc",
19 | "test": "echo \"Error: no test specified\" && exit 1"
20 | },
21 | "repository": {
22 | "type": "git",
23 | "url": "git+https://github.com/andrewisen/bim-whale.git"
24 | },
25 | "keywords": [
26 | "ifc",
27 | "ifc2x3",
28 | "bim",
29 | "cad",
30 | "parser",
31 | "parse",
32 | "revit",
33 | "autocad",
34 | "whale"
35 | ],
36 | "author": "André Wisén",
37 | "license": "MIT",
38 | "bugs": {
39 | "url": "https://github.com/andrewisen/bim-whale/issues"
40 | },
41 | "homepage": "https://github.com/andrewisen/bim-whale#readme"
42 | }
43 |
--------------------------------------------------------------------------------
/.github/workflows/main.yml:
--------------------------------------------------------------------------------
1 | on: push
2 | name: BIMWHALE.js GitHub Action
3 | jobs:
4 | web-deploy:
5 | name: 🐳 Test, Build & Deploy BIMWHALE.js
6 | runs-on: ubuntu-latest
7 | steps:
8 | - name: 📬 Checkout BIMWHALE.js
9 | uses: actions/checkout@v2.3.2
10 | - name: 🔍 Test BIMWHALE.js
11 | run: |
12 | sudo curl -fsSL https://deno.land/x/install/install.sh | sh
13 | export DENO_INSTALL="/home/runner/.deno"
14 | export PATH="$DENO_INSTALL/bin:$PATH"
15 | deno test tests/ --allow-read
16 | - name: 🔨 Build BIMWHALE.js
17 | run: |
18 | sudo npm install
19 | sudo npx webpack && DENO_ENV=production npx webpack
20 | sudo npx typedoc
21 | sudo touch docs/.ftp-deploy-sync-state.json
22 | sudo chmod 777 docs/.ftp-deploy-sync-state.json
23 | - name: 🚀 Deploy BIMWHALE.js docs
24 | uses: SamKirkland/FTP-Deploy-Action@4.0.0
25 | with:
26 | server: ftpcluster.loopia.se
27 | username: bim-whale-github-actions-ftp
28 | password: ${{ secrets.password }}
29 | local-dir: docs/
30 | server-dir: public_html/docs/
31 |
--------------------------------------------------------------------------------
/example.index.ts:
--------------------------------------------------------------------------------
1 | import { config } from "./src/config/config.ts";
2 | import { IfcFile } from "./src/ifc-parser/ifc-parser.ts";
3 |
4 | /*
5 | * ## DEV
6 | * Print each entity that has the corresponding property set
7 | */
8 | function printPropertySet(entites: any, propertySet: string) {
9 | for (var entitiy in entites) {
10 | for (var pset in entites[entitiy].properties) {
11 | if (pset === propertySet) {
12 | console.log(entites[entitiy].properties[pset]);
13 | }
14 | }
15 | }
16 | }
17 |
18 | /*
19 | * ## Read File
20 | * The Deno way to read files, [read More](https://deno.land/std/fs).
21 | */
22 | async function readFile(path: string): Promise {
23 | return await Deno.readTextFile(path);
24 | }
25 |
26 | /*
27 | * ## Main
28 | * Main will {@link readFile | read the file } asynchronously and split each line into a an array.
29 | * The array will then be parsed into an IFC Object.
30 | */
31 | async function main(path: string) {
32 | readFile(path).then((response) => {
33 | const lines: string[] = response.split(/\r\n|\n/);
34 | let ifcFile = new IfcFile(lines, config);
35 | const ifcEntities = ifcFile.parseIfcFile();
36 | printPropertySet(ifcEntities, "Custom_Pset");
37 | });
38 | }
39 |
40 | const { filePath } = config;
41 | delete config.filePath;
42 | main(filePath);
43 |
--------------------------------------------------------------------------------
/src/ifc-parser/ifc-parser.ts:
--------------------------------------------------------------------------------
1 | import { StepFile } from "../step-parser/step-parser.ts";
2 | import { _parseIfcFile } from "./methods/_parse-ifc-file.ts";
3 | import { _mapPropertySingleValuesToPropertySet } from "./methods/map-property-single-values-to-property-set.ts";
4 | import { _mapPropertySetsToGenericEntities } from "./methods/map-property-sets-to-generic-entities.ts";
5 | /**
6 | * ## IFC FILE
7 | *
8 | * The class {@link StepFile} only handles [ISO 10303-21](https://en.wikipedia.org/wiki/ISO_10303-21).
9 | * ISO 10303-21 is only responsible for the encoding mechanism that represents data.
10 | *
11 | * __IFC2x3 TC1__ is the actual schema of interest.
12 | * The full specification can be found [here](https://standards.buildingsmart.org/IFC/RELEASE/IFC2x3/TC1/HTML/).
13 | *
14 | * In summary, this class will only handle parsing related to IFC.
15 | */
16 | class IfcFile extends StepFile {
17 | /**
18 | * See {@link _mapPropertySingleValuesToPropertySet}
19 | */
20 | public mapPropertySingleValuesToPropertySet: any = _mapPropertySingleValuesToPropertySet;
21 | /**
22 | * See {@link _mapPropertySetsToGenericEntities}
23 | */
24 | public mapPropertySetsToGenericEntities: any = _mapPropertySetsToGenericEntities;
25 | /**
26 | * See {@link _parseStepFile}
27 | */
28 | public parseIfcFile: any = _parseIfcFile; // START HERE
29 | }
30 |
31 | export { IfcFile };
32 |
--------------------------------------------------------------------------------
/src/config/example.config.ts:
--------------------------------------------------------------------------------
1 | // Config file for Deno
2 |
3 | /**
4 | * ## Required IFC Entities
5 | * These entities are required to parse {@link PROPERTYSET | Property Sets}.
6 | */
7 | const requiredEntities: { [key: string]: string } = {
8 | IFCPROPERTYSINGLEVALUE: "IfcPropertySingleValue",
9 | IFCRELDEFINESBYPROPERTIES: "IfcRelDefinesByProperties",
10 | IFCPROPERTYSET: "IfcPropertySet",
11 | };
12 | /**
13 | * ## Selected IFC Entities
14 | * These are the selected entities that will be parsed.
15 | */
16 | const selectedEntities: { [key: string]: string } = {
17 | IFCDOOR: "IfcDoor",
18 | IFCWALLSTANDARDCASE: "IfcWallStandardCase",
19 | };
20 |
21 | /**
22 | * ## Selected IFC Property Sets
23 | * These are the selected Property Sets that will be parsed.
24 | */
25 | const selectedPropertySets: string[] = ["Custom_Pset"];
26 |
27 | /**
28 | * ## All IFC Entities
29 | * These are all IFC Entities that will be parsed.
30 | * All other entities will be ignored.
31 | *
32 | */
33 | const allEntities: { [key: string]: string } = {
34 | ...requiredEntities,
35 | ...selectedEntities,
36 | };
37 |
38 | /**
39 | * ## File Path
40 | * Generic file path for Deno, relative to `index.ts`
41 | *
42 | * N.B. Use a [FileReader](https://developer.mozilla.org/en-US/docs/Web/API/FileReader) when implementing onto a website
43 | *
44 | */
45 | const filePath: string = "./SimpleWall.ifc";
46 |
47 | /**
48 | * ## Options
49 | * Export configurations as generic options object.
50 | * This need to be better implemented
51 | */
52 | const config: any = {
53 | requiredEntities,
54 | selectedEntities,
55 | selectedPropertySets,
56 | allEntities,
57 | filePath,
58 | };
59 |
60 | export { config };
61 |
--------------------------------------------------------------------------------
/src/utils/ifc-definitions.ts:
--------------------------------------------------------------------------------
1 | // IFC Definitions for TypeDoc
2 |
3 | class IfcDefinitions {
4 | /**
5 | * __IFC2x3 Definition__:
6 | * The _IfcPropertySet_ defines all dynamically extensible {@link IfcPropertySingleValue | properties}.
7 | * The property set is a container class that holds {@link IfcPropertySingleValue | properties} within a property tree.
8 | * These properties are interpreted according to their name attribute.
9 | */
10 | IfcPropertySet: any = undefined;
11 |
12 | /**
13 | * __IFC2x3 Definition__:
14 | * A property with a single value (_IfcPropertySingleValue_) defines a property object which has a single (numeric or descriptive) value assigned.
15 | * It defines a property - single value combination for which the property name, the value with measure type (and optionally the unit) is given.
16 | */
17 | IfcPropertySingleValue: any = undefined;
18 |
19 | /**
20 | * __IFC2x3 Definition__:
21 | * This objectified relationship (_IfcRelDefinesByProperties_) defines the relationships between {@link IfcPropertySet | property set definitions} and {@link IfcBuildingElement | objects}.
22 | * Properties are aggregated in {@link IfcPropertySet | property sets}, property sets can be grouped to define an object type.
23 | *
24 | * The _IfcRelDefinesByProperties_ is a 1-to-N relationship, as it allows for the assignment of one {@link IfcPropertySet | property sets} to a single or to many objects.
25 | * Those objects then share the same property definition.
26 | */
27 | IfcRelDefinesByProperties: any = undefined;
28 |
29 | /**
30 | * __IFC2x3 Definition__:
31 | * Major functional part of a building, examples are foundation, floor, roof, wall.
32 | * The building element comprises all elements that are primarily part of the construction of a building, i.e., its structural and space separating system.
33 | */
34 | IfcBuildingElement: any = undefined;
35 | }
36 |
37 | export { IfcDefinitions };
38 |
--------------------------------------------------------------------------------
/src/step-parser/methods/save-step-entity-instance.ts:
--------------------------------------------------------------------------------
1 | import { StepFile } from "../step-parser.ts";
2 | import type { IEntityInstance } from "../interfaces/step-interface.ts";
3 |
4 | /**
5 | * TODO:
6 | *
7 | * @param this {@link StepFile}
8 | * @param entityInstance
9 | */
10 | function _saveStepEntityInstance(
11 | this: StepFile,
12 | entityInstance: IEntityInstance
13 | ) {
14 | if (entityInstance.entityName in this.requiredEntities) {
15 | // We need to distinguish the REQUIRED ENTITIES from each other.
16 | // In other words;
17 | // - all IfcPropertySingleValue entities are stored in IFCPROPERTYSINGLEVALUE
18 | // - all IfcRelDefinesByProperties entities are stored in IFCRELDEFINESBYPROPERTIES
19 | // - all IfcPropertySet entities are stored in IFCPROPERTYSET
20 | Object.assign(
21 | this.entityInstances[
22 | this.requiredEntities[entityInstance.entityName]
23 | ],
24 | {
25 | [entityInstance.instanceName]: {
26 | entityName: entityInstance.entityName,
27 | attributes: entityInstance.attributes,
28 | },
29 | }
30 | );
31 | } else {
32 | Object.assign(this.entityInstances.genericEntityInstances, {
33 | // We DO NOT need to distinguish the these entities from each other.
34 | // They are simply referred to as: Generic Entity Instances
35 | //
36 | // These generic entity instances are found on the interoperability layer within the IFC schema.
37 | // Mainly IfcSharedBldgElements, e.g. doors, windows, walls, floors, etc.
38 | [entityInstance.instanceName]: {
39 | entityName: this.selectedEntities[entityInstance.entityName],
40 | instanceName: entityInstance.instanceName,
41 | attributes: entityInstance.attributes,
42 | properties: {},
43 | },
44 | });
45 | }
46 | }
47 | // Underscore is used to distinguish this function as a method that belongs to StepFile
48 | export { _saveStepEntityInstance };
49 |
--------------------------------------------------------------------------------
/src/step-parser/methods/generate-step-entity-instance.ts:
--------------------------------------------------------------------------------
1 | // Interface
2 | import type { IEntityInstance } from "../interfaces/step-interface.ts";
3 | // Class
4 | import { StepFile } from "../step-parser.ts";
5 | // Functions
6 | import { setStepInstanceName } from "../functions/set-step-instance-name.ts";
7 | import { setStepEntityName } from "../functions/set-step-entity-name.ts";
8 | import { getStepAttributes } from "../functions/get-step-attributes.ts";
9 | import { setStepAttributes } from "../functions/set-step-attributes.ts";
10 |
11 | /**
12 | * Generate a __STEP Entity Instance object__, herby denoted as a `Entity Instance`.
13 | *
14 | * __Example:__
15 | * ```#572= IFCDOOR('1F6umJ5H50aeL3A1As_wUF',#42,'M_Single-Flush:Outside door:346843',$,'M_Single-Flush:Outside door',#938,#566,'346843',2134.,915.);```
16 | *
17 | * Each `Entity Instance` will have a:
18 | * - Instance Name, `#572`
19 | * - Entity Name, `IFCDOOR`
20 | * - Attribute(s) `'1F6...',#42,'M_Single-Flush...',$,...`
21 | *
22 | * Yes, the terminology can be a bit confusing...
23 | *
24 | * Anyways, getting the _Instance Name_ and _Entity Name_ is fairly straight forward.
25 | * However, getting the attributes can be a bit tricky.
26 | * The function {@link parseStepEntityInstanceAttributes} will help us with that.
27 | */
28 | function _generateStepEntityInstance(this: StepFile, line: string) {
29 | // Initialize STEP Entity Instance object
30 | var entityInstance: IEntityInstance = {
31 | // Instance
32 | instanceStartIndex: 0,
33 | instanceEndIndex: line.indexOf("="),
34 | instanceName: "",
35 | // Entity
36 | entityStartIndex: line.indexOf("("),
37 | entityEndIndex: -1,
38 | entityName: "",
39 | };
40 | // Instance Name, eg. #572
41 | setStepInstanceName({
42 | line: line,
43 | entityInstance: entityInstance,
44 | });
45 | // Entity Name, e.g. IFCDOOR
46 | setStepEntityName({
47 | line: line,
48 | entityInstance: entityInstance,
49 | });
50 | // Check if Entity Name, e.g. IFCDOOR, should be parsed
51 | if (entityInstance.entityName in this.allEntities === false) return;
52 | // Getting the attributes can be a bit tricky. getStepAttributes() will help us
53 | const parsedAttributes: string[] = getStepAttributes({
54 | line: line,
55 | entityInstance: entityInstance,
56 | });
57 | // Save parsed attributes, e.g. [['1F6...'],[#42],['M_Single-Flush...'],['$'],[...]]
58 | setStepAttributes({
59 | line: line,
60 | entityInstance: entityInstance,
61 | parsedAttributes: parsedAttributes,
62 | });
63 | return entityInstance;
64 | }
65 |
66 | // Underscore is used to distinguish this function as a method that belongs to StepFile
67 | export { _generateStepEntityInstance };
68 |
--------------------------------------------------------------------------------
/src/ifc-parser/methods/map-property-single-values-to-property-set.ts:
--------------------------------------------------------------------------------
1 | import { IfcFile } from "../ifc-parser.ts";
2 |
3 | /**
4 | * Map {@link IfcPropertySingleValue | Property Single Values} to {@link IfcPropertySet | Property Set}
5 | *
6 | * Example: `#370= IFCPROPERTYSET('2WRKEbxzHDcwyFLp2OWZN6',#42,'Custom_Pset',$,(#365,#366,#367,#368,#369));`
7 | *
8 | * The property set *Custom_Pset* has the properties:
9 | * - #365
10 | * - #366
11 | * - #367
12 | * - #368
13 | * - #369
14 | *
15 | * Note that the entity {@link IfcPropertySet | Property Set} only holds __references__ to the {@link IfcPropertySingleValue | properties}.
16 | * We need to include these explicit. In other words, we need to populate the references with their values.
17 | *
18 | * - #365: TypeMark = "..."
19 | * - #366: Keynote = "..."
20 | * - #367: TypeDescription = "..."
21 | * - #368: Width = "..."
22 | * - #369: Hyperlink = "..."
23 | *
24 | */
25 | function _mapPropertySingleValuesToPropertySet(this: IfcFile) {
26 | Object.values(this.entityInstances.IfcPropertySet).forEach(
27 | (ifcPropertySet: any) => {
28 | // ENTITY IfcPropertySet; HasProperties : SET [1:?] OF IfcProperty;
29 | const hasProperties: string[] = getHasPropertiesReferences(
30 | ifcPropertySet
31 | );
32 | const ifcProperties: { [key: string]: string } = getIfcProperties(
33 | this,
34 | hasProperties
35 | );
36 | mapProperties(ifcPropertySet, ifcProperties);
37 | }
38 | );
39 | }
40 | /**
41 | * TODO
42 | * @param ifcPropertySet
43 | */
44 | const getHasPropertiesReferences = (ifcPropertySet: any) => {
45 | const {
46 | attributes: { parsed: ifcPropertySetAttributes },
47 | } = ifcPropertySet;
48 | return ifcPropertySetAttributes[4];
49 | };
50 |
51 | /**
52 | * TODO
53 | * @param _this
54 | * @param hasProperties
55 | */
56 | const getIfcProperties = (_this: IfcFile, hasProperties: string[]) => {
57 | let properties: { [key: string]: string } = {};
58 | hasProperties.forEach((reference) => {
59 | const {
60 | attributes: { parsed: ifcPropertySingleValueAttributes } = {
61 | parsed: undefined,
62 | },
63 | } = _this.entityInstances.IfcPropertySingleValue[reference] || {};
64 | if (ifcPropertySingleValueAttributes !== "undefined") {
65 | properties[ifcPropertySingleValueAttributes[0]] =
66 | ifcPropertySingleValueAttributes[2];
67 | }
68 | });
69 | return properties;
70 | };
71 |
72 | /**
73 | * TODO
74 | * @param ifcPropertySet
75 | */
76 | const getIfcPropertySetName = (ifcPropertySet: any) => {
77 | const {
78 | attributes: { parsed: ifcPropertySetAttributes },
79 | } = ifcPropertySet;
80 |
81 | return ifcPropertySetAttributes[2];
82 | };
83 |
84 | /**
85 | * TODO
86 | * @param ifcPropertySet
87 | * @param ifcProperties
88 | */
89 | const mapProperties = (
90 | ifcPropertySet: any,
91 | ifcProperties: { [key: string]: string }
92 | ) => {
93 | const name: string = getIfcPropertySetName(ifcPropertySet);
94 | Object.assign(ifcPropertySet, {
95 | ifcPropertySetName: name,
96 | ifcPropertySet: ifcProperties,
97 | });
98 | };
99 |
100 | // Underscore is used to distinguish this function as a method that belongs to IfcFile
101 | export { _mapPropertySingleValuesToPropertySet };
102 |
--------------------------------------------------------------------------------
/tests/BIMWHALE.test.ts:
--------------------------------------------------------------------------------
1 | import * as log from "https://deno.land/std/log/mod.ts";
2 |
3 | import { assertEquals } from "https://deno.land/std@0.82.0/testing/asserts.ts";
4 | import { IfcFile } from "../src/ifc-parser/ifc-parser.ts";
5 |
6 | const requiredEntities: { [key: string]: string } = {
7 | IFCPROPERTYSINGLEVALUE: "IfcPropertySingleValue",
8 | IFCRELDEFINESBYPROPERTIES: "IfcRelDefinesByProperties",
9 | IFCPROPERTYSET: "IfcPropertySet",
10 | };
11 | const selectedEntities: { [key: string]: string } = {
12 | IFCDOOR: "IfcDoor",
13 | IFCWALLSTANDARDCASE: "IfcWallStandardCase",
14 | };
15 | const selectedPropertySets: string[] = ["Custom_Pset"];
16 | const allEntities: { [key: string]: string } = {
17 | ...requiredEntities,
18 | ...selectedEntities,
19 | };
20 | const filePath: string = "tests/SimpleWall.ifc";
21 | const config: any = {
22 | requiredEntities,
23 | selectedEntities,
24 | selectedPropertySets,
25 | allEntities,
26 | filePath,
27 | };
28 |
29 | async function readFile(path: string): Promise {
30 | return await Deno.readTextFile(path);
31 | }
32 |
33 | Deno.test("SimpleWall.ifc", async () => {
34 | await readFile(filePath).then((response) => {
35 | const lines: string[] = response.split(/\r\n|\n/);
36 | let ifcFile = new IfcFile(lines, config);
37 | const ifcEntities = ifcFile.parseIfcFile();
38 | assertEquals(ifcEntities, {
39 | "#219": {
40 | entityName: "IfcWallStandardCase",
41 | instanceName: "#219",
42 | attributes: {
43 | parsed: [
44 | "1F6umJ5H50aeL3A1As_wTm",
45 | "#42",
46 | "Basic Wall:Bearing Wall:346660",
47 | "$",
48 | "Basic Wall:Bearing Wall",
49 | "#188",
50 | "#215",
51 | "346660",
52 | ],
53 | },
54 | properties: {
55 | Custom_Pset: {
56 | TypeMark: "_TYPE-MARK_",
57 | Keynote: "_KEYNOTE_",
58 | StoreyName: "Level: Level 1",
59 | TypeDescription: "_DESCRIPTION_",
60 | StatusConstruction: "New Construction",
61 | NetArea: "14.04739",
62 | Height: "4000.",
63 | Width: "200.",
64 | Length: "4000.",
65 | Hyperlink: "_URL_",
66 | },
67 | },
68 | },
69 | "#572": {
70 | entityName: "IfcDoor",
71 | instanceName: "#572",
72 | attributes: {
73 | parsed: [
74 | "1F6umJ5H50aeL3A1As_wUF",
75 | "#42",
76 | "M_Single-Flush:Outside door:346843",
77 | "$",
78 | "M_Single-Flush:Outside door",
79 | "#938",
80 | "#566",
81 | "346843",
82 | "2134.",
83 | "915.",
84 | ],
85 | },
86 | properties: {
87 | Custom_Pset: {
88 | TypeMark: "20",
89 | Keynote: "--KEYNOTE--",
90 | StoreyName: "Level: Level 1",
91 | TypeDescription: "--DESCRIPTION--",
92 | StatusConstruction: "New Construction",
93 | NetArea: "3.18957899999998",
94 | Height: "2134.",
95 | Width: "915.",
96 | SillHeight: "0.",
97 | Hyperlink: "--URL--",
98 | },
99 | },
100 | },
101 | });
102 | });
103 | });
104 |
--------------------------------------------------------------------------------
/src/ifc-parser/methods/map-property-sets-to-generic-entities.ts:
--------------------------------------------------------------------------------
1 | import { IfcFile } from "../ifc-parser.ts";
2 |
3 | /**
4 | * Map {@link IfcPropertySet | Property Set} to {@link IfcBuildingElement | a generic enitiy} using an {@link IfcRelDefinesByProperties | objectified relationship}.
5 | * The method {@link _mapPropertySingleValuesToPropertySet } has already created all `Property Set` objects.
6 | * Now, we need to populate each {@link IfcBuildingElement | generic enitiy} with `Property Sets`.
7 | */
8 | function _mapPropertySetsToGenericEntities(this: IfcFile) {
9 | const filterPropertySets =
10 | this.selectedPropertySets.length > 0 ? true : false;
11 | const selectedPropertySets: string[] = this.selectedPropertySets;
12 | Object.values(this.entityInstances.IfcRelDefinesByProperties).forEach(
13 | (ifcRelDefinesByProperties: any) => {
14 | // ENTITY IfcRelDefines; RelatedObjects : SET [1:?] OF IfcObject;
15 | const relatedObjects = getRelatedObjectsReferences(
16 | ifcRelDefinesByProperties
17 | );
18 | const ifcObject = getIfcObjects(this, relatedObjects);
19 | // Skip object if undefined or not in selectedPropertySets
20 | if (skipObject(ifcObject, filterPropertySets, selectedPropertySets))
21 | return;
22 | // ENTITY IfcRelDefinesByProperties; RelatingPropertyDefinition : IfcPropertySetDefinition;
23 | const relatingPropertyDefinition = getRelatingPropertyDefinition(
24 | ifcRelDefinesByProperties
25 | );
26 | const ifcPropertySetDefinition = getIfcPropertySetDefinition(
27 | this,
28 | relatingPropertyDefinition
29 | );
30 | // Ignoring things like: IfcSite, IfcBuildingStorey, IfcBuilding, etc.
31 | if (ifcPropertySetDefinition === undefined) return;
32 | mapPropertySet(ifcObject, ifcPropertySetDefinition);
33 | }
34 | );
35 | }
36 |
37 | /**
38 | * TODO
39 | * @param ifcRelDefinesByProperties
40 | */
41 | const getRelatedObjectsReferences = (ifcRelDefinesByProperties: any) => {
42 | const {
43 | attributes: { parsed: ifcRelDefinesByPropertiesAttributes },
44 | } = ifcRelDefinesByProperties;
45 | return ifcRelDefinesByPropertiesAttributes[5];
46 | };
47 |
48 | /**
49 | * TODO
50 | * @param _this
51 | * @param relatedObjects
52 | */
53 | const getIfcObjects = (_this: IfcFile, relatedObjects: any) => {
54 | const { ifcPropertySetName: name = undefined, ifcPropertySet = undefined } =
55 | _this.entityInstances.IfcPropertySet[relatedObjects] || {};
56 | if (name === undefined) return;
57 | return { name, ifcPropertySet };
58 | };
59 |
60 | /**
61 | * TODO
62 | * @param ifcObject
63 | * @param filterPropertySets
64 | * @param selectedPropertySets
65 | */
66 | const skipObject = (
67 | ifcObject: any,
68 | filterPropertySets: any,
69 | selectedPropertySets: any
70 | ) => {
71 | if (ifcObject === undefined) return true;
72 | if (filterPropertySets) {
73 | if (selectedPropertySets.includes(ifcObject.name) === false)
74 | return true;
75 | }
76 | return false;
77 | };
78 |
79 | /**
80 | * TODO
81 | * @param ifcRelDefinesByProperties
82 | */
83 | const getRelatingPropertyDefinition = (ifcRelDefinesByProperties: any) => {
84 | const {
85 | attributes: { parsed: ifcRelDefinesByPropertiesAttributes },
86 | } = ifcRelDefinesByProperties;
87 | return ifcRelDefinesByPropertiesAttributes[4];
88 | };
89 |
90 | /**
91 | * TODO
92 | * @param _this
93 | * @param ifcRelDefinesByProperties
94 | */
95 | const getIfcPropertySetDefinition = (
96 | _this: IfcFile,
97 | ifcRelDefinesByProperties: any
98 | ) => {
99 | const { properties: ifcPropertySetDefinition = undefined } =
100 | // Reference to related object (i.e. a generic IFC entity)
101 | _this.entityInstances.genericEntityInstances[
102 | ifcRelDefinesByProperties[0]
103 | ] || {};
104 | return ifcPropertySetDefinition;
105 | };
106 |
107 | /**
108 | * TODO
109 | * @param ifcObject
110 | * @param ifcPropertySetDefinition
111 | */
112 | const mapPropertySet = (ifcObject: any, ifcPropertySetDefinition: any) => {
113 | Object.assign(ifcPropertySetDefinition, {
114 | [ifcObject.name]: ifcObject.ifcPropertySet,
115 | });
116 | };
117 | // Underscore is used to distinguish this function as a method that belongs to IfcFile
118 | export { _mapPropertySetsToGenericEntities };
119 |
--------------------------------------------------------------------------------
/src/step-parser/step-parser.ts:
--------------------------------------------------------------------------------
1 | import type { IEntityInstance, IEnties } from "./interfaces/step-interface.ts";
2 | import { _parseStepFile } from "./methods/_parse-step-file.ts";
3 | import { _generateStepEntityInstance } from "./methods/generate-step-entity-instance.ts";
4 | import { _saveStepEntityInstance } from "./methods/save-step-entity-instance.ts";
5 |
6 | /**
7 | * ## STEP FILE
8 | *
9 | * This class deals with [Standard for the Exchange of Product model data (STEP)](https://en.wikipedia.org/wiki/ISO_10303).
10 | * More specific, this class parses a [STEP-file](https://en.wikipedia.org/wiki/ISO_10303-21).
11 | *
12 | * To clarify:
13 | * - [STEP](https://en.wikipedia.org/wiki/ISO_10303) refers to the ISO 10303 standard.
14 | * - [STEP-file](https://en.wikipedia.org/wiki/ISO_10303-21) is the actual file format (used in ISO 10303)
15 | *
16 | * This class will handle the so-called "encoding mechanism that represents data".
17 | *
18 | * In layman's terms:
19 | * An `IFC File` is actually a [STEP-file](https://en.wikipedia.org/wiki/ISO_10303-21) behind the scenes.
20 | *
21 | * This class will open the `IFC File` and treat is as a `STEP-file`(!).
22 | * The method {@link _generateStepEntityInstance | generateStepEntityInstance } will create a so-called `step instance` from each line in the file.
23 | *
24 | * The parent/super class {@link IfcFile } will take the generated `step instances` and build the relationships between objects.
25 | * This relationship has nothing to do with STEP.
26 | * No, the relationship is expressed in the [IFC2x3 TC1 schema](https://standards.buildingsmart.org/IFC/RELEASE/IFC2x3/TC1/HTML/).
27 | *
28 | * That's why we have two different classes; StepFile & IfcFile
29 | *
30 | * To summarize:
31 | * - `StepFile` builds the data (according to ISO 10303-21)
32 | * - `IfcFile` builds the relationship (according to the IFC2x3 TC1 schema)
33 | */
34 | class StepFile {
35 | /**
36 | * Each line is stored in the {@link lines} array.
37 | */
38 | protected lines: string[];
39 | /**
40 | * Each parsed entity.
41 | */
42 | public entityInstances: any; //: IEnties;
43 | /**
44 | * These entities are required to parse {@link IfcPropertySet | Property Sets}.
45 | */
46 | protected requiredEntities: { [key: string]: string };
47 | /**
48 | * These are the selected entities that will be parsed.
49 | */
50 | protected selectedEntities: { [key: string]: string };
51 | /**
52 | * These are the selected Property Sets that will be parsed.
53 | */
54 | protected selectedPropertySets: string[];
55 | /**
56 | * These are all IFC Entities that will be parsed.
57 | * All other entities will be ignored.
58 | */
59 | protected allEntities: { [key: string]: string };
60 | /**
61 | * Builds the {@link entities} object from the config parameter.
62 | *
63 | * Creates empty objects for each required entity.
64 | * The rest (i.e. {@link selectedEntities}) are treated as a `generic entity`.
65 | *
66 | * Example:
67 | * ```javascript
68 | * this.entityInstances = {
69 | * IFCPROPERTYSINGLEVALUE = {},
70 | * IFCRELDEFINESBYPROPERTIES = {},
71 | * IFCPROPERTYSET = {},
72 | * ...
73 | * genericEntities = {}
74 | * }
75 | * ```
76 | */
77 | constructor(
78 | lines: string[],
79 | config: {
80 | requiredEntities: { [key: string]: string };
81 | selectedEntities: { [key: string]: string };
82 | selectedPropertySets: string[];
83 | allEntities: { [key: string]: string };
84 | }
85 | ) {
86 | this.lines = lines;
87 | this.entityInstances = {}; // Needs to be initialized as an empty object
88 |
89 | // Config
90 | this.requiredEntities = config.requiredEntities;
91 | this.selectedEntities = config.selectedEntities;
92 | this.selectedPropertySets = config.selectedPropertySets;
93 | this.allEntities = config.allEntities;
94 |
95 | // Generate an empty object for each required entity
96 | Object.values(config.requiredEntities).forEach((entity: string) => {
97 | Object.assign(this.entityInstances, { [entity]: {} });
98 | });
99 |
100 | // The non-required entities (e.g. IfcWall, IfcDoor) are treated as Generic Entity Instances
101 | Object.assign(this.entityInstances, { genericEntityInstances: {} });
102 | }
103 | /**
104 | * See {@link _parseStepFile}
105 | */
106 | public parseStepFile: any = _parseStepFile; // START HERE
107 | /**
108 | * See {@link _generateStepEntityInstance }
109 | */
110 | public generateStepEntityInstance = _generateStepEntityInstance;
111 | /**
112 | * See {@link _saveStepEntityInstance }
113 | */
114 | public saveStepEntityInstance: any = _saveStepEntityInstance;
115 | }
116 |
117 | export { StepFile };
118 |
--------------------------------------------------------------------------------
/dist/BIMWHALE.min.js:
--------------------------------------------------------------------------------
1 | var BIMWHALE;BIMWHALE=(()=>{"use strict";var t={310:(t,e,n)=>{function i(){for(var t=this.lines.length,e=0;em});var r=function(t){return t.slice(1,-1)},s=function(t){return t.replace(/\\/g,"").replace(/\//g,"\\/").replace(/\"/g,'\\"')},a=function(t){var e=t.line,n=t.entityInstance;return function(t,e,n,i,a){var c,o;void 0===n&&(n=""),void 0===i&&(i=!1),void 0===a&&(a="");var u=t;t=(c=function(t,e,n){return"IFCPROPERTYSINGLEVALUE"!==e&&(n=t.substr(0,t.indexOf(",")),t=t.substr(t.indexOf(","))),{attributeString:t,globalId:n}}(u,e,n)).attributeString,n=c.globalId,t=(o=function(t,e,n){return(n=/(IFC[A-Z]+\()(.*)(\)\,)/g.exec(t))&&(e=!0,n=s(n[2]),t=t.replace(/(IFC[A-Z]+\()(.*)(\)\,)/g,'"$1{PARAM})",')),{attributeString:t,functionParameter:n,hasFunction:e}}(t=function(t){return","+t+","}(t),i,a)).attributeString,a=o.functionParameter,i=o.hasFunction,t=function(t,e,n,i){return n&&(t="IFCPROPERTYSINGLEVALUE"!==e?t.replace(/(IFC[A-Z]+\()(\{PARAM\})(\)\"\,)/g,"$1"+i+')",'):t.replace(/(IFC[A-Z]+\()(\{PARAM\})(\)\"\,)/g,i.replace(/^\'(.+)\'/g,"$1")+'",')),t}(t=function(t){return t.replace(/\\/g,"").replace(/\//g,"\\/").replace(/\$/g,'"$"').replace(/(^|,)\((#\d+.*?)\)/g,"$1[$2]").replace(/([,\[])(#\d+)+/g,'$1"$2"').replace(/,(\d+[.]\d*)/g,",'$1'").replace(/(\(|\,)(\..+\.)(\)|\,)/g,"$1'$2'$3").replace(/'/g,'"')}(t),e,i,a),t=function(t,e,n){return"IFCPROPERTYSINGLEVALUE"!==t&&(e='"'+n+'"'+e),e}(e,t=r(t),n=r(n));var l=[];try{l=JSON.parse("["+t+"]")}catch(e){console.log("Parsing error:"),console.log("In:",u),console.log("Out:",t),console.log(" "),l=["N/A"]}return l}(e.substring(n.entityStartIndex+1,e.length-2),n.entityName)};function c(t){var e={instanceStartIndex:0,instanceEndIndex:t.indexOf("="),instanceName:"",entityStartIndex:t.indexOf("("),entityEndIndex:-1,entityName:""};if(function(t){var e=t.line,n=t.entityInstance.instanceEndIndex;t.entityInstance.instanceName=e.substring(0,n)}({line:t,entityInstance:e}),function(t){var e=t.line,n=t.entityInstance.instanceEndIndex,i=t.entityInstance.entityStartIndex;t.entityInstance.entityName=e.substring(n+2,i)}({line:t,entityInstance:e}),e.entityName in this.allEntities!=0)return function(t){t.line;var e=t.parsedAttributes;t.entityInstance.attributes={parsed:e}}({line:t,entityInstance:e,parsedAttributes:a({line:t,entityInstance:e})}),e}function o(t){var e,n;t.entityName in this.requiredEntities?Object.assign(this.entityInstances[this.requiredEntities[t.entityName]],((e={})[t.instanceName]={entityName:t.entityName,attributes:t.attributes},e)):Object.assign(this.entityInstances.genericEntityInstances,((n={})[t.instanceName]={entityName:this.selectedEntities[t.entityName],instanceName:t.instanceName,attributes:t.attributes,properties:{}},n))}function u(){return this.parseStepFile(),this.mapPropertySingleValuesToPropertySet(),this.mapPropertySetsToGenericEntities(),this.entityInstances.genericEntityInstances}function l(){var t=this;Object.values(this.entityInstances.IfcPropertySet).forEach((function(e){var n=p(e),i=f(t,n);y(e,i)}))}var p=function(t){return t.attributes.parsed[4]},f=function(t,e){var n={};return e.forEach((function(e){var i=(t.entityInstances.IfcPropertySingleValue[e]||{}).attributes,r=(void 0===i?{parsed:void 0}:i).parsed;"undefined"!==r&&(n[r[0]]=r[2])})),n},y=function(t,e){var n=function(t){return t.attributes.parsed[2]}(t);Object.assign(t,{ifcPropertySetName:n,ifcPropertySet:e})};function d(){var t=this,e=this.selectedPropertySets.length>0,n=this.selectedPropertySets;Object.values(this.entityInstances.IfcRelDefinesByProperties).forEach((function(i){var r=v(i),s=g(t,r);if(!h(s,e,n)){var a=b(i),c=S(t,a);void 0!==c&&E(s,c)}}))}var I,v=function(t){return t.attributes.parsed[5]},g=function(t,e){var n=t.entityInstances.IfcPropertySet[e]||{},i=n.ifcPropertySetName,r=void 0===i?void 0:i,s=n.ifcPropertySet;if(void 0!==r)return{name:r,ifcPropertySet:void 0===s?void 0:s}},h=function(t,e,n){return void 0===t||!(!e||!1!==n.includes(t.name))},b=function(t){return t.attributes.parsed[4]},S=function(t,e){var n=(t.entityInstances.genericEntityInstances[e[0]]||{}).properties;return void 0===n?void 0:n},E=function(t,e){var n;Object.assign(e,((n={})[t.name]=t.ifcPropertySet,n))},P=(I=function(t,e){return(I=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n])})(t,e)},function(t,e){function n(){this.constructor=t}I(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}),m=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.mapPropertySingleValuesToPropertySet=l,e.mapPropertySetsToGenericEntities=d,e.parseIfcFile=u,e}return P(e,t),e}((function(t,e){var n=this;this.parseStepFile=i,this.generateStepEntityInstance=c,this.saveStepEntityInstance=o,this.lines=t,this.entityInstances={},this.requiredEntities=e.requiredEntities,this.selectedEntities=e.selectedEntities,this.selectedPropertySets=e.selectedPropertySets,this.allEntities=e.allEntities,Object.values(e.requiredEntities).forEach((function(t){var e;Object.assign(n.entityInstances,((e={})[t]={},e))})),Object.assign(this.entityInstances,{genericEntityInstances:{}})}))}},e={};function n(i){if(e[i])return e[i].exports;var r=e[i]={exports:{}};return t[i](r,r.exports,n),r.exports}return n.d=(t,e)=>{for(var i in e)n.o(e,i)&&!n.o(t,i)&&Object.defineProperty(t,i,{enumerable:!0,get:e[i]})},n.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),n.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n(310)})();
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
The BIM Whale Project
8 |
9 |
10 | BIMWHALE.js | A simple client-side IFC parser
11 |
12 | View the demo »
13 |
14 |
15 | Explore docs
16 | ·
17 | Access IFC sample files
18 | ·
19 | Report Bug
20 | ·
21 | Request Feature
22 |
23 |
24 |
25 |
26 |
27 | Table of Contents
28 |
29 | -
30 | About
31 |
32 | -
33 | Getting Started
34 |
38 |
39 | -
40 | Usage
41 |
44 |
45 | - Roadmap
46 | - Contributing
47 | - License
48 | - Contact
49 | - Extra
50 |
51 |
52 |
53 |
54 |
55 | ## About
56 |
57 | **The BIM Whale** (Swedish: _BIM-valen_) is a project about the Industry Foundation Classes (IFC) format.
58 | The aim of this project is to:
59 |
60 | > I: Introduce and explain the basics of IFC schema
61 |
62 | > II: Teach people how to parse an IFC file and retrieve basic information
63 |
64 | In more specific terms, the goal of this project is to:
65 |
66 | > A: Provide a simple and fast IFC parser
67 |
68 | > B: Provide learning resources (documentation, videos, power points) to people within the AEC industry
69 |
70 | **Goal A** has been realized as **BIMWHALE.js**, i.e. this repo.
71 | BIMWHALE.js is a simple client-side IFC parser built using TypeScript.
72 |
73 | Please note that the BIMWHALE.js is **NOT** supposed to be an all singing, all dancing parser.
74 | This project is only looking to parse information that we know exists, so-called `User Defined IFC Property Sets`.
75 |
76 | Again, the focus with The BIM Whale Project is to educate people.
77 | The code itself and its functionality are secondary.
78 |
79 | Explore the [docs](https://andrewisen.gitbook.io/bim-whale/) for more information.
80 |
81 |
82 |
83 | ## FAQ
84 |
85 | **Question:** What does _The BIM Whale_ do?
86 |
87 | **Answer:** Parse so-called `User Defined IFC Property Sets` from an IFC file
88 |
89 | ##
90 |
91 | **Q:** What does _The BIM Whale_ NOT do?
92 |
93 | **A:** Parse entity attributes, parse geometry, follow the EXPRESS standard, etc. etc.
94 |
95 | ##
96 |
97 | **Q:** What is an IFC file?
98 |
99 | **A:** Industry Foundation Classes (IFC) is a standardized, digital description of a BIM model. See [IFC](https://en.wikipedia.org/wiki/Industry_Foundation_Classes) for more information.
100 |
101 | ##
102 |
103 | **Q:** What is a STEP file?
104 |
105 | **A:** A STEP-File is the format IFC uses. See [ISO 10303-21](https://en.wikipedia.org/wiki/ISO_10303-21) for more information
106 |
107 | ##
108 |
109 | **Q:** Is this code "hand made"?
110 |
111 | **A:** Yes, the code is hand made. The parsing is not derived from an EXPRESS definition.
112 |
113 | ##
114 |
115 | **Q:** Is the code ready for production?
116 |
117 | **A:** No, not yet. See [open issues](/issues) for more info
118 |
119 | ## Getting Started
120 |
121 | 1. A compiled _JS bundle file_ is available here:
122 |
123 | [https://cdn.jsdelivr.net/gh/andrewisen/bim-whale/dist/BIMWHALE.min.js](https://cdn.jsdelivr.net/gh/andrewisen/bim-whale/dist/BIMWHALE.min.js)
124 |
125 | 2. Add it to your project
126 |
127 | ```html
128 |
129 | ```
130 |
131 | 3. Use the FileReader API and create a new `IfcFile` object
132 |
133 | ```javascript
134 | // The libary is called: BIMWHALE
135 | var fileReader = new FileReader();
136 | fileReader.onload = function (e) {
137 | const lines = e.target.result.split(/\r\n|\n/);
138 | let ifcFile = new BIMWHALE.IfcFile(lines, config);
139 | ifcFile.parseIfcFile();
140 | };
141 | fileReader.readAsText(file);
142 | ```
143 |
144 | 4. See the docs for more information: [docs.bimvalen.se](docs.bimvalen.se)
145 |
146 | ## Local Development
147 |
148 | These next steps will guide you to set up your own development platform.
149 |
150 | ### Prerequisites
151 |
152 | This repository uses Deno as the runtime for TypeScript.
153 |
154 | - Install Deno.
155 | See instruction at [https://deno.land](https://deno.land)
156 |
157 | ### Installation
158 |
159 | 1. Clone the repo
160 |
161 | ```shell
162 | git clone https://github.com/andrewisen/bim-whale.git
163 | ```
164 |
165 | 2. Replace the following files with your own content.
166 |
167 | - `index.ts`
168 | - `src/config.ts`
169 |
170 | The easiest approach is to copy content of the `example.NAME.ts` file.
171 |
172 | **In other words:**
173 | Replace `index.ts` with the content inside `example.index.ts`.
174 |
175 | 4. Make sure you update `src/config.ts` and provide a correct **filePath**.
176 | You can download some sample files here: [https://github.com/andrewisen/bim-whale-ifc-samples](https://github.com/andrewisen/bim-whale-ifc-samples)
177 |
178 | 5. Check if Deno is working
179 |
180 | ```shell
181 | deno run --allow-read checkDeno.ts
182 | ```
183 |
184 | Any errors until this point are likely due to Deno.
185 | Submit an issue if have any problems.
186 |
187 |
188 |
189 | ## Usage
190 |
191 | - Run the app with:
192 |
193 | ```shell
194 | deno run --allow-read index.ts
195 | ```
196 |
197 | ### SimpleWall Sample File
198 |
199 | Download the `SimpleWall Sample File` [here](https://github.com/andrewisen/bim-whale-ifc-samples/tree/main/SimpleWall).
200 | The sample consist of:
201 |
202 | - A wall
203 | - A door
204 |
205 | Here's a screenshot:
206 |
207 | 
208 |
209 | The IFC file has a **Property Set** called `Custom_Pset`.
210 | Please note that the file only contains dummy data.
211 |
212 | 
213 |
214 | Make sure to update `src/config.ts` and provide a correct **filePath**.
215 | You should get the following result:
216 |
217 | ```javascript
218 | {
219 | TypeMark: "_TYPE-MARK_",
220 | Keynote: "_KEYNOTE_",
221 | StoreyName: "Level: Level 1",
222 | TypeDescription: "_DESCRIPTION_",
223 | StatusConstruction: "New Construction",
224 | NetArea: "14.04739",
225 | Height: "4000.",
226 | Width: "200.",
227 | Length: "4000.",
228 | Hyperlink: "_URL_"
229 | }
230 | {
231 | TypeMark: "20",
232 | Keynote: "--KEYNOTE--",
233 | StoreyName: "Level: Level 1",
234 | TypeDescription: "--DESCRIPTION--",
235 | StatusConstruction: "New Construction",
236 | NetArea: "3.18957899999998",
237 | Height: "2134.",
238 | Width: "915.",
239 | SillHeight: "0.",
240 | Hyperlink: "--URL--"
241 | }
242 | ```
243 |
244 | **In summary:**
245 | We have performed a simple parsing.
246 |
247 | We have only included `walls` and `doors` in our config file. See:
248 | `const selectedEntities: string[] = ["IFCDOOR", "IFCWALLSTANDARDCASE"];`
249 |
250 | **TODO**
251 |
252 |
253 |
254 | ## Roadmap
255 |
256 | This project is still in it's early development. And yes, it still has some bugs.
257 | Please be patience!
258 |
259 | See the [open issues](/issues) for a list of proposed features (and known issues).
260 |
261 |
262 |
263 | ## Contributing
264 |
265 | This project is still in it's early development.
266 | But, any contributions you make are **greatly appreciated**.
267 |
268 | 1. Fork the Project
269 | 2. Create your Feature Branch (`git checkout -b feature/AmazingFeature`)
270 | 3. Commit your Changes (`git commit -m 'Add some AmazingFeature'`)
271 | 4. Push to the Branch (`git push origin feature/AmazingFeature`)
272 | 5. Open a Pull Request
273 |
274 |
275 |
276 | ## License
277 |
278 | See `LICENSE` for more information.
279 |
280 |
281 |
282 | ## Contact
283 |
284 | - Email: [andre.wisen@gmail.com](mailto:andre.wisen@gmail.com])
285 | - LinkedIn: [https://linkedin.com/in/andrewisen/](https://linkedin.com/in/andrewisen/)
286 |
287 |
288 |
289 | ## Extra
290 |
291 | Not what you're looking for?
292 | Check out these projects instead!
293 |
294 | - [IFC.js](https://github.com/agviegas/IFC.js)
295 | - [IfcOpenShell](https://github.com/IfcOpenShell/IfcOpenShell)
296 | - [xBIM](https://github.com/xBimTeam)
297 | - [IFC++](https://github.com/ifcquery/ifcplusplus)
298 |
--------------------------------------------------------------------------------
/typedoc.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
Welcome to the BIMWHALE.js docs
8 |
9 |
10 | A simple client-side IFC parser
11 |
12 | GitHub repository »
13 |
14 |
15 | Access IFC sample files
16 | ·
17 | View Demo
18 | ·
19 | Report Bug
20 | ·
21 | Request Feature
22 |
23 |
24 |
25 | ## Introduction
26 |
27 | The primary docs for **The BIM Whale Project** can be found at:
28 | [https://andrewisen.gitbook.io/bim-whale/](https://andrewisen.gitbook.io/bim-whale/)
29 |
30 | The purpose of this website is to provide additional documentation.
31 | This site will focus on the code itself; the classes and methods used.
32 |
33 | Please note that actual source code is **NOT** included here.
34 | This site is built using [TypeDoc](https://typedoc.org).
35 | The content is automatically generated from the TypeScript source code.
36 |
37 | Again, to clarify:
38 | This documentation will go into more details.
39 | It will (try to) explain how the code works.
40 |
41 | If you feel overwheled by this, then head back to the [original documentations](https://andrewisen.gitbook.io/bim-whale/).
42 |
43 | ## Code Architecture
44 |
45 | ### Folder Structure
46 |
47 | The overall folder structure is shown below.
48 |
49 | ```text
50 | bim-whale
51 | ├───dist
52 | └───src
53 | ├───utils
54 | ├───config
55 | ├───step-parser
56 | │ └───step-parser.ts
57 | └───ifc-parser
58 | └───ifc-parser.ts
59 | ```
60 |
61 | Please note that the `ifc-parser` is an extensions of the `step-parser`.
62 | Each method is put inside it's own file to keep things more organized.
63 |
64 | ```text
65 | bim-whale
66 | └───src
67 | └───ifc-parser
68 | ├───ifc-parser.ts
69 | └───methods
70 | ├───parse-ifc-file.ts
71 | ├───map-property-single-values-to-property-set.ts
72 | └───map-property-sets-to-generic-entities.ts
73 | ```
74 |
75 | ### Getting started
76 |
77 | - A `config` object is created.
78 |
79 | The main repository uses a [config file](https://github.com/andrewisen/bim-whale/blob/b8427d3/src/config/example.config.ts).
80 | The public demo creates a [config object](https://github.com/andrewisen/bim-whale-demo/blob/main/public/assets/js/handle-ifc-file.js) inside the function.
81 |
82 | Both approaches are valid.
83 |
84 | - A new `IfcFile` object is created
85 |
86 | ```javascript
87 | let ifcFile = new BIMWHALE.IfcFile(lines, config);
88 | ```
89 |
90 | The class `IfcFile` is an extension of the class `StepFile`.
91 | In other words, the `IfcFile`'s constructor is inherited from the [StepFile's constructor](https://github.bimvalen.se/docs/classes/stepfile.html#constructor).
92 |
93 | - The `IfcFile object` parse an IFC file and return `Property Sets` for each object (IFC Entity)
94 |
95 | ### In more detail
96 |
97 | 1. A `config object` is provided
98 | 2. A new [IfcFile object](https://github.bimvalen.se/docs/classes/ifcfile.html) is created
99 | 3. The [constructor](https://github.bimvalen.se/docs/classes/stepfile.html#constructor) handle the aforementioned `config object`
100 | 4. [parseStepFile()](https://github.bimvalen.se/docs/globals.html#_parsestepfile) iterates over **each line** and calls [generateStepInstance()](https://github.bimvalen.se/docs/globals.html#_generatestepinstance)
101 | 5. [generateStepInstance()](https://github.bimvalen.se/docs/globals.html#_generatestepinstance) generates a so-called `STEP Instance` object
102 |
103 | In this particular case, a `STEP Instance` object is one of the following
104 |
105 | - [IfcPropertySet](https://standards.buildingsmart.org/IFC/RELEASE/IFC2x3/TC1/HTML/ifckernel/lexical/ifcpropertyset.htm)
106 | - [IfcPropertySingleValue](https://standards.buildingsmart.org/IFC/RELEASE/IFC2x3/TC1/HTML/ifcpropertyresource/lexical/ifcpropertysinglevalue.htm)
107 | - [IfcRelDefinesByProperties](https://standards.buildingsmart.org/IFC/RELEASE/IFC2x3/TC1/HTML/ifckernel/lexical/ifcreldefinesbyproperties.htm)
108 | - [IfcBuildingElement](https://standards.buildingsmart.org/IFC/RELEASE/IFC2x3/FINAL/HTML/ifcproductextension/lexical/ifcbuildingelement.htm), which is denoted as a `genericEntity`
109 |
110 | 6. [parsestepinstanceattributes()](https://github.bimvalen.se/docs/globals.html#_parsestepinstanceattributes) is used to aid the aforementioned `generateStepInstance()`.
111 | 7. [mapPropertySingleValuesToPropertySet()](https://github.bimvalen.se/docs/classes/ifcfile.html#mappropertysinglevaluestopropertyset) maps a [IfcPropertySingleValue](https://standards.buildingsmart.org/IFC/RELEASE/IFC2x3/TC1/HTML/ifcpropertyresource/lexical/ifcpropertysinglevalue.htm) to a [IfcPropertySet](https://standards.buildingsmart.org/IFC/RELEASE/IFC2x3/TC1/HTML/ifckernel/lexical/ifcpropertyset.htm)
112 | 8. [mapPropertySetsToGenericEntities()](https://github.bimvalen.se/docs/classes/ifcfile.html#mappropertysetstogenericentities) maps a [IfcPropertySet](https://standards.buildingsmart.org/IFC/RELEASE/IFC2x3/TC1/HTML/ifckernel/lexical/ifcpropertyset.htm) to a [IfcBuildingElement/GenericEntity](https://standards.buildingsmart.org/IFC/RELEASE/IFC2x3/FINAL/HTML/ifcproductextension/lexical/ifcbuildingelement.htm) using an [objectified relationship (IfcRelDefinesByProperties)](https://standards.buildingsmart.org/IFC/RELEASE/IFC2x3/TC1/HTML/ifckernel/lexical/ifcreldefinesbyproperties.htm)
113 |
114 | ### Why TypeScript?
115 |
116 | I prefer TS for one simple reason:
117 |
118 | > Developer tooling support / Enhanced IDE support
119 |
120 | See: [TypeScript in 100 Seconds](https://www.youtube.com/watch?v=zQnBQ4tB3ZA)
121 |
122 | In my option, TS makes it much easier to work with IFC.
123 |
124 | ### A word about performance
125 |
126 | - Avoid unwanted loops
127 | - Avoid nested loops
128 | - Avoid using try-catch-finally
129 | - Set correct variable scope
130 | - Use modern ES6 features (e.g. Object Destructuring, Spread Operator, template literals)
131 |
132 | **TODO**
133 |
134 | ## Where should I start?
135 |
136 | Start by looking at the [stepFile Class](https://github.bimvalen.se/docs/classes/stepfile.html).
137 | This is the base and deals with [STEP / ISO 10303](https://en.wikipedia.org/wiki/ISO_10303).
138 |
139 | In other words:
140 |
141 | - The [stepFile Class](https://github.bimvalen.se/docs/classes/stepfile.html) handles the parsing of a [STEP file](https://en.wikipedia.org/wiki/ISO_10303-21).
142 | - The [IfcFile Class](https://github.bimvalen.se/docs/classes/ifcfile.html) builds the relationship between objects (IFC Entites) according to the [IFC Schema](https://standards.buildingsmart.org/IFC/RELEASE/IFC2x3/TC1/HTML/).
143 |
144 | ### Example
145 |
146 | Let's take a look at the example file [SimpleWall](https://github.com/andrewisen/bim-whale-ifc-samples/tree/main/SimpleWall/IFC).
147 | Here's an extract of the file:
148 |
149 | ```javascript
150 | #297= IFCPROPERTYSINGLEVALUE('Description',$,IFCTEXT('_DESCRIPTION_'),$);
151 | #298= IFCPROPERTYSINGLEVALUE('Fire Rating',$,IFCTEXT('_FIRE-RATING_'),$);
152 | #299= IFCPROPERTYSINGLEVALUE('Keynote',$,IFCTEXT('_KEYNOTE_'),$);
153 | #300= IFCPROPERTYSINGLEVALUE('Manufacturer',$,IFCTEXT('_MANUFACTURER_'),$);
154 | #301= IFCPROPERTYSINGLEVALUE('Model',$,IFCTEXT('MODEL'),$);
155 | #302= IFCPROPERTYSINGLEVALUE('Type Comments',$,IFCTEXT('_TYPE-COMMENTS_'),$);
156 | #303= IFCPROPERTYSINGLEVALUE('Type Mark',$,IFCTEXT('_TYPE-MARK_'),$);
157 | #304= IFCPROPERTYSINGLEVALUE('Type Name',$,IFCTEXT('Bearing Wall'),$);
158 | #305= IFCPROPERTYSINGLEVALUE('URL',$,IFCTEXT('_URL_'),$);
159 | #306= IFCPROPERTYSINGLEVALUE('Family Name',$,IFCTEXT('Basic Wall'),$);
160 | ```
161 |
162 | Each line consist of an **entity instance**.
163 | This can simply be referred to as an _entity_ or an _instance_ ("entity instance" is a long word).
164 |
165 | Each line contains the following:
166 |
167 | - Instance name
168 | - Entity name
169 | - Attributes
170 |
171 | Let's examine the **first line** in the example above:
172 |
173 | - Instance name: `#294`
174 | - Entity name: `IFCPROPERTYSINGLEVALUE`
175 | - Attributes: `'Description',$,IFCTEXT('_DESCRIPTION_'),$`
176 |
177 | The terminology above will be used throughout this site.
178 |
179 | The method [generateStepInstance()](https://github.bimvalen.se/docs/globals.html#_generatestepinstance) is used to build an **entity instance**.
180 |
181 | In other words: [stepFile Class](https://github.bimvalen.se/docs/classes/stepfile.html) will use [generateStepInstance()](https://github.bimvalen.se/docs/globals.html#_generatestepinstance) to generate each IFC Entity.
182 |
183 | **MORE INFO WILL COME**
184 |
185 | ## But, I don't understand
186 |
187 | No worries. The goal with The BIM Whale is to teach people how to work with IFC.
188 | However, the learning resources are not ready yet. Have some patience!
189 |
190 | ## Contact
191 |
192 | - Primary email: [kontakt@andrewisen.se](mailto:kontakt@andrewisen.se)
193 | - Secondary email: [andre.wisen@gmail.com](mailto:andre.wisen@gmail.com])
194 | - LinkedIn: [https://linkedin.com/in/andrewisen/](https://linkedin.com/in/andrewisen/)
195 |
196 | ## Extra
197 |
198 | Not what you're looking for?
199 | Check out these projects instead!
200 |
201 | - [IFC.js](https://github.com/agviegas/IFC.js)
202 | - [IfcOpenShell](https://github.com/IfcOpenShell/IfcOpenShell)
203 | - [xBIM](https://github.com/xBimTeam)
204 |
--------------------------------------------------------------------------------
/src/step-parser/functions/parse-step-entity-instance-attributes.ts:
--------------------------------------------------------------------------------
1 | /**
2 | *
3 | * Parse an _attribute string_ into a JavaScript object.
4 | * The so-called _attribute string_ is derived from {@link _generateStepEntityInstance}.
5 | *
6 | * __Example:__
7 | *
8 | * ```#572= IFCDOOR('1F6umJ5H50aeL3A1As_wUF',#42,'M_Single-Flush:Outside door:346843',$,'M_Single-Flush:Outside door',#938,#566,'346843',2134.,915.);```
9 | *
10 | * In this example, the _attribute string_ is `'1F6umJ5H50aeL3A1As_wUF',#42,'M_Single-Flush:Outside door:346843',$,'M_Single-Flush:Outside door',#938,#566,'346843',2134.,915.`.
11 | * Or, in other words: The _attribute string_ is the parameter of the "IFCDOOR function".
12 | *
13 | * Moving on; the _attribute string_ must first be converted into a _JSON string_.
14 | * [JSON.parse()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse) will then convert the _JSON string_ into a _JSON object_.
15 | *
16 | * We can clearly see that the _attribute string_ __IS NOT__ compatible with JSON.
17 | * Firstly, apostrophes are not supported (there needs to be quotation marks).
18 | * Secondly, some attributes are not enclosed by quotation marks. E.g. `#938`(see example above).
19 | *
20 | * __In summary, we want the following:__
21 | *
22 | * ```[ "1F6umJ5H50aeL3A1As_wUF", "#42", "M_Single-Flush:Outside door:346843", "$", "M_Single-Flush:Outside door", "#938","#566","346843","2134.","915."]```
23 | *
24 | * ## RegEx
25 | * Regular Expression is probably the easiest (but not the fastest) way to convert the _attribute string_ into a _JSON Object_.
26 | * Please note that each RegEx will impact the performance.
27 | *
28 | * I have provides a very basic set of RegEx, this will work _in most cases_.
29 | * Feel free to tweak this to your own liking.
30 | * My favorite RegEx tool is [https://regex101.com](https://regex101.com).
31 | *
32 | * Please note that RegEx is can be difficult to understand.
33 | * Just ignore this bit if you are unsure.
34 | *
35 | * ### Some noteworthy difficult lines
36 | * _As instances:_
37 | * ```javascript
38 | * #278= IFCPROPERTYSINGLEVALUE('Structural',$,IFCBOOLEAN(.F.),$);
39 | * #261= IFCWALLTYPE('1F6umJ5H50aeL3A1As_wV9',#42,'Basic Wall:Bearing Wall',$,$,(#332,#334,#336,#338,#340,#343,#346,#349,#352,#355,#359,#363,#370),$,'346781',$,.STANDARD.);
40 | * #121= IFCPROJECT('2nxdYR2RHCDBiKJulbA_QU',#42,'// PROJECT/NUMBER //',$,$,'// PROJECT/NAME //','// PROJECT/STATUS //',(#113),#108);
41 | * #228= IFCQUANTITYLENGTH('Height',$,$,4000.);
42 | * #754= IFCPROPERTYSINGLEVALUE('AboveGround',$,IFCLOGICAL(.U.),$);
43 | * #652= IFCPROPERTYSINGLEVALUE('Thermal Resistance (R)',$,IFCREAL(0.270116960643959),$);
44 | * ```
45 | * _As attribute strings:_
46 | * ```javascript
47 | * 'Structural',$,IFCBOOLEAN(.F.),$)
48 | * '1F6umJ5H50aeL3A1As_wV9',#42,'Basic Wall:Bearing Wall',$,$,(#332,#334,#336,#338,#340,#343,#346,#349,#352,#355,#359,#363,#370),$,'346781',$,.STANDARD.
49 | * '2nxdYR2RHCDBiKJulbA_QU',#42,'// PROJECT/NUMBER //',$,$,'// PROJECT/NAME //','// PROJECT/STATUS //',(#113),#108
50 | * 'Height',$,$,4000.
51 | * 'AboveGround',$,IFCLOGICAL(.U.),$
52 | * 'Thermal Resistance (R)',$,IFCREAL(0.270116960643959),$
53 | * ```
54 | *
55 | * There are at least five different things to consider:
56 | * 1. "Function"
57 | * 2. Indefinite attribute
58 | * 3. Nested attribute
59 | * 4. References
60 | * 5. Integers
61 | *
62 | * ### 1. Functions
63 | * Example:
64 | *
65 | * ```javascript
66 | * IFCIDENTIFIER('Outside door')
67 | * IFCTHERMALTRANSMITTANCEMEASURE(3.7021)
68 | * IFCTEXT('')
69 | * IFCLOGICAL(.U.)
70 | * ```
71 | *
72 | * For the sake of simplicity, let's call and treat these as JavaScript functions.
73 | * Note that each function has different ways to pass in parameters.
74 | * Some parameters are enclosed with apostrophe, and some are not.
75 | *
76 | * We need a RegEx that takes this into consideration.
77 | * The simplest form is:
78 | * `[A-Z]+\('[a-zA-z_ ]+'\)`
79 | *
80 | * Let's take the first function `IFCIDENTIFIER('Outside door')` as an example.
81 | * The RegEx will find us the name of the function...
82 | *
83 | * However, this is to no good use yet.
84 | * We need to capture both the _function name_ and the _parameters_, i.e. __IFCIDENTIFIER__ and __Outside door__
85 | *
86 | * Our RegEx now becomes: `([A-Z]+\()'([a-zA-z_ ]+)'\)`
87 | * It is crucial that you understand what this RegEx mean... it will only get more difficult from here.
88 | *
89 | * Anyways, we can substitute our string using the expression `$1$2)`.
90 | *
91 | * __UPDATE:__ This approach has been replaced with a new one.
92 | * See [Issue #4](https://github.com/andrewisen/bim-whale/issues/4) for more information.
93 | *
94 | * ### 2. Indefinite attribute
95 | * Example: `#764= IFCRELDEFINESBYPROPERTIES('0Jv9wzDiT2Fx3l2pN5PrZ7',#42,$,$,(#140),#752);`
96 | *
97 | * _Indefinite attribute_ are parameters that has not been assigned. These are represented with a dollar sign (__$__).
98 | * Note that a dollar sign might appear in the UIID, e.g. `2HlE6XRD5D2u$q88QiyvCI`
99 | *
100 | * One can simply assume that _indefinite attributes_ __ALWAYS__ begins with a comma (and not a character).
101 | *
102 | * __UPDATE:__ This approach has been replaced with a new one.
103 | * See [Issue #4](https://github.com/andrewisen/bim-whale/issues/4) for more information.
104 | *
105 | * ### 3. Nested attribute
106 | * Example: `#810= IFCPROPERTYSET('0eCyo1mQf61RRDb8LkFhbB',#42,'Other',$,(#781,#782,#783,#784,#785));`
107 | *
108 | * The _nested attributes_ are the ones enclosed by parentheses, i.e. __#781,#782,#783,#784,#785__.
109 | * We need enclose them with square brackets.
110 | *
111 | * ### 4. References
112 | * Example: `#219= IFCWALLSTANDARDCASE('1F6umJ5H50aeL3A1As_wTm',#42,'Basic Wall:Bearing Wall:346660',$,'Basic Wall:Bearing Wall',#188,#215,'346660');`
113 | *
114 | * The _wall entity_ is referencing the entities __188__ and __215__.
115 | * These references need to be enclosed by quotations marks.
116 | *
117 | * Please note that references inside _nested attributes_ also need to be enclosed (see example above).
118 | *
119 | * ### 5. Integers
120 | * Example: `#572= IFCDOOR('1F6umJ5H50aeL3A1As_wUF',#42,'M_Single-Flush:Outside door:346843',$,'M_Single-Flush:Outside door',#938,#566,'346843',2134.,915.);`
121 | *
122 | * The last two parameters are integers; __2134.__, __915.__.
123 | * Note that the zero is omitted in these cases.
124 | */
125 | function parseStepEntityInstanceAttributes(
126 | attributeString: string,
127 | entityName: string,
128 | globalId: string = "",
129 | hasFunction: boolean = false,
130 | functionParameter: string | string[] | null = ""
131 | ) {
132 | // Used for error logging
133 | const originalAttributeString = attributeString;
134 |
135 | // A. Deconstruct the GlobalId (GUID)
136 | ({ attributeString, globalId } = deconstructGlobalId(
137 | originalAttributeString,
138 | entityName,
139 | globalId
140 | ));
141 | // B. RegEx edge case
142 | attributeString = addCommas(attributeString);
143 | // C. Deconstruct function
144 | ({ attributeString, functionParameter, hasFunction } = deconstructFunction(
145 | attributeString,
146 | hasFunction,
147 | functionParameter
148 | ));
149 | /**
150 | * PARSE
151 | */
152 | attributeString = parse(attributeString);
153 |
154 | // C. Construct function
155 | attributeString = constructFunction(
156 | attributeString,
157 | entityName,
158 | hasFunction,
159 | functionParameter
160 | );
161 | // B. RegEx edge case
162 | attributeString = removeCommas(attributeString);
163 | globalId = removeCommas(globalId);
164 | // A. Construct GlobalId (GUID)
165 | attributeString = constructGlobalId(entityName, attributeString, globalId);
166 |
167 | /**
168 | * WIP
169 | */
170 | let parsedAttributes = [];
171 | try {
172 | parsedAttributes = JSON.parse("[" + attributeString + "]");
173 | } catch (error) {
174 | console.log("Parsing error:");
175 | console.log("In:", originalAttributeString);
176 | console.log("Out:", attributeString);
177 | console.log(" ");
178 | parsedAttributes = ["N/A"];
179 | }
180 | return parsedAttributes;
181 | }
182 |
183 | /**
184 | * Deconstructs the GlobalId (GUID)
185 | * The function {@link constructGlobalId} will add back the GlobalId.
186 | *
187 | * Edge case for `IfcPropertySingleValue`
188 | *
189 | * Example: #77331= IFCSLAB('3V$FMCDUfCoPwUaHMPfteW',#48,'Pad:Pad 1:130737',$,'Pad:Pad 1',#77294,#77329,'130737',.FLOOR.);
190 | *
191 | * Notice that the GlobalId contains a dollar sign.
192 | * The regEx that deals with dollar signs will take the GlobalId into consideration.
193 | * Let's ignore the GloablId for now, in order to make the parsing somewhat easier.
194 | *
195 | * WIP
196 | *
197 | * @param attributeString
198 | * @param entityName
199 | * @param globalId
200 | */
201 | const deconstructGlobalId = (
202 | attributeString: string,
203 | entityName: string,
204 | globalId: string
205 | ) => {
206 | if (entityName !== "IFCPROPERTYSINGLEVALUE") {
207 | globalId = attributeString.substr(0, attributeString.indexOf(","));
208 | // The attributeString will NOT contain the GlobalID.
209 | attributeString = attributeString.substr(attributeString.indexOf(","));
210 | // We will add back the GlobalID later
211 | }
212 | return { attributeString, globalId };
213 | };
214 |
215 | /**
216 | * Constructs the GlobalId(GUID) from {@link deconstructGlobalId}
217 | *
218 | * @param entityName
219 | * @param attributeString
220 | * @param globalId
221 | */
222 | const constructGlobalId = (
223 | entityName: string,
224 | attributeString: string,
225 | globalId: string
226 | ) => {
227 | if (entityName !== "IFCPROPERTYSINGLEVALUE") {
228 | attributeString = '"' + globalId + '"' + attributeString;
229 | }
230 | return attributeString;
231 | };
232 |
233 | /**
234 | * Edge case for RegEx. In normal cases, we must add an edge case for the beginning and end of the string.
235 | * E.g. `GlobalId,OwnerHistory,Name,Description`
236 | *
237 | * Let's say that we want to parse the _description_.
238 | * Notice that the string DO NOT end with a comma.
239 | * In this particular case, we need to add an edge case.
240 | *
241 | * We do not need this edge case if we add commas before and after the string.
242 | * @param attributeString
243 | */
244 | const addCommas = (attributeString: string) => {
245 | return "," + attributeString + ",";
246 | };
247 |
248 | /**
249 | * Construct RegEx
250 | * @param attributeString
251 | */
252 | const removeCommas = (attributeString: string) => {
253 | return attributeString.slice(1, -1);
254 | };
255 |
256 | /**
257 | * Deconstruct a function inside an attribute string.
258 | * The function {@link constructFunction} will add the function back.
259 | *
260 | * E.g. `...,IFCTEXT('Hello World'),...`
261 | *
262 | * The function `IFCTEXT` has the parameter `'Hello World'`.
263 | * Notice that some parameters are enclosed by apostrophes.
264 | *
265 | * @param attributeString
266 | * @param hasFunction
267 | * @param functionParameter
268 | */
269 | const deconstructFunction = (
270 | attributeString: string,
271 | hasFunction: boolean,
272 | functionParameter: string | string[] | null
273 | ) => {
274 | /**
275 | * Check if the attribute string has a "function" (see above for example)
276 | */
277 | functionParameter = /(IFC[A-Z]+\()(.*)(\)\,)/g.exec(attributeString);
278 |
279 | if (functionParameter) {
280 | hasFunction = true;
281 | functionParameter = parseFunctionParameter(functionParameter[2]);
282 | // Replace the parameter with the phrase: {PARAM}
283 | attributeString = attributeString.replace(
284 | /(IFC[A-Z]+\()(.*)(\)\,)/g,
285 | '"$1{PARAM})",'
286 | );
287 | }
288 | return { attributeString, functionParameter, hasFunction };
289 | };
290 |
291 | /**
292 | * Constructs the function from {@link deconstructFunction}
293 | *
294 | * @param attributeString
295 | * @param entityName
296 | * @param hasFunction
297 | * @param functionParameter
298 | */
299 | const constructFunction = (
300 | attributeString: string,
301 | entityName: string,
302 | hasFunction: boolean,
303 | functionParameter: string | string[] | null
304 | ) => {
305 | if (hasFunction) {
306 | if (entityName !== "IFCPROPERTYSINGLEVALUE") {
307 | attributeString = attributeString.replace(
308 | /(IFC[A-Z]+\()(\{PARAM\})(\)\"\,)/g,
309 | "$1" + functionParameter + ')",'
310 | );
311 | } else {
312 | attributeString = attributeString.replace(
313 | /(IFC[A-Z]+\()(\{PARAM\})(\)\"\,)/g,
314 | (functionParameter).replace(/^\'(.+)\'/g, "$1") + '",'
315 | );
316 | }
317 | }
318 | return attributeString;
319 | };
320 |
321 | /**
322 | * Parse a regular attribute string
323 | *
324 | * @param attributeString
325 | */
326 | const parse = (attributeString: string) => {
327 | return attributeString
328 | .replace(/\\/g, "") // Backward slashes
329 | .replace(/\//g, "\\/") // Forward slashes
330 | .replace(/\$/g, '"$"') // Indefinite attributes
331 | .replace(/(^|,)\((#\d+.*?)\)/g, "$1[$2]") // Nested attributes
332 | .replace(/([,\[])(#\d+)+/g, '$1"$2"') // References to other entities (e.g. #123)
333 | .replace(/,(\d+[.]\d*)/g, ",'$1'") // Integers (that are not escaped)
334 | .replace(/(\(|\,)(\..+\.)(\)|\,)/g, "$1'$2'$3") // ".T.", ".F.", ".UNDEFINED.", etc.
335 | .replace(/'/g, '"'); // Convert all remaining apostrophes to quotes
336 | };
337 |
338 | /**
339 | * Parse a function parameter.
340 | * The entire function parameter will be enclosed with quotes.
341 | *
342 | * No need to be as detailed as the {@link parse} function.
343 | *
344 | * @param functionParameter
345 | */
346 | const parseFunctionParameter = (functionParameter: string) => {
347 | return functionParameter
348 | .replace(/\\/g, "") // Backward slashes
349 | .replace(/\//g, "\\/") // Forward slashes
350 | .replace(/\"/g, '\\"'); // Quotation marks
351 | };
352 |
353 | // Underscore is used to distinguish this function as a method that belongs to StepFile
354 | export { parseStepEntityInstanceAttributes };
355 |
--------------------------------------------------------------------------------
/dist/BIMWHALE.js:
--------------------------------------------------------------------------------
1 | var BIMWHALE;BIMWHALE =
2 | /******/ (() => { // webpackBootstrap
3 | /******/ "use strict";
4 | /******/ var __webpack_modules__ = ({
5 |
6 | /***/ 310:
7 | /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
8 |
9 | // ESM COMPAT FLAG
10 | __webpack_require__.r(__webpack_exports__);
11 |
12 | // EXPORTS
13 | __webpack_require__.d(__webpack_exports__, {
14 | "IfcFile": () => /* reexport */ IfcFile
15 | });
16 |
17 | ;// CONCATENATED MODULE: ./src/step-parser/methods/_parse-step-file.ts
18 | /**
19 | * The method method will:
20 | * 1. Iterate over each line in the IFC file
21 | * 2. Generate a so-called `step instance` from each line
22 | *
23 | * First and foremost, there's no need to include the so-called __HEADER section__.
24 | * We only want to include data (that's available in the __DATA section__.)
25 | * One can simply assume that each line will contain an equal sign (=).
26 | *
27 | * __Example:__
28 | * ```#572= IFCDOOR('...');```
29 | */
30 | function _parseStepFile() {
31 | var linesLength = this.lines.length;
32 | for (var index = 0; index < linesLength; index++) {
33 | var line = this.lines[index];
34 | // Only include data (from the DATA section)
35 | if (line.indexOf("=") === -1)
36 | continue;
37 | var entityInstance = this.generateStepEntityInstance(line);
38 | if (entityInstance !== undefined)
39 | this.saveStepEntityInstance(entityInstance);
40 | }
41 | }
42 | // Underscore is used to distinguish this function as a method that belongs to StepFile
43 |
44 |
45 | ;// CONCATENATED MODULE: ./src/step-parser/functions/set-step-instance-name.ts
46 | /**
47 | * Set STEP Instance Name, eg. #572
48 | * @param _
49 | */
50 | var setStepInstanceName = function (_) {
51 | var line = _.line, instanceEndIndex = _.entityInstance.instanceEndIndex;
52 | var entityInstance = _.entityInstance;
53 | entityInstance.instanceName = line.substring(0, instanceEndIndex);
54 | };
55 |
56 |
57 | ;// CONCATENATED MODULE: ./src/step-parser/functions/set-step-entity-name.ts
58 | // Set STEP Entity Name, e.g. IFCDOOR
59 | var setStepEntityName = function (_) {
60 | var line = _.line, instanceEndIndex = _.entityInstance.instanceEndIndex, entityStartIndex = _.entityInstance.entityStartIndex;
61 | var entityInstance = _.entityInstance;
62 | entityInstance.entityName = line.substring(instanceEndIndex + 2, entityStartIndex);
63 | };
64 |
65 |
66 | ;// CONCATENATED MODULE: ./src/step-parser/functions/parse-step-entity-instance-attributes.ts
67 | /**
68 | *
69 | * Parse an _attribute string_ into a JavaScript object.
70 | * The so-called _attribute string_ is derived from {@link _generateStepEntityInstance}.
71 | *
72 | * __Example:__
73 | *
74 | * ```#572= IFCDOOR('1F6umJ5H50aeL3A1As_wUF',#42,'M_Single-Flush:Outside door:346843',$,'M_Single-Flush:Outside door',#938,#566,'346843',2134.,915.);```
75 | *
76 | * In this example, the _attribute string_ is `'1F6umJ5H50aeL3A1As_wUF',#42,'M_Single-Flush:Outside door:346843',$,'M_Single-Flush:Outside door',#938,#566,'346843',2134.,915.`.
77 | * Or, in other words: The _attribute string_ is the parameter of the "IFCDOOR function".
78 | *
79 | * Moving on; the _attribute string_ must first be converted into a _JSON string_.
80 | * [JSON.parse()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse) will then convert the _JSON string_ into a _JSON object_.
81 | *
82 | * We can clearly see that the _attribute string_ __IS NOT__ compatible with JSON.
83 | * Firstly, apostrophes are not supported (there needs to be quotation marks).
84 | * Secondly, some attributes are not enclosed by quotation marks. E.g. `#938`(see example above).
85 | *
86 | * __In summary, we want the following:__
87 | *
88 | * ```[ "1F6umJ5H50aeL3A1As_wUF", "#42", "M_Single-Flush:Outside door:346843", "$", "M_Single-Flush:Outside door", "#938","#566","346843","2134.","915."]```
89 | *
90 | * ## RegEx
91 | * Regular Expression is probably the easiest (but not the fastest) way to convert the _attribute string_ into a _JSON Object_.
92 | * Please note that each RegEx will impact the performance.
93 | *
94 | * I have provides a very basic set of RegEx, this will work _in most cases_.
95 | * Feel free to tweak this to your own liking.
96 | * My favorite RegEx tool is [https://regex101.com](https://regex101.com).
97 | *
98 | * Please note that RegEx is can be difficult to understand.
99 | * Just ignore this bit if you are unsure.
100 | *
101 | * ### Some noteworthy difficult lines
102 | * _As instances:_
103 | * ```javascript
104 | * #278= IFCPROPERTYSINGLEVALUE('Structural',$,IFCBOOLEAN(.F.),$);
105 | * #261= IFCWALLTYPE('1F6umJ5H50aeL3A1As_wV9',#42,'Basic Wall:Bearing Wall',$,$,(#332,#334,#336,#338,#340,#343,#346,#349,#352,#355,#359,#363,#370),$,'346781',$,.STANDARD.);
106 | * #121= IFCPROJECT('2nxdYR2RHCDBiKJulbA_QU',#42,'// PROJECT/NUMBER //',$,$,'// PROJECT/NAME //','// PROJECT/STATUS //',(#113),#108);
107 | * #228= IFCQUANTITYLENGTH('Height',$,$,4000.);
108 | * #754= IFCPROPERTYSINGLEVALUE('AboveGround',$,IFCLOGICAL(.U.),$);
109 | * #652= IFCPROPERTYSINGLEVALUE('Thermal Resistance (R)',$,IFCREAL(0.270116960643959),$);
110 | * ```
111 | * _As attribute strings:_
112 | * ```javascript
113 | * 'Structural',$,IFCBOOLEAN(.F.),$)
114 | * '1F6umJ5H50aeL3A1As_wV9',#42,'Basic Wall:Bearing Wall',$,$,(#332,#334,#336,#338,#340,#343,#346,#349,#352,#355,#359,#363,#370),$,'346781',$,.STANDARD.
115 | * '2nxdYR2RHCDBiKJulbA_QU',#42,'// PROJECT/NUMBER //',$,$,'// PROJECT/NAME //','// PROJECT/STATUS //',(#113),#108
116 | * 'Height',$,$,4000.
117 | * 'AboveGround',$,IFCLOGICAL(.U.),$
118 | * 'Thermal Resistance (R)',$,IFCREAL(0.270116960643959),$
119 | * ```
120 | *
121 | * There are at least five different things to consider:
122 | * 1. "Function"
123 | * 2. Indefinite attribute
124 | * 3. Nested attribute
125 | * 4. References
126 | * 5. Integers
127 | *
128 | * ### 1. Functions
129 | * Example:
130 | *
131 | * ```javascript
132 | * IFCIDENTIFIER('Outside door')
133 | * IFCTHERMALTRANSMITTANCEMEASURE(3.7021)
134 | * IFCTEXT('')
135 | * IFCLOGICAL(.U.)
136 | * ```
137 | *
138 | * For the sake of simplicity, let's call and treat these as JavaScript functions.
139 | * Note that each function has different ways to pass in parameters.
140 | * Some parameters are enclosed with apostrophe, and some are not.
141 | *
142 | * We need a RegEx that takes this into consideration.
143 | * The simplest form is:
144 | * `[A-Z]+\('[a-zA-z_ ]+'\)`
145 | *
146 | * Let's take the first function `IFCIDENTIFIER('Outside door')` as an example.
147 | * The RegEx will find us the name of the function...
148 | *
149 | * However, this is to no good use yet.
150 | * We need to capture both the _function name_ and the _parameters_, i.e. __IFCIDENTIFIER__ and __Outside door__
151 | *
152 | * Our RegEx now becomes: `([A-Z]+\()'([a-zA-z_ ]+)'\)`
153 | * It is crucial that you understand what this RegEx mean... it will only get more difficult from here.
154 | *
155 | * Anyways, we can substitute our string using the expression `$1$2)`.
156 | *
157 | * __UPDATE:__ This approach has been replaced with a new one.
158 | * See [Issue #4](https://github.com/andrewisen/bim-whale/issues/4) for more information.
159 | *
160 | * ### 2. Indefinite attribute
161 | * Example: `#764= IFCRELDEFINESBYPROPERTIES('0Jv9wzDiT2Fx3l2pN5PrZ7',#42,$,$,(#140),#752);`
162 | *
163 | * _Indefinite attribute_ are parameters that has not been assigned. These are represented with a dollar sign (__$__).
164 | * Note that a dollar sign might appear in the UIID, e.g. `2HlE6XRD5D2u$q88QiyvCI`
165 | *
166 | * One can simply assume that _indefinite attributes_ __ALWAYS__ begins with a comma (and not a character).
167 | *
168 | * __UPDATE:__ This approach has been replaced with a new one.
169 | * See [Issue #4](https://github.com/andrewisen/bim-whale/issues/4) for more information.
170 | *
171 | * ### 3. Nested attribute
172 | * Example: `#810= IFCPROPERTYSET('0eCyo1mQf61RRDb8LkFhbB',#42,'Other',$,(#781,#782,#783,#784,#785));`
173 | *
174 | * The _nested attributes_ are the ones enclosed by parentheses, i.e. __#781,#782,#783,#784,#785__.
175 | * We need enclose them with square brackets.
176 | *
177 | * ### 4. References
178 | * Example: `#219= IFCWALLSTANDARDCASE('1F6umJ5H50aeL3A1As_wTm',#42,'Basic Wall:Bearing Wall:346660',$,'Basic Wall:Bearing Wall',#188,#215,'346660');`
179 | *
180 | * The _wall entity_ is referencing the entities __188__ and __215__.
181 | * These references need to be enclosed by quotations marks.
182 | *
183 | * Please note that references inside _nested attributes_ also need to be enclosed (see example above).
184 | *
185 | * ### 5. Integers
186 | * Example: `#572= IFCDOOR('1F6umJ5H50aeL3A1As_wUF',#42,'M_Single-Flush:Outside door:346843',$,'M_Single-Flush:Outside door',#938,#566,'346843',2134.,915.);`
187 | *
188 | * The last two parameters are integers; __2134.__, __915.__.
189 | * Note that the zero is omitted in these cases.
190 | */
191 | function parseStepEntityInstanceAttributes(attributeString, entityName, globalId, hasFunction, functionParameter) {
192 | var _a, _b;
193 | if (globalId === void 0) { globalId = ""; }
194 | if (hasFunction === void 0) { hasFunction = false; }
195 | if (functionParameter === void 0) { functionParameter = ""; }
196 | // Used for error logging
197 | var originalAttributeString = attributeString;
198 | // A. Deconstruct the GlobalId (GUID)
199 | (_a = deconstructGlobalId(originalAttributeString, entityName, globalId), attributeString = _a.attributeString, globalId = _a.globalId);
200 | // B. RegEx edge case
201 | attributeString = addCommas(attributeString);
202 | // C. Deconstruct function
203 | (_b = deconstructFunction(attributeString, hasFunction, functionParameter), attributeString = _b.attributeString, functionParameter = _b.functionParameter, hasFunction = _b.hasFunction);
204 | /**
205 | * PARSE
206 | */
207 | attributeString = parse(attributeString);
208 | // C. Construct function
209 | attributeString = constructFunction(attributeString, entityName, hasFunction, functionParameter);
210 | // B. RegEx edge case
211 | attributeString = removeCommas(attributeString);
212 | globalId = removeCommas(globalId);
213 | // A. Construct GlobalId (GUID)
214 | attributeString = constructGlobalId(entityName, attributeString, globalId);
215 | /**
216 | * WIP
217 | */
218 | var parsedAttributes = [];
219 | try {
220 | parsedAttributes = JSON.parse("[" + attributeString + "]");
221 | }
222 | catch (error) {
223 | console.log("Parsing error:");
224 | console.log("In:", originalAttributeString);
225 | console.log("Out:", attributeString);
226 | console.log(" ");
227 | parsedAttributes = ["N/A"];
228 | }
229 | return parsedAttributes;
230 | }
231 | /**
232 | * Deconstructs the GlobalId (GUID)
233 | * The function {@link constructGlobalId} will add back the GlobalId.
234 | *
235 | * Edge case for `IfcPropertySingleValue`
236 | *
237 | * Example: #77331= IFCSLAB('3V$FMCDUfCoPwUaHMPfteW',#48,'Pad:Pad 1:130737',$,'Pad:Pad 1',#77294,#77329,'130737',.FLOOR.);
238 | *
239 | * Notice that the GlobalId contains a dollar sign.
240 | * The regEx that deals with dollar signs will take the GlobalId into consideration.
241 | * Let's ignore the GloablId for now, in order to make the parsing somewhat easier.
242 | *
243 | * WIP
244 | *
245 | * @param attributeString
246 | * @param entityName
247 | * @param globalId
248 | */
249 | var deconstructGlobalId = function (attributeString, entityName, globalId) {
250 | if (entityName !== "IFCPROPERTYSINGLEVALUE") {
251 | globalId = attributeString.substr(0, attributeString.indexOf(","));
252 | // The attributeString will NOT contain the GlobalID.
253 | attributeString = attributeString.substr(attributeString.indexOf(","));
254 | // We will add back the GlobalID later
255 | }
256 | return { attributeString: attributeString, globalId: globalId };
257 | };
258 | /**
259 | * Constructs the GlobalId(GUID) from {@link deconstructGlobalId}
260 | *
261 | * @param entityName
262 | * @param attributeString
263 | * @param globalId
264 | */
265 | var constructGlobalId = function (entityName, attributeString, globalId) {
266 | if (entityName !== "IFCPROPERTYSINGLEVALUE") {
267 | attributeString = '"' + globalId + '"' + attributeString;
268 | }
269 | return attributeString;
270 | };
271 | /**
272 | * Edge case for RegEx. In normal cases, we must add an edge case for the beginning and end of the string.
273 | * E.g. `GlobalId,OwnerHistory,Name,Description`
274 | *
275 | * Let's say that we want to parse the _description_.
276 | * Notice that the string DO NOT end with a comma.
277 | * In this particular case, we need to add an edge case.
278 | *
279 | * We do not need this edge case if we add commas before and after the string.
280 | * @param attributeString
281 | */
282 | var addCommas = function (attributeString) {
283 | return "," + attributeString + ",";
284 | };
285 | /**
286 | * Construct RegEx
287 | * @param attributeString
288 | */
289 | var removeCommas = function (attributeString) {
290 | return attributeString.slice(1, -1);
291 | };
292 | /**
293 | * Deconstruct a function inside an attribute string.
294 | * The function {@link constructFunction} will add the function back.
295 | *
296 | * E.g. `...,IFCTEXT('Hello World'),...`
297 | *
298 | * The function `IFCTEXT` has the parameter `'Hello World'`.
299 | * Notice that some parameters are enclosed by apostrophes.
300 | *
301 | * @param attributeString
302 | * @param hasFunction
303 | * @param functionParameter
304 | */
305 | var deconstructFunction = function (attributeString, hasFunction, functionParameter) {
306 | /**
307 | * Check if the attribute string has a "function" (see above for example)
308 | */
309 | functionParameter = /(IFC[A-Z]+\()(.*)(\)\,)/g.exec(attributeString);
310 | if (functionParameter) {
311 | hasFunction = true;
312 | functionParameter = parseFunctionParameter(functionParameter[2]);
313 | // Replace the parameter with the phrase: {PARAM}
314 | attributeString = attributeString.replace(/(IFC[A-Z]+\()(.*)(\)\,)/g, '"$1{PARAM})",');
315 | }
316 | return { attributeString: attributeString, functionParameter: functionParameter, hasFunction: hasFunction };
317 | };
318 | /**
319 | * Constructs the function from {@link deconstructFunction}
320 | *
321 | * @param attributeString
322 | * @param entityName
323 | * @param hasFunction
324 | * @param functionParameter
325 | */
326 | var constructFunction = function (attributeString, entityName, hasFunction, functionParameter) {
327 | if (hasFunction) {
328 | if (entityName !== "IFCPROPERTYSINGLEVALUE") {
329 | attributeString = attributeString.replace(/(IFC[A-Z]+\()(\{PARAM\})(\)\"\,)/g, "$1" + functionParameter + ')",');
330 | }
331 | else {
332 | attributeString = attributeString.replace(/(IFC[A-Z]+\()(\{PARAM\})(\)\"\,)/g, functionParameter.replace(/^\'(.+)\'/g, "$1") + '",');
333 | }
334 | }
335 | return attributeString;
336 | };
337 | /**
338 | * Parse a regular attribute string
339 | *
340 | * @param attributeString
341 | */
342 | var parse = function (attributeString) {
343 | return attributeString
344 | .replace(/\\/g, "") // Backward slashes
345 | .replace(/\//g, "\\/") // Forward slashes
346 | .replace(/\$/g, '"$"') // Indefinite attributes
347 | .replace(/(^|,)\((#\d+.*?)\)/g, "$1[$2]") // Nested attributes
348 | .replace(/([,\[])(#\d+)+/g, '$1"$2"') // References to other entities (e.g. #123)
349 | .replace(/,(\d+[.]\d*)/g, ",'$1'") // Integers (that are not escaped)
350 | .replace(/(\(|\,)(\..+\.)(\)|\,)/g, "$1'$2'$3") // ".T.", ".F.", ".UNDEFINED.", etc.
351 | .replace(/'/g, '"'); // Convert all remaining apostrophes to quotes
352 | };
353 | /**
354 | * Parse a function parameter.
355 | * The entire function parameter will be enclosed with quotes.
356 | *
357 | * No need to be as detailed as the {@link parse} function.
358 | *
359 | * @param functionParameter
360 | */
361 | var parseFunctionParameter = function (functionParameter) {
362 | return functionParameter
363 | .replace(/\\/g, "") // Backward slashes
364 | .replace(/\//g, "\\/") // Forward slashes
365 | .replace(/\"/g, '\\"'); // Quotation marks
366 | };
367 | // Underscore is used to distinguish this function as a method that belongs to StepFile
368 |
369 |
370 | ;// CONCATENATED MODULE: ./src/step-parser/functions/get-step-attributes.ts
371 |
372 | // Get STEP Attributes, e.g. '1F6...',#42,'M_Single-Flush...',$,...`
373 | var getStepAttributes = function (_) {
374 | var line = _.line;
375 | var entityInstance = _.entityInstance;
376 | return parseStepEntityInstanceAttributes(line.substring(entityInstance.entityStartIndex + 1, line.length - 2), entityInstance.entityName);
377 | };
378 |
379 |
380 | ;// CONCATENATED MODULE: ./src/step-parser/functions/set-step-attributes.ts
381 | // Set STEP Attributes, e.g. '1F6...',#42,'M_Single-Flush...',$,...`
382 | var setStepAttributes = function (_) {
383 | var line = _.line, parsedAttributes = _.parsedAttributes;
384 | var entityInstance = _.entityInstance;
385 | entityInstance.attributes = {
386 | parsed: parsedAttributes,
387 | };
388 | };
389 |
390 |
391 | ;// CONCATENATED MODULE: ./src/step-parser/methods/generate-step-entity-instance.ts
392 | // Functions
393 |
394 |
395 |
396 |
397 | /**
398 | * Generate a __STEP Entity Instance object__, herby denoted as a `Entity Instance`.
399 | *
400 | * __Example:__
401 | * ```#572= IFCDOOR('1F6umJ5H50aeL3A1As_wUF',#42,'M_Single-Flush:Outside door:346843',$,'M_Single-Flush:Outside door',#938,#566,'346843',2134.,915.);```
402 | *
403 | * Each `Entity Instance` will have a:
404 | * - Instance Name, `#572`
405 | * - Entity Name, `IFCDOOR`
406 | * - Attribute(s) `'1F6...',#42,'M_Single-Flush...',$,...`
407 | *
408 | * Yes, the terminology can be a bit confusing...
409 | *
410 | * Anyways, getting the _Instance Name_ and _Entity Name_ is fairly straight forward.
411 | * However, getting the attributes can be a bit tricky.
412 | * The function {@link parseStepEntityInstanceAttributes} will help us with that.
413 | */
414 | function _generateStepEntityInstance(line) {
415 | // Initialize STEP Entity Instance object
416 | var entityInstance = {
417 | // Instance
418 | instanceStartIndex: 0,
419 | instanceEndIndex: line.indexOf("="),
420 | instanceName: "",
421 | // Entity
422 | entityStartIndex: line.indexOf("("),
423 | entityEndIndex: -1,
424 | entityName: "",
425 | };
426 | // Instance Name, eg. #572
427 | setStepInstanceName({
428 | line: line,
429 | entityInstance: entityInstance,
430 | });
431 | // Entity Name, e.g. IFCDOOR
432 | setStepEntityName({
433 | line: line,
434 | entityInstance: entityInstance,
435 | });
436 | // Check if Entity Name, e.g. IFCDOOR, should be parsed
437 | if (entityInstance.entityName in this.allEntities === false)
438 | return;
439 | // Getting the attributes can be a bit tricky. getStepAttributes() will help us
440 | var parsedAttributes = getStepAttributes({
441 | line: line,
442 | entityInstance: entityInstance,
443 | });
444 | // Save parsed attributes, e.g. [['1F6...'],[#42],['M_Single-Flush...'],['$'],[...]]
445 | setStepAttributes({
446 | line: line,
447 | entityInstance: entityInstance,
448 | parsedAttributes: parsedAttributes,
449 | });
450 | return entityInstance;
451 | }
452 | // Underscore is used to distinguish this function as a method that belongs to StepFile
453 |
454 |
455 | ;// CONCATENATED MODULE: ./src/step-parser/methods/save-step-entity-instance.ts
456 | /**
457 | * TODO:
458 | *
459 | * @param this {@link StepFile}
460 | * @param entityInstance
461 | */
462 | function _saveStepEntityInstance(entityInstance) {
463 | var _a, _b;
464 | if (entityInstance.entityName in this.requiredEntities) {
465 | // We need to distinguish the REQUIRED ENTITIES from each other.
466 | // In other words;
467 | // - all IfcPropertySingleValue entities are stored in IFCPROPERTYSINGLEVALUE
468 | // - all IfcRelDefinesByProperties entities are stored in IFCRELDEFINESBYPROPERTIES
469 | // - all IfcPropertySet entities are stored in IFCPROPERTYSET
470 | Object.assign(this.entityInstances[this.requiredEntities[entityInstance.entityName]], (_a = {},
471 | _a[entityInstance.instanceName] = {
472 | entityName: entityInstance.entityName,
473 | attributes: entityInstance.attributes,
474 | },
475 | _a));
476 | }
477 | else {
478 | Object.assign(this.entityInstances.genericEntityInstances, (_b = {},
479 | // We DO NOT need to distinguish the these entities from each other.
480 | // They are simply referred to as: Generic Entity Instances
481 | //
482 | // These generic entity instances are found on the interoperability layer within the IFC schema.
483 | // Mainly IfcSharedBldgElements, e.g. doors, windows, walls, floors, etc.
484 | _b[entityInstance.instanceName] = {
485 | entityName: this.selectedEntities[entityInstance.entityName],
486 | instanceName: entityInstance.instanceName,
487 | attributes: entityInstance.attributes,
488 | properties: {},
489 | },
490 | _b));
491 | }
492 | }
493 | // Underscore is used to distinguish this function as a method that belongs to StepFile
494 |
495 |
496 | ;// CONCATENATED MODULE: ./src/step-parser/step-parser.ts
497 |
498 |
499 |
500 | /**
501 | * ## STEP FILE
502 | *
503 | * This class deals with [Standard for the Exchange of Product model data (STEP)](https://en.wikipedia.org/wiki/ISO_10303).
504 | * More specific, this class parses a [STEP-file](https://en.wikipedia.org/wiki/ISO_10303-21).
505 | *
506 | * To clarify:
507 | * - [STEP](https://en.wikipedia.org/wiki/ISO_10303) refers to the ISO 10303 standard.
508 | * - [STEP-file](https://en.wikipedia.org/wiki/ISO_10303-21) is the actual file format (used in ISO 10303)
509 | *
510 | * This class will handle the so-called "encoding mechanism that represents data".
511 | *
512 | * In layman's terms:
513 | * An `IFC File` is actually a [STEP-file](https://en.wikipedia.org/wiki/ISO_10303-21) behind the scenes.
514 | *
515 | * This class will open the `IFC File` and treat is as a `STEP-file`(!).
516 | * The method {@link _generateStepEntityInstance | generateStepEntityInstance } will create a so-called `step instance` from each line in the file.
517 | *
518 | * The parent/super class {@link IfcFile } will take the generated `step instances` and build the relationships between objects.
519 | * This relationship has nothing to do with STEP.
520 | * No, the relationship is expressed in the [IFC2x3 TC1 schema](https://standards.buildingsmart.org/IFC/RELEASE/IFC2x3/TC1/HTML/).
521 | *
522 | * That's why we have two different classes; StepFile & IfcFile
523 | *
524 | * To summarize:
525 | * - `StepFile` builds the data (according to ISO 10303-21)
526 | * - `IfcFile` builds the relationship (according to the IFC2x3 TC1 schema)
527 | */
528 | var StepFile = /** @class */ (function () {
529 | /**
530 | * Builds the {@link entities} object from the config parameter.
531 | *
532 | * Creates empty objects for each required entity.
533 | * The rest (i.e. {@link selectedEntities}) are treated as a `generic entity`.
534 | *
535 | * Example:
536 | * ```javascript
537 | * this.entityInstances = {
538 | * IFCPROPERTYSINGLEVALUE = {},
539 | * IFCRELDEFINESBYPROPERTIES = {},
540 | * IFCPROPERTYSET = {},
541 | * ...
542 | * genericEntities = {}
543 | * }
544 | * ```
545 | */
546 | function StepFile(lines, config) {
547 | var _this = this;
548 | /**
549 | * See {@link _parseStepFile}
550 | */
551 | this.parseStepFile = _parseStepFile; // START HERE
552 | /**
553 | * See {@link _generateStepEntityInstance }
554 | */
555 | this.generateStepEntityInstance = _generateStepEntityInstance;
556 | /**
557 | * See {@link _saveStepEntityInstance }
558 | */
559 | this.saveStepEntityInstance = _saveStepEntityInstance;
560 | this.lines = lines;
561 | this.entityInstances = {}; // Needs to be initialized as an empty object
562 | // Config
563 | this.requiredEntities = config.requiredEntities;
564 | this.selectedEntities = config.selectedEntities;
565 | this.selectedPropertySets = config.selectedPropertySets;
566 | this.allEntities = config.allEntities;
567 | // Generate an empty object for each required entity
568 | Object.values(config.requiredEntities).forEach(function (entity) {
569 | var _a;
570 | Object.assign(_this.entityInstances, (_a = {}, _a[entity] = {}, _a));
571 | });
572 | // The non-required entities (e.g. IfcWall, IfcDoor) are treated as Generic Entity Instances
573 | Object.assign(this.entityInstances, { genericEntityInstances: {} });
574 | }
575 | return StepFile;
576 | }());
577 |
578 |
579 | ;// CONCATENATED MODULE: ./src/ifc-parser/methods/_parse-ifc-file.ts
580 | /**
581 | * Iterates over each line.
582 | * Only include the so-called __DATA section__.
583 | * One can assume that each line will contain an equal sign (=).
584 | *
585 | * __Example:__
586 | * ```#572= IFCDOOR('...');```
587 | *
588 | */
589 | function _parseIfcFile() {
590 | this.parseStepFile(); // Inherited from the class StepFile
591 | this.mapPropertySingleValuesToPropertySet();
592 | this.mapPropertySetsToGenericEntities();
593 | return this.entityInstances.genericEntityInstances;
594 | }
595 | // Underscore is used to distinguish this function as a method that belongs to IfcFile
596 |
597 |
598 | ;// CONCATENATED MODULE: ./src/ifc-parser/methods/map-property-single-values-to-property-set.ts
599 | /**
600 | * Map {@link IfcPropertySingleValue | Property Single Values} to {@link IfcPropertySet | Property Set}
601 | *
602 | * Example: `#370= IFCPROPERTYSET('2WRKEbxzHDcwyFLp2OWZN6',#42,'Custom_Pset',$,(#365,#366,#367,#368,#369));`
603 | *
604 | * The property set *Custom_Pset* has the properties:
605 | * - #365
606 | * - #366
607 | * - #367
608 | * - #368
609 | * - #369
610 | *
611 | * Note that the entity {@link IfcPropertySet | Property Set} only holds __references__ to the {@link IfcPropertySingleValue | properties}.
612 | * We need to include these explicit. In other words, we need to populate the references with their values.
613 | *
614 | * - #365: TypeMark = "..."
615 | * - #366: Keynote = "..."
616 | * - #367: TypeDescription = "..."
617 | * - #368: Width = "..."
618 | * - #369: Hyperlink = "..."
619 | *
620 | */
621 | function _mapPropertySingleValuesToPropertySet() {
622 | var _this_1 = this;
623 | Object.values(this.entityInstances.IfcPropertySet).forEach(function (ifcPropertySet) {
624 | // ENTITY IfcPropertySet; HasProperties : SET [1:?] OF IfcProperty;
625 | var hasProperties = getHasPropertiesReferences(ifcPropertySet);
626 | var ifcProperties = getIfcProperties(_this_1, hasProperties);
627 | mapProperties(ifcPropertySet, ifcProperties);
628 | });
629 | }
630 | /**
631 | * TODO
632 | * @param ifcPropertySet
633 | */
634 | var getHasPropertiesReferences = function (ifcPropertySet) {
635 | var ifcPropertySetAttributes = ifcPropertySet.attributes.parsed;
636 | return ifcPropertySetAttributes[4];
637 | };
638 | /**
639 | * TODO
640 | * @param _this
641 | * @param hasProperties
642 | */
643 | var getIfcProperties = function (_this, hasProperties) {
644 | var properties = {};
645 | hasProperties.forEach(function (reference) {
646 | var _a = (_this.entityInstances.IfcPropertySingleValue[reference] || {}).attributes, _b = _a === void 0 ? {
647 | parsed: undefined,
648 | } : _a, ifcPropertySingleValueAttributes = _b.parsed;
649 | if (ifcPropertySingleValueAttributes !== "undefined") {
650 | properties[ifcPropertySingleValueAttributes[0]] =
651 | ifcPropertySingleValueAttributes[2];
652 | }
653 | });
654 | return properties;
655 | };
656 | /**
657 | * TODO
658 | * @param ifcPropertySet
659 | */
660 | var getIfcPropertySetName = function (ifcPropertySet) {
661 | var ifcPropertySetAttributes = ifcPropertySet.attributes.parsed;
662 | return ifcPropertySetAttributes[2];
663 | };
664 | /**
665 | * TODO
666 | * @param ifcPropertySet
667 | * @param ifcProperties
668 | */
669 | var mapProperties = function (ifcPropertySet, ifcProperties) {
670 | var name = getIfcPropertySetName(ifcPropertySet);
671 | Object.assign(ifcPropertySet, {
672 | ifcPropertySetName: name,
673 | ifcPropertySet: ifcProperties,
674 | });
675 | };
676 | // Underscore is used to distinguish this function as a method that belongs to IfcFile
677 |
678 |
679 | ;// CONCATENATED MODULE: ./src/ifc-parser/methods/map-property-sets-to-generic-entities.ts
680 | /**
681 | * Map {@link IfcPropertySet | Property Set} to {@link IfcBuildingElement | a generic enitiy} using an {@link IfcRelDefinesByProperties | objectified relationship}.
682 | * The method {@link _mapPropertySingleValuesToPropertySet } has already created all `Property Set` objects.
683 | * Now, we need to populate each {@link IfcBuildingElement | generic enitiy} with `Property Sets`.
684 | */
685 | function _mapPropertySetsToGenericEntities() {
686 | var _this_1 = this;
687 | var filterPropertySets = this.selectedPropertySets.length > 0 ? true : false;
688 | var selectedPropertySets = this.selectedPropertySets;
689 | Object.values(this.entityInstances.IfcRelDefinesByProperties).forEach(function (ifcRelDefinesByProperties) {
690 | // ENTITY IfcRelDefines; RelatedObjects : SET [1:?] OF IfcObject;
691 | var relatedObjects = getRelatedObjectsReferences(ifcRelDefinesByProperties);
692 | var ifcObject = getIfcObjects(_this_1, relatedObjects);
693 | // Skip object if undefined or not in selectedPropertySets
694 | if (skipObject(ifcObject, filterPropertySets, selectedPropertySets))
695 | return;
696 | // ENTITY IfcRelDefinesByProperties; RelatingPropertyDefinition : IfcPropertySetDefinition;
697 | var relatingPropertyDefinition = getRelatingPropertyDefinition(ifcRelDefinesByProperties);
698 | var ifcPropertySetDefinition = getIfcPropertySetDefinition(_this_1, relatingPropertyDefinition);
699 | // Ignoring things like: IfcSite, IfcBuildingStorey, IfcBuilding, etc.
700 | if (ifcPropertySetDefinition === undefined)
701 | return;
702 | mapPropertySet(ifcObject, ifcPropertySetDefinition);
703 | });
704 | }
705 | /**
706 | * TODO
707 | * @param ifcRelDefinesByProperties
708 | */
709 | var getRelatedObjectsReferences = function (ifcRelDefinesByProperties) {
710 | var ifcRelDefinesByPropertiesAttributes = ifcRelDefinesByProperties.attributes.parsed;
711 | return ifcRelDefinesByPropertiesAttributes[5];
712 | };
713 | /**
714 | * TODO
715 | * @param _this
716 | * @param relatedObjects
717 | */
718 | var getIfcObjects = function (_this, relatedObjects) {
719 | var _a = _this.entityInstances.IfcPropertySet[relatedObjects] || {}, _b = _a.ifcPropertySetName, name = _b === void 0 ? undefined : _b, _c = _a.ifcPropertySet, ifcPropertySet = _c === void 0 ? undefined : _c;
720 | if (name === undefined)
721 | return;
722 | return { name: name, ifcPropertySet: ifcPropertySet };
723 | };
724 | /**
725 | * TODO
726 | * @param ifcObject
727 | * @param filterPropertySets
728 | * @param selectedPropertySets
729 | */
730 | var skipObject = function (ifcObject, filterPropertySets, selectedPropertySets) {
731 | if (ifcObject === undefined)
732 | return true;
733 | if (filterPropertySets) {
734 | if (selectedPropertySets.includes(ifcObject.name) === false)
735 | return true;
736 | }
737 | return false;
738 | };
739 | /**
740 | * TODO
741 | * @param ifcRelDefinesByProperties
742 | */
743 | var getRelatingPropertyDefinition = function (ifcRelDefinesByProperties) {
744 | var ifcRelDefinesByPropertiesAttributes = ifcRelDefinesByProperties.attributes.parsed;
745 | return ifcRelDefinesByPropertiesAttributes[4];
746 | };
747 | /**
748 | * TODO
749 | * @param _this
750 | * @param ifcRelDefinesByProperties
751 | */
752 | var getIfcPropertySetDefinition = function (_this, ifcRelDefinesByProperties) {
753 | var _a =
754 | // Reference to related object (i.e. a generic IFC entity)
755 | (_this.entityInstances.genericEntityInstances[ifcRelDefinesByProperties[0]] || {}).properties, ifcPropertySetDefinition = _a === void 0 ? undefined : _a;
756 | return ifcPropertySetDefinition;
757 | };
758 | /**
759 | * TODO
760 | * @param ifcObject
761 | * @param ifcPropertySetDefinition
762 | */
763 | var mapPropertySet = function (ifcObject, ifcPropertySetDefinition) {
764 | var _a;
765 | Object.assign(ifcPropertySetDefinition, (_a = {},
766 | _a[ifcObject.name] = ifcObject.ifcPropertySet,
767 | _a));
768 | };
769 | // Underscore is used to distinguish this function as a method that belongs to IfcFile
770 |
771 |
772 | ;// CONCATENATED MODULE: ./src/ifc-parser/ifc-parser.ts
773 | var __extends = (undefined && undefined.__extends) || (function () {
774 | var extendStatics = function (d, b) {
775 | extendStatics = Object.setPrototypeOf ||
776 | ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
777 | function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
778 | return extendStatics(d, b);
779 | };
780 | return function (d, b) {
781 | extendStatics(d, b);
782 | function __() { this.constructor = d; }
783 | d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
784 | };
785 | })();
786 |
787 |
788 |
789 |
790 | /**
791 | * ## IFC FILE
792 | *
793 | * The class {@link StepFile} only handles [ISO 10303-21](https://en.wikipedia.org/wiki/ISO_10303-21).
794 | * ISO 10303-21 is only responsible for the encoding mechanism that represents data.
795 | *
796 | * __IFC2x3 TC1__ is the actual schema of interest.
797 | * The full specification can be found [here](https://standards.buildingsmart.org/IFC/RELEASE/IFC2x3/TC1/HTML/).
798 | *
799 | * In summary, this class will only handle parsing related to IFC.
800 | */
801 | var IfcFile = /** @class */ (function (_super) {
802 | __extends(IfcFile, _super);
803 | function IfcFile() {
804 | var _this = _super !== null && _super.apply(this, arguments) || this;
805 | /**
806 | * See {@link _mapPropertySingleValuesToPropertySet}
807 | */
808 | _this.mapPropertySingleValuesToPropertySet = _mapPropertySingleValuesToPropertySet;
809 | /**
810 | * See {@link _mapPropertySetsToGenericEntities}
811 | */
812 | _this.mapPropertySetsToGenericEntities = _mapPropertySetsToGenericEntities;
813 | /**
814 | * See {@link _parseStepFile}
815 | */
816 | _this.parseIfcFile = _parseIfcFile; // START HERE
817 | return _this;
818 | }
819 | return IfcFile;
820 | }(StepFile));
821 |
822 |
823 | ;// CONCATENATED MODULE: ./webpack.ts
824 |
825 |
826 |
827 | /***/ })
828 |
829 | /******/ });
830 | /************************************************************************/
831 | /******/ // The module cache
832 | /******/ var __webpack_module_cache__ = {};
833 | /******/
834 | /******/ // The require function
835 | /******/ function __webpack_require__(moduleId) {
836 | /******/ // Check if module is in cache
837 | /******/ if(__webpack_module_cache__[moduleId]) {
838 | /******/ return __webpack_module_cache__[moduleId].exports;
839 | /******/ }
840 | /******/ // Create a new module (and put it into the cache)
841 | /******/ var module = __webpack_module_cache__[moduleId] = {
842 | /******/ // no module.id needed
843 | /******/ // no module.loaded needed
844 | /******/ exports: {}
845 | /******/ };
846 | /******/
847 | /******/ // Execute the module function
848 | /******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
849 | /******/
850 | /******/ // Return the exports of the module
851 | /******/ return module.exports;
852 | /******/ }
853 | /******/
854 | /************************************************************************/
855 | /******/ /* webpack/runtime/define property getters */
856 | /******/ (() => {
857 | /******/ // define getter functions for harmony exports
858 | /******/ __webpack_require__.d = (exports, definition) => {
859 | /******/ for(var key in definition) {
860 | /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
861 | /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
862 | /******/ }
863 | /******/ }
864 | /******/ };
865 | /******/ })();
866 | /******/
867 | /******/ /* webpack/runtime/hasOwnProperty shorthand */
868 | /******/ (() => {
869 | /******/ __webpack_require__.o = (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop)
870 | /******/ })();
871 | /******/
872 | /******/ /* webpack/runtime/make namespace object */
873 | /******/ (() => {
874 | /******/ // define __esModule on exports
875 | /******/ __webpack_require__.r = (exports) => {
876 | /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
877 | /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
878 | /******/ }
879 | /******/ Object.defineProperty(exports, '__esModule', { value: true });
880 | /******/ };
881 | /******/ })();
882 | /******/
883 | /************************************************************************/
884 | /******/ // module exports must be returned from runtime so entry inlining is disabled
885 | /******/ // startup
886 | /******/ // Load entry module and return exports
887 | /******/ return __webpack_require__(310);
888 | /******/ })()
889 | ;
--------------------------------------------------------------------------------
/tests/SimpleWall.ifc:
--------------------------------------------------------------------------------
1 | ISO-10303-21;
2 | HEADER;
3 |
4 | /******************************************************************************************
5 | * STEP Physical File produced by: The EXPRESS Data Manager Version 5.02.0100.07 : 28 Aug 2013
6 | * Module: EDMstepFileFactory/EDMstandAlone
7 | * Creation date: Wed Oct 28 18:06:27 2020
8 | * Host: desktop
9 | * Database: C:\Users\andre\AppData\Local\Temp\1d5c9ec4-3372-4075-8f09-942daf5120f6\c6a3f380-df47-414e-a6ff-0f212625bc9d\ifc
10 | * Database version: 5507
11 | * Database creation date: Wed Oct 28 18:06:26 2020
12 | * Schema: IFC2X3
13 | * Model: DataRepository.ifc
14 | * Model creation date: Wed Oct 28 18:06:26 2020
15 | * Header model: DataRepository.ifc_HeaderModel
16 | * Header model creation date: Wed Oct 28 18:06:26 2020
17 | * EDMuser: sdai-user
18 | * EDMgroup: sdai-group
19 | * License ID and type: 5605 : Permanent license. Expiry date:
20 | * EDMstepFileFactory options: 020000
21 | ******************************************************************************************/
22 | FILE_DESCRIPTION(('ViewDefinition [CoordinationView_V2.0, QuantityTakeOffAddOnView]'),'2;1');
23 | 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','');
24 | FILE_SCHEMA(('IFC2X3'));
25 | ENDSEC;
26 |
27 | DATA;
28 | #1= IFCORGANIZATION($,'Autodesk Revit 2021 (ENU)',$,$,$);
29 | #5= IFCAPPLICATION(#1,'2021','Autodesk Revit 2021 (ENU)','Revit');
30 | #6= IFCCARTESIANPOINT((0.,0.,0.));
31 | #9= IFCCARTESIANPOINT((0.,0.));
32 | #11= IFCDIRECTION((1.,0.,0.));
33 | #13= IFCDIRECTION((-1.,0.,0.));
34 | #15= IFCDIRECTION((0.,1.,0.));
35 | #17= IFCDIRECTION((0.,-1.,0.));
36 | #19= IFCDIRECTION((0.,0.,1.));
37 | #21= IFCDIRECTION((0.,0.,-1.));
38 | #23= IFCDIRECTION((1.,0.));
39 | #25= IFCDIRECTION((-1.,0.));
40 | #27= IFCDIRECTION((0.,1.));
41 | #29= IFCDIRECTION((0.,-1.));
42 | #31= IFCAXIS2PLACEMENT3D(#6,$,$);
43 | #32= IFCLOCALPLACEMENT(#149,#31);
44 | #35= IFCPERSON($,'//','//',('AUTHOR'),$,$,$,$);
45 | #38= IFCORGANIZATION($,'// ORGANIZATION/NAME //','// ORGANIZATION/DESCRIPTION //',$,$);
46 | #39= IFCPERSONANDORGANIZATION(#35,#38,$);
47 | #42= IFCOWNERHISTORY(#39,#5,$,.NOCHANGE.,$,$,$,1603900718);
48 | #43= IFCSIUNIT(*,.LENGTHUNIT.,.MILLI.,.METRE.);
49 | #44= IFCSIUNIT(*,.LENGTHUNIT.,$,.METRE.);
50 | #45= IFCSIUNIT(*,.AREAUNIT.,$,.SQUARE_METRE.);
51 | #46= IFCSIUNIT(*,.VOLUMEUNIT.,$,.CUBIC_METRE.);
52 | #47= IFCSIUNIT(*,.PLANEANGLEUNIT.,$,.RADIAN.);
53 | #48= IFCDIMENSIONALEXPONENTS(0,0,0,0,0,0,0);
54 | #49= IFCMEASUREWITHUNIT(IFCRATIOMEASURE(0.0174532925199433),#47);
55 | #50= IFCCONVERSIONBASEDUNIT(#48,.PLANEANGLEUNIT.,'DEGREE',#49);
56 | #51= IFCSIUNIT(*,.MASSUNIT.,.KILO.,.GRAM.);
57 | #52= IFCDERIVEDUNITELEMENT(#51,1);
58 | #53= IFCDERIVEDUNITELEMENT(#44,-3);
59 | #54= IFCDERIVEDUNIT((#52,#53),.MASSDENSITYUNIT.,$);
60 | #56= IFCDERIVEDUNITELEMENT(#44,4);
61 | #57= IFCDERIVEDUNIT((#56),.MOMENTOFINERTIAUNIT.,$);
62 | #59= IFCSIUNIT(*,.TIMEUNIT.,$,.SECOND.);
63 | #60= IFCSIUNIT(*,.FREQUENCYUNIT.,$,.HERTZ.);
64 | #61= IFCSIUNIT(*,.THERMODYNAMICTEMPERATUREUNIT.,$,.KELVIN.);
65 | #62= IFCSIUNIT(*,.THERMODYNAMICTEMPERATUREUNIT.,$,.DEGREE_CELSIUS.);
66 | #63= IFCDERIVEDUNITELEMENT(#51,1);
67 | #64= IFCDERIVEDUNITELEMENT(#61,-1);
68 | #65= IFCDERIVEDUNITELEMENT(#59,-3);
69 | #66= IFCDERIVEDUNIT((#63,#64,#65),.THERMALTRANSMITTANCEUNIT.,$);
70 | #68= IFCSIUNIT(*,.LENGTHUNIT.,.DECI.,.METRE.);
71 | #69= IFCDERIVEDUNITELEMENT(#44,3);
72 | #70= IFCDERIVEDUNITELEMENT(#59,-1);
73 | #71= IFCDERIVEDUNIT((#69,#70),.VOLUMETRICFLOWRATEUNIT.,$);
74 | #73= IFCSIUNIT(*,.ELECTRICCURRENTUNIT.,$,.AMPERE.);
75 | #74= IFCSIUNIT(*,.ELECTRICVOLTAGEUNIT.,$,.VOLT.);
76 | #75= IFCSIUNIT(*,.POWERUNIT.,$,.WATT.);
77 | #76= IFCSIUNIT(*,.FORCEUNIT.,.KILO.,.NEWTON.);
78 | #77= IFCSIUNIT(*,.ILLUMINANCEUNIT.,$,.LUX.);
79 | #78= IFCSIUNIT(*,.LUMINOUSFLUXUNIT.,$,.LUMEN.);
80 | #79= IFCSIUNIT(*,.LUMINOUSINTENSITYUNIT.,$,.CANDELA.);
81 | #80= IFCDERIVEDUNITELEMENT(#51,-1);
82 | #81= IFCDERIVEDUNITELEMENT(#44,-2);
83 | #82= IFCDERIVEDUNITELEMENT(#59,3);
84 | #83= IFCDERIVEDUNITELEMENT(#78,1);
85 | #84= IFCDERIVEDUNIT((#80,#81,#82,#83),.USERDEFINED.,'Luminous Efficacy');
86 | #86= IFCDERIVEDUNITELEMENT(#44,1);
87 | #87= IFCDERIVEDUNITELEMENT(#59,-1);
88 | #88= IFCDERIVEDUNIT((#86,#87),.LINEARVELOCITYUNIT.,$);
89 | #90= IFCSIUNIT(*,.PRESSUREUNIT.,$,.PASCAL.);
90 | #91= IFCDERIVEDUNITELEMENT(#44,-2);
91 | #92= IFCDERIVEDUNITELEMENT(#51,1);
92 | #93= IFCDERIVEDUNITELEMENT(#59,-2);
93 | #94= IFCDERIVEDUNIT((#91,#92,#93),.USERDEFINED.,'Friction Loss');
94 | #96= IFCDERIVEDUNITELEMENT(#51,1);
95 | #97= IFCDERIVEDUNITELEMENT(#44,1);
96 | #98= IFCDERIVEDUNITELEMENT(#59,-2);
97 | #99= IFCDERIVEDUNITELEMENT(#44,-1);
98 | #100= IFCDERIVEDUNIT((#96,#97,#98,#99),.LINEARFORCEUNIT.,$);
99 | #102= IFCDERIVEDUNITELEMENT(#51,1);
100 | #103= IFCDERIVEDUNITELEMENT(#44,1);
101 | #104= IFCDERIVEDUNITELEMENT(#59,-2);
102 | #105= IFCDERIVEDUNITELEMENT(#44,-2);
103 | #106= IFCDERIVEDUNIT((#102,#103,#104,#105),.PLANARFORCEUNIT.,$);
104 | #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));
105 | #110= IFCAXIS2PLACEMENT3D(#6,$,$);
106 | #111= IFCDIRECTION((6.12303176911189E-17,1.));
107 | #113= IFCGEOMETRICREPRESENTATIONCONTEXT($,'Model',3,0.01,#110,#111);
108 | #116= IFCGEOMETRICREPRESENTATIONSUBCONTEXT('Axis','Model',*,*,*,*,#113,$,.GRAPH_VIEW.,$);
109 | #118= IFCGEOMETRICREPRESENTATIONSUBCONTEXT('Body','Model',*,*,*,*,#113,$,.MODEL_VIEW.,$);
110 | #119= IFCGEOMETRICREPRESENTATIONSUBCONTEXT('Box','Model',*,*,*,*,#113,$,.MODEL_VIEW.,$);
111 | #120= IFCGEOMETRICREPRESENTATIONSUBCONTEXT('FootPrint','Model',*,*,*,*,#113,$,.MODEL_VIEW.,$);
112 | #121= IFCPROJECT('2nxdYR2RHCDBiKJulbA_QU',#42,'// PROJECT/NUMBER //',$,$,'// PROJECT/NAME //','// PROJECT/STATUS //',(#113),#108);
113 | #127= IFCPOSTALADDRESS($,$,$,$,('Enter address here'),$,'','Boston','','MA');
114 | #131= IFCBUILDING('2nxdYR2RHCDBiKJulbA_QV',#42,'// BUILDING/NAME //',$,$,#32,$,'// BUILDING/NAME //',.ELEMENT.,$,$,#127);
115 | #137= IFCAXIS2PLACEMENT3D(#6,$,$);
116 | #138= IFCLOCALPLACEMENT(#32,#137);
117 | #140= IFCBUILDINGSTOREY('2nxdYR2RHCDBiKJuiQr1XP',#42,'Level 1',$,'Level:8mm Head',#138,$,'Level 1',.ELEMENT.,0.);
118 | #142= IFCCARTESIANPOINT((0.,0.,4000.));
119 | #144= IFCAXIS2PLACEMENT3D(#142,$,$);
120 | #937= IFCAXIS2PLACEMENT3D(#6,#19,#13);
121 | #823= IFCRELCONTAINEDINSPATIALSTRUCTURE('3Zu5Bv0LOHrPC10066FoQQ',#42,$,$,(#219,#572),#140);
122 | #148= IFCAXIS2PLACEMENT3D(#6,$,$);
123 | #149= IFCLOCALPLACEMENT($,#148);
124 | #150= IFCSITE('2nxdYR2RHCDBiKJulbA_QS',#42,'Default',$,$,#149,$,$,.ELEMENT.,(42,21,31,181945),(-71,-3,-24,-263305),0.,$,$);
125 | #154= IFCPROPERTYSINGLEVALUE('Category',$,IFCLABEL('Project Information'),$);
126 | #155= IFCPROPERTYSET('2fyIDpiXL2EOHb_molX$RM',#42,'Pset_ProductRequirements',$,(#154));
127 | #160= IFCRELDEFINESBYPROPERTIES('2Zkk7MDtv5UPXO7lnY9Pfr',#42,$,$,(#150),#155);
128 | #164= IFCPROPERTYSINGLEVALUE('Author',$,IFCTEXT('// AUTHOR //'),$);
129 | #165= IFCPROPERTYSINGLEVALUE('Building Name',$,IFCTEXT('// BUILDING/NAME //'),$);
130 | #166= IFCPROPERTYSINGLEVALUE('Organization Description',$,IFCTEXT('// ORGANIZATION/DESCRIPTION //'),$);
131 | #167= IFCPROPERTYSINGLEVALUE('Organization Name',$,IFCTEXT('// ORGANIZATION/NAME //'),$);
132 | #168= IFCPROPERTYSINGLEVALUE('Category',$,IFCLABEL('Project Information'),$);
133 | #169= IFCPROPERTYSINGLEVALUE('Client Name',$,IFCTEXT('// CLIENT/NAME //'),$);
134 | #170= IFCPROPERTYSINGLEVALUE('Project Address',$,IFCTEXT('Enter address here'),$);
135 | #171= IFCPROPERTYSINGLEVALUE('Project Issue Date',$,IFCTEXT('// ISSUE DATE //'),$);
136 | #172= IFCPROPERTYSINGLEVALUE('Project Name',$,IFCTEXT('// PROJECT/NAME //'),$);
137 | #173= IFCPROPERTYSINGLEVALUE('Project Number',$,IFCTEXT('// PROJECT/NUMBER //'),$);
138 | #174= IFCPROPERTYSINGLEVALUE('Project Status',$,IFCTEXT('// PROJECT/STATUS //'),$);
139 | #175= IFCPROPERTYSET('27PCKGLxT4mxtV86o6mgBW',#42,'Identity Data',$,(#164,#165,#166,#167));
140 | #177= IFCRELDEFINESBYPROPERTIES('27PCKGLxT4mxtV8Mo6mgBW',#42,$,$,(#150),#175);
141 | #180= IFCPROPERTYSET('3qEsWJfw50zAS2DD_Fn$yp',#42,'Other',$,(#168,#169,#170,#171,#172,#173,#174));
142 | #182= IFCRELDEFINESBYPROPERTIES('2O3RVoVXf1igF5Ze9BKwLp',#42,$,$,(#150),#180);
143 | #185= IFCCARTESIANPOINT((-1693.30861181816,-5.56914852525364,0.));
144 | #187= IFCAXIS2PLACEMENT3D(#185,$,$);
145 | #188= IFCLOCALPLACEMENT(#138,#187);
146 | #190= IFCCARTESIANPOINT((4000.,0.));
147 | #192= IFCPOLYLINE((#9,#190));
148 | #194= IFCSHAPEREPRESENTATION(#116,'Axis','Curve2D',(#192));
149 | #197= IFCCARTESIANPOINT((2000.,0.));
150 | #199= IFCAXIS2PLACEMENT2D(#197,#25);
151 | #200= IFCRECTANGLEPROFILEDEF(.AREA.,$,#199,4000.,200.);
152 | #201= IFCAXIS2PLACEMENT3D(#6,$,$);
153 | #202= IFCEXTRUDEDAREASOLID(#200,#201,#19,4000.);
154 | #203= IFCCOLOURRGB($,0.501960784313725,0.501960784313725,0.501960784313725);
155 | #204= IFCSURFACESTYLERENDERING(#203,0.,$,$,$,$,IFCNORMALISEDRATIOMEASURE(0.5),IFCSPECULAREXPONENT(64.),.NOTDEFINED.);
156 | #205= IFCSURFACESTYLE('Default Wall',.BOTH.,(#204));
157 | #207= IFCPRESENTATIONSTYLEASSIGNMENT((#205));
158 | #209= IFCSTYLEDITEM(#202,(#207),$);
159 | #212= IFCSHAPEREPRESENTATION(#118,'Body','SweptSolid',(#202));
160 | #215= IFCPRODUCTDEFINITIONSHAPE($,$,(#194,#212));
161 | #219= IFCWALLSTANDARDCASE('1F6umJ5H50aeL3A1As_wTm',#42,'Basic Wall:Bearing Wall:346660',$,'Basic Wall:Bearing Wall',#188,#215,'346660');
162 | #228= IFCQUANTITYLENGTH('Height',$,$,4000.);
163 | #229= IFCQUANTITYLENGTH('Length',$,$,4000.);
164 | #230= IFCQUANTITYLENGTH('Width',$,$,200.);
165 | #231= IFCQUANTITYAREA('GrossFootprintArea',$,$,0.8);
166 | #232= IFCQUANTITYVOLUME('NetVolume',$,$,3200000000.);
167 | #233= IFCQUANTITYAREA('NetSideArea',$,$,16000000.);
168 | #234= IFCQUANTITYAREA('NetSideArea',$,$,14.04739);
169 | #235= IFCQUANTITYVOLUME('NetVolume',$,$,2.809478);
170 | #236= IFCELEMENTQUANTITY('1tNGP0o7zCuxUSDLATNaK3',#42,'BaseQuantities',$,$,(#228,#229,#230,#231,#232,#233,#234,#235));
171 | #238= IFCRELDEFINESBYPROPERTIES('0Vgcm4Chb6OxnMJMYOlkea',#42,$,$,(#219),#236);
172 | #242= IFCMATERIAL('Default Wall');
173 | #245= IFCPRESENTATIONSTYLEASSIGNMENT((#205));
174 | #247= IFCSTYLEDITEM($,(#245),$);
175 | #249= IFCSTYLEDREPRESENTATION(#113,'Style','Material',(#247));
176 | #252= IFCMATERIALDEFINITIONREPRESENTATION($,$,(#249),#242);
177 | #255= IFCMATERIALLAYER(#242,200.,$);
178 | #257= IFCMATERIALLAYERSET((#255),'Basic Wall:Bearing Wall');
179 | #260= IFCMATERIALLAYERSETUSAGE(#257,.AXIS2.,.NEGATIVE.,100.);
180 | #261= IFCWALLTYPE('1F6umJ5H50aeL3A1As_wV9',#42,'Basic Wall:Bearing Wall',$,$,(#332,#334,#336,#338,#340,#343,#346,#349,#352,#355,#359,#363,#370),$,'346781',$,.STANDARD.);
181 | #263= IFCPROPERTYSINGLEVALUE('Base Constraint',$,IFCLABEL('Level: Level 1'),$);
182 | #264= IFCPROPERTYSINGLEVALUE('Base Extension Distance',$,IFCLENGTHMEASURE(0.),$);
183 | #265= IFCPROPERTYSINGLEVALUE('Base is Attached',$,IFCBOOLEAN(.F.),$);
184 | #266= IFCPROPERTYSINGLEVALUE('Base Offset',$,IFCLENGTHMEASURE(0.),$);
185 | #267= IFCPROPERTYSINGLEVALUE('Cross-Section',$,IFCIDENTIFIER('Vertical'),$);
186 | #268= IFCPROPERTYSINGLEVALUE('Location Line',$,IFCIDENTIFIER('Wall Centerline'),$);
187 | #269= IFCPROPERTYSINGLEVALUE('Related to Mass',$,IFCBOOLEAN(.F.),$);
188 | #270= IFCPROPERTYSINGLEVALUE('Room Bounding',$,IFCBOOLEAN(.T.),$);
189 | #271= IFCPROPERTYSINGLEVALUE('Top Constraint',$,IFCLABEL('Level: Level 2'),$);
190 | #272= IFCPROPERTYSINGLEVALUE('Top Extension Distance',$,IFCLENGTHMEASURE(0.),$);
191 | #273= IFCPROPERTYSINGLEVALUE('Top is Attached',$,IFCBOOLEAN(.F.),$);
192 | #274= IFCPROPERTYSINGLEVALUE('Top Offset',$,IFCLENGTHMEASURE(0.),$);
193 | #275= IFCPROPERTYSINGLEVALUE('Unconnected Height',$,IFCLENGTHMEASURE(4000.),$);
194 | #276= IFCPROPERTYSINGLEVALUE('Phase Created',$,IFCLABEL('New Construction'),$);
195 | #277= IFCPROPERTYSINGLEVALUE('Enable Analytical Model',$,IFCBOOLEAN(.F.),$);
196 | #278= IFCPROPERTYSINGLEVALUE('Structural',$,IFCBOOLEAN(.F.),$);
197 | #279= IFCPROPERTYSINGLEVALUE('Structural Usage',$,IFCIDENTIFIER('Non-bearing'),$);
198 | #280= IFCPROPERTYSINGLEVALUE('Area',$,IFCAREAMEASURE(14.04739),$);
199 | #281= IFCPROPERTYSINGLEVALUE('Length',$,IFCLENGTHMEASURE(4000.),$);
200 | #282= IFCPROPERTYSINGLEVALUE('Volume',$,IFCVOLUMEMEASURE(2.809478),$);
201 | #283= IFCPROPERTYSINGLEVALUE('Category',$,IFCLABEL('Walls'),$);
202 | #284= IFCPROPERTYSINGLEVALUE('Family',$,IFCLABEL('Basic Wall: Bearing Wall'),$);
203 | #285= IFCPROPERTYSINGLEVALUE('Family and Type',$,IFCLABEL('Basic Wall: Bearing Wall'),$);
204 | #286= IFCPROPERTYSINGLEVALUE('Type',$,IFCLABEL('Basic Wall: Bearing Wall'),$);
205 | #287= IFCPROPERTYSINGLEVALUE('Type Id',$,IFCLABEL('Basic Wall: Bearing Wall'),$);
206 | #288= IFCPROPERTYSINGLEVALUE('Absorptance',$,IFCREAL(0.7),$);
207 | #289= IFCPROPERTYSINGLEVALUE('Roughness',$,IFCINTEGER(3),$);
208 | #290= IFCPROPERTYSINGLEVALUE('Coarse Scale Fill Color',$,IFCINTEGER(0),$);
209 | #291= IFCPROPERTYSINGLEVALUE('Function',$,IFCIDENTIFIER('Exterior'),$);
210 | #292= IFCPROPERTYSINGLEVALUE('Width',$,IFCLENGTHMEASURE(200.),$);
211 | #293= IFCPROPERTYSINGLEVALUE('Wrapping at Ends',$,IFCIDENTIFIER('None'),$);
212 | #294= IFCPROPERTYSINGLEVALUE('Wrapping at Inserts',$,IFCIDENTIFIER('Do not wrap'),$);
213 | #295= IFCPROPERTYSINGLEVALUE('Assembly Code',$,IFCTEXT('_ASSEMBLY-CODE_'),$);
214 | #296= IFCPROPERTYSINGLEVALUE('Assembly Description',$,IFCTEXT(''),$);
215 | #297= IFCPROPERTYSINGLEVALUE('Description',$,IFCTEXT('_DESCRIPTION_'),$);
216 | #298= IFCPROPERTYSINGLEVALUE('Fire Rating',$,IFCTEXT('_FIRE-RATING_'),$);
217 | #299= IFCPROPERTYSINGLEVALUE('Keynote',$,IFCTEXT('_KEYNOTE_'),$);
218 | #300= IFCPROPERTYSINGLEVALUE('Manufacturer',$,IFCTEXT('_MANUFACTURER_'),$);
219 | #301= IFCPROPERTYSINGLEVALUE('Model',$,IFCTEXT('MODEL'),$);
220 | #302= IFCPROPERTYSINGLEVALUE('Type Comments',$,IFCTEXT('_TYPE-COMMENTS_'),$);
221 | #303= IFCPROPERTYSINGLEVALUE('Type Mark',$,IFCTEXT('_TYPE-MARK_'),$);
222 | #304= IFCPROPERTYSINGLEVALUE('Type Name',$,IFCTEXT('Bearing Wall'),$);
223 | #305= IFCPROPERTYSINGLEVALUE('URL',$,IFCTEXT('_URL_'),$);
224 | #306= IFCPROPERTYSINGLEVALUE('Family Name',$,IFCTEXT('Basic Wall'),$);
225 | #307= IFCPROPERTYSET('1F6umJ5H50aeL3BWQs_wTm',#42,'Constraints',$,(#263,#264,#265,#266,#267,#268,#269,#270,#271,#272,#273,#274,#275));
226 | #309= IFCRELDEFINESBYPROPERTIES('1F6umJ5H50aeL3BmQs_wTm',#42,$,$,(#219),#307);
227 | #312= IFCPROPERTYSET('1F6umJ5H50aeL3BX2s_wTm',#42,'Dimensions',$,(#280,#281,#282));
228 | #314= IFCRELDEFINESBYPROPERTIES('1F6umJ5H50aeL3Bn2s_wTm',#42,$,$,(#219),#312);
229 | #317= IFCPROPERTYSET('0Orq4sVkf4nuhG2_KyNA6v',#42,'Other',$,(#283,#284,#285,#286,#287));
230 | #319= IFCRELDEFINESBYPROPERTIES('2piNnh9PP7P9X83hwTczmI',#42,$,$,(#219),#317);
231 | #322= IFCPROPERTYSET('1F6umJ5H50aeL3BXss_wTm',#42,'Phasing',$,(#276));
232 | #324= IFCRELDEFINESBYPROPERTIES('1F6umJ5H50aeL3Bnss_wTm',#42,$,$,(#219),#322);
233 | #327= IFCPROPERTYSET('1F6umJ5H50aeL3BX_s_wTm',#42,'Structural',$,(#277,#278,#279));
234 | #329= IFCRELDEFINESBYPROPERTIES('1F6umJ5H50aeL3Bn_s_wTm',#42,$,$,(#219),#327);
235 | #332= IFCPROPERTYSET('1F6umJ5H50aeL3Ba_s_wV9',#42,'Analytical Properties',$,(#288,#289));
236 | #334= IFCPROPERTYSET('1F6umJ5H50aeL3BXQs_wV9',#42,'Construction',$,(#291,#292,#293,#294));
237 | #336= IFCPROPERTYSET('1F6umJ5H50aeL3BXUs_wV9',#42,'Graphics',$,(#290));
238 | #338= IFCPROPERTYSET('1F6umJ5H50aeL3BXEs_wV9',#42,'Identity Data',$,(#295,#296,#297,#298,#299,#300,#301,#302,#303,#304,#305));
239 | #340= IFCPROPERTYSET('3SvvqA__r5DgpdHwQyK3Bd',#42,'Other',$,(#283,#306));
240 | #342= IFCPROPERTYSINGLEVALUE('FireRating',$,IFCLABEL('_FIRE-RATING_'),$);
241 | #343= IFCPROPERTYSET('2FgIvz$DH78OxbP_6aQM2V',#42,'Pset_ConcreteElementGeneral',$,(#342));
242 | #345= IFCPROPERTYSINGLEVALUE('Roughness',$,IFCPOSITIVELENGTHMEASURE(914.4),$);
243 | #346= IFCPROPERTYSET('1oVspYgob9zvAirDJdqqfX',#42,'Pset_ElementShading',$,(#345));
244 | #348= IFCPROPERTYSINGLEVALUE('Manufacturer',$,IFCLABEL('_MANUFACTURER_'),$);
245 | #349= IFCPROPERTYSET('1aTixl2HD13BY1fMD6Ca95',#42,'Pset_ManufacturerTypeInformation',$,(#348));
246 | #351= IFCPROPERTYSINGLEVALUE('Category',$,IFCLABEL('Walls'),$);
247 | #352= IFCPROPERTYSET('3TpEitt5fAtunT40jgEguw',#42,'Pset_ProductRequirements',$,(#351));
248 | #354= IFCPROPERTYSINGLEVALUE('Reference',$,IFCIDENTIFIER('Bearing Wall'),$);
249 | #355= IFCPROPERTYSET('3G$HLInsX3ceLuR_J74pJp',#42,'Pset_QuantityTakeOff',$,(#354));
250 | #357= IFCPROPERTYSINGLEVALUE('Description',$,IFCTEXT('_DESCRIPTION_'),$);
251 | #358= IFCPROPERTYSINGLEVALUE('Reference',$,IFCLABEL('Bearing Wall'),$);
252 | #359= IFCPROPERTYSET('30Z0TShUL41BB0lNR6torP',#42,'Pset_ReinforcementBarPitchOfWall',$,(#357,#358));
253 | #361= IFCPROPERTYSINGLEVALUE('FireRating',$,IFCLABEL('_FIRE-RATING_'),$);
254 | #362= IFCPROPERTYSINGLEVALUE('IsExternal',$,IFCBOOLEAN(.F.),$);
255 | #363= IFCPROPERTYSET('1F6umJ5H50aeL38__s_wV9',#42,'Pset_WallCommon',$,(#354,#361,#362));
256 | #365= IFCPROPERTYSINGLEVALUE('TypeMark',$,IFCLABEL('_TYPE-MARK_'),$);
257 | #366= IFCPROPERTYSINGLEVALUE('Keynote',$,IFCLABEL('_KEYNOTE_'),$);
258 | #367= IFCPROPERTYSINGLEVALUE('TypeDescription',$,IFCTEXT('_DESCRIPTION_'),$);
259 | #368= IFCPROPERTYSINGLEVALUE('Width',$,IFCLENGTHMEASURE(200.),$);
260 | #369= IFCPROPERTYSINGLEVALUE('Hyperlink',$,IFCTEXT('_URL_'),$);
261 | #370= IFCPROPERTYSET('2WRKEbxzHDcwyFLp2OWZN6',#42,'Custom_Pset',$,(#365,#366,#367,#368,#369));
262 | #386= IFCPROPERTYSINGLEVALUE('FireRating',$,IFCLABEL('_FIRE-RATING_'),$);
263 | #387= IFCPROPERTYSET('3P2gpigy5Bxf21UPLtfxGn',#42,'Pset_ConcreteElementGeneral',$,(#386));
264 | #389= IFCPROPERTYSINGLEVALUE('Roughness',$,IFCPOSITIVELENGTHMEASURE(914.4),$);
265 | #390= IFCPROPERTYSET('3oPqgsplnDQBBauhDymfTT',#42,'Pset_ElementShading',$,(#389));
266 | #392= IFCPROPERTYSINGLEVALUE('Manufacturer',$,IFCLABEL('_MANUFACTURER_'),$);
267 | #393= IFCPROPERTYSET('0sSV0IAmn1$hYjAOaeItMd',#42,'Pset_ManufacturerTypeInformation',$,(#392));
268 | #395= IFCPROPERTYSINGLEVALUE('Category',$,IFCLABEL('Walls'),$);
269 | #396= IFCPROPERTYSET('0BJealGbf6YvPiyaIcPtbR',#42,'Pset_ProductRequirements',$,(#395));
270 | #398= IFCPROPERTYSET('3B2kERP3j9yuxt6oSMSCYK',#42,'Pset_QuantityTakeOff',$,(#354));
271 | #400= IFCPROPERTYSINGLEVALUE('Description',$,IFCTEXT('_DESCRIPTION_'),$);
272 | #401= IFCPROPERTYSINGLEVALUE('Reference',$,IFCLABEL('Bearing Wall'),$);
273 | #402= IFCPROPERTYSET('35fO62eKf7eBj26c0ZGCYK',#42,'Pset_ReinforcementBarPitchOfWall',$,(#400,#401));
274 | #404= IFCPROPERTYSINGLEVALUE('FireRating',$,IFCLABEL('_FIRE-RATING_'),$);
275 | #405= IFCPROPERTYSINGLEVALUE('IsExternal',$,IFCBOOLEAN(.T.),$);
276 | #406= IFCPROPERTYSINGLEVALUE('ExtendToStructure',$,IFCBOOLEAN(.F.),$);
277 | #407= IFCPROPERTYSINGLEVALUE('LoadBearing',$,IFCBOOLEAN(.F.),$);
278 | #408= IFCPROPERTYSET('1F6umJ5H50aeL38__s_wTm',#42,'Pset_WallCommon',$,(#354,#404,#405,#406,#407));
279 | #410= IFCPROPERTYSINGLEVALUE('TypeMark',$,IFCLABEL('_TYPE-MARK_'),$);
280 | #411= IFCPROPERTYSINGLEVALUE('Keynote',$,IFCLABEL('_KEYNOTE_'),$);
281 | #412= IFCPROPERTYSINGLEVALUE('StoreyName',$,IFCTEXT('Level: Level 1'),$);
282 | #413= IFCPROPERTYSINGLEVALUE('TypeDescription',$,IFCTEXT('_DESCRIPTION_'),$);
283 | #414= IFCPROPERTYSINGLEVALUE('StatusConstruction',$,IFCLABEL('New Construction'),$);
284 | #415= IFCPROPERTYSINGLEVALUE('NetArea',$,IFCAREAMEASURE(14.04739),$);
285 | #416= IFCPROPERTYSINGLEVALUE('Height',$,IFCLENGTHMEASURE(4000.),$);
286 | #417= IFCPROPERTYSINGLEVALUE('Width',$,IFCLENGTHMEASURE(200.),$);
287 | #418= IFCPROPERTYSINGLEVALUE('Length',$,IFCLENGTHMEASURE(4000.),$);
288 | #419= IFCPROPERTYSINGLEVALUE('Hyperlink',$,IFCTEXT('_URL_'),$);
289 | #420= IFCPROPERTYSET('0GscS$MUj8VORpWhZ8HE9A',#42,'Custom_Pset','',(#410,#411,#412,#413,#414,#415,#416,#417,#418,#419));
290 | #422= IFCRELDEFINESBYPROPERTIES('2MFCuX$Tz2sPZWU81naSyy',#42,$,$,(#219),#387);
291 | #425= IFCRELDEFINESBYPROPERTIES('2zJMZ6wET4dgTHfaIfMtfO',#42,$,$,(#219),#390);
292 | #428= IFCRELDEFINESBYPROPERTIES('1X0JGVfDf1W9F9IK$qt1Lk',#42,$,$,(#219),#393);
293 | #431= IFCRELDEFINESBYPROPERTIES('1Ol9CkDoP5Dun0TKKnif29',#42,$,$,(#219),#396);
294 | #434= IFCRELDEFINESBYPROPERTIES('0JqUYZ7Z16zQrsbalAuwUh',#42,$,$,(#219),#398);
295 | #437= IFCRELDEFINESBYPROPERTIES('2qcAwIAOvEYPa5s9UuUorV',#42,$,$,(#219),#402);
296 | #440= IFCRELDEFINESBYPROPERTIES('1xmcmfIjT6CR2StfT5_wlv',#42,$,$,(#219),#408);
297 | #443= IFCRELDEFINESBYPROPERTIES('36lLKbnX5EwwW25YA80Mtv',#42,$,$,(#219),#420);
298 | #446= IFCCLASSIFICATION('http://www.csiorg.net/uniformat','1998',$,'Uniformat');
299 | #448= IFCCLASSIFICATIONREFERENCE('http://www.csiorg.net/uniformat','_ASSEMBLY-CODE_',$,#446);
300 | #449= IFCRELASSOCIATESCLASSIFICATION('1Tbe43SmzDeheUB6aGPLmp',#42,'Uniformat Classification','',(#219),#448);
301 | #452= IFCCARTESIANPOINT((-533.5,-1124.));
302 | #454= IFCCARTESIANPOINT((533.5,-1124.));
303 | #456= IFCCARTESIANPOINT((533.5,1086.));
304 | #458= IFCCARTESIANPOINT((457.5,1086.));
305 | #460= IFCCARTESIANPOINT((457.5,-1048.));
306 | #462= IFCCARTESIANPOINT((-457.5,-1048.));
307 | #464= IFCCARTESIANPOINT((-457.5,1086.));
308 | #466= IFCCARTESIANPOINT((-533.5,1086.));
309 | #468= IFCPOLYLINE((#452,#454,#456,#458,#460,#462,#464,#466,#452));
310 | #470= IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,'Outside door',#468);
311 | #471= IFCCARTESIANPOINT((457.500000000001,200.,1086.));
312 | #473= IFCAXIS2PLACEMENT3D(#471,#15,#11);
313 | #474= IFCEXTRUDEDAREASOLID(#470,#473,#19,24.9999999999945);
314 | #475= IFCCARTESIANPOINT((-1124.,-533.499999999997));
315 | #477= IFCCARTESIANPOINT((1086.,-533.499999999997));
316 | #479= IFCCARTESIANPOINT((1086.,-457.500000000007));
317 | #481= IFCCARTESIANPOINT((-1048.,-457.500000000007));
318 | #483= IFCCARTESIANPOINT((-1048.,457.500000000002));
319 | #485= IFCCARTESIANPOINT((1086.,457.500000000002));
320 | #487= IFCCARTESIANPOINT((1086.,533.500000000003));
321 | #489= IFCCARTESIANPOINT((-1124.,533.500000000003));
322 | #491= IFCPOLYLINE((#475,#477,#479,#481,#483,#485,#487,#489,#475));
323 | #493= IFCARBITRARYCLOSEDPROFILEDEF(.AREA.,'Outside door',#491);
324 | #494= IFCCARTESIANPOINT((457.500000000003,-25.,1086.));
325 | #496= IFCAXIS2PLACEMENT3D(#494,#15,#21);
326 | #497= IFCEXTRUDEDAREASOLID(#493,#496,#19,25.0000000000056);
327 | #498= IFCCARTESIANPOINT((-5.32907051820075E-15,0.));
328 | #500= IFCAXIS2PLACEMENT2D(#498,#23);
329 | #501= IFCRECTANGLEPROFILEDEF(.AREA.,'Outside door',#500,51.,915.);
330 | #502= IFCCARTESIANPOINT((457.5,174.500000000001,0.));
331 | #504= IFCAXIS2PLACEMENT3D(#502,#19,#15);
332 | #505= IFCEXTRUDEDAREASOLID(#501,#504,#19,2134.);
333 | #506= IFCCOLOURRGB($,0.462745098039216,0.274509803921569,0.2);
334 | #507= IFCSURFACESTYLERENDERING(#506,0.,$,$,$,$,IFCNORMALISEDRATIOMEASURE(0.5),IFCSPECULAREXPONENT(128.),.NOTDEFINED.);
335 | #508= IFCSURFACESTYLE('Door - Frame',.BOTH.,(#507));
336 | #510= IFCPRESENTATIONSTYLEASSIGNMENT((#508));
337 | #512= IFCSTYLEDITEM(#474,(#510),$);
338 | #515= IFCSTYLEDITEM(#497,(#510),$);
339 | #518= IFCCOLOURRGB($,0.823529411764706,0.623529411764706,0.372549019607843);
340 | #519= IFCSURFACESTYLERENDERING(#518,0.,$,$,$,$,IFCNORMALISEDRATIOMEASURE(0.5),IFCSPECULAREXPONENT(128.),.NOTDEFINED.);
341 | #520= IFCSURFACESTYLE('Door - Panel',.BOTH.,(#519));
342 | #522= IFCPRESENTATIONSTYLEASSIGNMENT((#520));
343 | #524= IFCSTYLEDITEM(#505,(#522),$);
344 | #527= IFCSHAPEREPRESENTATION(#118,'Body','SweptSolid',(#474,#497,#505));
345 | #529= IFCAXIS2PLACEMENT3D(#6,$,$);
346 | #530= IFCREPRESENTATIONMAP(#529,#527);
347 | #532= IFCDOORLININGPROPERTIES('1F6umJ5H50aeL3A1Es_wUF',#42,'M_Single-Flush:Outside door:346843',$,$,$,$,$,$,$,$,$,$,$,$);
348 | #533= IFCDOORPANELPROPERTIES('1F6umJ5H50aeL3A12s_wUF',#42,'M_Single-Flush:Outside door:346843',$,$,.SWINGING.,$,.NOTDEFINED.,$);
349 | #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.);
350 | #539= IFCMATERIAL('Door - Frame');
351 | #540= IFCPRESENTATIONSTYLEASSIGNMENT((#508));
352 | #542= IFCSTYLEDITEM($,(#540),$);
353 | #544= IFCSTYLEDREPRESENTATION(#113,'Style','Material',(#542));
354 | #546= IFCMATERIALDEFINITIONREPRESENTATION($,$,(#544),#539);
355 | #549= IFCMATERIAL('Door - Panel');
356 | #550= IFCPRESENTATIONSTYLEASSIGNMENT((#520));
357 | #552= IFCSTYLEDITEM($,(#550),$);
358 | #554= IFCSTYLEDREPRESENTATION(#113,'Style','Material',(#552));
359 | #556= IFCMATERIALDEFINITIONREPRESENTATION($,$,(#554),#549);
360 | #559= IFCMATERIALLIST((#539,#549));
361 | #561= IFCCARTESIANTRANSFORMATIONOPERATOR3D($,$,#6,1.,$);
362 | #562= IFCMAPPEDITEM(#530,#561);
363 | #564= IFCSHAPEREPRESENTATION(#118,'Body','MappedRepresentation',(#562));
364 | #566= IFCPRODUCTDEFINITIONSHAPE($,$,(#564));
365 | #568= IFCCARTESIANPOINT((764.191388181842,94.4308514747393,0.));
366 | #570= IFCAXIS2PLACEMENT3D(#568,#19,#13);
367 | #938= IFCLOCALPLACEMENT(#915,#937);
368 | #572= IFCDOOR('1F6umJ5H50aeL3A1As_wUF',#42,'M_Single-Flush:Outside door:346843',$,'M_Single-Flush:Outside door',#938,#566,'346843',2134.,915.);
369 | #575= IFCMATERIALLIST((#539,#549));
370 | #577= IFCPROPERTYSINGLEVALUE('FireRating',$,IFCLABEL('--FIRE_CODE--'),$);
371 | #578= IFCPROPERTYSET('1MAvBog6f9YfPSrRA3TNJX',#42,'Pset_ConcreteElementGeneral',$,(#577));
372 | #580= IFCPROPERTYSINGLEVALUE('Reference',$,IFCIDENTIFIER('Outside door'),$);
373 | #581= IFCPROPERTYSINGLEVALUE('FireRating',$,IFCLABEL('--FIRE_CODE--'),$);
374 | #582= IFCPROPERTYSINGLEVALUE('ThermalTransmittance',$,IFCTHERMALTRANSMITTANCEMEASURE(3.7021),$);
375 | #583= IFCPROPERTYSET('1F6umJ5H50aeL38_As_wUF',#42,'Pset_DoorCommon',$,(#362,#580,#581,#582));
376 | #585= IFCPROPERTYSINGLEVALUE('Manufacturer',$,IFCLABEL('--TYPE_COMMENTS_'),$);
377 | #586= IFCPROPERTYSET('2aWAgDA5DBTx6ubccoEHuL',#42,'Pset_ManufacturerTypeInformation',$,(#585));
378 | #588= IFCPROPERTYSINGLEVALUE('Category',$,IFCLABEL('Doors'),$);
379 | #589= IFCPROPERTYSET('37$b9ZV6bEV9w4ajZ6Vuro',#42,'Pset_ProductRequirements',$,(#588));
380 | #591= IFCPROPERTYSET('1VUx5P6tv2FRM5czFXIoYd',#42,'Pset_QuantityTakeOff',$,(#580));
381 | #593= IFCPROPERTYSINGLEVALUE('TypeMark',$,IFCLABEL('20'),$);
382 | #594= IFCPROPERTYSINGLEVALUE('Keynote',$,IFCLABEL('--KEYNOTE--'),$);
383 | #595= IFCPROPERTYSINGLEVALUE('StoreyName',$,IFCTEXT('Level: Level 1'),$);
384 | #596= IFCPROPERTYSINGLEVALUE('TypeDescription',$,IFCTEXT('--DESCRIPTION--'),$);
385 | #597= IFCPROPERTYSINGLEVALUE('StatusConstruction',$,IFCLABEL('New Construction'),$);
386 | #598= IFCPROPERTYSINGLEVALUE('NetArea',$,IFCAREAMEASURE(3.18957899999998),$);
387 | #599= IFCPROPERTYSINGLEVALUE('Height',$,IFCLENGTHMEASURE(2134.),$);
388 | #600= IFCPROPERTYSINGLEVALUE('Width',$,IFCLENGTHMEASURE(915.),$);
389 | #601= IFCPROPERTYSINGLEVALUE('SillHeight',$,IFCLENGTHMEASURE(0.),$);
390 | #602= IFCPROPERTYSINGLEVALUE('Hyperlink',$,IFCTEXT('--URL--'),$);
391 | #603= IFCPROPERTYSET('1CXc3dmFPFfQbCU$bHsAfS',#42,'Custom_Pset','',(#593,#594,#595,#596,#597,#598,#599,#600,#601,#602));
392 | #605= IFCRELDEFINESBYPROPERTIES('14RxrffgjD6QlWHKtlQTAN',#42,$,$,(#572),#578);
393 | #609= IFCRELDEFINESBYPROPERTIES('04ckjvoyL25Q50h8x6sUPv',#42,$,$,(#572),#583);
394 | #612= IFCRELDEFINESBYPROPERTIES('0$6_vvQgz7_eKsnZrkKoIw',#42,$,$,(#572),#586);
395 | #615= IFCRELDEFINESBYPROPERTIES('1UyD_HmPHBougIcmoJRJ7m',#42,$,$,(#572),#589);
396 | #618= IFCRELDEFINESBYPROPERTIES('2lpvQgxsjEfPta9gxkQaM5',#42,$,$,(#572),#591);
397 | #621= IFCRELDEFINESBYPROPERTIES('26uNI57VnEBgae2CZ9gqtr',#42,$,$,(#572),#603);
398 | #624= IFCQUANTITYLENGTH('Height','',$,2134.);
399 | #625= IFCQUANTITYLENGTH('Width','',$,915.);
400 | #626= IFCQUANTITYAREA('Area','area measured in geometry',$,3.18957899999998);
401 | #627= IFCELEMENTQUANTITY('39uqRwTJT9qhACjvMcPpu_',#42,'BaseQuantities',$,$,(#624,#625,#626));
402 | #629= IFCRELDEFINESBYPROPERTIES('1QmkCV1Kz2MfAPznLVFMCy',#42,$,$,(#572),#627);
403 | #632= IFCCLASSIFICATIONREFERENCE('http://www.csiorg.net/uniformat','--ASSEMBLY_CODE--',$,#446);
404 | #633= IFCRELASSOCIATESCLASSIFICATION('2nmxXpeUXAOQtHOkOFmKTR',#42,'Uniformat Classification','',(#572),#632);
405 | #636= IFCPROPERTYSINGLEVALUE('Level',$,IFCLABEL('Level: Level 1'),$);
406 | #637= IFCPROPERTYSINGLEVALUE('Sill Height',$,IFCLENGTHMEASURE(0.),$);
407 | #638= IFCPROPERTYSINGLEVALUE('Area',$,IFCAREAMEASURE(3.18957899999998),$);
408 | #639= IFCPROPERTYSINGLEVALUE('Volume',$,IFCVOLUMEMEASURE(0.119856109999999),$);
409 | #640= IFCPROPERTYSINGLEVALUE('Mark',$,IFCTEXT('1'),$);
410 | #641= IFCPROPERTYSINGLEVALUE('Category',$,IFCLABEL('Doors'),$);
411 | #642= IFCPROPERTYSINGLEVALUE('Family',$,IFCLABEL('M_Single-Flush: Outside door'),$);
412 | #643= IFCPROPERTYSINGLEVALUE('Family and Type',$,IFCLABEL('M_Single-Flush: Outside door'),$);
413 | #644= IFCPROPERTYSINGLEVALUE('Head Height',$,IFCLENGTHMEASURE(2134.),$);
414 | #645= IFCPROPERTYSINGLEVALUE('Host Id',$,IFCLABEL('Basic Wall: Bearing Wall'),$);
415 | #646= IFCPROPERTYSINGLEVALUE('Type',$,IFCLABEL('M_Single-Flush: Outside door'),$);
416 | #647= IFCPROPERTYSINGLEVALUE('Type Id',$,IFCLABEL('M_Single-Flush: Outside door'),$);
417 | #648= IFCPROPERTYSINGLEVALUE('Analytic Construction',$,IFCTEXT('Metal'),$);
418 | #649= IFCPROPERTYSINGLEVALUE('Define Thermal Properties by',$,IFCIDENTIFIER('Schematic Type'),$);
419 | #650= IFCPROPERTYSINGLEVALUE('Heat Transfer Coefficient (U)',$,IFCREAL(3.7021),$);
420 | #651= IFCPROPERTYSINGLEVALUE('Solar Heat Gain Coefficient',$,IFCREAL(0.),$);
421 | #652= IFCPROPERTYSINGLEVALUE('Thermal Resistance (R)',$,IFCREAL(0.270116960643959),$);
422 | #653= IFCPROPERTYSINGLEVALUE('Visual Light Transmittance',$,IFCREAL(0.),$);
423 | #654= IFCPROPERTYSINGLEVALUE('Door Material',$,IFCLABEL('Door - Panel'),$);
424 | #655= IFCPROPERTYSINGLEVALUE('Frame Material',$,IFCLABEL('Door - Frame'),$);
425 | #656= IFCPROPERTYSINGLEVALUE('Function',$,IFCIDENTIFIER('Interior'),$);
426 | #657= IFCPROPERTYSINGLEVALUE('Wall Closure',$,IFCIDENTIFIER('By host'),$);
427 | #658= IFCPROPERTYSINGLEVALUE('Height',$,IFCLENGTHMEASURE(2134.),$);
428 | #659= IFCPROPERTYSINGLEVALUE('Thickness',$,IFCLENGTHMEASURE(51.),$);
429 | #660= IFCPROPERTYSINGLEVALUE('Trim Projection Ext',$,IFCLENGTHMEASURE(25.),$);
430 | #661= IFCPROPERTYSINGLEVALUE('Trim Projection Int',$,IFCLENGTHMEASURE(25.),$);
431 | #662= IFCPROPERTYSINGLEVALUE('Trim Width',$,IFCLENGTHMEASURE(76.),$);
432 | #663= IFCPROPERTYSINGLEVALUE('Width',$,IFCLENGTHMEASURE(915.),$);
433 | #664= IFCPROPERTYSINGLEVALUE('Assembly Code',$,IFCTEXT('--ASSEMBLY_CODE--'),$);
434 | #665= IFCPROPERTYSINGLEVALUE('Code Name',$,IFCTEXT(''),$);
435 | #666= IFCPROPERTYSINGLEVALUE('Description',$,IFCTEXT('--DESCRIPTION--'),$);
436 | #667= IFCPROPERTYSINGLEVALUE('Fire Rating',$,IFCTEXT('--FIRE_CODE--'),$);
437 | #668= IFCPROPERTYSINGLEVALUE('Keynote',$,IFCTEXT('--KEYNOTE--'),$);
438 | #669= IFCPROPERTYSINGLEVALUE('Manufacturer',$,IFCTEXT('--TYPE_COMMENTS_'),$);
439 | #670= IFCPROPERTYSINGLEVALUE('Model',$,IFCTEXT('--MODEL--'),$);
440 | #671= IFCPROPERTYSINGLEVALUE('OmniClass Number',$,IFCTEXT('23.30.10.00'),$);
441 | #672= IFCPROPERTYSINGLEVALUE('OmniClass Title',$,IFCTEXT('Doors'),$);
442 | #673= IFCPROPERTYSINGLEVALUE('Type Mark',$,IFCTEXT('20'),$);
443 | #674= IFCPROPERTYSINGLEVALUE('Type Name',$,IFCTEXT('Outside door'),$);
444 | #675= IFCPROPERTYSINGLEVALUE('URL',$,IFCTEXT('--URL--'),$);
445 | #676= IFCPROPERTYSINGLEVALUE('Family Name',$,IFCTEXT('M_Single-Flush'),$);
446 | #677= IFCPROPERTYSET('1F6umJ5H50aeL3BWQs_wUF',#42,'Constraints',$,(#636,#637));
447 | #679= IFCRELDEFINESBYPROPERTIES('1F6umJ5H50aeL3BmQs_wUF',#42,$,$,(#572),#677);
448 | #682= IFCPROPERTYSET('1F6umJ5H50aeL3BX2s_wUF',#42,'Dimensions',$,(#638,#639));
449 | #684= IFCRELDEFINESBYPROPERTIES('1F6umJ5H50aeL3Bn2s_wUF',#42,$,$,(#572),#682);
450 | #687= IFCPROPERTYSET('1F6umJ5H50aeL3BXEs_wUF',#42,'Identity Data',$,(#640));
451 | #689= IFCRELDEFINESBYPROPERTIES('1F6umJ5H50aeL3BnEs_wUF',#42,$,$,(#572),#687);
452 | #692= IFCPROPERTYSET('2BegeYd3fCOeVyUmGr0qxL',#42,'Other',$,(#641,#642,#643,#644,#645,#646,#647));
453 | #694= IFCRELDEFINESBYPROPERTIES('1QrXJ2z1rFTuQboBVeLF$Z',#42,$,$,(#572),#692);
454 | #697= IFCPROPERTYSET('1F6umJ5H50aeL3BXss_wUF',#42,'Phasing',$,(#276));
455 | #699= IFCRELDEFINESBYPROPERTIES('1F6umJ5H50aeL3Bnss_wUF',#42,$,$,(#572),#697);
456 | #702= IFCPROPERTYSET('3W2Tu2KKr66wtPVQ1PGsDC',#42,'Analytical Properties',$,(#648,#649,#650,#651,#652,#653));
457 | #704= IFCPROPERTYSET('3W2Tu2KKr66wtPVVbPGsDC',#42,'Construction',$,(#656,#657));
458 | #706= IFCPROPERTYSET('3W2Tu2KKr66wtPVVzPGsDC',#42,'Dimensions',$,(#658,#659,#660,#661,#662,#663));
459 | #708= IFCPROPERTYSET('3W2Tu2KKr66wtPVVnPGsDC',#42,'Identity Data',$,(#296,#664,#665,#666,#667,#668,#669,#670,#671,#672,#673,#674,#675));
460 | #710= IFCPROPERTYSET('3W2Tu2KKr66wtPVVjPGsDC',#42,'Materials and Finishes',$,(#654,#655));
461 | #712= IFCPROPERTYSET('0KOXzzKarFERoTS0N7cfbD',#42,'Other',$,(#641,#676));
462 | #714= IFCPROPERTYSINGLEVALUE('FireRating',$,IFCLABEL('--FIRE_CODE--'),$);
463 | #715= IFCPROPERTYSET('0YRN2fpNzDoxoXFEOdBeJw',#42,'Pset_ConcreteElementGeneral',$,(#714));
464 | #717= IFCPROPERTYSINGLEVALUE('FireRating',$,IFCLABEL('--FIRE_CODE--'),$);
465 | #718= IFCPROPERTYSINGLEVALUE('ThermalTransmittance',$,IFCTHERMALTRANSMITTANCEMEASURE(3.7021),$);
466 | #719= IFCPROPERTYSET('3W2Tu2KKr66wtPS0rPGsDC',#42,'Pset_DoorCommon',$,(#362,#580,#717,#718));
467 | #721= IFCPROPERTYSINGLEVALUE('Manufacturer',$,IFCLABEL('--TYPE_COMMENTS_'),$);
468 | #722= IFCPROPERTYSET('0LOQqn1NfDkwoxFtCajotd',#42,'Pset_ManufacturerTypeInformation',$,(#721));
469 | #724= IFCPROPERTYSINGLEVALUE('Category',$,IFCLABEL('Doors'),$);
470 | #725= IFCPROPERTYSET('2b6m9MCNn679Y43LRC330T',#42,'Pset_ProductRequirements',$,(#724));
471 | #727= IFCPROPERTYSET('0F4CuoFTLEvRXd3x$a9K3$',#42,'Pset_QuantityTakeOff',$,(#580));
472 | #729= IFCPROPERTYSINGLEVALUE('TypeMark',$,IFCLABEL('20'),$);
473 | #730= IFCPROPERTYSINGLEVALUE('Keynote',$,IFCLABEL('--KEYNOTE--'),$);
474 | #731= IFCPROPERTYSINGLEVALUE('TypeDescription',$,IFCTEXT('--DESCRIPTION--'),$);
475 | #732= IFCPROPERTYSINGLEVALUE('Height',$,IFCLENGTHMEASURE(2134.),$);
476 | #733= IFCPROPERTYSINGLEVALUE('Width',$,IFCLENGTHMEASURE(915.),$);
477 | #734= IFCPROPERTYSINGLEVALUE('Hyperlink',$,IFCTEXT('--URL--'),$);
478 | #735= IFCPROPERTYSET('3CUt_fMl9Df9OKgw$sNH0T',#42,'Custom_Pset',$,(#729,#730,#731,#732,#733,#734));
479 | #751= IFCPROPERTYSINGLEVALUE('Name',$,IFCLABEL('Level 1'),$);
480 | #752= IFCPROPERTYSET('0$99IJGkP9Q86lu5rnKYUN',#42,'Pset_AirSideSystemInformation',$,(#751));
481 | #754= IFCPROPERTYSINGLEVALUE('AboveGround',$,IFCLOGICAL(.U.),$);
482 | #755= IFCPROPERTYSET('3Zu5Bv0LOHrPC12_o6FoQQ',#42,'Pset_BuildingStoreyCommon',$,(#754));
483 | #757= IFCPROPERTYSINGLEVALUE('Name',$,IFCLABEL('Level 1'),$);
484 | #758= IFCPROPERTYSINGLEVALUE('Category',$,IFCLABEL('Levels'),$);
485 | #759= IFCPROPERTYSET('1E$wH_IvL0u9KdSridkQHO',#42,'Pset_ProductRequirements',$,(#757,#758));
486 | #761= IFCPROPERTYSINGLEVALUE('SpaceName',$,IFCLABEL('Level 1'),$);
487 | #762= IFCPROPERTYSET('081bdaxsT7tvi7VV3hCTqa',#42,'Custom_Pset','',(#761));
488 | #764= IFCRELDEFINESBYPROPERTIES('0Jv9wzDiT2Fx3l2pN5PrZ7',#42,$,$,(#140),#752);
489 | #768= IFCRELDEFINESBYPROPERTIES('1uZQMUSkv6FAgEXy9GtiEh',#42,$,$,(#140),#755);
490 | #771= IFCRELDEFINESBYPROPERTIES('1FuE$sx5j7jhZwoEQu$YIS',#42,$,$,(#140),#759);
491 | #774= IFCRELDEFINESBYPROPERTIES('1ThjSvkAT6B8HzMssSW$IW',#42,$,$,(#140),#762);
492 | #777= IFCPROPERTYSINGLEVALUE('Elevation',$,IFCLENGTHMEASURE(0.),$);
493 | #778= IFCPROPERTYSINGLEVALUE('Computation Height',$,IFCLENGTHMEASURE(0.),$);
494 | #779= IFCPROPERTYSINGLEVALUE('Building Story',$,IFCBOOLEAN(.T.),$);
495 | #780= IFCPROPERTYSINGLEVALUE('Name',$,IFCTEXT('Level 1'),$);
496 | #781= IFCPROPERTYSINGLEVALUE('Category',$,IFCLABEL('Levels'),$);
497 | #782= IFCPROPERTYSINGLEVALUE('Family',$,IFCLABEL('Level: 8mm Head'),$);
498 | #783= IFCPROPERTYSINGLEVALUE('Family and Type',$,IFCLABEL('Level: 8mm Head'),$);
499 | #784= IFCPROPERTYSINGLEVALUE('Type',$,IFCLABEL('Level: 8mm Head'),$);
500 | #785= IFCPROPERTYSINGLEVALUE('Type Id',$,IFCLABEL('Level: 8mm Head'),$);
501 | #786= IFCPROPERTYSINGLEVALUE('Elevation Base',$,IFCIDENTIFIER('Project Base Point'),$);
502 | #787= IFCPROPERTYSINGLEVALUE('Color',$,IFCINTEGER(0),$);
503 | #788= IFCPROPERTYSINGLEVALUE('Line Pattern',$,IFCLABEL('Centre'),$);
504 | #789= IFCPROPERTYSINGLEVALUE('Line Weight',$,IFCIDENTIFIER('1'),$);
505 | #790= IFCPROPERTYSINGLEVALUE('Symbol',$,IFCLABEL('M_Level Head - Circle: M_Level Head - Circle'),$);
506 | #791= IFCPROPERTYSINGLEVALUE('Symbol at End 1 Default',$,IFCBOOLEAN(.F.),$);
507 | #792= IFCPROPERTYSINGLEVALUE('Symbol at End 2 Default',$,IFCBOOLEAN(.T.),$);
508 | #793= IFCPROPERTYSINGLEVALUE('Type Name',$,IFCTEXT('8mm Head'),$);
509 | #794= IFCPROPERTYSINGLEVALUE('Family Name',$,IFCTEXT('Level'),$);
510 | #795= IFCPROPERTYSET('3Zu5Bv0LOHrPC11XI6FoQQ',#42,'Constraints',$,(#777));
511 | #797= IFCRELDEFINESBYPROPERTIES('3Zu5Bv0LOHrPC11nI6FoQQ',#42,$,$,(#140),#795);
512 | #800= IFCPROPERTYSET('3Zu5Bv0LOHrPC11WA6FoQQ',#42,'Dimensions',$,(#778));
513 | #802= IFCRELDEFINESBYPROPERTIES('3Zu5Bv0LOHrPC11mA6FoQQ',#42,$,$,(#140),#800);
514 | #805= IFCPROPERTYSET('3Zu5Bv0LOHrPC11W66FoQQ',#42,'Identity Data',$,(#278,#779,#780));
515 | #807= IFCRELDEFINESBYPROPERTIES('3Zu5Bv0LOHrPC11m66FoQQ',#42,$,$,(#140),#805);
516 | #810= IFCPROPERTYSET('0eCyo1mQf61RRDb8LkFhbB',#42,'Other',$,(#781,#782,#783,#784,#785));
517 | #812= IFCRELDEFINESBYPROPERTIES('3$zaZUyoL6L9DrOV9RtgBX',#42,$,$,(#140),#810);
518 | #815= IFCPROPERTYSET('3Zu5Bv0LOHrPC11XI6FoQS',#42,'Constraints(Type)',$,(#786));
519 | #817= IFCPROPERTYSET('3Zu5Bv0LOHrPC11WM6FoQS',#42,'Graphics(Type)',$,(#787,#788,#789,#790,#791,#792));
520 | #819= IFCPROPERTYSET('3Zu5Bv0LOHrPC11W66FoQS',#42,'Identity Data(Type)',$,(#793));
521 | #821= IFCPROPERTYSET('2qVnE7UtTDKAGidujFAE08',#42,'Other(Type)',$,(#781,#794));
522 | #828= IFCRELAGGREGATES('2usGHf9Nj3g8$vNhPcOa4J',#42,$,$,#121,(#150));
523 | #832= IFCRELAGGREGATES('0YbgX$FVvBg9IJMkBorzcZ',#42,$,$,#150,(#131));
524 | #836= IFCRELAGGREGATES('27PCKGLxT4mxtV9cw6mgBW',#42,$,$,#131,(#140));
525 | #840= IFCPROPERTYSINGLEVALUE('NumberOfStoreys',$,IFCINTEGER(1),$);
526 | #841= IFCPROPERTYSINGLEVALUE('IsLandmarked',$,IFCLOGICAL(.U.),$);
527 | #842= IFCPROPERTYSET('27PCKGLxT4mxtVBOQ6mgBW',#42,'Pset_BuildingCommon',$,(#840,#841));
528 | #844= IFCPROPERTYSINGLEVALUE('Category',$,IFCLABEL('Project Information'),$);
529 | #845= IFCPROPERTYSET('2HlE6XRD5D2u$q88QiyvCI',#42,'Pset_ProductRequirements',$,(#844));
530 | #847= IFCRELDEFINESBYPROPERTIES('1ThDg46v99hhPo_cQYW0rR',#42,$,$,(#131),#842);
531 | #851= IFCRELDEFINESBYPROPERTIES('041QPVCJrABucJbKRNgMWb',#42,$,$,(#131),#845);
532 | #854= IFCPROPERTYSINGLEVALUE('Author',$,IFCTEXT('// AUTHOR //'),$);
533 | #855= IFCPROPERTYSINGLEVALUE('Building Name',$,IFCTEXT('// BUILDING/NAME //'),$);
534 | #856= IFCPROPERTYSINGLEVALUE('Organization Description',$,IFCTEXT('// ORGANIZATION/DESCRIPTION //'),$);
535 | #857= IFCPROPERTYSINGLEVALUE('Organization Name',$,IFCTEXT('// ORGANIZATION/NAME //'),$);
536 | #858= IFCPROPERTYSINGLEVALUE('Client Name',$,IFCTEXT('// CLIENT/NAME //'),$);
537 | #859= IFCPROPERTYSINGLEVALUE('Project Address',$,IFCTEXT('Enter address here'),$);
538 | #860= IFCPROPERTYSINGLEVALUE('Project Issue Date',$,IFCTEXT('// ISSUE DATE //'),$);
539 | #861= IFCPROPERTYSINGLEVALUE('Project Name',$,IFCTEXT('// PROJECT/NAME //'),$);
540 | #862= IFCPROPERTYSINGLEVALUE('Project Number',$,IFCTEXT('// PROJECT/NUMBER //'),$);
541 | #863= IFCPROPERTYSINGLEVALUE('Project Status',$,IFCTEXT('// PROJECT/STATUS //'),$);
542 | #864= IFCPROPERTYSET('0s2Cq7Qr16Ox1rbEEIxz2G',#42,'Identity Data',$,(#854,#855,#856,#857));
543 | #866= IFCRELDEFINESBYPROPERTIES('28SWhRx5b0sf$MJWcMt2nE',#42,$,$,(#131),#864);
544 | #869= IFCPROPERTYSET('1CDFHAzCT93vZFGBuRrsae',#42,'Other',$,(#168,#858,#859,#860,#861,#862,#863));
545 | #871= IFCRELDEFINESBYPROPERTIES('2DcsKHXrrAPwYRZm$ohYq2',#42,$,$,(#131),#869);
546 | #874= IFCRELASSOCIATESMATERIAL('1wE5zd2gDCvQcFXdkvgcaL',#42,$,$,(#219),#260);
547 | #876= IFCRELASSOCIATESMATERIAL('3GYCaV5cTDC9Pr0aWWgagz',#42,$,$,(#261),#257);
548 | #879= IFCRELASSOCIATESMATERIAL('1FhLk1Yhr9qfrZHn1ibg3k',#42,$,$,(#534),#559);
549 | #882= IFCRELASSOCIATESMATERIAL('0fx8ZLmDfAMv9ssKwx6$_9',#42,$,$,(#572),#575);
550 | #884= IFCRELDEFINESBYTYPE('3Nexmy3HT5DQH5On6RkB_B',#42,$,$,(#219),#261);
551 | #887= IFCRELDEFINESBYTYPE('3wpnK4sXnFpBOVHc68PX9l',#42,$,$,(#572),#534);
552 | #890= IFCRELDEFINESBYPROPERTIES('0tF1p_d896seH5amYBxeZq',#42,$,$,(#140),#815);
553 | #893= IFCRELDEFINESBYPROPERTIES('0E5e8bTTXAVwon56y69uPu',#42,$,$,(#140),#817);
554 | #896= IFCRELDEFINESBYPROPERTIES('1BJ83_hCTCVfyD3$5h98Nf',#42,$,$,(#140),#819);
555 | #899= IFCRELDEFINESBYPROPERTIES('2i4fyR0Hz3ChSGqhPoEuwU',#42,$,$,(#140),#821);
556 | #902= IFCCARTESIANPOINT((1067.,457.5));
557 | #904= IFCAXIS2PLACEMENT2D(#902,#27);
558 | #905= IFCRECTANGLEPROFILEDEF(.AREA.,$,#904,915.,2134.);
559 | #906= IFCAXIS2PLACEMENT3D(#6,#17,#19);
560 | #907= IFCEXTRUDEDAREASOLID(#905,#906,#19,200.);
561 | #908= IFCSHAPEREPRESENTATION(#118,'Body','SweptSolid',(#907));
562 | #910= IFCPRODUCTDEFINITIONSHAPE($,$,(#908));
563 | #912= IFCCARTESIANPOINT((2457.5,100.,0.));
564 | #914= IFCAXIS2PLACEMENT3D(#912,$,$);
565 | #915= IFCLOCALPLACEMENT(#188,#914);
566 | #917= IFCOPENINGELEMENT('1F6umJ5H50aeL3A06s_wUF',#42,'M_Single-Flush:Outside door:346843:1',$,'Opening',#915,#910,'346843');
567 | #922= IFCRELVOIDSELEMENT('1F6umJ5H50aeL3A0Qs_wUF',#42,$,$,#219,#917);
568 | #925= IFCQUANTITYLENGTH('Depth',$,$,200.);
569 | #926= IFCQUANTITYLENGTH('Height',$,$,915.);
570 | #927= IFCQUANTITYLENGTH('Width',$,$,2134.);
571 | #928= IFCELEMENTQUANTITY('2bznKwbC9EfhuYS7RbVHuS',#42,'BaseQuantities',$,$,(#925,#926,#927));
572 | #930= IFCRELDEFINESBYPROPERTIES('18rPOfDATBfOF$7p8CMdFK',#42,$,$,(#917),#928);
573 | #934= IFCRELFILLSELEMENT('3trX3C1YDCOBtTtvk1SC8E',#42,$,$,#917,#572);
574 | #941= IFCPRESENTATIONLAYERASSIGNMENT('A-DOOR-____-OTLN',$,(#527,#564),$);
575 | #943= IFCPRESENTATIONLAYERASSIGNMENT('A-WALL-____-OTLN',$,(#194,#212,#908),$);
576 | ENDSEC;
577 |
578 | END-ISO-10303-21;
579 |
--------------------------------------------------------------------------------