├── 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 | Logo 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 |
  1. 30 | About 31 |
  2. 32 |
  3. 33 | Getting Started 34 | 38 |
  4. 39 |
  5. 40 | Usage 41 | 44 |
  6. 45 |
  7. Roadmap
  8. 46 |
  9. Contributing
  10. 47 |
  11. License
  12. 48 |
  13. Contact
  14. 49 |
  15. Extra
  16. 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 | ![Screenshot](https://raw.githubusercontent.com/andrewisen/bim-whale-ifc-samples/main/SimpleWall/Screenshots/Screenshot_2.png) 208 | 209 | The IFC file has a **Property Set** called `Custom_Pset`. 210 | Please note that the file only contains dummy data. 211 | 212 | ![Screenshot](https://raw.githubusercontent.com/andrewisen/bim-whale-ifc-samples/main/SimpleWall/Screenshots/Screenshot_21.png) 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 | Logo 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 | --------------------------------------------------------------------------------