├── .github └── workflows │ └── main.yml ├── .gitignore ├── LICENSE ├── README.md ├── checkDeno.ts ├── dist ├── BIMWHALE.js └── BIMWHALE.min.js ├── example.index.ts ├── package-lock.json ├── package.json ├── src ├── config │ └── example.config.ts ├── ifc-parser │ ├── ifc-parser.ts │ └── methods │ │ ├── _parse-ifc-file.ts │ │ ├── map-property-sets-to-generic-entities.ts │ │ └── map-property-single-values-to-property-set.ts ├── step-parser │ ├── functions │ │ ├── get-step-attributes.ts │ │ ├── parse-step-entity-instance-attributes.ts │ │ ├── set-step-attributes.ts │ │ ├── set-step-entity-name.ts │ │ └── set-step-instance-name.ts │ ├── interfaces │ │ └── step-interface.ts │ ├── methods │ │ ├── _parse-step-file.ts │ │ ├── generate-step-entity-instance.ts │ │ └── save-step-entity-instance.ts │ └── step-parser.ts └── utils │ └── ifc-definitions.ts ├── tests ├── BIMWHALE.test.ts └── SimpleWall.ifc ├── tsconfig.json ├── typedoc.json ├── typedoc.md ├── webpack.config.js └── webpack.ts /.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 | -------------------------------------------------------------------------------- /.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? -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | ; -------------------------------------------------------------------------------- /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)})(); -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "bim-whale", 3 | "version": "0.0.3", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@discoveryjs/json-ext": { 8 | "version": "0.5.2", 9 | "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.2.tgz", 10 | "integrity": "sha512-HyYEUDeIj5rRQU2Hk5HTB2uHsbRQpF70nvMhVzi+VJR0X+xNEhjPui4/kBf3VeH/wqD28PT4sVOm8qqLjBrSZg==" 11 | }, 12 | "@types/eslint": { 13 | "version": "7.2.6", 14 | "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.2.6.tgz", 15 | "integrity": "sha512-I+1sYH+NPQ3/tVqCeUSBwTE/0heyvtXqpIopUUArlBm0Kpocb8FbMa3AZ/ASKIFpN3rnEx932TTXDbt9OXsNDw==", 16 | "requires": { 17 | "@types/estree": "*", 18 | "@types/json-schema": "*" 19 | } 20 | }, 21 | "@types/eslint-scope": { 22 | "version": "3.7.0", 23 | "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.0.tgz", 24 | "integrity": "sha512-O/ql2+rrCUe2W2rs7wMR+GqPRcgB6UiqN5RhrR5xruFlY7l9YLMn0ZkDzjoHLeiFkR8MCQZVudUuuvQ2BLC9Qw==", 25 | "requires": { 26 | "@types/eslint": "*", 27 | "@types/estree": "*" 28 | } 29 | }, 30 | "@types/estree": { 31 | "version": "0.0.45", 32 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.45.tgz", 33 | "integrity": "sha512-jnqIUKDUqJbDIUxm0Uj7bnlMnRm1T/eZ9N+AVMqhPgzrba2GhGG5o/jCTwmdPK709nEZsGoMzXEDUjcXHa3W0g==" 34 | }, 35 | "@types/json-schema": { 36 | "version": "7.0.6", 37 | "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", 38 | "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==" 39 | }, 40 | "@types/node": { 41 | "version": "14.14.20", 42 | "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.20.tgz", 43 | "integrity": "sha512-Y93R97Ouif9JEOWPIUyU+eyIdyRqQR0I8Ez1dzku4hDx34NWh4HbtIc3WNzwB1Y9ULvNGeu5B8h8bVL5cAk4/A==" 44 | }, 45 | "@webassemblyjs/ast": { 46 | "version": "1.11.0", 47 | "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.0.tgz", 48 | "integrity": "sha512-kX2W49LWsbthrmIRMbQZuQDhGtjyqXfEmmHyEi4XWnSZtPmxY0+3anPIzsnRb45VH/J55zlOfWvZuY47aJZTJg==", 49 | "requires": { 50 | "@webassemblyjs/helper-numbers": "1.11.0", 51 | "@webassemblyjs/helper-wasm-bytecode": "1.11.0" 52 | } 53 | }, 54 | "@webassemblyjs/floating-point-hex-parser": { 55 | "version": "1.11.0", 56 | "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.0.tgz", 57 | "integrity": "sha512-Q/aVYs/VnPDVYvsCBL/gSgwmfjeCb4LW8+TMrO3cSzJImgv8lxxEPM2JA5jMrivE7LSz3V+PFqtMbls3m1exDA==" 58 | }, 59 | "@webassemblyjs/helper-api-error": { 60 | "version": "1.11.0", 61 | "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.0.tgz", 62 | "integrity": "sha512-baT/va95eXiXb2QflSx95QGT5ClzWpGaa8L7JnJbgzoYeaA27FCvuBXU758l+KXWRndEmUXjP0Q5fibhavIn8w==" 63 | }, 64 | "@webassemblyjs/helper-buffer": { 65 | "version": "1.11.0", 66 | "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.0.tgz", 67 | "integrity": "sha512-u9HPBEl4DS+vA8qLQdEQ6N/eJQ7gT7aNvMIo8AAWvAl/xMrcOSiI2M0MAnMCy3jIFke7bEee/JwdX1nUpCtdyA==" 68 | }, 69 | "@webassemblyjs/helper-numbers": { 70 | "version": "1.11.0", 71 | "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.0.tgz", 72 | "integrity": "sha512-DhRQKelIj01s5IgdsOJMKLppI+4zpmcMQ3XboFPLwCpSNH6Hqo1ritgHgD0nqHeSYqofA6aBN/NmXuGjM1jEfQ==", 73 | "requires": { 74 | "@webassemblyjs/floating-point-hex-parser": "1.11.0", 75 | "@webassemblyjs/helper-api-error": "1.11.0", 76 | "@xtuc/long": "4.2.2" 77 | } 78 | }, 79 | "@webassemblyjs/helper-wasm-bytecode": { 80 | "version": "1.11.0", 81 | "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.0.tgz", 82 | "integrity": "sha512-MbmhvxXExm542tWREgSFnOVo07fDpsBJg3sIl6fSp9xuu75eGz5lz31q7wTLffwL3Za7XNRCMZy210+tnsUSEA==" 83 | }, 84 | "@webassemblyjs/helper-wasm-section": { 85 | "version": "1.11.0", 86 | "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.0.tgz", 87 | "integrity": "sha512-3Eb88hcbfY/FCukrg6i3EH8H2UsD7x8Vy47iVJrP967A9JGqgBVL9aH71SETPx1JrGsOUVLo0c7vMCN22ytJew==", 88 | "requires": { 89 | "@webassemblyjs/ast": "1.11.0", 90 | "@webassemblyjs/helper-buffer": "1.11.0", 91 | "@webassemblyjs/helper-wasm-bytecode": "1.11.0", 92 | "@webassemblyjs/wasm-gen": "1.11.0" 93 | } 94 | }, 95 | "@webassemblyjs/ieee754": { 96 | "version": "1.11.0", 97 | "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.0.tgz", 98 | "integrity": "sha512-KXzOqpcYQwAfeQ6WbF6HXo+0udBNmw0iXDmEK5sFlmQdmND+tr773Ti8/5T/M6Tl/413ArSJErATd8In3B+WBA==", 99 | "requires": { 100 | "@xtuc/ieee754": "^1.2.0" 101 | } 102 | }, 103 | "@webassemblyjs/leb128": { 104 | "version": "1.11.0", 105 | "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.0.tgz", 106 | "integrity": "sha512-aqbsHa1mSQAbeeNcl38un6qVY++hh8OpCOzxhixSYgbRfNWcxJNJQwe2rezK9XEcssJbbWIkblaJRwGMS9zp+g==", 107 | "requires": { 108 | "@xtuc/long": "4.2.2" 109 | } 110 | }, 111 | "@webassemblyjs/utf8": { 112 | "version": "1.11.0", 113 | "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.0.tgz", 114 | "integrity": "sha512-A/lclGxH6SpSLSyFowMzO/+aDEPU4hvEiooCMXQPcQFPPJaYcPQNKGOCLUySJsYJ4trbpr+Fs08n4jelkVTGVw==" 115 | }, 116 | "@webassemblyjs/wasm-edit": { 117 | "version": "1.11.0", 118 | "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.0.tgz", 119 | "integrity": "sha512-JHQ0damXy0G6J9ucyKVXO2j08JVJ2ntkdJlq1UTiUrIgfGMmA7Ik5VdC/L8hBK46kVJgujkBIoMtT8yVr+yVOQ==", 120 | "requires": { 121 | "@webassemblyjs/ast": "1.11.0", 122 | "@webassemblyjs/helper-buffer": "1.11.0", 123 | "@webassemblyjs/helper-wasm-bytecode": "1.11.0", 124 | "@webassemblyjs/helper-wasm-section": "1.11.0", 125 | "@webassemblyjs/wasm-gen": "1.11.0", 126 | "@webassemblyjs/wasm-opt": "1.11.0", 127 | "@webassemblyjs/wasm-parser": "1.11.0", 128 | "@webassemblyjs/wast-printer": "1.11.0" 129 | } 130 | }, 131 | "@webassemblyjs/wasm-gen": { 132 | "version": "1.11.0", 133 | "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.0.tgz", 134 | "integrity": "sha512-BEUv1aj0WptCZ9kIS30th5ILASUnAPEvE3tVMTrItnZRT9tXCLW2LEXT8ezLw59rqPP9klh9LPmpU+WmRQmCPQ==", 135 | "requires": { 136 | "@webassemblyjs/ast": "1.11.0", 137 | "@webassemblyjs/helper-wasm-bytecode": "1.11.0", 138 | "@webassemblyjs/ieee754": "1.11.0", 139 | "@webassemblyjs/leb128": "1.11.0", 140 | "@webassemblyjs/utf8": "1.11.0" 141 | } 142 | }, 143 | "@webassemblyjs/wasm-opt": { 144 | "version": "1.11.0", 145 | "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.0.tgz", 146 | "integrity": "sha512-tHUSP5F4ywyh3hZ0+fDQuWxKx3mJiPeFufg+9gwTpYp324mPCQgnuVKwzLTZVqj0duRDovnPaZqDwoyhIO8kYg==", 147 | "requires": { 148 | "@webassemblyjs/ast": "1.11.0", 149 | "@webassemblyjs/helper-buffer": "1.11.0", 150 | "@webassemblyjs/wasm-gen": "1.11.0", 151 | "@webassemblyjs/wasm-parser": "1.11.0" 152 | } 153 | }, 154 | "@webassemblyjs/wasm-parser": { 155 | "version": "1.11.0", 156 | "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.0.tgz", 157 | "integrity": "sha512-6L285Sgu9gphrcpDXINvm0M9BskznnzJTE7gYkjDbxET28shDqp27wpruyx3C2S/dvEwiigBwLA1cz7lNUi0kw==", 158 | "requires": { 159 | "@webassemblyjs/ast": "1.11.0", 160 | "@webassemblyjs/helper-api-error": "1.11.0", 161 | "@webassemblyjs/helper-wasm-bytecode": "1.11.0", 162 | "@webassemblyjs/ieee754": "1.11.0", 163 | "@webassemblyjs/leb128": "1.11.0", 164 | "@webassemblyjs/utf8": "1.11.0" 165 | } 166 | }, 167 | "@webassemblyjs/wast-printer": { 168 | "version": "1.11.0", 169 | "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.0.tgz", 170 | "integrity": "sha512-Fg5OX46pRdTgB7rKIUojkh9vXaVN6sGYCnEiJN1GYkb0RPwShZXp6KTDqmoMdQPKhcroOXh3fEzmkWmCYaKYhQ==", 171 | "requires": { 172 | "@webassemblyjs/ast": "1.11.0", 173 | "@xtuc/long": "4.2.2" 174 | } 175 | }, 176 | "@webpack-cli/info": { 177 | "version": "1.2.1", 178 | "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.2.1.tgz", 179 | "integrity": "sha512-fLnDML5HZ5AEKzHul8xLAksoKN2cibu6MgonkUj8R9V7bbeVRkd1XbGEGWrAUNYHbX1jcqCsDEpBviE5StPMzQ==", 180 | "requires": { 181 | "envinfo": "^7.7.3" 182 | } 183 | }, 184 | "@webpack-cli/serve": { 185 | "version": "1.2.1", 186 | "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.2.1.tgz", 187 | "integrity": "sha512-Zj1z6AyS+vqV6Hfi7ngCjFGdHV5EwZNIHo6QfFTNe9PyW+zBU1zJ9BiOW1pmUEq950RC4+Dym6flyA/61/vhyw==" 188 | }, 189 | "@xtuc/ieee754": { 190 | "version": "1.2.0", 191 | "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", 192 | "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" 193 | }, 194 | "@xtuc/long": { 195 | "version": "4.2.2", 196 | "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", 197 | "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" 198 | }, 199 | "acorn": { 200 | "version": "8.0.4", 201 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.0.4.tgz", 202 | "integrity": "sha512-XNP0PqF1XD19ZlLKvB7cMmnZswW4C/03pRHgirB30uSJTaS3A3V1/P4sS3HPvFmjoriPCJQs+JDSbm4bL1TxGQ==" 203 | }, 204 | "ajv": { 205 | "version": "6.12.6", 206 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 207 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 208 | "requires": { 209 | "fast-deep-equal": "^3.1.1", 210 | "fast-json-stable-stringify": "^2.0.0", 211 | "json-schema-traverse": "^0.4.1", 212 | "uri-js": "^4.2.2" 213 | } 214 | }, 215 | "ajv-keywords": { 216 | "version": "3.5.2", 217 | "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", 218 | "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==" 219 | }, 220 | "ansi-colors": { 221 | "version": "4.1.1", 222 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", 223 | "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==" 224 | }, 225 | "ansi-styles": { 226 | "version": "4.3.0", 227 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 228 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 229 | "requires": { 230 | "color-convert": "^2.0.1" 231 | } 232 | }, 233 | "at-least-node": { 234 | "version": "1.0.0", 235 | "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", 236 | "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" 237 | }, 238 | "balanced-match": { 239 | "version": "1.0.0", 240 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 241 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" 242 | }, 243 | "big.js": { 244 | "version": "5.2.2", 245 | "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", 246 | "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" 247 | }, 248 | "brace-expansion": { 249 | "version": "1.1.11", 250 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 251 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 252 | "requires": { 253 | "balanced-match": "^1.0.0", 254 | "concat-map": "0.0.1" 255 | } 256 | }, 257 | "braces": { 258 | "version": "3.0.2", 259 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 260 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 261 | "requires": { 262 | "fill-range": "^7.0.1" 263 | } 264 | }, 265 | "browserslist": { 266 | "version": "4.16.1", 267 | "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.1.tgz", 268 | "integrity": "sha512-UXhDrwqsNcpTYJBTZsbGATDxZbiVDsx6UjpmRUmtnP10pr8wAYr5LgFoEFw9ixriQH2mv/NX2SfGzE/o8GndLA==", 269 | "requires": { 270 | "caniuse-lite": "^1.0.30001173", 271 | "colorette": "^1.2.1", 272 | "electron-to-chromium": "^1.3.634", 273 | "escalade": "^3.1.1", 274 | "node-releases": "^1.1.69" 275 | } 276 | }, 277 | "buffer-from": { 278 | "version": "1.1.1", 279 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 280 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" 281 | }, 282 | "caniuse-lite": { 283 | "version": "1.0.30001176", 284 | "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001176.tgz", 285 | "integrity": "sha512-VWdkYmqdkDLRe0lvfJlZQ43rnjKqIGKHWhWWRbkqMsJIUaYDNf/K/sdZZcVO6YKQklubokdkJY+ujArsuJ5cag==" 286 | }, 287 | "chalk": { 288 | "version": "4.1.0", 289 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", 290 | "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", 291 | "requires": { 292 | "ansi-styles": "^4.1.0", 293 | "supports-color": "^7.1.0" 294 | } 295 | }, 296 | "chrome-trace-event": { 297 | "version": "1.0.2", 298 | "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", 299 | "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", 300 | "requires": { 301 | "tslib": "^1.9.0" 302 | } 303 | }, 304 | "color-convert": { 305 | "version": "2.0.1", 306 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 307 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 308 | "requires": { 309 | "color-name": "~1.1.4" 310 | } 311 | }, 312 | "color-name": { 313 | "version": "1.1.4", 314 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 315 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 316 | }, 317 | "colorette": { 318 | "version": "1.2.1", 319 | "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz", 320 | "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==" 321 | }, 322 | "commander": { 323 | "version": "2.20.3", 324 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", 325 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" 326 | }, 327 | "concat-map": { 328 | "version": "0.0.1", 329 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 330 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 331 | }, 332 | "core-util-is": { 333 | "version": "1.0.2", 334 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 335 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 336 | }, 337 | "cross-spawn": { 338 | "version": "7.0.3", 339 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 340 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 341 | "requires": { 342 | "path-key": "^3.1.0", 343 | "shebang-command": "^2.0.0", 344 | "which": "^2.0.1" 345 | } 346 | }, 347 | "electron-to-chromium": { 348 | "version": "1.3.637", 349 | "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.637.tgz", 350 | "integrity": "sha512-924WXYMYquYybc+7pNApGlhY2RWg3MY3he4BrZ5BUmM2n1MGBsrS+PZxrlo6UAsWuNl4NE66fqFdwsWkBUGgkA==" 351 | }, 352 | "emojis-list": { 353 | "version": "3.0.0", 354 | "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", 355 | "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" 356 | }, 357 | "enhanced-resolve": { 358 | "version": "4.5.0", 359 | "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", 360 | "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", 361 | "requires": { 362 | "graceful-fs": "^4.1.2", 363 | "memory-fs": "^0.5.0", 364 | "tapable": "^1.0.0" 365 | } 366 | }, 367 | "enquirer": { 368 | "version": "2.3.6", 369 | "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", 370 | "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", 371 | "requires": { 372 | "ansi-colors": "^4.1.1" 373 | } 374 | }, 375 | "envinfo": { 376 | "version": "7.7.3", 377 | "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.7.3.tgz", 378 | "integrity": "sha512-46+j5QxbPWza0PB1i15nZx0xQ4I/EfQxg9J8Had3b408SV63nEtor2e+oiY63amTo9KTuh2a3XLObNwduxYwwA==" 379 | }, 380 | "errno": { 381 | "version": "0.1.8", 382 | "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", 383 | "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", 384 | "requires": { 385 | "prr": "~1.0.1" 386 | } 387 | }, 388 | "escalade": { 389 | "version": "3.1.1", 390 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 391 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" 392 | }, 393 | "eslint-scope": { 394 | "version": "5.1.1", 395 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", 396 | "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", 397 | "requires": { 398 | "esrecurse": "^4.3.0", 399 | "estraverse": "^4.1.1" 400 | } 401 | }, 402 | "esrecurse": { 403 | "version": "4.3.0", 404 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 405 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 406 | "requires": { 407 | "estraverse": "^5.2.0" 408 | }, 409 | "dependencies": { 410 | "estraverse": { 411 | "version": "5.2.0", 412 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", 413 | "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" 414 | } 415 | } 416 | }, 417 | "estraverse": { 418 | "version": "4.3.0", 419 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", 420 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" 421 | }, 422 | "events": { 423 | "version": "3.2.0", 424 | "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", 425 | "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==" 426 | }, 427 | "execa": { 428 | "version": "5.0.0", 429 | "resolved": "https://registry.npmjs.org/execa/-/execa-5.0.0.tgz", 430 | "integrity": "sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==", 431 | "requires": { 432 | "cross-spawn": "^7.0.3", 433 | "get-stream": "^6.0.0", 434 | "human-signals": "^2.1.0", 435 | "is-stream": "^2.0.0", 436 | "merge-stream": "^2.0.0", 437 | "npm-run-path": "^4.0.1", 438 | "onetime": "^5.1.2", 439 | "signal-exit": "^3.0.3", 440 | "strip-final-newline": "^2.0.0" 441 | } 442 | }, 443 | "fast-deep-equal": { 444 | "version": "3.1.3", 445 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 446 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" 447 | }, 448 | "fast-json-stable-stringify": { 449 | "version": "2.1.0", 450 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 451 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" 452 | }, 453 | "fastest-levenshtein": { 454 | "version": "1.0.12", 455 | "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", 456 | "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==" 457 | }, 458 | "fill-range": { 459 | "version": "7.0.1", 460 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 461 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 462 | "requires": { 463 | "to-regex-range": "^5.0.1" 464 | } 465 | }, 466 | "find-up": { 467 | "version": "5.0.0", 468 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 469 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 470 | "requires": { 471 | "locate-path": "^6.0.0", 472 | "path-exists": "^4.0.0" 473 | } 474 | }, 475 | "fs-extra": { 476 | "version": "9.0.1", 477 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz", 478 | "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==", 479 | "requires": { 480 | "at-least-node": "^1.0.0", 481 | "graceful-fs": "^4.2.0", 482 | "jsonfile": "^6.0.1", 483 | "universalify": "^1.0.0" 484 | } 485 | }, 486 | "fs.realpath": { 487 | "version": "1.0.0", 488 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 489 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 490 | }, 491 | "function-bind": { 492 | "version": "1.1.1", 493 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 494 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 495 | }, 496 | "get-stream": { 497 | "version": "6.0.0", 498 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.0.tgz", 499 | "integrity": "sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==" 500 | }, 501 | "glob": { 502 | "version": "7.1.6", 503 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 504 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 505 | "requires": { 506 | "fs.realpath": "^1.0.0", 507 | "inflight": "^1.0.4", 508 | "inherits": "2", 509 | "minimatch": "^3.0.4", 510 | "once": "^1.3.0", 511 | "path-is-absolute": "^1.0.0" 512 | } 513 | }, 514 | "glob-to-regexp": { 515 | "version": "0.4.1", 516 | "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", 517 | "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" 518 | }, 519 | "graceful-fs": { 520 | "version": "4.2.4", 521 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", 522 | "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" 523 | }, 524 | "handlebars": { 525 | "version": "4.7.6", 526 | "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz", 527 | "integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==", 528 | "requires": { 529 | "minimist": "^1.2.5", 530 | "neo-async": "^2.6.0", 531 | "source-map": "^0.6.1", 532 | "uglify-js": "^3.1.4", 533 | "wordwrap": "^1.0.0" 534 | } 535 | }, 536 | "has": { 537 | "version": "1.0.3", 538 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 539 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 540 | "requires": { 541 | "function-bind": "^1.1.1" 542 | } 543 | }, 544 | "has-flag": { 545 | "version": "4.0.0", 546 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 547 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" 548 | }, 549 | "highlight.js": { 550 | "version": "10.4.1", 551 | "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.4.1.tgz", 552 | "integrity": "sha512-yR5lWvNz7c85OhVAEAeFhVCc/GV4C30Fjzc/rCP0aCWzc1UUOPUk55dK/qdwTZHBvMZo+eZ2jpk62ndX/xMFlg==" 553 | }, 554 | "human-signals": { 555 | "version": "2.1.0", 556 | "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", 557 | "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==" 558 | }, 559 | "import-local": { 560 | "version": "3.0.2", 561 | "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", 562 | "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", 563 | "requires": { 564 | "pkg-dir": "^4.2.0", 565 | "resolve-cwd": "^3.0.0" 566 | }, 567 | "dependencies": { 568 | "find-up": { 569 | "version": "4.1.0", 570 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", 571 | "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", 572 | "requires": { 573 | "locate-path": "^5.0.0", 574 | "path-exists": "^4.0.0" 575 | } 576 | }, 577 | "locate-path": { 578 | "version": "5.0.0", 579 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", 580 | "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", 581 | "requires": { 582 | "p-locate": "^4.1.0" 583 | } 584 | }, 585 | "p-limit": { 586 | "version": "2.3.0", 587 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", 588 | "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", 589 | "requires": { 590 | "p-try": "^2.0.0" 591 | } 592 | }, 593 | "p-locate": { 594 | "version": "4.1.0", 595 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", 596 | "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", 597 | "requires": { 598 | "p-limit": "^2.2.0" 599 | } 600 | }, 601 | "pkg-dir": { 602 | "version": "4.2.0", 603 | "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", 604 | "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", 605 | "requires": { 606 | "find-up": "^4.0.0" 607 | } 608 | } 609 | } 610 | }, 611 | "inflight": { 612 | "version": "1.0.6", 613 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 614 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 615 | "requires": { 616 | "once": "^1.3.0", 617 | "wrappy": "1" 618 | } 619 | }, 620 | "inherits": { 621 | "version": "2.0.4", 622 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 623 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 624 | }, 625 | "interpret": { 626 | "version": "2.2.0", 627 | "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", 628 | "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==" 629 | }, 630 | "is-core-module": { 631 | "version": "2.1.0", 632 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.1.0.tgz", 633 | "integrity": "sha512-YcV7BgVMRFRua2FqQzKtTDMz8iCuLEyGKjr70q8Zm1yy2qKcurbFEd79PAdHV77oL3NrAaOVQIbMmiHQCHB7ZA==", 634 | "requires": { 635 | "has": "^1.0.3" 636 | } 637 | }, 638 | "is-number": { 639 | "version": "7.0.0", 640 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 641 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" 642 | }, 643 | "is-stream": { 644 | "version": "2.0.0", 645 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", 646 | "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" 647 | }, 648 | "isarray": { 649 | "version": "1.0.0", 650 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 651 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 652 | }, 653 | "isexe": { 654 | "version": "2.0.0", 655 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 656 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" 657 | }, 658 | "jest-worker": { 659 | "version": "26.6.2", 660 | "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", 661 | "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", 662 | "requires": { 663 | "@types/node": "*", 664 | "merge-stream": "^2.0.0", 665 | "supports-color": "^7.0.0" 666 | } 667 | }, 668 | "json-parse-better-errors": { 669 | "version": "1.0.2", 670 | "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", 671 | "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" 672 | }, 673 | "json-schema-traverse": { 674 | "version": "0.4.1", 675 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 676 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" 677 | }, 678 | "json5": { 679 | "version": "2.1.3", 680 | "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", 681 | "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", 682 | "requires": { 683 | "minimist": "^1.2.5" 684 | } 685 | }, 686 | "jsonfile": { 687 | "version": "6.1.0", 688 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", 689 | "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", 690 | "requires": { 691 | "graceful-fs": "^4.1.6", 692 | "universalify": "^2.0.0" 693 | }, 694 | "dependencies": { 695 | "universalify": { 696 | "version": "2.0.0", 697 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", 698 | "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" 699 | } 700 | } 701 | }, 702 | "loader-runner": { 703 | "version": "4.2.0", 704 | "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", 705 | "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==" 706 | }, 707 | "loader-utils": { 708 | "version": "2.0.0", 709 | "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", 710 | "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", 711 | "requires": { 712 | "big.js": "^5.2.2", 713 | "emojis-list": "^3.0.0", 714 | "json5": "^2.1.2" 715 | } 716 | }, 717 | "locate-path": { 718 | "version": "6.0.0", 719 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 720 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 721 | "requires": { 722 | "p-locate": "^5.0.0" 723 | } 724 | }, 725 | "lodash": { 726 | "version": "4.17.20", 727 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", 728 | "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" 729 | }, 730 | "lru-cache": { 731 | "version": "6.0.0", 732 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 733 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 734 | "requires": { 735 | "yallist": "^4.0.0" 736 | } 737 | }, 738 | "lunr": { 739 | "version": "2.3.9", 740 | "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", 741 | "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==" 742 | }, 743 | "marked": { 744 | "version": "1.2.5", 745 | "resolved": "https://registry.npmjs.org/marked/-/marked-1.2.5.tgz", 746 | "integrity": "sha512-2AlqgYnVPOc9WDyWu7S5DJaEZsfk6dNh/neatQ3IHUW4QLutM/VPSH9lG7bif+XjFWc9K9XR3QvR+fXuECmfdA==" 747 | }, 748 | "memory-fs": { 749 | "version": "0.5.0", 750 | "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", 751 | "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", 752 | "requires": { 753 | "errno": "^0.1.3", 754 | "readable-stream": "^2.0.1" 755 | } 756 | }, 757 | "merge-stream": { 758 | "version": "2.0.0", 759 | "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", 760 | "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" 761 | }, 762 | "micromatch": { 763 | "version": "4.0.2", 764 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", 765 | "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", 766 | "requires": { 767 | "braces": "^3.0.1", 768 | "picomatch": "^2.0.5" 769 | } 770 | }, 771 | "mime-db": { 772 | "version": "1.45.0", 773 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz", 774 | "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==" 775 | }, 776 | "mime-types": { 777 | "version": "2.1.28", 778 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.28.tgz", 779 | "integrity": "sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==", 780 | "requires": { 781 | "mime-db": "1.45.0" 782 | } 783 | }, 784 | "mimic-fn": { 785 | "version": "2.1.0", 786 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", 787 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" 788 | }, 789 | "minimatch": { 790 | "version": "3.0.4", 791 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 792 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 793 | "requires": { 794 | "brace-expansion": "^1.1.7" 795 | } 796 | }, 797 | "minimist": { 798 | "version": "1.2.5", 799 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 800 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" 801 | }, 802 | "neo-async": { 803 | "version": "2.6.2", 804 | "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", 805 | "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" 806 | }, 807 | "node-releases": { 808 | "version": "1.1.69", 809 | "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.69.tgz", 810 | "integrity": "sha512-DGIjo79VDEyAnRlfSqYTsy+yoHd2IOjJiKUozD2MV2D85Vso6Bug56mb9tT/fY5Urt0iqk01H7x+llAruDR2zA==" 811 | }, 812 | "npm-run-path": { 813 | "version": "4.0.1", 814 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", 815 | "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", 816 | "requires": { 817 | "path-key": "^3.0.0" 818 | } 819 | }, 820 | "once": { 821 | "version": "1.4.0", 822 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 823 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 824 | "requires": { 825 | "wrappy": "1" 826 | } 827 | }, 828 | "onetime": { 829 | "version": "5.1.2", 830 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", 831 | "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", 832 | "requires": { 833 | "mimic-fn": "^2.1.0" 834 | } 835 | }, 836 | "p-limit": { 837 | "version": "3.1.0", 838 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 839 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 840 | "requires": { 841 | "yocto-queue": "^0.1.0" 842 | } 843 | }, 844 | "p-locate": { 845 | "version": "5.0.0", 846 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 847 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 848 | "requires": { 849 | "p-limit": "^3.0.2" 850 | } 851 | }, 852 | "p-try": { 853 | "version": "2.2.0", 854 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", 855 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" 856 | }, 857 | "path-exists": { 858 | "version": "4.0.0", 859 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 860 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" 861 | }, 862 | "path-is-absolute": { 863 | "version": "1.0.1", 864 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 865 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 866 | }, 867 | "path-key": { 868 | "version": "3.1.1", 869 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 870 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" 871 | }, 872 | "path-parse": { 873 | "version": "1.0.6", 874 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", 875 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" 876 | }, 877 | "picomatch": { 878 | "version": "2.2.2", 879 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", 880 | "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==" 881 | }, 882 | "pkg-dir": { 883 | "version": "5.0.0", 884 | "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", 885 | "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", 886 | "requires": { 887 | "find-up": "^5.0.0" 888 | } 889 | }, 890 | "process-nextick-args": { 891 | "version": "2.0.1", 892 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 893 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 894 | }, 895 | "progress": { 896 | "version": "2.0.3", 897 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", 898 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" 899 | }, 900 | "prr": { 901 | "version": "1.0.1", 902 | "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", 903 | "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" 904 | }, 905 | "punycode": { 906 | "version": "2.1.1", 907 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 908 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" 909 | }, 910 | "randombytes": { 911 | "version": "2.1.0", 912 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", 913 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", 914 | "requires": { 915 | "safe-buffer": "^5.1.0" 916 | } 917 | }, 918 | "readable-stream": { 919 | "version": "2.3.7", 920 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 921 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 922 | "requires": { 923 | "core-util-is": "~1.0.0", 924 | "inherits": "~2.0.3", 925 | "isarray": "~1.0.0", 926 | "process-nextick-args": "~2.0.0", 927 | "safe-buffer": "~5.1.1", 928 | "string_decoder": "~1.1.1", 929 | "util-deprecate": "~1.0.1" 930 | } 931 | }, 932 | "rechoir": { 933 | "version": "0.7.0", 934 | "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.0.tgz", 935 | "integrity": "sha512-ADsDEH2bvbjltXEP+hTIAmeFekTFK0V2BTxMkok6qILyAJEXV0AFfoWcAq4yfll5VdIMd/RVXq0lR+wQi5ZU3Q==", 936 | "requires": { 937 | "resolve": "^1.9.0" 938 | } 939 | }, 940 | "resolve": { 941 | "version": "1.19.0", 942 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", 943 | "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", 944 | "requires": { 945 | "is-core-module": "^2.1.0", 946 | "path-parse": "^1.0.6" 947 | } 948 | }, 949 | "resolve-cwd": { 950 | "version": "3.0.0", 951 | "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", 952 | "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", 953 | "requires": { 954 | "resolve-from": "^5.0.0" 955 | } 956 | }, 957 | "resolve-from": { 958 | "version": "5.0.0", 959 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", 960 | "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" 961 | }, 962 | "safe-buffer": { 963 | "version": "5.1.2", 964 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 965 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 966 | }, 967 | "schema-utils": { 968 | "version": "3.0.0", 969 | "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", 970 | "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", 971 | "requires": { 972 | "@types/json-schema": "^7.0.6", 973 | "ajv": "^6.12.5", 974 | "ajv-keywords": "^3.5.2" 975 | } 976 | }, 977 | "semver": { 978 | "version": "7.3.4", 979 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", 980 | "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", 981 | "requires": { 982 | "lru-cache": "^6.0.0" 983 | } 984 | }, 985 | "serialize-javascript": { 986 | "version": "5.0.1", 987 | "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", 988 | "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", 989 | "requires": { 990 | "randombytes": "^2.1.0" 991 | } 992 | }, 993 | "shebang-command": { 994 | "version": "2.0.0", 995 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 996 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 997 | "requires": { 998 | "shebang-regex": "^3.0.0" 999 | } 1000 | }, 1001 | "shebang-regex": { 1002 | "version": "3.0.0", 1003 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 1004 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" 1005 | }, 1006 | "shelljs": { 1007 | "version": "0.8.4", 1008 | "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz", 1009 | "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==", 1010 | "requires": { 1011 | "glob": "^7.0.0", 1012 | "interpret": "^1.0.0", 1013 | "rechoir": "^0.6.2" 1014 | }, 1015 | "dependencies": { 1016 | "interpret": { 1017 | "version": "1.4.0", 1018 | "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", 1019 | "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" 1020 | }, 1021 | "rechoir": { 1022 | "version": "0.6.2", 1023 | "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", 1024 | "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", 1025 | "requires": { 1026 | "resolve": "^1.1.6" 1027 | } 1028 | } 1029 | } 1030 | }, 1031 | "signal-exit": { 1032 | "version": "3.0.3", 1033 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", 1034 | "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" 1035 | }, 1036 | "source-list-map": { 1037 | "version": "2.0.1", 1038 | "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", 1039 | "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" 1040 | }, 1041 | "source-map": { 1042 | "version": "0.6.1", 1043 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 1044 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" 1045 | }, 1046 | "source-map-support": { 1047 | "version": "0.5.19", 1048 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", 1049 | "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", 1050 | "requires": { 1051 | "buffer-from": "^1.0.0", 1052 | "source-map": "^0.6.0" 1053 | } 1054 | }, 1055 | "string_decoder": { 1056 | "version": "1.1.1", 1057 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1058 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1059 | "requires": { 1060 | "safe-buffer": "~5.1.0" 1061 | } 1062 | }, 1063 | "strip-final-newline": { 1064 | "version": "2.0.0", 1065 | "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", 1066 | "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" 1067 | }, 1068 | "supports-color": { 1069 | "version": "7.2.0", 1070 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 1071 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 1072 | "requires": { 1073 | "has-flag": "^4.0.0" 1074 | } 1075 | }, 1076 | "tapable": { 1077 | "version": "1.1.3", 1078 | "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", 1079 | "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" 1080 | }, 1081 | "terser": { 1082 | "version": "5.5.1", 1083 | "resolved": "https://registry.npmjs.org/terser/-/terser-5.5.1.tgz", 1084 | "integrity": "sha512-6VGWZNVP2KTUcltUQJ25TtNjx/XgdDsBDKGt8nN0MpydU36LmbPPcMBd2kmtZNNGVVDLg44k7GKeHHj+4zPIBQ==", 1085 | "requires": { 1086 | "commander": "^2.20.0", 1087 | "source-map": "~0.7.2", 1088 | "source-map-support": "~0.5.19" 1089 | }, 1090 | "dependencies": { 1091 | "source-map": { 1092 | "version": "0.7.3", 1093 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", 1094 | "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" 1095 | } 1096 | } 1097 | }, 1098 | "terser-webpack-plugin": { 1099 | "version": "5.1.1", 1100 | "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.1.1.tgz", 1101 | "integrity": "sha512-5XNNXZiR8YO6X6KhSGXfY0QrGrCRlSwAEjIIrlRQR4W8nP69TaJUlh3bkuac6zzgspiGPfKEHcY295MMVExl5Q==", 1102 | "requires": { 1103 | "jest-worker": "^26.6.2", 1104 | "p-limit": "^3.1.0", 1105 | "schema-utils": "^3.0.0", 1106 | "serialize-javascript": "^5.0.1", 1107 | "source-map": "^0.6.1", 1108 | "terser": "^5.5.1" 1109 | } 1110 | }, 1111 | "to-regex-range": { 1112 | "version": "5.0.1", 1113 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1114 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1115 | "requires": { 1116 | "is-number": "^7.0.0" 1117 | } 1118 | }, 1119 | "ts-loader": { 1120 | "version": "8.0.14", 1121 | "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-8.0.14.tgz", 1122 | "integrity": "sha512-Jt/hHlUnApOZjnSjTmZ+AbD5BGlQFx3f1D0nYuNKwz0JJnuDGHJas6az+FlWKwwRTu+26GXpv249A8UAnYUpqA==", 1123 | "requires": { 1124 | "chalk": "^4.1.0", 1125 | "enhanced-resolve": "^4.0.0", 1126 | "loader-utils": "^2.0.0", 1127 | "micromatch": "^4.0.0", 1128 | "semver": "^7.3.4" 1129 | } 1130 | }, 1131 | "tslib": { 1132 | "version": "1.14.1", 1133 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", 1134 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" 1135 | }, 1136 | "typedoc": { 1137 | "version": "0.19.2", 1138 | "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.19.2.tgz", 1139 | "integrity": "sha512-oDEg1BLEzi1qvgdQXc658EYgJ5qJLVSeZ0hQ57Eq4JXy6Vj2VX4RVo18qYxRWz75ifAaYuYNBUCnbhjd37TfOg==", 1140 | "requires": { 1141 | "fs-extra": "^9.0.1", 1142 | "handlebars": "^4.7.6", 1143 | "highlight.js": "^10.2.0", 1144 | "lodash": "^4.17.20", 1145 | "lunr": "^2.3.9", 1146 | "marked": "^1.1.1", 1147 | "minimatch": "^3.0.0", 1148 | "progress": "^2.0.3", 1149 | "semver": "^7.3.2", 1150 | "shelljs": "^0.8.4", 1151 | "typedoc-default-themes": "^0.11.4" 1152 | }, 1153 | "dependencies": { 1154 | "semver": { 1155 | "version": "7.3.2", 1156 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", 1157 | "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==" 1158 | } 1159 | } 1160 | }, 1161 | "typedoc-default-themes": { 1162 | "version": "0.11.4", 1163 | "resolved": "https://registry.npmjs.org/typedoc-default-themes/-/typedoc-default-themes-0.11.4.tgz", 1164 | "integrity": "sha512-Y4Lf+qIb9NTydrexlazAM46SSLrmrQRqWiD52593g53SsmUFioAsMWt8m834J6qsp+7wHRjxCXSZeiiW5cMUdw==" 1165 | }, 1166 | "typescript": { 1167 | "version": "4.1.3", 1168 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.1.3.tgz", 1169 | "integrity": "sha512-B3ZIOf1IKeH2ixgHhj6la6xdwR9QrLC5d1VKeCSY4tvkqhF2eqd9O7txNlS0PO3GrBAFIdr3L1ndNwteUbZLYg==" 1170 | }, 1171 | "uglify-js": { 1172 | "version": "3.12.0", 1173 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.12.0.tgz", 1174 | "integrity": "sha512-8lBMSkFZuAK7gGF8LswsXmir8eX8d2AAMOnxSDWjKBx/fBR6MypQjs78m6ML9zQVp1/hD4TBdfeMZMC7nW1TAA==", 1175 | "optional": true 1176 | }, 1177 | "universalify": { 1178 | "version": "1.0.0", 1179 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", 1180 | "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==" 1181 | }, 1182 | "uri-js": { 1183 | "version": "4.4.1", 1184 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 1185 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 1186 | "requires": { 1187 | "punycode": "^2.1.0" 1188 | } 1189 | }, 1190 | "util-deprecate": { 1191 | "version": "1.0.2", 1192 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1193 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 1194 | }, 1195 | "v8-compile-cache": { 1196 | "version": "2.2.0", 1197 | "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz", 1198 | "integrity": "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==" 1199 | }, 1200 | "watchpack": { 1201 | "version": "2.1.0", 1202 | "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.1.0.tgz", 1203 | "integrity": "sha512-UjgD1mqjkG99+3lgG36at4wPnUXNvis2v1utwTgQ43C22c4LD71LsYMExdWXh4HZ+RmW+B0t1Vrg2GpXAkTOQw==", 1204 | "requires": { 1205 | "glob-to-regexp": "^0.4.1", 1206 | "graceful-fs": "^4.1.2" 1207 | } 1208 | }, 1209 | "webpack": { 1210 | "version": "5.13.0", 1211 | "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.13.0.tgz", 1212 | "integrity": "sha512-NPhMEtfhSVegp1FNPkCM1MPygDm0GHwpreG10dh//0Gr0epfB0br9nlgEfxSghxJqrQ7j9XzgO91CGGLWZiHeA==", 1213 | "requires": { 1214 | "@types/eslint-scope": "^3.7.0", 1215 | "@types/estree": "^0.0.45", 1216 | "@webassemblyjs/ast": "1.11.0", 1217 | "@webassemblyjs/wasm-edit": "1.11.0", 1218 | "@webassemblyjs/wasm-parser": "1.11.0", 1219 | "acorn": "^8.0.4", 1220 | "browserslist": "^4.14.5", 1221 | "chrome-trace-event": "^1.0.2", 1222 | "enhanced-resolve": "^5.6.0", 1223 | "eslint-scope": "^5.1.1", 1224 | "events": "^3.2.0", 1225 | "glob-to-regexp": "^0.4.1", 1226 | "graceful-fs": "^4.2.4", 1227 | "json-parse-better-errors": "^1.0.2", 1228 | "loader-runner": "^4.2.0", 1229 | "mime-types": "^2.1.27", 1230 | "neo-async": "^2.6.2", 1231 | "pkg-dir": "^5.0.0", 1232 | "schema-utils": "^3.0.0", 1233 | "tapable": "^2.1.1", 1234 | "terser-webpack-plugin": "^5.1.1", 1235 | "watchpack": "^2.0.0", 1236 | "webpack-sources": "^2.1.1" 1237 | }, 1238 | "dependencies": { 1239 | "enhanced-resolve": { 1240 | "version": "5.6.0", 1241 | "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.6.0.tgz", 1242 | "integrity": "sha512-C3GGDfFZmqUa21o10YRKbZN60DPl0HyXKXxoEnQMWso9u7KMU23L7CBHfr/rVxORddY/8YQZaU2MZ1ewTS8Pcw==", 1243 | "requires": { 1244 | "graceful-fs": "^4.2.4", 1245 | "tapable": "^2.2.0" 1246 | } 1247 | }, 1248 | "tapable": { 1249 | "version": "2.2.0", 1250 | "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.0.tgz", 1251 | "integrity": "sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw==" 1252 | } 1253 | } 1254 | }, 1255 | "webpack-cli": { 1256 | "version": "4.3.1", 1257 | "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.3.1.tgz", 1258 | "integrity": "sha512-/F4+9QNZM/qKzzL9/06Am8NXIkGV+/NqQ62Dx7DSqudxxpAgBqYn6V7+zp+0Y7JuWksKUbczRY3wMTd+7Uj6OA==", 1259 | "requires": { 1260 | "@discoveryjs/json-ext": "^0.5.0", 1261 | "@webpack-cli/info": "^1.2.1", 1262 | "@webpack-cli/serve": "^1.2.1", 1263 | "colorette": "^1.2.1", 1264 | "commander": "^6.2.0", 1265 | "enquirer": "^2.3.6", 1266 | "execa": "^5.0.0", 1267 | "fastest-levenshtein": "^1.0.12", 1268 | "import-local": "^3.0.2", 1269 | "interpret": "^2.2.0", 1270 | "rechoir": "^0.7.0", 1271 | "v8-compile-cache": "^2.2.0", 1272 | "webpack-merge": "^4.2.2" 1273 | }, 1274 | "dependencies": { 1275 | "commander": { 1276 | "version": "6.2.1", 1277 | "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", 1278 | "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==" 1279 | } 1280 | } 1281 | }, 1282 | "webpack-merge": { 1283 | "version": "4.2.2", 1284 | "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz", 1285 | "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==", 1286 | "requires": { 1287 | "lodash": "^4.17.15" 1288 | } 1289 | }, 1290 | "webpack-sources": { 1291 | "version": "2.2.0", 1292 | "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.2.0.tgz", 1293 | "integrity": "sha512-bQsA24JLwcnWGArOKUxYKhX3Mz/nK1Xf6hxullKERyktjNMC4x8koOeaDNTA2fEJ09BdWLbM/iTW0ithREUP0w==", 1294 | "requires": { 1295 | "source-list-map": "^2.0.1", 1296 | "source-map": "^0.6.1" 1297 | } 1298 | }, 1299 | "which": { 1300 | "version": "2.0.2", 1301 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 1302 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 1303 | "requires": { 1304 | "isexe": "^2.0.0" 1305 | } 1306 | }, 1307 | "wordwrap": { 1308 | "version": "1.0.0", 1309 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", 1310 | "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" 1311 | }, 1312 | "wrappy": { 1313 | "version": "1.0.2", 1314 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1315 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 1316 | }, 1317 | "yallist": { 1318 | "version": "4.0.0", 1319 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 1320 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" 1321 | }, 1322 | "yocto-queue": { 1323 | "version": "0.1.0", 1324 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 1325 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" 1326 | } 1327 | } 1328 | } 1329 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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/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/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 | -------------------------------------------------------------------------------- /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/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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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-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/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/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/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 | -------------------------------------------------------------------------------- /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/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/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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /webpack.ts: -------------------------------------------------------------------------------- 1 | export { IfcFile } from "./src/ifc-parser/ifc-parser.ts"; 2 | --------------------------------------------------------------------------------