├── .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 |
5 |
6 |
7 |
The BIM Whale Project
8 |
9 |
10 | BIMWHALE.js | A simple client-side IFC parser
11 |
12 | View the demo »
13 |
14 |
15 | Explore docs
16 | ·
17 | Access IFC sample files
18 | ·
19 | Report Bug
20 | ·
21 | Request Feature
22 |
23 |
24 |
25 |
26 |
27 | Table of Contents
28 |
29 | -
30 | About
31 |
32 | -
33 | Getting Started
34 |
38 |
39 | -
40 | Usage
41 |
44 |
45 | - Roadmap
46 | - Contributing
47 | - License
48 | - Contact
49 | - Extra
50 |
51 |
52 |
53 |
54 |
55 | ## About
56 |
57 | **The BIM Whale** (Swedish: _BIM-valen_) is a project about the Industry Foundation Classes (IFC) format.
58 | The aim of this project is to:
59 |
60 | > I: Introduce and explain the basics of IFC schema
61 |
62 | > II: Teach people how to parse an IFC file and retrieve basic information
63 |
64 | In more specific terms, the goal of this project is to:
65 |
66 | > A: Provide a simple and fast IFC parser
67 |
68 | > B: Provide learning resources (documentation, videos, power points) to people within the AEC industry
69 |
70 | **Goal A** has been realized as **BIMWHALE.js**, i.e. this repo.
71 | BIMWHALE.js is a simple client-side IFC parser built using TypeScript.
72 |
73 | Please note that the BIMWHALE.js is **NOT** supposed to be an all singing, all dancing parser.
74 | This project is only looking to parse information that we know exists, so-called `User Defined IFC Property Sets`.
75 |
76 | Again, the focus with The BIM Whale Project is to educate people.
77 | The code itself and its functionality are secondary.
78 |
79 | Explore the [docs](https://andrewisen.gitbook.io/bim-whale/) for more information.
80 |
81 |
82 |
83 | ## FAQ
84 |
85 | **Question:** What does _The BIM Whale_ do?
86 |
87 | **Answer:** Parse so-called `User Defined IFC Property Sets` from an IFC file
88 |
89 | ##
90 |
91 | **Q:** What does _The BIM Whale_ NOT do?
92 |
93 | **A:** Parse entity attributes, parse geometry, follow the EXPRESS standard, etc. etc.
94 |
95 | ##
96 |
97 | **Q:** What is an IFC file?
98 |
99 | **A:** Industry Foundation Classes (IFC) is a standardized, digital description of a BIM model. See [IFC](https://en.wikipedia.org/wiki/Industry_Foundation_Classes) for more information.
100 |
101 | ##
102 |
103 | **Q:** What is a STEP file?
104 |
105 | **A:** A STEP-File is the format IFC uses. See [ISO 10303-21](https://en.wikipedia.org/wiki/ISO_10303-21) for more information
106 |
107 | ##
108 |
109 | **Q:** Is this code "hand made"?
110 |
111 | **A:** Yes, the code is hand made. The parsing is not derived from an EXPRESS definition.
112 |
113 | ##
114 |
115 | **Q:** Is the code ready for production?
116 |
117 | **A:** No, not yet. See [open issues](/issues) for more info
118 |
119 | ## Getting Started
120 |
121 | 1. A compiled _JS bundle file_ is available here:
122 |
123 | [https://cdn.jsdelivr.net/gh/andrewisen/bim-whale/dist/BIMWHALE.min.js](https://cdn.jsdelivr.net/gh/andrewisen/bim-whale/dist/BIMWHALE.min.js)
124 |
125 | 2. Add it to your project
126 |
127 | ```html
128 |
129 | ```
130 |
131 | 3. Use the FileReader API and create a new `IfcFile` object
132 |
133 | ```javascript
134 | // The libary is called: BIMWHALE
135 | var fileReader = new FileReader();
136 | fileReader.onload = function (e) {
137 | const lines = e.target.result.split(/\r\n|\n/);
138 | let ifcFile = new BIMWHALE.IfcFile(lines, config);
139 | ifcFile.parseIfcFile();
140 | };
141 | fileReader.readAsText(file);
142 | ```
143 |
144 | 4. See the docs for more information: [docs.bimvalen.se](docs.bimvalen.se)
145 |
146 | ## Local Development
147 |
148 | These next steps will guide you to set up your own development platform.
149 |
150 | ### Prerequisites
151 |
152 | This repository uses Deno as the runtime for TypeScript.
153 |
154 | - Install Deno.
155 | See instruction at [https://deno.land](https://deno.land)
156 |
157 | ### Installation
158 |
159 | 1. Clone the repo
160 |
161 | ```shell
162 | git clone https://github.com/andrewisen/bim-whale.git
163 | ```
164 |
165 | 2. Replace the following files with your own content.
166 |
167 | - `index.ts`
168 | - `src/config.ts`
169 |
170 | The easiest approach is to copy content of the `example.NAME.ts` file.
171 |
172 | **In other words:**
173 | Replace `index.ts` with the content inside `example.index.ts`.
174 |
175 | 4. Make sure you update `src/config.ts` and provide a correct **filePath**.
176 | You can download some sample files here: [https://github.com/andrewisen/bim-whale-ifc-samples](https://github.com/andrewisen/bim-whale-ifc-samples)
177 |
178 | 5. Check if Deno is working
179 |
180 | ```shell
181 | deno run --allow-read checkDeno.ts
182 | ```
183 |
184 | Any errors until this point are likely due to Deno.
185 | Submit an issue if have any problems.
186 |
187 |
188 |
189 | ## Usage
190 |
191 | - Run the app with:
192 |
193 | ```shell
194 | deno run --allow-read index.ts
195 | ```
196 |
197 | ### SimpleWall Sample File
198 |
199 | Download the `SimpleWall Sample File` [here](https://github.com/andrewisen/bim-whale-ifc-samples/tree/main/SimpleWall).
200 | The sample consist of:
201 |
202 | - A wall
203 | - A door
204 |
205 | Here's a screenshot:
206 |
207 | 
208 |
209 | The IFC file has a **Property Set** called `Custom_Pset`.
210 | Please note that the file only contains dummy data.
211 |
212 | 
213 |
214 | Make sure to update `src/config.ts` and provide a correct **filePath**.
215 | You should get the following result:
216 |
217 | ```javascript
218 | {
219 | TypeMark: "_TYPE-MARK_",
220 | Keynote: "_KEYNOTE_",
221 | StoreyName: "Level: Level 1",
222 | TypeDescription: "_DESCRIPTION_",
223 | StatusConstruction: "New Construction",
224 | NetArea: "14.04739",
225 | Height: "4000.",
226 | Width: "200.",
227 | Length: "4000.",
228 | Hyperlink: "_URL_"
229 | }
230 | {
231 | TypeMark: "20",
232 | Keynote: "--KEYNOTE--",
233 | StoreyName: "Level: Level 1",
234 | TypeDescription: "--DESCRIPTION--",
235 | StatusConstruction: "New Construction",
236 | NetArea: "3.18957899999998",
237 | Height: "2134.",
238 | Width: "915.",
239 | SillHeight: "0.",
240 | Hyperlink: "--URL--"
241 | }
242 | ```
243 |
244 | **In summary:**
245 | We have performed a simple parsing.
246 |
247 | We have only included `walls` and `doors` in our config file. See:
248 | `const selectedEntities: string[] = ["IFCDOOR", "IFCWALLSTANDARDCASE"];`
249 |
250 | **TODO**
251 |
252 |
253 |
254 | ## Roadmap
255 |
256 | This project is still in it's early development. And yes, it still has some bugs.
257 | Please be patience!
258 |
259 | See the [open issues](/issues) for a list of proposed features (and known issues).
260 |
261 |
262 |
263 | ## Contributing
264 |
265 | This project is still in it's early development.
266 | But, any contributions you make are **greatly appreciated**.
267 |
268 | 1. Fork the Project
269 | 2. Create your Feature Branch (`git checkout -b feature/AmazingFeature`)
270 | 3. Commit your Changes (`git commit -m 'Add some AmazingFeature'`)
271 | 4. Push to the Branch (`git push origin feature/AmazingFeature`)
272 | 5. Open a Pull Request
273 |
274 |
275 |
276 | ## License
277 |
278 | See `LICENSE` for more information.
279 |
280 |
281 |
282 | ## Contact
283 |
284 | - Email: [andre.wisen@gmail.com](mailto:andre.wisen@gmail.com])
285 | - LinkedIn: [https://linkedin.com/in/andrewisen/](https://linkedin.com/in/andrewisen/)
286 |
287 |
288 |
289 | ## Extra
290 |
291 | Not what you're looking for?
292 | Check out these projects instead!
293 |
294 | - [IFC.js](https://github.com/agviegas/IFC.js)
295 | - [IfcOpenShell](https://github.com/IfcOpenShell/IfcOpenShell)
296 | - [xBIM](https://github.com/xBimTeam)
297 | - [IFC++](https://github.com/ifcquery/ifcplusplus)
298 |
--------------------------------------------------------------------------------
/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 |
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 |
--------------------------------------------------------------------------------