Compare commits

...

233 Commits

Author SHA1 Message Date
Dion Moult e9c24a2656 Fix #3587. IfcCSV now supports custom formatting functions. 2023-08-26 15:15:34 +10:00
Gorgious56 5c73ef0a6d Fix #3641 : Error when creating roof type 2023-08-25 15:13:07 +02:00
Thomas Krijnen dadcbe61ea #3158 Fix unify inputs 2023-08-25 12:48:45 +02:00
Thomas Krijnen 93502a05ea Update draw.py --with-unify-inputs [True] 2023-08-25 12:43:32 +02:00
Andrej730 5ebde4c79a small info message on bim.get_representation_ifc_parameters
just to notify that it worked but haven't found any parameters
2023-08-25 12:16:40 +05:00
Dion Moult cf21ae22f1 Fix incorrect implementation of regex matching 2023-08-25 17:15:21 +10:00
Dion Moult cc500ae833 Fix #3635. Minor fix. 2023-08-25 16:59:08 +10:00
Dion Moult 256c0baa14 Accommodate invalid Revit models where they have invalid material relationships. 2023-08-25 16:52:00 +10:00
Dion Moult 66decc604e Fix failing tests and optimise brick tests. 2023-08-25 16:52:00 +10:00
Andrej730 356bc18078 fixed errors after 13309cb8c #3624
for example it was throwing errors when using WindowTool you selected a wall and it would try to assign current type to wall
2023-08-25 11:26:37 +05:00
rileywong311 1344cbc192 Update core/test_brick.py 2023-08-24 16:38:54 -07:00
rileywong311 e00ffb07ad Update tool/test_brick.py 2023-08-24 16:38:54 -07:00
rileywong311 dba43590a5 Fix bug where split screen selection from previous page is out of range on the next 2023-08-24 16:38:54 -07:00
rileywong311 a0613cfee6 Undo indentation from commit <e08283350> (did not account for no name existing) 2023-08-24 16:38:54 -07:00
rileywong311 c3de72b71a Fix Brick core
- Refresh viewer now reloads both screens by default
- Rename "add_namespace" to "add_brick_namespace"
- Fix error where "view_brick_class" was run instead of "brick.run_view_brick_class"
2023-08-24 16:38:54 -07:00
rileywong311 39fc60a482 Update core\tool.py for Brick 2023-08-24 16:38:54 -07:00
rileywong311 0d7e71a269 Fix Brick tool
- Data is now stored regularly and parsed in props
- "get_convertable_brick_spaces" returns a set
- "export_brick_attributes" always returns a tuple of strings
2023-08-24 16:38:54 -07:00
rileywong311 78a2f65ec3 Fix brick.feature
For one particular, I removed "And I set 'scene.BIMRootProperties.new_brick_relation_type' to 'hasPart'". Although it should really be "https://brickschema.org/schema/Brick#hasPart" to begin with, it was still failing the test. So removing it as a work around.
2023-08-24 16:38:54 -07:00
rileywong311 802bd74c52 Refactor UI get_brick_relations 2023-08-24 16:38:54 -07:00
rileywong311 33cf40debb Fix condition for hiding "view_brick_item" 2023-08-24 16:38:54 -07:00
rileywong311 ff63fd9f6f Rename 'add_brick_failed" to "add_brick_relation_failed" 2023-08-24 16:38:54 -07:00
rileywong311 5b207e6f54 Fix indentation for assign Brick reference 2023-08-24 16:38:54 -07:00
Gorgious 695dc6ec5a Fix #3636 : Check if representation class exists before testing if it's a circle extrusion representation 2023-08-24 20:42:42 +02:00
Sigma Dimensions (Yass) d3bcb8c6b9 updating a duration will not auto update schedule usage 2023-08-24 15:51:33 +01:00
Andrej730 6226aea3c3 Fixed bug adding ports to the transitions between profiles with an offset
end port ended up located without the offset
2023-08-24 18:22:03 +05:00
Andrej730 a30ad9b886 Fixed bug in shape_builder.mep_transition_calculate
it wasn't taking account that `h` can also end up negative
2023-08-24 18:22:03 +05:00
Andrej730 2b1e17681f Fixed bug with segments incorrectly adjusted after adding transition
If transition was really long comparing to segments length then DumbProfileJoiner.join_E would start change their their length in unexpected way - ATSTART when you'd still expect ATEND and vice versa.

Also fixed the bug when segments length was incorrectly calculated - it wasn't calculating it world space when it makes more sense here to calculate it by local segments Z axis.
2023-08-24 18:22:03 +05:00
Dion Moult 8f25a31f19 Fix more failing tests. 2023-08-24 23:03:43 +10:00
Sigma Dimensions (Yass) 1c7e6cf1b9 fix bug where nested resources in task ICOM panel didn't show 2023-08-24 13:58:18 +01:00
Sigma Dimensions (Yass) fc7459c07f Resource Features :
- Adding/removing and edit productivity data is now easier (+ cleaner UI)
- Pressing calculate schedule work on a parent resource will default to calculating its nested resources schedule work.
- Show derived Schedule Work for a parent resource
- Improve apperance of Resource Tree Structure
2023-08-24 13:43:25 +01:00
Gorgious56 8f6932de64 Prevent user from editing the mesh of a circle based extrusion 2023-08-24 14:16:59 +02:00
Dion Moult b708100c03 See #3581. Fix failing IOS tests. 2023-08-24 22:12:44 +10:00
Christoph Mellueh d4e2d3d2dd rename File and unify with ci-ifctester-pypi 2023-08-24 21:05:54 +10:00
Andrej730 13309cb8c4 Fixed #3624 - tools props were updating only for BIM Tool
It wasn't taking into account WallTool, BeamTool and all other tools we have.
2023-08-24 15:42:23 +05:00
Andrej730 5a4bc0909b Update currently selected ifc class and type on selecting object
Had this idea for awhile now and heard it multiple times from other people. Please give feedback if this feature gets in the way instead of helping.

Example - https://imgur.com/a/K4hz2FB
2023-08-24 15:20:36 +05:00
Andrej730 39540e5794 A button to jump back from boolean to the original object
Example - https://imgur.com/a/A3dVbFM
2023-08-24 14:29:42 +05:00
Dion Moult 0a0f977b5c Fix #3632. Make search and CSV UIs share the same Blender props for DRY. 2023-08-24 17:01:25 +10:00
Dion Moult 13a75e7ad7 You can now reorder columns in IfcCSV 2023-08-24 13:56:43 +10:00
Dion Moult 99574d6255 Loading IFCs now prioritise 2D bodies over 3D non-bodies. This helps prevent loading and seeing a bunch of Box / Clearance representations. 2023-08-24 13:24:08 +10:00
Dion Moult 968cceb725 Fix #3627. Bug where exclude didn't take into account entities are "OR" not "AND". Whoops. 2023-08-24 11:50:48 +10:00
Sigma Dimensions (Yass) 002985a446 run black 2023-08-23 21:21:19 +01:00
Sigma Dimensions (Yass) 5adc29b0b3 Feature to calculate required resources 2023-08-23 21:21:03 +01:00
Sigma Dimensions (Yass) 52ea4ff44d Calculates the number of resources based on required person-hours. 2023-08-23 21:19:16 +01:00
Sigma Dimensions (Yass) 4e31a87c20 clean up Resource UI using column layout 2023-08-23 21:15:59 +01:00
Jesusbill 5d85390715 Fix duplicate id in EP_set_Drawing template 2023-08-23 17:01:25 +02:00
Andrej730 3e13eb8942 bump ifcsverchok release in readme 2023-08-23 18:43:27 +05:00
Andrej730 262c6d1fcb added UI to display connections for realizing elements
Example - https://imgur.com/a/1ZZlTwp
2023-08-23 18:42:07 +05:00
Andrej730 12b5a88861 Added small UI to show realizing elements for the connections
Example - https://i.imgur.com/JLDcnbK.png
2023-08-23 18:42:06 +05:00
Andrej730 2ccc9d886e test to make sure nothing happened to ifcsverchok 😅 2023-08-23 18:42:06 +05:00
Andrej730 a78769c8ff a bit faster renaming ifc elements when renaming blender objects
Previously when you renamed blender object it was requiring the "Ifc.../" prefix so it would also change the name for ifc element. So when you wanted to rename something you'd only select and change the name part without prefix.

Now you can just type the name right in after using F2 which seems a bit quicker by a few less clicks.

Before - https://imgur.com/a/Rn7a17W
After - https://imgur.com/a/a3lmxte
2023-08-23 18:42:06 +05:00
Andrej730 1a142ad5eb fixed bug in mep transitions
it wasn't taking into account that offset can be too big to sustain the angle
2023-08-23 18:42:06 +05:00
Andrej730 2bc22e150c added tests for shape builder transition length calculator 2023-08-23 18:42:06 +05:00
Sigma Dimensions (Yass) aad5d280fd you can now also update resource numbers (usage) from the task ICOM resource list 2023-08-23 14:13:16 +01:00
Sigma Dimensions (Yass) 7ab07ed149 refactor highligh_task code 2023-08-23 14:04:39 +01:00
Dion Moult 3690998dbc Fix #3620. Bug where manually inserted windows should preseve the existing Z value. 2023-08-23 23:03:13 +10:00
Sigma Dimensions (Yass) 1b83fcc1c7 when editing sequence relationships, enabling selecting successor and predecessor task 2023-08-23 14:02:53 +01:00
Sigma Dimensions (Yass) 5cf25c45f9 feature to select a resource in resource tree from task ICOM list 2023-08-23 13:59:31 +01:00
Dion Moult efa734c06e Fix #3628. Minor issue where regex queries didn't load properly. 2023-08-23 22:42:21 +10:00
Dion Moult e242244ec0 The copy property tool now works on enumerated properties. Hooray for copying over statuses! 2023-08-23 17:47:20 +10:00
Andrej730 6f9da163fb Small fix for 422f772c4 2023-08-23 12:32:37 +05:00
Dion Moult a3fd169bb6 IfcPatch now uses the new facet selector syntax. 2023-08-23 17:10:17 +10:00
Dion Moult 899056f929 Due to popular demand, custom EPset_Status to be used for "userdefined" status values as well as for things which don't have a status. 2023-08-23 17:10:17 +10:00
Dion Moult 132fef1b76 New Status panel for managing statuses in the costing / scheduling tab. 2023-08-23 17:10:17 +10:00
Andrej730 422f772c40 Fixed bug with remembering materials assigned to faces
The problem was that bim.update_representation was assigning representation styles without taking into account that some styles may not be actually used in the mesh, so it was always assigning first style (blender material) to the first IFCPOLYGONALFACESET even though it might be using for example the 3rd style.

More - https://community.osarch.org/discussion/1636/materials-not-remembering-their-assigment
2023-08-23 11:07:57 +05:00
Sigma Dimensions (Yass) 66f5081ada implement calculating task duration based on resource usage change for fixed person-hours and prevent constrained attributes from updating 2023-08-23 02:19:44 +01:00
Dion Moult 839e35f1da Fix #3627. Error where using filters incorrectly applied includes / excludes. 2023-08-23 11:15:38 +10:00
Sigma Dimensions (Yass) 40d9713326 consolidate constraint utilities into ifcopenshell.util.constraint and refactor 2023-08-23 02:11:18 +01:00
rileywong311 17b04ad697 Update Brick feature tests 2023-08-22 13:15:01 -07:00
rileywong311 2f99dd8e98 Catch Assign_Brick_Reference with no selections 2023-08-22 13:15:01 -07:00
rileywong311 49f825ba82 Refactor+polish Brick UI 2023-08-22 13:15:01 -07:00
rileywong311 3f18ad0bc5 Use "split" in Brick relations list to better align layout 2023-08-22 13:15:01 -07:00
rileywong311 991c42e816 Update Brick References Panel 2023-08-22 13:15:01 -07:00
rileywong311 20d6eae50a Export/assign Brick library reference uses "label" if there is one 2023-08-22 13:15:01 -07:00
rileywong311 9740582a84 Brick UI relations list uses "label" if there is one 2023-08-22 13:15:01 -07:00
rileywong311 a8046a6d69 Restore Brick select ifcGlobalID functionality 2023-08-22 13:15:01 -07:00
rileywong311 d6655a5c14 Move Brick "set last saved" to BrickStore 2023-08-22 13:15:01 -07:00
rileywong311 0a3a2db4ae Simplify buttons for add Brick relations manually 2023-08-22 13:15:01 -07:00
rileywong311 499eb5ea14 Rework Brick UI into toggle panels 2023-08-22 13:15:01 -07:00
rileywong311 b8ca287883 Fix up convert_ifc_to_brick
Remove line separation between code, but add comments
Add full URI to Brick relations
Fix typo where "system_uris" was written as "space_uris"
Remove unnecessary get of "distribution_elements = brick.get_convertable_brick_elements()" again
2023-08-22 13:15:01 -07:00
rileywong311 52f3392ece Remove Brick data debugging printouts 2023-08-22 13:15:01 -07:00
rileywong311 d53641ce5e Check Brick library location exists 2023-08-22 13:15:01 -07:00
Sigma Dimensions (Yass) 7a3ad6c3a1 forgotten bits and bobs + run black 2023-08-22 20:03:09 +01:00
Sigma Dimensions (Yass) 0b2007011e Feature to constrain a resource work or number of used resources 2023-08-22 20:01:19 +01:00
Sigma Dimensions (Yass) eae6983ca5 Fix calculating resource work based from parent's productivity and improve UI to show this 2023-08-22 19:54:37 +01:00
Sigma Dimensions (Yass) 0ec337748f improve purge of remove_metric usecase 2023-08-22 19:36:01 +01:00
Sigma Dimensions (Yass) 2699278ba3 api usecase to add a reference path to a metric objective 2023-08-22 19:34:47 +01:00
Sigma Dimensions (Yass) 0406166d8a fix updating an objective's metric 2023-08-22 19:21:26 +01:00
Andrej730 2128eda87b Save blenderbim last commit hash to the ifc header
Now it's possible to identify blenderbim version from .ifc file which is useful for debugging

Example:
FILE_NAME('test.ifc','2023-08-22T18:07:07+05:00',(),(),'IfcOpenShell v0.7.0-fc50bdd3a','BlenderBIM 0.0.999999-64bc7af','Nobody');
2023-08-22 19:59:46 +05:00
Dion Moult 21f4fb169f New util function to format a length value in preparation for custom formatting rules in drawings and schedules. 2023-08-22 23:12:37 +10:00
Thomas Krijnen 30fc52ebd9 #3616 Only consider distance orthogonal to projection vector for 2d boolean preprocessing 2023-08-22 15:00:25 +02:00
Andrej730 64bc7af4ef mep transitions - correct angle when connected segments share the same dimensions
Basically there are 3 methods to define the transition angle (https://i.imgur.com/AtCIJty.png). Before we supported only the second method, now we support 1 and 3 too.
2023-08-22 16:06:24 +05:00
Dion Moult b3f1fc667a IfcCSV can now create summary rows (e.g. total, average) at the end of the table (may or may not be in addition to group totals). 2023-08-22 21:04:59 +10:00
Dion Moult fcbb28f9d8 When you force an object to be a tessellation, automatically remove all parametric constraints for you. 2023-08-22 17:32:29 +10:00
Dion Moult 240a31db3a Fix bug where split elements by plane didn't work on multiple elements due to forgetting to toggle normals of the cutting plane. 2023-08-22 17:31:54 +10:00
Dion Moult c1bde09585 IfcCSV now supports grouping and group operations like concat, sum, min, max, etc. 2023-08-22 15:43:31 +10:00
Dion Moult 5dd2b5e555 New support for sorting IfcCSV outputs 2023-08-22 14:32:26 +10:00
Dion Moult 37dcb92220 Drawing include/exclude filters now use the new facet selector syntax 2023-08-22 11:31:18 +10:00
Dion Moult 6c43c60d04 Drawings now can include non-drawing specific annotations too. 2023-08-22 11:30:48 +10:00
Dion Moult b8d191ac1c Now support custom queries for advanced users in the facet selector (similar to old selector). Also support types and count keys. (e.g. filter by objects with zero types, or zero materials, etc). 2023-08-21 23:44:20 +10:00
Dion Moult 57173c7740 You can now get specific container types via util.element or util.selector. E.g. if you wanted to know what building an object is in or what storey an object is on. 2023-08-21 23:07:02 +10:00
Andrej730 2d3295ec54 more work on transitions for MEP
- support transitions from and to circle profiles
- reworked transition length algorithm now it should be more accurate
- added support for creating transitions between profiles that are parallel but not collinear
2023-08-21 17:56:17 +05:00
Andrej730 941ede117c show error if transition length is more the segments length 2023-08-21 17:56:17 +05:00
Andrej730 4210b8333f fix the errors occured trying to find compatible fitting type
1) It would stop if the first occurence would be connected to a segment without type
2) It would raise an error if one of the fitting's ports was not connected.
2023-08-21 17:56:17 +05:00
Sigma Dimensions (Yass) 1723d1e5a9 Update tests for editing sequence relationships 2023-08-21 13:43:43 +01:00
Sigma Dimensions (Yass) 3ee06ee7a0 remove unused function 2023-08-21 13:41:42 +01:00
Sigma Dimensions (Yass) d3e8da58dc stop committing print statements 2023-08-21 13:30:20 +01:00
Sigma Dimensions (Yass) 29e000b939 clean up updating selected task ICOM and UI re-ordering for work schedule subpanels 2023-08-21 13:28:08 +01:00
Sigma Dimensions (Yass) 6686a72d1f editing sequence relationships now requires less clicks 2023-08-21 13:24:36 +01:00
Sigma Dimensions (Yass) 7dd20f69d7 ligten up add cost schedule UI 2023-08-21 01:13:17 +01:00
Dion Moult 0044ef5588 Close #3615. Follow (terrible, unofficial) convention that boolean result is intentional and boolean clipping result is automated. 2023-08-21 08:53:14 +10:00
Dion Moult ffa5686b22 Fix #3614. Remove_pset API now supports removing predefined property sets (E.g. door lining properties). 2023-08-21 08:44:24 +10:00
Sigma Dimensions (Yass) ab8d6bea99 update sequence tool functions 2023-08-20 23:02:31 +01:00
Sigma Dimensions (Yass) e7bb89f582 You can now save and load 4D animation color schemes 2023-08-20 21:39:00 +01:00
Dion Moult c80b0464e5 Fix #3551. Project specific pset templates now show up in the pset template editor. 2023-08-20 23:51:38 +10:00
Dion Moult 7e3547b309 Fix #3610. Glitch where editing existing float cells in IfcCSV ODS files created new cells or didn't update. 2023-08-20 23:42:11 +10:00
Dion Moult 45c7432ff7 Minor fix 2023-08-20 22:53:32 +10:00
Dion Moult c98c20d403 Fix #3583. BaseQuantity QTOs in IFC4 can now be set on types. 2023-08-20 20:50:46 +10:00
Dion Moult d26a2580ea Fix #3605. Bug where invalid representation type was created when booleans are added / removed. 2023-08-20 17:12:01 +10:00
Dion Moult f84c4ab2e5 IfcCSV now supports importing from ODS, XLSX, and Pandas dataframes in addition to CSV 2023-08-20 16:55:01 +10:00
Dion Moult de6676a516 Fix #3609. IfcCSV can now optionally attempt to "preserve" formatting for XLSX and ODS. 2023-08-20 16:34:42 +10:00
Dion Moult bfbb7bec94 Fix #2973. Bundle pandas, openpyxl, and odfpy in preprataion for upgrades in IfcCSV and IfcFM. 2023-08-20 15:28:09 +10:00
Dion Moult ac00aaae4d Fix #3607. IfcCSV now supports omitting the GlobalId column. This is great for presentation schedules, but the tradeoff is that you can't use it for imports. 2023-08-20 14:41:34 +10:00
Dion Moult 422222a7cb Bump IOS 2023-08-19 23:13:25 +10:00
Dion Moult e1c7b37d62 See #3587. IfcCSV now supports custom header titles. 2023-08-19 23:09:40 +10:00
Ryan Schultz dec978743b small fix on 'Live development environment' instructions 2023-08-18 13:15:35 -05:00
Sigma Dimensions (Yass) 10fae033c8 fix saving and loading coulour schemes 2023-08-18 17:09:00 +01:00
Sigma Dimensions (Yass) b23180d287 fix enumartion of saved searches 2023-08-18 17:08:01 +01:00
Gorgious56 99ccd81b3f You can now purge unused representations from the purge data panel 2023-08-18 16:20:41 +02:00
Gorgious56 e2d3f3a351 You can now purge types from the Purge data panel
And refactor a bit the purge profiles code to make use of the profile tool module
2023-08-18 16:04:08 +02:00
Dion Moult 5e6a444aa2 Advanced users can now directly edit search filter queries. 2023-08-18 23:39:13 +10:00
Dion Moult 72cf5cfc59 Minor fix to allow edit_work_time to work seamlessly for IFC4X3. 2023-08-18 23:01:24 +10:00
Andrej730 75cb68d2f1 Refactored svg angle decorator code, solves #3602, more constistency between viewport and svg
Now it should be more consistent and more stable since svg and viewport are now using much more similar approach.
2023-08-18 17:59:40 +05:00
Dion Moult 7f40a9d723 See #3603. Base64 encode gantt chart JSON data to prevent JSON parsing problems. 2023-08-18 22:19:27 +10:00
Andrej730 dcc9d0e9cd set_objects_selection to set selection only if active_object is not None
It was creating errors if you'd try to add angle annotation without having any objects active.
2023-08-18 15:37:04 +05:00
Sigma Dimensions (Yass) 7228329f5e Start improving UI for clash detection and management 2023-08-18 11:04:21 +01:00
Gorgious56 d8786717b6 Active profil users count is now dynamically fetched when the profile is clicked in the UI list 2023-08-18 09:43:46 +02:00
Andrej730 b73bd3506f Fixed clearing scales (after 3345d7e)
It was producing a bug with text rotation in elevation view
Added fix to make matrix normalization work for the cases when matrix is rotated and I've just found that mathutils.Matrix.normalize(d) is very conveniently ignoring 4th column (translation) (same for mathutils.Vector)
2023-08-18 12:05:53 +05:00
Andrej730 bdb2791b35 Fill-bg for template tags #3594
Also simplified create_text_tag a bit - now it adds fill_bg by just by copying text tags and adding fill_bg filter to them instead of going through the entire logic again.
2023-08-18 12:04:42 +05:00
Dion Moult 549ea11945 Support arbitrary element selection for manual groups in search / IfcCSV, with support for huge element selections. 2023-08-18 16:58:07 +10:00
Dion Moult aed01b5703 IfcCSV can now use the graphical filter query builder too. 2023-08-18 13:43:42 +10:00
Dion Moult 13eb8562e0 Add support for converting IFC spaces, systems, and feed / location / part relationships into Brick. Brick utilities can now get downstream equipment, and system util can now take into account port flow direction. 2023-08-18 10:25:06 +10:00
rileywong311 c022a12835 Support displaying Brick Bnode relations
- Important for Ifc External References and other data.
- Set predicate_uri of predicates of the Bnode to None, which is used to remove the ability to delete the relationship in the UI.
- Also added try/excepts to difficult edge cases such as the object_uri not having a "#" character in it (such as "<http://qudt.org/vocab/unit/>") and the object_uri not being a brick class, which breaks "view_brick_item".
- Removing a Bnode type from the entity's relation removes all relations of the Bnode also
2023-08-17 16:19:49 -07:00
rileywong311 04eb47ff65 HIde Brick "Create Relation:" when not toggled 2023-08-17 16:19:49 -07:00
rileywong311 10ecd16f0c Refresh Brick split screen on ConvertIfcToBrick 2023-08-17 16:19:49 -07:00
rileywong311 75852bfa75 Rework "view brick item" conditional access
Change from never show the operator if the relation is "type" to not showing it only if the "type" is the current class being viewed.

This may come in handy if other list views other than hierarchy are implemented.

It also implies why we don't want to show "view brick item" here: because we already viewing it.
2023-08-17 16:19:49 -07:00
rileywong311 750c720c9b Support Add Brick with IfcEntity selected (part 2 aka references)
Can now assign references again.
See https://github.com/BrickSchema/Brick/tree/master/examples/ifc for examples.
2023-08-17 16:19:49 -07:00
rileywong311 4697681fcb Support Add Brick with IfcEntity selected (part 1)
Next is to add the reference
2023-08-17 16:19:49 -07:00
Dion Moult 9398363cbf Fix #3589. Users can now configure how the null values are represented in IfcCSV. 2023-08-18 08:50:48 +10:00
Massimo Fabbro ae45e6b960 Clone opening initial draft 2023-08-18 08:30:36 +10:00
Gorgious 88c002703e Move profile data and inverse check in data class 2023-08-17 21:00:03 +02:00
Gorgious56 51c78a89bd simplify ifc class suggestions json file and operator 2023-08-17 17:31:00 +02:00
Gorgious56 e36a958c0d Scene properties : Highlight buttons to make them stand out more (#3598) 2023-08-17 16:56:26 +02:00
Gorgious56 a8126a6f90 You can now purge unused profiles 2023-08-17 16:26:21 +02:00
Dion Moult 9b857cdefa Fix #3596. Fix bug where objects marked as edited were not unmarked after saving when toggling mode. Also fix bug where updating representation didn't check whether or not the meshlike representation has openings applied (which would bake the openings, instead of leaving them dynamic). 2023-08-18 00:04:02 +10:00
Gorgious56 90e6400115 Active Profile's inverse relationships count is now displayed in the profiles editor 2023-08-17 15:44:37 +02:00
Dion Moult 2dcfcf9708 Fix #3591. Fix bug where IfcCSV import was not symmetric capability wise. Now you can set all sorts of complex values with the exact same keys you are using to query. 2023-08-17 23:33:40 +10:00
Thomas Krijnen f4971da42e #3429 Fix b operand non-planar face check 2023-08-17 11:28:02 +02:00
Andrej730 008f953b6c Fix tests errors after 8689164
Error was AttributeError: module 'blenderbim.bim.handler' has no attribute 'setDefaultProperties'
2023-08-17 13:18:27 +05:00
Andrej730 5481237480 geometry.edit_object_placement was producing orphaned placements
It was producing orphaned IfcLocalPlacement if placement was parent to some other one. During edit_object_placement we were replacing all parent references with the new placement but wasn't removing the old one.
2023-08-17 13:18:27 +05:00
Andrej730 4f7564e5ae misspelling 😅 2023-08-17 13:18:27 +05:00
Dion Moult d214cbaece Fix #3590. Update dev instructions to symlink other utility libraries in BBIM. 2023-08-17 17:37:37 +10:00
Dion Moult d0c5f1e69f Fix #2626. New IFC overrides for setting object origins. 2023-08-17 17:25:40 +10:00
Massimo Fabbro 4ba3240fb4 fix #3213 Problem related with sheet created on windows and opened on Linux 2023-08-17 16:22:16 +10:00
rileywong311 6d8e5e4c83 Merge Brick classification
https://github.com/rileywong311/BrickIfcClassification
2023-08-17 16:21:29 +10:00
rileywong311 cd1402570b Merge IfcClassification
https://github.com/Moult/IfcClassification/tree/master
2023-08-17 16:21:29 +10:00
Sigma Dimensions (Yass) 6c0e528dd2 enable an object to take part in an object type decomposition #3592 2023-08-16 16:08:27 +01:00
Dion Moult 297a513d21 Don't strictly require guids / class filters that exist in new facet selector. 2023-08-16 14:05:26 +10:00
Andrej730 9f0a4ba064 Calculate/guess quantity descriptions to avoid confusion 2023-08-15 14:42:31 +05:00
Dion Moult 8813ed66e0 See #3582. Fix bug where switching representations didn't handle curves in a body / model_view.
This means that if you created a curve body, you couldn't switch to it, or if you deleted everything, you ended up with an empty object. If you then tried to switch to that, it would "sync" the empty object and leave you with an empty cartesian point list. E.g:

 1. Create cube and assign IFC element.
 2. Remove all faces only (leaving edges and verts). Save changes.
 3. Switch to representation (bug!)
 4. Delete everything (no verts, edges, or faces). Attempt to save.
 5. "Revert" switch will fail, leading to empty mesh.
 6. Manually try to switch. Empty mesh will sync, creating an empty point list.
2023-08-15 18:06:16 +10:00
Andrej730 fafcd5dfca root.copy_class to remove connections from previously connected ports 2023-08-15 10:35:36 +05:00
Dion Moult f523870b57 Fix #3584. Support matching enumerated properties in new facet selector. 2023-08-15 09:59:50 +10:00
Sigma Dimensions (Yass) 2ed24434c8 experimental import plot coordinates 2023-08-14 18:22:11 +01:00
Andrej730 6878b2c072 Handle ods schedules without column styles #3573
Turned out there are ODS files (and turned out we're producing them ourselves from ifccsv) where column styles are not defined and therefore no width/style assigned to each column which was resulting in errors on building schedule.
2023-08-14 17:46:10 +05:00
Dion Moult 0ed8dc970d New simplified IfcFM parser for basic object data. 2023-08-14 16:14:57 +10:00
Andrej730 bc85f09109 Small info message on using validate 2023-08-14 11:09:26 +05:00
Andrej730 793b28e43b Remove empty IfcDocumentInformationRelationship #3581 2023-08-14 11:09:26 +05:00
Dion Moult ed4abacd1e Fix #3578. Support querying surface styles in tools like IfcCSV. 2023-08-14 11:55:15 +10:00
Dion Moult 8bf55ab46c See #3561. Misc annotation decorator now only highlights non-internal edges. 2023-08-13 23:34:06 +10:00
Dion Moult 7edabce657 Fix #3562. Non-manifold geometry is no longer considered in join criteria as there is no such thing as a closed polygon. 2023-08-13 23:04:32 +10:00
Sigma Dimensions (Yass) 56187e4da3 Improve Cost Schedule Layout 2023-08-13 13:23:31 +01:00
Sigma Dimensions (Yass) 31a12faef1 woopsies 2023-08-13 12:18:48 +01:00
Sigma Dimensions (Yass) eb94c16465 fix the bug fix #07b5c49 - where counting objects controlled by a cost item stopped working 2023-08-13 12:16:29 +01:00
Dion Moult e8437a9c54 Fix #3253. Bug where duplicating elements with fillings incorrectly recreated fillings at the cursor (i.e. the cursor was used as a target destination).
Now, instead of trying to be clever and regenerating filling locations and opening types, we simply copy the existing scenario. This also means it'll be more stable for weird fillings coming from proprietary apps.
2023-08-13 20:07:33 +10:00
Dion Moult 840039ef1e Fix #3472. You can now toggle selectability of linked IFCs. 2023-08-13 15:49:23 +10:00
Dion Moult 84a749605e See #3579. Support Google Colab as an installation option. 2023-08-13 14:48:49 +10:00
Bruno Postle c1283d2ab0 fix SyntaxError: '(' was never closed 2023-08-12 21:36:40 +01:00
Sigma Dimensions (Yass) 07b5c4918b fix api logic where only quantities of the same type can be assignmed to a cost control 2023-08-12 15:17:32 +01:00
Sigma Dimensions (Yass) 703f0a6b70 fix orphaned data when unassigning element quantities from cost item control 2023-08-12 14:57:01 +01:00
Dion Moult 5e98dee46f Fix #3554. Support editing IfcIndexedPolyCurve profiles where IfcLineIndex has >2 indices. 2023-08-12 22:25:34 +10:00
Sigma Dimensions (Yass) b2eddf55d2 Fix contracting/expanding cost schedule tree and add tests to avoid proof changes 2023-08-12 12:58:16 +01:00
Massimo Fabbro db7be640d4 Fix #3569 Variable name override caused the bug (#3575) 2023-08-12 19:03:58 +10:00
Dion Moult 04fa597844 Fix #3564. Bug where IfcBuiltSystems didn't show up due to missing icon in IFC4X3. 2023-08-12 17:09:48 +10:00
Dion Moult 694dbeb96c Fix #3576. Explicit drawing annotations are now immune to "include / exclude" filters. 2023-08-12 17:06:22 +10:00
Dion Moult 7afd358c3c Fix #3556. Bug where quantities could not be imported using IfcCSV. Also make IfcCSV support any qset name, not just "Qto" prefixed names. 2023-08-12 16:41:57 +10:00
Dion Moult b0a5a570a9 IfcCSV now uses the new filter query system. 2023-08-12 16:40:59 +10:00
Dion Moult c45b84c850 Fix #3577. Don't force uppercase in schedules. 2023-08-12 16:16:51 +10:00
rileywong311 d575a43aee Make refresh Brick viewer refresh both screens 2023-08-11 16:14:41 -07:00
rileywong311 0b151ea559 Second level query for Brick equipment+point roots 2023-08-11 16:14:41 -07:00
rileywong311 926970b256 Polish Brick UI and add "last saved" label 2023-08-11 16:14:41 -07:00
rileywong311 d58af0bfa5 Filter Brick class if deprecated 2023-08-11 16:14:41 -07:00
rileywong311 429da7c6f3 Filter more (all) Brick ontology namespaces
I'm not sure if this method of filtering out the entire domain will cause problems. This could use investigation.
2023-08-11 16:14:41 -07:00
rileywong311 60a7433573 Clear Brick breadcrumbs on close project 2023-08-11 16:14:41 -07:00
rileywong311 08a5d444d4 Remove another needless BrickStore.graph.triples check
As before, this returns a generator type which always evaluates true, even if it is empty.
2023-08-11 16:14:41 -07:00
rileywong311 1982069b69 Add description to Brick operators 2023-08-11 16:14:41 -07:00
rileywong311 7c06c65df3 Move Brick "set root" button and change roots on update instead of operator 2023-08-11 16:14:41 -07:00
Sigma Dimensions (Yass) 6263766202 fix Cost schedule of rates UI bug where linked types dont't refresh correctly (and black formatting) 2023-08-11 14:57:43 +01:00
Dion Moult 66fbbeff54 See #3561. Fix bug where schedules couldn't be removed. 2023-08-11 22:47:42 +10:00
Dion Moult 3c5ad1328f Auto create relevant context when attempting to add an annotation to make it friendlier for new users. 2023-08-11 22:41:47 +10:00
Dion Moult 3345d7e088 Fix #2894. Implement reflected ceiling plans. Note that this requires new bot build. 2023-08-11 22:41:47 +10:00
Dion Moult 2bb25cb874 See #3501. Minor matrix math fix that caused annotations to not appear in global coordinates. 2023-08-11 22:41:47 +10:00
Dion Moult 444a728e7a Improve default search filter to include types and spatial elements. 2023-08-11 22:41:47 +10:00
Sigma Dimensions (Yass) 70bea0c865 Feature to add a camera to extents of the scene objects 2023-08-11 13:39:58 +01:00
Sigma Dimensions (Yass) 6eea1e9035 feature to clear previous 4D Animation (object keyframes & colors) 2023-08-11 13:36:14 +01:00
Kristoffer Andersen 4deb1836ad Update bld.bat
reduce number of schema variations on windows as well
2023-08-11 11:42:08 +02:00
Kristoffer Andersen 4c8007dcfe Update meta.yaml
pin compatible boost, occt and cgal-cpp
2023-08-11 08:44:25 +02:00
Kristoffer Andersen 000116bb3d Update build.sh
limit number of schema variants
2023-08-11 08:22:52 +02:00
Dion Moult a2b6f21c7a See #2894. Implement SVG mirroring options (typically used for RCPs or useful when converting to other things like DXF). 2023-08-11 16:01:01 +10:00
Sigma Dimensions (Yass) a374ee39d3 simplify setup_default_task_columns 2023-08-11 02:06:49 +01:00
Sigma Dimensions (Yass) 0f5c82dffd animation settings now use human readable durations to make it less confusing 2023-08-11 02:05:37 +01:00
Sigma Dimensions (Yass) 268fed761e simplify updateTaskDuration 2023-08-11 02:03:07 +01:00
Sigma Dimensions (Yass) fe01d252db WIP - Scheduling UI improvements 2023-08-10 22:07:34 +01:00
Sigma Dimensions (Yass) dc36d74337 Hide Header for Costing and Schedule Tab 2023-08-10 16:36:35 +01:00
Sigma Dimensions (Yass) 7a0da7bd8e Revert "Rename and move sub panels of Costing and Schedule Tab"
This reverts commit 9d4715c0a9.
2023-08-10 16:20:13 +01:00
Andrej730 530d5a4e63 plug add_transition to fit_flow_segments 2023-08-10 17:37:52 +05:00
Andrej730 2d847d1704 Adjusting connected elements on bim.regenerate_distribution_element
Basically commented out automatic adjustment after 45f81b478 - now it's hapenning only when you decide to regenerate it.

It's adjusting connected segments extrusion and location, for all other elements besides segments it's adjusting only location. The idea is it will try to change as less as possible.

Demo - https://imgur.com/oZ1I2Bl
2023-08-10 16:31:08 +05:00
Andrej730 631d8fcfb1 quickly connect mep elements if they have matching ports
Demo - https://imgur.com/a/o9u8M1u
2023-08-10 15:06:16 +05:00
Andrej730 a8888efb88 fixed bug getting port relating element in ifc2x3 2023-08-10 14:12:20 +05:00
Andrej730 a51ecea9b1 More descriptive error message on attempt to delete drawings category 2023-08-10 13:55:46 +05:00
Andrej730 4d49517111 small refactor 2023-08-10 13:49:35 +05:00
Thomas Krijnen d5d1b3567b Update draw.py --include-curves 2023-08-10 15:44:21 +08:00
Kristoffer Andersen 7827ce3448 Update build.sh
fix env var declaration
2023-08-10 08:22:07 +02:00
Kristoffer Andersen a05059db01 Update build.sh
Reduce number of schema versions
2023-08-10 08:06:38 +02:00
Thomas Krijnen b78490ca56 #3510 Sample points along diagonal as well for quick and dirty occlusion detection 2023-08-10 10:52:06 +08:00
262 changed files with 988214 additions and 2379 deletions
+57
View File
@@ -0,0 +1,57 @@
name: ci-bcf-pypi
on:
schedule:
# ┌───────────── minute (0 - 59)
# │ ┌───────────── hour (0 - 23)
# │ │ ┌───────────── day of the month (1 - 31)
# │ │ │ ┌───────────── month (1 - 12 or JAN-DEC)
# │ │ │ │ ┌───────────── day of the week (0 - 6 or SUN-SAT)
# * * * * *
- cron: "0 0 18 * *"
push:
paths:
- '.github/workflows/ci-bcf-pypi.yml'
workflow_dispatch:
env:
major: 0
minor: 0
name: ifcopenshell
jobs:
activate:
runs-on: ubuntu-latest
if: |
github.repository == 'IfcOpenShell/IfcOpenShell'
steps:
- name: Set env
run: echo ok go
build:
needs: activate
name: ${{ matrix.config.name }}-${{ matrix.pyver }}
runs-on: ubuntu-latest
strategy:
fail-fast: false
steps:
- uses: actions/checkout@v2 # https://github.com/actions/checkout
- uses: actions/setup-python@v2 # https://github.com/actions/setup-python
with:
python-version: '3.10' # Version range or exact version of a Python version to use, using SemVer's version range syntax
architecture: 'x64' # optional x64 or x86. Defaults to x64 if not specified
- run: echo ${{ env.DATE }}
- name: Get current date
id: date
run: echo "::set-output name=date::$(date +'%y%m%d')"
- name: Compile
run: |
pip install build
cd src/bcf &&
python -m build
- name: Publish a Python distribution to PyPI
uses: ortega2247/pypi-upload-action@master
with:
user: __token__
password: ${{ secrets.PYPI_API_TOKEN }}
packages_dir: src/bcf/dist
-37
View File
@@ -1,37 +0,0 @@
name: ci-bcf
on:
push:
jobs:
activate:
runs-on: ubuntu-latest
if: |
github.repository == 'IfcOpenShell/IfcOpenShell' &&
contains(github.event.head_commit.message, '[bcf release]')
steps:
- run: echo ok go
upload:
needs: activate
name: Upload BCF package to Pypi
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-python@v2
with:
python-version: '3.10'
- name: Build package
run: |
cd src/bcf
pip install build
python -m build
- name: Test
run: |
cd src/bcf
make test
- name: Publish package
uses: pypa/gh-action-pypi-publish@release/v1
with:
user: __token__
password: ${{ secrets.PYPI_TOKEN }}
packages_dir: src/bcf/dist
+1
View File
@@ -4,6 +4,7 @@ set MY_PY_VER=%PY_VER:.=%
set LIBXML2="%LIBRARY_PREFIX%/lib/libxml2.lib"
cmake -G "Ninja" ^
-D SCHEMA_VERSIONS="2x3;4;4x1;4x3;4x3_add1" ^
-D CMAKE_BUILD_TYPE:STRING=Release ^
-D CMAKE_INSTALL_PREFIX:FILEPATH="%LIBRARY_PREFIX%" ^
-D CMAKE_PREFIX_PATH:FILEPATH="%LIBRARY_PREFIX%" ^
+1
View File
@@ -13,6 +13,7 @@ if [ `uname` == Darwin ]; then
fi
cmake -G Ninja \
-DSCHEMA_VERSIONS="2x3;4;4x1;4x3;4x3_add1" \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=$PREFIX \
${CMAKE_PLATFORM_FLAGS[@]} \
+3 -3
View File
@@ -36,10 +36,10 @@ requirements:
run:
- python
- boost-cpp
- occt ==7.7.0
- {{ pin_compatible('occt', max_pin='x.x.x') }}
- {{ pin_compatible('cgal-cpp', max_pin='x.x.x') }}
- {{ pin_compatible('boost-cpp', max_pin='x.x.x') }}
- libxml2
- cgal-cpp
- hdf5
- mpfr
- gmp # [unix]
+12 -15
View File
@@ -38,17 +38,21 @@ endif
VERSION:=`date '+%y%m%d'`
LAST_COMMIT_HASH:=$(shell git rev-parse HEAD)
PYVERSION:=py310
PYPI_IMP:=cp
ifeq ($(PYVERSION), py39)
PYLIBDIR:=python3.9
PYNUMBER:=39
PYPI_VERSION:=3.9
endif
ifeq ($(PYVERSION), py310)
PYLIBDIR:=python3.10
PYNUMBER:=310
PYPI_VERSION:=3.10
endif
ifeq ($(PLATFORM), linux)
PYPI_PLATFORM:=--platform manylinux_2_17_x86_64
ifeq ($(PYVERSION), py39)
HPPFCL_URL:=https://anaconda.org/conda-forge/hpp-fcl/2.3.4/download/linux-64/hpp-fcl-2.3.4-py39h40a70d0_0.conda
EIGENPY_URL:=https://anaconda.org/conda-forge/eigenpy/3.1.0/download/linux-64/eigenpy-3.1.0-py39hdfdd6bb_0.conda
@@ -74,6 +78,7 @@ ZLIB_URL:=https://anaconda.org/conda-forge/zlib/1.2.11/download/linux-64/zlib-1.
endif
ifeq ($(PLATFORM), macos)
PYPI_PLATFORM:=--platform macosx_10_9_x86_64
ifeq ($(PYVERSION), py39)
HPPFCL_URL:=https://anaconda.org/conda-forge/hpp-fcl/2.3.4/download/osx-64/hpp-fcl-2.3.4-py39hd85b194_0.conda
EIGENPY_URL:=https://anaconda.org/conda-forge/eigenpy/3.1.0/download/osx-64/eigenpy-3.1.0-py39hc4d6e28_0.conda
@@ -99,6 +104,7 @@ ZLIB_URL:=https://anaconda.org/conda-forge/zlib/1.2.11/download/osx-64/zlib-1.2.
endif
ifeq ($(PLATFORM), macosm1)
PYPI_PLATFORM:=--platform macosx_11_0_arm64
ifeq ($(PYVERSION), py39)
HPPFCL_URL:=https://anaconda.org/conda-forge/hpp-fcl/2.3.4/download/osx-arm64/hpp-fcl-2.3.4-py39hc34188a_0.conda
EIGENPY_URL:=https://anaconda.org/conda-forge/eigenpy/3.1.0/download/osx-arm64/eigenpy-3.1.0-py39h13cfc01_0.conda
@@ -124,6 +130,7 @@ ZLIB_URL:=https://anaconda.org/conda-forge/zlib/1.2.11/download/osx-arm64/zlib-1
endif
ifeq ($(PLATFORM), win)
PYPI_PLATFORM:=--platform win_amd64
ifeq ($(PYVERSION), py39)
HPPFCL_URL:=https://anaconda.org/conda-forge/hpp-fcl/2.3.4/download/win-64/hpp-fcl-2.3.4-py39h39b25cb_0.conda
EIGENPY_URL:=https://anaconda.org/conda-forge/eigenpy/3.1.0/download/win-64/eigenpy-3.1.0-py39hb6c915b_0.conda
@@ -164,7 +171,7 @@ endif
cp -r blenderbim/* dist/blenderbim/
# Provides IfcOpenShell Python functionality
cd dist/working && wget https://s3.amazonaws.com/ifcopenshell-builds/ifcopenshell-python-$(PYNUMBER)-v0.7.0-fc50bdd-$(PLATFORM)64.zip
cd dist/working && wget https://s3.amazonaws.com/ifcopenshell-builds/ifcopenshell-python-$(PYNUMBER)-v0.7.0-dcc9d0e-$(PLATFORM)64.zip
cd dist/working && unzip ifcopenshell-python*
cp -r dist/working/ifcopenshell dist/blenderbim/libs/site/packages/
@@ -376,6 +383,10 @@ endif
mkdir dist/working
cd dist/working && $(PYTHON) -m venv env
cd dist/working && mkdir site-packages
# Required by IfcCSV
cd dist/working && . env/bin/activate && $(PIP) install pandas $(PYPI_PLATFORM) --python-version $(PYPI_VERSION) --implementation $(PYPI_IMP) --only-binary=:all: --target=./site-packages
cd dist/working && . env/bin/activate && $(PIP) install openpyxl --target=./site-packages
cd dist/working && . env/bin/activate && $(PIP) install odfpy --target=./site-packages
# Required by IFCCityJSON
cd dist/working && . env/bin/activate && $(PIP) install cjio --target=./site-packages
# Provides express rule validation for ifcopenshell.validate
@@ -590,20 +601,6 @@ endif
cd dist/working/XlsxWriter-1.2.9/ && cp -r xlsxwriter ../../blenderbim/libs/site/packages/
rm -rf dist/working
# Required by IFCCOBie for ODS support
mkdir dist/working
cd dist/working && wget https://files.pythonhosted.org/packages/97/73/8ade73f6749177003f7ce3304f524774adda96e6aaab30ea79fd8fda7934/odfpy-1.4.1.tar.gz
cd dist/working && tar -xzvf odfpy*
cd dist/working/odfpy-1.4.1/ && cp -r odf ../../blenderbim/libs/site/packages/
rm -rf dist/working
# Required by odfpy
mkdir dist/working
cd dist/working && wget https://files.pythonhosted.org/packages/a4/5f/f8aa58ca0cf01cbcee728abc9d88bfeb74e95e6cb4334cfd5bed5673ea77/defusedxml-0.6.0.tar.gz
cd dist/working && tar -xzvf defusedxml*
cd dist/working/defusedxml-0.6.0/ && cp -r defusedxml ../../blenderbim/libs/site/packages/
rm -rf dist/working
# Required by augin
mkdir dist/working
cd dist/working && wget https://files.pythonhosted.org/packages/76/b4/b7baffbda025efd5dc8fcd8d2e953e3aa939c236a484084fa8f4c3588ee9/boto3-1.17.17.tar.gz
@@ -145,11 +145,17 @@ classes = [
ui.BIM_PT_tab_services_object,
# Structural analysis
ui.BIM_PT_tab_structural,
# Construction scheduling
ui.BIM_PT_tab_status,
ui.BIM_PT_tab_resources,
ui.BIM_PT_tab_cost,
ui.BIM_PT_tab_sequence,
# Facility management
ui.BIM_PT_tab_handover,
ui.BIM_PT_tab_operations,
# Quality and coordination
ui.BIM_PT_tab_quality_control,
ui.BIM_PT_tab_clash_detection,
ui.BIM_PT_tab_collaboration,
ui.BIM_PT_tab_sandbox,
# TODO: move this somewhere else and clean it up
@@ -44,17 +44,17 @@
<circle r="5" fill="white" stroke="black" style="stroke-width: 0.25;" />
<line x1="-5" y1="0" x2="5" y2="0" style="stroke: black; stroke-width: 0.25;" />
</g>
<g id="SurveyArea">
<g id="SURVEY">
<circle r="1" fill="black" stroke="black" style="stroke-width: 0.25;" />
</g>
<g id="SurveyArea-CONTROLPOINT">
<g id="SURVEY-CONTROLPOINT">
<path style="fill: white; stroke: black; stroke-width: 0.25;" d="M 2.286165,1.4798666 H -1.0000316e-7 -2.2861651 L -1.1430826,-0.5000101 -1.0000316e-7,-2.479888 1.1430827,-0.5000101 Z" />
<circle r="0.5" fill="black" stroke="black" style="stroke-width: 0.25;" />
</g>
<g id="SurveyArea-TRAVERSEPOINT">
<g id="SURVEY-TRAVERSEPOINT">
<path style="fill: white; stroke: black; stroke-width: 0.5;" d="M -2,-2 2,2 M -2,2 2,-2" />
</g>
<g id="SurveyArea-SPOTELEVATION">
<g id="SURVEY-SPOTELEVATION">
<path style="fill: white; stroke: black; stroke-width: 0.5;" d="M 0,-2 0,2 M -2,0 2,0" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 3.5 KiB

After

Width:  |  Height:  |  Size: 3.5 KiB

@@ -51,5 +51,5 @@ var json_data = `{{{json_data}}}`;
<script>
var data = `{{{data}}}`;
setupPage(data);
create_gantt_chart(json_data)
</script>
create_gantt_chart(atob(json_data))
</script>
@@ -5,27 +5,27 @@ FILE_NAME('EPset_Drawing.ifc','2020-01-01T00:00:00',(),(),'EPset_Drawing','EPset
FILE_SCHEMA(('IFC4'));
ENDSEC;
DATA;
#1=IFCPROPERTYSETTEMPLATE('2JhNIvqZrFnAgxfhK0XVQX',$,'EPset_Drawing','',.PSET_OCCURRENCEDRIVEN.,'IfcAnnotation',(#2,#3,#4,#5,#6,#7,#8,#9,#10,#11,#12,#13,#14,#15,#16,#17,#18,#19,#20,#21));
#1=IFCPROPERTYSETTEMPLATE('2JhNIvqZrFnAgxfhK0XVQX',$,'EPset_Drawing','',.PSET_OCCURRENCEDRIVEN.,'IfcAnnotation',(#2,#3,#4,#5,#6,#7,#8,#9,#10,#11,#12,#13,#14,#15,#16,#17,#18,#19,#20,#21,#22));
#2=IFCSIMPLEPROPERTYTEMPLATE('23JavTMk98ZxXhrUEnjAcf',$,'TargetView','',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.);
#3=IFCSIMPLEPROPERTYTEMPLATE('1yVWUt5H9DAOuu0OaMMLpe',$,'Scale','The scale of this drawing represented as a numerator and denominator, such as 1/100',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.);
#4=IFCSIMPLEPROPERTYTEMPLATE('3gsuPBtU93b8f0gg1pjkq6',$,'HumanScale','The scale of this drawing in human readable format, such as 1:100',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.);
#4=IFCSIMPLEPROPERTYTEMPLATE('2T$a4OFsv2LeD5JeBKEV4f',$,'IsNTS','Whether or not the scale is intended to be significant',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.);
#5=IFCSIMPLEPROPERTYTEMPLATE('0AK5C2UpL4$eaac2LszAx$',$,'HasUnderlay','',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.);
#6=IFCSIMPLEPROPERTYTEMPLATE('2j2ZEZR8X5tONm7kli5hM6',$,'HasLinework','',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.);
#7=IFCSIMPLEPROPERTYTEMPLATE('1ttChRysH9UuEX2FeMj5Hu',$,'HasAnnotation','',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.);
#8=IFCSIMPLEPROPERTYTEMPLATE('2NPPxuABv1huDTVh32TFgw',$,'GlobalReferencing','',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.);
#9=IFCSIMPLEPROPERTYTEMPLATE('10hT_1zrzEbRRKMXYAWvtD',$,'Metadata','',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.);
#10=IFCSIMPLEPROPERTYTEMPLATE('3Z0BXPSG5CWgtI33ioV7aj',$,'Include','Selector expression to include ifc elements in the drawing',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.);
#11=IFCSIMPLEPROPERTYTEMPLATE('1RVts_g3PAw98PJA2yL3bO',$,'Exclude','Selector expression to exclude ifc elements in the drawing',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.);
#12=IFCSIMPLEPROPERTYTEMPLATE('0c1$8NpYDEaBiJrj16jHIo',$,'Stylesheet','',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.);
#13=IFCSIMPLEPROPERTYTEMPLATE('3mRF52q81FQB$h4oTh7M45',$,'Markers','',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.);
#14=IFCSIMPLEPROPERTYTEMPLATE('1rhr_0N3LDtuORcEJP0KXM',$,'Symbols','',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.);
#15=IFCSIMPLEPROPERTYTEMPLATE('2sHDBuW7P4TROy$hL2w7ct',$,'Patterns','',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.);
#16=IFCSIMPLEPROPERTYTEMPLATE('1$xfo9EVb26QLqmPll2_RK',$,'MetricPrecision','',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.);
#17=IFCSIMPLEPROPERTYTEMPLATE('38uAtrp9nD_901NO42zd$7',$,'ImperialPrecision','',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.);
#18=IFCSIMPLEPROPERTYTEMPLATE('1MX0uffTL6TOvtvEJpxFmk',$,'DecimalPlaces','',.P_SINGLEVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.);
#19=IFCSIMPLEPROPERTYTEMPLATE('0joEq0Rd10cxweEh0NeHT6',$,'JoinCriteria','Comma separated selection keys which determine what cut objects are to be joined.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.);
#20=IFCSIMPLEPROPERTYTEMPLATE('0nYMT3OSj5gArVniCWZRtv',$,'ShadingStyles','',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.);
#21=IFCSIMPLEPROPERTYTEMPLATE('3VWG22eZXBdQwdKlzMeVQH',$,'CurrentShadingStyle','',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.);
#5=IFCSIMPLEPROPERTYTEMPLATE('2T$a4OFsv2LeD5JeBKEV4f',$,'IsNTS','Whether or not the scale is intended to be significant',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.);
#6=IFCSIMPLEPROPERTYTEMPLATE('0AK5C2UpL4$eaac2LszAx$',$,'HasUnderlay','',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.);
#7=IFCSIMPLEPROPERTYTEMPLATE('2j2ZEZR8X5tONm7kli5hM6',$,'HasLinework','',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.);
#8=IFCSIMPLEPROPERTYTEMPLATE('1ttChRysH9UuEX2FeMj5Hu',$,'HasAnnotation','',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.);
#9=IFCSIMPLEPROPERTYTEMPLATE('2NPPxuABv1huDTVh32TFgw',$,'GlobalReferencing','',.P_SINGLEVALUE.,'IfcBoolean',$,$,$,$,$,.READWRITE.);
#10=IFCSIMPLEPROPERTYTEMPLATE('10hT_1zrzEbRRKMXYAWvtD',$,'Metadata','',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.);
#11=IFCSIMPLEPROPERTYTEMPLATE('3Z0BXPSG5CWgtI33ioV7aj',$,'Include','Selector expression to include ifc elements in the drawing',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.);
#12=IFCSIMPLEPROPERTYTEMPLATE('1RVts_g3PAw98PJA2yL3bO',$,'Exclude','Selector expression to exclude ifc elements in the drawing',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.);
#13=IFCSIMPLEPROPERTYTEMPLATE('0c1$8NpYDEaBiJrj16jHIo',$,'Stylesheet','',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.);
#14=IFCSIMPLEPROPERTYTEMPLATE('3mRF52q81FQB$h4oTh7M45',$,'Markers','',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.);
#15=IFCSIMPLEPROPERTYTEMPLATE('1rhr_0N3LDtuORcEJP0KXM',$,'Symbols','',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.);
#16=IFCSIMPLEPROPERTYTEMPLATE('2sHDBuW7P4TROy$hL2w7ct',$,'Patterns','',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.);
#17=IFCSIMPLEPROPERTYTEMPLATE('1$xfo9EVb26QLqmPll2_RK',$,'MetricPrecision','',.P_SINGLEVALUE.,'IfcReal',$,$,$,$,$,.READWRITE.);
#18=IFCSIMPLEPROPERTYTEMPLATE('38uAtrp9nD_901NO42zd$7',$,'ImperialPrecision','',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.);
#19=IFCSIMPLEPROPERTYTEMPLATE('1MX0uffTL6TOvtvEJpxFmk',$,'DecimalPlaces','',.P_SINGLEVALUE.,'IfcInteger',$,$,$,$,$,.READWRITE.);
#20=IFCSIMPLEPROPERTYTEMPLATE('0joEq0Rd10cxweEh0NeHT6',$,'JoinCriteria','Comma separated selection keys which determine what cut objects are to be joined.',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.);
#21=IFCSIMPLEPROPERTYTEMPLATE('0nYMT3OSj5gArVniCWZRtv',$,'ShadingStyles','',.P_SINGLEVALUE.,'IfcText',$,$,$,$,$,.READWRITE.);
#22=IFCSIMPLEPROPERTYTEMPLATE('3VWG22eZXBdQwdKlzMeVQH',$,'CurrentShadingStyle','',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.);
ENDSEC;
END-ISO-10303-21;
@@ -0,0 +1,13 @@
ISO-10303-21;
HEADER;
FILE_DESCRIPTION((),'2;1');
FILE_NAME('EPset_Status.ifc','2020-01-01T00:00:00',(),(),'EPset_Status','EPset_Status',$);
FILE_SCHEMA(('IFC4'));
ENDSEC;
DATA;
#1=IFCPROPERTYSETTEMPLATE('3JoyTt$cz4fhYuQvJeTMhs',$,'EPset_Status','',.PSET_TYPEDRIVENOVERRIDE.,'IfcProduct',(#2,#4));
#2= IFCSIMPLEPROPERTYTEMPLATE('2HBOdOfz5E3hZ7IBLCq$$D',$,'Status','Status of the element, predominately used in renovation or retrofitting projects. The status can be assigned to as "New" - element designed as new addition, "Existing" - element exists and remains, "Demolish" - element existed but is to be demolished, "Temporary" - element will exists only temporary (like a temporary support structure).',.P_ENUMERATEDVALUE.,'IfcLabel',$,#3,$,$,$,.READWRITE.);
#3= IFCPROPERTYENUMERATION('EPEnum_ElementStatus',(IFCLABEL('NEW'),IFCLABEL('EXISTING'),IFCLABEL('DEMOLISH'),IFCLABEL('TEMPORARY'),IFCLABEL('OTHER'),IFCLABEL('NOTKNOWN'),IFCLABEL('UNSET')),$);
#4=IFCSIMPLEPROPERTYTEMPLATE('3ttXxqmlz62BlxjzEPpqvH',$,'UserDefinedStatus','',.P_SINGLEVALUE.,'IfcLabel',$,$,$,$,$,.READWRITE.);
ENDSEC;
END-ISO-10303-21;
+5 -2
View File
@@ -82,7 +82,7 @@ class IfcExporter:
)
self.file.wrapped_data.header.file_name.preprocessor_version = "IfcOpenShell {}".format(ifcopenshell.version)
self.file.wrapped_data.header.file_name.originating_system = "{} {}".format(
self.get_application_name(), self.get_application_version()
self.get_application_name(), tool.Blender.get_blenderbim_version()
)
def sync_all_objects(self):
@@ -162,7 +162,7 @@ class IfcExporter:
return "BlenderBIM"
def get_application_version(self):
return ".".join(
version = ".".join(
[
str(x)
for x in [
@@ -172,6 +172,9 @@ class IfcExporter:
][0]
]
)
if blenderbim.bim.last_commit_hash != "8888888":
version += f"-{blenderbim.bim.last_commit_hash[:7]}"
return version
class IfcExportSettings:
+26 -6
View File
@@ -27,6 +27,7 @@ from bpy.app.handlers import persistent
from blenderbim.bim.ifc import IfcStore
from blenderbim.bim.module.owner.prop import get_user_person, get_user_organisation
from blenderbim.bim.module.model.data import AuthoringData
from blenderbim.bim.module.model.workspace import LIST_OF_TOOLS, TOOLS_TO_CLASSES_MAP
from mathutils import Vector
from math import cos, degrees
@@ -73,17 +74,27 @@ def name_callback(obj, data):
refresh_ui_data()
return
if not obj.BIMObjectProperties.ifc_definition_id or "/" not in obj.name:
if not obj.BIMObjectProperties.ifc_definition_id:
return
element = IfcStore.get_file().by_id(obj.BIMObjectProperties.ifc_definition_id)
if "/" in obj.name:
object_name = obj.name
element_name = obj.name.split("/", 1)[1]
else:
element_name = obj.name
object_name = element.is_a() + f"/{element_name}"
obj.name = object_name # NOTE: doesn't trigger infinite recursion
if element.is_a("IfcGridAxis"):
element.AxisTag = obj.name.split("/")[1]
element.AxisTag = object_name.split("/")[1]
refresh_ui_data()
if not element.is_a("IfcRoot"):
return
element.Name = element_name
if obj.BIMObjectProperties.collection:
obj.BIMObjectProperties.collection.name = obj.name
element.Name = "/".join(obj.name.split("/")[1:])
obj.BIMObjectProperties.collection.name = object_name
refresh_ui_data()
@@ -106,7 +117,7 @@ def update_bim_tool_props():
return
mode = bpy.context.mode
current_tool = bpy.context.workspace.tools.from_space_view3d_mode(mode)
if not current_tool or current_tool.idname != "bim.bim_tool":
if not current_tool or current_tool.idname not in LIST_OF_TOOLS:
return
element = tool.Ifc.get_entity(obj)
if not element:
@@ -114,6 +125,16 @@ def update_bim_tool_props():
representation = ifcopenshell.util.representation.get_representation(element, "Model", "Body", "MODEL_VIEW")
if not representation:
return
props = bpy.context.scene.BIMModelProperties
if element.is_a("IfcElementType") or element.is_a("IfcElement"):
element_type = ifcopenshell.util.element.get_type(element)
if element_type:
is_bim_tool = current_tool.idname == "bim.bim_tool"
if is_bim_tool:
props.ifc_class = element_type.is_a()
if is_bim_tool or TOOLS_TO_CLASSES_MAP.get(current_tool.idname) == element_type.is_a():
props.relating_type_id = str(element_type.id())
extrusion = tool.Model.get_extrusion(representation)
if not extrusion:
return
@@ -124,7 +145,6 @@ def update_bim_tool_props():
return x_angle
si_conversion = ifcopenshell.util.unit.calculate_unit_scale(tool.Ifc.get())
props = bpy.context.scene.BIMModelProperties
if not AuthoringData.is_loaded:
AuthoringData.load()
+75
View File
@@ -273,6 +273,81 @@ def convert_property_group_from_si(property_group, skip_props=()):
setattr(property_group, prop_name, prop_value)
def draw_filter(layout, props, data, module):
if not data.is_loaded:
data.load()
sprops = bpy.context.scene.BIMSearchProperties
if tool.Ifc.get():
row = layout.row(align=True)
row.label(text=f"{len(data.data['saved_searches'])} Saved Searches")
if data.data["saved_searches"]:
row.operator("bim.load_search", text="", icon="IMPORT").module = module
row.operator("bim.save_search", text="", icon="EXPORT").module = module
row = layout.row(align=True)
row.operator("bim.add_filter_group", text="Add Search Group", icon="ADD").module = module
row.operator("bim.edit_filter_query", text="", icon="FILTER").module = module
for i, filter_group in enumerate(props.filter_groups):
box = layout.box()
row = box.row(align=True)
row.prop(sprops, "facet", text="")
op = row.operator("bim.add_filter", text="Add Filter", icon="ADD")
op.type = sprops.facet
op.index = i
op.module = module
for j, ifc_filter in enumerate(filter_group.filters):
if ifc_filter.type == "entity":
row = box.row(align=True)
row.prop(ifc_filter, "value", text="", icon="FILE_3D")
elif ifc_filter.type == "attribute":
row = box.row(align=True)
row.prop(ifc_filter, "name", text="", icon="COPY_ID")
row.prop(ifc_filter, "value", text="")
elif ifc_filter.type == "type":
row = box.row(align=True)
row.prop(ifc_filter, "value", text="", icon="FILE_VOLUME")
elif ifc_filter.type == "material":
row = box.row(align=True)
row.prop(ifc_filter, "value", text="", icon="MATERIAL")
elif ifc_filter.type == "property":
row = box.row(align=True)
row.prop(ifc_filter, "pset", text="", icon="PROPERTIES")
row.prop(ifc_filter, "name", text="")
row.prop(ifc_filter, "value", text="")
elif ifc_filter.type == "classification":
row = box.row(align=True)
row.prop(ifc_filter, "value", text="", icon="OUTLINER")
elif ifc_filter.type == "location":
row = box.row(align=True)
row.prop(ifc_filter, "name", text="", icon="PACKAGE")
elif ifc_filter.type == "query":
row = box.row(align=True)
row.prop(ifc_filter, "name", text="", icon="POINTCLOUD_DATA")
row.prop(ifc_filter, "value", text="")
elif ifc_filter.type == "instance":
row = box.row(align=True)
row.prop(ifc_filter, "value", text="", icon="GRIP")
op = row.operator("bim.select_filter_elements", text="", icon="EYEDROPPER")
op.group_index = i
op.index = j
op.module = module
op = row.operator("bim.remove_filter", text="", icon="X")
op.group_index = i
op.index = j
op.module = module
row = box.row()
op = row.operator("bim.remove_filter_group", icon="X")
op.index = i
op.module = module
# TODO this should move into ifcopenshell.util
+8 -4
View File
@@ -221,7 +221,9 @@ class IfcStore:
blenderbim.bim.handler.subscribe_to(obj, "diffuse_color", blenderbim.bim.handler.color_callback)
elif isinstance(obj, bpy.types.Object):
blenderbim.bim.handler.subscribe_to(obj, "mode", blenderbim.bim.handler.mode_callback)
blenderbim.bim.handler.subscribe_to(obj, "active_material_index", blenderbim.bim.handler.active_material_index_callback)
blenderbim.bim.handler.subscribe_to(
obj, "active_material_index", blenderbim.bim.handler.active_material_index_callback
)
if IfcStore.history:
data = {"id": element.id(), "guid": getattr(element, "GlobalId", None), "obj": obj.name}
@@ -248,7 +250,9 @@ class IfcStore:
blenderbim.bim.handler.subscribe_to(obj, "diffuse_color", blenderbim.bim.handler.color_callback)
elif isinstance(obj, bpy.types.Object):
blenderbim.bim.handler.subscribe_to(obj, "mode", blenderbim.bim.handler.mode_callback)
blenderbim.bim.handler.subscribe_to(obj, "active_material_index", blenderbim.bim.handler.active_material_index_callback)
blenderbim.bim.handler.subscribe_to(
obj, "active_material_index", blenderbim.bim.handler.active_material_index_callback
)
# TODO Listeners are not re-registered. Does this cause nasty problems to debug later on?
# TODO We're handling id_map and guid_map, but what about edited_objs? This might cause big problems.
@@ -321,7 +325,7 @@ class IfcStore:
IfcStore.begin_transaction(operator)
if tool.Ifc.get():
tool.Ifc.get().begin_transaction()
if BrickStore.graph:
if BrickStore.graph is not None: # `if BrickStore.graph` by itself takes ages.
BrickStore.begin_transaction()
# This empty transaction ensures that each operator has at least one transaction
IfcStore.add_transaction_operation(operator, rollback=lambda data: True, commit=lambda data: True)
@@ -339,7 +343,7 @@ class IfcStore:
IfcStore.add_transaction_operation(
operator, rollback=lambda d: tool.Ifc.get().undo(), commit=lambda d: tool.Ifc.get().redo()
)
if BrickStore.graph:
if BrickStore.graph is not None: # `if BrickStore.graph` by itself takes ages.
BrickStore.end_transaction()
IfcStore.end_transaction(operator)
blenderbim.bim.handler.refresh_ui_data()
+26 -25
View File
@@ -227,16 +227,16 @@ class IfcImporter:
self.settings.set_deflection_tolerance(self.ifc_import_settings.deflection_tolerance)
self.settings.set_angular_tolerance(self.ifc_import_settings.angular_tolerance)
self.settings.set(self.settings.STRICT_TOLERANCE, True)
self.settings_curve = ifcopenshell.geom.settings()
self.settings_curve.set_deflection_tolerance(self.ifc_import_settings.deflection_tolerance)
self.settings_curve.set_angular_tolerance(self.ifc_import_settings.angular_tolerance)
self.settings_curve.set(self.settings_curve.STRICT_TOLERANCE, True)
self.settings_curve.set(self.settings_curve.INCLUDE_CURVES, True)
self.settings_body_2d = ifcopenshell.geom.settings()
self.settings_body_2d.set_deflection_tolerance(self.ifc_import_settings.deflection_tolerance)
self.settings_body_2d.set_angular_tolerance(self.ifc_import_settings.angular_tolerance)
self.settings_body_2d.set(self.settings_body_2d.STRICT_TOLERANCE, True)
self.settings_body_2d.set(self.settings_body_2d.INCLUDE_CURVES, True)
self.settings_native = ifcopenshell.geom.settings()
self.settings_native.set(self.settings_native.INCLUDE_CURVES, True)
self.settings_2d = ifcopenshell.geom.settings()
self.settings_2d.set(self.settings_2d.INCLUDE_CURVES, True)
self.settings_2d.set(self.settings_2d.STRICT_TOLERANCE, True)
self.settings_plan_2d = ifcopenshell.geom.settings()
self.settings_plan_2d.set(self.settings_plan_2d.INCLUDE_CURVES, True)
self.settings_plan_2d.set(self.settings_plan_2d.STRICT_TOLERANCE, True)
self.project = None
self.has_existing_project = False
self.collections = {}
@@ -348,13 +348,14 @@ class IfcImporter:
if c.ContextIdentifier in ["Body", "Facetation"]
]
# Ideally, all representations should be in a subcontext, but some BIM programs don't do this correctly
self.body_contexts.extend(
[
c.id()
for c in self.file.by_type("IfcGeometricRepresentationContext", include_subtypes=False)
if c.ContextType == "Model"
]
)
if not self.body_contexts:
self.body_contexts.extend(
[
c.id()
for c in self.file.by_type("IfcGeometricRepresentationContext", include_subtypes=False)
if c.ContextType == "Model"
]
)
if self.body_contexts:
self.settings.set_context_ids(self.body_contexts)
# Annotation ContextType is to accommodate broken Revit files
@@ -365,7 +366,7 @@ class IfcImporter:
if c.ContextType in ["Plan", "Annotation"] or c.ContextIdentifier == "Annotation"
]
if self.plan_contexts:
self.settings_2d.set_context_ids(self.plan_contexts)
self.settings_plan_2d.set_context_ids(self.plan_contexts)
def process_element_filter(self):
offset = self.ifc_import_settings.element_offset
@@ -645,7 +646,7 @@ class IfcImporter:
self.ifc_import_settings.logger.error("An invalid grid was found %s", grid)
continue
if grid.Representation:
shape = ifcopenshell.geom.create_shape(self.settings_2d, grid)
shape = ifcopenshell.geom.create_shape(self.settings_plan_2d, grid)
grid_obj = self.create_product(grid, shape)
if bpy.context.preferences.addons["blenderbim"].preferences.lock_grids_on_import:
grid_obj.lock_location = (True, True, True)
@@ -664,7 +665,7 @@ class IfcImporter:
def create_grid_axes(self, axes, grid_collection, grid_obj):
for axis in axes:
shape = ifcopenshell.geom.create_shape(self.settings_2d, axis.AxisCurve)
shape = ifcopenshell.geom.create_shape(self.settings_plan_2d, axis.AxisCurve)
mesh = self.create_mesh(axis, shape)
obj = bpy.data.objects.new(f"IfcGridAxis/{axis.AxisTag}", mesh)
if bpy.context.preferences.addons["blenderbim"].preferences.lock_grids_on_import:
@@ -698,7 +699,7 @@ class IfcImporter:
shape = ifcopenshell.geom.create_shape(self.settings, representation)
except:
try:
shape = ifcopenshell.geom.create_shape(self.settings_2d, representation)
shape = ifcopenshell.geom.create_shape(self.settings_plan_2d, representation)
except:
self.ifc_import_settings.logger.error("Failed to generate shape for %s", element)
if shape:
@@ -764,9 +765,9 @@ class IfcImporter:
if self.ifc_import_settings.should_load_geometry:
products = self.create_products(elements)
elements -= products
products = self.create_products(elements, settings=self.settings_curve)
products = self.create_products(elements, settings=self.settings_body_2d)
elements -= products
products = self.create_products(elements, settings=self.settings_2d)
products = self.create_products(elements, settings=self.settings_plan_2d)
elements -= products
products = self.create_pointclouds(elements)
elements -= products
@@ -901,10 +902,10 @@ class IfcImporter:
self.structural_collection.children.link(self.structural_connection_collection)
self.project["blender"].children.link(self.structural_collection)
self.create_products(self.file.by_type("IfcStructuralCurveMember"), settings=self.settings_2d)
self.create_products(self.file.by_type("IfcStructuralCurveConnection"), settings=self.settings_2d)
self.create_products(self.file.by_type("IfcStructuralSurfaceMember"), settings=self.settings_2d)
self.create_products(self.file.by_type("IfcStructuralSurfaceConnection"), settings=self.settings_2d)
self.create_products(self.file.by_type("IfcStructuralCurveMember"), settings=self.settings_plan_2d)
self.create_products(self.file.by_type("IfcStructuralCurveConnection"), settings=self.settings_plan_2d)
self.create_products(self.file.by_type("IfcStructuralSurfaceMember"), settings=self.settings_plan_2d)
self.create_products(self.file.by_type("IfcStructuralSurfaceConnection"), settings=self.settings_plan_2d)
self.create_structural_point_connections()
def create_structural_point_connections(self):
@@ -35,13 +35,16 @@ classes = (
operator.ViewBrickItem,
operator.SerializeBrick,
operator.AddBrickNamespace,
operator.SetBrickListRoot,
operator.RemoveBrickRelation,
prop.Brick,
prop.BIMBrickProperties,
ui.BIM_PT_brickschema,
ui.BIM_PT_ifc_brickschema_references,
ui.BIM_PT_brickschema_project_info,
ui.BIM_PT_brickschema_namespaces,
ui.BIM_PT_brickschema_create_entity,
ui.BIM_PT_brickschema_viewport,
ui.BIM_UL_bricks,
ui.BIM_PT_ifc_brickschema_references,
)
@@ -46,7 +46,7 @@ class BrickschemaData:
@classmethod
def get_is_loaded(cls):
return BrickStore.graph is not None
return BrickStore.graph is not None # `if BrickStore.graph` by itself takes ages.
@classmethod
def active_relations(cls):
@@ -67,45 +67,63 @@ class BrickschemaData:
PREFIX brick: <https://brickschema.org/schema/Brick#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
SELECT DISTINCT ?predicate ?object ?sp ?sv WHERE {
<{uri}> ?predicate ?object .
OPTIONAL {
{ ?predicate rdfs:range brick:TimeseriesReference . }
UNION
{ ?predicate a brick:EntityProperty . }
?object ?sp ?sv }
SELECT DISTINCT ?predicate ?object ?label ?sp ?sv WHERE {
<{uri}> ?predicate ?object .
OPTIONAL {
?object rdfs:label ?label .
}
OPTIONAL {
{ ?predicate rdfs:range brick:TimeseriesReference . }
UNION
{ ?predicate a brick:EntityProperty . }
?object ?sp ?sv .
}
}
GROUP BY ?object
""".replace(
"{uri}", uri
)
)
for row in query:
predicate = row.get("predicate")
predicate_name = predicate.toPython().split("#")[-1]
object = row.get("object")
object_name = object.toPython().split("#")[-1]
predicate_uri = row.get("predicate")
predicate_name = predicate_uri.toPython().split("#")[-1]
object_uri = row.get("object")
object_name = row.get("label")
if not object_name:
if isinstance(object_uri, BNode):
object_name = "[]"
else:
try:
object_name = object_uri.toPython().split("#")[-1]
except:
object_name = str(object_uri)
results.append(
{
"predicate": predicate,
"predicate_uri": predicate_uri,
"predicate_name": predicate_name,
"object": object,
"object_uri": object_uri,
"object_name": object_name,
"is_uri": isinstance(object, URIRef),
"object_uri": object.toPython(),
"is_globalid": predicate == "globalID",
"is_uri": isinstance(object_uri, URIRef),
"is_globalid": predicate_name == "ifcGlobalID",
}
)
# if isinstance(row.get("object"), BNode):
# for s, p, o in BrickStore.graph.triples((object, None, None)):
# results.append(
# {
# "predicate": predicate + ":" + p.toPython().split("#")[-1],
# "object": o.toPython().split("#")[-1],
# "is_uri": isinstance(o, URIRef),
# "object_uri": o.toPython(),
# "is_globalid": p.toPython().split("#")[-1] == "globalID",
# }
# )
if isinstance(object_uri, BNode):
for subject2, predicate2, object2 in BrickStore.graph.triples((object_uri, None, None)):
predicate2_name = predicate2.toPython().split("#")[-1]
try:
object2_name = object2.toPython().split("#")[-1]
except:
object2_name = str(object2)
results.append(
{
"predicate_uri": None,
"predicate_name": predicate_name + ":" + predicate2_name,
"object_uri": object2,
"object_name": object2_name,
"is_uri": isinstance(object2, URIRef),
"is_globalid": predicate2_name == "ifcGlobalID",
}
)
return results
@@ -131,7 +149,7 @@ class BrickschemaReferencesData:
for library in ifc.by_type("IfcLibraryInformation"):
if tool.Ifc.get_schema() == "IFC2X3":
results.append((str(library.id()), library.Name or "Unnamed", ""))
elif ".ttl" in library.Location:
elif library.Location and ".ttl" in library.Location:
results.append((str(library.id()), library.Name or "Unnamed", ""))
return results
@@ -37,6 +37,7 @@ class LoadBrickProject(bpy.types.Operator, Operator):
bl_idname = "bim.load_brick_project"
bl_label = "Load Brickschema Project"
bl_options = {"REGISTER", "UNDO"}
bl_description = "Load in a Brick project from a file"
filepath: bpy.props.StringProperty(subtype="FILE_PATH")
filter_glob: bpy.props.StringProperty(default="*.ttl", options={"HIDDEN"})
@@ -56,6 +57,7 @@ class ViewBrickClass(bpy.types.Operator, Operator):
bl_idname = "bim.view_brick_class"
bl_label = "View Brick Class"
bl_options = {"REGISTER", "UNDO"}
bl_description = "Inspect the subclasses of this class"
brick_class: bpy.props.StringProperty(name="Brick Class")
split_screen: bpy.props.BoolProperty(name="Split Screen", default=False, options={"HIDDEN"})
@@ -67,17 +69,22 @@ class ViewBrickItem(bpy.types.Operator, Operator):
bl_idname = "bim.view_brick_item"
bl_label = "View Brick Item"
bl_options = {"REGISTER", "UNDO"}
bl_description = "Inspect this entity in the viewer"
item: bpy.props.StringProperty(name="Brick Item")
split_screen: bpy.props.BoolProperty(name="Split Screen", default=False, options={"HIDDEN"})
def _execute(self, context):
core.view_brick_item(tool.Brick, item=self.item, split_screen=self.split_screen)
try:
core.view_brick_item(tool.Brick, item=self.item, split_screen=self.split_screen)
except:
self.report({'ERROR'}, f'Could not find {self.item}')
class RewindBrickClass(bpy.types.Operator, Operator):
bl_idname = "bim.rewind_brick_class"
bl_label = "Rewind Brick Class"
bl_options = {"REGISTER", "UNDO"}
bl_description = "Go back to the previous list view"
split_screen: bpy.props.BoolProperty(name="Split Screen", default=False, options={"HIDDEN"})
def _execute(self, context):
@@ -88,6 +95,7 @@ class CloseBrickProject(bpy.types.Operator, Operator):
bl_idname = "bim.close_brick_project"
bl_label = "Close Brick Project"
bl_options = {"REGISTER", "UNDO"}
bl_description = "Close the Brick project"
def _execute(self, context):
core.close_brick_project(tool.Brick)
@@ -97,6 +105,7 @@ class ConvertBrickProject(bpy.types.Operator, Operator):
bl_idname = "bim.convert_brick_project"
bl_label = "Convert Brick Project"
bl_options = {"REGISTER", "UNDO"}
bl_description = "Create an Ifc library for this Brick project"
def _execute(self, context):
core.convert_brick_project(tool.Ifc, tool.Brick)
@@ -106,9 +115,18 @@ class AssignBrickReference(bpy.types.Operator, Operator):
bl_idname = "bim.assign_brick_reference"
bl_label = "Assign Brick Reference"
bl_options = {"REGISTER", "UNDO"}
bl_description = "Assign the selected Ifc entity to the selected Brick entity"
def _execute(self, context):
if not context.active_object:
self.report({'ERROR'}, f'No Ifc selected')
return
props = context.scene.BIMBrickProperties
try:
props.bricks[props.active_brick_index]
except:
self.report({'ERROR'}, f'No Brick selected')
return
core.assign_brick_reference(
tool.Ifc,
tool.Brick,
@@ -122,19 +140,17 @@ class AddBrick(bpy.types.Operator, Operator):
bl_idname = "bim.add_brick"
bl_label = "Add Brick"
bl_options = {"REGISTER", "UNDO"}
bl_description = "Create the Brick entity"
def _execute(self, context):
props = context.scene.BIMBrickProperties
library = None
if props.libraries:
library = tool.Ifc.get().by_id(int(props.libraries))
core.add_brick(
tool.Ifc,
tool.Brick,
element=tool.Ifc.get_entity(context.active_object) if context.selected_objects else None,
namespace=props.namespace,
brick_class=props.brick_entity_class,
library=library,
library=tool.Ifc.get().by_id(int(props.libraries)) if props.libraries else None,
label=props.new_brick_label,
)
@@ -143,6 +159,7 @@ class AddBrickRelation(bpy.types.Operator, Operator):
bl_idname = "bim.add_brick_relation"
bl_label = "Add Brick Relation"
bl_options = {"REGISTER", "UNDO"}
bl_description = "Create the Brick relationship"
def _execute(self, context):
props = context.scene.BIMBrickProperties
@@ -152,7 +169,7 @@ class AddBrickRelation(bpy.types.Operator, Operator):
elif props.split_screen_toggled:
object = props.split_screen_bricks[props.split_screen_active_brick_index].uri
else:
object = props.new_brick_relation_namespace + props.new_brick_relation_object
object = props.namespace + props.new_brick_relation_object
core.add_brick_relation(
tool.Brick,
brick_uri=brick.uri,
@@ -165,6 +182,7 @@ class ConvertIfcToBrick(bpy.types.Operator, Operator):
bl_idname = "bim.convert_ifc_to_brick"
bl_label = "Convert IFC To Brick"
bl_options = {"REGISTER", "UNDO"}
bl_description = "Convert Ifc entities and relations to Brick entities and relations"
def _execute(self, context):
props = context.scene.BIMBrickProperties
@@ -178,6 +196,7 @@ class NewBrickFile(bpy.types.Operator):
bl_idname = "bim.new_brick_file"
bl_label = "New Brick File"
bl_options = {"REGISTER", "UNDO"}
bl_description = "Create a Brick project from scratch"
def execute(self, context):
IfcStore.begin_transaction(self)
@@ -210,16 +229,17 @@ class RefreshBrickViewer(bpy.types.Operator, Operator):
bl_idname = "bim.refresh_brick_viewer"
bl_label = "Refresh Brick Viewer"
bl_options = {"REGISTER", "UNDO"}
split_screen: bpy.props.BoolProperty(name="Split Screen", default=False, options={"HIDDEN"})
bl_description = "Refresh the list view"
def _execute(self, context):
core.refresh_brick_viewer(tool.Brick, split_screen=self.split_screen)
core.refresh_brick_viewer(tool.Brick)
class RemoveBrick(bpy.types.Operator, Operator):
bl_idname = "bim.remove_brick"
bl_label = "Remove Brick"
bl_options = {"REGISTER", "UNDO"}
bl_description = "Delete this entity"
def _execute(self, context):
props = context.scene.BIMBrickProperties
@@ -262,32 +282,20 @@ class SerializeBrick(bpy.types.Operator):
class AddBrickNamespace(bpy.types.Operator, Operator):
bl_idname = "bim.add_brick_namespace"
bl_label = "Add Brick Namespace"
bl_description = "Bind a new namespace to the Brick project"
def _execute(self, context):
props = context.scene.BIMBrickProperties
alias = props.new_brick_namespace_alias
uri = props.new_brick_namespace_uri
core.add_namespace(tool.Brick, alias=alias, uri=uri)
class SetBrickListRoot(bpy.types.Operator, Operator):
bl_idname = "bim.set_brick_list_root"
bl_label = "Set Brick View Type"
bl_options = {"REGISTER", "UNDO"}
split_screen: bpy.props.BoolProperty(name="Split Screen", default=False, options={"HIDDEN"})
def _execute(self, context):
if self.split_screen:
root = context.scene.BIMBrickProperties.split_screen_brick_list_root
else:
root = context.scene.BIMBrickProperties.brick_list_root
core.set_brick_list_root(tool.Brick, brick_root=root, split_screen=self.split_screen)
core.add_brick_namespace(tool.Brick, alias=alias, uri=uri)
class RemoveBrickRelation(bpy.types.Operator, Operator):
bl_idname = "bim.remove_brick_relation"
bl_label = "Remove Relation"
bl_options = {"REGISTER", "UNDO"}
bl_description = "Delete this relationship"
predicate: bpy.props.StringProperty(name="Relation")
object: bpy.props.StringProperty(name="Object")
@@ -30,6 +30,8 @@ from bpy.props import (
FloatVectorProperty,
CollectionProperty,
)
import blenderbim.core.brick as core
import blenderbim.tool.brick as tool
from blenderbim.tool.brick import BrickStore
def update_active_brick_index(self, context):
@@ -43,12 +45,12 @@ def get_libraries(self, context):
def get_namespaces(self, context):
return BrickStore.namespaces
return [(uri, f"{alias}: {uri}", "") for alias, uri in BrickStore.namespaces]
def get_brick_entity_classes(self, context):
entity = self.brick_entity_create_type
return BrickStore.entity_classes[entity]
return [(uri, uri.split("#")[-1], "") for uri in BrickStore.entity_classes[entity]]
def get_brick_roots(self, context):
@@ -56,13 +58,22 @@ def get_brick_roots(self, context):
def get_brick_relations(self, context):
def is_label(relation):
return relation["predicate_name"] == "label"
if not list(filter(is_label, BrickschemaData.data["active_relations"])):
new_relations = BrickStore.relationships.copy()
new_relations.append(("http://www.w3.org/2000/01/rdf-schema#label", "label", ""))
return new_relations
return BrickStore.relationships
relations = [(uri, uri.split("#")[-1], "") for uri in BrickStore.relationships]
for relation in BrickschemaData.data["active_relations"]:
if relation["predicate_name"] == "label":
return relations
relations.append(("http://www.w3.org/2000/01/rdf-schema#label", "label", ""))
return relations
def update_view(self, context):
root = context.scene.BIMBrickProperties.brick_list_root
core.set_brick_list_root(tool.Brick, brick_root=root, split_screen=False)
def split_screen_update_view(self, context):
root = context.scene.BIMBrickProperties.split_screen_brick_list_root
core.set_brick_list_root(tool.Brick, brick_root=root, split_screen=True)
class Brick(PropertyGroup):
@@ -79,10 +90,9 @@ class BIMBrickProperties(PropertyGroup):
active_brick_index: IntProperty(name="Active Brick Index", update=update_active_brick_index)
libraries: EnumProperty(name="Libraries", items=get_libraries)
set_list_root_toggled: BoolProperty(name="Set List Root Toggled", default=False)
brick_list_root: EnumProperty(name="Brick List Root", items=get_brick_roots)
brick_list_root: EnumProperty(name="Brick List Root", items=get_brick_roots, update=update_view)
# namespace manager
namespace: EnumProperty(name="Namespace", items=get_namespaces)
brick_settings_toggled: BoolProperty(name="Brick Settings Toggled", default=False)
new_brick_namespace_alias: StringProperty(name="New Brick Namespace Alias")
new_brick_namespace_uri: StringProperty(name="New Brick Namespace URI")
# create brick entity
@@ -93,13 +103,12 @@ class BIMBrickProperties(PropertyGroup):
brick_create_relations_toggled: BoolProperty(name="Brick Create Relations Toggled", default=False)
brick_edit_relations_toggled: BoolProperty(name="Brick Edit Relations Toggled", default=False)
new_brick_relation_type: EnumProperty(name="New Brick Relation Type", items=get_brick_relations)
new_brick_relation_namespace: EnumProperty(name="New Brick Relation Namespace", items=get_namespaces)
new_brick_relation_object: StringProperty(name="New Brick Relation Object")
add_relation_failed: BoolProperty(name="Add Relation Failed", default=False)
add_brick_relation_failed: BoolProperty(name="Add Relation Failed", default=False)
# create relations split screen
split_screen_toggled: BoolProperty(name="Split Screen Toggled", default=False)
split_screen_bricks: CollectionProperty(name="Split Screen Bricks", type=Brick)
split_screen_active_brick_index: IntProperty(name="Split Screen Active Brick Index", update=update_active_brick_index)
split_screen_active_brick_class: StringProperty(name="Split Screen Active Brick Class")
split_screen_brick_breadcrumbs: CollectionProperty(name="Split Screen Brick Breadcrumbs", type=StrProperty)
split_screen_brick_list_root: EnumProperty(name="Split Screen Brick List Root", items=get_brick_roots)
split_screen_brick_list_root: EnumProperty(name="Split Screen Brick List Root", items=get_brick_roots, update=split_screen_update_view)
+154 -85
View File
@@ -34,17 +34,36 @@ class BIM_PT_brickschema(Panel):
def draw(self, context):
if not BrickschemaData.is_loaded:
BrickschemaData.load()
self.props = context.scene.BIMBrickProperties
class BIM_PT_brickschema_project_info(Panel):
bl_label = "Project Info"
bl_idname = "BIM_PT_brickschema_project_info"
bl_space_type = "PROPERTIES"
bl_region_type = "WINDOW"
bl_context = "scene"
bl_parent_id = "BIM_PT_brickschema"
def draw(self, context):
self.props = context.scene.BIMBrickProperties
if not BrickschemaData.data["is_loaded"]:
row = self.layout.row(align=True)
row.operator("bim.new_brick_file", text="Create Project")
row.operator("bim.load_brick_project", text="Load Project")
return
row = self.layout.row(align=True)
if BrickStore.path:
row = self.layout.row(align=True)
row.label(text=BrickStore.path, icon="FILEBROWSER")
else:
row.label(text="No file", icon="FILEBROWSER")
row = self.layout.row(align=True)
if BrickStore.last_saved:
row.label(text=BrickStore.last_saved, icon="TIME")
else:
row.label(text="Not saved", icon="TIME")
row = self.layout.row(align=True)
op = row.operator("bim.serialize_brick", icon="EXPORT", text="Save")
@@ -53,134 +72,173 @@ class BIM_PT_brickschema(Panel):
op.should_save_as = True
row.operator("bim.close_brick_project", text="", icon="CANCEL")
row = self.layout.row(align=True)
row.prop(data=self.props, property="brick_settings_toggled", text="", icon="PREFERENCES")
if self.props.brick_settings_toggled:
box = self.layout.box()
row = box.row(align=True)
row.label(text="Active Namespace:")
row = box.row(align=True)
prop_with_search(row, self.props, "namespace", text="")
class BIM_PT_brickschema_namespaces(Panel):
bl_label = "Namespaces"
bl_idname = "BIM_PT_brickschema_namespaces"
bl_options = {"DEFAULT_CLOSED"}
bl_space_type = "PROPERTIES"
bl_region_type = "WINDOW"
bl_context = "scene"
bl_parent_id = "BIM_PT_brickschema"
row = box.row(align=True)
row.label(text="Bind New Namespace:")
@classmethod
def poll(cls, context):
return BrickStore.graph != None
row = box.row(align=True)
row.prop(data=self.props, property="new_brick_namespace_alias", text="")
col = row.column()
col.alignment = "CENTER"
col.scale_x = 1.1
col.label(text=":")
row.prop(data=self.props, property="new_brick_namespace_uri", text="")
row.operator("bim.add_brick_namespace", text="", icon="ADD")
def draw(self, context):
self.props = context.scene.BIMBrickProperties
row = self.layout.row(align=True)
row.label(text="Create Entity:")
row.label(text="Active Namespace:")
row = self.layout.row(align=True)
row.prop(data=self.props, property="brick_entity_create_type", text="")
prop_with_search(row, self.props, "namespace", text="")
row = self.layout.row(align=True)
row.prop(data=self.props, property="new_brick_label", text="")
prop_with_search(row, self.props, "brick_entity_class", text="")
row.operator("bim.add_brick", text="", icon="ADD")
# row.operator("bim.refresh_brick_viewer", text="", icon="FILE_REFRESH")
row.label(text="Bind New Namespace:")
row = self.layout.row(align=True)
row.prop(data=self.props, property="new_brick_namespace_alias", text="")
col = row.column()
col.alignment = "RIGHT"
col.alignment = "CENTER"
col.scale_x = 1.1
col.label(text=":")
row.prop(data=self.props, property="new_brick_namespace_uri", text="")
row.operator("bim.add_brick_namespace", text="", icon="ADD")
class BIM_PT_brickschema_create_entity(Panel):
bl_label = "Create Entity"
bl_idname = "BIM_PT_brickschema_create_entity"
bl_options = {"DEFAULT_CLOSED"}
bl_space_type = "PROPERTIES"
bl_region_type = "WINDOW"
bl_context = "scene"
bl_parent_id = "BIM_PT_brickschema"
@classmethod
def poll(cls, context):
return BrickStore.graph != None
def draw(self, context):
self.props = context.scene.BIMBrickProperties
# TO DO: hide this if selected entity already has a reference, or something similar
row = self.layout.row(align=True)
row.prop(data=self.props, property="brick_entity_create_type", text="Class")
row = self.layout.row(align=True)
prop_with_search(row, self.props, "brick_entity_class", text="Type")
row = self.layout.row(align=True)
active = tool.Ifc.get_entity(context.active_object)
if active and context.selected_objects:
row.label(text="Label:")
row.label(text=active.Name if active.Name else "Unnamed")
else:
row.prop(data=self.props, property="new_brick_label", text="Label")
row = self.layout.row(align=True)
row.operator("bim.add_brick", text="Create Entity")
class BIM_PT_brickschema_viewport(Panel):
bl_label = "Viewport"
bl_idname = "BIM_PT_brickschema_viewport"
bl_space_type = "PROPERTIES"
bl_region_type = "WINDOW"
bl_context = "scene"
bl_parent_id = "BIM_PT_brickschema"
@classmethod
def poll(cls, context):
return BrickStore.graph != None
def draw(self, context):
self.props = context.scene.BIMBrickProperties
row = self.layout.row(align=True)
row.column().alignment = "RIGHT"
row.prop(data=self.props, property="set_list_root_toggled", text="", icon="OUTLINER")
row.prop(data=self.props, property="split_screen_toggled", text="", icon="WINDOW")
row.operator("bim.refresh_brick_viewer", text="", icon="FILE_REFRESH")
grid = self.layout.grid_flow(even_columns=True)
grid1 = grid.column(align=True)
row = grid1.row(align=True)
grid_left = grid.column(align=True)
row = grid_left.row(align=True)
if len(self.props.brick_breadcrumbs):
op = row.operator("bim.rewind_brick_class", text="", icon="FRAME_PREV")
op.split_screen = False
row.prop(data=self.props, property="set_list_root_toggled", text="", icon="OUTLINER")
row.label(text=self.props.active_brick_class)
if self.props.set_list_root_toggled:
row = grid1.row(align=True)
op = row.operator("bim.set_brick_list_root", text="Set View")
op.split_screen = False
row = grid_left.row(align=True)
row.prop(data=self.props, property="brick_list_root", text="")
row = grid1.row()
row = grid_left.row()
BIM_UL_bricks.split_screen = False
row.template_list("BIM_UL_bricks", "", self.props, "bricks", self.props, "active_brick_index")
if self.props.split_screen_toggled:
grid2 = grid.column(align=True)
row = grid2.row(align=True)
grid_right = grid.column(align=True)
row = grid_right.row(align=True)
if len(self.props.split_screen_brick_breadcrumbs):
op = row.operator("bim.rewind_brick_class", text="", icon="FRAME_PREV")
op.split_screen = True
row.label(text=self.props.split_screen_active_brick_class)
if self.props.set_list_root_toggled:
row = grid2.row(align=True)
op = row.operator("bim.set_brick_list_root", text="Set View")
op.split_screen = True
row = grid_right.row(align=True)
row.prop(data=self.props, property="split_screen_brick_list_root", text="")
row = grid2.row()
row = grid_right.row()
BIM_UL_bricks.split_screen = True
row.template_list("BIM_UL_bricks", "", self.props, "split_screen_bricks", self.props, "split_screen_active_brick_index")
if BrickschemaData.data["active_relations"]:
row = self.layout.row(align=True)
col = row.column()
col.alignment = "RIGHT"
row.column().alignment = "RIGHT"
row.prop(data=self.props, property="brick_create_relations_toggled", text="", icon="PLUGIN")
row.prop(data=self.props, property="brick_edit_relations_toggled", text="", icon="TOOL_SETTINGS")
row.operator("bim.remove_brick", text="", icon="X")
row = self.layout.row(align=True)
row.label(text="Create Relation:")
if self.props.brick_create_relations_toggled and self.props.new_brick_relation_type == "http://www.w3.org/2000/01/rdf-schema#label":
if self.props.brick_create_relations_toggled and self.props.split_screen_toggled:
row = self.layout.row(align=True)
prop_with_search(row, self.props, "new_brick_relation_type", text="")
row.prop(data=self.props, property="new_brick_relation_object", text="")
row.operator("bim.add_brick_relation", text="", icon="ADD")
elif self.props.brick_create_relations_toggled and self.props.split_screen_toggled:
row = self.layout.row(align=True)
split_screen_selection = self.props.split_screen_bricks[self.props.split_screen_active_brick_index]
if split_screen_selection.total_items:
try:
split_screen_selection = self.props.split_screen_bricks[self.props.split_screen_active_brick_index]
except:
split_screen_selection = None
if not split_screen_selection or split_screen_selection.total_items:
row.label(text="No selection", icon="INFO")
else:
prop_with_search(row, self.props, "new_brick_relation_type", text="")
row.label(text=split_screen_selection.label if split_screen_selection.label else split_screen_selection.name)
row.operator("bim.add_brick_relation", text="", icon="ADD")
elif self.props.brick_create_relations_toggled:
row = self.layout.row(align=True)
prop_with_search(row, self.props, "new_brick_relation_namespace", text="")
elif self.props.brick_create_relations_toggled:
row = self.layout.row(align=True)
prop_with_search(row, self.props, "new_brick_relation_type", text="")
row.prop(data=self.props, property="new_brick_relation_object", text="")
row.operator("bim.add_brick_relation", text="", icon="ADD")
if self.props.brick_create_relations_toggled and self.props.add_relation_failed:
if self.props.brick_create_relations_toggled and self.props.add_brick_relation_failed:
row = self.layout.row(align=True)
row.label(text="Failed to find this entity!", icon="ERROR")
for relation in BrickschemaData.data["active_relations"]:
row = self.layout.row(align=True)
split = self.layout.split(factor=0.85, align=True)
row = split.row(align=True)
row.label(text=relation["predicate_name"])
row.separator()
row.label(text=relation["object_name"])
if self.props.brick_edit_relations_toggled and relation["predicate_name"] != "type":
row = split.row(align=True)
row.column().alignment = "RIGHT"
if self.props.brick_edit_relations_toggled and relation["predicate_uri"] and relation["predicate_name"] != "type":
op = row.operator("bim.remove_brick_relation", text="", icon="UNLINKED")
op.predicate = relation["predicate"]
op.object = relation["object"]
if relation["is_uri"] and relation["predicate_name"] != "type":
op.predicate = relation["predicate_uri"]
op.object = relation["object_uri"]
if relation["is_uri"] and relation["object_uri"].toPython().split("#")[-1] != self.props.active_brick_class:
op = row.operator("bim.view_brick_item", text="", icon="DISCLOSURE_TRI_RIGHT")
op.item = relation["object_uri"]
if relation["is_globalid"]:
@@ -188,6 +246,23 @@ class BIM_PT_brickschema(Panel):
op.global_id = relation["object_name"]
class BIM_UL_bricks(UIList):
split_screen = False
def draw_item(self, context, layout, data, item, icon, active_data, active_propname):
if item:
split = layout.split(factor=0.85, align=True)
row = split.row()
label = item.label if item.label else item.name
if item.total_items:
op = row.operator("bim.view_brick_class", text="", icon="DISCLOSURE_TRI_RIGHT", emboss=False)
op.brick_class = item.name
op.split_screen = self.split_screen
row.label(text=label)
if item.total_items:
row = split.row()
row.label(text=str(item.total_items))
class BIM_PT_ifc_brickschema_references(Panel):
bl_label = "Brickschema References"
bl_idname = "BIM_PT_ifc_brickschema_references"
@@ -211,15 +286,24 @@ class BIM_PT_ifc_brickschema_references(Panel):
row.label(text="No Brickschema Project Loaded")
return
if not BrickschemaReferencesData.data["libraries"]:
if not BrickschemaReferencesData.data["libraries"] and BrickStore.path:
row = self.layout.row(align=True)
row.label(text="No IFC Libraries")
row.operator("bim.convert_brick_project", text="", icon="ADD")
return
elif not BrickschemaReferencesData.data["libraries"]:
row = self.layout.row(align=True)
row.label(text="No IFC Libraries: save the Brick project to create a new library", icon="ERROR")
row = self.layout.row(align=True)
row.label(text="Libraries must have location pointing to a \".ttl\" file", icon="INFO")
return
row = self.layout.row(align=True)
prop_with_search(row, self.props, "libraries")
row.operator("bim.convert_brick_project", text="", icon="ADD")
if BrickStore.path:
row.operator("bim.convert_brick_project", text="", icon="ADD")
row = self.layout.row(align=True)
row.operator("bim.assign_brick_reference", icon="ADD")
@@ -234,19 +318,4 @@ class BIM_PT_ifc_brickschema_references(Panel):
row.label(text=reference["identification"], icon="ASSET_MANAGER")
row.label(text=reference["name"])
row.operator("bim.unassign_library_reference", text="", icon="X").reference = reference["id"]
row.operator("bim.view_brick_item", text="", icon="DISCLOSURE_TRI_RIGHT").item = reference["identification"]
class BIM_UL_bricks(UIList):
split_screen = False
def draw_item(self, context, layout, data, item, icon, active_data, active_propname):
if item:
row = layout.row(align=True)
label = item.label if item.label else item.name
if item.total_items:
op = row.operator("bim.view_brick_class", text="", icon="DISCLOSURE_TRI_RIGHT", emboss=False)
op.brick_class = item.name
op.split_screen = self.split_screen
label = label + " (" + str(item.total_items) + ")"
row.label(text=label)
row.operator("bim.view_brick_item", text="", icon="DISCLOSURE_TRI_RIGHT").item = reference["identification"]
@@ -27,7 +27,7 @@ class BIM_PT_ifcclash(Panel):
bl_space_type = "PROPERTIES"
bl_region_type = "WINDOW"
bl_context = "scene"
bl_parent_id = "BIM_PT_tab_quality_control"
bl_parent_id = "BIM_PT_tab_clash_detection"
def draw(self, context):
layout = self.layout
@@ -102,9 +102,10 @@ class BIM_PT_clash_manager(Panel):
bl_idname = "BIM_PT_clash_manager"
bl_label = "Clash Manager"
bl_options = {"DEFAULT_CLOSED"}
bl_space_type = "VIEW_3D"
bl_region_type = "UI"
bl_category = "BlenderBIM"
bl_space_type = "PROPERTIES"
bl_region_type = "WINDOW"
bl_context = "scene"
bl_parent_id = "BIM_PT_tab_clash_detection"
def draw(self, context):
layout = self.layout
@@ -20,64 +20,65 @@ import bpy
from . import ui, prop, operator
classes = (
operator.AddCostColumn,
operator.AddCostItem,
operator.AddCostItemQuantity,
operator.AddCostSchedule,
operator.RemoveCostSchedule,
operator.EditCostSchedule,
operator.AddCostValue,
operator.AddCurrency,
operator.AddSummaryCostItem,
operator.AssignCostItemQuantity,
operator.AssignCostItemType,
operator.AssignCostValue,
operator.CalculateCostItemResourceValue,
operator.ChangeParentCostItem,
operator.ClearCostItemAssignments,
operator.ContractCostItem,
operator.ContractCostItemRate,
operator.ContractCostItems,
operator.CopyCostItem,
operator.CopyCostItemValues,
operator.DisableEditingCostItem,
operator.DisableEditingCostItemQuantity,
operator.DisableEditingCostItemValue,
operator.DisableEditingCostSchedule,
operator.EditCostItem,
operator.EditCostItemQuantity,
operator.EditCostItemValue,
operator.EditCostItemValueFormula,
operator.EnableEditingCostSchedule,
operator.EnableEditingCostItems,
operator.EditCostSchedule,
operator.EnableEditingCostItem,
operator.ExportCostSchedules,
operator.ExpandCostItems,
operator.EnableEditingCostItemQuantities,
operator.EnableEditingCostItemQuantity,
operator.EnableEditingCostItemValues,
operator.EnableEditingCostItems,
operator.EnableEditingCostItemValue,
operator.EnableEditingCostItemValueFormula,
operator.DisableEditingCostItem,
operator.DisableEditingCostSchedule,
operator.DisableEditingCostItemQuantity,
operator.DisableEditingCostItemValue,
operator.AddCostColumn,
operator.RemoveCostColumn,
operator.AddCostItem,
operator.AddSummaryCostItem,
operator.EnableEditingCostItemValues,
operator.EnableEditingCostSchedule,
operator.ExpandCostItem,
operator.ContractCostItem,
operator.ExpandCostItemRate,
operator.ExpandCostItems,
operator.ExportCostSchedules,
operator.HighlightProductCostItem,
operator.ImportCostScheduleCsv,
operator.LoadCostItemElementQuantities,
operator.LoadCostItemQuantities,
operator.LoadCostItemResourceQuantities,
operator.LoadCostItemTaskQuantities,
operator.LoadCostItemTypes,
operator.LoadProductCostItems,
operator.LoadScheduleOfRates,
operator.RemoveCostColumn,
operator.RemoveCostItem,
operator.AssignCostItemType,
operator.UnassignCostItemType,
operator.AssignCostItemQuantity,
operator.UnassignCostItemQuantity,
operator.AddCostItemQuantity,
operator.RemoveCostItemQuantity,
operator.AddCostValue,
operator.RemoveCostItemValue,
operator.CopyCostItemValues,
operator.RemoveCostSchedule,
operator.ReorderCostItem,
operator.SelectCostItemProducts,
operator.SelectCostScheduleProducts,
operator.ImportCostScheduleCsv,
operator.LoadCostItemQuantities,
operator.LoadCostItemTypes,
operator.AssignCostValue,
operator.LoadScheduleOfRates,
operator.ExpandCostItemRate,
operator.ContractCostItemRate,
operator.CalculateCostItemResourceValue,
operator.ClearCostItemAssignments,
operator.HighlightProductCostItem,
operator.LoadProductCostItems,
operator.ReorderCostItem,
operator.SelectUnassignedProducts,
operator.LoadCostItemElementQuantities,
operator.LoadCostItemTaskQuantities,
operator.LoadCostItemResourceQuantities,
operator.ChangeParentCostItem,
operator.CopyCostItem,
operator.AddCurrency,
operator.UnassignCostItemQuantity,
operator.UnassignCostItemType,
prop.CostItem,
prop.CostItemQuantity,
prop.CostItemType,
@@ -117,6 +117,7 @@ class CostSchedulesData:
data["TotalAppliedValue"] = 0.0
data["TotalCost"] = 0.0
has_unit_basis = False
is_sum = False
if root_element.is_a("IfcCostItem"):
values = root_element.CostValues
elif root_element.is_a("IfcConstructionResource"):
@@ -130,6 +131,11 @@ class CostSchedulesData:
data["UnitBasisValueComponent"] = cost_value_data["UnitBasis"]["ValueComponent"]
data["UnitBasisUnitSymbol"] = cost_value_data["UnitBasis"]["UnitSymbol"]
has_unit_basis = True
else:
data["UnitBasisValueComponent"] = 1
data["UnitBasisUnitSymbol"] = "U"
if cost_value.Category == "*":
is_sum = True
if has_unit_basis:
data["TotalCost"] = data["TotalAppliedValue"] / data["UnitBasisValueComponent"]
else:
@@ -137,7 +143,8 @@ class CostSchedulesData:
data["TotalCost"] = data["TotalAppliedValue"] * data["TotalCostQuantity"]
else:
data["TotalCost"] = data["TotalAppliedValue"]
data["TotalAppliedValue"] = None
if is_sum:
data["TotalAppliedValue"] = None
@classmethod
def _load_cost_item_quantities(cls, cost_item, data):
@@ -154,7 +161,7 @@ class CostSchedulesData:
if unit:
data["UnitSymbol"] = ifcopenshell.util.unit.get_unit_symbol(unit)
else:
data["UnitSymbol"] = None
data["UnitSymbol"] = "U"
# same_unit_nested_cost_item = set()
# data["DerivedTotalCostQuantity"] = None
@@ -33,9 +33,26 @@ class AddCostSchedule(bpy.types.Operator, tool.Ifc.Operator):
bl_label = "Add Cost Schedule"
bl_options = {"REGISTER", "UNDO"}
bl_description = "Add a new cost schedule"
name: bpy.props.StringProperty()
object_type: bpy.props.StringProperty()
def _execute(self, context):
core.add_cost_schedule(tool.Ifc, predefined_type=context.scene.BIMCostProperties.cost_schedule_predefined_types)
core.add_cost_schedule(
tool.Ifc,
name=self.name,
predefined_type=context.scene.BIMCostProperties.cost_schedule_predefined_types,
object_type=self.object_type,
)
def draw(self, context):
layout = self.layout
layout.prop(self, "name", text="Name")
layout.prop(context.scene.BIMCostProperties, "cost_schedule_predefined_types", text="Type")
if context.scene.BIMCostProperties.cost_schedule_predefined_types == "USERDEFINED":
layout.prop(self, "object_type", text="Object type")
def invoke(self, context, event):
return context.window_manager.invoke_props_dialog(self)
class EditCostSchedule(bpy.types.Operator, tool.Ifc.Operator):
@@ -156,6 +173,17 @@ class ContractCostItem(bpy.types.Operator, tool.Ifc.Operator):
core.contract_cost_item(tool.Cost, cost_item=tool.Ifc.get().by_id(self.cost_item))
class ContractCostItems(bpy.types.Operator, tool.Ifc.Operator):
bl_idname = "bim.contract_cost_items"
bl_label = "Contract Cost Item"
bl_options = {"REGISTER", "UNDO"}
bl_description = "Collapse cost item tree"
cost_item: bpy.props.IntProperty()
def _execute(self, context):
core.contract_cost_items(tool.Cost)
class RemoveCostItem(bpy.types.Operator, tool.Ifc.Operator):
bl_idname = "bim.remove_cost_item"
bl_label = "Remove Cost Item"
@@ -635,7 +663,9 @@ class ExportCostSchedules(bpy.types.Operator):
def execute(self, context):
cost_schedule = tool.Ifc.get().by_id(self.cost_schedule) if self.cost_schedule else None
r = core.export_cost_schedules(tool.Cost, filepath=self.filepath, format=self.format, cost_schedule=cost_schedule)
r = core.export_cost_schedules(
tool.Cost, filepath=self.filepath, format=self.format, cost_schedule=cost_schedule
)
if isinstance(r, str):
self.report({"ERROR"}, r)
return {"FINISHED"}
+27 -33
View File
@@ -21,7 +21,6 @@ import blenderbim.bim.module.cost.prop as CostProp
from bpy.types import Panel, UIList
from blenderbim.bim.ifc import IfcStore
from blenderbim.bim.module.cost.data import CostSchedulesData
import blenderbim.tool as tool
class BIM_PT_cost_schedules(Panel):
@@ -30,30 +29,32 @@ class BIM_PT_cost_schedules(Panel):
bl_space_type = "PROPERTIES"
bl_region_type = "WINDOW"
bl_context = "scene"
bl_parent_id = "BIM_PT_tab_cost"
bl_options = {"HIDE_HEADER"}
@classmethod
def poll(cls, context):
return tool.Blender.is_tab(context, "SCHEDULING") and tool.Ifc.get() and tool.Ifc.get().schema != "IFC2X3"
file = IfcStore.get_file()
return file and hasattr(file, "schema") and file.schema != "IFC2X3"
def draw(self, context):
if not CostSchedulesData.is_loaded:
CostSchedulesData.load()
self.props = context.scene.BIMCostProperties
row = self.layout.row()
row = self.layout.row(align=True)
if not self.props.active_cost_schedule_id:
if CostSchedulesData.data["total_cost_schedules"]:
row.label(text=f"{CostSchedulesData.data['total_cost_schedules']} Cost Schedules Found", icon="TEXT")
row.operator("bim.export_cost_schedules", text="Export as spreadsheet", icon="EXPORT")
else:
row.label(text="No Cost Schedules found.", icon="COMMUNITY")
row = self.layout.row()
row.alignment = "RIGHT"
row.prop(self.props, "cost_schedule_predefined_types")
row.operator("bim.add_cost_schedule", icon="ADD", text="Add")
row.label(text="No Cost Schedules found.", icon="TEXT")
row.operator("bim.add_cost_schedule", icon="ADD", text="")
for schedule in CostSchedulesData.data["schedules"]:
self.draw_cost_schedule_ui(schedule)
row2 = self.layout.row()
row2.alignment = "RIGHT"
row2.operator("bim.export_cost_schedules", text="Export all", icon="EXPORT")
def draw_cost_schedule_ui(self, cost_schedule):
row = self.layout.row(align=True)
@@ -138,8 +139,8 @@ class BIM_PT_cost_schedules(Panel):
row = self.layout.row(align=True)
row.alignment = "RIGHT"
row.operator("bim.add_summary_cost_item", text="Add Summary Cost", icon="ADD")
row.operator("bim.expand_all_tasks", text="Expand All")
row.operator("bim.contract_all_tasks", text="Contract All")
row.operator("bim.expand_cost_items", text="Expand All")
row.operator("bim.contract_cost_items", text="Contract All")
row = self.layout.row(align=True)
row.alignment = "RIGHT"
if self.props.cost_items and self.props.active_cost_item_index < len(self.props.cost_items):
@@ -619,18 +620,22 @@ class BIM_UL_cost_items_trait:
else:
row.label(text="", icon="DOT")
def draw_total_cost_column(self, layout, cost_item):
format_numbers = "{0:,.2f}".format(cost_item["TotalCost"]).replace(",", " ")
currency = CostSchedulesData.data["currency"]
text = "{} {}".format(format_numbers, currency["name"]) if currency else format_numbers
layout.label(text=text)
def draw_quantity_column(self, layout, cost_item):
if CostSchedulesData.data["is_editing_rates"]:
self.draw_uom_column(layout, cost_item)
else:
self.draw_total_quantity_column(layout, cost_item)
def draw_uom_column(self, layout, cost_item):
layout.label(text=cost_item["UnitBasisUnitSymbol"])
def draw_total_quantity_column(self, layout, cost_item):
if cost_item["TotalCostQuantity"]:
label = "{0:.2f}".format(cost_item["TotalCostQuantity"]) + f" {cost_item['UnitSymbol'] or '-'}"
layout.label(text=label)
else:
layout.label(text="-")
def draw_value_column(self, layout, cost_item):
if cost_item["TotalAppliedValue"]:
text = "{0:,.2f}".format(cost_item["TotalAppliedValue"]).replace(",", " ")
@@ -642,8 +647,11 @@ class BIM_UL_cost_items_trait:
else:
layout.label(text="-")
def draw_uom_column(self, layout, cost_item):
layout.label(text=cost_item["UnitBasisUnitSymbol"] or "-" if cost_item["UnitBasisValueComponent"] else "-")
def draw_total_cost_column(self, layout, cost_item):
format_numbers = "{0:,.2f}".format(cost_item["TotalCost"]).replace(",", " ")
currency = CostSchedulesData.data["currency"]
text = "{} {}".format(format_numbers, currency["name"]) if currency else format_numbers
layout.label(text=text)
def draw_order_operator(self, row, ifc_definition_id, cost_item):
if cost_item["NestingIndex"] is not None:
@@ -656,20 +664,6 @@ class BIM_UL_cost_items_trait:
op.cost_item = ifc_definition_id
op.new_index = cost_item["NestingIndex"] - 1
def draw_total_quantity_column(self, layout, cost_item):
if cost_item["TotalCostQuantity"]:
label = "{0:.2f}".format(cost_item["TotalCostQuantity"]) + f" {cost_item['UnitSymbol'] or '-'}"
layout.label(text=label)
else:
layout.label(text="-")
# if cost_item["DerivedTotalCostQuantity"] not in [None, 0]:
# layout.label(text="{0:.2f}".format(cost_item["DerivedTotalCostQuantity"]) + f" {cost_item['DerivedUnitSymbol'] or '-'}")
# else:
# if cost_item["TotalCostQuantity"] == 0:
# layout.label(text="-")
# else:
# layout.label(text="{0:.2f}".format(cost_item["TotalCostQuantity"]) + f" {cost_item['UnitSymbol'] or '-'}")
class BIM_UL_cost_items(BIM_UL_cost_items_trait, UIList):
def __init__(self):
@@ -21,14 +21,15 @@ from . import ui, prop, operator
classes = (
operator.AddCsvAttribute,
operator.RemoveCsvAttribute,
operator.RemoveAllCsvAttributes,
operator.ExportIfcCsv,
operator.ImportIfcCsv,
operator.EyedropIfcCsv,
operator.SelectCsvIfcFile,
operator.ImportCsvAttributes,
operator.ExportCsvAttributes,
operator.ExportIfcCsv,
operator.ImportCsvAttributes,
operator.ImportIfcCsv,
operator.RemoveAllCsvAttributes,
operator.RemoveCsvAttribute,
operator.ReorderCsvAttribute,
operator.SelectCsvIfcFile,
prop.CsvAttribute,
prop.CsvProperties,
ui.BIM_PT_ifccsv,
)
@@ -16,14 +16,15 @@
# You should have received a copy of the GNU General Public License
# along with BlenderBIM Add-on. If not, see <http://www.gnu.org/licenses/>.
import bpy
import ifccsv
import ifcopenshell
import os
import logging
import bpy
import json
import webbrowser
import ifccsv
import logging
import tempfile
import webbrowser
import ifcopenshell
import blenderbim.tool as tool
from blenderbim.bim.ifc import IfcStore
from blenderbim.bim.handler import purge_module_data
@@ -61,28 +62,46 @@ class RemoveAllCsvAttributes(bpy.types.Operator):
return {"FINISHED"}
class ReorderCsvAttribute(bpy.types.Operator):
bl_idname = "bim.reorder_csv_attribute"
bl_label = "Reorder CSV Attribute"
bl_options = {"REGISTER", "UNDO"}
old_index: bpy.props.IntProperty()
new_index: bpy.props.IntProperty()
def execute(self, context):
old = context.scene.CsvProperties.csv_attributes[self.old_index]
new = context.scene.CsvProperties.csv_attributes[self.new_index]
props = ["name", "header", "sort", "group", "varies_value", "summary"]
for prop in props:
value = getattr(new, prop)
setattr(new, prop, getattr(old, prop))
setattr(old, prop, value)
return {"FINISHED"}
class ImportCsvAttributes(bpy.types.Operator):
bl_idname = "bim.import_csv_attributes"
bl_label = "Import CSV Template"
bl_label = "Load CSV Settings"
bl_description = "Import a json template for CSV export"
bl_options = {"REGISTER", "UNDO"}
filter_glob: bpy.props.StringProperty(default="*.json", options={"HIDDEN"})
filepath: bpy.props.StringProperty(subtype="FILE_PATH")
def execute(self, context):
csv_props = context.scene.CsvProperties
csv_json = json.load(open(self.filepath))
expression = csv_json.get("expression", "")
if expression:
csv_props.ifc_selector = expression
attributes = csv_json.get("attributes", [])
if attributes:
csv_props.csv_attributes.clear()
for attribute in attributes:
csv_props.csv_attributes.add().name = attribute
props = context.scene.CsvProperties
data = json.load(open(self.filepath))
tool.Search.import_filter_query(data["query"], props.filter_groups)
props.csv_attributes.clear()
for attribute in data["attributes"]:
new = props.csv_attributes.add()
new.name = attribute["name"]
new.header = attribute["header"]
new.sort = attribute["sort"]
new.group = attribute["group"]
new.summary = attribute["summary"]
new.formatting = attribute["formatting"]
return {"FINISHED"}
def invoke(self, context, event):
@@ -92,7 +111,7 @@ class ImportCsvAttributes(bpy.types.Operator):
class ExportCsvAttributes(bpy.types.Operator):
bl_idname = "bim.export_csv_attributes"
bl_label = "Export CSV Template"
bl_label = "Save CSV Settings"
bl_options = {"REGISTER", "UNDO"}
bl_description = "Save a json template for CSV export"
filename_ext = ".json"
@@ -100,22 +119,25 @@ class ExportCsvAttributes(bpy.types.Operator):
filepath: bpy.props.StringProperty(subtype="FILE_PATH")
def execute(self, context):
csv_props = context.scene.CsvProperties
props = context.scene.CsvProperties
csv_template = {}
expression = csv_props.ifc_selector
if expression:
csv_template["expression"] = expression
csv_attributes = []
for attribute in csv_props.csv_attributes:
attribute_name = attribute.name
csv_attributes.append(attribute_name)
if csv_attributes:
csv_template["attributes"] = csv_attributes
data = {
"query": tool.Search.export_filter_query(props.filter_groups),
"attributes": [
{
"name": a.name,
"header": a.header,
"sort": a.sort,
"group": a.group,
"summary": a.summary,
"formatting": a.formatting,
}
for a in props.csv_attributes
],
}
with open(self.filepath, "w") as outfile:
json.dump(csv_template, outfile)
json.dump(data, outfile)
return {"FINISHED"}
@@ -129,9 +151,8 @@ class ExportCsvAttributes(bpy.types.Operator):
class ExportIfcCsv(bpy.types.Operator):
bl_idname = "bim.export_ifccsv"
bl_label = "Export IFC"
#filename_ext = ".csv"
filename_ext = ".csv"
filepath: bpy.props.StringProperty(subtype="FILE_PATH")
def invoke(self, context, event):
props = context.scene.CsvProperties
@@ -149,19 +170,55 @@ class ExportIfcCsv(bpy.types.Operator):
ifc_file = IfcStore.get_file()
else:
ifc_file = ifcopenshell.open(props.csv_ifc_file)
selector = ifcopenshell.util.selector.Selector()
results = selector.parse(ifc_file, props.ifc_selector)
results = ifcopenshell.util.selector.filter_elements(
ifc_file, tool.Search.export_filter_query(props.filter_groups)
)
ifc_csv = ifccsv.IfcCsv()
attributes = [a.name for a in props.csv_attributes]
headers = [a.header for a in props.csv_attributes]
sort = []
groups = []
summaries = []
formatting = []
for attribute in props.csv_attributes:
if attribute.sort != "NONE":
sort.append({"name": attribute.name, "order": attribute.sort})
if attribute.group != "NONE":
groups.append({"name": attribute.name, "type": attribute.group, "varies_value": attribute.varies_value})
if attribute.summary != "NONE":
summaries.append({"name": attribute.name, "type": attribute.summary})
if attribute.formatting != "{{value}}" and "{{value}}" in attribute.formatting:
formatting.append({"name": attribute.name, "format": attribute.formatting})
sep = props.csv_custom_delimiter if props.csv_delimiter == "CUSTOM" else props.csv_delimiter
ifc_csv.export(ifc_file, results, attributes, output=self.filepath, format=props.format, delimiter=sep)
ifc_csv.export(
ifc_file,
results,
attributes,
headers=headers,
output=self.filepath,
format=props.format,
should_preserve_existing=props.should_preserve_existing,
delimiter=sep,
include_global_id=props.include_global_id,
null=props.null_value,
bool_true=props.true_value,
bool_false=props.false_value,
sort=sort,
groups=groups,
summaries=summaries,
formatting=formatting,
)
return {"FINISHED"}
class ImportIfcCsv(bpy.types.Operator):
bl_idname = "bim.import_ifccsv"
bl_label = "Import CSV to IFC"
filename_ext = ".csv"
bl_label = "Import to IFC"
filter_glob: bpy.props.StringProperty(default="*.csv;*.ods;*.xlsx", options={"HIDDEN"})
filepath: bpy.props.StringProperty(subtype="FILE_PATH")
def invoke(self, context, event):
@@ -180,28 +237,22 @@ class ImportIfcCsv(bpy.types.Operator):
ifc_file = ifcopenshell.open(props.csv_ifc_file)
ifc_csv = ifccsv.IfcCsv()
sep = props.csv_custom_delimiter if props.csv_delimiter == "CUSTOM" else props.csv_delimiter
ifc_csv.Import(ifc_file, self.filepath, delimiter=sep)
attributes = [a.name for a in props.csv_attributes]
ifc_csv.Import(
ifc_file,
self.filepath,
attributes=attributes,
delimiter=sep,
null=props.null_value,
bool_true=props.true_value,
bool_false=props.false_value,
)
if not props.should_load_from_memory:
ifc_file.write(props.csv_ifc_file)
purge_module_data()
return {"FINISHED"}
class EyedropIfcCsv(bpy.types.Operator):
bl_idname = "bim.eyedrop_ifccsv"
bl_label = "Query Selected Items"
bl_options = {"REGISTER", "UNDO"}
def execute(self, context):
global_ids = []
self.file = IfcStore.get_file()
for obj in context.selected_objects:
if hasattr(obj, "BIMObjectProperties") and obj.BIMObjectProperties.ifc_definition_id:
global_ids.append("#" + self.file.by_id(obj.BIMObjectProperties.ifc_definition_id).GlobalId)
context.scene.CsvProperties.ifc_selector = "|".join(global_ids)
return {"FINISHED"}
class SelectCsvIfcFile(bpy.types.Operator):
bl_idname = "bim.select_csv_ifc_file"
bl_label = "Select CSV IFC File"
@@ -17,6 +17,7 @@
# along with BlenderBIM Add-on. If not, see <http://www.gnu.org/licenses/>.
import bpy
from blenderbim.bim.module.search.prop import BIMFilterGroup
from blenderbim.bim.prop import StrProperty
from bpy.types import PropertyGroup
from bpy.props import (
@@ -31,10 +32,45 @@ from bpy.props import (
)
class CsvAttribute(PropertyGroup):
name: StringProperty(name="Query", default="class")
header: StringProperty(name="Header Value", default="IFC Class")
sort: EnumProperty(items=[("NONE", "None", ""), ("ASC", "Ascending", ""), ("DESC", "Descending", "")])
group: EnumProperty(
items=[
("NONE", "None", "Don't group any rows"),
("GROUP", "Group", "All rows where this value is identical will be merged"),
("CONCAT", "Concatenation", "Concatenate values if values vary within a group"),
("VARIES", "Varies", "Show a custom value if values vary within a group"),
("SUM", "Sum", "Sums the total value of rows in a group"),
("AVERAGE", "Average", "Averages the total value of rows in a group"),
("MIN", "Min", "Gets the minimum value of rows in a group"),
("MAX", "Max", "Gets the maximum value of rows in a group"),
]
)
varies_value: StringProperty(default="Varies", name="Varies Value")
summary: EnumProperty(
items=[
("NONE", "None", "Don't provide a summary row"),
("SUM", "Sum", "Sums the total value of all rows"),
("AVERAGE", "Average", "Averages the total value of all rows"),
("MIN", "Min", "Gets the minimum value of all rows"),
("MAX", "Max", "Gets the maximum value of all rows"),
]
)
formatting: StringProperty(default="{{value}}", name="Formatting")
class CsvProperties(PropertyGroup):
csv_ifc_file: StringProperty(default="", name="IFC File")
ifc_selector: StringProperty(default="", name="IFC Selector")
csv_attributes: CollectionProperty(name="CSV Attributes", type=StrProperty)
filter_groups: CollectionProperty(type=BIMFilterGroup, name="Filter Groups")
csv_attributes: CollectionProperty(name="CSV Attributes", type=CsvAttribute)
should_preserve_existing: BoolProperty(default=False, name="Preserve Existing")
include_global_id: BoolProperty(default=True, name="Include GlobalId")
null_value: StringProperty(default="N/A", name="Null Value")
true_value: StringProperty(default="YES", name="True Value")
false_value: StringProperty(default="NO", name="False Value")
csv_delimiter: EnumProperty(
items=[
(";", ";", ""),
@@ -55,4 +91,9 @@ class CsvProperties(PropertyGroup):
default="csv",
)
csv_custom_delimiter: StringProperty(default="", name="Custom Delimiter")
should_show_settings: BoolProperty(default=False, name="Show Settings")
should_show_sort: BoolProperty(default=False, name="Show Sorting")
should_show_group: BoolProperty(default=False, name="Show Grouping")
should_show_summary: BoolProperty(default=False, name="Show Summary")
should_show_formatting: BoolProperty(default=False, name="Show Formatting")
should_load_from_memory: BoolProperty(default=False, name="Load from Memory")
+66 -27
View File
@@ -16,12 +16,14 @@
# You should have received a copy of the GNU General Public License
# along with BlenderBIM Add-on. If not, see <http://www.gnu.org/licenses/>.
import blenderbim.bim.helper
from bpy.types import Panel
from blenderbim.bim.ifc import IfcStore
from blenderbim.bim.module.search.data import SearchData
class BIM_PT_ifccsv(Panel):
bl_label = "CSV Import/Export"
bl_label = "Spreadsheet Import/Export"
bl_idname = "BIM_PT_ifccsv"
bl_options = {"DEFAULT_CLOSED"}
bl_space_type = "PROPERTIES"
@@ -36,45 +38,82 @@ class BIM_PT_ifccsv(Panel):
props = scene.CsvProperties
if IfcStore.get_file():
row = layout.row()
row = layout.row(align=True)
row.prop(props, "should_load_from_memory")
row.operator("bim.import_csv_attributes", icon="IMPORT", text="")
row.operator("bim.export_csv_attributes", icon="EXPORT", text="")
else:
row = layout.row(align=True)
row.alignment = "RIGHT"
row.operator("bim.import_csv_attributes", icon="IMPORT", text="")
row.operator("bim.export_csv_attributes", icon="EXPORT", text="")
row.prop(props, "should_show_settings", icon="PREFERENCES", text="")
if not IfcStore.get_file() or not props.should_load_from_memory:
row = layout.row(align=True)
row.prop(props, "csv_ifc_file")
row.operator("bim.select_csv_ifc_file", icon="FILE_FOLDER", text="")
row = layout.row(align=True)
row.prop(props, "ifc_selector")
row.operator("bim.eyedrop_ifccsv", icon="EYEDROPPER", text="")
layout.separator()
if props.should_show_settings:
layout.use_property_split = True
row = layout.row(align=True)
row.prop(props, "format")
if props.format == "csv":
row = layout.row(align=True)
row.prop(props, "csv_delimiter")
if props.csv_delimiter == "CUSTOM":
row = layout.row(align=True)
row.prop(props, "csv_custom_delimiter")
row = layout.row()
row.prop(props, "should_preserve_existing")
row = layout.row()
row.prop(props, "include_global_id")
row = layout.row()
row.prop(props, "null_value")
row = layout.row()
row.prop(props, "true_value")
row = layout.row()
row.prop(props, "false_value")
layout.use_property_split = False
blenderbim.bim.helper.draw_filter(self.layout, props, SearchData, "csv")
row = layout.row(align=True)
row.operator("bim.add_csv_attribute", icon="ADD")
row.operator("bim.remove_all_csv_attributes", icon="CANCEL")
row = layout.row(align=True)
row.operator("bim.import_csv_attributes", icon="IMPORT")
row.operator("bim.export_csv_attributes", icon="EXPORT")
row.prop(props, "should_show_sort", icon="SORTSIZE", text="")
row.prop(props, "should_show_group", icon="OUTLINER_COLLECTION", text="")
row.prop(props, "should_show_summary", icon="SYNTAX_ON", text="")
row.prop(props, "should_show_formatting", icon="CON_TRANSLIKE", text="")
total = len(props.csv_attributes)
for index, attribute in enumerate(props.csv_attributes):
row = layout.row(align=True)
row.prop(attribute, "name", text="")
row.prop(attribute, "header", text="")
if props.should_show_sort:
row.prop(attribute, "sort", text="")
if props.should_show_group:
row.prop(attribute, "group", text="")
if attribute.group == "VARIES":
row.prop(attribute, "varies_value", text="")
if props.should_show_summary:
row.prop(attribute, "summary", text="")
if props.should_show_formatting:
row.prop(attribute, "formatting", text="")
if total > 1:
if index != 0:
op = row.operator(f"bim.reorder_csv_attribute", icon="TRIA_UP", text="")
op.old_index = index
op.new_index = index - 1
if index + 1 != total:
op = row.operator(f"bim.reorder_csv_attribute", icon="TRIA_DOWN", text="")
op.old_index = index
op.new_index = index + 1
row.operator("bim.remove_csv_attribute", icon="X", text="").index = index
row = layout.row(align=True)
row.prop(props, "format")
if props.format == 'csv':
row = layout.row(align=True)
row.prop(props, "csv_delimiter")
if props.csv_delimiter == "CUSTOM":
row = layout.row(align=True)
row.prop(props, "csv_custom_delimiter")
row = layout.row()
split = row.split(factor=0.5)
c = split.column()
c.operator("bim.export_ifccsv", icon="EXPORT", text="Export IFC to " + props.format.upper())
c = split.column()
c.operator("bim.import_ifccsv", icon="IMPORT")
row.operator("bim.export_ifccsv", icon="EXPORT", text="Export IFC to " + props.format.upper())
row.operator("bim.import_ifccsv", icon="IMPORT")
@@ -154,6 +154,8 @@ class ValidateIfcFile(bpy.types.Operator):
logger = logging.getLogger("validate")
logger.setLevel(logging.DEBUG)
ifcopenshell.validate.validate(IfcStore.get_file(), logger, express_rules=True)
self.report({"INFO"}, "Check validation results in the system console.")
return {"FINISHED"}
@@ -166,6 +166,7 @@ class Annotator:
center = camera.matrix_world.inverted() @ bpy.context.scene.cursor.location
center.z = 0
center = camera.matrix_world @ center
return (
center + z_offset,
@@ -64,11 +64,6 @@ class profile_consequential:
cls.lines = []
def ccw(A, B, C):
"""whether a-b-c located in counter-clockwise order in 2d space"""
return (C.y - A.y) * (B.x - A.x) > (B.y - A.y) * (C.x - A.x)
def worldspace_to_winspace(verts, context):
"""Convert world space verts to window space"""
region = context.region
@@ -248,8 +243,13 @@ class BaseDecorator:
if check_mode and obj.data.is_editmode:
return self.get_editmesh_geom(obj)
vertices = [obj.matrix_world @ v.co for v in obj.data.vertices]
indices = [e.vertices for e in obj.data.edges]
bm = bmesh.new()
bm.from_mesh(obj.data)
vertices = [obj.matrix_world @ v.co for v in bm.verts]
# In object mode, it's nicer to not show "internal edges". Most will be dissolved anyway.
indices = [[v.index for v in e.verts] for e in bm.edges if len(e.link_faces) != 2]
bm.free()
return vertices, indices
def get_editmesh_geom(self, obj):
@@ -520,7 +520,8 @@ class BaseDecorator:
return matrix.inverted()[i].to_3d().normalized()
text_dir_world_x_axis = get_basis_vector(obj.matrix_world)
text_dir = (camera.matrix_world.inverted().to_quaternion() @ text_dir_world_x_axis).to_2d().normalized()
camera_matrix = camera.matrix_world.normalized()
text_dir = (camera_matrix.inverted().to_quaternion() @ text_dir_world_x_axis).to_2d().normalized()
pos = location_3d_to_region_2d(region, region3d, text_world_position)
props = obj.BIMTextProperties
@@ -742,7 +743,7 @@ class AngleDecorator(BaseDecorator):
except ZeroDivisionError:
continue
circle_angle = acos(cos_a)
counter_clockwise = ccw(v2, v1, v0)
counter_clockwise = tool.Cad.is_counter_clockwise_order(v2, v1, v0)
angle_circle = get_angle_circle(circle_start, circle_angle, counter_clockwise)
add_verts_sequence([v1 + v for v in angle_circle], start_i_arcs, **out_kwargs_arcs)
@@ -774,7 +775,7 @@ class AngleDecorator(BaseDecorator):
region3d = context.region_data
viewportDrawingScale = self.get_viewport_drawing_scale(context)
ANGLE_LABEL_OFFSET = 25 * viewportDrawingScale
ANGLE_LABEL_OFFSET = 20 * viewportDrawingScale
last_segment_i = len(indices) - 1
for edge_i, edge_vertices in enumerate(indices):
@@ -792,24 +793,24 @@ class AngleDecorator(BaseDecorator):
edge1_ws = v2 - v1
try:
cos_a = edge0_ws.dot(edge1_ws) / (edge0_ws.length * edge1_ws.length)
angle_rad = acos(cos_a)
angle = angle_rad / pi * 180
except ZeroDivisionError:
continue
circle_angle_rad = acos(cos_a)
circle_angle = circle_angle_rad / pi * 180
angle = 0
# calculate angle position
p0 = location_3d_to_region_2d(region, region3d, v0)
p1 = location_3d_to_region_2d(region, region3d, v1)
p2 = location_3d_to_region_2d(region, region3d, v2)
p0, p1, p2 = [location_3d_to_region_2d(region, region3d, p) for p in vertices[i0 : i1 + 2]]
edge0 = p0 - p1
edge1 = p2 - p1
base_edge = edge0 if ccw(p0, p1, p2) else edge1
text_offset = (Matrix.Rotation(-circle_angle_rad / 2, 2) @ base_edge).normalized() * ANGLE_LABEL_OFFSET
radius = min(edge0.length_squared, edge1.length_squared) ** 0.5
# TODO: can be helpful for svg positioning
base_edge = edge0 if tool.Cad.is_counter_clockwise_order(p0, p1, p2) else edge1
text_offset = (Matrix.Rotation(-angle_rad / 2, 2) @ base_edge).normalized() * (radius + ANGLE_LABEL_OFFSET)
label_position = p1 + text_offset
text = f"{int(circle_angle)}d"
text = f"{int(angle)}deg"
label_dir = Vector((1, 0))
self.draw_label(context, text, label_position, label_dir)
self.draw_label(context, text, label_position, label_dir, box_alignment="center")
class DiameterDecorator(DimensionDecorator):
@@ -485,7 +485,7 @@ class CreateDrawing(bpy.types.Operator):
drawing_elements = tool.Drawing.get_drawing_elements(self.camera_element)
self.setup_serialiser(ifc)
self.setup_serialiser(ifc, target_view)
cache = IfcStore.get_cache()
[cache.remove(guid) for guid in invalidated_guids]
tree = ifcopenshell.geom.tree()
@@ -829,7 +829,7 @@ class CreateDrawing(bpy.types.Operator):
return svg_path
def setup_serialiser(self, ifc):
def setup_serialiser(self, ifc, target_view):
self.svg_settings = ifcopenshell.geom.settings(
DISABLE_TRIANGULATION=True, STRICT_TOLERANCE=True, INCLUDE_CURVES=True
)
@@ -853,6 +853,8 @@ class CreateDrawing(bpy.types.Operator):
self.serialiser.setScale(self.scale)
self.serialiser.setSubtractionSettings(ifcopenshell.ifcopenshell_wrapper.ALWAYS)
self.serialiser.setUsePrefiltering(True) # See #3359
if target_view == "REFLECTED_PLAN_VIEW":
self.serialiser.setMirrorY(True)
# tree = ifcopenshell.geom.tree()
# This instructs the tree to explode BReps into faces and return
# the style of the face when running tree.select_ray()
@@ -887,6 +889,21 @@ class CreateDrawing(bpy.types.Operator):
)
return classes
def is_manifold(self, obj):
result = self.is_manifold_cache.get(obj.data.name, None)
if result is not None:
return result
bm = bmesh.new()
bm.from_mesh(obj.data)
for edge in bm.edges:
if not edge.is_manifold:
bm.free()
self.is_manifold_cache[obj.data.name] = False
return False
self.is_manifold_cache[obj.data.name] = True
return True
def merge_linework_and_add_metadata(self, root):
join_criteria = ifcopenshell.util.element.get_pset(self.camera_element, "EPset_Drawing", "JoinCriteria")
if join_criteria:
@@ -897,6 +914,7 @@ class CreateDrawing(bpy.types.Operator):
group = root.findall(".//{http://www.w3.org/2000/svg}g")[0]
joined_paths = {}
self.is_manifold_cache = {}
ifc = tool.Ifc.get()
for el in root.findall(".//{http://www.w3.org/2000/svg}g[@{http://www.ifcopenshell.org/ns}guid]"):
@@ -906,6 +924,10 @@ class CreateDrawing(bpy.types.Operator):
classes.append("cut")
el.set("class", " ".join(classes))
obj = tool.Ifc.get_object(element)
if not self.is_manifold(obj):
continue
# An element group will contain a bunch of paths representing the
# cut of that element. However IfcOpenShell may not correctly
# create closed paths. We post-process all paths with shapely to
@@ -1035,7 +1057,9 @@ class CreateDrawing(bpy.types.Operator):
elements = tool.Drawing.get_group_elements(tool.Drawing.get_drawing_group(self.camera_element))
filtered_drawing_elements = tool.Drawing.get_drawing_elements(self.camera_element)
elements = [e for e in elements if e in filtered_drawing_elements]
filtered_drawing_annotations = {e for e in filtered_drawing_elements if e.is_a("IfcAnnotation")}
elements = {e for e in elements if e in filtered_drawing_elements}
elements = list(elements | filtered_drawing_annotations)
annotations = sorted(
elements, key=lambda a: (tool.Drawing.get_annotation_z_index(a), 1 if a.ObjectType == "TEXT" else 0)
@@ -1512,6 +1536,9 @@ class RemoveDrawing(bpy.types.Operator, Operator):
tool.Ifc.get().by_id(d.ifc_definition_id) for d in context.scene.DocProperties.drawings if d.is_selected
]
else:
if not self.drawing:
self.report({"ERROR"}, "No drawing selected")
return {"CANCELLED"}
drawings = [tool.Ifc.get().by_id(self.drawing)]
removed_drawings = [drawing.id() for drawing in drawings]
@@ -1862,7 +1889,7 @@ class RemoveSchedule(bpy.types.Operator, Operator):
schedule: bpy.props.IntProperty()
def _execute(self, context):
core.remove_document(tool.Ifc, tool.Drawing, "SCHEDULE", schedule=tool.Ifc.get().by_id(self.schedule))
core.remove_document(tool.Ifc, tool.Drawing, "SCHEDULE", document=tool.Ifc.get().by_id(self.schedule))
class OpenSchedule(bpy.types.Operator, Operator):
@@ -538,7 +538,7 @@ class BIMAnnotationProperties(PropertyGroup):
name="Create Representation For Type",
default=False,
description='Whether "Add type" should define a representation for the type \n'
"or allow occurences to have their own",
"or allow occurrences to have their own",
)
is_adding_type: bpy.props.BoolProperty(default=False)
type_name: bpy.props.StringProperty(name="Name", default="TYPEX")
@@ -118,6 +118,25 @@ class Scheduler:
if cell_style:
related_styles.append((style_name, cell_style))
# sometimes there are no column styles (e.g. in ODS from IfcCSV)
# and we just use some constant number for column widths
if not column_widths:
row_columns = []
for tr in table.getElementsByType(TableRow):
row_cols = 0
for td in tr.getElementsByType(TableCell):
column_span = td.getAttribute("numbercolumnsspanned")
column_span = int(column_span) if column_span else 1
col_repeat = td.getAttribute("numbercolumnsrepeated")
col_repeat = int(col_repeat) if col_repeat else 1
row_cols += column_span * col_repeat
row_columns.append(row_cols)
n_columns = max(row_columns)
column_widths = [25] * n_columns # some constant width value 👀
column_styles = [None] * n_columns
# collect rows height
row_heights = []
# TODO: never used yet because unsure about priority for row styles
@@ -351,7 +370,7 @@ class Scheduler:
wrap_text: if True, text will be wrapped to fit in cell
cell_width: width of cell, used for wrapping text
"""
text_lines = [str(p).upper() for p in p_tags]
text_lines = [str(p) for p in p_tags]
box_alignment_params = SvgWriter.get_box_alignment_parameters(box_alignment)
text_params = {
"font-size": font_size,
@@ -414,7 +414,7 @@ class SheetBuilder:
view.remove(image)
def get_href(self, element):
return urllib.parse.unquote(element.attrib.get("{http://www.w3.org/1999/xlink}href"))
return urllib.parse.unquote(element.attrib.get("{http://www.w3.org/1999/xlink}href")).replace('\\','/')
def parse_embedded_svg(self, image, data):
group = ET.Element("g")
@@ -36,7 +36,7 @@ import blenderbim.bim.module.drawing.annotation as annotation
from blenderbim.bim.module.drawing.data import DecoratorData
from blenderbim.bim.ifc import IfcStore
from math import pi, ceil, atan, degrees
from math import pi, ceil, atan, degrees, acos
from mathutils import geometry, Vector
from bpy_extras import view3d_utils
@@ -774,6 +774,15 @@ class SvgWriter:
"text-anchor": text_anchor,
}
def add_fill_bg(self, element):
element = element.copy()
if hasattr(element, "xml"):
attrib = element.xml.attrib
else:
attrib = element.attribs
attrib["filter"] = "url(#fill-background)"
return element
def draw_text_annotation(self, text_obj, position):
x_offset = self.raw_width / 2
y_offset = self.raw_height / 2
@@ -791,20 +800,21 @@ class SvgWriter:
return matrix.inverted()[i].to_3d().normalized()
text_dir_world_x_axis = get_basis_vector(text_obj.matrix_world)
text_dir = (self.camera.matrix_world.inverted().to_quaternion() @ text_dir_world_x_axis).to_2d().normalized()
# RCP cameras may be scaled, so reset scales.
camera_matrix = self.camera.matrix_world.normalized()
text_dir = (camera_matrix.inverted().to_quaternion() @ text_dir_world_x_axis).to_2d().normalized()
angle = math.degrees(-text_dir.angle_signed(Vector((1, 0))))
classes = self.get_attribute_classes(text_obj)
classes_str = " ".join(classes)
fill_bg = "fill-bg" in classes
symbol = tool.Drawing.get_annotation_symbol(element)
template_text_fields = []
if not symbol:
text_transform = f"translate({text_position_svg_str}) rotate({angle})"
else:
if symbol:
# NOTE: for now we assume that scale is uniform
symbol_transform = f"translate({text_position_svg_str}) rotate({angle}) scale({text_obj.scale.x})"
text_transform = symbol_transform
symbol_svg = self.find_xml_symbol_by_id(symbol)
if symbol_svg:
@@ -815,10 +825,13 @@ class SvgWriter:
if template_text_fields:
symbol_xml.attrib["transform"] = symbol_transform
symbol_xml.attrib.pop("id")
# note: zip makes sure that we iterate over the shortest list
# NOTE: zip makes sure that we iterate over the shortest list
for field, text_literal in zip(template_text_fields, text_literals):
field.text = tool.Drawing.replace_text_literal_variables(text_literal.Literal, product)
field.attrib["class"] = classes_str
if fill_bg:
self.svg.add(self.add_fill_bg(symbol_svg))
self.svg.add(symbol_svg)
return None
@@ -834,7 +847,7 @@ class SvgWriter:
angle,
text_literal.BoxAlignment,
classes_str,
fill_bg="fill-bg" in classes,
fill_bg=fill_bg,
line_number_start=line_number,
)
for tag in text_tags:
@@ -936,54 +949,54 @@ class SvgWriter:
def draw_angle_annotations(self, obj):
points = obj.data.splines[0].points
region = bpy.context.region
area = tool.Blender.get_viewport_context()["area"]
region_3d = area.spaces.active.region_3d
# [1, 2, 3, 4, 5] -> [[1, 2, 3], [2, 3, 4], [3, 4, 5]]
points_chunked = [points[i : i + 3] for i in range(len(points) - 2)]
for points_chunk in points_chunked:
points_2d = [view3d_utils.location_3d_to_region_2d(region, region_3d, p.co.xyz) for p in points_chunk]
points_chunk = [obj.matrix_world @ p.co.xyz for p in points_chunk]
self.draw_svg_3point_arc(obj, points_chunk)
edge0 = points_2d[0] - points_2d[1]
edge1 = points_2d[2] - points_2d[1]
angle_radius = min(edge0.length, edge1.length)
dir0 = edge0.normalized()
dir1 = edge1.normalized()
dir2 = ((dir0 + dir1) / 2).normalized()
# calculate p3 which is the center of the arc
# to use draw_svg_3point_arc()
p3 = points_2d[1] + dir2 * angle_radius
# make all edges the same radius
p0 = points_2d[1] + dir0 * angle_radius
p2 = points_2d[1] + dir1 * angle_radius
points_chunk = [view3d_utils.region_2d_to_origin_3d(region, region_3d, p) for p in [p0, p3, p2]]
# points = [p.co.xyz for p in bpy.context.active_object.data.splines[0].points[:3]]
bm = bmesh.new()
bm.verts.index_update()
bm.edges.index_update()
new_verts = [bm.verts.new(p) for p in points_chunk]
new_edges = [bm.edges.new((new_verts[e[0]], new_verts[e[1]])) for e in ((0, 1), (1, 2))]
self.draw_svg_3point_arc(obj, bm)
def draw_svg_3point_arc(self, obj, bm):
def draw_svg_3point_arc(self, obj, angle_points):
"""`angle_points` are expected to be already in world space"""
# This implementation uses an SVG arc, which means that it can only draw
# arcs that are orthogonal to the view (e.g. not arcs in 3D).
# Gosh this is bad code :(
points = [v.co for v in bm.verts][:3]
center = tool.Cad.get_center_of_arc(points, obj)
classes = self.get_attribute_classes(obj)
matrix_world = obj.matrix_world
x_offset = self.raw_width / 2
y_offset = self.raw_height / 2
bm.verts.ensure_lookup_table()
arc_end_verts = [v for v in bm.verts if len(v.link_edges) == 1]
arc_end_pts = [matrix_world @ v.co for v in arc_end_verts]
def position_on_svg(p):
p = self.project_point_onto_camera(p)
offset = Vector([self.raw_width / 2, self.raw_height / 2])
return (offset + p.xy * Vector((1, -1))) * self.svg_scale
# Probably need this when rewriting to use an SVG polyline instead of an arc
def get_angle_value():
"""points should be in world space"""
# calculate arc angle, need to make sure we do it in world space
v0, v1, v2 = angle_points
edge0_ws = v0 - v1
edge1_ws = v2 - v1
try:
cos_a = edge0_ws.dot(edge1_ws) / (edge0_ws.length * edge1_ws.length)
angle_rad = acos(cos_a)
angle = angle_rad / pi * 180
except ZeroDivisionError:
angle = 0
return angle
angle = get_angle_value()
angle_points = [position_on_svg(p) for p in angle_points]
# creating arc and making sure radius is consistent across the arc
edge0 = angle_points[0] - angle_points[1]
edge1 = angle_points[2] - angle_points[1]
angle_radius = min(edge0.length, edge1.length)
dir0 = edge0.normalized()
dir1 = edge1.normalized()
arc_mid_dir = ((dir0 + dir1) / 2).normalized()
arc_points = [angle_points[1] + direction * angle_radius for direction in [dir0, arc_mid_dir, dir1]]
arc_end_pts = [arc_points[0], arc_points[2]]
arc_mid_point = arc_points[1]
# The commented code below can be useful when we start using SVG polyline instead of an arc
# arc_path = [arc_end_verts[0]]
# while True:
# last_point = arc_end_verts[0]
@@ -996,79 +1009,44 @@ class SvgWriter:
# if not found_another_point:
# break
distance_between_end_verts = (arc_end_verts[0].co - arc_end_verts[1].co).length
arc_mid_vert = arc_end_verts[0].link_edges[0].other_vert(arc_end_verts[0])
is_reflex = 0 if (arc_mid_vert.co - arc_end_verts[1].co).length < distance_between_end_verts else 1
bm.free()
# Calculate the angle
# This is the true normal in 3D, whereas the camera projection we use is the drawing direction.
# This assumes (because we use SVG arcs) that the radius is always orthogonal to our view.
# When rewriting to use polylines, we should use this normal instead.
# center = tool.Cad.get_center_of_arc([p.to_3d() for p in arc_points], None).to_2d()
# normal = mathutils.geometry.normal([arc_end_pts[0], arc_end_pts[1], center])
normal = Vector(self.camera_projection)
dir1 = (arc_end_pts[0] - center).normalized()
dir2 = (arc_end_pts[1] - center).normalized()
# normal = Vector(self.camera_projection)
# dir1 = (arc_end_pts[0] - center).normalized()
# arc_mid_dir = (arc_end_pts[1] - center).normalized()
# Let's get the matrix that represents the coordinate system of the arc.
# This matrix allows us to get 2D vectors for calculating the signed arc angle.
z = normal
x = (arc_end_pts[0] - center).normalized()
y = z.cross(x)
arc_matrix = mathutils.Matrix([x, y, z]).transposed().to_4x4()
# z = normal
# x = (arc_end_pts[0] - center).normalized()
# y = z.cross(x)
# arc_matrix = mathutils.Matrix([x, y, z]).transposed().to_4x4()
dir1 = ((arc_matrix.inverted() @ arc_end_pts[0]) - (arc_matrix.inverted() @ center)).normalized()
dir2 = ((arc_matrix.inverted() @ arc_end_pts[1]) - (arc_matrix.inverted() @ center)).normalized()
angle = -dir1.xy.angle_signed(dir2.xy)
# if is_reflex:
# angle = angle % (math.pi * 2)
# Center of gravity of all vertices, used to help position the text
cog = Vector((0, 0, 0))
for point in points:
cog += point
cog = matrix_world @ (cog / len(points))
radius = ((matrix_world @ points[0]) - center).length
arc_midpoint = center + ((cog - center).normalized() * radius)
text_position = self.project_point_onto_camera(arc_midpoint)
text_position = Vector(
((x_offset + text_position.x) * self.svg_scale, (y_offset - text_position.y) * self.svg_scale)
)
center_projected = self.project_point_onto_camera(center)
center_position = Vector(
((x_offset + center_projected.x) * self.svg_scale, (y_offset - center_projected.y) * self.svg_scale)
)
text_offset = (text_position - center_position).xy.normalized() * 5
text_position += text_offset
# dir1 = ((arc_matrix.inverted() @ arc_end_pts[0]) - (arc_matrix.inverted() @ center)).normalized()
# dir2 = ((arc_matrix.inverted() @ arc_end_pts[1]) - (arc_matrix.inverted() @ center)).normalized()
# angle = -dir1.xy.angle_signed(dir2.xy)
# calculating text parameters and adding text
text_position = arc_mid_point + arc_mid_dir * 5
text_style = SvgWriter.get_box_alignment_parameters("center")
angle_text = abs(round(math.degrees(angle), 3))
if is_reflex:
angle_text = 360 - angle_text
self.svg.add(self.svg.text(f"{angle_text}deg", insert=tuple(text_position), class_="ANGLE", **text_style))
angle_text = f"{int(angle)}deg"
self.svg.add(self.svg.text(angle_text, insert=text_position, class_="ANGLE", **text_style))
# Draw SVG arc, see for details: http://xahlee.info/js/svg_circle_arc.html
arc_proj_end_pts = [self.project_point_onto_camera(v) for v in arc_end_pts]
p1 = Vector(
((x_offset + arc_proj_end_pts[0].x) * self.svg_scale, (y_offset - arc_proj_end_pts[0].y) * self.svg_scale)
)
p2 = Vector(
((x_offset + arc_proj_end_pts[1].x) * self.svg_scale, (y_offset - arc_proj_end_pts[1].y) * self.svg_scale)
)
r = radius * self.svg_scale
# reflex = 1 if angle > math.pi else 0
reflex = is_reflex
if reflex:
sense = 0 if angle > 0 else 1
else:
sense = 1 if angle > 0 else 0
p1, p2 = arc_end_pts
r = angle_radius
# reflex: 0 => arc < 180 degrees
# 1 => arc > 180 degrees
reflex = int(angle > 180)
# sense: 0 => moving at negative angles
# 1 => moving at positive angles
sense = int(tool.Cad.is_counter_clockwise_order(*arc_points))
d = f"M {p1.x} {p1.y} A {r} {r} 0 {reflex} {sense} {p2.x} {p2.y}"
classes = self.get_attribute_classes(obj)
path = self.svg.add(self.svg.path(d=d, class_=" ".join(classes)))
def draw_radius_annotations(self, obj):
@@ -1344,18 +1322,10 @@ class SvgWriter:
multiline_to_bottom=True,
fill_bg=False,
line_number_start=0,
_draw_fill_bg=False,
):
"""returns list of created text tags"""
text_tags = []
if fill_bg:
method_kwargs = locals() | {"_draw_fill_bg": True, "fill_bg": False}
del method_kwargs["self"]
del method_kwargs["text_tags"]
text_tags += self.create_text_tag(**method_kwargs)
base_text_attrs = SvgWriter.get_box_alignment_parameters(box_alignment)
base_text_attrs = base_text_attrs | ({"filter": "url(#fill-background)"} if _draw_fill_bg else {})
if not multiline:
transform_kwargs = {"transform": "rotate({} {} {})".format(angle, text_position.x, text_position.y)}
@@ -1392,6 +1362,11 @@ class SvgWriter:
# doing it here and not in tspan constructor because constructor adds unnecessary spaces
tspan.update({"dy": f"{line_number if multiline_to_bottom else -line_number}em"})
text_tag.add(tspan)
if fill_bg:
fill_bg_tags = [self.add_fill_bg(text_tag) for text_tag in text_tags]
text_tags = fill_bg_tags + text_tags
return text_tags
def project_point_onto_camera(self, point):
@@ -314,7 +314,7 @@ class BIM_PT_references(Panel):
if not self.props.is_editing_references:
row = self.layout.row(align=True)
row.label(text=f"{DocumentsData.data['total_references']} References Found", icon="LONGDISPLAY")
row.label(text=f"{DocumentsData.data['total_references']} References Found", icon="OBJECT_HIDDEN")
row.operator("bim.load_references", text="", icon="IMPORT")
return
@@ -26,17 +26,19 @@ classes = (
operator.GetRepresentationIfcParameters,
operator.OverrideDelete,
operator.OverrideDuplicateMove,
operator.OverrideDuplicateMoveAggregate,
operator.OverrideDuplicateMoveAggregateMacro,
operator.OverrideDuplicateMoveLinked,
operator.OverrideDuplicateMoveLinkedMacro,
operator.OverrideDuplicateMoveMacro,
operator.OverrideDuplicateMoveAggregate,
operator.OverrideDuplicateMoveAggregateMacro,
operator.RefreshAggregate,
operator.OverrideJoin,
operator.OverrideModeSetEdit,
operator.OverrideModeSetObject,
operator.OverrideOriginSet,
operator.OverrideOutlinerDelete,
operator.OverridePasteBuffer,
operator.PurgeUnusedRepresentations,
operator.RefreshAggregate,
operator.RemoveConnection,
operator.RemoveRepresentation,
operator.SelectConnection,
@@ -50,6 +52,7 @@ classes = (
ui.BIM_PT_connections,
ui.BIM_PT_mesh,
ui.BIM_PT_workarounds,
ui.BIM_MT_object_set_origin,
)
@@ -97,7 +97,7 @@ class ConnectionsData:
@classmethod
def load(cls):
cls.data = {"connections": cls.connections()}
cls.data = {"connections": cls.connections(), "is_connection_realization": cls.is_connection_realization()}
cls.is_loaded = True
@classmethod
@@ -114,7 +114,13 @@ class ConnectionsData:
else:
related_element = rel.RelatedElement
if element.is_a("IfcRelConnectsPathElements"):
realizing_elements = []
realizing_elements_connection_type = ""
if rel.is_a("IfcRelConnectsWithRealizingElements"):
realizing_elements.extend(rel.RealizingElements)
realizing_elements_connection_type = rel.ConnectionType
if rel.is_a("IfcRelConnectsPathElements"):
related_element_connection_type = rel.RelatedConnectionType
else:
related_element_connection_type = ""
@@ -125,6 +131,8 @@ class ConnectionsData:
"is_relating": True,
"Name": related_element.Name or "Unnamed",
"ConnectionType": related_element_connection_type,
"realizing_elements": realizing_elements,
"realizing_elements_connection_type": realizing_elements_connection_type,
}
)
@@ -134,7 +142,13 @@ class ConnectionsData:
else:
relating_element = rel.RelatingElement
if element.is_a("IfcRelConnectsPathElements"):
realizing_elements = []
realizing_elements_connection_type = ""
if rel.is_a("IfcRelConnectsWithRealizingElements"):
realizing_elements.extend(rel.RealizingElements)
realizing_elements_connection_type = rel.ConnectionType
if rel.is_a("IfcRelConnectsPathElements"):
relating_element_connection_type = rel.RelatingConnectionType
else:
relating_element_connection_type = ""
@@ -145,11 +159,30 @@ class ConnectionsData:
"is_relating": False,
"Name": relating_element.Name or "Unnamed",
"ConnectionType": relating_element_connection_type,
"realizing_elements": realizing_elements,
"realizing_elements_connection_type": realizing_elements_connection_type,
}
)
return results
@classmethod
def is_connection_realization(cls):
element = tool.Ifc.get_entity(bpy.context.active_object)
connections = element.IsConnectionRealization
if not connections:
return
results = []
for rel in connections:
data = {
"realizing_elements_connection_type": rel.ConnectionType,
"connected_from": rel.RelatingElement,
"connected_to": rel.RelatedElement,
}
results.append(data)
return results
class DerivedPlacementsData:
data = {}
@@ -57,6 +57,31 @@ class EditObjectPlacement(bpy.types.Operator, Operator):
core.edit_object_placement(tool.Ifc, tool.Geometry, tool.Surveyor, obj=obj)
class OverrideOriginSet(bpy.types.Operator, Operator):
bl_idname = "bim.override_origin_set"
bl_label = "IFC Origin Set"
bl_options = {"REGISTER", "UNDO"}
obj: bpy.props.StringProperty()
origin_type: bpy.props.StringProperty()
def _execute(self, context):
objs = [bpy.data.objects.get(self.obj)] if self.obj else context.selected_objects
for obj in objs:
element = tool.Ifc.get_entity(obj)
if not element:
continue
if tool.Ifc.is_moved(obj):
core.edit_object_placement(tool.Ifc, tool.Geometry, tool.Surveyor, obj=obj)
representation = tool.Geometry.get_active_representation(obj)
if not representation:
continue
representation = ifcopenshell.util.representation.resolve_representation(representation)
if not tool.Geometry.is_meshlike(representation):
continue
bpy.ops.object.origin_set(type=self.origin_type)
bpy.ops.bim.update_representation(obj=obj.name)
class AddRepresentation(bpy.types.Operator, Operator):
bl_idname = "bim.add_representation"
bl_label = "Add Representation"
@@ -185,6 +210,15 @@ class RemoveRepresentation(bpy.types.Operator, Operator):
)
class PurgeUnusedRepresentations(bpy.types.Operator, Operator):
bl_idname = "bim.purge_unused_representations"
bl_label = "Purge Unused Representations"
bl_options = {"REGISTER", "UNDO"}
def _execute(self, context):
core.purge_unused_representations(tool.Ifc, tool.Geometry)
class UpdateRepresentation(bpy.types.Operator, Operator):
bl_idname = "bim.update_representation"
bl_label = "Update Representation"
@@ -214,6 +248,10 @@ class UpdateRepresentation(bpy.types.Operator, Operator):
product = self.file.by_id(obj.BIMObjectProperties.ifc_definition_id)
material = ifcopenshell.util.element.get_material(product, should_skip_usage=True)
if getattr(product, "HasOpenings", False) and obj.data.BIMMeshProperties.has_openings_applied:
# Meshlike things with openings can only be updated without openings applied.
return
if not product.is_a("IfcGridAxis"):
tool.Geometry.clear_cache(product)
@@ -231,8 +269,14 @@ class UpdateRepresentation(bpy.types.Operator, Operator):
core.edit_object_placement(tool.Ifc, tool.Geometry, tool.Surveyor, obj=obj)
if material and material.is_a() in ["IfcMaterialProfileSet", "IfcMaterialLayerSet"]:
# These objects are parametrically based on an axis and should not be modified as a mesh
return
if self.ifc_representation_class == "IfcTessellatedFaceSet":
# We are explicitly casting to a tessellation, so remove all parametric materials.
element_type = ifcopenshell.util.element.get_type(product)
ifcopenshell.api.run("material.unassign_material", tool.Ifc.get(), product=element_type)
ifcopenshell.api.run("material.unassign_material", tool.Ifc.get(), product=product)
else:
# These objects are parametrically based on an axis and should not be modified as a mesh
return
old_representation = self.file.by_id(obj.data.BIMMeshProperties.ifc_definition_id)
context_of_items = old_representation.ContextOfItems
@@ -285,7 +329,7 @@ class UpdateRepresentation(bpy.types.Operator, Operator):
"style.assign_representation_styles",
self.file,
shape_representation=new_representation,
styles=tool.Geometry.get_styles(obj),
styles=tool.Geometry.get_styles(obj, only_assigned_to_faces=True),
should_use_presentation_style_assignment=context.scene.BIMGeometryProperties.should_use_presentation_style_assignment,
)
tool.Geometry.record_object_materials(obj)
@@ -353,6 +397,8 @@ class GetRepresentationIfcParameters(bpy.types.Operator, Operator):
def _execute(self, context):
core.get_representation_ifc_parameters(tool.Geometry, obj=context.active_object)
parameters = context.active_object.data.BIMMeshProperties.ifc_parameters
self.report({"INFO"}, f"{len(parameters)} parameters found.")
class CopyRepresentation(bpy.types.Operator, Operator):
@@ -637,6 +683,11 @@ class OverrideDuplicateMove(bpy.types.Operator):
element = tool.Ifc.get_entity(obj)
if element and element.is_a("IfcAnnotation") and element.ObjectType == "DRAWING":
continue # For now, don't copy drawings until we stabilise a bit more. It's tricky.
# Prior to duplicating, sync the object placement to make decomposition recreation more stable.
if tool.Ifc.is_moved(obj):
blenderbim.core.geometry.edit_object_placement(tool.Ifc, tool.Geometry, tool.Surveyor, obj=obj)
new_obj = obj.copy()
if obj.data:
new_obj.data = obj.data.copy()
@@ -705,6 +756,10 @@ class OverrideDuplicateMoveLinked(bpy.types.Operator):
relationships = tool.Root.get_decomposition_relationships(context.selected_objects)
old_to_new = {}
for obj in context.selected_objects:
# Prior to duplicating, sync the object placement to make decomposition recreation more stable.
if tool.Ifc.is_moved(obj):
blenderbim.core.geometry.edit_object_placement(tool.Ifc, tool.Geometry, tool.Surveyor, obj=obj)
new_obj = obj.copy()
if obj.data:
new_obj.data = obj.data.copy()
@@ -1317,8 +1372,13 @@ class OverrideModeSetEdit(bpy.types.Operator):
continue
is_profile = True
representation_class = tool.Geometry.get_ifc_representation_class(element, representation)
if usage_type == "PROFILE":
operator = lambda: bpy.ops.bim.hotkey(hotkey="A_E")
elif representation_class and "IfcCircleProfileDef" in representation_class:
self.report({"INFO"}, "Can't edit Circle Profile Extrusion")
obj.select_set(False)
continue
elif (
tool.Geometry.is_profile_based(obj.data)
or usage_type == "LAYER3"
@@ -1365,8 +1425,7 @@ class OverrideModeSetEdit(bpy.types.Operator):
else:
obj.select_set(False)
continue
if not context.selected_objects or len(context.selected_objects) != len(selected_objs):
if len(selected_objs) > 1 and (not context.selected_objects or len(context.selected_objects) != len(selected_objs)):
# We are trying to edit at least one non-mesh-like object : Display a hint to the user
self.report({"INFO"}, "Only mesh-compatible representations may be edited concurrently in edit mode.")
@@ -1408,9 +1467,11 @@ class OverrideModeSetObject(bpy.types.Operator):
self.reload_representation(obj)
else:
self.reload_representation(obj)
tool.Ifc.finish_edit(obj)
for obj in self.unchanged_objs_with_openings:
self.reload_representation(obj)
tool.Ifc.finish_edit(obj)
return {"FINISHED"}
def reload_representation(self, obj):
@@ -18,7 +18,7 @@
import bpy
import blenderbim.tool as tool
from bpy.types import Panel
from bpy.types import Panel, Menu
from blenderbim.bim.ifc import IfcStore
from blenderbim.bim.helper import prop_with_search
from blenderbim.bim.module.geometry.data import RepresentationsData, ConnectionsData, DerivedPlacementsData
@@ -29,6 +29,29 @@ def object_menu(self, context):
self.layout.operator("bim.override_object_duplicate_move", icon="PLUGIN")
self.layout.operator("bim.override_object_delete", icon="PLUGIN")
self.layout.operator("bim.override_paste_buffer", icon="PLUGIN")
self.layout.menu("BIM_MT_object_set_origin", icon="PLUGIN")
class BIM_MT_object_set_origin(Menu):
bl_idname = "BIM_MT_object_set_origin"
bl_label = "IFC Set Origin"
def draw(self, context):
self.layout.operator(
"bim.override_origin_set", icon="PLUGIN", text="IFC Geometry to Origin"
).origin_type = "GEOMETRY_ORIGIN"
self.layout.operator(
"bim.override_origin_set", icon="PLUGIN", text="IFC Origin to Geometry"
).origin_type = "ORIGIN_GEOMETRY"
self.layout.operator(
"bim.override_origin_set", icon="PLUGIN", text="IFC Origin to 3D Cursor"
).origin_type = "ORIGIN_CURSOR"
self.layout.operator(
"bim.override_origin_set", icon="PLUGIN", text="IFC Origin to Center of Mass (Surface)"
).origin_type = "ORIGIN_CENTER_OF_MASS"
self.layout.operator(
"bim.override_origin_set", icon="PLUGIN", text="IFC Origin to Center of Mass (Volume)"
).origin_type = "ORIGIN_CENTER_OF_VOLUME"
def outliner_menu(self, context):
@@ -111,7 +134,7 @@ class BIM_PT_connections(Panel):
layout = self.layout
props = context.active_object.BIMObjectProperties
if not ConnectionsData.data["connections"]:
if not ConnectionsData.data["connections"] and not ConnectionsData.data["is_connection_realization"]:
layout.label(text="No connections found")
for connection in ConnectionsData.data["connections"]:
@@ -123,6 +146,44 @@ class BIM_PT_connections(Panel):
op = row.operator("bim.remove_connection", icon="X", text="")
op.connection = connection["id"]
if connection["realizing_elements"]:
row = self.layout.row(align=True)
connection_type = connection["realizing_elements_connection_type"]
connection_type = f" ({connection_type})" if connection_type else ""
row.label(text=f"Realizing elements{connection_type}:")
for element in connection["realizing_elements"]:
row = self.layout.row(align=True)
obj = tool.Ifc.get_object(element)
row.operator("bim.select_entity", text="", icon="RESTRICT_SELECT_OFF").ifc_id = element.id()
row.label(text=obj.name)
# display connections where element is connection realization
connections = ConnectionsData.data["is_connection_realization"]
if not connections:
return
row = self.layout.row(align=True)
row.label(text="Element is connections realization:")
for connection in connections:
# NOTE: not displayed yet
connection_type = connection["realizing_elements_connection_type"]
connection_type = f" ({connection_type})" if connection_type else ""
row = self.layout.row(align=True)
connected_from = connection["connected_from"]
obj = tool.Ifc.get_object(connected_from)
row.operator("bim.select_entity", text="", icon="RESTRICT_SELECT_OFF").ifc_id = connected_from.id()
row.label(text=obj.name)
row.label(text="", icon="FORWARD")
connected_to = connection["connected_to"]
obj = tool.Ifc.get_object(connected_to)
row.operator("bim.select_entity", text="", icon="RESTRICT_SELECT_OFF").ifc_id = connected_to.id()
row.label(text=obj.name)
class BIM_PT_mesh(Panel):
bl_label = "Representation Utilities"
@@ -34,6 +34,7 @@ classes = (
operator.GetCursorLocation,
operator.SetCursorLocation,
operator.ConvertAngleToCoordinates,
operator.ImportPlot,
prop.BIMGeoreferenceProperties,
ui.BIM_PT_gis,
ui.BIM_PT_gis_utilities,
@@ -110,7 +110,7 @@ class SetCursorLocation(bpy.types.Operator, tool.Ifc.Operator):
bl_idname = "bim.set_cursor_location"
bl_label = "Set Cursor Location"
bl_options = {"REGISTER", "UNDO"}
bl_description = "Move curson location to the specified coordinates"
bl_description = "Move cursor location to the specified coordinates"
@classmethod
def poll(cls, context):
@@ -187,3 +187,20 @@ class ConvertAngleToCoordinates(bpy.types.Operator, tool.Ifc.Operator):
def _execute(self, context):
core.convert_angle_to_coord(tool.Georeference, type=self.type)
class ImportPlot(bpy.types.Operator, tool.Ifc.Operator):
bl_idname = "bim.import_plot"
bl_label = "Import Plot"
bl_options = {"REGISTER", "UNDO"}
bl_description = "Import plot"
filepath: bpy.props.StringProperty(subtype="FILE_PATH")
filter_glob: bpy.props.StringProperty(default="*.csv", options={"HIDDEN"})
def execute(self, context):
core.import_plot(tool.Georeference, filepath=self.filepath)
return {"FINISHED"}
def invoke(self, context, event):
context.window_manager.fileselect_add(self)
return {"RUNNING_MODAL"}
@@ -50,8 +50,9 @@ class BIM_PT_misc_utilities(bpy.types.Panel):
row.operator("bim.clean_wireframes")
row = layout.row()
row.operator("bim.patch_non_parametric_mep_segment")
row = layout.row(align=True)
row.operator("bim.enable_editing_sketch_extrusion_profile", text="Start Sketching")
row.operator("bim.edit_sketch_extrusion_profile", text="", icon="FILE_REFRESH")
row.operator("bim.disable_editing_sketch_extrusion_profile", text="", icon="CANCEL")
row = layout.row()
row.operator("bim.import_plot", text="Import Plot Coordinates", icon="FILE_FOLDER")
@@ -78,6 +78,7 @@ classes = (
opening.AddPotentialHalfSpaceSolid,
opening.AddPotentialOpening,
opening.EditOpenings,
opening.CloneOpening,
opening.FlipFill,
opening.HideBooleans,
opening.HideOpenings,
@@ -130,11 +130,11 @@ def update_door_modifier_representation(context, obj):
if tool.Ifc.get_schema() != "IFC2X3":
element.OperationType = props.door_type
# occurences attributes
occurences = tool.Ifc.get_all_element_occurences(element)
for occurence in occurences:
occurence.OverallWidth = props.overall_width / si_conversion
occurence.OverallHeight = props.overall_height / si_conversion
# occurrences attributes
occurrences = tool.Ifc.get_all_element_occurrences(element)
for occurrence in occurrences:
occurrence.OverallWidth = props.overall_width / si_conversion
occurrence.OverallHeight = props.overall_height / si_conversion
update_simple_openings(element, props.overall_width / si_conversion, props.overall_height / si_conversion)
+185 -42
View File
@@ -29,6 +29,7 @@ import ifcopenshell.util.system
import ifcopenshell.util.element
import ifcopenshell.util.representation
import mathutils.geometry
import numpy as np
import blenderbim.bim.handler
import blenderbim.core.type
import blenderbim.core.root
@@ -73,29 +74,68 @@ class RegenerateDistributionElement(bpy.types.Operator, tool.Ifc.Operator):
[e for e in ifcopenshell.util.system.get_connected_from(element) if e not in processed_elements]
)
if len(connected) == 1:
extend_branch(list(connected)[0], branch, element)
else:
for connected_element in connected:
branch_element["children"].append(extend_branch(connected_element, [], element))
for connected_element in connected:
branch_element["children"].append(extend_branch(connected_element, [], element))
return branch
queue = extend_branch(current_element, [])[0]["children"]
extended_branch = extend_branch(current_element, [])
queue = extended_branch[0]["children"]
# import pprint
# pprint.pprint(queue)
def get_connected_ports_between(element1, element2):
ports1 = tool.System.get_ports(element1)
ports2 = tool.System.get_ports(element2)
for p in ports1:
connected_port = tool.System.get_connected_port(p)
# in IFC2X3 there is no PredefinedType
if getattr(p, "PredefinedType", None) == "WIRELESS":
continue
if connected_port in ports2:
return p, connected_port
return None, None
si_conversion = ifcopenshell.util.unit.calculate_unit_scale(tool.Ifc.get())
def process_branch(branch):
for branch_element in branch:
element = branch_element["element"]
print("processing", element)
predecessor = branch_element["predecessor"]
if False: # If the element does not need to be transformed, return early.
return
# Perform the extend, translate, rotate, etc the element as necessary based on the predecessor.
# For segments, prioritise extensions instead of translations.
# For everything else, only translate. No rotation.
# For everything besides segments, only translate. No rotation.
obj = tool.Ifc.get_object(element)
obj_pred = tool.Ifc.get_object(predecessor)
if tool.Ifc.is_moved(obj):
blenderbim.core.geometry.edit_object_placement(tool.Ifc, tool.Geometry, tool.Surveyor, obj=obj)
if tool.Ifc.is_moved(obj_pred):
blenderbim.core.geometry.edit_object_placement(tool.Ifc, tool.Geometry, tool.Surveyor, obj=obj_pred)
port, port_pred = get_connected_ports_between(element, predecessor)
port_matrix_pred = tool.Model.get_element_matrix(port_pred)
# Only segments can be extended
# extension for them takes priority over translation
if element.is_a("IfcFlowSegment"):
DumbProfileJoiner().join_E(obj, port_matrix_pred.translation * si_conversion)
context.view_layer.update() # update since extrusion might involve changing object's location
port_martix = tool.Model.get_element_matrix(port)
port_location = port_martix.translation
port_location_pred = port_matrix_pred.translation
if not tool.Cad.are_vectors_equal(port_location, port_location_pred):
obj.location += (port_location_pred - port_location) * si_conversion
context.view_layer.update() # otherwise tool.Ifc.is_moved won't get triggered
else:
# If the element does not need to be transformed, return early.
return
for child_branch in branch_element["children"]:
process_branch(child_branch)
@@ -168,6 +208,7 @@ class FitFlowSegments(bpy.types.Operator, tool.Ifc.Operator):
elif total_profiles == 2:
if is_parallel:
fitting_type = "TRANSITION"
bpy.ops.bim.mep_add_transition()
elif total_selected_objs == 3:
if total_profiles > 1:
@@ -229,6 +270,10 @@ class MEPGenerator:
if port_position == "end_port":
tool.Model.edit_element_placement(port, end_port_matrix)
continue
# NOTE: currently this functionality is moved to bim.regenerate_distribution_element
connected_port = tool.System.get_connected_port(port)
if not connected_port:
continue
@@ -303,6 +348,8 @@ class MEPGenerator:
There lies the problem that it won't be
able to identify the fittings that were not yet connected to any segments yet.
"""
# TODO: check angle, start, end and offset for transitions
if not isinstance(segment_or_segments, collections.abc.Iterable):
segments = [segment_or_segments]
ports = [port_or_ports]
@@ -313,7 +360,7 @@ class MEPGenerator:
segments_data = []
for segment, port in zip(segments, ports, strict=True):
segment_type = ifcopenshell.util.element.get_type(segment)
# if segment doesn't have type we cannot check compatibility by available occurences
# if segment doesn't have type we cannot check compatibility by available occurrences
if segment_type is None:
return
segments_data.append((segment_type, port.PredefinedType, port.SystemType))
@@ -369,28 +416,38 @@ class MEPGenerator:
for fitting_type in fitting_types:
if fitting_type.PredefinedType != predefined_type:
continue
fittings = tool.Ifc.get_all_element_occurences(fitting_type)
fittings = tool.Ifc.get_all_element_occurrences(fitting_type)
if not fittings:
continue
fitting = fittings[0]
ports = ifcopenshell.util.system.get_ports(fitting)
fitting_data = []
fitting_connected_to_none_type = False
for port in ports:
connected_port = tool.System.get_connected_port(port)
connected_element = tool.System.get_port_relating_element(connected_port)
element_type = ifcopenshell.util.element.get_type(connected_element)
if element_type is None:
fitting_connected_to_none_type = True
break
fitting_data.append((element_type, port.PredefinedType, port.SystemType))
for fitting in fittings:
ports = ifcopenshell.util.system.get_ports(fitting)
fitting_data = []
skipped_the_occurrence = False
for port in ports:
connected_port = tool.System.get_connected_port(port)
if fitting_connected_to_none_type:
continue
# fitting port is not connected to anything
if not connected_port:
skipped_the_occurrence = True
break
if are_connected_elements_compatible(segments_data, fitting_data):
return pack_return_data(fitting_type, ports, segments_data)
connected_element = tool.System.get_port_relating_element(connected_port)
element_type = ifcopenshell.util.element.get_type(connected_element)
# fitting is connected to none type
if element_type is None:
skipped_the_occurrence = True
break
fitting_data.append((element_type, port.PredefinedType, port.SystemType))
# if we skipped the occurrence we still can other occurrences
# otherwise checking 1 occurrence is enough
if not skipped_the_occurrence:
if are_connected_elements_compatible(segments_data, fitting_data):
return pack_return_data(fitting_type, ports, segments_data)
return
def create_obstruction_type(self, segment):
# code is very similar to "bim.add_type"
@@ -453,7 +510,7 @@ class MEPGenerator:
obstruction_type = self.create_obstruction_type(segment)
profile_joiner = DumbProfileJoiner()
# create obstruction occurence and setup it's length and port
# create obstruction occurrence and setup it's length and port
# NOTE: at this point we loose current blender objects selection
bpy.ops.bim.add_constr_type_instance(relating_type_id=obstruction_type.id())
obstruction_obj = bpy.context.active_object
@@ -570,10 +627,13 @@ class MEPAddTransition(bpy.types.Operator, tool.Ifc.Operator):
start_axis = tool.Model.get_flow_segment_axis(start_object)
end_axis = tool.Model.get_flow_segment_axis(end_object)
start_object_rotation = start_object.matrix_world.to_quaternion()
start_object_z_basis = start_object_rotation.to_matrix().col[2] # z basis vector
keep_only_z_axis = lambda p_ws: p_ws.dot(start_object_z_basis) * start_object_z_basis
# TODO: support cases when segments are partially or completely overlapping each other
if not tool.Cad.are_edges_collinear(start_axis, end_axis):
self.report({"ERROR"}, f"Failed to add transition - non collinear segments are not yet supported.")
if not tool.Cad.are_edges_parallel(start_axis, end_axis):
self.report({"ERROR"}, f"Failed to add transition - segments are not parallel.")
return {"CANCELLED"}
start_segment_data = MEPGenerator().get_segment_data(start_element)
@@ -588,38 +648,115 @@ class MEPAddTransition(bpy.types.Operator, tool.Ifc.Operator):
end_segment_data["end_point"]: end_segment_data["end_port"],
}
# transition points
start_point, end_point = tool.Cad.closest_points(
(start_segment_data["start_point"], start_segment_data["end_point"]),
(end_segment_data["start_point"], end_segment_data["end_point"]),
)
transition_dir = (end_point - start_point).normalized()
# figure profile offset
base_transition_dir = keep_only_z_axis(end_point - start_point).normalized()
flip_profile_offset = base_transition_dir.dot(start_object_z_basis) < 0
if tool.Cad.are_edges_collinear(start_axis, end_axis):
profile_offset = None
else:
to_start_object_space = start_object_rotation.inverted()
profile_offset = (
(to_start_object_space @ end_object.location) - (to_start_object_space @ start_object.location)
).xy
if tool.Cad.is_x(profile_offset.length_squared, 0):
profile_offset = None
else:
profile_offset = profile_offset / si_conversion
if flip_profile_offset:
profile_offset *= V(1, -1)
# world space profile offset
profile_offset_ws = (
start_object_rotation @ (profile_offset * si_conversion).to_3d() if profile_offset else V(0, 0, 0)
)
# will need entire_length to check that transition length fill fit
first_segment_start, second_segment_end = [
p
for p in (
start_segment_data["start_point"],
start_segment_data["end_point"],
end_segment_data["start_point"],
end_segment_data["end_point"],
)
if p not in (start_point, end_point)
]
def get_segments_length():
start_dir = (start_point - first_segment_start).normalized()
segments_vector = second_segment_end - first_segment_start
return segments_vector.dot(start_dir)
entire_length = get_segments_length()
# can't rely on (end_point-start_point) here because
# transition might change the segments length and therefore direction will be changed
segments_dir = (start_point - first_segment_start).normalized()
start_port = points_ports_map[start_point]
end_port = points_ports_map[end_point]
# add transition representation
builder = ShapeBuilder(ifc_file)
rep, transition_data = builder.mep_transition_shape(
start_element, end_element, self.start_length / si_conversion, self.end_length / si_conversion
start_element,
end_element,
self.start_length / si_conversion,
self.end_length / si_conversion,
profile_offset=profile_offset,
)
if not rep:
self.report({"ERROR"}, f"Failed to add transition - this kind of profiles is not yet supported.")
return {"CANCELLED"}
middle_point = (start_point + end_point) / 2
full_transition_length = transition_data["full_transition_length"] * si_conversion
start_segment_extend_point = middle_point - transition_dir * full_transition_length / 2
end_segment_extend_point = middle_point + transition_dir * full_transition_length / 2
DumbProfileJoiner().join_E(start_object, start_segment_extend_point)
DumbProfileJoiner().join_E(end_object, end_segment_extend_point)
if full_transition_length >= entire_length:
self.report(
{"ERROR"},
f"Failed to add transition - transition length is larger the segments and the distance between them.\n"
+ f"Transition length: {full_transition_length:.2f}m, segments length: {entire_length:.2f}m",
)
ifcopenshell.api.run("geometry.remove_representation", ifc_file, representation=rep)
return {"CANCELLED"}
# calculate bunch of points to for adjustments
middle_point = keep_only_z_axis((start_point + end_point) / 2 - start_point) + start_point
start_segment_extend_point = middle_point - segments_dir * full_transition_length / 2
end_segment_extend_point = middle_point + segments_dir * full_transition_length / 2 + profile_offset_ws
transition_dir = keep_only_z_axis(end_segment_extend_point - start_segment_extend_point).normalized()
# adjust the segments
end_object_rotation = end_object.matrix_world.to_quaternion()
end_object_z_basis = end_object_rotation.to_matrix().col[2] # z basis vector
if tool.Cad.is_x(start_object_z_basis.dot(transition_dir), 1):
start_connection = "ATEND"
else:
start_connection = "ATSTART"
if tool.Cad.is_x(end_object_z_basis.dot(transition_dir), 1):
end_connection = "ATSTART"
else:
end_connection = "ATEND"
DumbProfileJoiner().join_E(start_object, start_segment_extend_point, start_connection)
DumbProfileJoiner().join_E(end_object, end_segment_extend_point, end_connection)
# find the compatible fitting type
fitting_data = MEPGenerator().get_compatible_fitting_type(
[start_element, end_element], [start_port, end_port], "TRANSITION"
)
transition_type = fitting_data["fitting_type"] if fitting_data else None
if transition_type:
# TODO: handle the case without creating a representation in the first place?
ifcopenshell.api.run("geometry.remove_representation", ifc_file, representation=rep)
start_port_match = fitting_data["start_port_match"] if fitting_data else True
# create new fitting type if nothing is compatible
if not transition_type:
mesh = bpy.data.meshes.new("Transition")
obj = bpy.data.objects.new("Transition", mesh)
@@ -643,22 +780,28 @@ class MEPAddTransition(bpy.types.Operator, tool.Ifc.Operator):
)
# NOTE: at this point we loose current blender objects selection
# create transition element
bpy.ops.bim.add_constr_type_instance(relating_type_id=transition_type.id())
transition_obj = bpy.context.active_object
# adjust transition segment rotation and location
# required since we'll base our `transition_obj_dir` on this
transition_obj.matrix_world = start_object.matrix_world
context.view_layer.update()
transition_obj_dir = tool.Cad.get_edge_direction(tool.Model.get_flow_segment_axis(transition_obj))
direction_match = tool.Cad.are_vectors_equal(transition_obj_dir, transition_dir)
# depending on transition direction we may need to flip it or attach it's origin to end segment
# direction can be different depending on:
# - order of the current segments
# - order of the segments that were used with the same transition type before
transition_obj_dir = tool.Cad.get_edge_direction(tool.Model.get_flow_segment_axis(transition_obj))
direction_match = tool.Cad.are_vectors_equal(transition_dir, transition_obj_dir)
# if there are no mismatches or everything matches up we don't need to flip the transition
if start_port_match != direction_match:
transition_obj.matrix_world = start_object.matrix_world @ Matrix.Rotation(radians(180), 4, "X")
transition_obj.location = start_segment_extend_point if start_port_match else end_segment_extend_point
# add ports and connect them
ports = tool.System.add_ports(transition_obj)
ports = tool.System.add_ports(transition_obj, offset_end_port=profile_offset_ws)
if not start_port_match:
start_port, end_port = end_port, start_port
tool.Ifc.run("system.connect_port", port1=ports[0], port2=start_port, direction="NOTDEFINED")
@@ -70,7 +70,10 @@ class FilledOpeningGenerator:
)
if target is None:
target = bpy.context.scene.cursor.location
should_set_z_level = True
target = bpy.context.scene.cursor.location.copy()
else:
should_set_z_level = False
# Sometimes, the voided_obj may be an aggregate, which won't have any representation.
if voided_obj.data:
@@ -86,12 +89,17 @@ class FilledOpeningGenerator:
axis = tool.Model.get_wall_axis(voided_obj, layers=layers)["base"]
new_matrix = voided_obj.matrix_world.copy()
new_matrix.translation = tool.Cad.point_on_edge(target, axis)
point_on_axis = tool.Cad.point_on_edge(target, axis)
new_matrix.translation.x = point_on_axis.x
new_matrix.translation.y = point_on_axis.y
if filling.is_a("IfcDoor"):
new_matrix.translation.z = voided_obj.matrix_world.translation.z
if should_set_z_level:
if filling.is_a("IfcDoor"):
new_matrix.translation.z = voided_obj.matrix_world.translation.z
else:
new_matrix.translation.z = voided_obj.matrix_world.translation.z + props.rl2
else:
new_matrix.translation.z = voided_obj.matrix_world.translation.z + props.rl2
new_matrix.translation.z = filling_obj.matrix_world.copy().translation.z
filling_obj.matrix_world = new_matrix
bpy.context.view_layer.update()
@@ -498,10 +506,14 @@ class AddBoolean(Operator, tool.Ifc.Operator):
bl_idname = "bim.add_boolean"
bl_label = "Add Boolean"
bl_options = {"REGISTER", "UNDO"}
bl_description = "Applies a boolean to the selected IFC object using the other selected blender object as a void"
@classmethod
def poll(cls, context):
return len(context.selected_objects) == 2
if not len(context.selected_objects) == 2:
cls.poll_message_set("Exactly 2 objects need to be selected.")
return False
return True
def _execute(self, context):
props = context.scene.BIMModelProperties
@@ -646,6 +658,7 @@ class RemoveBooleans(Operator, tool.Ifc.Operator, AddObjectHelper):
bl_options = {"REGISTER", "UNDO"}
def _execute(self, context):
upstream_obj = None
for obj in context.selected_objects:
if (
not obj.data
@@ -673,6 +686,8 @@ class RemoveBooleans(Operator, tool.Ifc.Operator, AddObjectHelper):
should_sync_changes_first=False,
)
bpy.data.objects.remove(obj)
tool.Blender.set_active_object(upstream_obj)
return {"FINISHED"}
@@ -735,12 +750,19 @@ class EditOpenings(Operator, tool.Ifc.Operator):
def _execute(self, context):
props = bpy.context.scene.BIMModelProperties
building_objs = set()
model = tool.Ifc.get()
all_openings = model.by_type("IfcOpeningElement")
similar_openings = []
for obj in context.selected_objects:
element = tool.Ifc.get_entity(obj)
if not element:
continue
openings = [r.RelatedOpeningElement for r in element.HasOpenings]
for opening in openings:
for all_opening in all_openings:
if all_opening.ObjectPlacement == opening.ObjectPlacement:
similar_openings.append(all_opening)
opening_obj = tool.Ifc.get_object(opening)
if opening_obj:
if tool.Ifc.is_edited(opening_obj):
@@ -749,6 +771,8 @@ class EditOpenings(Operator, tool.Ifc.Operator):
blenderbim.core.geometry.edit_object_placement(
tool.Ifc, tool.Geometry, tool.Surveyor, obj=opening_obj
)
for similar_opening in similar_openings:
similar_opening.ObjectPlacement = opening.ObjectPlacement
building_objs.add(obj)
building_objs.update(self.get_all_building_objects_of_similar_openings(opening))
tool.Ifc.unlink(element=opening, obj=opening_obj)
@@ -773,6 +797,34 @@ class EditOpenings(Operator, tool.Ifc.Operator):
results.add(obj)
return results
class CloneOpening(Operator, tool.Ifc.Operator):
bl_idname = "bim.clone_opening"
bl_label = "Clone Opening"
bl_options = {"REGISTER", "UNDO"}
bl_description = "Create and assign to the selected element the selected opening and assign to it the same representation and object placement"
def _execute(self, context):
objects = bpy.context.selected_objects
for obj in objects:
entity = tool.Ifc.get_entity(obj)
if entity.is_a() == "IfcWall":
wall = entity
continue
if entity.is_a() == "IfcOpeningElement":
opening = entity
continue
opening_placement = opening.ObjectPlacement
opening_representations = opening.Representation.Representations
new_opening = ifcopenshell.api.run("root.create_entity", tool.Ifc.get(), ifc_class="IfcOpeningElement")
for representation in opening_representations:
ifcopenshell.api.run("geometry.assign_representation", tool.Ifc.get(), product = new_opening, representation = representation)
ifcopenshell.api.run("void.add_opening", tool.Ifc.get(), opening = new_opening, element = wall)
new_opening.ObjectPlacement = opening_placement
return {"FINISHED"}
# TODO: merge with ProfileDecorator?
class DecorationsHandler:
@@ -213,7 +213,7 @@ class AddConstrTypeInstance(bpy.types.Operator):
tool.Ifc, tool.Collector, tool.Spatial, structure_obj=parent_obj, element_obj=obj
)
# set occurences properties for the types defined with modifiers
# set occurrences properties for the types defined with modifiers
if instance_class in ["IfcWindow", "IfcDoor"]:
pset_name = f"BBIM_{instance_class[3:]}"
bbim_pset = ifcopenshell.util.element.get_psets(element).get(pset_name, None)
@@ -272,13 +272,21 @@ class DumbProfileJoiner:
body = copy.deepcopy(axis1)
self.recreate_profile(element1, profile1, axis, body)
def join_E(self, profile1, target):
def join_E(self, profile1, target, connection=None):
"""`connection` = `ATEND` / `ATSTART` to explicitly define the reference point for the join.
For example if profile 1m long and `target` is at (0, 0, 0.1) and `connection` = `None`
it will implicitly use `connection` = `ATSTART` resulting in profile object 0.9m long and moved to (0, 0, 0.1).
But with `connection` = `ATEND` it will result in the profile object 0.1m long, locaiton unchanged.
"""
element1 = tool.Ifc.get_entity(profile1)
if not element1:
return
axis1 = self.get_profile_axis(profile1)
intersect, connection = mathutils.geometry.intersect_point_line(target, *axis1)
connection = "ATEND" if connection > 0.5 else "ATSTART"
intersect, connection_value = mathutils.geometry.intersect_point_line(target, *axis1)
if connection is None:
connection = "ATEND" if connection_value > 0.5 else "ATSTART"
ifcopenshell.api.run("geometry.disconnect_path", tool.Ifc.get(), element=element1, connection_type=connection)
@@ -59,10 +59,10 @@ def update_railing_modifier_ifc_data(context):
# type attributes
element.PredefinedType = "USERDEFINED"
# occurences attributes
occurences = tool.Ifc.get_all_element_occurences(element)
for occurence in occurences:
occurence.ObjectType = props.railing_type
# occurrences attributes
occurrences = tool.Ifc.get_all_element_occurrences(element)
for occurrence in occurrences:
occurrence.ObjectType = props.railing_type
# update pset
pset_common = tool.Pset.get_element_pset(element, "Pset_RailingCommon")
@@ -40,10 +40,6 @@ from pprint import pprint
# https://ifc43-docs.standards.buildingsmart.org/IFC/RELEASE/IFC4x3/HTML/lexical/IfcRoofType.htm
def float_is_zero(f):
return 0.0001 >= f >= -0.0001
def bm_mesh_clean_up(bm):
# remove internal edges and faces
# adding missing faces so we could rely on `e.is_boundary` later
@@ -99,7 +95,7 @@ def is_valid_roof_footprint(bm):
# should be bmesh to support edit mode
bm.verts.ensure_lookup_table()
base_z = bm.verts[0].co.z
all_verts_same_level = all([float_is_zero(v.co.z - base_z) for v in bm.verts[1:]])
all_verts_same_level = all([tool.Cad.is_x(v.co.z - base_z, 0) for v in bm.verts[1:]])
if not all_verts_same_level:
return (
{"ERROR"},
@@ -202,7 +198,7 @@ def generate_hiped_roof_bmesh(
def find_identical_new_vert(co):
for v in bm.verts:
if float_is_zero((co - v.co).length):
if tool.Cad.is_x((co - v.co).length, 0):
return v
def find_other_polygon_verts(edge):
@@ -234,7 +230,7 @@ def generate_hiped_roof_bmesh(
bottom_chords_to_remove = []
def is_footprint_vert(v):
return float_is_zero(v.co.z - footprint_z)
return tool.Cad.is_x(v.co.z - footprint_z, 0)
def is_footprint_edge(edge):
return all(is_footprint_vert(v) for v in edge.verts)
@@ -326,7 +322,7 @@ def generate_hiped_roof_bmesh(
default_offset_dir = Vector([0, 0, 1]) * roof_thickness
footprint_verts = set()
if not float_is_zero(rafter_edge_angle):
if not tool.Cad.is_x(rafter_edge_angle, 0):
footprint_edges = []
for edge in extruded_edges:
if is_footprint_edge(edge):
@@ -398,7 +394,7 @@ def update_roof_modifier_ifc_data(context):
if not angle_layer:
return False
for edge_angle in angle_layer:
if float_is_zero(edge_angle - pi / 2):
if tool.Cad.is_x(edge_angle - pi / 2, 0):
return True
return False
@@ -406,8 +402,8 @@ def update_roof_modifier_ifc_data(context):
if props.roof_type == "HIP/GABLE ROOF":
element.PredefinedType = "GABLE_ROOF" if roof_is_gabled() else "HIP_ROOF"
# occurences attributes
# occurences = tool.Ifc.get_all_element_occurences(element)
# occurrences attributes
# occurrences = tool.Ifc.get_all_element_occurrences(element)
tool.Ifc.edit(obj)
@@ -95,19 +95,19 @@ class GenerateSpace(bpy.types.Operator, tool.Ifc.Operator):
gross_settings.set(gross_settings.DISABLE_OPENING_SUBTRACTIONS, True)
for obj in bpy.context.visible_objects:
element = tool.Ifc.get_entity(obj)
visible_element = tool.Ifc.get_entity(obj)
if (
not element
not visible_element
or obj.type != "MESH"
or not self.is_bounding_class(element)
or not self.is_bounding_class(visible_element)
or not tool.Drawing.is_intersecting_plane(obj, self.cut_point, self.cut_normal)
):
continue
old_mesh = None
if element.HasOpenings:
new_mesh = self.create_mesh(ifcopenshell.geom.create_shape(gross_settings, element))
if visible_element.HasOpenings:
new_mesh = self.create_mesh(ifcopenshell.geom.create_shape(gross_settings, visible_element))
old_mesh = obj.data
obj.data = new_mesh
@@ -34,7 +34,7 @@ from mathutils import Vector
# TODO: move to some utils helpers/tool module
def update_simple_openings(element, opening_width, opening_height):
ifc_file = tool.Ifc.get()
fillings = tool.Ifc.get_all_element_occurences(element)
fillings = tool.Ifc.get_all_element_occurrences(element)
voided_objs = set()
has_replaced_opening_representation = False
@@ -158,11 +158,11 @@ def update_window_modifier_representation(context, obj):
if tool.Ifc.get_schema() != "IFC2X3":
element.PartitioningType = props.window_type
# occurences attributes
occurences = tool.Ifc.get_all_element_occurences(element)
for occurence in occurences:
occurence.OverallWidth = props.overall_width / si_conversion
occurence.OverallHeight = props.overall_height / si_conversion
# occurrences attributes
occurrences = tool.Ifc.get_all_element_occurrences(element)
for occurrence in occurrences:
occurrence.OverallWidth = props.overall_width / si_conversion
occurrence.OverallHeight = props.overall_height / si_conversion
update_simple_openings(element, props.overall_width / si_conversion, props.overall_height / si_conversion)
@@ -51,6 +51,7 @@ class BimTool(WorkSpaceTool):
("bim.hotkey", {"type": "K", "value": "PRESS", "shift": True}, {"properties": [("hotkey", "S_K")]}),
("bim.hotkey", {"type": "M", "value": "PRESS", "shift": True}, {"properties": [("hotkey", "S_M")]}),
("bim.hotkey", {"type": "O", "value": "PRESS", "shift": True}, {"properties": [("hotkey", "S_O")]}),
("bim.hotkey", {"type": "L", "value": "PRESS", "shift": True}, {"properties": [("hotkey", "S_L")]}),
("bim.hotkey", {"type": "Q", "value": "PRESS", "shift": True}, {"properties": [("hotkey", "S_Q")]}),
("bim.hotkey", {"type": "R", "value": "PRESS", "shift": True}, {"properties": [("hotkey", "S_R")]}),
("bim.hotkey", {"type": "T", "value": "PRESS", "shift": True}, {"properties": [("hotkey", "S_T")]}),
@@ -77,9 +78,11 @@ class WallTool(BimTool):
bl_description = "Create and edit walls"
bl_icon = os.path.join(os.path.dirname(__file__), "ops.authoring.wall")
bl_widget = None
ifc_element_type = "IfcWallType"
def draw_settings(context, layout, ws_tool):
BimToolUI.draw(context, layout, ifc_element_type="IfcWallType")
@classmethod
def draw_settings(cls, context, layout, ws_tool):
BimToolUI.draw(context, layout, ifc_element_type=cls.ifc_element_type)
class SlabTool(BimTool):
@@ -90,9 +93,11 @@ class SlabTool(BimTool):
bl_description = "Create and edit slabs"
bl_icon = os.path.join(os.path.dirname(__file__), "ops.authoring.slab")
bl_widget = None
ifc_element_type = "IfcSlabType"
def draw_settings(context, layout, ws_tool):
BimToolUI.draw(context, layout, ifc_element_type="IfcSlabType")
@classmethod
def draw_settings(cls, context, layout, ws_tool):
BimToolUI.draw(context, layout, ifc_element_type=cls.ifc_element_type)
class DoorTool(BimTool):
@@ -103,9 +108,11 @@ class DoorTool(BimTool):
bl_description = "Create and edit doors"
bl_icon = os.path.join(os.path.dirname(__file__), "ops.authoring.door")
bl_widget = None
ifc_element_type = "IfcDoorType"
def draw_settings(context, layout, ws_tool):
BimToolUI.draw(context, layout, ifc_element_type="IfcDoorType")
@classmethod
def draw_settings(cls, context, layout, ws_tool):
BimToolUI.draw(context, layout, ifc_element_type=cls.ifc_element_type)
class WindowTool(BimTool):
@@ -116,9 +123,11 @@ class WindowTool(BimTool):
bl_description = "Create and edit windows"
bl_icon = os.path.join(os.path.dirname(__file__), "ops.authoring.window")
bl_widget = None
ifc_element_type = "IfcWindowType"
def draw_settings(context, layout, ws_tool):
BimToolUI.draw(context, layout, ifc_element_type="IfcWindowType")
@classmethod
def draw_settings(cls, context, layout, ws_tool):
BimToolUI.draw(context, layout, ifc_element_type=cls.ifc_element_type)
class ColumnTool(BimTool):
@@ -129,9 +138,11 @@ class ColumnTool(BimTool):
bl_description = "Create and edit columns"
bl_icon = os.path.join(os.path.dirname(__file__), "ops.authoring.column")
bl_widget = None
ifc_element_type = "IfcColumnType"
def draw_settings(context, layout, ws_tool):
BimToolUI.draw(context, layout, ifc_element_type="IfcColumnType")
@classmethod
def draw_settings(cls, context, layout, ws_tool):
BimToolUI.draw(context, layout, ifc_element_type=cls.ifc_element_type)
class BeamTool(BimTool):
@@ -142,9 +153,11 @@ class BeamTool(BimTool):
bl_description = "Create and edit beams"
bl_icon = os.path.join(os.path.dirname(__file__), "ops.authoring.beam")
bl_widget = None
ifc_element_type = "IfcBeamType"
def draw_settings(context, layout, ws_tool):
BimToolUI.draw(context, layout, ifc_element_type="IfcBeamType")
@classmethod
def draw_settings(cls, context, layout, ws_tool):
BimToolUI.draw(context, layout, ifc_element_type=cls.ifc_element_type)
class DuctTool(BimTool):
@@ -155,9 +168,11 @@ class DuctTool(BimTool):
bl_description = "Create and edit ducks" # No, not a typo.
bl_icon = os.path.join(os.path.dirname(__file__), "ops.authoring.duct")
bl_widget = None
ifc_element_type = "IfcDuctSegmentType"
def draw_settings(context, layout, ws_tool):
BimToolUI.draw(context, layout, ifc_element_type="IfcDuctSegmentType")
@classmethod
def draw_settings(cls, context, layout, ws_tool):
BimToolUI.draw(context, layout, ifc_element_type=cls.ifc_element_type)
class PipeTool(BimTool):
@@ -168,9 +183,11 @@ class PipeTool(BimTool):
bl_description = "Create and edit pipes"
bl_icon = os.path.join(os.path.dirname(__file__), "ops.authoring.pipe")
bl_widget = None
ifc_element_type = "IfcPipeSegmentType"
def draw_settings(context, layout, ws_tool):
BimToolUI.draw(context, layout, ifc_element_type="IfcPipeSegmentType")
@classmethod
def draw_settings(cls, context, layout, ws_tool):
BimToolUI.draw(context, layout, ifc_element_type=cls.ifc_element_type)
def add_layout_hotkey_operator(layout, text, hotkey, description):
@@ -393,6 +410,13 @@ class BimToolUI:
else:
row.operator("bim.show_openings", icon="HIDE_OFF", text="")
if AuthoringData.data["active_class"] in ("IfcOpeningElement",):
if len(context.selected_objects) == 2:
row = cls.layout.row(align=True)
row.label(text="", icon="EVENT_SHIFT")
row.label(text="", icon="EVENT_L")
row.operator("bim.clone_opening", text="Clone Opening")
cls.layout.row(align=True).label(text="Align")
add_layout_hotkey_operator(cls.layout, "Align Exterior", "S_X", "")
add_layout_hotkey_operator(cls.layout, "Align Centerline", "S_C", "")
@@ -726,6 +750,11 @@ class Hotkey(bpy.types.Operator, tool.Ifc.Operator):
self.props.y = self.y
self.props.z = self.z
def hotkey_S_L(self):
if AuthoringData.data["active_class"] in ("IfcOpeningElement",):
if len(bpy.context.selected_objects) == 2:
bpy.ops.bim.clone_opening()
def hotkey_A_D(self):
if not bpy.context.selected_objects:
return
@@ -744,3 +773,7 @@ class Hotkey(bpy.types.Operator, tool.Ifc.Operator):
bpy.ops.bim.edit_openings()
else:
bpy.ops.bim.show_openings()
LIST_OF_TOOLS = [cls.bl_idname for cls in (BimTool.__subclasses__() + [BimTool])]
TOOLS_TO_CLASSES_MAP = {cls.bl_idname: cls.ifc_element_type for cls in BimTool.__subclasses__()}
@@ -29,6 +29,7 @@ classes = (
operator.EnableEditingArbitraryProfile,
operator.EnableEditingProfile,
operator.LoadProfiles,
operator.PurgeUnusedProfiles,
operator.RemoveProfileDef,
prop.Profile,
prop.BIMProfileProperties,
@@ -36,6 +36,7 @@ class ProfileData:
def load(cls):
cls.data = {
"total_profiles": cls.total_profiles(),
"active_profile_users": cls.active_profile_users(),
"profile_classes": cls.profile_classes(),
"is_arbitrary_profile": cls.is_arbitrary_profile(),
"is_editing_arbitrary_profile": cls.is_editing_arbitrary_profile(),
@@ -46,6 +47,15 @@ class ProfileData:
def total_profiles(cls):
return len([p for p in tool.Ifc.get().by_type("IfcProfileDef") if p.ProfileName])
@classmethod
def active_profile_users(cls):
profiles_props = bpy.context.scene.BIMProfileProperties
if profiles_props.active_profile_index >= len(profiles_props.profiles):
return 0
profile_prop = profiles_props.profiles[profiles_props.active_profile_index]
profile_ifc = tool.Ifc.get().by_id(profile_prop.ifc_definition_id)
return tool.Ifc.get().get_total_inverses(profile_ifc)
@classmethod
def profile_classes(cls):
classes = ["IfcArbitraryClosedProfileDef"]
@@ -72,4 +82,9 @@ class ProfileData:
@classmethod
def is_editing_arbitrary_profile(cls):
obj = bpy.context.active_object
return obj and obj.data and hasattr(obj.data, "BIMMeshProperties") and obj.data.BIMMeshProperties.subshape_type == "PROFILE"
return (
obj
and obj.data
and hasattr(obj.data, "BIMMeshProperties")
and obj.data.BIMMeshProperties.subshape_type == "PROFILE"
)
@@ -21,6 +21,7 @@ import ifcopenshell.api
import blenderbim.bim.helper
import blenderbim.tool as tool
import blenderbim.bim.module.model.profile as model_profile
import blenderbim.core.profile as core
from blenderbim.bim.module.model.decorator import ProfileDecorator
from blenderbim.bim.module.profile.prop import generate_thumbnail_for_active_profile
from blenderbim.bim.module.profile.data import refresh
@@ -213,3 +214,16 @@ class EditArbitraryProfile(bpy.types.Operator, tool.Ifc.Operator):
props.active_arbitrary_profile_id = 0
model_profile.DumbProfileRegenerator().regenerate_from_profile_def(profile)
class PurgeUnusedProfiles(bpy.types.Operator, tool.Ifc.Operator):
bl_idname = "bim.purge_unused_profiles"
bl_label = "Purge Unused Profiles"
bl_options = {"REGISTER", "UNDO"}
def _execute(self, context):
props = context.scene.BIMProfileProperties
core.purge_unused_profiles(tool.Ifc, tool.Profile)
if props.is_editing:
refresh()
bpy.ops.bim.load_profiles()
@@ -49,10 +49,14 @@ class Profile(PropertyGroup):
ifc_definition_id: IntProperty(name="IFC Definition ID")
def update_active_profile_index(self, context):
ProfileData.data["active_profile_users"] = ProfileData.active_profile_users()
class BIMProfileProperties(PropertyGroup):
is_editing: BoolProperty(name="Is Editing")
profiles: CollectionProperty(name="Profiles", type=Profile)
active_profile_index: IntProperty(name="Active Profile Index")
active_profile_index: IntProperty(name="Active Profile Index", update=update_active_profile_index)
active_profile_id: IntProperty(name="Active Profile Id")
active_arbitrary_profile_id: IntProperty(name="Active Arbitrary Profile Id")
profile_attributes: CollectionProperty(name="Profile Attributes", type=Attribute)
@@ -79,17 +79,23 @@ class BIM_PT_profiles(Panel):
self.props,
"active_profile_index",
)
if active_profile and active_profile.ifc_class in (
"IfcArbitraryClosedProfileDef",
"IfcArbitraryProfileDefWithVoids",
):
if self.props.active_arbitrary_profile_id:
row = self.layout.row(align=True)
row.operator("bim.edit_arbitrary_profile", text="Save Arbitrary Profile", icon="CHECKMARK")
row.operator("bim.disable_editing_arbitrary_profile", text="", icon="CANCEL")
else:
row = self.layout.row()
row.operator("bim.enable_editing_arbitrary_profile", text="Edit Arbitrary Profile", icon="GREASEPENCIL")
if active_profile:
if active_profile.ifc_class in (
"IfcArbitraryClosedProfileDef",
"IfcArbitraryProfileDefWithVoids",
):
if self.props.active_arbitrary_profile_id:
row = self.layout.row(align=True)
row.operator("bim.edit_arbitrary_profile", text="Save Arbitrary Profile", icon="CHECKMARK")
row.operator("bim.disable_editing_arbitrary_profile", text="", icon="CANCEL")
else:
row = self.layout.row()
row.operator(
"bim.enable_editing_arbitrary_profile", text="Edit Arbitrary Profile", icon="GREASEPENCIL"
)
users_of_profile = ProfileData.data["active_profile_users"]
self.layout.label(icon="INFO", text=f"Profile has {users_of_profile} inverse relationship(s) in project")
if self.props.active_profile_id:
self.draw_editable_ui(context)
@@ -41,6 +41,7 @@ classes = (
operator.SaveLibraryFile,
operator.SelectLibraryFile,
operator.ToggleFilterCategories,
operator.ToggleLinkSelectability,
operator.ToggleLinkVisibility,
operator.UnassignLibraryDeclaration,
operator.UnlinkIfc,
@@ -55,6 +56,7 @@ classes = (
ui.BIM_PT_project,
ui.BIM_PT_project_library,
ui.BIM_PT_links,
ui.BIM_PT_purge,
ui.BIM_UL_library,
ui.BIM_UL_filter_categories,
ui.BIM_UL_links,
@@ -880,6 +880,27 @@ class LoadLink(bpy.types.Operator):
return {"FINISHED"}
class ToggleLinkSelectability(bpy.types.Operator):
bl_idname = "bim.toggle_link_selectability"
bl_label = "Toggle Link Selectability"
bl_options = {"REGISTER", "UNDO"}
bl_description = "Toggle selectability"
link: bpy.props.StringProperty()
def execute(self, context):
props = context.scene.BIMProjectProperties
link = props.links.get(self.link)
for collection in self.get_linked_collections():
collection.hide_select = not collection.hide_select
link.is_selectable = not collection.hide_select
return {"FINISHED"}
def get_linked_collections(self):
return [
c for c in bpy.data.collections if "IfcProject" in c.name and c.library and c.library.filepath == self.link
]
class ToggleLinkVisibility(bpy.types.Operator):
bl_idname = "bim.toggle_link_visibility"
bl_label = "Toggle Link Visibility"
@@ -93,6 +93,7 @@ class FilterCategory(PropertyGroup):
class Link(PropertyGroup):
name: StringProperty(name="Name")
is_loaded: BoolProperty(name="Is Loaded", default=False)
is_selectable: BoolProperty(name="Is Selectable", default=True)
is_wireframe: BoolProperty(name="Is Wireframe", default=False)
is_hidden: BoolProperty(name="Is Hidden", default=False)
@@ -350,6 +350,13 @@ class BIM_UL_links(UIList):
row = layout.row(align=True)
if item.is_loaded:
row.label(text=item.name)
op = row.operator(
"bim.toggle_link_selectability",
text="",
icon="RESTRICT_SELECT_OFF" if item.is_selectable else "RESTRICT_SELECT_ON",
emboss=False,
)
op.link = item.name
op = row.operator(
"bim.toggle_link_visibility",
text="",
@@ -374,3 +381,18 @@ class BIM_UL_links(UIList):
op.filepath = item.name
op = row.operator("bim.unlink_ifc", text="", icon="X")
op.filepath = item.name
class BIM_PT_purge(Panel):
bl_label = "Purge Data"
bl_options = {"DEFAULT_CLOSED"}
bl_space_type = "PROPERTIES"
bl_region_type = "WINDOW"
bl_context = "scene"
bl_parent_id = "BIM_PT_tab_quality_control"
def draw(self, context):
layout = self.layout
layout.operator("bim.purge_unused_profiles")
layout.operator("bim.purge_unused_types")
layout.operator("bim.purge_unused_representations")
@@ -398,6 +398,7 @@ class CalculateQuantity(bpy.types.Operator):
bl_idname = "bim.calculate_quantity"
bl_label = "Calculate Quantity"
bl_options = {"REGISTER", "UNDO"}
bl_description = "Calculates the quantity with a defined formula for this exact entity and quantity"
prop: bpy.props.StringProperty()
def execute(self, context):
@@ -424,6 +425,10 @@ class GuessQuantity(bpy.types.Operator):
bl_idname = "bim.guess_quantity"
bl_label = "Guess Quantity"
bl_options = {"REGISTER", "UNDO"}
bl_description = (
"Calculate the quantity by guessing the formula from the quantity name. "
"Less reliable than Calculate Quantity"
)
prop: bpy.props.StringProperty()
def execute(self, context):
@@ -450,7 +455,13 @@ class CopyPropertyToSelection(bpy.types.Operator, Operator):
else:
is_pset = context.active_object.PsetProperties.active_pset_type == "PSET"
pset_name = context.active_object.PsetProperties.active_pset_name
prop_value = context.active_object.PsetProperties.properties.get(self.name).metadata.get_value()
prop = context.active_object.PsetProperties.properties.get(self.name)
if prop.value_type == "IfcPropertySingleValue":
prop_value = prop.metadata.get_value()
elif prop.value_type == "IfcPropertyEnumeratedValue":
value_name = prop.metadata.get_value_name()
prop_value = [e[value_name] for e in prop.enumerated_value.enumerated_values if e.is_selected]
for obj in tool.Blender.get_selected_objects():
core.copy_property_to_selection(
tool.Ifc,
@@ -71,6 +71,9 @@ def draw_enumerated_property(prop, layout, copy_operator=None):
grid = layout.column_flow(columns=3)
for e in prop.enumerated_value.enumerated_values:
grid.prop(e, "is_selected", text=str(e[value_name]))
if copy_operator:
op = layout.operator(f"{copy_operator}", text="", icon="COPYDOWN")
op.name = prop.metadata.name
def get_active_pset_obj_name(context, obj_type):
@@ -370,6 +373,7 @@ class BIM_PT_task_qtos(Panel):
bl_region_type = "WINDOW"
bl_context = "scene"
bl_parent_id = "BIM_PT_work_schedules"
bl_order = 2
@classmethod
def poll(cls, context):
@@ -510,6 +514,7 @@ class BIM_PT_work_schedule_psets(Panel):
bl_region_type = "WINDOW"
bl_context = "scene"
bl_parent_id = "BIM_PT_work_schedules"
bl_order = 3
@classmethod
def poll(cls, context):
@@ -18,6 +18,7 @@
import os
import bpy
import pathlib
import ifcopenshell
import blenderbim.tool as tool
from blenderbim.bim.ifc import IfcStore
@@ -51,17 +52,23 @@ class PsetTemplatesData:
@classmethod
def pset_template_files(cls):
files = os.listdir(os.path.join(bpy.context.scene.BIMProperties.data_dir, "pset"))
return [(f.replace(".ifc", ""), f.replace(".ifc", ""), "") for f in files]
results = []
pset_dir = os.path.join(bpy.context.scene.BIMProperties.data_dir, "pset")
files = os.listdir(pset_dir)
for f in files:
results.append((os.path.join(pset_dir, f), f.strip(".ifc"), "Global Pset Template"))
pset_dir = tool.Ifc.resolve_uri(bpy.context.scene.BIMProperties.pset_dir)
if os.path.isdir(pset_dir):
for path in pathlib.Path(pset_dir).glob("*.ifc"):
results.append((str(path), os.path.basename(str(path)).strip(".ifc"), "Project Pset Template"))
return sorted(results, key=lambda x: x[1])
@classmethod
def pset_templates(cls):
if not IfcStore.pset_template_file:
IfcStore.pset_template_path = os.path.join(
bpy.context.scene.BIMProperties.data_dir,
"pset",
bpy.context.scene.BIMPsetTemplateProperties.pset_template_files + ".ifc",
)
IfcStore.pset_template_path = bpy.context.scene.BIMPsetTemplateProperties.pset_template_files
IfcStore.pset_template_file = ifcopenshell.open(IfcStore.pset_template_path)
return [(str(t.id()), t.Name, "") for t in IfcStore.pset_template_file.by_type("IfcPropertySetTemplate")]
@@ -20,36 +20,41 @@ import bpy
from . import ui, prop, operator
classes = (
operator.DisableResourceEditingUI,
operator.DisableEditingResource,
operator.EnableEditingResource,
operator.LoadResources,
operator.AddResource,
operator.AddResourceQuantity,
operator.EditResource,
operator.RemoveResource,
operator.RemoveResourceQuantity,
operator.LoadResourceProperties,
operator.ExpandResource,
operator.ContractResource,
operator.AddProductivityData,
operator.AssignResource,
operator.UnassignResource,
operator.EnableEditingResourceTime,
operator.EnableEditingResourceQuantity,
operator.EnableEditingResourceBaseQuantity,
operator.EnableEditingResourceCosts,
operator.EnableEditingResourceCostValueFormula,
operator.EnableEditingResourceCostValue,
operator.EditResourceTime,
operator.EditResourceQuantity,
operator.CalculateResourceWork,
operator.ConstrainResourceWork,
operator.ContractResource,
operator.DisableEditingResource,
operator.DisableEditingResourceCostValue,
operator.DisableEditingResourceQuantity,
operator.DisableEditingResourceTime,
operator.DisableResourceEditingUI,
operator.EditProductivityData,
operator.EditResource,
operator.EditResourceCostValue,
operator.EditResourceCostValueFormula,
operator.DisableEditingResourceTime,
operator.DisableEditingResourceQuantity,
operator.DisableEditingResourceCostValue,
operator.CalculateResourceWork,
operator.EditResourceQuantity,
operator.EditResourceTime,
operator.EnableEditingResource,
operator.EnableEditingResourceBaseQuantity,
operator.EnableEditingResourceCosts,
operator.EnableEditingResourceCostValue,
operator.CalculateResourceUsage,
operator.EnableEditingResourceCostValueFormula,
operator.EnableEditingResourceQuantity,
operator.EnableEditingResourceTime,
operator.ExpandResource,
operator.GoToResource,
operator.ImportResources,
operator.EditProductivityData,
operator.LoadResourceProperties,
operator.LoadResources,
operator.RemoveResource,
operator.RemoveResourceQuantity,
operator.RemoveUsageConstraint,
operator.UnassignResource,
prop.Resource,
prop.BIMResourceProperties,
prop.BIMResourceTreeProperties,
@@ -56,21 +56,75 @@ class ResourceData:
"type": resource.is_a(),
"BaseQuantity": base_quantity,
}
results[resource.id()]["Benchmarks"] = cls.get_resource_benchmarks(resource)
if resource.is_a() in ["IfcLaborResource", "IfcConstructionEquipmentResource"]:
results[resource.id()]["Productivity"] = {}
results[resource.id()]["InheritedProductivity"] = {}
productivity = cls.get_productivity(resource)
if productivity:
results[resource.id()]["Productivity"] = {
"id": productivity.get("id"),
"QuantityProduced": ifcopenshell.util.resource.get_quantity_produced(productivity),
"TimeConsumed": ifcopenshell.util.resource.get_unit_consumed(productivity),
"QuantityProducedName": ifcopenshell.util.resource.get_quantity_produced_name(productivity),
}
inherited_productivity = cls.get_parent_productivity(resource)
if inherited_productivity:
results[resource.id()]["InheritedProductivity"] = {
"QuantityProduced": ifcopenshell.util.resource.get_quantity_produced(inherited_productivity),
"TimeConsumed": ifcopenshell.util.resource.get_unit_consumed(inherited_productivity),
"QuantityProducedName": ifcopenshell.util.resource.get_quantity_produced_name(
inherited_productivity
),
}
if resource.Usage:
results[resource.id()]["ScheduleWork"] = (
ifcopenshell.util.date.readable_ifc_duration(resource.Usage.ScheduleWork)
if resource.Usage.ScheduleWork
else None
)
results[resource.id()]["ScheduleUsage"] = (
resource.Usage.ScheduleUsage if resource.Usage.ScheduleUsage else None
)
if resource.IsNestedBy:
results[resource.id()]["DerivedScheduleWork"] = cls.sum_person_hours(resource)
return results
@classmethod
def sum_person_hours(cls, resource):
sum = 0
nested_resources = ifcopenshell.util.resource.get_nested_resources(resource)
for nested_resource in nested_resources or []:
if not nested_resource.Usage or not nested_resource.Usage.ScheduleWork:
continue
duration = ifcopenshell.util.date.ifc2datetime(nested_resource.Usage.ScheduleWork)
sum += duration.total_seconds() / 3600
return round(float(sum), 2) if sum else 0
@classmethod
def get_resource_benchmarks(cls, resource):
constraints = []
for constraint in ifcopenshell.util.constraint.get_constraints(resource) or []:
metrics = []
for metric in ifcopenshell.util.constraint.get_metrics(constraint) or []:
metrics.append(
{
"reference": ifcopenshell.util.constraint.get_metric_reference(metric),
"Benchmark": metric.Benchmark,
"ConstraintGrade": metric.ConstraintGrade,
}
)
constraints.append({"ObjectiveQualifier": constraint.ObjectiveQualifier, "metrics": metrics})
return constraints
@classmethod
def get_productivity(cls, resource):
return ifcopenshell.util.resource.get_productivity(resource, should_inherit=False)
@classmethod
def get_parent_productivity(cls, resource):
return ifcopenshell.util.resource.get_parent_productivity(resource)
@classmethod
def cost_values(cls):
results = []
@@ -18,6 +18,7 @@
import bpy
from bpy_extras.io_utils import ImportHelper
from blenderbim.bim.module.resource.ui import draw_productivity_ui
import blenderbim.core.resource as core
import blenderbim.tool as tool
@@ -198,6 +199,13 @@ class CalculateResourceWork(bpy.types.Operator, tool.Ifc.Operator):
bl_options = {"REGISTER", "UNDO"}
resource: bpy.props.IntProperty()
@classmethod
def poll(cls, context):
active_resource = tool.Resource.get_highlighted_resource()
if active_resource:
if tool.Resource.get_productivity(active_resource, should_inherit=True):
return True
def _execute(self, context):
core.calculate_resource_work(tool.Ifc, tool.Resource, resource=tool.Ifc.get().by_id(self.resource))
@@ -334,7 +342,7 @@ class EditResourceQuantity(bpy.types.Operator, tool.Ifc.Operator):
class ImportResources(bpy.types.Operator, tool.Ifc.Operator, ImportHelper):
bl_idname = "import_resources.bim"
bl_label = "Import P6"
bl_label = "Import Resources"
bl_options = {"REGISTER", "UNDO"}
filename_ext = ".csv"
filter_glob: bpy.props.StringProperty(default="*.csv", options={"HIDDEN"})
@@ -348,6 +356,16 @@ class ImportResources(bpy.types.Operator, tool.Ifc.Operator, ImportHelper):
core.import_resources(tool.Resource, file_path=self.filepath)
class AddProductivityData(bpy.types.Operator, tool.Ifc.Operator):
bl_idname = "bim.add_productivity_data"
bl_description = "Apply"
bl_label = "Add Productivity"
bl_options = {"REGISTER", "UNDO"}
def _execute(self, context):
tool.Ifc.run("pset.add_pset", product=tool.Resource.get_highlighted_resource(), name="EPset_Productivity")
class EditProductivityData(bpy.types.Operator, tool.Ifc.Operator):
bl_idname = "bim.edit_productivity_data"
bl_description = "Apply"
@@ -356,3 +374,67 @@ class EditProductivityData(bpy.types.Operator, tool.Ifc.Operator):
def _execute(self, context):
core.edit_productivity_pset(tool.Ifc, tool.Resource)
def draw(self, context):
draw_productivity_ui(self, context)
def invoke(self, context, event):
return context.window_manager.invoke_props_dialog(self, width=600)
class ConstrainResourceWork(bpy.types.Operator, tool.Ifc.Operator):
bl_idname = "bim.add_usage_constraint"
bl_label = "Constrain Resource Work"
bl_options = {"REGISTER", "UNDO"}
resource: bpy.props.IntProperty()
attribute: bpy.props.StringProperty()
def _execute(self, context):
core.add_usage_constraint(
tool.Ifc, tool.Resource, resource=tool.Ifc.get().by_id(self.resource), reference_path=self.attribute
)
class RemoveUsageConstraint(bpy.types.Operator, tool.Ifc.Operator):
bl_idname = "bim.remove_usage_constraint"
bl_label = "Remove Usage Constraint"
bl_options = {"REGISTER", "UNDO"}
resource: bpy.props.IntProperty()
attribute: bpy.props.StringProperty()
def _execute(self, context):
core.remove_usage_constraint(
tool.Ifc, tool.Resource, resource=tool.Ifc.get().by_id(self.resource), reference_path=self.attribute
)
class GoToResource(bpy.types.Operator):
bl_idname = "bim.go_to_resource"
bl_label = "Go To Resource"
bl_description = "Selects the resource in the Resource Panel"
bl_options = {"REGISTER", "UNDO"}
resource: bpy.props.IntProperty()
def execute(self, context):
core.go_to_resource(tool.Resource, resource=tool.Ifc.get().by_id(self.resource))
return {"FINISHED"}
class CalculateResourceUsage(bpy.types.Operator, tool.Ifc.Operator):
bl_idname = "bim.calculate_resource_usage"
bl_label = "Calculate Resource Usage"
bl_options = {"REGISTER", "UNDO"}
@classmethod
def poll(cls, context):
active_resource = tool.Resource.get_highlighted_resource()
if active_resource:
if active_resource.Usage and active_resource.Usage.ScheduleWork:
task = tool.Resource.get_task_assignments(active_resource)
if task and tool.Sequence.has_duration(task):
return True
return False
def _execute(self, context):
core.calculate_resource_usage(tool.Ifc, tool.Resource, resource=tool.Ifc.get().by_id(tool.Resource.get_highlighted_resource()))
@@ -1,5 +1,5 @@
# BlenderBIM Add-on - OpenBIM Blender Add-on
# Copyright (C) 2020, 2021 Dion Moult <dion@thinkmoult.com>
# Copyright (C) 2021, 2022, 2023 Dion Moult, Yassine Oualid <dion@thinkmoult.com>
#
# This file is part of BlenderBIM Add-on.
#
@@ -22,6 +22,8 @@ import ifcopenshell.util.resource
from blenderbim.bim.ifc import IfcStore
import blenderbim.tool as tool
import blenderbim.bim.module.pset.data
import blenderbim.bim.module.resource.data
import blenderbim.bim.module.sequence.data
from blenderbim.bim.prop import StrProperty, Attribute
from bpy.types import PropertyGroup
from bpy.props import (
@@ -56,6 +58,8 @@ def updateResourceName(self, context):
if props.active_resource_id == self.ifc_definition_id:
attribute = props.resource_attributes.get("Name")
attribute.string_value = self.name
blenderbim.bim.module.resource.data.refresh()
tool.Sequence.refresh_task_resources()
def get_quantity_types(self, context):
@@ -72,7 +76,7 @@ def get_quantity_types(self, context):
def update_active_resource_index(self, context):
blenderbim.bim.module.pset.data.refresh()
if self.should_show_productivity:
if self.should_show_resource_tools:
tool.Resource.load_productivity_data()
@@ -80,18 +84,20 @@ def updateResourceUsage(self, context):
props = context.scene.BIMResourceProperties
if not props.is_resource_update_enabled:
return
if self.schedule_usage == "":
if not self.schedule_usage:
return
resource = tool.Ifc.get().by_id(self.ifc_definition_id)
if not resource.Usage:
tool.Ifc.run(
"resource.add_resource_time",
resource=resource,
)
resource.Usage.ScheduleUsage = self.schedule_usage
blenderbim.bim.module.pset.data.refresh()
if resource.Usage and resource.Usage.ScheduleUsage == self.schedule_usage:
return
tool.Resource.run_edit_resource_time(resource, attributes={
"ScheduleUsage": self.schedule_usage
})
tool.Sequence.load_task_properties()
tool.Resource.load_resource_properties()
tool.Sequence.refresh_task_resources()
blenderbim.bim.module.resource.data.refresh()
blenderbim.bim.module.sequence.data.refresh()
blenderbim.bim.module.pset.data.refresh()
class ISODuration(PropertyGroup):
@@ -144,7 +150,7 @@ class BIMResourceProperties(PropertyGroup):
quantity_types: EnumProperty(items=get_quantity_types, name="Quantity Types")
is_editing_quantity: BoolProperty(name="Is Editing Quantity")
quantity_attributes: CollectionProperty(name="Quantity Attributes", type=Attribute)
should_show_productivity: BoolProperty(name="Edit Productivity", update=update_active_resource_index)
should_show_resource_tools: BoolProperty(name="Edit Productivity", update=update_active_resource_index)
class BIMResourceProductivity(PropertyGroup):
@@ -20,20 +20,21 @@ import blenderbim.bim.helper
from bpy.types import Panel, UIList
from blenderbim.bim.ifc import IfcStore
from blenderbim.bim.module.resource.data import ResourceData
import blenderbim.tool as tool
class BIM_PT_resources(Panel):
bl_label = "Resources"
bl_idname = "BIM_PT_resources"
bl_options = {"DEFAULT_CLOSED"}
bl_space_type = "PROPERTIES"
bl_region_type = "WINDOW"
bl_context = "scene"
bl_parent_id = "BIM_PT_tab_resources"
bl_options = {"HIDE_HEADER"}
@classmethod
def poll(cls, context):
return tool.Blender.is_tab(context, "SCHEDULING") and tool.Ifc.get() and tool.Ifc.get().schema != "IFC2X3"
file = IfcStore.get_file()
return file and hasattr(file, "schema") and file.schema != "IFC2X3"
def draw(self, context):
self.props = context.scene.BIMResourceProperties
@@ -64,58 +65,124 @@ class BIM_PT_resources(Panel):
self.props,
"active_resource_index",
)
row = self.layout.row(align=True)
row.alignment = "RIGHT"
row.prop(self.props, "should_show_productivity", icon="RECOVER_LAST")
if self.props.should_show_productivity:
self.draw_productivity_ui(context)
if self.props.active_resource_id and self.props.editing_resource_type == "ATTRIBUTES":
self.draw_editable_resource_attributes_ui()
elif self.props.active_resource_id and self.props.editing_resource_type == "QUANTITY":
self.draw_editable_resource_quantity_ui()
elif self.props.active_resource_id and self.props.editing_resource_type == "COSTS":
self.draw_editable_resource_costs_ui()
elif self.props.active_resource_id and self.props.editing_resource_type == "USAGE":
self.draw_editable_resource_time_attributes_ui()
if self.props.active_resource_id:
if self.props.editing_resource_type == "ATTRIBUTES":
self.draw_editable_resource_attributes_ui()
elif self.props.active_resource_id and self.props.editing_resource_type == "QUANTITY":
self.draw_editable_resource_quantity_ui()
elif self.props.active_resource_id and self.props.editing_resource_type == "COSTS":
self.draw_editable_resource_costs_ui()
elif self.props.active_resource_id and self.props.editing_resource_type == "USAGE":
self.draw_editable_resource_time_attributes_ui()
self.draw_productivity_ui(context)
def draw_productivity_ui(self, context):
total_resources = len(self.tprops.resources)
if not total_resources or self.props.active_resource_index >= total_resources:
return
ifc_definition_id = self.tprops.resources[self.props.active_resource_index].ifc_definition_id
resource = ResourceData.data["resources"][ifc_definition_id]
if not resource["type"] in ["IfcConstructionEquipmentResource", "IfcLaborResource"]:
row = self.layout.row(align=True)
row.label(text="Resource type cannot have productivity data", icon="ERROR")
return
self.productivity_props = context.scene.BIMResourceProductivity
if resource["Productivity"]:
produtivitiy_rate_message = "Current Rate: {}/{}".format(
resource["Productivity"]["QuantityProduced"], resource["Productivity"]["TimeConsumed"]
)
row = self.layout.row()
row.alignment = "LEFT"
row.label(text=produtivitiy_rate_message, icon="ARMATURE_DATA")
else:
row = self.layout.row(align=True)
row.alignment = "LEFT"
produtivitiy_rate_message = "No productivity data found"
row.label(text=produtivitiy_rate_message, icon="ARMATURE_DATA")
row = self.layout.row(align=True)
row.alignment = "RIGHT"
row.prop(self.productivity_props, "quantity_produced", text="Quantity Produced")
row.prop(self.productivity_props, "quantity_produced_name", text="Quantity Name")
row = self.layout.row()
row.alignment = "RIGHT"
self.draw_duration_property(self.productivity_props.quantity_consumed, row)
row = self.layout.row()
row.alignment = "RIGHT"
row.operator("bim.edit_productivity_data", text="Apply", icon="CHECKMARK")
row.prop(self.props, "should_show_resource_tools", text="Resource Tools", icon="RECOVER_LAST")
if self.props.should_show_resource_tools:
total_resources = len(self.tprops.resources)
if not total_resources or self.props.active_resource_index >= total_resources:
return
ifc_definition_id = self.tprops.resources[self.props.active_resource_index].ifc_definition_id
resource = ResourceData.data["resources"][ifc_definition_id]
if not resource["type"] in ["IfcConstructionEquipmentResource", "IfcLaborResource"]:
row = self.layout.row(align=True)
row.label(text="Resource type cannot have productivity data", icon="ERROR")
else:
is_usage_locked = False
is_work_locked = False
for constraint in resource["Benchmarks"] or []:
for metric in constraint["metrics"] or []:
if (
metric["ConstraintGrade"] == "HARD"
and metric["reference"]
and metric["reference"] == "Usage.ScheduleUsage"
):
is_usage_locked = True
elif (
metric["ConstraintGrade"] == "HARD"
and metric["reference"]
and metric["reference"] == "Usage.ScheduleWork"
):
is_work_locked = True
grid = self.layout.grid_flow(columns=3, even_columns=False, even_rows=False, align=False)
col1 = grid.column(align=True)
col2 = grid.column(align=False)
col3 = grid.column(align=True)
col1.ui_units_x = 1
col2.ui_units_x = 1
col3.ui_units_x = 2
row1_col1 = col1.row()
row1_col1.label(text="Schedule Work")
row1col2 = col2.row()
schedule_work = resource.get("ScheduleWork", None)
derived_schedule_work = resource.get("DerivedScheduleWork", None)
row1col2.label(
text="{}".format(schedule_work) if schedule_work else "{} h*".format(derived_schedule_work),
icon="TIME",
)
row1col3 = col3.row()
row1col3.operator("bim.calculate_resource_work", text="", icon="TEMP").resource = ifc_definition_id
op = row1col3.operator(
"bim.add_usage_constraint" if not is_work_locked else "bim.remove_usage_constraint",
text="",
icon="LOCKED" if is_work_locked else "UNLOCKED",
)
op.resource = ifc_definition_id
op.attribute = "Usage.ScheduleWork"
row2_col1 = col1.row()
row2_col1.label(text="Schedule Usage")
row2col2 = col2.row()
row2col2.prop(self.tprops.resources[self.props.active_resource_index], "schedule_usage", text="")
row2col3 = col3.row()
row2col3.operator("bim.calculate_resource_usage", text="", icon="TEMP")
op = row2col3.operator(
"bim.add_usage_constraint" if not is_usage_locked else "bim.remove_usage_constraint",
text="",
icon="LOCKED" if is_usage_locked else "UNLOCKED",
)
op.resource = ifc_definition_id
op.attribute = "Usage.ScheduleUsage"
productivity = resource["Productivity"]
parent_productivity = resource["InheritedProductivity"]
row = self.layout.row()
if productivity:
produtivitiy_rate_message = "Current Productivity Rate: {} {} / {}".format(
productivity["QuantityProduced"],
productivity["QuantityProducedName"],
productivity["TimeConsumed"],
)
row.alignment = "LEFT"
row.label(text=produtivitiy_rate_message, icon="ARMATURE_DATA")
row.operator("bim.edit_productivity_data", text="", icon="GREASEPENCIL")
op = row.operator("bim.remove_pset", text="", icon="X")
op.pset_id = productivity["id"]
op.obj_type = "Resource"
op.obj = ""
elif parent_productivity:
produtivitiy_rate_message = "Inherited Productivity Rate: {} {} / {}*".format(
parent_productivity["QuantityProduced"],
parent_productivity["QuantityProducedName"],
parent_productivity["TimeConsumed"],
)
row.alignment = "LEFT"
row.label(text="{}".format(produtivitiy_rate_message), icon="ARMATURE_DATA")
row.operator("bim.add_productivity_data", text="", icon="ADD")
else:
row = self.layout.row(align=True)
row.alignment = "LEFT"
produtivitiy_rate_message = "No productivity data found"
row.label(text="{}".format(produtivitiy_rate_message), icon="ARMATURE_DATA")
row.operator("bim.add_productivity_data", text="", icon="ADD")
def draw_resource_operators(self):
row = self.layout.row(align=True)
@@ -153,9 +220,6 @@ class BIM_PT_resources(Panel):
if not self.props.active_resource_id:
if resource["type"] in ["IfcLaborResource", "IfcConstructionEquipmentResource"]:
if resource["Productivity"]:
op = row.operator("bim.calculate_resource_work", text="", icon="TEMP")
op.resource = ifc_definition_id
row.operator("bim.enable_editing_resource_time", text="", icon="TIME").resource = ifc_definition_id
op = row.operator("bim.enable_editing_resource_base_quantity", text="", icon="PROPERTIES")
op.resource = ifc_definition_id
@@ -163,6 +227,12 @@ class BIM_PT_resources(Panel):
op.resource = ifc_definition_id
row.operator("bim.enable_editing_resource", text="", icon="GREASEPENCIL").resource = ifc_definition_id
row.operator("bim.remove_resource", text="", icon="X").resource = ifc_definition_id
else:
if self.props.editing_resource_type == "ATTRIBUTES":
row.operator("bim.edit_resource", text="", icon="CHECKMARK")
elif self.props.editing_resource_type == "USAGE":
row.operator("bim.edit_resource_time", text="", icon="CHECKMARK")
row.operator("bim.disable_editing_resource", text="", icon="CANCEL")
def draw_editable_resource_attributes_ui(self):
blenderbim.bim.helper.draw_attributes(self.props.resource_attributes, self.layout)
@@ -250,7 +320,6 @@ class BIM_PT_resources(Panel):
def draw_duration_property(self, duration_props, layout):
for duration_prop in duration_props:
if duration_prop.name == "BaseQuantityConsumed":
layout.label(text=duration_prop.name)
layout.prop(duration_prop, "years", text="Y")
layout.prop(duration_prop, "months", text="M")
layout.prop(duration_prop, "days", text="D")
@@ -287,7 +356,7 @@ class BIM_UL_resources(UIList):
else:
row.label(text="", icon="DOT")
row.prop(item, "name", emboss=False, text="", icon=icon_map[resource["type"]])
row.prop(item, "schedule_usage", text="", emboss=False)
row.prop(item, "schedule_usage", text="", emboss=False) if item.schedule_usage else None
if context.active_object and not props.active_resource_id:
row = layout.row(align=True)
if item.ifc_definition_id in ResourceData.data["active_resource_ids"]:
@@ -303,3 +372,29 @@ class BIM_UL_resources(UIList):
elif props.editing_resource_type == "USAGE":
row.operator("bim.edit_resource_time", text="", icon="CHECKMARK")
row.operator("bim.disable_editing_resource", text="", icon="CANCEL")
def draw_productivity_ui(self, context):
def draw_duration_property(duration_props, layout):
for duration_prop in duration_props:
if duration_prop.name == "BaseQuantityConsumed":
layout.prop(duration_prop, "years", text="Y")
layout.prop(duration_prop, "months", text="M")
layout.prop(duration_prop, "days", text="D")
layout.prop(duration_prop, "hours", text="H")
layout.prop(duration_prop, "minutes", text="Min")
layout.prop(duration_prop, "seconds", text="S")
productivity_props = context.scene.BIMResourceProductivity
grid = self.layout.grid_flow(columns=2, even_columns=False, even_rows=False, align=False)
col1 = grid.column(align=False)
col2 = grid.column(align=False)
row1_col1 = col1.row()
row1_col1.label(text="Quantity")
row1_col2 = col2.row()
row1_col2.prop(productivity_props, "quantity_produced", text="")
row1_col2.prop(productivity_props, "quantity_produced_name", text="")
row2_col1 = col1.row()
row2_col1.label(text="Time")
row2_col2 = col2.row()
draw_duration_property(productivity_props.quantity_consumed, row2_col2)
@@ -26,6 +26,7 @@ classes = (
operator.AddFilterGroup,
operator.AddToIfcGroup,
operator.ColourByProperty,
operator.EditFilterQuery,
operator.FilterModelElements,
operator.IfcSelector,
operator.LoadColourscheme,
@@ -39,6 +40,7 @@ classes = (
operator.SaveSearch,
operator.SaveSelectorQuery,
operator.Search,
operator.SelectFilterElements,
operator.SelectGlobalId,
operator.SelectIfcClass,
operator.SelectSimilar,
@@ -40,12 +40,14 @@ class SearchData:
@classmethod
def saved_searches(cls):
if not tool.Ifc.get():
return []
groups = tool.Ifc.get().by_type("IfcGroup")
results = []
for group in groups:
try:
data = json.loads(group.Description)
if isinstance(data, dict) and data.get("type", None) == "BBIM_Search":
if isinstance(data, dict) and data.get("type", None) == "BBIM_Search" and data.get("query", None):
results.append(group)
except:
pass
@@ -61,9 +61,14 @@ colour_list = [
class AddFilterGroup(Operator):
bl_idname = "bim.add_filter_group"
bl_label = "Add Filter Group"
module: StringProperty()
def execute(self, context):
context.scene.BIMSearchProperties.filter_groups.add()
if self.module == "search":
props = context.scene.BIMSearchProperties
elif self.module == "csv":
props = context.scene.CsvProperties
props.filter_groups.add()
return {"FINISHED"}
@@ -71,9 +76,13 @@ class RemoveFilterGroup(Operator):
bl_idname = "bim.remove_filter_group"
bl_label = "Remove Filter Group"
index: IntProperty()
module: StringProperty()
def execute(self, context):
props = context.scene.BIMSearchProperties
if self.module == "search":
props = context.scene.BIMSearchProperties
elif self.module == "csv":
props = context.scene.CsvProperties
props.filter_groups.remove(self.index)
return {"FINISHED"}
@@ -83,9 +92,13 @@ class RemoveFilter(Operator):
bl_label = "Remove Filter Group"
group_index: IntProperty()
index: IntProperty()
module: StringProperty()
def execute(self, context):
props = context.scene.BIMSearchProperties
if self.module == "search":
props = context.scene.BIMSearchProperties
elif self.module == "csv":
props = context.scene.CsvProperties
props.filter_groups[self.group_index].filters.remove(self.index)
return {"FINISHED"}
@@ -95,13 +108,87 @@ class AddFilter(Operator):
bl_label = "Add Filter"
index: IntProperty()
type: StringProperty()
module: StringProperty()
def execute(self, context):
new = context.scene.BIMSearchProperties.filter_groups[self.index].filters.add()
if self.module == "search":
props = context.scene.BIMSearchProperties
elif self.module == "csv":
props = context.scene.CsvProperties
new = props.filter_groups[self.index].filters.add()
new.type = self.type
return {"FINISHED"}
class SelectFilterElements(bpy.types.Operator):
bl_idname = "bim.select_filter_elements"
bl_label = "Select Filter Elements"
bl_options = {"REGISTER", "UNDO"}
group_index: IntProperty()
index: IntProperty()
module: StringProperty()
def execute(self, context):
if self.module == "search":
props = context.scene.BIMSearchProperties
elif self.module == "csv":
props = context.scene.CsvProperties
global_ids = []
for obj in context.selected_objects:
element = tool.Ifc.get_entity(obj)
if element:
global_id = getattr(element, "GlobalId", None)
if global_id:
global_ids.append(global_id)
if len(global_ids) > 50:
# Too much to store in a string property
name = "globalid-filter-" + ifcopenshell.guid.new()
text_data = bpy.data.texts.new(name)
text_data.from_string(",".join(global_ids))
props.filter_groups[self.group_index].filters[self.index].value = f"bpy.data.texts['{name}']"
else:
props.filter_groups[self.group_index].filters[self.index].value = ",".join(global_ids)
return {"FINISHED"}
class EditFilterQuery(Operator, tool.Ifc.Operator):
bl_idname = "bim.edit_filter_query"
bl_label = "Edit Filter Query"
bl_description = "Edit the underlying filter query for advanced users"
bl_options = {"REGISTER", "UNDO"}
query: StringProperty(name="Query")
module: StringProperty()
def _execute(self, context):
if self.query == self.old_query:
return
if self.module == "search":
props = context.scene.BIMSearchProperties
elif self.module == "csv":
props = context.scene.CsvProperties
try:
tool.Search.import_filter_query(self.query, props.filter_groups)
except:
return
def draw(self, context):
row = self.layout.row()
row.prop(self, "query", text="")
def invoke(self, context, event):
if self.module == "search":
props = context.scene.BIMSearchProperties
elif self.module == "csv":
props = context.scene.CsvProperties
self.query = tool.Search.export_filter_query(props.filter_groups)
self.old_query = self.query
return context.window_manager.invoke_props_dialog(self)
class Search(Operator):
bl_idname = "bim.search"
bl_label = "Search"
@@ -127,21 +214,36 @@ class SaveSearch(Operator, tool.Ifc.Operator):
bl_description = "Save search filter to an IFC group"
bl_options = {"REGISTER", "UNDO"}
name: StringProperty(name="Name")
module: StringProperty()
def _execute(self, context):
if not self.name:
return
query = tool.Search.export_filter_query(context.scene.BIMSearchProperties.filter_groups)
results = ifcopenshell.util.selector.filter_elements(tool.Ifc.get(), query)
if self.module == "search":
props = context.scene.BIMSearchProperties
elif self.module == "csv":
props = context.scene.CsvProperties
try:
query = tool.Search.export_filter_query(props.filter_groups)
results = ifcopenshell.util.selector.filter_elements(tool.Ifc.get(), query)
except:
return
description = json.dumps({"type": "BBIM_Search", "query": query})
group = [g for g in tool.Ifc.get().by_type("IfcGroup") if g.Name == self.name]
if group:
group = group[0]
group.Description = description
else:
group = ifcopenshell.api.run("group.add_group", tool.Ifc.get(), Name=self.name, Description=description)
ifcopenshell.api.run("group.assign_group", tool.Ifc.get(), products=results, group=group)
if results:
ifcopenshell.api.run("group.assign_group", tool.Ifc.get(), products=list(results), group=group)
def draw(self, context):
row = self.layout.row()
row.prop(self, "name")
def invoke(self, context, event):
return context.window_manager.invoke_props_dialog(self)
@@ -152,11 +254,15 @@ class LoadSearch(Operator, tool.Ifc.Operator):
bl_label = "Load Search"
bl_description = "Load search filter from an IFC group"
bl_options = {"REGISTER", "UNDO"}
module: StringProperty()
def _execute(self, context):
props = context.scene.BIMSearchProperties
group = tool.Ifc.get().by_id(int(props.saved_searches))
query = tool.Search.import_filter_query(group, context.scene.BIMSearchProperties.filter_groups)
if self.module == "search":
props = context.scene.BIMSearchProperties
elif self.module == "csv":
props = context.scene.CsvProperties
group = tool.Ifc.get().by_id(int(context.scene.BIMSearchProperties.saved_searches))
query = tool.Search.import_filter_query(tool.Search.get_group_query(group), props.filter_groups)
def draw(self, context):
props = context.scene.BIMSearchProperties
@@ -242,14 +348,15 @@ class SaveColourscheme(Operator, tool.Ifc.Operator):
query = props.colourscheme_query
group = [g for g in tool.Ifc.get().by_type("IfcGroup") if g.Name == self.name]
coulour_scheme = {cs.name: cs.colour[0:3] for cs in props.colourscheme}
if group:
group = group[0]
description = json.loads(group.Description)
description["colourscheme"] = {cs.name: cs.colour[0:3] for cs in props.colourscheme}
description["colourscheme"] = coulour_scheme
description["colourscheme_query"] = query
group.Description = json.dumps(description)
else:
description = json.dumps({"type": "BBIM_Search", "colourscheme": query})
description = json.dumps({"type": "BBIM_Search", "colourscheme": coulour_scheme,"colourscheme_query": query})
group = ifcopenshell.api.run("group.add_group", tool.Ifc.get(), Name=self.name, Description=description)
def invoke(self, context, event):
@@ -264,7 +371,7 @@ class LoadColourscheme(Operator, tool.Ifc.Operator):
def _execute(self, context):
props = context.scene.BIMSearchProperties
group = tool.Ifc.get().by_id(int(props.saved_searches))
group = tool.Ifc.get().by_id(int(props.saved_colourschemes))
description = json.loads(group.Description)
props.colourscheme_query = description.get("colourscheme_query")
props.colourscheme.clear()
@@ -128,7 +128,8 @@ class BIMSearchProperties(PropertyGroup):
("classification", "Classification", "", "OUTLINER", 4),
("location", "Location", "", "PACKAGE", 5),
("type", "Type", "", "FILE_VOLUME", 6),
("instance", "GlobalId", "", "GRIP", 7),
("query", "Query", "", "POINTCLOUD_DATA", 7),
("instance", "GlobalId", "", "GRIP", 8),
],
)
saved_searches: EnumProperty(items=get_saved_searches, name="Saved Searches")
@@ -17,6 +17,7 @@
# along with BlenderBIM Add-on. If not, see <http://www.gnu.org/licenses/>.
import bpy
import blenderbim.bim.helper
from bpy.types import Panel
from blenderbim.bim.module.search.data import SearchData, ColourByPropertyData, SelectSimilarData
@@ -35,59 +36,7 @@ class BIM_PT_search(Panel):
props = context.scene.BIMSearchProperties
row = self.layout.row(align=True)
row.label(text=f"{len(SearchData.data['saved_searches'])} Saved Searches")
if SearchData.data["saved_searches"]:
row.operator("bim.load_search", text="", icon="IMPORT")
row.operator("bim.save_search", text="", icon="EXPORT")
row = self.layout.row(align=True)
row.operator("bim.add_filter_group", text="Add Search Group", icon="ADD")
for i, filter_group in enumerate(props.filter_groups):
box = self.layout.box()
row = box.row(align=True)
row.prop(props, "facet", text="")
op = row.operator("bim.add_filter", text="Add Filter", icon="ADD")
op.type = props.facet
op.index = i
for j, ifc_filter in enumerate(filter_group.filters):
if ifc_filter.type == "entity":
row = box.row(align=True)
row.prop(ifc_filter, "value", text="", icon="FILE_3D")
elif ifc_filter.type == "attribute":
row = box.row(align=True)
row.prop(ifc_filter, "name", text="", icon="COPY_ID")
row.prop(ifc_filter, "value", text="")
elif ifc_filter.type == "type":
row = box.row(align=True)
row.prop(ifc_filter, "value", text="", icon="FILE_VOLUME")
elif ifc_filter.type == "material":
row = box.row(align=True)
row.prop(ifc_filter, "value", text="", icon="MATERIAL")
elif ifc_filter.type == "property":
row = box.row(align=True)
row.prop(ifc_filter, "pset", text="", icon="PROPERTIES")
row.prop(ifc_filter, "name", text="")
row.prop(ifc_filter, "value", text="")
elif ifc_filter.type == "classification":
row = box.row(align=True)
row.prop(ifc_filter, "value", text="", icon="OUTLINER")
elif ifc_filter.type == "location":
row = box.row(align=True)
row.prop(ifc_filter, "name", text="", icon="PACKAGE")
elif ifc_filter.type == "instance":
row = box.row(align=True)
row.prop(ifc_filter, "value", text="", icon="GRIP")
op = row.operator("bim.remove_filter", text="", icon="X")
op.group_index = i
op.index = j
row = box.row()
row.operator("bim.remove_filter_group", icon="X").index = i
blenderbim.bim.helper.draw_filter(self.layout, props, SearchData, "search")
if len(props.filter_groups):
row = self.layout.row(align=True)
@@ -20,12 +20,11 @@ import bpy
from . import ui, prop, operator
classes = (
operator.ExpandAllTasks,
operator.ContractAllTasks,
operator.AddAnimationCamera,
operator.AddSummaryTask,
operator.AddTask,
operator.AddTaskColumn,
operator.AddTaskBars,
operator.AddTaskColumn,
operator.AddTimePeriod,
operator.AddWorkCalendar,
operator.AddWorkPlan,
@@ -42,9 +41,12 @@ classes = (
operator.BlenderBIM_DatePickerSetDate,
operator.BlenderBIM_RedrawDatePicker,
operator.CalculateTaskDuration,
operator.ClearPreviousAnimation,
operator.ContractAllTasks,
operator.ContractTask,
operator.CopyTaskAttribute,
operator.CopyTask,
operator.CopyTaskAttribute,
operator.CreateBaseline,
operator.DisableEditingSequence,
operator.DisableEditingTask,
operator.DisableEditingTaskTime,
@@ -67,27 +69,29 @@ classes = (
operator.EnableEditingTaskCalendar,
operator.EnableEditingTaskSequence,
operator.EnableEditingTaskTime,
operator.EnableEditingWorkScheduleTasks,
operator.EnableEditingWorkCalendar,
operator.EnableEditingWorkCalendarTimes,
operator.EnableEditingWorkPlan,
operator.EnableEditingWorkPlanSchedules,
operator.EnableEditingWorkSchedule,
operator.EnableEditingWorkScheduleTasks,
operator.EnableEditingWorkTime,
operator.ExpandAllTasks,
operator.ExpandTask,
operator.ExportMSP,
operator.ExportP6,
operator.GenerateGanttChart,
operator.GuessDateRange,
operator.ImportMSP,
operator.GoToTask,
operator.ImportCSV,
operator.ImportMSP,
operator.ImportP6,
operator.ImportP6XER,
operator.ImportPP,
operator.LoadTaskInputs,
operator.LoadTaskOutputs,
operator.LoadAnimationColorScheme,
operator.LoadDefaultAnimationColors,
operator.LoadProductTasks,
operator.LoadTaskProperties,
operator.LoadTaskResources,
operator.RecalculateSchedule,
operator.RemoveTask,
operator.RemoveTaskCalendar,
@@ -98,10 +102,11 @@ classes = (
operator.RemoveWorkSchedule,
operator.RemoveWorkTime,
operator.ReorderTask,
operator.SelectTaskRelatedProducts,
operator.SaveAnimationColorScheme,
operator.SelectTaskRelatedInputs,
operator.SelectWorkScheduleProducts,
operator.SelectTaskRelatedProducts,
operator.SelectUnassignedWorkScheduleProducts,
operator.SelectWorkScheduleProducts,
operator.SetTaskSortColumn,
operator.SetupDefaultTaskColumns,
operator.UnassignLagTime,
@@ -113,17 +118,18 @@ classes = (
operator.UnassignWorkSchedule,
operator.VisualiseWorkScheduleDate,
operator.VisualiseWorkScheduleDateRange,
operator.LoadTaskAnimationColors,
operator.DisableEditingTaskAnimationColors,
operator.LoadProductTasks,
operator.HighlightTask,
operator.CreateBaseline,
operator.EnableStatusFilters,
operator.DisableStatusFilters,
operator.ActivateStatusFilters,
operator.SelectStatusFilter,
prop.WorkPlan,
prop.BIMWorkPlanProperties,
prop.Task,
prop.TaskResource,
prop.TaskProduct,
prop.ISODuration,
prop.IFCStatus,
prop.BIMStatusProperties,
prop.BIMWorkScheduleProperties,
prop.BIMTaskTreeProperties,
prop.BIMTaskTypeColor,
@@ -133,17 +139,19 @@ classes = (
prop.BIMWorkCalendarProperties,
prop.DatePickerProperties,
prop.BIMDateTextProperties,
ui.BIM_PT_status,
ui.BIM_PT_work_plans,
ui.BIM_PT_work_schedules,
ui.BIM_PT_work_calendars,
ui.BIM_PT_animation_tools,
ui.BIM_PT_task_icom,
ui.BIM_PT_animation_Color_Scheme,
ui.BIM_UL_task_columns,
ui.BIM_UL_task_inputs,
ui.BIM_UL_task_resources,
ui.BIM_UL_task_outputs,
ui.BIM_UL_tasks,
ui.BIM_PT_4D_Tools,
ui.BIM_PT_Task_Bar_Creator,
ui.BIM_UL_animation_colors,
ui.BIM_UL_product_input_tasks,
ui.BIM_UL_product_output_tasks,
@@ -164,6 +172,7 @@ def menu_func_import(self, context):
def register():
bpy.types.Scene.BIMStatusProperties = bpy.props.PointerProperty(type=prop.BIMStatusProperties)
bpy.types.Scene.BIMWorkPlanProperties = bpy.props.PointerProperty(type=prop.BIMWorkPlanProperties)
bpy.types.Scene.BIMWorkScheduleProperties = bpy.props.PointerProperty(type=prop.BIMWorkScheduleProperties)
bpy.types.Scene.BIMTaskTreeProperties = bpy.props.PointerProperty(type=prop.BIMTaskTreeProperties)
@@ -176,6 +185,7 @@ def register():
def unregister():
del bpy.types.Scene.BIMStatusProperties
del bpy.types.Scene.BIMWorkPlanProperties
del bpy.types.Scene.BIMWorkScheduleProperties
del bpy.types.Scene.BIMTaskTreeProperties
@@ -19,8 +19,8 @@
import bpy
import blenderbim.tool as tool
import ifcopenshell
from ifcopenshell.util.doc import get_predefined_type_doc
import ifcopenshell.util.date as dateutil
import json
def refresh():
@@ -28,6 +28,7 @@ def refresh():
WorkPlansData.is_loaded = False
TaskICOMData.is_loaded = False
WorkScheduleData.is_loaded = False
AnimationColorSchemeData.is_loaded = False
class SequenceData:
@@ -37,7 +38,6 @@ class SequenceData:
@classmethod
def load(cls):
cls.data = {
"predefined_types": cls.get_work_schedule_types(),
"has_work_plans": cls.has_work_plans(),
"has_work_schedules": cls.has_work_schedules(),
"has_work_calendars": cls.has_work_calendars(),
@@ -230,22 +230,6 @@ class SequenceData:
data["NestingIndex"] = rel.RelatedObjects.index(task)
cls.data["tasks"][task.id()] = data
@classmethod
def get_work_schedule_types(cls):
results = []
declaration = tool.Ifc().schema().declaration_by_name("IfcWorkSchedule")
version = tool.Ifc.get_schema()
for attribute in declaration.attributes():
if attribute.name() == "PredefinedType":
results.extend(
[
(e, e, get_predefined_type_doc(version, "IfcWorkSchedule", e))
for e in attribute.type_of_attribute().declared_type().enumeration_items()
]
)
break
return results
class WorkScheduleData:
data = {}
@@ -344,3 +328,31 @@ class TaskICOMData:
resource_id = resource_tprops.resources[resource_props.active_resource_index].ifc_definition_id
return not tool.Ifc.get().by_id(resource_id).is_a("IfcCrewResource")
return False
class AnimationColorSchemeData:
data = {}
is_loaded = False
@classmethod
def load(cls):
cls.is_loaded = True
cls.data = {}
cls.data["saved_color_schemes"] = cls.saved_color_schemes()
@classmethod
def saved_color_schemes(cls):
groups = tool.Ifc.get().by_type("IfcGroup")
results = []
for group in groups:
try:
data = json.loads(group.Description)
if (
isinstance(data, dict)
and data.get("type", None) == "BBIM_AnimationColorScheme"
and data.get("colourscheme", None)
):
results.append(group)
except:
pass
return [(str(g.id()), g.Name or "Unnamed", "") for g in sorted(results, key=lambda x: x.Name or "Unnamed")]
@@ -35,6 +35,7 @@ def parse_datetime(value):
def parse_duration(value):
return ifcopenshell.util.date.parse_duration(value)
def canonicalise_time(time):
if not time:
return "-"
@@ -27,11 +27,98 @@ import webbrowser
import blenderbim.core.sequence as core
import blenderbim.tool as tool
import blenderbim.bim.module.sequence.helper as helper
import ifcopenshell.util.sequence
import ifcopenshell.util.selector
from datetime import datetime
from dateutil import parser, relativedelta
from blenderbim.bim.ifc import IfcStore
from bpy_extras.io_utils import ImportHelper
import ifcopenshell.util.sequence
class EnableStatusFilters(bpy.types.Operator):
bl_idname = "bim.enable_status_filters"
bl_label = "Enable Status Filters"
def execute(self, context):
props = context.scene.BIMStatusProperties
props.is_enabled = True
props.statuses.clear()
statuses = set()
for element in tool.Ifc.get().by_type("IfcPropertyEnumeratedValue"):
if element.Name == "Status":
pset = element.PartOfPset[0]
if pset.Name.startswith("Pset_") and pset.Name.endswith("Common"):
statuses.update(element.EnumerationValues)
elif pset.Name == "EPset_Status": # Our secret sauce
statuses.update(element.EnumerationValues)
elif element.Name == "UserDefinedStatus":
statuses.add(element.NominalValue)
statuses = ["No Status"] + sorted([s.wrappedValue for s in statuses])
for status in statuses:
new = props.statuses.add()
new.name = status
return {"FINISHED"}
class DisableStatusFilters(bpy.types.Operator):
bl_idname = "bim.disable_status_filters"
bl_label = "Disable Status Filters"
def execute(self, context):
props = context.scene.BIMStatusProperties
props.is_enabled = False
return {"FINISHED"}
class ActivateStatusFilters(bpy.types.Operator):
bl_idname = "bim.activate_status_filters"
bl_label = "Activate Status Filters"
def execute(self, context):
props = context.scene.BIMStatusProperties
query = []
visible_statuses = {s.name for s in props.statuses if s.is_visible}
for name in visible_statuses:
if name == "No Status":
q = f"IfcProduct, /Pset_.*Common/.Status=NULL, EPset_Status.Status=NULL"
else:
q = f"IfcProduct, /Pset_.*Common/.Status={name} + IfcProduct, EPset_Status.Status={name}"
query.append(q)
query = " + ".join(query)
if not query:
return {"FINISHED"}
visible_elements = ifcopenshell.util.selector.filter_elements(tool.Ifc.get(), query)
for obj in bpy.context.view_layer.objects:
element = tool.Ifc.get_entity(obj)
if not element or not element.is_a("IfcProduct"):
continue
obj.hide_set(element not in visible_elements)
return {"FINISHED"}
class SelectStatusFilter(bpy.types.Operator):
bl_idname = "bim.select_status_filter"
bl_label = "Select Status Filter"
name: bpy.props.StringProperty()
def execute(self, context):
props = context.scene.BIMStatusProperties
query = f"IfcProduct, /Pset_.*Common/.Status={self.name} + IfcProduct, EPset_Status.Status={self.name}"
if self.name == "No Status":
query = f"IfcProduct, /Pset_.*Common/.Status=NULL, EPset_Status.Status=NULL"
for element in ifcopenshell.util.selector.filter_elements(tool.Ifc.get(), query):
obj = tool.Ifc.get_object(element)
if obj:
obj.select_set(True)
return {"FINISHED"}
class AddWorkPlan(bpy.types.Operator, tool.Ifc.Operator):
@@ -129,9 +216,21 @@ class AddWorkSchedule(bpy.types.Operator, tool.Ifc.Operator):
bl_idname = "bim.add_work_schedule"
bl_label = "Add Work Schedule"
bl_options = {"REGISTER", "UNDO"}
name: bpy.props.StringProperty()
def _execute(self, context):
core.add_work_schedule(tool.Ifc)
core.add_work_schedule(tool.Ifc, tool.Sequence, name=self.name)
def draw(self, context):
layout = self.layout
layout.prop(self, "name", text="Name")
self.props = context.scene.BIMWorkScheduleProperties
layout.prop(self.props, "work_schedule_predefined_types", text="Type")
if self.props.work_schedule_predefined_types == "USERDEFINED":
layout.prop(self.props, "object_type", text="Object type")
def invoke(self, context, event):
return context.window_manager.invoke_props_dialog(self)
class EditWorkSchedule(bpy.types.Operator, tool.Ifc.Operator):
@@ -874,7 +973,7 @@ class EnableEditingTaskSequence(bpy.types.Operator):
task: bpy.props.IntProperty()
def execute(self, context):
core.enable_editing_task_sequence(tool.Sequence, task=tool.Ifc.get().by_id(self.task))
core.enable_editing_task_sequence(tool.Sequence)
return {"FINISHED"}
@@ -1190,36 +1289,6 @@ class SetTaskSortColumn(bpy.types.Operator):
return {"FINISHED"}
class LoadTaskResources(bpy.types.Operator):
bl_idname = "bim.load_task_resources"
bl_label = "Load Task Resources"
bl_options = {"REGISTER", "UNDO"}
def execute(self, context):
core.load_task_resources(tool.Sequence)
return {"FINISHED"}
class LoadTaskInputs(bpy.types.Operator):
bl_idname = "bim.load_task_inputs"
bl_label = "Load Task Inputs"
bl_options = {"REGISTER", "UNDO"}
def execute(self, context):
core.load_task_inputs(tool.Sequence)
return {"FINISHED"}
class LoadTaskOutputs(bpy.types.Operator):
bl_idname = "bim.load_task_outputs"
bl_label = "Load Task Outputs"
bl_options = {"REGISTER", "UNDO"}
def execute(self, context):
core.load_task_outputs(tool.Sequence)
return {"FINISHED"}
class CalculateTaskDuration(bpy.types.Operator, tool.Ifc.Operator):
bl_idname = "bim.calculate_task_duration"
bl_label = "Calculate Task Duration"
@@ -1263,25 +1332,51 @@ class AddTaskBars(bpy.types.Operator):
return {"FINISHED"}
class LoadTaskAnimationColors(bpy.types.Operator):
bl_idname = "bim.enable_editing_task_animation_colors"
class LoadDefaultAnimationColors(bpy.types.Operator):
bl_idname = "bim.load_default_animation_color_scheme"
bl_label = "Load Animation Colors"
bl_options = {"REGISTER", "UNDO"}
def execute(self, context):
core.enable_editing_task_animation_colors(tool.Sequence)
core.load_default_animation_color_scheme(tool.Sequence)
return {"FINISHED"}
class DisableEditingTaskAnimationColors(bpy.types.Operator):
bl_idname = "bim.disable_editing_task_animation_colors"
bl_label = "Disable Editing Task Animation Colors"
class SaveAnimationColorScheme(bpy.types.Operator, tool.Ifc.Operator):
bl_idname = "bim.save_animation_color_scheme"
bl_label = "Save Animation Color Scheme"
bl_options = {"REGISTER", "UNDO"}
bl_description = "Saves the current animation color scheme"
name: bpy.props.StringProperty()
def execute(self, context):
core.disable_editing_task_animation_colors(tool.Sequence)
def _execute(self, context):
if not self.name:
return
core.save_animation_color_scheme(tool.Sequence, name=self.name)
return {"FINISHED"}
def invoke(self, context, event):
return context.window_manager.invoke_props_dialog(self)
class LoadAnimationColorScheme(bpy.types.Operator, tool.Ifc.Operator):
bl_idname = "bim.load_animation_color_scheme"
bl_label = "Load Animation Color Scheme"
bl_options = {"REGISTER", "UNDO"}
bl_description = "Loads the animation color scheme"
def _execute(self, context):
group = tool.Ifc.get().by_id(int(context.scene.BIMAnimationProperties.saved_color_schemes))
core.load_animation_color_scheme(tool.Sequence, scheme=group)
def draw(self, context):
props = context.scene.BIMAnimationProperties
row = self.layout.row()
row.prop(props, "saved_color_schemes", text="")
def invoke(self, context, event):
return context.window_manager.invoke_props_dialog(self)
class CopyTask(bpy.types.Operator, tool.Ifc.Operator):
bl_idname = "bim.duplicate_task"
@@ -1315,14 +1410,14 @@ class LoadProductTasks(bpy.types.Operator):
return {"FINISHED"}
class HighlightTask(bpy.types.Operator):
bl_idname = "bim.highlight_task"
class GoToTask(bpy.types.Operator):
bl_idname = "bim.go_to_task"
bl_label = "Highlight Task"
bl_options = {"REGISTER", "UNDO"}
task: bpy.props.IntProperty()
def execute(self, context):
r = core.highlight_task(tool.Sequence, task=tool.Ifc.get().by_id(self.task))
r = core.go_to_task(tool.Sequence, task=tool.Ifc.get().by_id(self.task))
if isinstance(r, str):
self.report({"WARNING"}, r)
return {"FINISHED"}
@@ -1389,3 +1484,22 @@ class CreateBaseline(bpy.types.Operator, tool.Ifc.Operator):
def invoke(self, context, event):
return context.window_manager.invoke_props_dialog(self)
class ClearPreviousAnimation(bpy.types.Operator, tool.Ifc.Operator):
bl_idname = "bim.clear_previous_animation"
bl_label = "Clear Previous Animation"
bl_options = {"REGISTER", "UNDO"}
def _execute(self, context):
core.clear_previous_animation(tool.Sequence)
class AddAnimationCamera(bpy.types.Operator):
bl_idname = "bim.add_animation_camera"
bl_label = "Add Camera to Scene"
bl_options = {"REGISTER", "UNDO"}
def execute(self, context):
core.add_animation_camera(tool.Sequence)
return {"FINISHED"}
@@ -20,10 +20,12 @@ import bpy
import isodate
import ifcopenshell.api
import ifcopenshell.util.attribute
from ifcopenshell.util.doc import get_predefined_type_doc
import blenderbim.tool as tool
import blenderbim.core.sequence as core
from blenderbim.bim.ifc import IfcStore
from blenderbim.bim.module.sequence.data import SequenceData
from blenderbim.bim.module.sequence.data import SequenceData, AnimationColorSchemeData, refresh as refresh_sequence_data
import blenderbim.bim.module.resource.data
import blenderbim.bim.module.pset.data
from blenderbim.bim.prop import StrProperty, Attribute
from dateutil import parser
@@ -87,22 +89,30 @@ def getWorkCalendars(self, context):
def update_active_task_index(self, context):
bpy.ops.bim.load_task_inputs()
bpy.ops.bim.load_task_resources()
bpy.ops.bim.load_task_outputs()
task = tool.Sequence.get_highlighted_task()
self.highlighted_task_id = task.id() if task else 0
tool.Sequence.update_task_ICOM(task)
blenderbim.bim.module.pset.data.refresh()
if self.editing_task_type == "SEQUENCE":
tool.Sequence.load_task_properties()
def update_active_task_outputs(self, context):
bpy.ops.bim.load_task_outputs()
task = tool.Sequence.get_highlighted_task()
outputs = tool.Sequence.get_task_outputs(task)
tool.Sequence.load_task_outputs(outputs)
def update_active_task_resources(self, context):
bpy.ops.bim.load_task_resources()
task = tool.Sequence.get_highlighted_task()
resources = tool.Sequence.get_task_resources(task)
tool.Sequence.load_task_resources(resources)
def update_active_task_inputs(self, context):
bpy.ops.bim.load_task_inputs()
task = tool.Sequence.get_highlighted_task()
inputs = tool.Sequence.get_task_inputs(task)
tool.Sequence.load_task_inputs(inputs)
def updateTaskName(self, context):
@@ -208,25 +218,33 @@ def updateTaskDuration(self, context):
self.duration = "-"
return
self.file = tool.Ifc.get()
task = self.file.by_id(self.ifc_definition_id)
task = tool.Ifc.get().by_id(self.ifc_definition_id)
if task.TaskTime:
task_time = task.TaskTime
else:
task_time = ifcopenshell.api.run("sequence.add_task_time", self.file, task=task)
ifcopenshell.api.run(
"sequence.edit_task_time",
self.file,
**{"task_time": task_time, "attributes": {"ScheduleDuration": duration}},
)
task_time = tool.Ifc.run("sequence.add_task_time", task=task)
tool.Ifc.run("sequence.edit_task_time", task_time=task_time, attributes={"ScheduleDuration": duration})
SequenceData.load()
blenderbim.core.sequence.load_task_properties(tool.Sequence)
bpy.ops.bim.load_task_properties()
tool.Sequence.load_resources()
def get_schedule_predefined_types(self, context):
if not SequenceData.is_loaded:
SequenceData.load()
return SequenceData.data["predefined_types"]
results = []
declaration = tool.Ifc().schema().declaration_by_name("IfcWorkSchedule")
version = tool.Ifc.get_schema()
for attribute in declaration.attributes():
if attribute.name() == "PredefinedType":
results.extend(
[
(e, e, get_predefined_type_doc(version, "IfcWorkSchedule", e))
for e in attribute.type_of_attribute().declared_type().enumeration_items()
if e != "BASELINE"
]
)
break
return results
def update_visualisation_start(self, context):
@@ -286,12 +304,49 @@ def update_sort_reversed(self, context):
work_schedule=tool.Ifc.get().by_id(context.scene.BIMWorkScheduleProperties.active_work_schedule_id),
)
def update_filter_by_active_schedule(self, context):
if context.active_object:
core.load_product_related_tasks(
tool.Sequence, product=tool.Ifc.get().by_id(context.active_object.BIMObjectProperties.ifc_definition_id)
)
def switch_options(self, context):
if self.should_show_visualisation_ui:
self.should_show_snapshot_ui = False
def switch_options2(self, context):
if self.should_show_snapshot_ui:
self.should_show_visualisation_ui = False
def get_saved_color_schemes(self, context):
if not AnimationColorSchemeData.is_loaded:
AnimationColorSchemeData.load()
return AnimationColorSchemeData.data["saved_color_schemes"]
def updateAssignedResourceName(self, context):
pass
def updateAssignedResourceUsage(self, context):
if not self.schedule_usage:
return
resource = tool.Ifc.get().by_id(self.ifc_definition_id)
if resource.Usage and resource.Usage.ScheduleUsage == self.schedule_usage:
return
tool.Resource.run_edit_resource_time(resource, attributes={
"ScheduleUsage": self.schedule_usage
})
tool.Sequence.load_task_properties()
tool.Resource.load_resource_properties()
tool.Sequence.refresh_task_resources()
blenderbim.bim.module.resource.data.refresh()
blenderbim.bim.module.sequence.data.refresh()
blenderbim.bim.module.pset.data.refresh()
class Task(PropertyGroup):
name: StringProperty(name="Name", update=updateTaskName)
identification: StringProperty(name="Identification", update=updateTaskIdentification)
@@ -319,9 +374,9 @@ class WorkPlan(PropertyGroup):
class TaskResource(PropertyGroup):
name: StringProperty(name="Name")
name: StringProperty(name="Name", update=updateAssignedResourceName)
ifc_definition_id: IntProperty(name="IFC Definition ID")
schedule_usage: FloatProperty(name="Schedule Usage")
schedule_usage: FloatProperty(name="Schedule Usage", update=updateAssignedResourceUsage)
class TaskProduct(PropertyGroup):
@@ -348,10 +403,21 @@ class ISODuration(PropertyGroup):
seconds: IntProperty(name="Seconds", default=0)
class IFCStatus(PropertyGroup):
name: StringProperty(name="Name")
is_visible: BoolProperty(name="Is Visible", default=True)
class BIMStatusProperties(PropertyGroup):
is_enabled: BoolProperty(name="Is Enabled")
statuses: CollectionProperty(name="Statuses", type=IFCStatus)
class BIMWorkScheduleProperties(PropertyGroup):
work_schedule_predefined_types: EnumProperty(
items=get_schedule_predefined_types, name="Predefined Type", default=None
)
object_type: StringProperty(name="Object Type")
durations_attributes: CollectionProperty(name="Durations Attributes", type=ISODuration)
work_calendars: EnumProperty(items=getWorkCalendars, name="Work Calendars")
work_schedule_attributes: CollectionProperty(name="Work Schedule Attributes", type=Attribute)
@@ -361,10 +427,11 @@ class BIMWorkScheduleProperties(PropertyGroup):
active_work_schedule_id: IntProperty(name="Active Work Schedules Id")
active_task_index: IntProperty(name="Active Task Index", update=update_active_task_index)
active_task_id: IntProperty(name="Active Task Id")
highlighted_task_id: IntProperty(name="Highlited Task Id")
task_attributes: CollectionProperty(name="Task Attributes", type=Attribute)
should_show_visualisation_ui: BoolProperty(name="Should Show Visualisation UI", default=False)
should_show_visualisation_ui: BoolProperty(name="Should Show Visualisation UI", default=True, update=switch_options)
should_show_task_bar_selection: BoolProperty(name="Add to task bar", default=False)
should_show_snapshot_ui: BoolProperty(name="Should Show Snapshot UI", default=False)
should_show_snapshot_ui: BoolProperty(name="Should Show Snapshot UI", default=False, update=switch_options2)
should_show_column_ui: BoolProperty(name="Should Show Column UI", default=False)
columns: CollectionProperty(name="Columns", type=Attribute)
active_column_index: IntProperty(name="Active Column Index")
@@ -397,9 +464,9 @@ class BIMWorkScheduleProperties(PropertyGroup):
visualisation_start: StringProperty(name="Visualisation Start", update=update_visualisation_start)
visualisation_finish: StringProperty(name="Visualisation Finish", update=update_visualisation_finish)
speed_multiplier: FloatProperty(name="Speed Multiplier", default=10000)
speed_animation_duration: StringProperty(name="Speed Animation Duration", default="PT1S")
speed_animation_duration: StringProperty(name="Speed Animation Duration", default="1 s")
speed_animation_frames: IntProperty(name="Speed Animation Frames", default=24)
speed_real_duration: StringProperty(name="Speed Real Duration", default="P1W")
speed_real_duration: StringProperty(name="Speed Real Duration", default="1 w")
speed_types: EnumProperty(
items=[
("FRAME_SPEED", "Frame-based", "e.g. 25 frames = 1 real week"),
@@ -425,7 +492,9 @@ class BIMWorkScheduleProperties(PropertyGroup):
enable_reorder: BoolProperty(name="Enable Reorder", default=False)
show_task_operators: BoolProperty(name="Show Task Options", default=True)
should_show_schedule_baseline_ui: BoolProperty(name="Baselines", default=False)
filter_by_active_schedule: BoolProperty(name="Filter By Active Schedule", default=False, update = update_filter_by_active_schedule)
filter_by_active_schedule: BoolProperty(
name="Filter By Active Schedule", default=False, update=update_filter_by_active_schedule
)
class BIMTaskTreeProperties(PropertyGroup):
@@ -495,16 +564,16 @@ class BIMTaskTypeColor(PropertyGroup):
default=(1, 0, 0),
min=0.0,
max=1.0,
# update=update_task_animation_color,
)
class BIMAnimationProperties(PropertyGroup):
is_editing: BoolProperty(name="Is Loaded", default=False)
saved_color_schemes: EnumProperty(items=get_saved_color_schemes, name="Saved Colour Schemes")
active_color_component_outputs_index: IntProperty(name="Active Color Component Index")
active_color_component_inputs_index: IntProperty(name="Active Color Component Index")
task_colors_components_inputs: CollectionProperty(name="Groups", type=BIMTaskTypeColor)
task_colors_components_outputs: CollectionProperty(name="Groups", type=BIMTaskTypeColor)
task_input_colors: CollectionProperty(name="Groups", type=BIMTaskTypeColor)
task_output_colors: CollectionProperty(name="Groups", type=BIMTaskTypeColor)
color_full: FloatVectorProperty(
name="Full Bar",
subtype="COLOR",
@@ -21,8 +21,45 @@ import blenderbim.bim.helper
from bpy.types import Panel, UIList
from blenderbim.bim.ifc import IfcStore
from blenderbim.bim.helper import draw_attributes
from blenderbim.bim.module.sequence.data import WorkPlansData, WorkScheduleData, SequenceData, TaskICOMData
import blenderbim.tool as tool
from blenderbim.bim.module.sequence.data import (
WorkPlansData,
WorkScheduleData,
SequenceData,
TaskICOMData,
AnimationColorSchemeData,
)
class BIM_PT_status(Panel):
bl_label = "Status"
bl_idname = "BIM_PT_status"
bl_space_type = "PROPERTIES"
bl_region_type = "WINDOW"
bl_context = "scene"
bl_parent_id = "BIM_PT_tab_status"
bl_options = {"HIDE_HEADER"}
@classmethod
def poll(cls, context):
return IfcStore.get_file()
def draw(self, context):
self.props = context.scene.BIMStatusProperties
if not self.props.is_enabled:
row = self.layout.row()
row.operator("bim.enable_status_filters", icon="GREASEPENCIL")
return
row = self.layout.row(align=True)
row.operator("bim.activate_status_filters", icon="TIME")
row.operator("bim.disable_status_filters", icon="CANCEL", text="")
for status in self.props.statuses:
row = self.layout.row()
row.label(text=status.name)
row.prop(status, "is_visible", text="", emboss=False, icon="HIDE_OFF" if status.is_visible else "HIDE_ON")
row.operator("bim.select_status_filter", icon="RESTRICT_SELECT_OFF", text="").name = status.name
class BIM_PT_work_plans(Panel):
@@ -32,10 +69,12 @@ class BIM_PT_work_plans(Panel):
bl_space_type = "PROPERTIES"
bl_region_type = "WINDOW"
bl_context = "scene"
bl_parent_id = "BIM_PT_tab_sequence"
@classmethod
def poll(cls, context):
return tool.Blender.is_tab(context, "SCHEDULING") and tool.Ifc.get() and tool.Ifc.get().schema != "IFC2X3"
file = IfcStore.get_file()
return file and file.schema != "IFC2X3"
def draw(self, context):
if not WorkPlansData.is_loaded:
@@ -54,11 +93,10 @@ class BIM_PT_work_plans(Panel):
def draw_work_plan_ui(self, work_plan):
row = self.layout.row(align=True)
row.label(text=work_plan["name"], icon="TEXT")
if self.props.active_work_plan_id == work_plan["id"]:
if self.props.editing_type == "ATTRIBUTES":
row.operator("bim.edit_work_plan", text="", icon="CHECKMARK")
row.operator("bim.disable_editing_work_plan", text="", icon="CANCEL")
row.operator("bim.disable_editing_work_plan", text="Cancel", icon="CANCEL")
elif self.props.active_work_plan_id:
row.operator("bim.remove_work_plan", text="", icon="X").work_plan = work_plan["id"]
else:
@@ -101,10 +139,12 @@ class BIM_PT_work_schedules(Panel):
bl_space_type = "PROPERTIES"
bl_region_type = "WINDOW"
bl_context = "scene"
bl_parent_id = "BIM_PT_tab_sequence"
@classmethod
def poll(cls, context):
return tool.Blender.is_tab(context, "SCHEDULING") and tool.Ifc.get() and tool.Ifc.get().schema != "IFC2X3"
file = IfcStore.get_file()
return file and hasattr(file, "schema") and file.schema != "IFC2X3"
def draw(self, context):
if not SequenceData.is_loaded:
@@ -113,10 +153,9 @@ class BIM_PT_work_schedules(Panel):
WorkScheduleData.load()
self.props = context.scene.BIMWorkScheduleProperties
self.tprops = context.scene.BIMTaskTreeProperties
self.animation_props = context.scene.BIMAnimationProperties
if not self.props.active_work_schedule_id:
row = self.layout.row()
row = self.layout.row(align=True)
if SequenceData.data["has_work_schedules"]:
row.label(
text="{} Work Schedules Found".format(SequenceData.data["number_of_work_schedules_loaded"]),
@@ -124,25 +163,25 @@ class BIM_PT_work_schedules(Panel):
)
else:
row.label(text="No Work Schedules found.", icon="TEXT")
row = self.layout.row(align=True)
row.alignment = "RIGHT"
row.prop(self.props, "work_schedule_predefined_types")
row.operator("bim.add_work_schedule", text="Add", icon="ADD")
row.operator("bim.add_work_schedule", text="", icon="ADD")
for work_schedule_id, work_schedule in SequenceData.data["work_schedules"].items():
self.draw_work_schedule_ui(work_schedule_id, work_schedule)
def draw_work_schedule_ui(self, work_schedule_id, work_schedule):
if not work_schedule["PredefinedType"] == "BASELINE":
if work_schedule["PredefinedType"] == "BASELINE":
self.draw_readonly_work_schedule_ui(work_schedule_id)
else:
row = self.layout.row(align=True)
row.label(text=work_schedule["Name"] or "Unnamed", icon="LINENUMBERS_ON")
if self.props.active_work_schedule_id == work_schedule_id:
row.label(
text="Currently editing: {}[{}]".format(work_schedule["Name"], work_schedule["PredefinedType"]),
icon="LINENUMBERS_ON",
)
if self.props.editing_type == "WORK_SCHEDULE":
row.operator("bim.edit_work_schedule", text="", icon="CHECKMARK")
row.operator("bim.edit_work_schedule", text="Apply", icon="CHECKMARK")
elif self.props.editing_type == "TASKS":
grid = self.layout.grid_flow(columns=2, even_columns=True)
col = grid.column()
row1 = col.row(align=True)
row1.alignment = "LEFT"
@@ -177,33 +216,30 @@ class BIM_PT_work_schedules(Panel):
row1.alignment = "RIGHT"
row1.prop(self.props, "should_show_column_ui", text="Schedule Columns", icon="SHORTDISPLAY")
row2 = col.row(align=True)
row2.prop(
self.props, "should_show_visualisation_ui", text="Animation Options", icon="CAMERA_STEREO"
)
row2.prop(self.props, "should_show_snapshot_ui", text="Snapshot Options", icon="CAMERA_STEREO")
row.operator("bim.disable_editing_work_schedule", text="Disable editing", icon="CANCEL")
else:
row.operator("bim.disable_editing_work_schedule", text="Cancel", icon="CANCEL")
if not self.props.active_work_schedule_id:
grid = self.layout.grid_flow(columns=2, even_columns=True)
col1 = grid.column()
col1.label(
text="{}[{}]".format(work_schedule["Name"], work_schedule["PredefinedType"]) or "Unnamed",
icon="LINENUMBERS_ON",
)
col2 = grid.column()
row = col2.row(align=True)
row.operator(
"bim.enable_editing_work_schedule_tasks", text="", icon="ACTION"
"bim.enable_editing_work_schedule_tasks", text="Tasks", icon="ACTION"
).work_schedule = work_schedule_id
row.operator(
"bim.enable_editing_work_schedule", text="", icon="GREASEPENCIL"
"bim.enable_editing_work_schedule", text="Attributes", icon="GREASEPENCIL"
).work_schedule = work_schedule_id
row.operator("bim.remove_work_schedule", text="", icon="X").work_schedule = work_schedule_id
row.operator("bim.remove_work_schedule", text="Delete", icon="X").work_schedule = work_schedule_id
if self.props.active_work_schedule_id == work_schedule_id:
if self.props.editing_type == "WORK_SCHEDULE":
self.draw_editable_work_schedule_ui()
elif self.props.editing_type == "TASKS":
self.draw_baseline_ui(work_schedule_id)
self.draw_column_ui()
if self.props.should_show_visualisation_ui:
self.draw_visualisation_ui()
if self.props.should_show_snapshot_ui:
self.draw_snapshot_ui()
self.draw_editable_task_ui(work_schedule_id)
else:
self.draw_readonly_work_schedule_ui(work_schedule_id)
def draw_task_operators(self):
row = self.layout.row(align=True)
@@ -218,7 +254,9 @@ class BIM_PT_work_schedules(Panel):
row.operator("bim.edit_task_time", text="", icon="CHECKMARK")
elif self.props.editing_task_type == "ATTRIBUTES":
row.operator("bim.edit_task", text="", icon="CHECKMARK")
row.operator("bim.disable_editing_task", text="", icon="CANCEL")
row.operator("bim.disable_editing_task", text="Cancel", icon="CANCEL")
elif self.props.editing_task_type == "SEQUENCE":
row.operator("bim.disable_editing_task", text="Cancel", icon="CANCEL")
else:
row.prop(self.props, "show_task_operators", text="Edit", icon="GREASEPENCIL")
if self.props.show_task_operators:
@@ -226,7 +264,7 @@ class BIM_PT_work_schedules(Panel):
row2.alignment = "RIGHT"
row2.prop(self.props, "enable_reorder", text="", icon="SORTALPHA")
row2.operator("bim.enable_editing_task_sequence", text="", icon="TRACKING").task = ifc_definition_id
row2.operator("bim.enable_editing_task_sequence", text="", icon="TRACKING")
row2.operator("bim.enable_editing_task_time", text="", icon="TIME").task = ifc_definition_id
row2.operator(
"bim.enable_editing_task_calendar", text="", icon="VIEW_ORTHO"
@@ -242,7 +280,7 @@ class BIM_PT_work_schedules(Panel):
if not self.props.should_show_column_ui:
return
row = self.layout.row()
row.operator("bim.setup_default_task_columns", text="Add Default Columns", icon="ANCHOR_BOTTOM")
row.operator("bim.setup_default_task_columns", text="Setup Default Columns", icon="ANCHOR_BOTTOM")
row.alignment = "RIGHT"
row = self.layout.row(align=True)
row.prop(self.props, "column_types", text="")
@@ -268,103 +306,6 @@ class BIM_PT_work_schedules(Panel):
self.layout.template_list("BIM_UL_task_columns", "", self.props, "columns", self.props, "active_column_index")
def draw_visualisation_ui(self):
row = self.layout.row(align=True)
row.label(text="Start Date/ Date Range:")
row = self.layout.row(align=True)
op = row.operator("bim.datepicker", text=self.props.visualisation_start or "Start Date", icon="REW")
op.target_prop = "BIMWorkScheduleProperties.visualisation_start"
op = row.operator("bim.datepicker", text=self.props.visualisation_finish or "Finish Date", icon="FF")
op.target_prop = "BIMWorkScheduleProperties.visualisation_finish"
op = row.operator("bim.guess_date_range", text="Guess", icon="FILE_REFRESH")
op.work_schedule = self.props.active_work_schedule_id
row = self.layout.row(align=True)
row.label(text="Speed Settings")
row = self.layout.row(align=True)
row.prop(self.props, "speed_types", text="")
if self.props.speed_types == "FRAME_SPEED":
row.prop(self.props, "speed_animation_frames", text="")
row.prop(self.props, "speed_real_duration", text="")
elif self.props.speed_types == "DURATION_SPEED":
row.prop(self.props, "speed_animation_duration", text="")
row.prop(self.props, "speed_real_duration", text="")
elif self.props.speed_types == "MULTIPLIER_SPEED":
row.prop(self.props, "speed_multiplier", text="")
row = self.layout.row(align=True)
row.label(text="Display Settings")
row = self.layout.row(align=True)
if not self.animation_props.is_editing:
op = row.operator(
"bim.enable_editing_task_animation_colors", text="Customize Object Colors", icon="SEQUENCE_COLOR_04"
)
else:
op = row.operator(
"bim.disable_editing_task_animation_colors", text="Hide Object Colors", icon="SEQUENCE_COLOR_01"
)
row.prop(self.animation_props, "should_show_task_bar_options", text="Task Bar", icon="NLA_PUSHDOWN")
if self.animation_props.should_show_task_bar_options:
row = self.layout.row()
row.label(text="Task Bar Options", icon="NLA_PUSHDOWN")
row.alignment = "LEFT"
row = self.layout.row(align=True)
row.prop(self.props, "should_show_task_bar_selection", text="Enable Selection", icon="NLA_PUSHDOWN")
row.operator("bim.add_task_bars", text="Generate bars", icon="NLA_PUSHDOWN")
grid = self.layout.grid_flow(columns=2, even_columns=True)
# Column1
col = grid.column()
row = col.row(align=True)
row.prop(self.animation_props, "color_progress")
row = col.row(align=True)
row.prop(self.animation_props, "color_full")
if self.animation_props.is_editing:
self.draw_visualisation_settings_ui()
row = self.layout.row(align=True)
op = row.operator("bim.visualise_work_schedule_date_range", text="Create Animation", icon="OUTLINER_OB_CAMERA")
op.work_schedule = self.props.active_work_schedule_id
def draw_snapshot_ui(self):
row = self.layout.row(align=True)
row.label(text="Create Construction Snapshot:")
row = self.layout.row(align=True)
op = row.operator("bim.datepicker", text=self.props.visualisation_start or "Date", icon="REW")
op.target_prop = "BIMWorkScheduleProperties.visualisation_start"
op = row.operator("bim.visualise_work_schedule_date", text="Create SnapShot", icon="RESTRICT_RENDER_OFF")
op.work_schedule = self.props.active_work_schedule_id
def draw_visualisation_settings_ui(self):
grid = self.layout.grid_flow(columns=2, even_columns=True)
col = grid.column()
row1 = col.row(align=True)
row1.label(text="INPUT COLORS", icon="COLLECTION_COLOR_01")
row1 = col.row()
row1.template_list(
"BIM_UL_animation_colors",
"",
self.animation_props,
"task_colors_components_inputs",
self.animation_props,
"active_color_component_inputs_index",
)
col = grid.column()
row1 = col.row(align=True)
row1.label(text="OUTPUT COLORS", icon="COLLECTION_COLOR_04")
row1 = col.row()
row1.template_list(
"BIM_UL_animation_colors",
"",
self.animation_props,
"task_colors_components_outputs",
self.animation_props,
"active_color_component_outputs_index",
)
def draw_editable_work_schedule_ui(self):
draw_attributes(self.props.work_schedule_attributes, self.layout)
@@ -390,13 +331,13 @@ class BIM_PT_work_schedules(Panel):
self.draw_editable_task_attributes_ui()
elif self.props.active_task_id and self.props.editing_task_type == "CALENDAR":
self.draw_editable_task_calendar_ui()
elif self.props.active_task_id and self.props.editing_task_type == "SEQUENCE":
elif self.props.highlighted_task_id and self.props.editing_task_type == "SEQUENCE":
self.draw_editable_task_sequence_ui()
elif self.props.active_task_time_id and self.props.editing_task_type == "TASKTIME":
self.draw_editable_task_time_attributes_ui()
def draw_editable_task_sequence_ui(self):
task = SequenceData.data["tasks"][self.props.active_task_id]
task = SequenceData.data["tasks"][self.props.highlighted_task_id]
row = self.layout.row()
row.label(text="{} Predecessors".format(len(task["IsSuccessorFrom"])), icon="BACK")
for sequence_id in task["IsSuccessorFrom"]:
@@ -410,6 +351,7 @@ class BIM_PT_work_schedules(Panel):
def draw_editable_sequence_ui(self, sequence, process_type):
task = SequenceData.data["tasks"][sequence[process_type]]
row = self.layout.row(align=True)
row.operator("bim.go_to_task", text="", icon="RESTRICT_SELECT_OFF").task = task["id"]
row.label(text=task["Identification"] or "XXX")
row.label(text=task["Name"] or "Unnamed")
row.label(text=sequence["SequenceType"] or "N/A")
@@ -421,12 +363,12 @@ class BIM_PT_work_schedules(Panel):
if self.props.active_sequence_id == sequence["id"]:
if self.props.editing_sequence_type == "ATTRIBUTES":
row.operator("bim.edit_sequence_attributes", text="", icon="CHECKMARK")
row.operator("bim.disable_editing_sequence", text="", icon="CANCEL")
row.operator("bim.disable_editing_sequence", text="Cancel", icon="CANCEL")
self.draw_editable_sequence_attributes_ui()
elif self.props.editing_sequence_type == "LAG_TIME":
op = row.operator("bim.edit_sequence_lag_time", text="", icon="CHECKMARK")
op.lag_time = sequence["TimeLag"]
row.operator("bim.disable_editing_sequence", text="", icon="CANCEL")
row.operator("bim.disable_editing_sequence", text="Cancel", icon="CANCEL")
self.draw_editable_sequence_lag_time_ui()
else:
if sequence["TimeLag"]:
@@ -491,7 +433,7 @@ class BIM_PT_work_schedules(Panel):
"id"
]
baseline_row.operator(
"bim.enable_editing_work_schedule_tasks", text="", icon="ACTION"
"bim.enable_editing_work_schedule_tasks", text="Display Schedule", icon="ACTION"
).work_schedule = baseline["id"]
baseline_row.operator("bim.remove_work_schedule", text="", icon="X").work_schedule = baseline["id"]
@@ -521,6 +463,172 @@ class BIM_PT_work_schedules(Panel):
)
class BIM_PT_animation_tools(Panel):
bl_label = "Animation Tools"
bl_idname = "BIM_PT_animation_tools"
bl_options = {"DEFAULT_CLOSED"}
bl_space_type = "PROPERTIES"
bl_region_type = "WINDOW"
bl_context = "scene"
bl_parent_id = "BIM_PT_work_schedules"
bl_order = 4
@classmethod
def poll(cls, context):
props = context.scene.BIMWorkScheduleProperties
if props.active_work_schedule_id:
return True
return False
def draw(self, context):
self.props = context.scene.BIMWorkScheduleProperties
self.animation_props = context.scene.BIMAnimationProperties
row = self.layout.row(align=True)
row.alignment = "RIGHT"
row.prop(self.props, "should_show_visualisation_ui", text="Animation Settings", icon="SETTINGS")
row.prop(self.props, "should_show_snapshot_ui", text="Snapshot Settings", icon="SETTINGS")
if self.props.should_show_visualisation_ui:
self.draw_visualisation_ui()
if self.props.should_show_snapshot_ui:
self.draw_snapshot_ui()
self.draw_processing_options()
def draw_processing_options(self):
row = self.layout.row(align=True)
row.alignment = "LEFT"
row.label(text="Processing Tools")
row = self.layout.row()
row.alignment = "RIGHT"
row.operator("bim.add_animation_camera", text="Add Camera", icon="CAMERA_DATA")
row.operator("bim.clear_previous_animation", text="Reset Animation", icon="TRACKING_CLEAR_FORWARDS")
def draw_visualisation_ui(self):
if not AnimationColorSchemeData.is_loaded:
AnimationColorSchemeData.load()
row = self.layout.row(align=True)
row.label(text="Start Date/ Date Range:", icon="CAMERA_DATA")
row = self.layout.row(align=True)
row.alignment = "RIGHT"
op = row.operator("bim.datepicker", text=self.props.visualisation_start or "Start Date", icon="REW")
op.target_prop = "BIMWorkScheduleProperties.visualisation_start"
op = row.operator("bim.datepicker", text=self.props.visualisation_finish or "Finish Date", icon="FF")
op.target_prop = "BIMWorkScheduleProperties.visualisation_finish"
op = row.operator("bim.guess_date_range", text="Guess", icon="FILE_REFRESH")
op.work_schedule = self.props.active_work_schedule_id
row = self.layout.row(align=True)
row.label(text="Speed Settings")
row = self.layout.row(align=True)
row.alignment = "RIGHT"
row.prop(self.props, "speed_types", text="")
if self.props.speed_types == "FRAME_SPEED":
row.prop(self.props, "speed_animation_frames", text="")
row.prop(self.props, "speed_real_duration", text="")
elif self.props.speed_types == "DURATION_SPEED":
row.prop(self.props, "speed_animation_duration", text="")
row.label(text="->")
row.prop(self.props, "speed_real_duration", text="")
elif self.props.speed_types == "MULTIPLIER_SPEED":
row.prop(self.props, "speed_multiplier", text="")
row = self.layout.row(align=True)
row.label(text="Display Settings")
row = self.layout.row()
row.alignment = "RIGHT"
row.prop(self.animation_props, "should_show_task_bar_options", text="Task Bars", icon="NLA_PUSHDOWN")
if self.animation_props.should_show_task_bar_options:
row = self.layout.row()
row.label(text="Task Bar Options", icon="NLA_PUSHDOWN")
row.alignment = "LEFT"
row = self.layout.row(align=True)
row.prop(self.props, "should_show_task_bar_selection", text="Enable Selection", icon="NLA_PUSHDOWN")
row.operator("bim.add_task_bars", text="Generate bars", icon="NLA_PUSHDOWN")
grid = self.layout.grid_flow(columns=2, even_columns=True)
# Column1
col = grid.column()
row = col.row(align=True)
row.prop(self.animation_props, "color_progress")
row = col.row(align=True)
row.prop(self.animation_props, "color_full")
row = self.layout.row(align=True)
row.alignment = "RIGHT"
if self.animation_props.saved_color_schemes:
row.prop(self.animation_props, "saved_color_schemes", text="Color Scheme", icon="SEQUENCE_COLOR_04")
else:
row.label(text="No Color Scheme Saved", icon="INFO")
op = row.operator("bim.visualise_work_schedule_date_range", text="Create Animation", icon="OUTLINER_OB_CAMERA")
op.work_schedule = self.props.active_work_schedule_id
def draw_snapshot_ui(self):
row = self.layout.row(align=True)
row.label(text="Date of Snapshot:", icon="CAMERA_STEREO")
row = self.layout.row(align=True)
row.alignment = "RIGHT"
op = row.operator("bim.datepicker", text=self.props.visualisation_start or "Date", icon="PROP_PROJECTED")
op.target_prop = "BIMWorkScheduleProperties.visualisation_start"
row = self.layout.row(align=True)
row.alignment = "RIGHT"
op = row.operator("bim.visualise_work_schedule_date", text="Create SnapShot", icon="CAMERA_STEREO")
op.work_schedule = self.props.active_work_schedule_id
class BIM_PT_animation_Color_Scheme(Panel):
bl_label = "Animation Color Scheme"
bl_idname = "BIM_PT_animation_Color_Scheme"
bl_options = {"DEFAULT_CLOSED"}
bl_space_type = "PROPERTIES"
bl_region_type = "WINDOW"
bl_context = "scene"
bl_parent_id = "BIM_PT_tab_sequence"
@classmethod
def poll(cls, context):
file = IfcStore.get_file()
return file and hasattr(file, "schema") and file.schema != "IFC2X3"
def draw(self, context):
if not AnimationColorSchemeData.is_loaded:
AnimationColorSchemeData.load()
self.animation_props = context.scene.BIMAnimationProperties
row = self.layout.row(align=True)
row.alignment = "RIGHT"
row.operator("bim.load_default_animation_color_scheme", text="Load default", icon="SEQUENCE_COLOR_04")
if AnimationColorSchemeData.data["saved_color_schemes"]:
row.operator("bim.load_animation_color_scheme", text="Load Scheme", icon="IMPORT")
row.operator("bim.save_animation_color_scheme", text="Save Scheme", icon="EXPORT")
grid = self.layout.grid_flow(columns=2, even_columns=True)
col = grid.column()
row1 = col.row(align=True)
row1.label(text="INPUT COLORS", icon="COLLECTION_COLOR_01")
row1 = col.row()
row1.template_list(
"BIM_UL_animation_colors",
"",
self.animation_props,
"task_input_colors",
self.animation_props,
"active_color_component_inputs_index",
)
col = grid.column()
row1 = col.row(align=True)
row1.label(text="OUTPUT COLORS", icon="COLLECTION_COLOR_04")
row1 = col.row()
row1.template_list(
"BIM_UL_animation_colors",
"",
self.animation_props,
"task_output_colors",
self.animation_props,
"active_color_component_outputs_index",
)
class BIM_PT_task_icom(Panel):
bl_label = "Task ICOM"
bl_idname = "BIM_PT_task_icom"
@@ -529,6 +637,7 @@ class BIM_PT_task_icom(Panel):
bl_region_type = "WINDOW"
bl_context = "scene"
bl_parent_id = "BIM_PT_work_schedules"
bl_order = 1
@classmethod
def poll(cls, context):
@@ -657,9 +766,9 @@ class BIM_UL_task_resources(UIList):
def draw_item(self, context, layout, data, item, icon, active_data, active_propname):
if item:
row = layout.row(align=True)
row.operator("bim.go_to_resource", text="", icon="STYLUS_PRESSURE").resource = item.ifc_definition_id
row.prop(item, "name", emboss=False, text="")
row.label(text=str(item.schedule_usage))
row.prop(item, "schedule_usage", emboss=False, text="")
class BIM_UL_animation_colors(UIList):
def draw_item(self, context, layout, data, item, icon, active_data, active_propname):
@@ -682,7 +791,7 @@ class BIM_UL_product_input_tasks(UIList):
def draw_item(self, context, layout, data, item, icon, active_data, active_propname):
if item:
row = layout.row(align=True)
op = row.operator("bim.highlight_task", text="", icon="STYLUS_PRESSURE")
op = row.operator("bim.go_to_task", text="", icon="STYLUS_PRESSURE")
op.task = item.ifc_definition_id
row.split(factor=0.8)
row.label(text=item.name)
@@ -692,7 +801,7 @@ class BIM_UL_product_output_tasks(UIList):
def draw_item(self, context, layout, data, item, icon, active_data, active_propname):
if item:
row = layout.row(align=True)
op = row.operator("bim.highlight_task", text="", icon="STYLUS_PRESSURE")
op = row.operator("bim.go_to_task", text="", icon="STYLUS_PRESSURE")
op.task = item.ifc_definition_id
row.split(factor=0.8)
row.label(text=item.name)
@@ -732,19 +841,18 @@ class BIM_UL_tasks(UIList):
)
if self.props.enable_reorder:
self.draw_order_operator(row, item.ifc_definition_id)
if self.props.active_task_id:
if self.props.editing_task_type == "SEQUENCE" and self.props.active_task_id != item.ifc_definition_id:
if item.is_predecessor:
op = row.operator("bim.unassign_predecessor", text="", icon="BACK", emboss=False)
else:
op = row.operator("bim.assign_predecessor", text="", icon="TRACKING_BACKWARDS", emboss=False)
op.task = item.ifc_definition_id
if self.props.editing_task_type == "SEQUENCE" and self.props.highlighted_task_id != item.ifc_definition_id:
if item.is_predecessor:
op = row.operator("bim.unassign_predecessor", text="", icon="BACK", emboss=False)
else:
op = row.operator("bim.assign_predecessor", text="", icon="TRACKING_BACKWARDS", emboss=False)
op.task = item.ifc_definition_id
if item.is_successor:
op = row.operator("bim.unassign_successor", text="", icon="FORWARD", emboss=False)
else:
op = row.operator("bim.assign_successor", text="", icon="TRACKING_FORWARDS", emboss=False)
op.task = item.ifc_definition_id
if item.is_successor:
op = row.operator("bim.unassign_successor", text="", icon="FORWARD", emboss=False)
else:
op = row.operator("bim.assign_successor", text="", icon="TRACKING_FORWARDS", emboss=False)
op.task = item.ifc_definition_id
def draw_order_operator(self, row, ifc_definition_id):
task = SequenceData.data["tasks"][ifc_definition_id]
@@ -813,10 +921,12 @@ class BIM_PT_work_calendars(Panel):
bl_space_type = "PROPERTIES"
bl_region_type = "WINDOW"
bl_context = "scene"
bl_parent_id = "BIM_PT_tab_sequence"
@classmethod
def poll(cls, context):
return tool.Blender.is_tab(context, "SCHEDULING") and tool.Ifc.get() and tool.Ifc.get().schema != "IFC2X3"
file = IfcStore.get_file()
return file and hasattr(file, "schema") and file.schema != "IFC2X3"
def draw(self, context):
if not SequenceData.is_loaded:
@@ -841,7 +951,7 @@ class BIM_PT_work_calendars(Panel):
if self.props.active_work_calendar_id == work_calendar_id:
if self.props.editing_type == "ATTRIBUTES":
row.operator("bim.edit_work_calendar", text="", icon="CHECKMARK")
row.operator("bim.disable_editing_work_calendar", text="", icon="CANCEL")
row.operator("bim.disable_editing_work_calendar", text="Cancel", icon="CANCEL")
elif self.props.active_work_calendar_id:
row.operator("bim.remove_work_calendar", text="", icon="X").work_calendar = work_calendar_id
else:
@@ -879,7 +989,7 @@ class BIM_PT_work_calendars(Panel):
row.label(text="{} - {}".format(work_time["Start"] or "*", work_time["Finish"] or "*"))
if self.props.active_work_time_id == work_time["id"]:
row.operator("bim.edit_work_time", text="", icon="CHECKMARK")
row.operator("bim.disable_editing_work_time", text="", icon="CANCEL")
row.operator("bim.disable_editing_work_time", text="Cancel", icon="CANCEL")
elif self.props.active_work_time_id:
op = row.operator("bim.remove_work_time", text="", icon="X")
op.work_time = work_time["id"]
@@ -1000,29 +1110,3 @@ class BIM_PT_4D_Tools(Panel):
self.props,
"active_product_output_task_index",
)
class BIM_PT_Task_Bar_Creator(Panel):
bl_label = "Task Bar Creator"
bl_idname = "BIM_PT_Task_Bar_Creator"
bl_space_type = "VIEW_3D"
bl_region_type = "UI"
bl_options = {"DEFAULT_CLOSED"}
bl_parent_id = "BIM_PT_4D_Tools"
def draw(self, context):
self.animation_props = context.scene.BIMAnimationProperties
row = self.layout.row()
row.operator("bim.add_task_bars", text="Add Bar Visual", icon="NLA_PUSHDOWN")
grid = self.layout.grid_flow(columns=2, even_columns=True)
# Column1
col = grid.column()
row1 = col.row(align=True)
row1.label(text="Bar Colors", icon="NLA_PUSHDOWN")
row2 = col.row(align=True)
row2.prop(self.animation_props, "color_progress")
row3 = col.row(align=True)
row3.prop(self.animation_props, "color_full")
@@ -34,6 +34,7 @@ classes = (
operator.RemovePort,
operator.RemoveSystem,
operator.SelectSystemProducts,
operator.MEPConnectElements,
operator.SetFlowDirection,
operator.ShowPorts,
operator.UnassignSystem,
@@ -23,6 +23,7 @@ import blenderbim.core.system as core
import blenderbim.bim.handler
from blenderbim.bim.ifc import IfcStore
from blenderbim.bim.module.system.data import PortData
from mathutils import Matrix
class Operator:
@@ -215,6 +216,42 @@ class DisconnectPort(bpy.types.Operator, Operator):
core.disconnect_port(tool.Ifc, port=element)
class MEPConnectElements(bpy.types.Operator, Operator):
bl_idname = "bim.mep_connect_elements"
bl_label = "Connect MEP Elements"
bl_description = "Connects two selected elements if they have ports with matching location"
bl_options = {"REGISTER", "UNDO"}
@classmethod
def poll(cls, context):
return len(context.selected_objects) == 2
def _execute(self, context):
obj1 = context.active_object
obj2 = next(o for o in context.selected_objects if o != obj1)
el1 = tool.Ifc.get_entity(obj1)
el2 = tool.Ifc.get_entity(obj2)
obj1_ports = [p for p in tool.System.get_ports(el1) if not tool.System.get_connected_port(p)]
obj2_ports = [p for p in tool.System.get_ports(el2) if not tool.System.get_connected_port(p)]
if not obj1_ports or not obj2_ports:
self.report({"ERROR"}, "Couldn't find free ports to connect.")
return
for port1 in obj1_ports:
port1_location = tool.Model.get_element_matrix(port1).translation
for port2 in obj2_ports:
port2_location = tool.Model.get_element_matrix(port2).translation
if tool.Cad.are_vectors_equal(port1_location, port2_location):
core.connect_port(tool.Ifc, port1, port2)
return {"FINISHED"}
self.report({"ERROR"}, "Couldn't find any matching ports to connect.")
return {"CANCELLED"}
class SetFlowDirection(bpy.types.Operator, Operator):
bl_idname = "bim.set_flow_direction"
bl_label = "Set Flow Direction"
@@ -123,6 +123,7 @@ class BIM_PT_object_systems(Panel):
"IfcDistributionSystem": "NETWORK_DRIVE",
"IfcDistributionCircuit": "DRIVER",
"IfcBuildingSystem": "MOD_BUILD",
"IfcBuiltSystem": "MOD_BUILD",
"IfcZone": "CUBE",
}
for system in ObjectSystemData.data["systems"]:
@@ -166,6 +167,7 @@ class BIM_PT_ports(Panel):
row = self.layout.row(align=True)
total_ports = PortData.data["total_ports"]
row.label(text=f"{total_ports} Ports Found", icon="PLUGIN")
row.operator("bim.mep_connect_elements", text="", icon="PLUGIN")
row.operator("bim.show_ports", icon="HIDE_OFF", text="")
row.operator("bim.hide_ports", icon="HIDE_ON", text="")
row.operator("bim.add_port", icon="ADD", text="")
@@ -283,6 +285,7 @@ class BIM_UL_systems(UIList):
"IfcDistributionSystem": "NETWORK_DRIVE",
"IfcDistributionCircuit": "DRIVER",
"IfcBuildingSystem": "MOD_BUILD",
"IfcBuiltSystem": "MOD_BUILD",
"IfcZone": "CUBE",
}
if item:
@@ -315,6 +318,7 @@ class BIM_UL_object_systems(UIList):
"IfcDistributionSystem": "NETWORK_DRIVE",
"IfcDistributionCircuit": "DRIVER",
"IfcBuildingSystem": "MOD_BUILD",
"IfcBuiltSystem": "MOD_BUILD",
"IfcZone": "CUBE",
}
if item:
@@ -445,7 +445,7 @@ class AddType(bpy.types.Operator, tool.Ifc.Operator):
should_add_representation=True,
context=body,
)
tool.Blender.select_and_activate_single_object(obj)
tool.Blender.select_and_activate_single_object(context, obj)
bpy.ops.bim.add_roof()
bpy.ops.bim.load_type_thumbnails(ifc_class=ifc_class)
@@ -115,8 +115,17 @@ class BIM_PT_booleans(Panel):
row.operator("bim.add_boolean", text="Apply Boolean", icon="ADD")
show_boolean_button = row.row(align=True)
show_boolean_button.operator("bim.show_booleans", text="", icon="HIDE_OFF")
show_boolean_button.enabled = BooleansData.data['total_booleans'] > 0
show_boolean_button.enabled = BooleansData.data["total_booleans"] > 0
row.operator("bim.hide_booleans", text="", icon="HIDE_ON")
elif context.active_object.data.BIMMeshProperties.ifc_boolean_id:
upsteam_obj = context.active_object.data.BIMMeshProperties.obj
upstream_obj_ifc_id = upsteam_obj.BIMObjectProperties.ifc_definition_id
row = layout.row(align=True)
row.label(text="Used as a boolean operand with:")
row.operator("bim.select_entity", text="", icon="RESTRICT_SELECT_OFF").ifc_id = upstream_obj_ifc_id
row.label(text=upsteam_obj.name)
row = layout.row()
row.operator("bim.remove_booleans", text="Remove Boolean", icon="X")
+6 -6
View File
@@ -830,13 +830,13 @@ class BIM_OT_enum_property_search(bpy.types.Operator):
mapping = getter_suggestions.get(self.prop_name)
if mapping is None:
return
for key, values in mapping().items():
for key, suggestions in mapping().items():
if key in self.identifiers:
if not isinstance(values, (tuple, list)):
values = [values]
for value in values:
predefined_type = value["predefined_type"].upper()
name = value.get("name")
if not isinstance(suggestions, (tuple, list)):
suggestions = [suggestions]
for suggestion in suggestions:
predefined_type = suggestion.get("predefined_type", "NOTDEFINED").upper()
name = suggestion.get("name")
self.add_item(
identifier=key,
name=f"{key} > {name if name else predefined_type }",
+2 -1
View File
@@ -305,7 +305,7 @@ def get_tab(self, context):
("DRAWINGS", "Drawings and Documents", "", "DOCUMENTS", 3),
("SERVICES", "Services and Systems", "", "NETWORK_DRIVE", 4),
("STRUCTURE", "Structural Analysis", "", "EDITMODE_HLT", 5),
("SCHEDULING", "Construction Scheduling", "", "NLA", 6),
("SCHEDULING", "Costing and Scheduling", "", "NLA", 6),
("FM", "Facility Management", "", "PACKAGE", 7),
("QUALITY", "Quality and Coordination", "", "COMMUNITY", 8),
("BLENDER", "Blender Properties", "", "BLENDER", 9),
@@ -435,6 +435,7 @@ class BIMMeshProperties(PropertyGroup):
ifc_definition_id: IntProperty(name="IFC Definition ID")
ifc_boolean_id: IntProperty(name="IFC Boolean ID")
obj: bpy.props.PointerProperty(type=bpy.types.Object)
has_openings_applied: BoolProperty(name="Has Openings Applied", default=True)
is_native: BoolProperty(name="Is Native", default=False)
is_swept_solid: BoolProperty(name="Is Swept Solid")
is_parametric: BoolProperty(name="Is Parametric", default=False)
@@ -0,0 +1,498 @@
ISO-10303-21;
HEADER;
FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1');
FILE_NAME('','2020-04-23T18:09:27',(),(),'IfcOpenShell 0.6.0b0','IfcOpenShell 0.6.0b0','');
FILE_SCHEMA(('IFC4'));
ENDSEC;
DATA;
#1=IFCPROJECTLIBRARY($,$,'BB/SfB (3/4 cijfers)',$,$,$,$,$,$);
#2=IFCCLASSIFICATION('Regie der Gebouwen','1990','2017-08-31','BB/SfB (3/4 cijfers)','Kies hieronder een BB/SfB code. Deze code wordt als ifc-classificatie aan het geselecteerde element toegevoegd.\X2\000A\X0\The BB/SfB (3/4 digits) standard defines a classification and information coding system for the AEC industry in Belgium.',$,('.'));
#3=IFCRELASSOCIATESCLASSIFICATION('182PB2CvD69RejlY5sr47M',$,$,$,(#1),#2);
#4=IFCCLASSIFICATIONREFERENCE($,'0-','TERREINEN, PROJECTEN',#2,$,$);
#5=IFCCLASSIFICATIONREFERENCE($,'1-','BODEM, ONDERBOUW',#2,$,$);
#6=IFCCLASSIFICATIONREFERENCE($,'11-','BODEM',#5,$,$);
#7=IFCCLASSIFICATIONREFERENCE($,'11.1','BODEMRELI\X2\00CB\X0\F, BODEMHELLING',#6,$,$);
#8=IFCCLASSIFICATIONREFERENCE($,'11.3','GRONDSAMENSTELLING',#6,$,$);
#9=IFCCLASSIFICATIONREFERENCE($,'11.4','GRONDWATER, WATER IN GROND',#6,$,$);
#10=IFCCLASSIFICATIONREFERENCE($,'11.5','BESTAANDE ONDERGRONDSE VOORZIENINGEN',#6,$,$);
#11=IFCCLASSIFICATIONREFERENCE($,'11.8','HOGER NIET GENOEMDE ELEMENTEN VAN 11-',#6,$,$);
#12=IFCCLASSIFICATIONREFERENCE($,'11.9','HULPSTUKKEN EN ONDERDELEN VOOR ELEMENTEN VAN 11-',#6,$,$);
#13=IFCCLASSIFICATIONREFERENCE($,'13-','LAGEN OP VOLLE GROND, VLOEREN OP VOLLE GROND',#5,$,$);
#14=IFCCLASSIFICATIONREFERENCE($,'13.1','VLOEREN OP VOLLE GROND',#13,$,$);
#15=IFCCLASSIFICATIONREFERENCE($,'13.4','BEPLANTE EN ONBEPLANTE ZACHTE LAGEN OP VOLLE GROND',#13,$,$);
#16=IFCCLASSIFICATIONREFERENCE($,'13.6','LAGEN ONDER WATER',#13,$,$);
#17=IFCCLASSIFICATIONREFERENCE($,'13.8','HOGER NIET GENOEMDE ELEMENTEN VAN 13-',#13,$,$);
#18=IFCCLASSIFICATIONREFERENCE($,'13.9','HULPSTUKKEN EN ONDERDELEN VOOR ELEMENTEN VAN 13-',#13,$,$);
#19=IFCCLASSIFICATIONREFERENCE($,'16-','FUNDERINGEN, KEERMUREN',#5,$,$);
#20=IFCCLASSIFICATIONREFERENCE($,'16.2','KEERMUREN\X2\201A\X0\ KELDERMUREN IN CONTACT MET GROND',#19,$,$);
#21=IFCCLASSIFICATIONREFERENCE($,'16.3','WATERKERENDE ELEMENTEN',#19,$,$);
#22=IFCCLASSIFICATIONREFERENCE($,'16.4','FUNDERINGEN, FUNDERINGEN OP ZOLEN, FUNDERINGEN OP PUTTEN',#19,$,$);
#23=IFCCLASSIFICATIONREFERENCE($,'16.8','HOGER NIET GENOEMDE ELEMENTEN VAN 16-',#19,$,$);
#24=IFCCLASSIFICATIONREFERENCE($,'16.9','HULPSTUKKEN EN ONDERDELEN VOOR ELEMENTEN VAN 16-',#19,$,$);
#25=IFCCLASSIFICATIONREFERENCE($,'17-','PAALFUNDERINGEN, DAMPLANKEN',#5,$,$);
#26=IFCCLASSIFICATIONREFERENCE($,'17.1','DAMPLANKEN',#25,$,$);
#27=IFCCLASSIFICATIONREFERENCE($,'17.2','PAALFUNDERINGEN GEREALISEERD MET GRONDUITGRAVINGEN EN IN SITU GESTORT',#25,$,$);
#28=IFCCLASSIFICATIONREFERENCE($,'17.3','PAALFUNDERLNGEN GEREALISEERD MET GRONDVERDRINGNNG EN GEPREFABRICEERD',#25,$,$);
#29=IFCCLASSIFICATIONREFERENCE($,'17.4','PAALFUNDERINGEN GEREALISEERD MET GRONDVERDRINGING EN IN SITU GEVORMD',#25,$,$);
#30=IFCCLASSIFICATIONREFERENCE($,'17.8','HOGER NIET GENOEMDE ELEMENTEN VAN 17-',#25,$,$);
#31=IFCCLASSIFICATIONREFERENCE($,'17.9','HULPSTUKKEN EN ONDERDELEN VOOR ELEMENTEN VAN 17-',#25,$,$);
#32=IFCCLASSIFICATIONREFERENCE($,'18','HOGER NIET GENOEMDE ELEMENTEN VAN 1-',#5,$,$);
#33=IFCCLASSIFICATIONREFERENCE($,'19','HULPSTUKKEN EN ONDERDELEN VOOR ELEMENTEN VAN 1-',#5,$,$);
#34=IFCCLASSIFICATIONREFERENCE($,'2-','PRIMAIRE ELEMENTEN VAN BOVENBOUW',#2,$,$);
#35=IFCCLASSIFICATIONREFERENCE($,'2.-','STRUCTUREN INGEDEELD VOLGENS CONSTRUCTIEF PRINCIPE',#34,$,$);
#36=IFCCLASSIFICATIONREFERENCE($,'2.1','STRUCTUREN MET DRAGENDE WANDEN',#35,$,$);
#37=IFCCLASSIFICATIONREFERENCE($,'2.2','SKELETSTRUCTUUR',#35,$,$);
#38=IFCCLASSIFICATIONREFERENCE($,'2.3','CELSTRUCTUREN',#35,$,$);
#39=IFCCLASSIFICATIONREFERENCE($,'2.4','VLIESSTRUCTUREN, GEODETISCHE STRUCTUREN',#35,$,$);
#40=IFCCLASSIFICATIONREFERENCE($,'2.5','SCHAALSTRUCTUREN',#35,$,$);
#41=IFCCLASSIFICATIONREFERENCE($,'2.6','STRUCTUREN OP TREK BELAST',#35,$,$);
#42=IFCCLASSIFICATIONREFERENCE($,'2.8','HOGER NIET GENOEMDE STRUCTUREN IN 2.-',#35,$,$);
#43=IFCCLASSIFICATIONREFERENCE($,'2.9','HOOFDDELEN VAN EEN STRUCTUUR',#35,$,$);
#44=IFCCLASSIFICATIONREFERENCE($,'21-','BUITENWANDEN',#34,$,$);
#45=IFCCLASSIFICATIONREFERENCE($,'21.1','DRAGENDE BUITENWANDEN',#44,$,$);
#46=IFCCLASSIFICATIONREFERENCE($,'21.3','NIET-DRAGENDE BUITENWAND',#44,$,$);
#47=IFCCLASSIFICATIONREFERENCE($,'21.4','GORDIJNGEVELS',#44,$,$);
#48=IFCCLASSIFICATIONREFERENCE($,'21.6','BUITENWANDEN OPGEBOUWD UIT DRAAGSTRUCTUUR EN BEKLEDING OF INVULLING',#44,$,$);
#49=IFCCLASSIFICATIONREFERENCE($,'21.8','HOGER NIET GENOEMDE ELEMENTEN VAN 21-',#44,$,$);
#50=IFCCLASSIFICATIONREFERENCE($,'21.9','HULPSTUKKEN EN ONDERDELEN VOOR ELEMENTEN VAN 21-',#44,$,$);
#51=IFCCLASSIFICATIONREFERENCE($,'22-','BINNENWANDEN',#34,$,$);
#52=IFCCLASSIFICATIONREFERENCE($,'22.1','DRAGENDE BINNENWANDEN',#51,$,$);
#53=IFCCLASSIFICATIONREFERENCE($,'22.3','NIET-DRAGENDE BINNENWANDEN',#51,$,$);
#54=IFCCLASSIFICATIONREFERENCE($,'22.6','BINNENWANDEN OPGEBOUWD UIT DRAAGSTRUCTUUR MET BEKLEDING OF INVULLING',#51,$,$);
#55=IFCCLASSIFICATIONREFERENCE($,'22.8','HOGER NIET GENOEMDE ELEMENTEN VAN 22-',#51,$,$);
#56=IFCCLASSIFICATIONREFERENCE($,'22.9','HULPSTUKKEN EN ONDERDELEN VOOR ELEMENTEN VAN 22-',#51,$,$);
#57=IFCCLASSIFICATIONREFERENCE($,'23-','VLOEREN, GALERIJEN, BALKONS, LOOPBRUGGEN',#34,$,$);
#58=IFCCLASSIFICATIONREFERENCE($,'23.2','MONOLITISCHE VLOEREN EN PLAATVLOEREN',#57,$,$);
#59=IFCCLASSIFICATIONREFERENCE($,'23.4','SAMENGESTELDE VLOEREN',#57,$,$);
#60=IFCCLASSIFICATIONREFERENCE($,'23.7','GALERIJEN, BALKONS, LOOPBRUGGEN',#57,$,$);
#61=IFCCLASSIFICATIONREFERENCE($,'23.8','HOGER NIET GENOEMDE ELEMENTEN VAN 23-',#57,$,$);
#62=IFCCLASSIFICATIONREFERENCE($,'23.9','HULPSTUKKEN EN ONDERDELEN VOOR ELEMENTEN VAN 23-',#57,$,$);
#63=IFCCLASSIFICATIONREFERENCE($,'24-','ELEMENTEN VOOR VERTICALE CIRCULATIE, TRAPPEN',#34,$,$);
#64=IFCCLASSIFICATIONREFERENCE($,'24.1','RECHTE TRAP ZONDER RICHTINGSVERANDERING (MET OF ZONDER TUSSENBORDES)',#63,$,$);
#65=IFCCLASSIFICATIONREFERENCE($,'24.3','RECHTE TRAP MET RICHTINGSVERANDERING (VIA BORDES O\X2\00CD\X0\ VERDREVEN TREDEN)',#63,$,$);
#66=IFCCLASSIFICATIONREFERENCE($,'24.4','WENTELTRAPPEN, SPIRAALTRAPPEN',#63,$,$);
#67=IFCCLASSIFICATIONREFERENCE($,'24.5','TRAPPEN VOLGENS ANDER INDELINGSCRITERTUM',#63,$,$);
#68=IFCCLASSIFICATIONREFERENCE($,'24.6','VASTE LADDERS, KLIMIJZERS, GL\X2\0132\X0\PALEN',#63,$,$);
#69=IFCCLASSIFICATIONREFERENCE($,'24.7','HELLINGEN',#63,$,$);
#70=IFCCLASSIFICATIONREFERENCE($,'24.8','HOGER NIET GENOEMDE ELEMENTEN VAN 24-',#63,$,$);
#71=IFCCLASSIFICATIONREFERENCE($,'24.9','HULPSTUKKEN EN ONDERDELEN VOOR ELEMENTEN VAN 24-',#63,$,$);
#72=IFCCLASSIFICATIONREFERENCE($,'27-','DAKEN',#34,$,$);
#73=IFCCLASSIFICATIONREFERENCE($,'27.1/27.5','DAKEN VOLGENS VORM',#72,$,$);
#74=IFCCLASSIFICATIONREFERENCE($,'27.1','PLATTE DAKEN, DAKTERRASSEN',#73,$,$);
#75=IFCCLASSIFICATIONREFERENCE($,'27.2','HELLENDE DAKEN',#73,$,$);
#76=IFCCLASSIFICATIONREFERENCE($,'27.2-','HELLENDE DAKEN',#73,$,$);
#77=IFCCLASSIFICATIONREFERENCE($,'27.21','MET EEN DAKSCHILD',#76,$,$);
#78=IFCCLASSIFICATIONREFERENCE($,'27.22','MET TWEE DAKSCHILDEN',#76,$,$);
#79=IFCCLASSIFICATIONREFERENCE($,'27.23','MET VIER DAKSCHILDEN',#76,$,$);
#80=IFCCLASSIFICATIONREFERENCE($,'27.28','HELLENDE DAKEN NIET GENOEMD IN 27.2-',#76,$,$);
#81=IFCCLASSIFICATIONREFERENCE($,'27.4','DAKEN MET GEPLOOIDE PLAATSTRUCTUUR',#73,$,$);
#82=IFCCLASSIFICATIONREFERENCE($,'27.5','DAKEN MET EEN VORM NIET GENOEMD IN 27.1/27.4',#73,$,$);
#83=IFCCLASSIFICATIONREFERENCE($,'27.6/27.7','DAKEN VOLGENS STRUCTUREEL PRINCIPE',#72,$,$);
#84=IFCCLASSIFICATIONREFERENCE($,'27.6','DAKSTRUCTUREN ZONDER UITKRAGING',#83,$,$);
#85=IFCCLASSIFICATIONREFERENCE($,'27.7','DAKSTRUCTUREN MET UITKRAGING',#83,$,$);
#86=IFCCLASSIFICATIONREFERENCE($,'27.8','HOGER NIET GENOEMDE ELEMENTEN VAN 27-',#72,$,$);
#87=IFCCLASSIFICATIONREFERENCE($,'27.9','HULPSTUKKEN EN ONDERDELEN VOOR ELEMENTEN VAN 27-',#72,$,$);
#88=IFCCLASSIFICATIONREFERENCE($,'28-','DRAAGSTRUCTUREN VAN GEBOUWEN, HOGER NIET GENOEMDE ELEMENTEN VAN 2-',#34,$,$);
#89=IFCCLASSIFICATIONREFERENCE($,'28.2/28.7','DRAAGSTRUCTUREN VAN GEBOUWEN',#88,$,$);
#90=IFCCLASSIFICATIONREFERENCE($,'28.2','KOLOM-BALKSTRUCTUUR, PORTIEKSTRUCTUUR',#89,$,$);
#91=IFCCLASSIFICATIONREFERENCE($,'28.3','KOLOM-VLOERSTRUCTUUR',#89,$,$);
#92=IFCCLASSIFICATIONREFERENCE($,'28.5','KOLOM-KABELSTRUCTUUR',#89,$,$);
#93=IFCCLASSIFICATIONREFERENCE($,'28.6','RUIMTELIJKE DRAAGSTRUCTUUR',#89,$,$);
#94=IFCCLASSIFICATIONREFERENCE($,'28.7','DRAAGSTRUCTUREN HOGER NIET GENOEMD IN 28.2/28.6',#89,$,$);
#95=IFCCLASSIFICATIONREFERENCE($,'28.8','HOGER NIET GENOEMDE ELEMENTEN VAN 28-',#88,$,$);
#96=IFCCLASSIFICATIONREFERENCE($,'28.9','HULPSTUKKEN EN ONDERDELEN VOOR ELEMENTEN VAN 28-',#88,$,$);
#97=IFCCLASSIFICATIONREFERENCE($,'29','HULPSTUKKEN EN ONDERDELEN VOOR ELEMENTEN VAN 2-',#34,$,$);
#98=IFCCLASSIFICATIONREFERENCE($,'3-','SECUNDAIRE ELEMENTEN, AFSLUITENDE ELEMENTEN, VAN DE BOVENBOUW',#2,$,$);
#99=IFCCLASSIFICATIONREFERENCE($,'31-','SECUNDAIRE ELEMENTEN VOOR BUITENWANDEN',#98,$,$);
#100=IFCCLASSIFICATIONREFERENCE($,'31.3','DEUREN, RAMEN, RAAM-DEUREN, RAAM-EN-DEUR-COMBINATIES EN OVEREENKOMSTIGE OPENINGEN',#99,$,$);
#101=IFCCLASSIFICATIONREFERENCE($,'31.3-','RAAM-DEUREN, OPENINGEN VOOR RAAM-DEUREN',#99,$,$);
#102=IFCCLASSIFICATIONREFERENCE($,'31.31','RAAM-DEUREN, OPENINGEN VOOR RAAM-DEUREN (VAST)',#101,$,$);
#103=IFCCLASSIFICATIONREFERENCE($,'31.32','RAAM-DEUREN, OPENINGEN VOOR RAAM-DEUREN (DRAAIEND\X2\201A\X0\ KLAPPEND, VALLEND)',#101,$,$);
#104=IFCCLASSIFICATIONREFERENCE($,'31.33','RAAM-DEUREN, OPENINGEN VOOR RAAM-DEUREN (PIVOTEREND, WENTELEND)',#101,$,$);
#105=IFCCLASSIFICATIONREFERENCE($,'31.34','RAAM-DEUREN, OPENINGEN VOOR RAAM-DEUREN (HORIZONTAAL SCHUIVEND EN/OF VOUWEND)',#101,$,$);
#106=IFCCLASSIFICATIONREFERENCE($,'31.35','RAAM-DEUREN, OPENINGEN VOOR RAAM-DEUREN (VERTICAAL SCHUIVEND EN/OF VOUWEND, VERTICAAL ROLLEND)',#101,$,$);
#107=IFCCLASSIFICATIONREFERENCE($,'31.36','RAAM-DEUREN, OPENINGEN VOOR RAAM-DEUREN (OMHOOG KANTELEND)',#101,$,$);
#108=IFCCLASSIFICATIONREFERENCE($,'31.38','RAAM-DEUREN, OPENINGEN VOOR RAAM-DEUREN (OPENINGSWIJZE NIET GENOEMD IN 31.31/31.36)',#101,$,$);
#109=IFCCLASSIFICATIONREFERENCE($,'31.39','RAAM-DEUREN, OPENINGEN VOOR RAAM-DEUREN (ONDERDELEN EN HULPSTUKKEN VOOR SCHRIJNWERK VOOR OPENINGEN IN BOVENBOUW)',#101,$,$);
#110=IFCCLASSIFICATIONREFERENCE($,'31.4','RAMEN, OPENINGEN VOOR RAMEN, RAAMOPENINGEN',#99,$,$);
#111=IFCCLASSIFICATIONREFERENCE($,'31.4-','RAMEN, OPENINGEN VOOR RAMEN, RAAMOPENINGEN',#99,$,$);
#112=IFCCLASSIFICATIONREFERENCE($,'31.41','31.41 RAMEN, OPENINGEN VOOR RAMEN, RAAMOPENINGEN (VAST)',#111,$,$);
#113=IFCCLASSIFICATIONREFERENCE($,'31.42','RAMEN, OPENINGEN VOOR RAMEN, RAAMOPENINGEN (DRAAIEND\X2\201A\X0\ KLAPPEND, VALLEND)',#111,$,$);
#114=IFCCLASSIFICATIONREFERENCE($,'31.43','RAMEN, OPENINGEN VOOR RAMEN, RAAMOPENINGEN (PIVOTEREND, WENTELEND)',#111,$,$);
#115=IFCCLASSIFICATIONREFERENCE($,'31.44','RAMEN, OPENINGEN VOOR RAMEN, RAAMOPENINGEN (HORIZONTAAL SCHUIVEND EN/OF VOUWEND)',#111,$,$);
#116=IFCCLASSIFICATIONREFERENCE($,'31.45','RAMEN, OPENINGEN VOOR RAMEN, RAAMOPENINGEN (VERTICAAL SCHUIVEND EN/OF VOUWEND, VERTICAAL ROLLEND)',#111,$,$);
#117=IFCCLASSIFICATIONREFERENCE($,'31.46','RAMEN, OPENINGEN VOOR RAMEN, RAAMOPENINGEN (OMHOOG KANTELEND)',#111,$,$);
#118=IFCCLASSIFICATIONREFERENCE($,'31.48','RAMEN, OPENINGEN VOOR RAMEN, RAAMOPENINGEN (OPENINGSWIJZE NIET GENOEMD IN 31.41/31.46)',#111,$,$);
#119=IFCCLASSIFICATIONREFERENCE($,'31.49','RAMEN, OPENINGEN VOOR RAMEN, RAAMOPENINGEN (ONDERDELEN EN HULPSTUKKEN VOOR SCHRIJNWERK VOOR OPENINGEN IN BOVENBOUW)',#111,$,$);
#120=IFCCLASSIFICATIONREFERENCE($,'31.5','31.5 DEUREN, OPENINGEN VOOR DEUREN, DOORGANGEN',#99,$,$);
#121=IFCCLASSIFICATIONREFERENCE($,'31.5-','31.5 DEUREN, OPENINGEN VOOR DEUREN, DOORGANGEN',#99,$,$);
#122=IFCCLASSIFICATIONREFERENCE($,'31.51','DEUREN, OPENINGEN VOOR DEUREN, DOORGANGEN (VAST)',#121,$,$);
#123=IFCCLASSIFICATIONREFERENCE($,'31.52','DEUREN, OPENINGEN VOOR DEUREN, DOORGANGEN (DRAAIEND\X2\201A\X0\ KLAPPEND, VALLEND)',#121,$,$);
#124=IFCCLASSIFICATIONREFERENCE($,'31.53','DEUREN, OPENINGEN VOOR DEUREN, DOORGANGEN (PIVOTEREND, WENTELEND)',#121,$,$);
#125=IFCCLASSIFICATIONREFERENCE($,'31.54','DEUREN, OPENINGEN VOOR DEUREN, DOORGANGEN (HORIZONTAAL SCHUIVEND EN/OF VOUWEND)',#121,$,$);
#126=IFCCLASSIFICATIONREFERENCE($,'31.55','DEUREN, OPENINGEN VOOR DEUREN, DOORGANGEN (VERTICAAL SCHUIVEND EN/OF VOUWEND, VERTICAAL ROLLEND)',#121,$,$);
#127=IFCCLASSIFICATIONREFERENCE($,'31.56','DEUREN, OPENINGEN VOOR DEUREN, DOORGANGEN (OMHOOG KANTELEND)',#121,$,$);
#128=IFCCLASSIFICATIONREFERENCE($,'31.58','DEUREN, OPENINGEN VOOR DEUREN, DOORGANGEN (OPENINGSWIJZE NIET GENOEMD IN 31.51/31.56)',#121,$,$);
#129=IFCCLASSIFICATIONREFERENCE($,'31.59','DEUREN, OPENINGEN VOOR DEUREN, DOORGANGEN (ONDERDELEN EN HULPSTUKKEN VOOR SCHRIJNWERK VOOR OPENINGEN IN BOVENBOUW)',#121,$,$);
#130=IFCCLASSIFICATIONREFERENCE($,'31.7','LUIKEN, OPENINGEN MET OF ZONDER LUIKEN',#99,$,$);
#131=IFCCLASSIFICATIONREFERENCE($,'31.7-','LUIKEN, OPENINGEN MET OF ZONDER LUIKEN',#99,$,$);
#132=IFCCLASSIFICATIONREFERENCE($,'31.71','LUIKEN, OPENINGEN MET OF ZONDER LUIKEN (VAST)',#131,$,$);
#133=IFCCLASSIFICATIONREFERENCE($,'31.72','LUIKEN, OPENINGEN MET OF ZONDER LUIKEN (DRAAIEND\X2\201A\X0\ KLAPPEND, VALLEND)',#131,$,$);
#134=IFCCLASSIFICATIONREFERENCE($,'31.73','LUIKEN, OPENINGEN MET OF ZONDER LUIKEN (PIVOTEREND, WENTELEND)',#131,$,$);
#135=IFCCLASSIFICATIONREFERENCE($,'31.74','LUIKEN, OPENINGEN MET OF ZONDER LUIKEN (HORIZONTAAL SCHUIVEND EN/OF VOUWEND)',#131,$,$);
#136=IFCCLASSIFICATIONREFERENCE($,'31.75','LUIKEN, OPENINGEN MET OF ZONDER LUIKEN (VERTICAAL SCHUIVEND EN/OF VOUWEND, VERTICAAL ROLLEND)',#131,$,$);
#137=IFCCLASSIFICATIONREFERENCE($,'31.76','LUIKEN, OPENINGEN MET OF ZONDER LUIKEN (OMHOOG KANTELEND)',#131,$,$);
#138=IFCCLASSIFICATIONREFERENCE($,'31.78','LUIKEN, OPENINGEN MET OF ZONDER LUIKEN (OPENINGSWIJZE NIET GENOEMD IN 31.71/31.76)',#131,$,$);
#139=IFCCLASSIFICATIONREFERENCE($,'31.79','LUIKEN, OPENINGEN MET OF ZONDER LUIKEN (ONDERDELEN EN HULPSTUKKEN VOOR SCHRIJNWERK VOOR OPENINGEN IN BOVENBOUW)',#131,$,$);
#140=IFCCLASSIFICATIONREFERENCE($,'31.8','HOGER NIET GENOEMDE ELEMENTEN VAN 31-',#99,$,$);
#141=IFCCLASSIFICATIONREFERENCE($,'31.9','HULPSTUKKEN EN ONDERDELEN VOOR ELEMENTEN VAN 31-',#99,$,$);
#142=IFCCLASSIFICATIONREFERENCE($,'32-','SECUNDAIRE ELEMENTEN VOOR BINNENWANDEN',#98,$,$);
#143=IFCCLASSIFICATIONREFERENCE($,'32.3','DEUREN, RAMEN, RAAM-DEUREN, RAAM-EN-DEUR-COMBINATIES EN OVEREENKOMSTIG OPENINGEN VOOR BINNENWANDEN',#142,$,$);
#144=IFCCLASSIFICATIONREFERENCE($,'32.3-','RAAM-DEUREN, OPENINGEN VOOR RAAM-DEUREN IN BINNENWANDEN',#142,$,$);
#145=IFCCLASSIFICATIONREFERENCE($,'32.31','RAAM-DEUREN, OPENINGEN VOOR RAAM-DEUREN IN BINNENWANDEN (VAST)',#144,$,$);
#146=IFCCLASSIFICATIONREFERENCE($,'32.32','RAAM-DEUREN, OPENINGEN VOOR RAAM-DEUREN IN BINNENWANDEN (DRAAIEND\X2\201A\X0\ KLAPPEND, VALLEND)',#144,$,$);
#147=IFCCLASSIFICATIONREFERENCE($,'32.33','RAAM-DEUREN, OPENINGEN VOOR RAAM-DEUREN IN BINNENWANDEN (PIVOTEREND, WENTELEND)',#144,$,$);
#148=IFCCLASSIFICATIONREFERENCE($,'32.34','RAAM-DEUREN, OPENINGEN VOOR RAAM-DEUREN IN BINNENWANDEN (HORIZONTAAL SCHUIVEND EN/OF VOUWEND)',#144,$,$);
#149=IFCCLASSIFICATIONREFERENCE($,'32.35','RAAM-DEUREN, OPENINGEN VOOR RAAM-DEUREN IN BINNENWANDEN (VERTICAAL SCHUIVEND EN/OF VOUWEND, VERTICAAL ROLLEND)',#144,$,$);
#150=IFCCLASSIFICATIONREFERENCE($,'32.36','RAAM-DEUREN, OPENINGEN VOOR RAAM-DEUREN IN BINNENWANDEN (OMHOOG KANTELEND)',#144,$,$);
#151=IFCCLASSIFICATIONREFERENCE($,'32.38','RAAM-DEUREN, OPENINGEN VOOR RAAM-DEUREN IN BINNENWANDEN (OPENINGSWIJZE NIET GENOEMD IN 32.31/31.36)',#144,$,$);
#152=IFCCLASSIFICATIONREFERENCE($,'32.39','RAAM-DEUREN, OPENINGEN VOOR RAAM-DEUREN IN BINNENWANDEN (ONDERDELEN EN HULPSTUKKEN VOOR SCHRIJNWERK VOOR OPENINGEN IN BOVENBOUW)',#144,$,$);
#153=IFCCLASSIFICATIONREFERENCE($,'32.4','32.4 RAMEN VOOR BINNENWANDEN, OPENINGEN VOOR RAMEN IN BINNENWANDEN, RAAMOPENINGEN IN BINNENWANDEN',#142,$,$);
#154=IFCCLASSIFICATIONREFERENCE($,'32.4-','32.4 RAMEN VOOR BINNENWANDEN, OPENINGEN VOOR RAMEN IN BINNENWANDEN, RAAMOPENINGEN IN BINNENWANDEN',#142,$,$);
#155=IFCCLASSIFICATIONREFERENCE($,'32.41','32.41 RAMEN VOOR BINNENWANDEN, OPENINGEN VOOR RAMEN IN BINNENWANDEN, RAAMOPENINGEN IN BINNENWANDEN (VAST)',#154,$,$);
#156=IFCCLASSIFICATIONREFERENCE($,'32.42','RAMEN VOOR BINNENWANDEN, OPENINGEN VOOR RAMEN IN BINNENWANDEN, RAAMOPENINGEN IN BINNENWANDEN (DRAAIEND\X2\201A\X0\ KLAPPEND, VALLEND)',#154,$,$);
#157=IFCCLASSIFICATIONREFERENCE($,'32.43','RAMEN VOOR BINNENWANDEN, OPENINGEN VOOR RAMEN IN BINNENWANDEN, RAAMOPENINGEN IN BINNENWANDEN (PIVOTEREND, WENTELEND)',#154,$,$);
#158=IFCCLASSIFICATIONREFERENCE($,'32.44','RAMEN VOOR BINNENWANDEN, OPENINGEN VOOR RAMEN IN BINNENWANDEN, RAAMOPENINGEN IN BINNENWANDEN (HORIZONTAAL SCHUIVEND EN/OF VOUWEND)',#154,$,$);
#159=IFCCLASSIFICATIONREFERENCE($,'32.45','RAMEN VOOR BINNENWANDEN, OPENINGEN VOOR RAMEN IN BINNENWANDEN, RAAMOPENINGEN IN BINNENWANDEN (VERTICAAL SCHUIVEND EN/OF VOUWEND, VERTICAAL ROLLEND)',#154,$,$);
#160=IFCCLASSIFICATIONREFERENCE($,'32.46','RAMEN VOOR BINNENWANDEN, OPENINGEN VOOR RAMEN IN BINNENWANDEN, RAAMOPENINGEN IN BINNENWANDEN (OMHOOG KANTELEND)',#154,$,$);
#161=IFCCLASSIFICATIONREFERENCE($,'32.48','RAMEN VOOR BINNENWANDEN, OPENINGEN VOOR RAMEN IN BINNENWANDEN, RAAMOPENINGEN IN BINNENWANDEN (OPENINGSWIJZE NIET GENOEMD IN 32.41/32.46)',#154,$,$);
#162=IFCCLASSIFICATIONREFERENCE($,'32.49','RAMEN VOOR BINNENWANDEN, OPENINGEN VOOR RAMEN IN BINNENWANDEN, RAAMOPENINGEN IN BINNENWANDEN (ONDERDELEN EN HULPSTUKKEN VOOR SCHRIJNWERK VOOR OPENINGEN IN BOVENBOUW)',#154,$,$);
#163=IFCCLASSIFICATIONREFERENCE($,'32.5','32.5 DEUREN VOOR BINNENWANDEN, DEUROPENINGEN VOOR BINNENWANDEN, DOORGANGEN IN BINNENWANDEN',#142,$,$);
#164=IFCCLASSIFICATIONREFERENCE($,'32.5-','32.5 DEUREN VOOR BINNENWANDEN, DEUROPENINGEN VOOR BINNENWANDEN, DOORGANGEN IN BINNENWANDEN',#142,$,$);
#165=IFCCLASSIFICATIONREFERENCE($,'32.51','DEUREN VOOR BINNENWANDEN, DEUROPENINGEN VOOR BINNENWANDEN, DOORGANGEN IN BINNENWANDEN (VAST)',#164,$,$);
#166=IFCCLASSIFICATIONREFERENCE($,'32.52','DEUREN VOOR BINNENWANDEN, DEUROPENINGEN VOOR BINNENWANDEN, DOORGANGEN IN BINNENWANDEN (DRAAIEND\X2\201A\X0\ KLAPPEND, VALLEND)',#164,$,$);
#167=IFCCLASSIFICATIONREFERENCE($,'32.53','DEUREN VOOR BINNENWANDEN, DEUROPENINGEN VOOR BINNENWANDEN, DOORGANGEN IN BINNENWANDEN (PIVOTEREND, WENTELEND)',#164,$,$);
#168=IFCCLASSIFICATIONREFERENCE($,'32.54','DEUREN VOOR BINNENWANDEN, DEUROPENINGEN VOOR BINNENWANDEN, DOORGANGEN IN BINNENWANDEN (HORIZONTAAL SCHUIVEND EN/OF VOUWEND)',#164,$,$);
#169=IFCCLASSIFICATIONREFERENCE($,'32.55','DEUREN VOOR BINNENWANDEN, DEUROPENINGEN VOOR BINNENWANDEN, DOORGANGEN IN BINNENWANDEN (VERTICAAL SCHUIVEND EN/OF VOUWEND, VERTICAAL ROLLEND)',#164,$,$);
#170=IFCCLASSIFICATIONREFERENCE($,'32.56','DEUREN VOOR BINNENWANDEN, DEUROPENINGEN VOOR BINNENWANDEN, DOORGANGEN IN BINNENWANDEN (OMHOOG KANTELEND)',#164,$,$);
#171=IFCCLASSIFICATIONREFERENCE($,'32.58','DEUREN VOOR BINNENWANDEN, DEUROPENINGEN VOOR BINNENWANDEN, DOORGANGEN IN BINNENWANDEN (OPENINGSWIJZE NIET GENOEMD IN 32.51/32.56)',#164,$,$);
#172=IFCCLASSIFICATIONREFERENCE($,'32.59','DEUREN VOOR BINNENWANDEN, DEUROPENINGEN VOOR BINNENWANDEN, DOORGANGEN IN BINNENWANDEN (ONDERDELEN EN HULPSTUKKEN VOOR SCHRIJNWERK VOOR OPENINGEN IN BOVENBOUW)',#164,$,$);
#173=IFCCLASSIFICATIONREFERENCE($,'32.7','LUIKEN VOOR BINNENWANDEN, OPENINGEN IN BINNENWANDEN MET OF ZONDER LUIKEN',#142,$,$);
#174=IFCCLASSIFICATIONREFERENCE($,'32.7-','LUIKEN VOOR BINNENWANDEN, OPENINGEN IN BINNENWANDEN MET OF ZONDER LUIKEN',#142,$,$);
#175=IFCCLASSIFICATIONREFERENCE($,'32.71','LUIKEN VOOR BINNENWANDEN, OPENINGEN IN BINNENWANDEN MET OF ZONDER LUIKEN (VAST)',#174,$,$);
#176=IFCCLASSIFICATIONREFERENCE($,'32.72','LUIKEN VOOR BINNENWANDEN, OPENINGEN IN BINNENWANDEN MET OF ZONDER LUIKEN (DRAAIEND\X2\201A\X0\ KLAPPEND, VALLEND)',#174,$,$);
#177=IFCCLASSIFICATIONREFERENCE($,'32.73','LUIKEN VOOR BINNENWANDEN, OPENINGEN IN BINNENWANDEN MET OF ZONDER LUIKEN (PIVOTEREND, WENTELEND)',#174,$,$);
#178=IFCCLASSIFICATIONREFERENCE($,'32.74','LUIKEN VOOR BINNENWANDEN, OPENINGEN IN BINNENWANDEN MET OF ZONDER LUIKEN (HORIZONTAAL SCHUIVEND EN/OF VOUWEND)',#174,$,$);
#179=IFCCLASSIFICATIONREFERENCE($,'32.75','LUIKEN VOOR BINNENWANDEN, OPENINGEN IN BINNENWANDEN MET OF ZONDER LUIKEN (VERTICAAL SCHUIVEND EN/OF VOUWEND, VERTICAAL ROLLEND)',#174,$,$);
#180=IFCCLASSIFICATIONREFERENCE($,'32.76','LUIKEN VOOR BINNENWANDEN, OPENINGEN IN BINNENWANDEN MET OF ZONDER LUIKEN (OMHOOG KANTELEND)',#174,$,$);
#181=IFCCLASSIFICATIONREFERENCE($,'32.78','LUIKEN VOOR BINNENWANDEN, OPENINGEN IN BINNENWANDEN MET OF ZONDER LUIKEN (OPENINGSWIJZE NIET GENOEMD IN 32.71/32.76)',#174,$,$);
#182=IFCCLASSIFICATIONREFERENCE($,'32.79','32.79 LUIKEN VOOR BINNENWANDEN, OPENINGEN IN BINNENWANDEN MET OF ZONDER LUIKEN (ONDERDELEN EN HULPSTUKKEN VOOR SCHRIJNWERK VOOR OPENINGEN IN BOVENBOUW)',#174,$,$);
#183=IFCCLASSIFICATIONREFERENCE($,'32.8','HOGER NIET GENOEMD IN ELEMENTEN VAN 32-',#142,$,$);
#184=IFCCLASSIFICATIONREFERENCE($,'32.9','HULPSTUKKEN EN ONDERDELEN VOOR ELEMENTEN VAN 32-',#142,$,$);
#185=IFCCLASSIFICATIONREFERENCE($,'33-','SECUNDAIRE ELEMENTEN VOOR VLOEREN',#98,$,$);
#186=IFCCLASSIFICATIONREFERENCE($,'33.1','VERHOOGDE VLOEREN',#185,$,$);
#187=IFCCLASSIFICATIONREFERENCE($,'33.2','SECUNDAIRE VLOERLAGEN',#185,$,$);
#188=IFCCLASSIFICATIONREFERENCE($,'33.5','OPENINGEN IN VLOEREN MET OF ZONDER AFSLUITENDE ELEMENTEN',#185,$,$);
#189=IFCCLASSIFICATIONREFERENCE($,'33.5-','OPENINGEN IN VLOEREN MET OF ZONDER AFSLUITENDE ELEMENTEN',#185,$,$);
#190=IFCCLASSIFICATIONREFERENCE($,'33.51','OPENINGEN IN VLOEREN MET OF ZONDER AFSLUITENDE ELEMENTEN (VAST)',#189,$,$);
#191=IFCCLASSIFICATIONREFERENCE($,'33.52','OPENINGEN IN VLOEREN MET OF ZONDER AFSLUITENDE ELEMENTEN (DRAAIEND\X2\201A\X0\ KLAPPEND, VALLEND)',#189,$,$);
#192=IFCCLASSIFICATIONREFERENCE($,'33.53','OPENINGEN IN VLOEREN MET OF ZONDER AFSLUITENDE ELEMENTEN (PIVOTEREND, WENTELEND)',#189,$,$);
#193=IFCCLASSIFICATIONREFERENCE($,'33.54','OPENINGEN IN VLOEREN MET OF ZONDER AFSLUITENDE ELEMENTEN (HORIZONTAAL SCHUIVEND EN/OF VOUWEND)',#189,$,$);
#194=IFCCLASSIFICATIONREFERENCE($,'33.55','OPENINGEN IN VLOEREN MET OF ZONDER AFSLUITENDE ELEMENTEN (VERTICAAL SCHUIVEND EN/OF VOUWEND, VERTICAAL ROLLEND)',#189,$,$);
#195=IFCCLASSIFICATIONREFERENCE($,'33.56','OPENINGEN IN VLOEREN MET OF ZONDER AFSLUITENDE ELEMENTEN (OMHOOG KANTELEND)',#189,$,$);
#196=IFCCLASSIFICATIONREFERENCE($,'33.58','OPENINGEN IN VLOEREN MET OF ZONDER AFSLUITENDE ELEMENTEN (OPENINGSWIJZE NIET GENOEMD IN 33.51/33.56)',#189,$,$);
#197=IFCCLASSIFICATIONREFERENCE($,'33.59','OPENINGEN IN VLOEREN MET OF ZONDER AFSLUITENDE ELEMENTEN (ONDERDELEN EN HULPSTUKKEN VOOR SCHRIJNWERK VOOR OPENINGEN IN BOVENBOUW)',#189,$,$);
#198=IFCCLASSIFICATIONREFERENCE($,'33.8','HOGER NIET GENOEMDE ELEMENTEN VAN 33-',#185,$,$);
#199=IFCCLASSIFICATIONREFERENCE($,'33.9','HULPSTUKKEN EN ONDERDELEN VOOR ELEMENTEN VAN 33-',#185,$,$);
#200=IFCCLASSIFICATIONREFERENCE($,'34','SECUNDAIRE ELEMENTEN VOOR VERTICALE CIRCULATIE, VOOR TRAPPEN',#98,$,$);
#201=IFCCLASSIFICATIONREFERENCE($,'35-','OPGEHANGEN PLAFONDS',#98,$,$);
#202=IFCCLASSIFICATIONREFERENCE($,'35.1','OPGEHANGEN PLAFONDS UIT \X2\00C900C9\X0\N STUK OF MET PLATEN OF TEGELS, DIT WIL ZEGGEN NIET-LIJNVORMIGE ELEMENTEN',#201,$,$);
#203=IFCCLASSIFICATIONREFERENCE($,'35.2','OPGEHANGEN PLAFONDS UIT LIJNVORMIGE ELEMENTEN',#201,$,$);
#204=IFCCLASSIFICATIONREFERENCE($,'35.3','OPENINGEN IN OPGEHANGEN PLATONDS MET OF ZONDER INVULELEMENTEN',#201,$,$);
#205=IFCCLASSIFICATIONREFERENCE($,'35.3-','OPENINGEN IN OPGEHANGEN PLATONDS MET OF ZONDER INVULELEMENTEN',#201,$,$);
#206=IFCCLASSIFICATIONREFERENCE($,'35.31','OPENINGEN IN OPGEHANGEN PLATONDS MET OF ZONDER INVULELEMENTEN (VAST)',#205,$,$);
#207=IFCCLASSIFICATIONREFERENCE($,'35.32','OPENINGEN IN OPGEHANGEN PLATONDS MET OF ZONDER INVULELEMENTEN (DRAAIEND\X2\201A\X0\ KLAPPEND, VALLEND)',#205,$,$);
#208=IFCCLASSIFICATIONREFERENCE($,'35.33','OPENINGEN IN OPGEHANGEN PLATONDS MET OF ZONDER INVULELEMENTEN (PIVOTEREND, WENTELEND)',#205,$,$);
#209=IFCCLASSIFICATIONREFERENCE($,'35.34','OPENINGEN IN OPGEHANGEN PLATONDS MET OF ZONDER INVULELEMENTEN (HORIZONTAAL SCHUIVEND EN/OF VOUWEND)',#205,$,$);
#210=IFCCLASSIFICATIONREFERENCE($,'35.35','OPENINGEN IN OPGEHANGEN PLATONDS MET OF ZONDER INVULELEMENTEN (VERTICAAL SCHUIVEND EN/OF VOUWEND, VERTICAAL ROLLEND)',#205,$,$);
#211=IFCCLASSIFICATIONREFERENCE($,'35.36','OPENINGEN IN OPGEHANGEN PLATONDS MET OF ZONDER INVULELEMENTEN (OMHOOG KANTELEND)',#205,$,$);
#212=IFCCLASSIFICATIONREFERENCE($,'35.38','OPENINGEN IN OPGEHANGEN PLATONDS MET OF ZONDER INVULELEMENTEN (OPENINGSWIJZE NIET GENOEMD IN 35.31/35.36)',#205,$,$);
#213=IFCCLASSIFICATIONREFERENCE($,'35.39','OPENINGEN IN OPGEHANGEN PLATONDS MET OF ZONDER INVULELEMENTEN (ONDERDELEN EN HULPSTUKKEN VOOR SCHRIJNWERK VOOR OPENINGEN IN BOVENBOUW)',#205,$,$);
#214=IFCCLASSIFICATIONREFERENCE($,'35.8','HOGER NIET GENOEMDE ELEMENTEN VAN 35-',#201,$,$);
#215=IFCCLASSIFICATIONREFERENCE($,'35.9','HULPSTUKKEN EN ONDERDELEN VOOR ELEMENTEN VAN 35-',#201,$,$);
#216=IFCCLASSIFICATIONREFERENCE($,'37-','SECUNDAIRE ELEMENTEN VOOR DAKEN',#98,$,$);
#217=IFCCLASSIFICATIONREFERENCE($,'37.3','DEUREN, RAMEN, RAAM-DEUREN, RAAM-EN-DEUR-COMBINATIES, DOORGANGEN EN OVEREENKOMSTIGE OPENINGEN',#216,$,$);
#218=IFCCLASSIFICATIONREFERENCE($,'37.3-','RAAM-DEUREN, OPENINGEN VOOR RAAM-DEUREN IN DAKEN',#216,$,$);
#219=IFCCLASSIFICATIONREFERENCE($,'37.31','RAAM-DEUREN, OPENINGEN VOOR RAAM-DEUREN IN DAKEN (VAST)',#218,$,$);
#220=IFCCLASSIFICATIONREFERENCE($,'37.32','RAAM-DEUREN, OPENINGEN VOOR RAAM-DEUREN IN DAKEN (DRAAIEND\X2\201A\X0\ KLAPPEND, VALLEND)',#218,$,$);
#221=IFCCLASSIFICATIONREFERENCE($,'37.33','RAAM-DEUREN, OPENINGEN VOOR RAAM-DEUREN IN DAKEN (PIVOTEREND, WENTELEND)',#218,$,$);
#222=IFCCLASSIFICATIONREFERENCE($,'37.34','RAAM-DEUREN, OPENINGEN VOOR RAAM-DEUREN IN DAKEN (HORIZONTAAL SCHUIVEND EN/OF VOUWEND)',#218,$,$);
#223=IFCCLASSIFICATIONREFERENCE($,'37.35','RAAM-DEUREN, OPENINGEN VOOR RAAM-DEUREN IN DAKEN (VERTICAAL SCHUIVEND EN/OF VOUWEND, VERTICAAL ROLLEND)',#218,$,$);
#224=IFCCLASSIFICATIONREFERENCE($,'37.36','RAAM-DEUREN, OPENINGEN VOOR RAAM-DEUREN IN DAKEN (OMHOOG KANTELEND)',#218,$,$);
#225=IFCCLASSIFICATIONREFERENCE($,'37.38','RAAM-DEUREN, OPENINGEN VOOR RAAM-DEUREN IN DAKEN (OPENINGSWIJZE NIET GENOEMD IN 37.31/37.36)',#218,$,$);
#226=IFCCLASSIFICATIONREFERENCE($,'37.39','RAAM-DEUREN, OPENINGEN VOOR RAAM-DEUREN IN DAKEN (ONDERDELEN EN HULPSTUKKEN VOOR SCHRIJNWERK VOOR OPENINGEN IN BOVENBOUW)',#218,$,$);
#227=IFCCLASSIFICATIONREFERENCE($,'37.4-','RAMEN VOOR DAKEN, RAAMOPENINGEN IN DAKEN',#216,$,$);
#228=IFCCLASSIFICATIONREFERENCE($,'37.41','DAKLICHTEN BIJ PLATTE DAKEN (INBEGREPEN LICHTDOORLATENDE KOEPELS)',#227,$,$);
#229=IFCCLASSIFICATIONREFERENCE($,'37.42','DAKLANTAARNEN, NOORDERLICHTEN TOT AAN DAKNOK',#227,$,$);
#230=IFCCLASSIFICATIONREFERENCE($,'37.44','DAKRAMEN UITSPRINGEND OF INSPRINGEND TEN OPZICHTE VAN EEN HELLEND DAKVLAK',#227,$,$);
#231=IFCCLASSIFICATIONREFERENCE($,'37.45','DAKRAMEN IN DAKVLAK VAN HELLEND DAK',#227,$,$);
#232=IFCCLASSIFICATIONREFERENCE($,'37.47','LICHTDOORLATENDE BEGAANBARE DAKDELEN',#227,$,$);
#233=IFCCLASSIFICATIONREFERENCE($,'37.48','HOGER NIET GENOEMDE ELEMENTEN VAN 37.4-',#227,$,$);
#234=IFCCLASSIFICATIONREFERENCE($,'37.5','DEUREN TOEGANGEN TOT DAKEN, MET OF ZONDER AFSLIUTENDE ELEMENTEN',#216,$,$);
#235=IFCCLASSIFICATIONREFERENCE($,'37.6','DAKRANDEN',#216,$,$);
#236=IFCCLASSIFICATIONREFERENCE($,'37.8','HOGER NIET GENOEMDE ELEMENTEN VAN 37-',#216,$,$);
#237=IFCCLASSIFICATIONREFERENCE($,'37.9','HULPSTUKKEN EN ONDERDELEN VOOR ELEMENTEN VAN 37-',#216,$,$);
#238=IFCCLASSIFICATIONREFERENCE($,'38','HOGER NIET GENOEMDE ELEMENTEN VAN 3-',#98,$,$);
#239=IFCCLASSIFICATIONREFERENCE($,'39','HULPSTUKKEN EN ONDERDELEN VOOR ELEMENTEN VAN 3-',#98,$,$);
#240=IFCCLASSIFICATIONREFERENCE($,'4-','AFWERKING',#2,$,$);
#241=IFCCLASSIFICATIONREFERENCE($,'41','BUITENAFWERKING VOOR WANDEN',#240,$,$);
#242=IFCCLASSIFICATIONREFERENCE($,'42','BINNENAFWERKING VOOR WANDEN',#240,$,$);
#243=IFCCLASSIFICATIONREFERENCE($,'43','AFWERKING VOOR VLOEREN',#240,$,$);
#244=IFCCLASSIFICATIONREFERENCE($,'44','AFWERKING VOOR ELEMENTEN VOOR VERTICALE CIRCULATIE',#240,$,$);
#245=IFCCLASSIFICATIONREFERENCE($,'45','AFWERKING VOOR PLAFONDS',#240,$,$);
#246=IFCCLASSIFICATIONREFERENCE($,'47','BUITENAFWERKING VOOR DAKEN',#240,$,$);
#247=IFCCLASSIFICATIONREFERENCE($,'48','HOGER NIET GENOEMDE ELEMENTEN VAN 4-',#240,$,$);
#248=IFCCLASSIFICATIONREFERENCE($,'49','HULPSTUKKEN EN ONDERDELEN VOOR ELEMENTEN VAN 4-',#240,$,$);
#249=IFCCLASSIFICATIONREFERENCE($,'5-','TECHNISCHE UITRUSTING HOOFDZAKELIJK FLU\X2\00CF\X0\DA',#2,$,$);
#250=IFCCLASSIFICATIONREFERENCE($,'5-.-X','UITRUSTING INGEDEELD VOLGENS ENERGIEDRAGER',#249,'WAAR NODIG KUNNEN DE CODES VAN (5-.-X) WORDEN AANGEVULD MET EEN VIERDE CIJFER DAT DE ENERGIEDRAGER BESCHRIJFT. DEZE CLASSIFICATIE IS ALLEEN BEDOELD ALS BRON VOOR EIGEN AAN TE MAKEN CLASSIFICATIES DIE NAAR EEN ENERGIEDRAGER VERWIJZEN.',$);
#251=IFCCLASSIFICATIONREFERENCE($,'5.1','ENERGIEBRON VOOR INSTALLATIES',#250,$,$);
#252=IFCCLASSIFICATIONREFERENCE($,'5-.-1','VASTE BRANDSTOF',#251,$,$);
#253=IFCCLASSIFICATIONREFERENCE($,'5-.-2','VLOEIBARE BRANDSTOF',#251,$,$);
#254=IFCCLASSIFICATIONREFERENCE($,'5-.-3','GASVORMIGE BRANDSTOF',#251,$,$);
#255=IFCCLASSIFICATIONREFERENCE($,'5-.-4','ELEKTRICITEIT',#251,$,$);
#256=IFCCLASSIFICATIONREFERENCE($,'5-.-5','ZONNESTRALING',#251,$,$);
#257=IFCCLASSIFICATIONREFERENCE($,'5-.-6','HOGER NIET GENOEMDE WARMTEBRONNEN',#251,$,$);
#258=IFCCLASSIFICATIONREFERENCE($,'5.2','GE\X2\00CF\X0\NTEGREERDE INSTALLATIES',#250,$,$);
#259=IFCCLASSIFICATIONREFERENCE($,'5.7','UITRUSTING LOKAAL, CENTRAAL, OP NIVEAU VAN DE WIJK, VOOR GROTER GEHEEL',#250,$,$);
#260=IFCCLASSIFICATIONREFERENCE($,'52-','AFVALAFVOER, (UITRUSTING VOOR-)',#249,$,$);
#261=IFCCLASSIFICATIONREFERENCE($,'52.1-','AFVOER VOOR VAST AFVAL',#260,$,$);
#262=IFCCLASSIFICATIONREFERENCE($,'52.13','AFVOER VOOR VAST AFVAL (DROOG VERVOER)',#261,$,$);
#263=IFCCLASSIFICATIONREFERENCE($,'52.14','AFVOER VOOR VAST AFVAL (MANUEEL VERVOER)',#261,$,$);
#264=IFCCLASSIFICATIONREFERENCE($,'52.18','AFVOER VOOR VASTE ATVAL HOGER NIET GENOEMD IN 52.1-\X2\201A\X0\ INBEGREPEN AFVALVERNIETIGING',#261,$,$);
#265=IFCCLASSIFICATIONREFERENCE($,'52.2','AFVOER VOOR GASVORMIGE AFVAL VIA KANAAL',#260,$,$);
#266=IFCCLASSIFICATIONREFERENCE($,'52.3/52.5','VLOEISTOFAFVOER VOLGENS HUN AARD',#260,$,$);
#267=IFCCLASSIFICATIONREFERENCE($,'52.3','AFVALWATERAFVOER',#266,$,$);
#268=IFCCLASSIFICATIONREFERENCE($,'52.4','AFVOER VOOR SPECIALE AFVAL VLOEISTOFFEN',#266,$,$);
#269=IFCCLASSIFICATIONREFERENCE($,'52.5','AFVOER VOOR HEMELWATER',#266,$,$);
#270=IFCCLASSIFICATIONREFERENCE($,'52.6/52.7','VLOEISTOFFENAFVOER VOLGENS POSITIE',#260,$,$);
#271=IFCCLASSIFICATIONREFERENCE($,'52.6','AFVOER BOVEN HET MAAIVELD EN GELEGEN OFWEL IN HET GEBOUW OFWEL TEGEN DE BUITENKANT ERVAN',#270,$,$);
#272=IFCCLASSIFICATIONREFERENCE($,'52.7','AFVOER IN DE GROND EN GELEGEN OFWEL ONDER HET GEBOUW OFWEL TEGEN DE BUITENKANT ERVAN',#270,$,$);
#273=IFCCLASSIFICATIONREFERENCE($,'52.8','HOGER NIET GENOEMDE ELEMENTEN VAN 52-',#260,$,$);
#274=IFCCLASSIFICATIONREFERENCE($,'52.9','HULPSTUKKEN EN ONDERDELEN VOOR ELEMENTEN VAN 52-',#260,$,$);
#275=IFCCLASSIFICATIONREFERENCE($,'53-','VLOEISTOFFENTOEVOER (UITRUSTING VOOR -)',#249,$,$);
#276=IFCCLASSIFICATIONREFERENCE($,'53.1/53.6','WATERTOEVOER',#275,$,$);
#277=IFCCLASSIFICATIONREFERENCE($,'53.1','TOEVOER VAN KOUD WATER',#276,$,$);
#278=IFCCLASSIFICATIONREFERENCE($,'53.3/53.5','TOEVOER VAN WARM WATER',#276,$,$);
#279=IFCCLASSIFICATIONREFERENCE($,'53.3','TOEVOER VAN WARM WATER UIT EEN CENTRALE VERWARMINGSINSTALLATIE',#278,$,$);
#280=IFCCLASSIFICATIONREFERENCE($,'53.5','TOEVOER VAN WARM WATER UIT VERWARMINGSINSTALLATIE BIJ VERBRUIKSPUNT',#278,$,$);
#281=IFCCLASSIFICATIONREFERENCE($,'53.6','TOEVOER VAN BEHANDELD WATER',#276,$,$);
#282=IFCCLASSIFICATIONREFERENCE($,'53.7/53.8 VLOEISTOFFENTOEVOER EXCLUSIEF WATER',$,#276,$,$);
#283=IFCCLASSIFICATIONREFERENCE($,'53.7','TOEVOER VAN VLOEIBARE BRANDSTOFFEN',#282,$,$);
#284=IFCCLASSIFICATIONREFERENCE($,'53.8','VLOEISTOFFENTOEVOER HOGER NIET GENOEMD IN 53-',#282,$,$);
#285=IFCCLASSIFICATIONREFERENCE($,'53.9','HULPSTUKKEN EN ONDERDELEN VOOR ELEMENTEN VAN 53-',#275,$,$);
#286=IFCCLASSIFICATIONREFERENCE($,'55-','KOELING (UITRUSTING VOOR -)',#249,$,$);
#287=IFCCLASSIFICATIONREFERENCE($,'55.1','CENTRALE KOELINSTALLATIE',#286,$,$);
#288=IFCCLASSIFICATIONREFERENCE($,'55.5','LOKALE KOELINSTALLATIE',#286,$,$);
#289=IFCCLASSIFICATIONREFERENCE($,'55.8','HOGER NIET GENOEMDE ELEMENTEN VAN 55-',#286,$,$);
#290=IFCCLASSIFICATIONREFERENCE($,'55.9','HULPSTUKKEN EN ONDERDELEN VOOR ELEMENTEN VAN 55-',#286,$,$);
#291=IFCCLASSIFICATIONREFERENCE($,'54-','GASTOEVOER (UITRUSTING VOOR -)',#286,$,$);
#292=IFCCLASSIFICATIONREFERENCE($,'54.1/54.4','GASTOEVOER',#291,$,$);
#293=IFCCLASSIFICATIONREFERENCE($,'54.1','TOEVOER VAN BRANDBAAR GAS',#292,$,$);
#294=IFCCLASSIFICATIONREFERENCE($,'54.2','TOEVOER VAN STOOM',#292,$,$);
#295=IFCCLASSIFICATIONREFERENCE($,'54.3','TOEVOER VAN LUCHT',#292,$,$);
#296=IFCCLASSIFICATIONREFERENCE($,'54.4','TOEVOER VAN GASSEN, HOGER NIET GENOEMD IN 54.1/54.3',#292,$,$);
#297=IFCCLASSIFICATIONREFERENCE($,'54.5','"TOEVOER" VAN VACU\X2\00DC\X0\M',#291,$,$);
#298=IFCCLASSIFICATIONREFERENCE($,'54.8','HOGER NIET GENOEMDE ELEMENTEN VAN 54-',#291,$,$);
#299=IFCCLASSIFICATIONREFERENCE($,'54.9','HULPSTUKKEN EN ONDERDELEN VOOR ELEMENTEN VAN 54-',#291,$,$);
#300=IFCCLASSIFICATIONREFERENCE($,'56-','VERWARMING (UITRUSTING VOOR -)',#249,$,$);
#301=IFCCLASSIFICATIONREFERENCE($,'56.1-','VERWARMING VOLGENS ENERGIEVORM',#300,'DEZE CODE WORDT GEBRUIKT INDIEN DE INDELING VAN 56.2/56.8 NIET RELEVANT WORDT GEACHT. DEZE CODE WORDT INGEDEELD MET EEN VIERDE CIJLER 56.1?',$);
#302=IFCCLASSIFICATIONREFERENCE($,'56.11','VERWARMING, VASTE BRANDSTOF',#301,$,$);
#303=IFCCLASSIFICATIONREFERENCE($,'56.12','VERWARMING, VLOEIBARE BRANDSTOF',#301,$,$);
#304=IFCCLASSIFICATIONREFERENCE($,'56.13','VERWARMING, GASVORMIGE BRANDSTOF',#301,$,$);
#305=IFCCLASSIFICATIONREFERENCE($,'56.14','VERWARMING, ELEKTRICITEIT',#301,$,$);
#306=IFCCLASSIFICATIONREFERENCE($,'56.15','VERWARMING, ZONNESTRALING',#301,$,$);
#307=IFCCLASSIFICATIONREFERENCE($,'56.16','VERWARMING, HOGER NIET GENOEMDE WARMTEBRONNEN',#301,$,$);
#308=IFCCLASSIFICATIONREFERENCE($,'56.2','WIJKVERWARMING',#300,$,$);
#309=IFCCLASSIFICATIONREFERENCE($,'56.3','CENTRALE VERWARMING',#300,'DEZE CODE WORDT GEBRUIKT INDIEN DE INDELING VOLGENS 56.4 TOT 56.7 NIET RELEVANT WORDT GEACHT.',$);
#310=IFCCLASSIFICATIONREFERENCE($,'56.4/56.7','CENTRALE VERWARMING',#300,$,$);
#311=IFCCLASSIFICATIONREFERENCE($,'56.4','CENTRALE VERWARMING, WARMTEDISTRIBUTIE MET WARM WATER OF STOOM',#310,$,$);
#312=IFCCLASSIFICATIONREFERENCE($,'56.5','CENTRALE VERWARMING, WARMTEDLSTRIBUTIE MET WARME LUCHT',#310,$,$);
#313=IFCCLASSIFICATIONREFERENCE($,'56.6','WARMTEDISTRIBUTIE VIA ELEKTRISCHE LEIDINGEN',#310,$,$);
#314=IFCCLASSIFICATIONREFERENCE($,'56.7','CENTRALE VERWARMING HOGER NIET GENOEMD IN 56.4/56.6',#310,$,$);
#315=IFCCLASSIFICATIONREFERENCE($,'56.8','LOKALE WARMTEPRODUKTIE, HOGER NIET GENOEMDE ELEMENTEN VAN 56-',#300,$,$);
#316=IFCCLASSIFICATIONREFERENCE($,'56.9','HULPSTUKKEN EN ONDERDELEN VOOR ELEMENTEN VAN 56-',#300,$,$);
#317=IFCCLASSIFICATIONREFERENCE($,'57-','LUCHTBEHANDELING EN VENTILATIE (INSTALLATIES VOOR \X2\2014\X0\)',#249,$,$);
#318=IFCCLASSIFICATIONREFERENCE($,'57.1/57.4 INSTALLATIES VOOR LUCHTVERWARMING (EN KOELING) INCLUSIEF BEHANDELING',$,#317,$,$);
#319=IFCCLASSIFICATIONREFERENCE($,'57.1','CENTRALE INSTALLATIE VOOR LUCHTVERWARMING EN KOELING INCLUSIEF BEHANDELING',#318,$,$);
#320=IFCCLASSIFICATIONREFERENCE($,'57.2','CENTRALE INSTALLATIE VOOR LUCHTVERWARMING ZONDER KOELING INCLUSIEF BEHANDELING',#318,$,$);
#321=IFCCLASSIFICATIONREFERENCE($,'57.3','LOKALE INSTALLATIE VOOR LUCHTVERWARMING EN KOELING INCLUSIEF BEHANDELING',#318,$,$);
#322=IFCCLASSIFICATIONREFERENCE($,'57.4','LOKALE INSTALLATIE VOOR LUCHTVERWARMLNG ZONDER KOELING INCLUSIEF BEHANDELING',#318,$,$);
#323=IFCCLASSIFICATIONREFERENCE($,'57.5','INSTALLATIE VOOR LUCHTBEHANDELING ZONDER KOELEN OF VERWARMEN EN INSTALLATIES DIE KOELEN ENVERWARMEN COMBINEREN ZONDER LUCHTBEHANDELING',#317,$,$);
#324=IFCCLASSIFICATIONREFERENCE($,'57.6/57.7','INSTALLATIES VOOR VENTILATIE (NIET BEHANDELDE LUCHT)',#317,$,$);
#325=IFCCLASSIFICATIONREFERENCE($,'57.6','GEDWONGEN CENTRALE VENTILATIE ZONDER BEHANDELING',#324,$,$);
#326=IFCCLASSIFICATIONREFERENCE($,'57.7','GEDWONGEN LOKALE VENTILATIE',#324,$,$);
#327=IFCCLASSIFICATIONREFERENCE($,'57.8','HOGER NIET GENOEMDE ELEMENTEN VAN 57-',#317,$,$);
#328=IFCCLASSIFICATIONREFERENCE($,'57.9','HULPSTUKKEN EN ONDERDELEN VOOR ELEMENTEN VAN 57-',#317,$,$);
#329=IFCCLASSIFICATIONREFERENCE($,'58','HOGER NIET GENOEMDE ELEMENTEN VAN 5-',#249,$,$);
#330=IFCCLASSIFICATIONREFERENCE($,'59','HULPSTUKKEN EN ONDERDELEN VOOR ELEMENTEN VAN 5-',#249,$,$);
#331=IFCCLASSIFICATIONREFERENCE($,'6-','TECHNISCHE UITRUSTING HOOFDZAKELIJK ELEKTRISCH',#2,$,$);
#332=IFCCLASSIFICATIONREFERENCE($,'61-','PRIMAIRE ELEKTRICITEITSNET',#331,$,$);
#333=IFCCLASSIFICATIONREFERENCE($,'61.1/61.3','ELEKTRICITEITSVERDELING VOLGENS VERLOOP IN HET GEBOUW',#332,$,$);
#334=IFCCLASSIFICATIONREFERENCE($,'61.1','RADIAALVERDELING',#333,$,$);
#335=IFCCLASSIFICATIONREFERENCE($,'61.2','RINGVERDELING',#333,$,$);
#336=IFCCLASSIFICATIONREFERENCE($,'61.3','STIJGLEIDINGEN',#333,$,$);
#337=IFCCLASSIFICATIONREFERENCE($,'61.6/61.7','ELEKTRICITEITSVERDELING VOLGENS PRODUCENT',#332,$,$);
#338=IFCCLASSIFICATIONREFERENCE($,'61.6','OPENBARE STROOMVOORZIENINGEN',#337,$,$);
#339=IFCCLASSIFICATIONREFERENCE($,'61.7','PRIV\X2\00C9\X0\-ELEKTRICITEITSPRODUKTIE',#337,$,$);
#340=IFCCLASSIFICATIONREFERENCE($,'61.8','HOGER NIET GENOEMDE ELEMENTEN VAN 61-',#332,$,$);
#341=IFCCLASSIFICATIONREFERENCE($,'61.9','HULPSTUKKEN EN ONDERDELEN VOOR ELEMENTEN VAN 61-',#332,$,$);
#342=IFCCLASSIFICATIONREFERENCE($,'62','SECUNDAIRE ELEKTRICITEITSNET',#331,$,$);
#343=IFCCLASSIFICATIONREFERENCE($,'63-','VERLICHTING (INSTALLATIE VOOR -)',#331,$,$);
#344=IFCCLASSIFICATIONREFERENCE($,'63.1','ALGEMENE VERLICHTING VAN RUIMTE',#343,$,$);
#345=IFCCLASSIFICATIONREFERENCE($,'63.2','PLAATSELIJKE VERLICHTING (DEEL VAN EEN RUIMTE)',#343,$,$);
#346=IFCCLASSIFICATIONREFERENCE($,'63.6','VERLICHTING DOOR MIDDEL VAN PROJECTOREN',#343,$,$);
#347=IFCCLASSIFICATIONREFERENCE($,'63.8','HOGER NIET GENOEMDE ELEMENTEN VAN 63',#343,$,$);
#348=IFCCLASSIFICATIONREFERENCE($,'63.9','HULPSTUKKEN EN ONDERDELEN VOOR ELEMENTEN VAN 63',#343,$,$);
#349=IFCCLASSIFICATIONREFERENCE($,'64-','COMMUNICATIE (INSTALLATIE VOOR -)',#331,$,$);
#350=IFCCLASSIFICATIONREFERENCE($,'64.1-','VISUELE EN AUDIO-VISUELE COMMUNICATIE (INSTALLATIES VOOR -)',#349,$,$);
#351=IFCCLASSIFICATIONREFERENCE($,'64.11','VISUELE EN AUDIO-VISUELE COMMUNICATIE (INSTALLATIES VOOR TELEVISIE)',#350,$,$);
#352=IFCCLASSIFICATIONREFERENCE($,'64.12','VISUELE EN AUDIO-VISUELE COMMUNICATIE (INSTALLATIES VOOR FILMPROJECTIE)',#350,$,$);
#353=IFCCLASSIFICATIONREFERENCE($,'64.13','VISUELE EN AUDIO-VISUELE COMMUNICATIE (INSTALLATIES VOOR LICHTSIGNALEN)',#350,$,$);
#354=IFCCLASSIFICATIONREFERENCE($,'64.18','HOGER NIET GENOEMDE ELEMENTEN VAN 64.1-',#350,$,$);
#355=IFCCLASSIFICATIONREFERENCE($,'64.3-','AUDITIEVE COMMUNICATIE (INSTALLATIES VOOR -)',#349,$,$);
#356=IFCCLASSIFICATIONREFERENCE($,'64.31','AUDITIEVE COMMUNICATIE (INSTALLATIES VOOR RADIO)',#355,$,$);
#357=IFCCLASSIFICATIONREFERENCE($,'64.32','AUDITIEVE COMMUNICATIE (INSTALLATIES VOOR TELEFOON EN INTERFOON INCLUSIEF OPENBARE TELEFOONCELLEN IN EEN GEBOUW)',#355,$,$);
#358=IFCCLASSIFICATIONREFERENCE($,'64.33','AUDITIEVE COMMUNICATIE (INSTALLATIES VOOR GELUIDSVERDELING)',#355,$,$);
#359=IFCCLASSIFICATIONREFERENCE($,'64.34','AUDITIEVE COMMUNICATIE (INSTALLATIES VOOR CENTRALE AFLUISTERINSTALLATIES)',#355,$,$);
#360=IFCCLASSIFICATIONREFERENCE($,'64.35','AUDITIEVE COMMUNICATIE (INSTALLATIES VOOR AUDITIEVE CODES)',#355,$,$);
#361=IFCCLASSIFICATIONREFERENCE($,'64.38','AUDITIEVE COMMUNICATIE (INSTALLATIES VOOR HOGER NIET GENOEMDE ELEMENTEN VAN 64.3-)',#355,$,$);
#362=IFCCLASSIFICATIONREFERENCE($,'64.4-','ANDERE DAN VISUELE OF AUDITIEVE COMMUNICATIE (INSTALLATIES VOOR -)',#349,$,$);
#363=IFCCLASSIFICATIONREFERENCE($,'64.41','ANDERE DAN VISUELE OF AUDITIEVE COMMUNICATIE (INSTALLATIES VOOR TELEGRAAF)',#362,$,$);
#364=IFCCLASSIFICATIONREFERENCE($,'64.42','ANDERE DAN VISUELE OF AUDITIEVE COMMUNICATIE (INSTALLATIES VOOR TELEX, TELEPRINT)',#362,$,$);
#365=IFCCLASSIFICATIONREFERENCE($,'64.43','ANDERE DAN VISUELE OF AUDITIEVE COMMUNICATIE (INSTALLATIES VOOR TELECOPIE)',#362,$,$);
#366=IFCCLASSIFICATIONREFERENCE($,'64.44','ANDERE DAN VISUELE OF AUDITIEVE COMMUNICATIE (INSTALLATIES VOOR DATATRANSMISSIE)',#362,$,$);
#367=IFCCLASSIFICATIONREFERENCE($,'64.48','ANDERE DAN VISUELE OF AUDITIEVE COMMUNICATIE (INSTALLATIES VOOR HOGER NIET GENOEMDE ELEMENTEN VAN 64.4-)',#362,$,$);
#368=IFCCLASSIFICATIONREFERENCE($,'64.5','SYNCHRONE KLOKKEN',#349,$,$);
#369=IFCCLASSIFICATIONREFERENCE($,'64.8','HOGER NIET GENOEMDE ELEMENTEN VAN 64-',#349,$,$);
#370=IFCCLASSIFICATIONREFERENCE($,'64.9','HULPSTUKKEN EN ONDERDELEN VOOR ELEMENTEN VAN 64-',#349,$,$);
#371=IFCCLASSIFICATIONREFERENCE($,'66-','TRANSPORTINSTALLATIES',#331,$,$);
#372=IFCCLASSIFICATIONREFERENCE($,'66.1/66.2','INSTALLATIES VOOR VERTICAAL TRANSPORT',#371,$,$);
#373=IFCCLASSIFICATIONREFERENCE($,'66.1','LIFTEN',#372,$,$);
#374=IFCCLASSIFICATIONREFERENCE($,'66.2','INSTALLATIES VOOR VERTLCAAL TRANSPORT ENKEL VOOR GOEDEREN',#372,$,$);
#375=IFCCLASSIFICATIONREFERENCE($,'66.3/66.7','INSTALLATIES VOOR HORIZONTAAL TRANSPORT OF HORIZONTAAL EN VERTICAAL TRANSPORT',#371,$,$);
#376=IFCCLASSIFICATIONREFERENCE($,'66.3','MOBIELE HANGSTEIGERS',#375,$,$);
#377=IFCCLASSIFICATIONREFERENCE($,'66.4','ROLTRAPPEN',#375,$,$);
#378=IFCCLASSIFICATIONREFERENCE($,'66.5','TRANSPORTBANDEN, TRANSPORTPLATEAUS',#375,$,$);
#379=IFCCLASSIFICATIONREFERENCE($,'66.7','TRANSPORTKRANEN',#375,$,$);
#380=IFCCLASSIFICATIONREFERENCE($,'66.8','HOGER NIET GENOEMDE ELEMENTEN VAN 66-',#371,$,$);
#381=IFCCLASSIFICATIONREFERENCE($,'66.9','HULPSTUKKEN EN ONDERDELEN VOOR ELEMENTEN VAN 66-',#371,$,$);
#382=IFCCLASSIFICATIONREFERENCE($,'68-','BEVEILIGINGSINSTALLATIES, CONTROLEINSTALLATIES, HOGER NIET GENOEMDE ELEMENTEN VAN 6-',#331,$,$);
#383=IFCCLASSIFICATIONREFERENCE($,'68.1/68.6','INSTALLATIES VOOR BEVEILIGING EN BESCHERMING',#382,$,$);
#384=IFCCLASSIFICATIONREFERENCE($,'68.1','GE\X2\00CF\X0\NTEGREERDE INBRAAK- EN BRANDBEVEILIGING',#383,$,$);
#385=IFCCLASSIFICATIONREFERENCE($,'68.2','INBRAAKBEVEILIGING',#383,$,$);
#386=IFCCLASSIFICATIONREFERENCE($,'68.5','BRANDBEVEILIGINGSINSTAILATIES',#383,$,$);
#387=IFCCLASSIFICATIONREFERENCE($,'68.52','BRANDMELDINGSINSTALLATIE',#386,$,$);
#388=IFCCLASSIFICATIONREFERENCE($,'68.53/68.56','BRANDBEVEILIGINGS- EN BRANDBESTR\X2\0132\X0\DINGSINSTALLATIE',#386,$,$);
#389=IFCCLASSIFICATIONREFERENCE($,'68.53','BEVEILIGINGSINSTALLATIE BIJ BRAND EXCLUSIEF BRANDBESTRIJDING',#388,$,$);
#390=IFCCLASSIFICATIONREFERENCE($,'68.54','AUTOMATISCHE BRANDBESTR\X2\0132\X0\DINGSINSTALLATIE',#388,$,$);
#391=IFCCLASSIFICATIONREFERENCE($,'68.55','NIET-DRAAGBARE NIET-AUTOMATISCHE BRANDBESTRIJDINGSINSTALLATIE',#388,$,$);
#392=IFCCLASSIFICATIONREFERENCE($,'68.56','DRAAGBARE BRANDBESTRIJDINGSTOESTELLEN',#388,$,$);
#393=IFCCLASSIFICATIONREFERENCE($,'68.58','HOGER NIET GENOEMDE ELEMENTEN VAN 68.5-',#386,$,$);
#394=IFCCLASSIFICATIONREFERENCE($,'68.6','BEVEILLGINGSINSTALLATIES NIET GENOEMD IN 68.1/68.5',#383,$,$);
#395=IFCCLASSIFICATIONREFERENCE($,'68.7','CONTROLE-UITRUSTING (INBEGREPEN STURING EN CONTROLE VAN PROCESSEN)',#382,$,$);
#396=IFCCLASSIFICATIONREFERENCE($,'68.8','HOGER NIET GENOEMDE ELEMENTEN VAN 68-',#382,$,$);
#397=IFCCLASSIFICATIONREFERENCE($,'68.9','HULPSTUKKEN EN ONDERDELEN VOOR ELEMENTEN VAN 68',#382,$,$);
#398=IFCCLASSIFICATIONREFERENCE($,'69','HULPSTUKKEN EN ONDERDELEN VOOR ELEMENTEN VAN 6-',#331,$,$);
#399=IFCCLASSIFICATIONREFERENCE($,'7-','VASTE INRICHTING',#2,$,$);
#400=IFCCLASSIFICATIONREFERENCE($,'71-','VASTE INRICHTING VOOR CIRCULATIE',#399,$,$);
#401=IFCCLASSIFICATIONREFERENCE($,'71.1','VASTE AANDUIDINGEN, WEGWIJZERS',#400,$,$);
#402=IFCCLASSIFICATIONREFERENCE($,'71.2','VASTE ELEMENTEN DIE CIRCULATIE AFBAKENEN',#400,$,$);
#403=IFCCLASSIFICATIONREFERENCE($,'71.3','VASTE INRICHTING IN VERBAND MET DE TOEGANG TOT GEBOUWEN',#400,$,$);
#404=IFCCLASSIFICATIONREFERENCE($,'71.8','HOGER NIET GENOEMDE ELEMENTEN VAN 71-',#400,$,$);
#405=IFCCLASSIFICATIONREFERENCE($,'71.9','HULPSTUKKEN EN ONDERDELEN VOOR ELEMENTEN VAN 71-',#400,$,$);
#406=IFCCLASSIFICATIONREFERENCE($,'72-','VASTE INRICHTING VOOR RUSTEN EN WERKEN',#399,$,$);
#407=IFCCLASSIFICATIONREFERENCE($,'72.1','VASTE INRICHTING VOOR SLAPEN',#406,$,$);
#408=IFCCLASSIFICATIONREFERENCE($,'72.2','VASTE INRICHTING VOOR RUSTEN',#406,$,$);
#409=IFCCLASSIFICATIONREFERENCE($,'72.3','VASTE INRICHTING VOOR WERKEN',#406,$,$);
#410=IFCCLASSIFICATIONREFERENCE($,'72.6','VASTE BANKEN, STOELEN, ZETELS EN TAFELS VOOR RUSTEN EN WERKEN',#406,$,$);
#411=IFCCLASSIFICATIONREFERENCE($,'72.8','HOGER NIET GENOEMDE ELEMENTEN VAN 7-',#406,$,$);
#412=IFCCLASSIFICATIONREFERENCE($,'72.9','HULPSTUKKEN EN ONDERDELEN VOOR ELEMENTEN VAN 72-',#406,$,$);
#413=IFCCLASSIFICATIONREFERENCE($,'73-','VASTE INRICHTING VOOR HET BEREIDEN EN GEBRUIKEN VAN MAALTIJDEN',#399,$,$);
#414=IFCCLASSIFICATIONREFERENCE($,'73.1','VASTE WERKBLADEN EN INRICHTING VOOR HET BEREIDEN VAN MAALTIJDEN',#413,$,$);
#415=IFCCLASSIFICATIONREFERENCE($,'73.2','VASTE INRICHTING VOOR WASSEN EN SPOELEN',#413,$,$);
#416=IFCCLASSIFICATIONREFERENCE($,'73.4','VASTE TOESTELLEN VOOR VOEDSELBEREIDING EN KOKEN',#413,$,$);
#417=IFCCLASSIFICATIONREFERENCE($,'73.5','VASTE KEUKENTOESTELLEN VOOR BERGING EN BEWARING',#413,$,$);
#418=IFCCLASSIFICATIONREFERENCE($,'73.7','VASTE INRICHTING VOOR VERBRUIKERS VAN MAALTIJDEN',#413,$,$);
#419=IFCCLASSIFICATIONREFERENCE($,'73.8','HOGER NIET GENOEMDE ELEMENTEN VAN 73-',#413,$,$);
#420=IFCCLASSIFICATIONREFERENCE($,'73.9','HULPSTUKKEN EN ONDERDELEN VOOR ELEMENTEN VAN 73-',#413,$,$);
#421=IFCCLASSIFICATIONREFERENCE($,'74-','SANITAIRE UITRUSTING',#399,$,$);
#422=IFCCLASSIFICATIONREFERENCE($,'74.1','GEHEEL VAN SANITAIRE TOESTELLEN',#421,$,$);
#423=IFCCLASSIFICATIONREFERENCE($,'74.2','TOESTELLEN VOOR LICHAAMSHYGI\X2\00CB\X0\NE',#421,$,$);
#424=IFCCLASSIFICATIONREFERENCE($,'74.2-','TOESTELLEN VOOR LICHAAMSHYGI\X2\00CB\X0\NE',#421,$,$);
#425=IFCCLASSIFICATIONREFERENCE($,'74.22','BADEN',#424,$,$);
#426=IFCCLASSIFICATIONREFERENCE($,'74.23','LAVABO\X2\2019\X0\S, HANDWASBEKKENS',#424,$,$);
#427=IFCCLASSIFICATIONREFERENCE($,'74.24','BIDETS, VOETWASBEKKENS',#424,$,$);
#428=IFCCLASSIFICATIONREFERENCE($,'74.26','DOUCHETOESTELLEN',#424,$,$);
#429=IFCCLASSIFICATIONREFERENCE($,'74.27','SAUNATOESTELLEN',#424,$,$);
#430=IFCCLASSIFICATIONREFERENCE($,'74.28','HOGER NIET GENOEMDE ELEMENTEN VAN 74.2-',#424,$,$);
#431=IFCCLASSIFICATIONREFERENCE($,'74.3','VASTE SANITAIRE TOESTELLEN VOOR HET DROGEN',#421,$,$);
#432=IFCCLASSIFICATIONREFERENCE($,'74.4','TOESTELLEN VOOR AFVOER VAN UITWERPSELEN',#421,$,$);
#433=IFCCLASSIFICATIONREFERENCE($,'74.4-','TOESTELLEN VOOR AFVOER VAN UITWERPSELEN',#421,$,$);
#434=IFCCLASSIFICATIONREFERENCE($,'74.44','WC''s',#433,$,$);
#435=IFCCLASSIFICATIONREFERENCE($,'74.45','URINOIRS',#433,$,$);
#436=IFCCLASSIFICATIONREFERENCE($,'74.48','HOGER NIEL GENOEMDE ELEMENTEN VAN 74.4-',#433,$,$);
#437=IFCCLASSIFICATIONREFERENCE($,'74.7','TOESTELLEN VOOR VERDELING VAN ZEEP, VAN HANDDOEKEN, VAN PAPIER VOOR LICHAAMSHYGI\X2\00CB\X0\NE',#421,$,$);
#438=IFCCLASSIFICATIONREFERENCE($,'74.8','HOGER NIET GENOEMDE ELEMENLEN VAN 74-',#421,$,$);
#439=IFCCLASSIFICATIONREFERENCE($,'74.9','HULPSTUKKEN EN ONDERDELEN VOOR ELEMENTEN VAN 74-',#421,$,$);
#440=IFCCLASSIFICATIONREFERENCE($,'75-','VASTE INRICHTING VOOR ONDERHOUD EN SCHOONMAAK',#399,$,$);
#441=IFCCLASSIFICATIONREFERENCE($,'75.1','VASTE WASINRICHTING, VASTE WASTOBBEN',#440,$,$);
#442=IFCCLASSIFICATIONREFERENCE($,'75.3','DROOGTOESTELLEN',#440,$,$);
#443=IFCCLASSIFICATIONREFERENCE($,'75.4','VASTE STRIJKINRICHTING',#440,$,$);
#444=IFCCLASSIFICATIONREFERENCE($,'75.8','HOGER NIET GENOEMDE ELEMENTEN VAN 75-',#440,$,$);
#445=IFCCLASSIFICATIONREFERENCE($,'75.9','HULPSTUKKEN EN ONDERDELEN VOOR ELEMENTEN VAN 75-',#440,$,$);
#446=IFCCLASSIFICATIONREFERENCE($,'76-','VASTE INRICHTING VOOR BERGING EN AFSCHERMING',#399,$,$);
#447=IFCCLASSIFICATIONREFERENCE($,'76.1/76.6 VASTE INRICHTING VOOR BERGING',$,#446,$,$);
#448=IFCCLASSIFICATIONREFERENCE($,'76.1','VASTE KASTEN SAMENGESTELD UIT MEERDERE ELEMENTEN DIE BESTAAN UIT LADES, REKKEN, AFSLUITBARE KASTDELEN, \X2\2026\X0\',#447,$,$);
#449=IFCCLASSIFICATIONREFERENCE($,'76.2','VASTE AFSLUITBARE KASTEN',#447,$,$);
#450=IFCCLASSIFICATIONREFERENCE($,'76.3','VASTE LADENKASTEN',#447,$,$);
#451=IFCCLASSIFICATIONREFERENCE($,'76.4','VASTE REKKEN',#447,$,$);
#452=IFCCLASSIFICATIONREFERENCE($,'76.5','VASTE HANGSYSTEMEN VOOR BERGING',#447,$,$);
#453=IFCCLASSIFICATIONREFERENCE($,'76.6','KASTEN MET SPECIALE EIGENSCHAPPEN, VASTE INRICHTING VOOR BERGING HOGER NIET GENOEMD IN 76.1/76.5',#447,$,$);
#454=IFCCLASSIFICATIONREFERENCE($,'76.7','SCHERMEN',#446,$,$);
#455=IFCCLASSIFICATIONREFERENCE($,'76.8','HOGER NIET GENOEMDE ELEMENTEN VAN 76-',#446,$,$);
#456=IFCCLASSIFICATIONREFERENCE($,'76.9','HULPSTUKKEN EN ONDERDELEN VOOR ELEMENTEN VAN 76-',#446,$,$);
#457=IFCCLASSIFICATIONREFERENCE($,'77','VASTE INRICHTING VOOR SPECIALE ACTIVITEITEN',#399,$,$);
#458=IFCCLASSIFICATIONREFERENCE($,'78-','HOGER NIET GENOEMDE ELEMENTEN VAN 7-',#399,$,$);
#459=IFCCLASSIFICATIONREFERENCE($,'78.3','STOFFERINGEN, INCLUSIEF BEHANGWERKEN',#458,$,$);
#460=IFCCLASSIFICATIONREFERENCE($,'78.6','KUNSTWERKEN',#458,$,$);
#461=IFCCLASSIFICATIONREFERENCE($,'79','HULPSTUKKEN EN ONDERDELEN VOOR ELEMENTEN VAN 7-',#399,$,$);
#462=IFCCLASSIFICATIONREFERENCE($,'8-','LOSSE INRICHTING',#2,$,$);
#463=IFCCLASSIFICATIONREFERENCE($,'81','LOSSE INRICHTING VOOR CIRCULATIE',#462,$,$);
#464=IFCCLASSIFICATIONREFERENCE($,'82','LOSSE INRICHTING VOOR RUSTEN EN WERKEN',#462,$,$);
#465=IFCCLASSIFICATIONREFERENCE($,'83','LOSSE INRICHTING VOOR BEREIDEN EN VERBRUIKEN VAN MAALT\X2\0132\X0\DEN',#462,$,$);
#466=IFCCLASSIFICATIONREFERENCE($,'84','LOSSE INRICHTING VOOR SANITAIRE TOEPASSINGEN, VOOR HYGIENE',#462,$,$);
#467=IFCCLASSIFICATIONREFERENCE($,'85','LOSSE INRICHTING VOOR ONDERHOUD EN SCHOONMAAK',#462,$,$);
#468=IFCCLASSIFICATIONREFERENCE($,'86','LOSSE INRICHTING VOOR BERGING EN AFSCHERIMING',#462,$,$);
#469=IFCCLASSIFICATIONREFERENCE($,'87','LOSSE INRICHTING VOOR SPECIALE ACTIVITEITEN',#462,$,$);
#470=IFCCLASSIFICATIONREFERENCE($,'88','HOGER NIET GENOEMDE ELEMENTEN VAN 8-',#462,$,$);
#471=IFCCLASSIFICATIONREFERENCE($,'89','HULPSTUKKEN EN ONDERDELEN VOOR ELEMENTEN VAN 8-',#462,$,$);
#472=IFCCLASSIFICATIONREFERENCE($,'9-','ELEMENTEN BUITEN HET GEBOUW, HOGER NIET GENOEMDE ELEMENTEN',#2,$,$);
#473=IFCCLASSIFICATIONREFERENCE($,'90','ELEMENTEN BUITEN HET GEBOUW',#472,$,$);
#474=IFCCLASSIFICATIONREFERENCE($,'90.1','BODEM VOORBEREID BUITEN HET GEBOUW, INDIEN NIET VERMELD ONDER 1-',#473,$,$);
#475=IFCCLASSIFICATIONREFERENCE($,'90.2','MINDER BELANGRIJKE CONSTRUCTIES BUITEN HET GEBOUW, INDIEN NIET VERMELD BIJ 1-/8-',#473,$,$);
#476=IFCCLASSIFICATIONREFERENCE($,'90.3','AFSLUITINGEN BUITEN HET GEBOUW INDIEN NIET VERMED ONDER 1-/3-',#473,$,$);
#477=IFCCLASSIFICATIONREFERENCE($,'90.4-','AFWERKING VAN BODEMOPPERVLAK BUITEN HET GEBOUW INDIEN NIET VERMELD ONDER 1-',#473,$,$);
#478=IFCCLASSIFICATIONREFERENCE($,'90.41','HARDE BODEMAFWERKING BUITEN HET GEBOUW',#477,$,$);
#479=IFCCLASSIFICATIONREFERENCE($,'90.42','ZACHTE BODEMAFWERKING BUITEN HET GEBOUW',#477,$,$);
#480=IFCCLASSIFICATIONREFERENCE($,'90.43','OPPERVLAKKEN ONDER WATER BUITEN HET GEBOUW',#477,$,$);
#481=IFCCLASSIFICATIONREFERENCE($,'90.48','HOGER NIET GENOEMDE ELEMENTEN VAN 90.4-',#477,$,$);
#482=IFCCLASSIFICATIONREFERENCE($,'90.5-','UITRUSTING HOOFDZAKELIJK FLUIDA BUITEN HET GEBOUW INDIEN NIET VERMED ONDER 5-',#473,$,$);
#483=IFCCLASSIFICATIONREFERENCE($,'90.51','DRAINAGE, AFVALWATERAFVOER BUITEN HET GEBOUW',#482,$,$);
#484=IFCCLASSIFICATIONREFERENCE($,'90.52','UITRUSTING HOOFDZAKELIJK FLUIDA BUITEN HET GEBOUW EXCLUSIEF DRAINAGE EN AFVALWATERAFVOER',#482,$,$);
#485=IFCCLASSIFICATIONREFERENCE($,'90.6','UITRUSTING HOOFDZAKELIJK ELEKTRISCH BUITEN HET GEBOUW INDIEN NIET VERMELD ONDER 6-',#473,$,$);
#486=IFCCLASSIFICATIONREFERENCE($,'90.7','VASTE EN LOSSE INRICHTING BUITEN HET GEBOUW, INDIEN NIET VERMELD ONDER 7-/8-',#473,$,$);
#487=IFCCLASSIFICATIONREFERENCE($,'90.8','HOGER NIET GENOEMDE ELEMENTEN VAN 90',#473,$,$);
#488=IFCCLASSIFICATIONREFERENCE($,'98','ELEMENTEN VAN TABEL1 HOGER NIET GENOEMD IN 0-/97',#472,$,$);
#489=IFCCLASSIFICATIONREFERENCE($,'99','HULPSTUKKEN EN ONDERDELEN VOOR ELEMENTEN VAN TABEL 1',#472,$,$);
ENDSEC;
END-ISO-10303-21;
@@ -0,0 +1,357 @@
ISO-10303-21;
HEADER;
FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1');
FILE_NAME('','2020-04-23T18:09:27',(),(),'IfcOpenShell 0.6.0b0','IfcOpenShell 0.6.0b0','');
FILE_SCHEMA(('IFC4'));
ENDSEC;
DATA;
#1=IFCPROJECTLIBRARY($,$,'BIMTypeCode',$,$,$,$,$,$);
#2=IFCCLASSIFICATION('BIMStockholm','V.1.0','2018-10-12','BIMTypeCode','BIMTypeCode is a simple and logical coding structure of building elements based on the adviser''s design requirements, experience and best practice from complex to manageable BIM projects.','http://bimstockholm.se/EN',$);
#3=IFCRELASSOCIATESCLASSIFICATION('110oGrgYT2UBdqzWMbly1U',$,$,$,(#1),#2);
#4=IFCCLASSIFICATIONREFERENCE($,'0','Generiska objekt',#2,$,$);
#5=IFCCLASSIFICATIONREFERENCE($,'01','Generiska objekt A',#4,$,$);
#6=IFCCLASSIFICATIONREFERENCE($,'02','Generiska objekt K',#4,$,$);
#7=IFCCLASSIFICATIONREFERENCE($,'03','Generiska objekt V',#4,$,$);
#8=IFCCLASSIFICATIONREFERENCE($,'04','Generiska objekt W',#4,$,$);
#9=IFCCLASSIFICATIONREFERENCE($,'05','Generiska objekt E',#4,$,$);
#10=IFCCLASSIFICATIONREFERENCE($,'06','Generiska objekt L',#4,$,$);
#11=IFCCLASSIFICATIONREFERENCE($,'07','Generiska objekt P',#4,$,$);
#12=IFCCLASSIFICATIONREFERENCE($,'1','Grundl\X2\00E4\X0\ggning',#2,$,$);
#13=IFCCLASSIFICATIONREFERENCE($,'10','Terr\X2\00E4\X0\ng',#12,$,$);
#14=IFCCLASSIFICATIONREFERENCE($,'101','Bearbetad undergrund',#13,$,$);
#15=IFCCLASSIFICATIONREFERENCE($,'102','Bygggrop inkl. f\X2\00F6\X0\rstyvande',#13,$,$);
#16=IFCCLASSIFICATIONREFERENCE($,'103','Spontning',#13,$,$);
#17=IFCCLASSIFICATIONREFERENCE($,'104','Byggplats',#13,$,$);
#18=IFCCLASSIFICATIONREFERENCE($,'11','P\X2\00E5\X0\lar',#12,$,$);
#19=IFCCLASSIFICATIONREFERENCE($,'111','Prefabricerade p\X2\00E5\X0\lar',#18,$,$);
#20=IFCCLASSIFICATIONREFERENCE($,'112','Platsgjutna p\X2\00E5\X0\lar',#18,$,$);
#21=IFCCLASSIFICATIONREFERENCE($,'119','P\X2\00E5\X0\lar \X2\00F6\X0\vrigt',#18,$,$);
#22=IFCCLASSIFICATIONREFERENCE($,'12','Fundament',#12,$,$);
#23=IFCCLASSIFICATIONREFERENCE($,'121','Grundsulor, kantbalk',#22,$,$);
#24=IFCCLASSIFICATIONREFERENCE($,'122','Grundplintar',#22,$,$);
#25=IFCCLASSIFICATIONREFERENCE($,'123','Grundplattor',#22,$,$);
#26=IFCCLASSIFICATIONREFERENCE($,'124','Murad fundament',#22,$,$);
#27=IFCCLASSIFICATIONREFERENCE($,'125','Maskinfundament',#22,$,$);
#28=IFCCLASSIFICATIONREFERENCE($,'126','P\X2\00E5\X0\lfundament',#22,$,$);
#29=IFCCLASSIFICATIONREFERENCE($,'127','Fundament i terr\X2\00E4\X0\ng',#22,$,$);
#30=IFCCLASSIFICATIONREFERENCE($,'13','Platta, byggnad',#12,$,$);
#31=IFCCLASSIFICATIONREFERENCE($,'131','Grundplatta',#30,$,$);
#32=IFCCLASSIFICATIONREFERENCE($,'18','Byggbasis byggnad, \X2\00F6\X0\vriga',#12,$,$);
#33=IFCCLASSIFICATIONREFERENCE($,'181','Kanaler under platta',#32,$,$);
#34=IFCCLASSIFICATIONREFERENCE($,'182','Gropar och tr\X2\00E4\X0\sk',#32,$,$);
#35=IFCCLASSIFICATIONREFERENCE($,'2','Prim\X2\00E4\X0\ra byggdelar',#2,$,$);
#36=IFCCLASSIFICATIONREFERENCE($,'20','Terr\X2\00E4\X0\ng',#35,$,$);
#37=IFCCLASSIFICATIONREFERENCE($,'201','Frist\X2\00E5\X0\ende murar',#36,$,$);
#38=IFCCLASSIFICATIONREFERENCE($,'202','St\X2\00F6\X0\dmurar',#36,$,$);
#39=IFCCLASSIFICATIONREFERENCE($,'203','Kulvertar',#36,$,$);
#40=IFCCLASSIFICATIONREFERENCE($,'204','G\X2\00E5\X0\ngbroar, viadukter mm.',#36,$,$);
#41=IFCCLASSIFICATIONREFERENCE($,'205','Trappor och ramper i terr\X2\00E4\X0\ng',#36,$,$);
#42=IFCCLASSIFICATIONREFERENCE($,'21','Ytterv\X2\00E4\X0\gg',#35,$,$);
#43=IFCCLASSIFICATIONREFERENCE($,'211','Prefabricerade element',#42,$,$);
#44=IFCCLASSIFICATIONREFERENCE($,'212','Platsgjutna v\X2\00E4\X0\ggar',#42,$,$);
#45=IFCCLASSIFICATIONREFERENCE($,'213','Uppmurade v\X2\00E4\X0\ggar',#42,$,$);
#46=IFCCLASSIFICATIONREFERENCE($,'214','Uppreglade v\X2\00E4\X0\ggar',#42,$,$);
#47=IFCCLASSIFICATIONREFERENCE($,'215','Uppreglade v\X2\00E4\X0\ggsk\X2\00F6\X0\rtar',#42,$,$);
#48=IFCCLASSIFICATIONREFERENCE($,'216','Fasadsystem',#42,$,$);
#49=IFCCLASSIFICATIONREFERENCE($,'217','V\X2\00E4\X0\ggisolering',#42,$,$);
#50=IFCCLASSIFICATIONREFERENCE($,'218','Ljusschakt',#42,$,$);
#51=IFCCLASSIFICATIONREFERENCE($,'22','Innerv\X2\00E4\X0\gg',#35,$,$);
#52=IFCCLASSIFICATIONREFERENCE($,'221','Prefabricerade element',#51,$,$);
#53=IFCCLASSIFICATIONREFERENCE($,'222','Platsgjutna v\X2\00E4\X0\ggar',#51,$,$);
#54=IFCCLASSIFICATIONREFERENCE($,'223','Uppmurade v\X2\00E4\X0\ggar',#51,$,$);
#55=IFCCLASSIFICATIONREFERENCE($,'224','Uppreglade v\X2\00E4\X0\ggar',#51,$,$);
#56=IFCCLASSIFICATIONREFERENCE($,'225','Uppreglade v\X2\00E4\X0\ggsk\X2\00F6\X0\rtar',#51,$,$);
#57=IFCCLASSIFICATIONREFERENCE($,'226','Glasv\X2\00E4\X0\ggsystem',#51,$,$);
#58=IFCCLASSIFICATIONREFERENCE($,'23','Bj\X2\00E4\X0\lklag',#35,$,$);
#59=IFCCLASSIFICATIONREFERENCE($,'231','Prefabricerade bj\X2\00E4\X0\lklag',#58,$,$);
#60=IFCCLASSIFICATIONREFERENCE($,'232','Platsgjutna bj\X2\00E4\X0\lklag',#58,$,$);
#61=IFCCLASSIFICATIONREFERENCE($,'233','Uppreglade bj\X2\00E4\X0\lklag',#58,$,$);
#62=IFCCLASSIFICATIONREFERENCE($,'234','P\X2\00E5\X0\gjutningar',#58,$,$);
#63=IFCCLASSIFICATIONREFERENCE($,'239','\X2\00D6\X0\vriga bj\X2\00E4\X0\lklag',#58,$,$);
#64=IFCCLASSIFICATIONREFERENCE($,'24','Trappor och ramper',#35,$,$);
#65=IFCCLASSIFICATIONREFERENCE($,'241','Prefabricerade trappor',#64,$,$);
#66=IFCCLASSIFICATIONREFERENCE($,'242','Platsgjutna trappor',#64,$,$);
#67=IFCCLASSIFICATIONREFERENCE($,'243','Sammansatta trappor',#64,$,$);
#68=IFCCLASSIFICATIONREFERENCE($,'244','Prefabricerade ramper',#64,$,$);
#69=IFCCLASSIFICATIONREFERENCE($,'245','Platsgjutna ramper',#64,$,$);
#70=IFCCLASSIFICATIONREFERENCE($,'246','Sammansatta ramper',#64,$,$);
#71=IFCCLASSIFICATIONREFERENCE($,'247','Fasta stegar, lejdare och trappsteg',#64,$,$);
#72=IFCCLASSIFICATIONREFERENCE($,'25','B\X2\00E4\X0\rande balkar och pelare',#35,$,$);
#73=IFCCLASSIFICATIONREFERENCE($,'251','Prefabricerade balkar',#72,$,$);
#74=IFCCLASSIFICATIONREFERENCE($,'252','Platsgjutna balkar',#72,$,$);
#75=IFCCLASSIFICATIONREFERENCE($,'253','St\X2\00E5\X0\lbalkar',#72,$,$);
#76=IFCCLASSIFICATIONREFERENCE($,'254','\X2\00D6\X0\vriga balkar',#72,$,$);
#77=IFCCLASSIFICATIONREFERENCE($,'255','Prefabricerade pelare',#72,$,$);
#78=IFCCLASSIFICATIONREFERENCE($,'256','Platsgjutna pelare',#72,$,$);
#79=IFCCLASSIFICATIONREFERENCE($,'257','St\X2\00E5\X0\lpelare',#72,$,$);
#80=IFCCLASSIFICATIONREFERENCE($,'259','\X2\00D6\X0\vriga pelare',#72,$,$);
#81=IFCCLASSIFICATIONREFERENCE($,'26','Balkonger och loftg\X2\00E5\X0\ng, prim\X2\00E4\X0\ra byggdelar',#35,$,$);
#82=IFCCLASSIFICATIONREFERENCE($,'261','Prefabricerade balkongplattor och loftg\X2\00E5\X0\ngar',#81,$,$);
#83=IFCCLASSIFICATIONREFERENCE($,'262','Platsgjutna balkonplattor och loftg\X2\00E5\X0\ngar',#81,$,$);
#84=IFCCLASSIFICATIONREFERENCE($,'263','Sammansatta balkongplattor och loftg\X2\00E5\X0\ngar',#81,$,$);
#85=IFCCLASSIFICATIONREFERENCE($,'27','Tak, prim\X2\00E4\X0\ra byggdelar',#35,$,$);
#86=IFCCLASSIFICATIONREFERENCE($,'271','Yttertak',#85,$,$);
#87=IFCCLASSIFICATIONREFERENCE($,'272','Takkassetter',#85,$,$);
#88=IFCCLASSIFICATIONREFERENCE($,'273','Varma tak',#85,$,$);
#89=IFCCLASSIFICATIONREFERENCE($,'274','Glastakssystem',#85,$,$);
#90=IFCCLASSIFICATIONREFERENCE($,'275','Mobila tak',#85,$,$);
#91=IFCCLASSIFICATIONREFERENCE($,'276','Sk\X2\00E4\X0\rmtak',#85,$,$);
#92=IFCCLASSIFICATIONREFERENCE($,'279','\X2\00D6\X0\vriga takkonstruktioner',#85,$,$);
#93=IFCCLASSIFICATIONREFERENCE($,'28','Prim\X2\00E4\X0\ra byggdelar, \X2\00F6\X0\vrigt',#35,$,$);
#94=IFCCLASSIFICATIONREFERENCE($,'3','Kompletterande byggdelar',#2,$,$);
#95=IFCCLASSIFICATIONREFERENCE($,'30','Terr\X2\00E4\X0\ng',#94,$,$);
#96=IFCCLASSIFICATIONREFERENCE($,'301','Staket, avsk\X2\00E4\X0\rmningar',#95,$,$);
#97=IFCCLASSIFICATIONREFERENCE($,'302','Trappor och ramper',#95,$,$);
#98=IFCCLASSIFICATIONREFERENCE($,'303','\X2\00D6\X0\verg\X2\00E5\X0\ng',#95,$,$);
#99=IFCCLASSIFICATIONREFERENCE($,'31','Ytterv\X2\00E4\X0\gg',#94,$,$);
#100=IFCCLASSIFICATIONREFERENCE($,'311','D\X2\00F6\X0\rrar',#99,$,$);
#101=IFCCLASSIFICATIONREFERENCE($,'312','F\X2\00F6\X0\nster',#99,$,$);
#102=IFCCLASSIFICATIONREFERENCE($,'313','D\X2\00F6\X0\rrar, fasadsystem',#99,$,$);
#103=IFCCLASSIFICATIONREFERENCE($,'314','F\X2\00F6\X0\nster\X2\00F6\X0\ppningar, fasadsystem',#99,$,$);
#104=IFCCLASSIFICATIONREFERENCE($,'315','Paneler, solavsk\X2\00E4\X0\rmningar, karmprofiler, fasadsystem',#99,$,$);
#105=IFCCLASSIFICATIONREFERENCE($,'316','Portar och karuselld\X2\00F6\X0\rrar',#99,$,$);
#106=IFCCLASSIFICATIONREFERENCE($,'317','Ytterv\X2\00E4\X0\ggar, sk\X2\00E4\X0\rmv\X2\00E4\X0\ggar',#99,$,$);
#107=IFCCLASSIFICATIONREFERENCE($,'319','\X2\00D6\X0\vriga ytterv\X2\00E4\X0\ggskompletteringar',#99,$,$);
#108=IFCCLASSIFICATIONREFERENCE($,'32','Innerv\X2\00E4\X0\gg',#94,$,$);
#109=IFCCLASSIFICATIONREFERENCE($,'321','D\X2\00F6\X0\rrar',#108,$,$);
#110=IFCCLASSIFICATIONREFERENCE($,'322','F\X2\00F6\X0\nster, luckor',#108,$,$);
#111=IFCCLASSIFICATIONREFERENCE($,'323','D\X2\00F6\X0\rrar, glasv\X2\00E4\X0\ggssystem',#108,$,$);
#112=IFCCLASSIFICATIONREFERENCE($,'324','F\X2\00F6\X0\nster\X2\00F6\X0\ppningar, glasv\X2\00E4\X0\ggssystem',#108,$,$);
#113=IFCCLASSIFICATIONREFERENCE($,'325','F\X2\00F6\X0\nster, solavsk\X2\00E4\X0\rmningar, karmprofiler, glasv\X2\00E4\X0\ggssystem',#108,$,$);
#114=IFCCLASSIFICATIONREFERENCE($,'326','Inv\X2\00E4\X0\ndiga portar och karuselld\X2\00F6\X0\rrar',#108,$,$);
#115=IFCCLASSIFICATIONREFERENCE($,'327','R\X2\00F6\X0\rliga innerv\X2\00E4\X0\ggar',#108,$,$);
#116=IFCCLASSIFICATIONREFERENCE($,'328','Innerv\X2\00E4\X0\ggar, sk\X2\00E4\X0\rmv\X2\00E4\X0\ggar',#108,$,$);
#117=IFCCLASSIFICATIONREFERENCE($,'329','\X2\00D6\X0\vriga innerv\X2\00E4\X0\ggskompletteringar',#108,$,$);
#118=IFCCLASSIFICATIONREFERENCE($,'33','Bj\X2\00E4\X0\lklag',#94,$,$);
#119=IFCCLASSIFICATIONREFERENCE($,'331','Uppbyggda golv',#118,$,$);
#120=IFCCLASSIFICATIONREFERENCE($,'332','Flytande golv',#118,$,$);
#121=IFCCLASSIFICATIONREFERENCE($,'333','Luckor, gallerdurk, torkmattor',#118,$,$);
#122=IFCCLASSIFICATIONREFERENCE($,'334','Platsgjutna golv',#118,$,$);
#123=IFCCLASSIFICATIONREFERENCE($,'335','Uppbyggda bel\X2\00E4\X0\ggning',#118,$,$);
#124=IFCCLASSIFICATIONREFERENCE($,'336','Ljudabsorbenter',#118,$,$);
#125=IFCCLASSIFICATIONREFERENCE($,'339','\X2\00D6\X0\vriga bj\X2\00E4\X0\lklagskompletteringar',#118,$,$);
#126=IFCCLASSIFICATIONREFERENCE($,'34','Trappor och ramper',#94,$,$);
#127=IFCCLASSIFICATIONREFERENCE($,'341','Utv\X2\00E4\X0\nidga r\X2\00E4\X0\cke, handledare',#126,$,$);
#128=IFCCLASSIFICATIONREFERENCE($,'342','Inv\X2\00E4\X0\ndiga r\X2\00E4\X0\cke, handledare',#126,$,$);
#129=IFCCLASSIFICATIONREFERENCE($,'343','Gallerdurk, skrapmattor',#126,$,$);
#130=IFCCLASSIFICATIONREFERENCE($,'349','\X2\00D6\X0\vriga trappkompletteringar',#126,$,$);
#131=IFCCLASSIFICATIONREFERENCE($,'35','Undertak',#94,$,$);
#132=IFCCLASSIFICATIONREFERENCE($,'351','Inv\X2\00E4\X0\ndiga nedpendlade undertak',#131,$,$);
#133=IFCCLASSIFICATIONREFERENCE($,'352','Utv\X2\00E4\X0\ndiga nedpendlade undertak',#131,$,$);
#134=IFCCLASSIFICATIONREFERENCE($,'353','Inv\X2\00E4\X0\ndiga diktmonterade undertak',#131,$,$);
#135=IFCCLASSIFICATIONREFERENCE($,'354','Utv\X2\00E4\X0\ndiga diktmonterade undertak',#131,$,$);
#136=IFCCLASSIFICATIONREFERENCE($,'355','Inv\X2\00E4\X0\ndiga undertakssk\X2\00F6\X0\rt',#131,$,$);
#137=IFCCLASSIFICATIONREFERENCE($,'356','Utv\X2\00E4\X0\ndiga undertakssk\X2\00F6\X0\rt',#131,$,$);
#138=IFCCLASSIFICATIONREFERENCE($,'357','Ljudabsorbenter',#131,$,$);
#139=IFCCLASSIFICATIONREFERENCE($,'36','Balkonger',#94,$,$);
#140=IFCCLASSIFICATIONREFERENCE($,'361','Balkongr\X2\00E4\X0\cke',#139,$,$);
#141=IFCCLASSIFICATIONREFERENCE($,'37','Tak',#94,$,$);
#142=IFCCLASSIFICATIONREFERENCE($,'371','Takkupor',#141,$,$);
#143=IFCCLASSIFICATIONREFERENCE($,'372','Takf\X2\00F6\X0\nster, r\X2\00F6\X0\k- och uppstigningsluckor',#141,$,$);
#144=IFCCLASSIFICATIONREFERENCE($,'373','Solavsk\X2\00E4\X0\rmning till takf\X2\00F6\X0\nster',#141,$,$);
#145=IFCCLASSIFICATIONREFERENCE($,'374','Taks\X2\00E4\X0\kerhet',#141,$,$);
#146=IFCCLASSIFICATIONREFERENCE($,'375','Brandt\X2\00E4\X0\tningar',#141,$,$);
#147=IFCCLASSIFICATIONREFERENCE($,'376','T\X2\00E4\X0\ckpl\X2\00E5\X0\tar',#141,$,$);
#148=IFCCLASSIFICATIONREFERENCE($,'377','Bel\X2\00E4\X0\ggningar p\X2\00E5\X0\ f\X2\00E4\X0\rdigt tak',#141,$,$);
#149=IFCCLASSIFICATIONREFERENCE($,'38','Kompletterande byggdelar, \X2\00F6\X0\vrigt',#94,$,$);
#150=IFCCLASSIFICATIONREFERENCE($,'4','Ytbehandling',#2,$,$);
#151=IFCCLASSIFICATIONREFERENCE($,'41','Utv\X2\00E4\X0\ndiga v\X2\00E4\X0\ggar',#150,$,$);
#152=IFCCLASSIFICATIONREFERENCE($,'411','M\X2\00E5\X0\lad',#151,$,$);
#153=IFCCLASSIFICATIONREFERENCE($,'412','Murad',#151,$,$);
#154=IFCCLASSIFICATIONREFERENCE($,'413','Monterad',#151,$,$);
#155=IFCCLASSIFICATIONREFERENCE($,'42','Inv\X2\00E4\X0\ndiga v\X2\00E4\X0\ggar',#150,$,$);
#156=IFCCLASSIFICATIONREFERENCE($,'421','M\X2\00E5\X0\lad',#155,$,$);
#157=IFCCLASSIFICATIONREFERENCE($,'422','Murad',#155,$,$);
#158=IFCCLASSIFICATIONREFERENCE($,'423','Monterad',#155,$,$);
#159=IFCCLASSIFICATIONREFERENCE($,'43','Bj\X2\00E4\X0\lklag och golv',#150,$,$);
#160=IFCCLASSIFICATIONREFERENCE($,'431','M\X2\00E5\X0\lad',#159,$,$);
#161=IFCCLASSIFICATIONREFERENCE($,'432','Murad',#159,$,$);
#162=IFCCLASSIFICATIONREFERENCE($,'433','Monterad',#159,$,$);
#163=IFCCLASSIFICATIONREFERENCE($,'44','Trappor och ramper',#150,$,$);
#164=IFCCLASSIFICATIONREFERENCE($,'441','M\X2\00E5\X0\lad',#163,$,$);
#165=IFCCLASSIFICATIONREFERENCE($,'442','Murad',#163,$,$);
#166=IFCCLASSIFICATIONREFERENCE($,'443','Monterad',#163,$,$);
#167=IFCCLASSIFICATIONREFERENCE($,'45','Undertak',#150,$,$);
#168=IFCCLASSIFICATIONREFERENCE($,'451','M\X2\00E5\X0\lad',#167,$,$);
#169=IFCCLASSIFICATIONREFERENCE($,'452','Murad',#167,$,$);
#170=IFCCLASSIFICATIONREFERENCE($,'453','Monterad',#167,$,$);
#171=IFCCLASSIFICATIONREFERENCE($,'46','Balkonger',#150,$,$);
#172=IFCCLASSIFICATIONREFERENCE($,'461','M\X2\00E5\X0\lad',#171,$,$);
#173=IFCCLASSIFICATIONREFERENCE($,'462','Murad',#171,$,$);
#174=IFCCLASSIFICATIONREFERENCE($,'463','Monterad',#171,$,$);
#175=IFCCLASSIFICATIONREFERENCE($,'47','Tak',#150,$,$);
#176=IFCCLASSIFICATIONREFERENCE($,'471','M\X2\00E5\X0\lad',#175,$,$);
#177=IFCCLASSIFICATIONREFERENCE($,'472','Takt\X2\00E4\X0\ckning',#175,$,$);
#178=IFCCLASSIFICATIONREFERENCE($,'48','\X2\00D6\X0\vriga byggnadsdelar, bekl\X2\00E4\X0\dnader',#150,$,$);
#179=IFCCLASSIFICATIONREFERENCE($,'5','VA-, VVS-,\X2\00A0\X0\kyl och proccessmediesystem',#2,$,$);
#180=IFCCLASSIFICATIONREFERENCE($,'50','R\X2\00F6\X0\rsystem i anl\X2\00E4\X0\ggning',#179,$,$);
#181=IFCCLASSIFICATIONREFERENCE($,'501','Ledningar av metall i mark',#180,$,$);
#182=IFCCLASSIFICATIONREFERENCE($,'502','Flexibla ledningar av plast i mark',#180,$,$);
#183=IFCCLASSIFICATIONREFERENCE($,'503','Styva ledningar av plats i mark',#180,$,$);
#184=IFCCLASSIFICATIONREFERENCE($,'504','Brunnar i mark',#180,$,$);
#185=IFCCLASSIFICATIONREFERENCE($,'505','Brunnsbeteckningar',#180,$,$);
#186=IFCCLASSIFICATIONREFERENCE($,'506','Avskiljningsbrunnar',#180,$,$);
#187=IFCCLASSIFICATIONREFERENCE($,'507','Anslutningar till VVS',#180,$,$);
#188=IFCCLASSIFICATIONREFERENCE($,'508','Tillbeh\X2\00F6\X0\r',#180,$,$);
#189=IFCCLASSIFICATIONREFERENCE($,'51','Logistik',#179,$,$);
#190=IFCCLASSIFICATIONREFERENCE($,'511','Avfallstransport- och logistiksystem',#189,$,$);
#191=IFCCLASSIFICATIONREFERENCE($,'52','Avloppsvatten och Tappvatten',#179,$,$);
#192=IFCCLASSIFICATIONREFERENCE($,'521','Avlopp och liknande tillbeh\X2\00F6\X0\ver',#191,$,$);
#193=IFCCLASSIFICATIONREFERENCE($,'522','Klosetter och liknande',#191,$,$);
#194=IFCCLASSIFICATIONREFERENCE($,'523','Tv\X2\00E4\X0\ttst\X2\00E4\X0\ll, tv\X2\00E4\X0\ttr\X2\00E4\X0\nnor, diskb\X2\00E4\X0\nkar, tv\X2\00E4\X0\ttb\X2\00E4\X0\nkar, utslagsbackar',#191,$,$);
#195=IFCCLASSIFICATIONREFERENCE($,'524','Kondensvattenanslutning till utrustning',#191,$,$);
#196=IFCCLASSIFICATIONREFERENCE($,'525','Tappvatten- och avloppsanslutningar',#191,$,$);
#197=IFCCLASSIFICATIONREFERENCE($,'526','Tappvatten och avloppsanslutning till teknisk utrustning',#191,$,$);
#198=IFCCLASSIFICATIONREFERENCE($,'527','Tappvatten- och avloppsanslutning till laboratorieutrustningar',#191,$,$);
#199=IFCCLASSIFICATIONREFERENCE($,'528','Badkar och motsvarande',#191,$,$);
#200=IFCCLASSIFICATIONREFERENCE($,'53','Tappvatten- och processvattensystem',#179,$,$);
#201=IFCCLASSIFICATIONREFERENCE($,'531','Mekanisk utrustning',#200,$,$);
#202=IFCCLASSIFICATIONREFERENCE($,'532','Vattenanslutningar',#200,$,$);
#203=IFCCLASSIFICATIONREFERENCE($,'533','Vattenbehandlingssystem',#200,$,$);
#204=IFCCLASSIFICATIONREFERENCE($,'534','Brandsk\X2\00E5\X0\p',#200,$,$);
#205=IFCCLASSIFICATIONREFERENCE($,'54','Lufttyper (gas, lufttryck, vakuum, \X2\00E5\X0\nga)',#179,$,$);
#206=IFCCLASSIFICATIONREFERENCE($,'541','Mekanisk utrustning',#205,$,$);
#207=IFCCLASSIFICATIONREFERENCE($,'542','Luftuttag',#205,$,$);
#208=IFCCLASSIFICATIONREFERENCE($,'543','Luftproduktionssystem',#205,$,$);
#209=IFCCLASSIFICATIONREFERENCE($,'545','Tillbeh\X2\00F6\X0\r',#205,$,$);
#210=IFCCLASSIFICATIONREFERENCE($,'55','Kyla',#179,$,$);
#211=IFCCLASSIFICATIONREFERENCE($,'551','Mekanisk utrustning',#210,$,$);
#212=IFCCLASSIFICATIONREFERENCE($,'552','Kylaggregat',#210,$,$);
#213=IFCCLASSIFICATIONREFERENCE($,'553','Kylproducerande installationer',#210,$,$);
#214=IFCCLASSIFICATIONREFERENCE($,'56','V\X2\00E4\X0\rme',#179,$,$);
#215=IFCCLASSIFICATIONREFERENCE($,'561','Mekanisk utrustning',#214,$,$);
#216=IFCCLASSIFICATIONREFERENCE($,'562','V\X2\00E4\X0\rmeaggregat',#214,$,$);
#217=IFCCLASSIFICATIONREFERENCE($,'563','V\X2\00E4\X0\rmeproducerande installationer',#214,$,$);
#218=IFCCLASSIFICATIONREFERENCE($,'57','Ventilation',#179,$,$);
#219=IFCCLASSIFICATIONREFERENCE($,'571','Kanaler',#218,$,$);
#220=IFCCLASSIFICATIONREFERENCE($,'572','Apparater i luftbehandlingssystem',#218,$,$);
#221=IFCCLASSIFICATIONREFERENCE($,'573','Kanaltillbeh\X2\00F6\X0\r',#218,$,$);
#222=IFCCLASSIFICATIONREFERENCE($,'574','Fl\X2\00E4\X0\ktar',#218,$,$);
#223=IFCCLASSIFICATIONREFERENCE($,'575','Luftdon',#218,$,$);
#224=IFCCLASSIFICATIONREFERENCE($,'576','Anslutningar till utrustningar',#218,$,$);
#225=IFCCLASSIFICATIONREFERENCE($,'577','Takhuvar/kanalgenomf\X2\00F6\X0\ringar',#218,$,$);
#226=IFCCLASSIFICATIONREFERENCE($,'578','Kanalisolering',#218,$,$);
#227=IFCCLASSIFICATIONREFERENCE($,'58','Sprinkler',#179,$,$);
#228=IFCCLASSIFICATIONREFERENCE($,'581','Mekanisk utrustning',#227,$,$);
#229=IFCCLASSIFICATIONREFERENCE($,'582','Sprinklerhuvuden',#227,$,$);
#230=IFCCLASSIFICATIONREFERENCE($,'583','Brandsk\X2\00E5\X0\p',#227,$,$);
#231=IFCCLASSIFICATIONREFERENCE($,'59','Tv\X2\00E4\X0\rg\X2\00E5\X0\ende delar, VVS',#179,$,$);
#232=IFCCLASSIFICATIONREFERENCE($,'591','R\X2\00F6\X0\r av metall',#231,$,$);
#233=IFCCLASSIFICATIONREFERENCE($,'592','Flexibla plastr\X2\00F6\X0\r',#231,$,$);
#234=IFCCLASSIFICATIONREFERENCE($,'593','H\X2\00E5\X0\rda plastr\X2\00F6\X0\r',#231,$,$);
#235=IFCCLASSIFICATIONREFERENCE($,'594','Statiska ventiler',#231,$,$);
#236=IFCCLASSIFICATIONREFERENCE($,'595','Dynamiska ventiler',#231,$,$);
#237=IFCCLASSIFICATIONREFERENCE($,'596','Motordrivna ventiler',#231,$,$);
#238=IFCCLASSIFICATIONREFERENCE($,'597','M\X2\00E4\X0\tare och givare',#231,$,$);
#239=IFCCLASSIFICATIONREFERENCE($,'598','R\X2\00F6\X0\risolering',#231,$,$);
#240=IFCCLASSIFICATIONREFERENCE($,'599','Beslag, konsoler, stativ, h\X2\00E5\X0\l och utsparingar',#231,$,$);
#241=IFCCLASSIFICATIONREFERENCE($,'6','El- och mekaniska an\X2\00E4\X0\ggningar',#2,$,$);
#242=IFCCLASSIFICATIONREFERENCE($,'60','Terr\X2\00E4\X0\ng',#241,$,$);
#243=IFCCLASSIFICATIONREFERENCE($,'601','Ledningar',#242,$,$);
#244=IFCCLASSIFICATIONREFERENCE($,'602','Belysning',#242,$,$);
#245=IFCCLASSIFICATIONREFERENCE($,'603','Installationer i mark',#242,$,$);
#246=IFCCLASSIFICATIONREFERENCE($,'604','Installationer p\X2\00E5\X0\ mark',#242,$,$);
#247=IFCCLASSIFICATIONREFERENCE($,'605','Trafikstyrningar',#242,$,$);
#248=IFCCLASSIFICATIONREFERENCE($,'61','Kanalisation',#241,$,$);
#249=IFCCLASSIFICATIONREFERENCE($,'611','R\X2\00E4\X0\nnor/stegar',#248,$,$);
#250=IFCCLASSIFICATIONREFERENCE($,'612','Kanaler',#248,$,$);
#251=IFCCLASSIFICATIONREFERENCE($,'613','Kabelr\X2\00F6\X0\r',#248,$,$);
#252=IFCCLASSIFICATIONREFERENCE($,'614','Fiberr\X2\00E4\X0\nnor',#248,$,$);
#253=IFCCLASSIFICATIONREFERENCE($,'615','Brand och ljudt\X2\00E4\X0\tningar',#248,$,$);
#254=IFCCLASSIFICATIONREFERENCE($,'616','H\X2\00E5\X0\l och urtagningar',#248,$,$);
#255=IFCCLASSIFICATIONREFERENCE($,'619','\X2\00D6\X0\vrigt',#248,$,$);
#256=IFCCLASSIFICATIONREFERENCE($,'62','H\X2\00F6\X0\gsp\X2\00E4\X0\nning',#241,$,$);
#257=IFCCLASSIFICATIONREFERENCE($,'621','F\X2\00F6\X0\rs\X2\00F6\X0\rjning',#256,$,$);
#258=IFCCLASSIFICATIONREFERENCE($,'622','F\X2\00F6\X0\rdelning',#256,$,$);
#259=IFCCLASSIFICATIONREFERENCE($,'623','Installationer f\X2\00F6\X0\r apparater och maskiner',#256,$,$);
#260=IFCCLASSIFICATIONREFERENCE($,'63','L\X2\00E5\X0\gsp\X2\00E4\X0\nning',#241,$,$);
#261=IFCCLASSIFICATIONREFERENCE($,'631','Extern f\X2\00F6\X0\rs\X2\00F6\X0\rjning',#260,$,$);
#262=IFCCLASSIFICATIONREFERENCE($,'632','F\X2\00F6\X0\rdelning',#260,$,$);
#263=IFCCLASSIFICATIONREFERENCE($,'633','Installationer f\X2\00F6\X0\r apparater och maskiner',#260,$,$);
#264=IFCCLASSIFICATIONREFERENCE($,'634','Termisk anl\X2\00E4\X0\ggning',#260,$,$);
#265=IFCCLASSIFICATIONREFERENCE($,'635','Belysningsinstallationer',#260,$,$);
#266=IFCCLASSIFICATIONREFERENCE($,'636','Belysningsarmaturer',#260,$,$);
#267=IFCCLASSIFICATIONREFERENCE($,'637','Kraftinstallationer',#260,$,$);
#268=IFCCLASSIFICATIONREFERENCE($,'638','F\X2\00F6\X0\rnyelsebar energi - intern f\X2\00F6\X0\rs\X2\00F6\X0\rjning',#260,$,$);
#269=IFCCLASSIFICATIONREFERENCE($,'64','Kommunikation och information',#241,$,$);
#270=IFCCLASSIFICATIONREFERENCE($,'641','Kommunikation',#269,$,$);
#271=IFCCLASSIFICATIONREFERENCE($,'642','Information',#269,$,$);
#272=IFCCLASSIFICATIONREFERENCE($,'643','Audio, video och antenner',#269,$,$);
#273=IFCCLASSIFICATIONREFERENCE($,'644','IT-infrastruktur',#269,$,$);
#274=IFCCLASSIFICATIONREFERENCE($,'65','\X2\00D6\X0\vervakningssystem',#241,$,$);
#275=IFCCLASSIFICATIONREFERENCE($,'651','Inbrottss\X2\00E4\X0\kerhet',#274,$,$);
#276=IFCCLASSIFICATIONREFERENCE($,'652','S\X2\00E4\X0\kerhetssystem',#274,$,$);
#277=IFCCLASSIFICATIONREFERENCE($,'653','Persons\X2\00E4\X0\kerhet',#274,$,$);
#278=IFCCLASSIFICATIONREFERENCE($,'66','Styr',#241,$,$);
#279=IFCCLASSIFICATIONREFERENCE($,'661','Styrsystem',#278,$,$);
#280=IFCCLASSIFICATIONREFERENCE($,'662','\X2\00D6\X0\verordnat styrsystem',#278,$,$);
#281=IFCCLASSIFICATIONREFERENCE($,'67','Sp\X2\00E4\X0\nningsutj\X2\00E4\X0\mning',#241,$,$);
#282=IFCCLASSIFICATIONREFERENCE($,'671','\X2\00D6\X0\versp\X2\00E4\X0\nningsskydd',#281,$,$);
#283=IFCCLASSIFICATIONREFERENCE($,'672','Sp\X2\00E4\X0\nningsutj\X2\00E4\X0\mning',#281,$,$);
#284=IFCCLASSIFICATIONREFERENCE($,'68','Person- och materialtransport',#241,$,$);
#285=IFCCLASSIFICATIONREFERENCE($,'681','Persontransport',#284,$,$);
#286=IFCCLASSIFICATIONREFERENCE($,'682','Gods- och materialtransport',#284,$,$);
#287=IFCCLASSIFICATIONREFERENCE($,'7','Inredning och teknisk utrustning',#2,$,$);
#288=IFCCLASSIFICATIONREFERENCE($,'70','Utrustning, terr\X2\00E4\X0\ng',#287,$,$);
#289=IFCCLASSIFICATIONREFERENCE($,'701','Teknisk utrustning',#288,$,$);
#290=IFCCLASSIFICATIONREFERENCE($,'702','Tavlor, skyltar, sk\X2\00E4\X0\rmar',#288,$,$);
#291=IFCCLASSIFICATIONREFERENCE($,'703','F\X2\00F6\X0\rr\X2\00E5\X0\d, papperskorgar, cykelst\X2\00E4\X0\ll, brevl\X2\00E5\X0\dor',#288,$,$);
#292=IFCCLASSIFICATIONREFERENCE($,'704','Bord',#288,$,$);
#293=IFCCLASSIFICATIONREFERENCE($,'705','Sittm\X2\00F6\X0\bler',#288,$,$);
#294=IFCCLASSIFICATIONREFERENCE($,'706','R\X2\00E4\X0\cken och staket',#288,$,$);
#295=IFCCLASSIFICATIONREFERENCE($,'707','Sport och lekutrustningar',#288,$,$);
#296=IFCCLASSIFICATIONREFERENCE($,'709','\X2\00D6\X0\vrig utrustning i terr\X2\00E4\X0\ng',#288,$,$);
#297=IFCCLASSIFICATIONREFERENCE($,'71','Inredning, fastmonterat',#287,$,$);
#298=IFCCLASSIFICATIONREFERENCE($,'711','Sk\X2\00E5\X0\p',#297,$,$);
#299=IFCCLASSIFICATIONREFERENCE($,'712','Hyllor',#297,$,$);
#300=IFCCLASSIFICATIONREFERENCE($,'713','Sittm\X2\00F6\X0\bler, liggm\X2\00F6\X0\bler',#297,$,$);
#301=IFCCLASSIFICATIONREFERENCE($,'714','Gardiner, persienner',#297,$,$);
#302=IFCCLASSIFICATIONREFERENCE($,'715','Bord, b\X2\00E4\X0\nk',#297,$,$);
#303=IFCCLASSIFICATIONREFERENCE($,'716','Skyltar, tavlor',#297,$,$);
#304=IFCCLASSIFICATIONREFERENCE($,'717','Utsmyckning',#297,$,$);
#305=IFCCLASSIFICATIONREFERENCE($,'719','\X2\00D6\X0\vriga fastmonterade m\X2\00F6\X0\bler',#297,$,$);
#306=IFCCLASSIFICATIONREFERENCE($,'72','Inredning, l\X2\00F6\X0\s',#287,$,$);
#307=IFCCLASSIFICATIONREFERENCE($,'721','Sk\X2\00E5\X0\p',#306,$,$);
#308=IFCCLASSIFICATIONREFERENCE($,'722','Hyllor',#306,$,$);
#309=IFCCLASSIFICATIONREFERENCE($,'723','Sittm\X2\00F6\X0\bler, liggm\X2\00F6\X0\bler',#306,$,$);
#310=IFCCLASSIFICATIONREFERENCE($,'724','Sk\X2\00E4\X0\rmv\X2\00E4\X0\ggar',#306,$,$);
#311=IFCCLASSIFICATIONREFERENCE($,'725','Bord',#306,$,$);
#312=IFCCLASSIFICATIONREFERENCE($,'726','Stativ, hyllplan',#306,$,$);
#313=IFCCLASSIFICATIONREFERENCE($,'727','Mattor',#306,$,$);
#314=IFCCLASSIFICATIONREFERENCE($,'729','\X2\00D6\X0\vrig l\X2\00F6\X0\s m\X2\00F6\X0\blering',#306,$,$);
#315=IFCCLASSIFICATIONREFERENCE($,'73','Utrustning, teknisk-, IT- och AV-utrustning',#287,$,$);
#316=IFCCLASSIFICATIONREFERENCE($,'731','AV-utrustning',#315,$,$);
#317=IFCCLASSIFICATIONREFERENCE($,'732','IT-utrustning',#315,$,$);
#318=IFCCLASSIFICATIONREFERENCE($,'733','Belysning',#315,$,$);
#319=IFCCLASSIFICATIONREFERENCE($,'734','Automater',#315,$,$);
#320=IFCCLASSIFICATIONREFERENCE($,'735','Brandsl\X2\00E4\X0\ckningsutrustning',#315,$,$);
#321=IFCCLASSIFICATIONREFERENCE($,'736','Vitvaror',#315,$,$);
#322=IFCCLASSIFICATIONREFERENCE($,'8','V\X2\00E4\X0\xter och markbel\X2\00E4\X0\ggning',#2,$,$);
#323=IFCCLASSIFICATIONREFERENCE($,'80','Markbel\X2\00E4\X0\ggningar och markmaterial',#322,$,$);
#324=IFCCLASSIFICATIONREFERENCE($,'801','Asfaltbel\X2\00E4\X0\ggningar',#323,$,$);
#325=IFCCLASSIFICATIONREFERENCE($,'802','Platsgjuten betong',#323,$,$);
#326=IFCCLASSIFICATIONREFERENCE($,'803','Gummibel\X2\00E4\X0\ggningar',#323,$,$);
#327=IFCCLASSIFICATIONREFERENCE($,'804','Platt- och stenbel\X2\00E4\X0\ggningar',#323,$,$);
#328=IFCCLASSIFICATIONREFERENCE($,'805','Makadam och grus',#323,$,$);
#329=IFCCLASSIFICATIONREFERENCE($,'806','Kantst\X2\00F6\X0\d',#323,$,$);
#330=IFCCLASSIFICATIONREFERENCE($,'807','Linjemarkeringar och markm\X2\00E5\X0\lningar',#323,$,$);
#331=IFCCLASSIFICATIONREFERENCE($,'808','V\X2\00E4\X0\xtb\X2\00E4\X0\ddar och planteringsk\X2\00E4\X0\rl',#323,$,$);
#332=IFCCLASSIFICATIONREFERENCE($,'809','\X2\00D6\X0\vriga markbel\X2\00E4\X0\ggningar och markmaterial',#323,$,$);
#333=IFCCLASSIFICATIONREFERENCE($,'81','Plantering',#322,$,$);
#334=IFCCLASSIFICATIONREFERENCE($,'811','Tr\X2\00E4\X0\d',#333,$,$);
#335=IFCCLASSIFICATIONREFERENCE($,'812','Buskar och h\X2\00E4\X0\ckar',#333,$,$);
#336=IFCCLASSIFICATIONREFERENCE($,'813','V\X2\00E4\X0\xtjord',#333,$,$);
#337=IFCCLASSIFICATIONREFERENCE($,'814','Markt\X2\00E4\X0\ckare och perenner',#333,$,$);
#338=IFCCLASSIFICATIONREFERENCE($,'815','Gr\X2\00E4\X0\sytor',#333,$,$);
#339=IFCCLASSIFICATIONREFERENCE($,'816','Extensiva gr\X2\00F6\X0\na tak och v\X2\00E4\X0\ggar',#333,$,$);
#340=IFCCLASSIFICATIONREFERENCE($,'817','Intensiva gr\X2\00F6\X0\na tak',#333,$,$);
#341=IFCCLASSIFICATIONREFERENCE($,'819','\X2\00D6\X0\vrig plantering',#333,$,$);
#342=IFCCLASSIFICATIONREFERENCE($,'9','Projektutrustning',#2,$,$);
#343=IFCCLASSIFICATIONREFERENCE($,'91','Projektutrustning A',#342,$,$);
#344=IFCCLASSIFICATIONREFERENCE($,'92','Projektutrustning K',#342,$,$);
#345=IFCCLASSIFICATIONREFERENCE($,'93','Projektutrustning V',#342,$,$);
#346=IFCCLASSIFICATIONREFERENCE($,'94','Projektutrustning W',#342,$,$);
#347=IFCCLASSIFICATIONREFERENCE($,'95','Projektutrustning E',#342,$,$);
#348=IFCCLASSIFICATIONREFERENCE($,'96','Projektutrustning L',#342,$,$);
ENDSEC;
END-ISO-10303-21;
@@ -0,0 +1,684 @@
ISO-10303-21;
HEADER;
FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1');
FILE_NAME('','2023-08-11T12:28:44',(),(),'IfcOpenShell v0.7.0-fc50bdd3a','IfcOpenShell v0.7.0-fc50bdd3a','');
FILE_SCHEMA(('IFC4'));
ENDSEC;
DATA;
#1=IFCCLASSIFICATION('Brick','August-11','2023-08-11','Brick','','https://brickschema.org/schema/Brick',());
#2=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Equipment','Equipment','Equipment',#1,'devices that serve all or part of the building and may include electric power, lighting, transportation, or service water heating, including, but not limited to, furnaces, boilers, air conditioners, heat pumps, chillers, water heaters, lamps, luminaires, ballasts, elevators, escalators, or other devices or installations.',$);
#3=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Elevator','Elevator','Elevator',#2,'A device that provides vertical transportation between floors, levels or decks of a building, vessel or other structure',$);
#4=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Gas_Distribution','Gas Distribution','Gas Distribution',#2,'Utilize a gas distribution source to represent how gas is distributed across multiple destinations',$);
#5=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Relay','Relay','Relay',#2,'an electrically operated switch',$);
#6=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Steam_Distribution','Steam Distribution','Steam Distribution',#2,'Utilize a steam distribution source to represent how steam is distributed across multiple destinations',$);
#7=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Water_Distribution','Water Distribution','Water Distribution',#2,'Utilize a water distribution source to represent how water is distributed across multiple destinations (pipes)',$);
#8=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Weather_Station','Weather Station','Weather Station',#2,'A dedicated weather measurement station',$);
#9=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Camera','Camera','Camera',#2,'',$);
#10=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Surveillance_Camera','Surveillance Camera','Surveillance Camera',#9,'',$);
#11=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Furniture','Furniture','Furniture',#2,'Movable objects intended to support various human activities such as seating, eating and sleeping',$);
#12=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Stage_Riser','Stage Riser','Stage Riser',#11,'A low platform in a space or on a stage',$);
#13=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Solar_Thermal_Collector','Solar Thermal Collector','Solar Thermal Collector',#2,'A type of solar panels that converts solar radiation into thermal energy.',$);
#14=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#PVT_Panel','PVT Panel','PVT Panel',#13,'A type of solar panels that convert solar radiation into usable thermal and electrical energy',$);
#15=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Motor','Motor','Motor',#2,'A machine in which power is applied to do work by the conversion of various forms of energy into mechanical force and motion.',$);
#16=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Variable_Frequency_Drive','Variable Frequency Drive','Variable Frequency Drive',#15,'Electronic device that varies its output frequency to vary the rotating speed of a motor, given a fixed input frequency. Used with fans or pumps to vary the flow in the system as a function of a maintained pressure.',$);
#17=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#VFD','VFD','VFD',#15,'Electronic device that varies its output frequency to vary the rotating speed of a motor, given a fixed input frequency. Used with fans or pumps to vary the flow in the system as a function of a maintained pressure.',$);
#18=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Fan_VFD','Fan VFD','Fan VFD',#17,'Variable-frequency drive for fans',$);
#19=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Heat_Wheel_VFD','Heat Wheel VFD','Heat Wheel VFD',#17,'A VFD that drives a heat wheel',$);
#20=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Pump_VFD','Pump VFD','Pump VFD',#17,'Variable-frequency drive for pumps',$);
#21=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Shading_Equipment','Shading Equipment','Shading Equipment',#2,'',$);
#22=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Automatic_Tint_Window','Automatic Tint Window','Automatic Tint Window',#21,'A window with tint control.',$);
#23=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Blind','Blind','Blind',#21,'A window covering.',$);
#24=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Water_Heater','Water Heater','Water Heater',#2,'An apparatus for heating and usually storing hot water',$);
#25=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Collection_Basin_Water_Heater','Collection Basin Water Heater','Collection Basin Water Heater',#24,'Basin heaters prevent cold water basin freeze-up, e.g. in cooling towers, closed circuit fluid coolers, or evaporative condensers',$);
#26=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Boiler','Boiler','Boiler',#24,'A closed, pressure vessel that uses fuel or electricity for heating water or other fluids to supply steam or hot water for heating, humidification, or other applications.',$);
#27=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Electric_Boiler','Electric Boiler','Electric Boiler',#26,'A closed, pressure vessel that uses electricity for heating water or other fluids to supply steam or hot water for heating, humidification, or other applications.',$);
#28=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Natural_Gas_Boiler','Natural Gas Boiler','Natural Gas Boiler',#26,'A closed, pressure vessel that uses natural gas for heating water or other fluids to supply steam or hot water for heating, humidification, or other applications.',$);
#29=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Condensing_Natural_Gas_Boiler','Condensing Natural Gas Boiler','Condensing Natural Gas Boiler',#28,'A closed, pressure vessel that uses natural gas and heat exchanger that capture and reuse any latent heat for heating water or other fluids to supply steam or hot water for heating, humidification, or other applications.',$);
#30=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Noncondensing_Natural_Gas_Boiler','Noncondensing Natural Gas Boiler','Noncondensing Natural Gas Boiler',#28,'A closed, pressure vessel that uses natural gas with no system to capture latent heat for heating water or other fluids to supply steam or hot water for heating, humidification, or other applications.',$);
#31=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Lighting_Equipment','Lighting Equipment','Lighting Equipment',#2,'',$);
#32=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Interface','Interface','Interface',#31,'A device that provides an occupant control over a lighting system',$);
#33=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Touchpanel','Touchpanel','Touchpanel',#32,'A switch used to operate all or part of a lighting installation that uses a touch-based mechanism (typically resistive or capacitive) rather than a mechanical actuator',$);
#34=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Switch','Switch','Switch',#32,'A switch used to operate all or part of a lighting installation',$);
#35=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Dimmer','Dimmer','Dimmer',#34,'A switch providing continuous control over all or part of a lighting installation; typically potentiometer-based',$);
#36=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Lighting','Lighting','Lighting',#31,'',$);
#37=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Luminaire','Luminaire','Luminaire',#36,'A complete lighting unit consisting of a lamp or lamps and ballast(s) (when applicable) together with the parts designed to distribute the light, to position and protect the lamps, and to connect the lamps to the power supply.',$);
#38=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Luminaire_Driver','Luminaire Driver','Luminaire Driver',#36,'A power source for a luminaire',$);
#39=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Safety_Equipment','Safety Equipment','Safety Equipment',#2,'',$);
#40=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#First_Aid_Kit','First Aid Kit','First Aid Kit',#39,'',$);
#41=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#AED','AED','AED',#39,'',$);
#42=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Automated_External_Defibrillator','Automated External Defibrillator','Automated External Defibrillator',#39,'',$);
#43=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Emergency_Wash_Station','Emergency Wash Station','Emergency Wash Station',#39,'',$);
#44=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Drench_Hose','Drench Hose','Drench Hose',#43,'',$);
#45=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Eye_Wash_Station','Eye Wash Station','Eye Wash Station',#43,'',$);
#46=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Safety_Shower','Safety Shower','Safety Shower',#43,'',$);
#47=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Security_Equipment','Security Equipment','Security Equipment',#2,'',$);
#48=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Intrusion_Detection_Equipment','Intrusion Detection Equipment','Intrusion Detection Equipment',#47,'',$);
#49=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Access_Control_Equipment','Access Control Equipment','Access Control Equipment',#47,'',$);
#50=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Access_Reader','Access Reader','Access Reader',#49,'',$);
#51=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Intercom_Equipment','Intercom Equipment','Intercom Equipment',#47,'',$);
#52=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Emergency_Phone','Emergency Phone','Emergency Phone',#51,'',$);
#53=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Video_Intercom','Video Intercom','Video Intercom',#51,'',$);
#54=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Video_Surveillance_Equipment','Video Surveillance Equipment','Video Surveillance Equipment',#47,'',$);
#55=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#NVR','NVR','NVR',#54,'',$);
#56=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Network_Video_Recorder','Network Video Recorder','Network Video Recorder',#54,'',$);
#57=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#PV_Panel','PV Panel','PV Panel',#2,'An integrated assembly of interconnected photovoltaic cells designed to deliver a selected level of working voltage and current at its output terminals packaged for protection against environment degradation and suited for incorporation in photovoltaic power systems.',$);
#58=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Fire_Safety_Equipment','Fire Safety Equipment','Fire Safety Equipment',#2,'',$);
#59=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Fire_Alarm','Fire Alarm','Fire Alarm',#58,'',$);
#60=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Fire_Alarm_Control_Panel','Fire Alarm Control Panel','Fire Alarm Control Panel',#58,'Fire alarm panel is the controlling component of a fire alarm system.',$);
#61=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Fire_Control_Panel','Fire Control Panel','Fire Control Panel',#58,'A panel-mounted device that provides status and control of a fire safety system',$);
#62=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Heat_Detector','Heat Detector','Heat Detector',#58,'',$);
#63=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Smoke_Detector','Smoke Detector','Smoke Detector',#58,'',$);
#64=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Manual_Fire_Alarm_Activation_Equipment','Manual Fire Alarm Activation Equipment','Manual Fire Alarm Activation Equipment',#58,'A device for manually activating fire alarm',$);
#65=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Fire_Alarm_Manual_Call_Point','Fire Alarm Manual Call Point','Fire Alarm Manual Call Point',#64,'Manual alarm call points are designed for the purpose of raising an alarm manually once verification of a fire or emergency condition exists. by operating the push button or break glass the alarm signal can be raised.',$);
#66=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Fire_Alarm_Pull_Station','Fire Alarm Pull Station','Fire Alarm Pull Station',#64,'An active fire protection device (usually wall-mounted) that when activated initiates an alarm on a fire alarm system. In its simplest form the user activates the alarm by pulling the handle down.',$);
#67=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Valve','Valve','Valve',#2,'A device that regulates, directs or controls the flow of a fluid by opening, closing or partially obstructing various passageways',$);
#68=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Gas_Valve','Gas Valve','Gas Valve',#67,'',$);
#69=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Natural_Gas_Seismic_Shutoff_Valve','Natural Gas Seismic Shutoff Valve','Natural Gas Seismic Shutoff Valve',#67,'Valves that automatically shut off your natural gas service when an earthquake of a sufficient magnitude occurs at the location.',$);
#70=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#HVAC_Valve','HVAC Valve','HVAC Valve',#67,'',$);
#71=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Chilled_Water_Valve','Chilled Water Valve','Chilled Water Valve',#70,'A valve that modulates the flow of chilled water',$);
#72=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Condenser_Water_Valve','Condenser Water Valve','Condenser Water Valve',#70,'A valve that modulates the flow of condenser water',$);
#73=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Makeup_Water_Valve','Makeup Water Valve','Makeup Water Valve',#70,'A valve regulating the flow of makeup water into a water holding tank, e.g. a cooling tower, hot water tank',$);
#74=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Water_Valve','Water Valve','Water Valve',#67,'A valve that modulates the flow of water',$);
#75=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Thermostatic_Mixing_Valve','Thermostatic Mixing Valve','Thermostatic Mixing Valve',#74,'A valve that blends hot water with cold water to ensure constant, safe shower and bath outlet temperatures, preventing scalding.',$);
#76=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Hot_Water_Valve','Hot Water Valve','Hot Water Valve',#74,'A valve regulating the flow of hot water',$);
#77=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Domestic_Hot_Water_Valve','Domestic Hot Water Valve','Domestic Hot Water Valve',#76,'A valve regulating the flow of domestic hot water',$);
#78=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Preheat_Hot_Water_Valve','Preheat Hot Water Valve','Preheat Hot Water Valve',#76,'',$);
#79=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Electrical_Equipment','Electrical Equipment','Electrical Equipment',#2,'',$);
#80=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Breaker_Panel','Breaker Panel','Breaker Panel',#79,'Breaker Panel distributes power into various end-uses.',$);
#81=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Bus_Riser','Bus Riser','Bus Riser',#79,'Bus Risers are commonly fed from a switchgear and rise up through a series of floors to the main power distribution source for each floor.',$);
#82=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Disconnect_Switch','Disconnect Switch','Disconnect Switch',#79,'Building power is most commonly provided by utility company through a master disconnect switch (sometimes called a service disconnect) in the main electrical room of a building. The Utility Company provided master disconnect switch often owns or restricts access to this switch. There can also be other cases where a disconnect is placed into an electrical system to allow service cut-off to a portion of the building.',$);
#83=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Inverter','Inverter','Inverter',#79,'A device that changes direct current into alternating current',$);
#84=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Motor_Control_Center','Motor Control Center','Motor Control Center',#79,'The Motor Control Center is a specialized type of switchgear which provides electrical power to major mechanical systems in the building such as HVAC components.',$);
#85=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#PlugStrip','PlugStrip','PlugStrip',#79,'A device containing a block of electrical sockets allowing multiple electrical devices to be powered from a single electrical socket.',$);
#86=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Switchgear','Switchgear','Switchgear',#79,'A main disconnect or service disconnect feeds power to a switchgear, which then distributes power to the rest of the building through smaller amperage-rated disconnects.',$);
#87=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Transformer','Transformer','Transformer',#79,'A Transformer is usually fed by a high-voltage source and then steps down the voltage to a lower-voltage feed for low-voltage application (such as lights). Transformers also can step up voltage, but this generally does not apply to in building distribution.',$);
#88=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Energy_Storage','Energy Storage','Energy Storage',#79,'Devices or equipment that store energy in its various forms',$);
#89=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Battery','Battery','Battery',#88,'A container that stores chemical energy that can be converted into electricity and used as a source of power',$);
#90=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Meter','Meter','Meter',#2,'A device that measure usage or consumption of some media --- typically a form energy or power.',$);
#91=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Thermal_Power_Meter','Thermal Power Meter','Thermal Power Meter',#90,'A standalone thermal power meter',$);
#92=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Electrical_Meter','Electrical Meter','Electrical Meter',#90,'A meter that measures the usage or consumption of electricity',$);
#93=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Building_Electrical_Meter','Building Electrical Meter','Building Electrical Meter',#92,'A meter that measures the usage or consumption of electricity of a whole building',$);
#94=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Gas_Meter','Gas Meter','Gas Meter',#90,'A meter that measures the usage or consumption of gas',$);
#95=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Building_Gas_Meter','Building Gas Meter','Building Gas Meter',#94,'A meter that measures the usage or consumption of gas of a whole building',$);
#96=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Water_Meter','Water Meter','Water Meter',#90,'A meter that measures the usage or consumption of water',$);
#97=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Building_Water_Meter','Building Water Meter','Building Water Meter',#96,'A meter that measures the usage or consumption of water of a whole building',$);
#98=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Chilled_Water_Meter','Chilled Water Meter','Chilled Water Meter',#96,'A meter that measures the usage or consumption of chilled water',$);
#99=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Building_Chilled_Water_Meter','Building Chilled Water Meter','Building Chilled Water Meter',#98,'A meter that measures the usage or consumption of chilled water of a whole building',$);
#100=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Hot_Water_Meter','Hot Water Meter','Hot Water Meter',#96,'A meter that measures the usage or consumption of hot water',$);
#101=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Building_Hot_Water_Meter','Building Hot Water Meter','Building Hot Water Meter',#100,'A meter that measures the usage or consumption of hot water of a whole building',$);
#102=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Building_Meter','Building Meter','Building Meter',#90,'A meter that measures usage or consumption of some media for a whole building',$);
#103=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#HVAC_Equipment','HVAC Equipment','HVAC Equipment',#2,'See Heating_Ventilation_Air_Conditioning_System',$);
#104=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Compressor','Compressor','Compressor',#103,'(1) device for mechanically increasing the pressure of a gas. (2) often described as being either open, hermetic, or semihermetic to describe how the compressor and motor drive is situated in relation to the gas or vapor being compressed. Types include centrifugal, axial flow, reciprocating, rotary screw, rotary vane, scroll, or diaphragm. 1. device for mechanically increasing the pressure of a gas. 2. specific machine, with or without accessories, for compressing refrigerant vapor.',$);
#105=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Condenser','Condenser','Condenser',#103,'A heat exchanger in which the primary heat transfer vapor changes its state to a liquid phase.',$);
#106=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Cooling_Tower','Cooling Tower','Cooling Tower',#103,'A cooling tower is a heat rejection device that rejects waste heat to the atmosphere through the cooling of a water stream to a lower temperature. Cooling towers may either use the evaporation of water to remove process heat and cool the working fluid to near the wet-bulb air temperature or, in the case of closed circuit dry cooling towers, rely solely on air to cool the working fluid to near the dry-bulb air temperature.',$);
#107=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Cooling_Valve','Cooling Valve','Cooling Valve',#103,'A valve that controls air temperature by modulating the amount of cold water flowing through a cooling coil',$);
#108=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Dry_Cooler','Dry Cooler','Dry Cooler',#103,'A dry cooler is a fluid cooler that uses air, a relatively dry, non-liquid fluid to accomplish process cooling. (https://submer.com/submer-academy/library/dry-cooler/)',$);
#109=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Economizer','Economizer','Economizer',#103,'Device that, on proper variable sensing, initiates control signals or actions to conserve energy. A control system that reduces the mechanical heating and cooling requirement.',$);
#110=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Fume_Hood','Fume Hood','Fume Hood',#103,'A fume-collection device mounted over a work space, table, or shelf and serving to conduct unwanted gases away from the area enclosed.',$);
#111=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Humidifier','Humidifier','Humidifier',#103,'A device that adds moisture to air or other gases',$);
#112=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Space_Heater','Space Heater','Space Heater',#103,'A heater used to warm the air in an enclosed area, such as a room or office',$);
#113=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Steam_Valve','Steam Valve','Steam Valve',#103,'',$);
#114=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Thermostat','Thermostat','Thermostat',#103,'An automatic control device used to maintain temperature at a fixed or adjustable setpoint.',$);
#115=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Air_Handler_Unit','Air Handler Unit','Air Handler Unit',#103,'Assembly consisting of sections containing a fan or fans and other necessary equipment to perform one or more of the following functions: circulating, filtration, heating, cooling, heat recovery, humidifying, dehumidifying, and mixing of air. Is usually connected to an air-distribution system.',$);
#116=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Air_Handling_Unit','Air Handling Unit','Air Handling Unit',#103,'',$);
#117=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#CRAH','CRAH','CRAH',#103,'a computer room air handler (CRAH) uses fans, cooling coils and a water-chiller system to remove heat.',$);
#118=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Cold_Deck','Cold Deck','Cold Deck',#103,'Part of a dual duct air handling unit that supplies cooling to a building',$);
#119=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Computer_Room_Air_Conditioning','Computer Room Air Conditioning','Computer Room Air Conditioning',#103,'A device that monitors and maintains the temperature, air distribution and humidity in a network room or data center.',$);
#120=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Computer_Room_Air_Handler','Computer Room Air Handler','Computer Room Air Handler',#103,'a computer room air handler (CRAH) uses fans, cooling coils and a water-chiller system to remove heat.',$);
#121=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#HX','HX','HX',#103,'See Heat_Exchanger',$);
#122=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Hot_Deck','Hot Deck','Hot Deck',#103,'Part of a dual duct air handling unit that supplies heating to a building',$);
#123=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Isolation_Valve','Isolation Valve','Isolation Valve',#103,'A valve that stops the flow of a fluid, usually for maintenance or safety purposes',$);
#124=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Condenser_Water_Isolation_Valve','Condenser Water Isolation Valve','Condenser Water Isolation Valve',#123,'An isolation valve installed in the condenser water loop',$);
#125=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Pump','Pump','Pump',#103,'Machine for imparting energy to a fluid, causing it to do work, drawing a fluid into itself through an entrance port, and forcing the fluid out through an exhaust port.',$);
#126=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Water_Pump','Water Pump','Water Pump',#125,'A pump that performs work on water',$);
#127=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Chilled_Water_Pump','Chilled Water Pump','Chilled Water Pump',#126,'A pump that performs work on chilled water; typically part of a chilled water system',$);
#128=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Condenser_Water_Pump','Condenser Water Pump','Condenser Water Pump',#126,'A pump that is part of a condenser system; the pump circulates condenser water from the chiller back to the cooling tower',$);
#129=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Hot_Water_Pump','Hot Water Pump','Hot Water Pump',#126,'A pump that performs work on hot water; typically part of a hot water system',$);
#130=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Bypass_Valve','Bypass Valve','Bypass Valve',#103,'A type of valve installed in a bypass pipeline',$);
#131=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Condenser_Water_Bypass_Valve','Condenser Water Bypass Valve','Condenser Water Bypass Valve',#130,'A valve installed in a bypass line of a condenser water loop',$);
#132=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Differential_Pressure_Bypass_Valve','Differential Pressure Bypass Valve','Differential Pressure Bypass Valve',#130,'A 2-way, self contained proportional valve with an integral differential pressure adjustment setting.',$);
#133=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#CRAC','CRAC','CRAC',#103,'',$);
#134=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Standby_CRAC','Standby CRAC','Standby CRAC',#133,'A CRAC that is activated as part of a lead/lag operation or when an alarm occurs in a primary unit',$);
#135=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Air_Plenum','Air Plenum','Air Plenum',#103,'A component of the HVAC the receives air from the air handling unit or room to distribute or exhaust to or from the building',$);
#136=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Return_Air_Plenum','Return Air Plenum','Return Air Plenum',#135,'A component of the HVAC the receives air from the room to recirculate or exhaust to or from the building',$);
#137=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Discharge_Air_Plenum','Discharge Air Plenum','Discharge Air Plenum',#135,'',$);
#138=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Supply_Air_Plenum','Supply Air Plenum','Supply Air Plenum',#135,'A component of the HVAC the receives air from the air handling unit to distribute to the building',$);
#139=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Underfloor_Air_Plenum','Underfloor Air Plenum','Underfloor Air Plenum',#138,'An open space between a structural concrete slab and the underside of a raised access floor system that connects to an air handling unit to receive conditioned and/or ventilating air before delivery to the room(s)',$);
#140=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Chiller','Chiller','Chiller',#103,'Refrigerating machine used to transfer heat between fluids. Chillers are either direct expansion with a compressor or absorption type.',$);
#141=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Absorption_Chiller','Absorption Chiller','Absorption Chiller',#140,'A chiller that utilizes a thermal or/and chemical process to produce the refrigeration effect necessary to provide chilled water. There is no mechanical compression of the refrigerant taking place within the machine, as occurs within more traditional vapor compression type chillers.',$);
#142=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Centrifugal_Chiller','Centrifugal Chiller','Centrifugal Chiller',#140,'A chiller that uses the vapor compression cycle to chill water. It throws off the heat collected from the chilled water plus the heat from the compressor to a water loop',$);
#143=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Heating_Valve','Heating Valve','Heating Valve',#103,'A valve that controls air temperature by modulating the amount of hot water flowing through a heating coil',$);
#144=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Reheat_Valve','Reheat Valve','Reheat Valve',#143,'A valve that controls air temperature by modulating the amount of hot water flowing through a reheat coil',$);
#145=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Return_Heating_Valve','Return Heating Valve','Return Heating Valve',#143,'A valve installed on the return side of a heat exchanger',$);
#146=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Heat_Exchanger','Heat Exchanger','Heat Exchanger',#103,'A heat exchanger is a piece of equipment built for efficient heat transfer from one medium to another. The media may be separated by a solid wall to prevent mixing or they may be in direct contact (BEDES)',$);
#147=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Condenser_Heat_Exchanger','Condenser Heat Exchanger','Condenser Heat Exchanger',#146,'A heat exchanger in which the primary heat transfer vapor changes its state to a liquid phase.',$);
#148=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Evaporative_Heat_Exchanger','Evaporative Heat Exchanger','Evaporative Heat Exchanger',#146,'',$);
#149=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Heat_Wheel','Heat Wheel','Heat Wheel',#146,'A rotary heat exchanger positioned within the supply and exhaust air streams of an air handling system in order to recover heat energy',$);
#150=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Coil','Coil','Coil',#146,'Cooling or heating element made of pipe or tube that may or may not be finned and formed into helical or serpentine shape (ASHRAE Dictionary)',$);
#151=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Cooling_Coil','Cooling Coil','Cooling Coil',#150,'A cooling element made of pipe or tube that removes heat from equipment, machines or airflows. Typically filled with either refrigerant or cold water.',$);
#152=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Chilled_Water_Coil','Chilled Water Coil','Chilled Water Coil',#151,'A cooling element made of pipe or tube that removes heat from equipment, machines or airflows that is filled with chilled water.',$);
#153=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Direct_Expansion_Cooling_Coil','Direct Expansion Cooling Coil','Direct Expansion Cooling Coil',#151,'',$);
#154=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Heating_Coil','Heating Coil','Heating Coil',#150,'A heating element typically made of pipe, tube or wire that emits heat. Typically filled with hot water, or, in the case of wire, uses electricity.',$);
#155=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Direct_Expansion_Heating_Coil','Direct Expansion Heating Coil','Direct Expansion Heating Coil',#154,'',$);
#156=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Hot_Water_Coil','Hot Water Coil','Hot Water Coil',#154,'A heating element typically made of pipe, tube or wire that emits heat that is filled with hot water.',$);
#157=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Filter','Filter','Filter',#103,'Device to remove gases from a mixture of gases or to remove solid material from a fluid',$);
#158=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Final_Filter','Final Filter','Final Filter',#157,'The last, high-efficiency filter installed in a sequence to remove the finest particulates from the substance being filtered',$);
#159=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Intake_Air_Filter','Intake Air Filter','Intake Air Filter',#157,'Filters air intake',$);
#160=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Mixed_Air_Filter','Mixed Air Filter','Mixed Air Filter',#157,'A filter that is applied to the mixture of recirculated and outside air',$);
#161=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Pre_Filter','Pre Filter','Pre Filter',#157,'A filter installed in front of a more efficient filter to extend the life of the more expensive higher efficiency filter',$);
#162=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Return_Air_Filter','Return Air Filter','Return Air Filter',#157,'Filters return air',$);
#163=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Damper','Damper','Damper',#103,'Element inserted into an air-distribution system or element of an air-distribution system permitting modification of the air resistance of the system and consequently changing the airflow rate or shutting off the airflow.',$);
#164=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Economizer_Damper','Economizer Damper','Economizer Damper',#163,'A damper that is part of an economizer that is used to module the flow of air',$);
#165=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Exhaust_Damper','Exhaust Damper','Exhaust Damper',#163,'A damper that modulates the flow of exhaust air',$);
#166=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Mixed_Damper','Mixed Damper','Mixed Damper',#163,'A damper that modulates the flow of the mixed outside and return air streams',$);
#167=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Outside_Damper','Outside Damper','Outside Damper',#163,'A damper that modulates the flow of outside air',$);
#168=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Relief_Damper','Relief Damper','Relief Damper',#163,'A damper that is a component of a Relief Air System, ensuring building doesn''t become over-pressurised',$);
#169=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Return_Damper','Return Damper','Return Damper',#163,'A damper that modulates the flow of return air',$);
#170=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#AHU','AHU','AHU',#103,'Assembly consisting of sections containing a fan or fans and other necessary equipment to perform one or more of the following functions: circulating, filtration, heating, cooling, heat recovery, humidifying, dehumidifying, and mixing of air. Is usually connected to an air-distribution system.',$);
#171=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#PAU','PAU','PAU',#170,'A type of AHU, use to pre-treat the outdoor air before feed to AHU',$);
#172=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#DOAS','DOAS','DOAS',#170,'See Dedicated_Outdoor_Air_System_Unit',$);
#173=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Dedicated_Outdoor_Air_System_Unit','Dedicated Outdoor Air System Unit','Dedicated Outdoor Air System Unit',#170,'A device that conditions and delivers 100% outdoor air to its assigned spaces. It decouples air-conditioning of the outdoor air, usually used to provide minimum outdoor air ventilation, from conditioning of the internal loads.',$);
#174=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Dual_Duct_Air_Handling_Unit','Dual Duct Air Handling Unit','Dual Duct Air Handling Unit',#170,'An air handling unit that contains hot and cold decks to supply heating and cooling to a building',$);
#175=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#MAU','MAU','MAU',#170,'See Makeup_Air_Unit',$);
#176=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Makeup_Air_Unit','Makeup Air Unit','Makeup Air Unit',#170,'A device designed to condition ventilation air introduced into a space or to replace air exhausted from a process or general area exhaust. The device may be used to prevent negative pressure within buildings or to reduce airborne contaminants in a space.',$);
#177=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#RTU','RTU','RTU',#170,'see Rooftop_Unit',$);
#178=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Rooftop_Unit','Rooftop Unit','Rooftop Unit',#170,'Packaged air conditioner mounted on a roof, the conditioned air being discharged directly into the rooms below or through a duct system.',$);
#179=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#DDAHU','DDAHU','DDAHU',#170,'See Dual_Duct_Air_Handling_Unit',$);
#180=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Fan','Fan','Fan',#103,'Any device with two or more blades or vanes attached to a rotating shaft used to produce an airflow for the purpose of comfort, ventilation, exhaust, heating, cooling, or any other gaseous transport.',$);
#181=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Booster_Fan','Booster Fan','Booster Fan',#180,'Fan activated to increase airflow beyond what is provided by the default configuration',$);
#182=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Ceiling_Fan','Ceiling Fan','Ceiling Fan',#180,'A fan installed on the ceiling of a room for the purpose of air circulation',$);
#183=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Cooling_Tower_Fan','Cooling Tower Fan','Cooling Tower Fan',#180,'A fan that pulls air through a cooling tower and across the louvers where the water falls to aid in heat exchange by the process of evaporation',$);
#184=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Exhaust_Fan','Exhaust Fan','Exhaust Fan',#180,'Fan moving exhaust air -- air that must be removed from a space due to contaminants',$);
#185=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Outside_Fan','Outside Fan','Outside Fan',#180,'Fan moving outside air; air that is supplied into the building from the outdoors',$);
#186=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Relief_Fan','Relief Fan','Relief Fan',#180,'A fan that is a component of a Relief Air System, ensuring building doesn''t become over-pressurised',$);
#187=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Return_Fan','Return Fan','Return Fan',#180,'Fan moving return air -- air that is circulated from the building back into the HVAC system',$);
#188=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Standby_Fan','Standby Fan','Standby Fan',#180,'Fan that is activated as part of a lead/lag operation or when a primary fan raises an alarm',$);
#189=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Supply_Fan','Supply Fan','Supply Fan',#180,'Fan moving supply air -- air that is supplied from the HVAC system into the building',$);
#190=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Transfer_Fan','Transfer Fan','Transfer Fan',#180,'A fan that transfers air from a space to another space.',$);
#191=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Discharge_Fan','Discharge Fan','Discharge Fan',#180,'Fan moving air discharged from HVAC vents',$);
#192=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Terminal_Unit','Terminal Unit','Terminal Unit',#103,'A device that regulates the volumetric flow rate and/or the temperature of the controlled medium.',$);
#193=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Constant_Air_Volume_Box','Constant Air Volume Box','Constant Air Volume Box',#192,'A terminal unit for which supply air flow rate is constant and the supply air temperature is varied to meet thermal load',$);
#194=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Fan_Coil_Unit','Fan Coil Unit','Fan Coil Unit',#192,'Terminal device consisting of a heating and/or cooling heat exchanger or ''coil'' and fan that is used to control the temperature in the space where it is installed',$);
#195=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Induction_Unit','Induction Unit','Induction Unit',#192,'A device with an primary air connection and integrated coil and condensate pan that performs sensible and latent cooling of a space. Essentially an Active Chilled Beam with a built in condensate pan.',$);
#196=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#CAV','CAV','CAV',#192,'',$);
#197=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#FCU','FCU','FCU',#192,'See Fan_Coil_Unit',$);
#198=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#VAV','VAV','VAV',#192,'See Variable_Air_Volume_Box',$);
#199=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Chilled_Beam','Chilled Beam','Chilled Beam',#192,'A device with an integrated coil that performs sensible heating of a space via circulation of room air. Chilled Beams are not designed to perform latent cooling; see Induction Units. Despite their name, Chilled Beams may perform heating or cooling of a space depending on their configuration.',$);
#200=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Active_Chilled_Beam','Active Chilled Beam','Active Chilled Beam',#199,'A Chilled Beam with an integral primary air connection that induces air flow through the device.',$);
#201=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Passive_Chilled_Beam','Passive Chilled Beam','Passive Chilled Beam',#199,'A chilled beam that does not have an integral air supply and instead relies on natural convection to draw air through the device.',$);
#202=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Variable_Air_Volume_Box','Variable Air Volume Box','Variable Air Volume Box',#192,'A device that regulates the volume and temperature of air delivered to a zone by opening or closing a damper',$);
#203=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Variable_Air_Volume_Box_With_Reheat','Variable Air Volume Box With Reheat','Variable Air Volume Box With Reheat',#202,'A VAV box with a reheat coil mounted on the discharge end of the unit that can heat the air delivered to a zone',$);
#204=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#RVAV','RVAV','RVAV',#202,'See Variable_Air_Volume_Box_With_Reheat',$);
#205=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Air_Diffuser','Air Diffuser','Air Diffuser',#192,'A device that is a component of the air distribution system that controls the delivery of conditioned and/or ventilating air into a room',$);
#206=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Displacement_Flow_Air_Diffuser','Displacement Flow Air Diffuser','Displacement Flow Air Diffuser',#205,'An air diffuser that is designed for low discharge air speeds to minimize turbulence and induction of room air. This diffuser is used with displacement ventilation systems.',$);
#207=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Jet_Nozzle_Air_Diffuser','Jet Nozzle Air Diffuser','Jet Nozzle Air Diffuser',#205,'An air diffuser that is designed to produce high velocity discharge air stream to throw the air over a large distance or target the air stream to a localize area',$);
#208=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Laminar_Flow_Air_Diffuser','Laminar Flow Air Diffuser','Laminar Flow Air Diffuser',#205,'An air diffuser that is designed for low discharge air speeds to provide uniform and unidirectional air pattern which minimizes room air entrainment',$);
#209=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Radiator','Radiator','Radiator',#192,'Heat exchangers designed to transfer thermal energy from one medium to another',$);
#210=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Electric_Radiator','Electric Radiator','Electric Radiator',#209,'Electric heating device',$);
#211=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Electric_Baseboard_Radiator','Electric Baseboard Radiator','Electric Baseboard Radiator',#210,'Electric heating device located at or near the floor',$);
#212=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Hot_Water_Radiator','Hot Water Radiator','Hot Water Radiator',#209,'Radiator that uses hot water',$);
#213=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Hot_Water_Baseboard_Radiator','Hot Water Baseboard Radiator','Hot Water Baseboard Radiator',#212,'Hydronic heating device located at or near the floor',$);
#214=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Steam_Radiator','Steam Radiator','Steam Radiator',#209,'Radiator that uses steam',$);
#215=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Steam_Baseboard_Radiator','Steam Baseboard Radiator','Steam Baseboard Radiator',#214,'Steam heating device located at or near the floor',$);
#216=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Baseboard_Radiator','Baseboard Radiator','Baseboard Radiator',#209,'Steam, hydronic, or electric heating device located at or near the floor.',$);
#217=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Radiant_Panel','Radiant Panel','Radiant Panel',#192,'A temperature-controlled surface that provides fifty percent (50%) or more of the design heat transfer by thermal radiation.',$);
#218=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Embedded_Surface_System_Panel','Embedded Surface System Panel','Embedded Surface System Panel',#217,'Radiant panel heating and cooling system where the energy heat source or sink is embedded in a radiant layer which is thermally insulated from the building structure.',$);
#219=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Radiant_Ceiling_Panel','Radiant Ceiling Panel','Radiant Ceiling Panel',#217,'Radiant panel heating and cooling system that are usually made from metal and suspended under the ceiling or insulated from the building structure.',$);
#220=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Thermally_Activated_Building_System_Panel','Thermally Activated Building System Panel','Thermally Activated Building System Panel',#217,'Radiant panel heating and cooling system where the energy heat source or sink is embedded in the building structure such as in slabs and walls.',$);
#221=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#ESS_Panel','ESS Panel','ESS Panel',#217,'See Embedded_Surface_System_Panel',$);
#222=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#RC_Panel','RC Panel','RC Panel',#217,'See Radiant_Ceiling_Panel',$);
#223=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#TABS_Panel','TABS Panel','TABS Panel',#217,'See Thermally_Activated_Building_System_Panel',$);
#224=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Location','Location','Location',#1,'',$);
#225=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Outside','Outside','Outside',#224,'',$);
#226=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Region','Region','Region',#224,'A unit of geographic space, usually contigious or somehow related to a geopolitical feature',$);
#227=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Storey','Storey','Storey',#224,'',$);
#228=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Wing','Wing','Wing',#224,'A wing is part of a building \X2\2013\X0\ or any feature of a building \X2\2013\X0\ that is subordinate to the main, central structure.',$);
#229=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Site','Site','Site',#224,'A geographic region containing 0 or more buildings. Typically used as the encapsulating location for a collection of Brick entities through the hasPart/isPartOf relationships',$);
#230=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Outdoor_Area','Outdoor Area','Outdoor Area',#224,'A class of spaces that exist outside of a building',$);
#231=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Bench_Space','Bench Space','Bench Space',#230,'For areas of play in a stadium, the area for partcipants and referees by the side of the field',$);
#232=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Field_Of_Play','Field Of Play','Field Of Play',#230,'The area of a stadium where athletic events occur, e.g. the soccer pitch',$);
#233=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Information_Area','Information Area','Information Area',#230,'An information booth or kiosk where visitors would look for information',$);
#234=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Floor','Floor','Floor',#224,'A level, typically representing a horizontal aggregation of spaces that are vertically bound. (referring to IFC)',$);
#235=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Basement','Basement','Basement',#234,'The floor of a building which is partly or entirely below ground level.',$);
#236=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Parking_Level','Parking Level','Parking Level',#234,'A floor of a parking structure',$);
#237=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Rooftop','Rooftop','Rooftop',#234,'',$);
#238=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Building','Building','Building',#224,'An independent unit of the built environment with a characteristic spatial structure, intended to serve at least one function or user activity [ISO 12006-2:2013]',$);
#239=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Parking_Structure','Parking Structure','Parking Structure',#238,'A building or part of a building devoted to vehicle parking',$);
#240=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Zone','Zone','Zone',#224,'(1) a separately controlled heated or cooled space. (2) one occupied space or several occupied spaces with similar occupancy category, occupant density, zone air distribution effectiveness, and zone primary airflow per unit area. (3) space or group of spaces within a building for which the heating, cooling, or lighting requirements are sufficiently similar that desired conditions can be maintained throughout by a single controlling device.',$);
#241=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Energy_Zone','Energy Zone','Energy Zone',#240,'A space or group of spaces that are managed or monitored as one unit for energy purposes',$);
#242=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Fire_Zone','Fire Zone','Fire Zone',#240,'combustion chamber in a furnace or boiler.',$);
#243=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#HVAC_Zone','HVAC Zone','HVAC Zone',#240,'a space or group of spaces, within a building with heating, cooling, and ventilating requirements, that are sufficiently similar so that desired conditions (e.g., temperature) can be maintained throughout using a single sensor (e.g., thermostat or temperature sensor).',$);
#244=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Lighting_Zone','Lighting Zone','Lighting Zone',#240,'',$);
#245=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Space','Space','Space',#224,'A part of the physical world or a virtual world whose 3D spatial extent is bounded actually or theoretically, and provides for certain functions within the zone it is contained in.',$);
#246=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Entrance','Entrance','Entrance',#245,'The location and space of a building where people enter and exit the building',$);
#247=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Gatehouse','Gatehouse','Gatehouse',#245,'The standalone building used to manage the entrance to a campus or building grounds',$);
#248=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Media_Hot_Desk','Media Hot Desk','Media Hot Desk',#245,'A non-enclosed space used by members of the media temporarily to cover an event while they are present at a venue',$);
#249=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Parking_Space','Parking Space','Parking Space',#245,'An area large enough to park an individual vehicle',$);
#250=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Ticketing_Booth','Ticketing Booth','Ticketing Booth',#245,'A room or space used to sell or distribute tickets to events at a venue',$);
#251=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Tunnel','Tunnel','Tunnel',#245,'An enclosed space that connects buildings. Often underground',$);
#252=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Water_Tank','Water Tank','Water Tank',#245,'A space used to hold water',$);
#253=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Vertical_Space','Vertical Space','Vertical Space',#245,'A class of spaces used to connect multiple floors or levels..',$);
#254=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Riser','Riser','Riser',#253,'A vertical shaft indented for installing building infrastructure e.g., electrical wire, network communication wire, plumbing, etc',$);
#255=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Staircase','Staircase','Staircase',#253,'A vertical space containing stairs',$);
#256=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Elevator_Shaft','Elevator Shaft','Elevator Shaft',#253,'The vertical space in which an elevator ascends and descends',$);
#257=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Elevator_Space','Elevator Space','Elevator Space',#253,'The vertical space in whcih an elevator ascends and descends',$);
#258=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Common_Space','Common Space','Common Space',#245,'A class of spaces that are used by multiple people at the same time',$);
#259=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Atrium','Atrium','Atrium',#258,'a large open-air or skylight covered space surrounded by a building.',$);
#260=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Auditorium','Auditorium','Auditorium',#258,'A space for performances or larger gatherings',$);
#261=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Cafeteria','Cafeteria','Cafeteria',#258,'A space to serve food and beverages',$);
#262=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Hallway','Hallway','Hallway',#258,'A common space, used to connect other parts of a building',$);
#263=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Lounge','Lounge','Lounge',#258,'A room for lesiure activities or relaxing',$);
#264=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Majlis','Majlis','Majlis',#263,'In Arab countries, an Majlis is a private lounge where visitors are recieved and entertained',$);
#265=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Lobby','Lobby','Lobby',#258,'A space just after the entrance to a building or other space of a building, where visitors can wait',$);
#266=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Employee_Entrance_Lobby','Employee Entrance Lobby','Employee Entrance Lobby',#265,'An open space near an entrance that is typicaly only used for employees',$);
#267=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Visitor_Lobby','Visitor Lobby','Visitor Lobby',#265,'A lobby for visitors to the building. Sometimes used to distinguish from an employee entrance looby',$);
#268=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Room','Room','Room',#245,'Base class for all more specific room types.',$);
#269=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Ablutions_Room','Ablutions Room','Ablutions Room',#268,'A room for performing cleansing rituals before prayer',$);
#270=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Conference_Room','Conference Room','Conference Room',#268,'A space dedicated in which to hold a meetings',$);
#271=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Control_Room','Control Room','Control Room',#268,'A space from which operations are managed',$);
#272=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Copy_Room','Copy Room','Copy Room',#268,'A room set aside for common office equipment, including printers and copiers',$);
#273=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Exercise_Room','Exercise Room','Exercise Room',#268,'An indoor room used for exercise and physical activities',$);
#274=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Hospitality_Box','Hospitality Box','Hospitality Box',#268,'A room at a stadium, usually overlooking the field of play, that is physical separate from the other seating at the venue',$);
#275=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Janitor_Room','Janitor Room','Janitor Room',#268,'A room set aside for the storage of cleaning equipment and supplies',$);
#276=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Library','Library','Library',#268,'A place for the storage and/or consumption of physical media, e.g. books, periodicals, and DVDs/CDs',$);
#277=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Loading_Dock','Loading Dock','Loading Dock',#268,'A part of a facility where delivery trucks can load and unload. Usually partially enclosed with specific traffic lanes leading to the dock',$);
#278=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Mail_Room','Mail Room','Mail Room',#268,'A room where mail is recieved and sorted for distribution to the rest of the building',$);
#279=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Massage_Room','Massage Room','Massage Room',#268,'Usually adjunct to an athletic facility, a private/semi-private space where massages are performed',$);
#280=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Office_Kitchen','Office Kitchen','Office Kitchen',#268,'A common space, usually near or in a breakroom, where minor food preperation occurs',$);
#281=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Prayer_Room','Prayer Room','Prayer Room',#268,'A room set aside for prayer',$);
#282=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Reception','Reception','Reception',#268,'A space, usually in a lobby, where visitors to a building or space can go to after arriving at a building and inform building staff that they have arrived',$);
#283=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Retail_Room','Retail Room','Retail Room',#268,'A space set aside for retail in a larger establishment, e.g. a gift shop in a hospital',$);
#284=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Server_Room','Server Room','Server Room',#268,'',$);
#285=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Shower','Shower','Shower',#268,'A space containing showers, usually adjacent to an athletic or execise area',$);
#286=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Sports_Service_Room','Sports Service Room','Sports Service Room',#268,'A class of spaces used in the support of sports',$);
#287=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Wardrobe','Wardrobe','Wardrobe',#268,'Storage for clothing, costumes, or uniforms',$);
#288=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Workshop','Workshop','Workshop',#268,'A space used to house equipment that can be used to repair or fabricate things',$);
#289=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Break_Room','Break Room','Break Room',#268,'A space for people to relax while not working',$);
#290=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Breakroom','Breakroom','Breakroom',#268,'A space for people to relax while not working',$);
#291=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Food_Service_Room','Food Service Room','Food Service Room',#268,'A space used in the production, storage, serving, or cleanup of food and beverages',$);
#292=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Concession','Concession','Concession',#291,'A space to sell food and beverages. Usually embedded in a larger space and does not include a space where people consume their purchases',$);
#293=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Medical_Room','Medical Room','Medical Room',#268,'A class of rooms used for medical purposes',$);
#294=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#First_Aid_Room','First Aid Room','First Aid Room',#293,'A room for a person with minor injuries can be treated or temporarily treated until transferred to a more advanced medical facility',$);
#295=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Rest_Room','Rest Room','Rest Room',#268,'A room that provides toilets and washbowls. Alternate spelling of Restroom',$);
#296=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Restroom','Restroom','Restroom',#268,'A room that provides toilets and washbowls.',$);
#297=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Security_Service_Room','Security Service Room','Security Service Room',#268,'A class of spaces used by the security staff of a facility',$);
#298=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Detention_Room','Detention Room','Detention Room',#297,'A space for the temporary involuntary confinement of people',$);
#299=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Storage_Room','Storage Room','Storage Room',#268,'A class of spaces used for storage',$);
#300=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Hazardous_Materials_Storage','Hazardous Materials Storage','Hazardous Materials Storage',#299,'A storage space set aside (usually with restricted access) for the storage of materials that can be hazardous to living beings or the environment',$);
#301=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Waste_Storage','Waste Storage','Waste Storage',#299,'A room used for storing waste such as trash or recycling',$);
#302=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Media_Room','Media Room','Media Room',#268,'A class of spaces related to the creation of media',$);
#303=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Broadcast_Room','Broadcast Room','Broadcast Room',#302,'A space to organize and manage a broadcast. Separate from studio',$);
#304=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Media_Production_Room','Media Production Room','Media Production Room',#302,'A enclosed space used by media professionals for the production of media',$);
#305=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Studio','Studio','Studio',#302,'A room used for the production or media, usually with either a specialized set or a specialized sound booth for recording',$);
#306=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Office','Office','Office',#268,'A class of rooms dedicated for work or study',$);
#307=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Cubicle','Cubicle','Cubicle',#306,'A smaller space set aside for an individual, but not with a door and without full-height walls',$);
#308=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Open_Office','Open Office','Open Office',#306,'An open space used for work or study by mulitple people. Usuaully subdivided into cubicles or desks',$);
#309=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Enclosed_Office','Enclosed Office','Enclosed Office',#306,'A space for individuals to work with walls and a door',$);
#310=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Private_Office','Private Office','Private Office',#309,'An office devoted to a single individual, with walls and door',$);
#311=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Shared_Office','Shared Office','Shared Office',#309,'An office used by multiple people',$);
#312=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Team_Room','Team Room','Team Room',#309,'An office used by multiple team members for specific work tasks. Distinct from Conference Room',$);
#313=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Service_Room','Service Room','Service Room',#268,'A class of spaces related to the operations of building subsystems, e.g. HVAC, electrical, IT, plumbing, etc',$);
#314=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Plumbing_Room','Plumbing Room','Plumbing Room',#313,'A service room devoted to the operation and routing of water in a building. Usually distinct from the HVAC subsystems.',$);
#315=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Mechanical_Room','Mechanical Room','Mechanical Room',#313,'A class of service rooms where mechanical equipment (HVAC) operates',$);
#316=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Pump_Room','Pump Room','Pump Room',#315,'A mechanical room that houses pumps',$);
#317=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Electrical_Room','Electrical Room','Electrical Room',#313,'A class of service rooms that house electrical equipment for a building',$);
#318=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Battery_Room','Battery Room','Battery Room',#317,'A room used to hold batteries for backup power',$);
#319=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Generator_Room','Generator Room','Generator Room',#317,'A room for electrical equipment, specifically electrical generators.',$);
#320=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Transformer_Room','Transformer Room','Transformer Room',#317,'An electrical room where electricity enters and is transformed to different voltages and currents by the equipment contained in the room',$);
#321=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Laboratory','Laboratory','Laboratory',#268,'facility acceptable to the local, national, or international recognized authority having jurisdiction and which provides uniform testing and examination procedures and standards for meeting design, manufacturing, and factory testing requirements.',$);
#322=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Cold_Box','Cold Box','Cold Box',#321,'in a gas separation unit, the insulated section that contains the low-temperature heat exchangers and distillation columns.',$);
#323=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Environment_Box','Environment Box','Environment Box',#321,'(also known as climatic chamber), enclosed space designed to create a particular environment.',$);
#324=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Freezer','Freezer','Freezer',#321,'cold chamber usually kept at a temperature of 22\X2\00B0\X0\F to 31\X2\00B0\X0\F (\X2\2013\X0\5\X2\00B0\X0\C to \X2\2013\X0\1\X2\00B0\X0\C), with high-volume air circulation.',$);
#325=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Hot_Box','Hot Box','Hot Box',#321,'hot air chamber forming part of an air handler.',$);
#326=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Telecom_Room','Telecom Room','Telecom Room',#268,'A class of spaces used to support telecommuncations and IT equipment',$);
#327=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Equipment_Room','Equipment Room','Equipment Room',#326,'A telecommunications room where equipment that serves the building is stored',$);
#328=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Switch_Room','Switch Room','Switch Room',#326,'A telecommuncations room housing network switches',$);
#329=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#TETRA_Room','TETRA Room','TETRA Room',#326,'A room used for local two-way radio networks, e.g. the portable radios carried by facilities staff',$);
#330=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Distribution_Frame','Distribution Frame','Distribution Frame',#326,'A class of spaces where the cables carrying signals meet and connect, e.g. a wiring closet or a broadcast downlink room',$);
#331=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#IDF','IDF','IDF',#330,'An room for an intermediate distribution frame, where cables carrying signals from the main distrubtion frame terminate and then feed out to endpoints',$);
#332=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#MDF','MDF','MDF',#330,'A room for the Main Distribution Frame, the central place of a building where cables carrying signals meet and connect to the outside world',$);
#333=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Collection','Collection','Collection',#1,'',$);
#334=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Portfolio','Portfolio','Portfolio',#333,'A collection of sites',$);
#335=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Photovoltaic_Array','Photovoltaic Array','Photovoltaic Array',#333,'A collection of photovoltaic panels',$);
#336=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#PV_Array','PV Array','PV Array',#333,'',$);
#337=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Loop','Loop','Loop',#333,'A collection of connected equipment; part of a System',$);
#338=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Air_Loop','Air Loop','Air Loop',#337,'The set of connected equipment serving one path of air',$);
#339=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Water_Loop','Water Loop','Water Loop',#337,'A collection of equipment that transport and regulate water among each other',$);
#340=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Chilled_Water_Loop','Chilled Water Loop','Chilled Water Loop',#339,'A collection of equipment that transport and regulate chilled water among each other',$);
#341=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Domestic_Water_Loop','Domestic Water Loop','Domestic Water Loop',#339,'',$);
#342=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Hot_Water_Loop','Hot Water Loop','Hot Water Loop',#339,'A collection of equipment that transport and regulate hot water among each other',$);
#343=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#System','System','System',#333,'A System is a combination of equipment and auxiliary devices (e.g., controls, accessories, interconnecting means, and termi\X2\00AD\X0\nal elements) by which energy is transformed so it performs a specific function such as HVAC, service water heating, or lighting. (ASHRAE Dictionary).',$);
#344=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Domestic_Hot_Water_System','Domestic Hot Water System','Domestic Hot Water System',#343,'The equipment, devices and conduits that handle the production and distribution of domestic hot water in a building',$);
#345=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Gas_System','Gas System','Gas System',#343,'',$);
#346=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Lighting_System','Lighting System','Lighting System',#343,'The equipment, devices and interfaces that serve or are a part of the lighting subsystem in a building',$);
#347=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Electrical_System','Electrical System','Electrical System',#343,'Devices that serve or are part of the electrical subsystem in the building',$);
#348=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Energy_System','Energy System','Energy System',#347,'A collection of devices that generates, stores or transports electricity',$);
#349=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Energy_Generation_System','Energy Generation System','Energy Generation System',#348,'A collection of devices that generates electricity',$);
#350=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#PV_Generation_System','PV Generation System','PV Generation System',#349,'A collection of photovoltaic devices that generates energy',$);
#351=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Energy_Storage_System','Energy Storage System','Energy Storage System',#348,'A collection of devices that stores electricity',$);
#352=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Battery_Energy_Storage_System','Battery Energy Storage System','Battery Energy Storage System',#351,'A collection of batteries that provides energy storage, along with their supporting equipment',$);
#353=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#HVAC_System','HVAC System','HVAC System',#343,'See Heating_Ventilation_Air_Conditioning_System',$);
#354=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Shading_System','Shading System','Shading System',#343,'Devices that can control daylighting through various means',$);
#355=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Blind_Group','Blind Group','Blind Group',#354,'A group of Blinds commonly attached to a single controller.',$);
#356=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Heating_Ventilation_Air_Conditioning_System','Heating Ventilation Air Conditioning System','Heating Ventilation Air Conditioning System',#343,'The equipment, distribution systems and terminals that provide, either collectively or individually, the processes of heating, ventilating or air conditioning to a building or portion of a building',$);
#357=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Steam_System','Steam System','Steam System',#356,'The equipment, devices and conduits that handle the production and distribution of steam in a building',$);
#358=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Air_System','Air System','Air System',#356,'The equipment, distribution systems and terminals that introduce or exhaust, either collectively or individually, the air into and from the building',$);
#359=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Ventilation_Air_System','Ventilation Air System','Ventilation Air System',#358,'The equipment, devices, and conduits that handle the introduction and distribution of ventilation air in the building',$);
#360=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Water_System','Water System','Water System',#356,'The equipment, devices and conduits that handle the production and distribution of water in a building',$);
#361=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Chilled_Water_System','Chilled Water System','Chilled Water System',#360,'The equipment, devices and conduits that handle the production and distribution of chilled water in a building',$);
#362=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Condenser_Water_System','Condenser Water System','Condenser Water System',#360,'A heat rejection system consisting of (typically) cooling towers, condenser water pumps, chillers and the piping connecting the components',$);
#363=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Hot_Water_System','Hot Water System','Hot Water System',#360,'The equipment, devices and conduits that handle the production and distribution of hot water in a building',$);
#364=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Heat_Recovery_Hot_Water_System','Heat Recovery Hot Water System','Heat Recovery Hot Water System',#363,'',$);
#365=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Preheat_Hot_Water_System','Preheat Hot Water System','Preheat Hot Water System',#363,'',$);
#366=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Radiation_Hot_Water_System','Radiation Hot Water System','Radiation Hot Water System',#363,'',$);
#367=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Reheat_Hot_Water_System','Reheat Hot Water System','Reheat Hot Water System',#363,'',$);
#368=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Safety_System','Safety System','Safety System',#343,'',$);
#369=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Emergency_Air_Flow_System','Emergency Air Flow System','Emergency Air Flow System',#368,'',$);
#370=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Emergency_Power_Off_System','Emergency Power Off System','Emergency Power Off System',#368,'A system that can power down a single piece of equipment or a single system from a single point',$);
#371=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Fire_Safety_System','Fire Safety System','Fire Safety System',#368,'A system containing devices and equipment that monitor, detect and suppress fire hazards',$);
#372=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Alarm','Alarm','Alarm',#1,'Alarm points are signals (either audible or visual) that alert an operator to an off-normal condition which requires some form of corrective action',$);
#373=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Change_Filter_Alarm','Change Filter Alarm','Change Filter Alarm',#372,'An alarm that indicates that a filter must be changed',$);
#374=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Communication_Loss_Alarm','Communication Loss Alarm','Communication Loss Alarm',#372,'An alarm that indicates a loss of communication e.g. with a device or controller',$);
#375=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Liquid_Detection_Alarm','Liquid Detection Alarm','Liquid Detection Alarm',#372,'',$);
#376=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Low_Battery_Alarm','Low Battery Alarm','Low Battery Alarm',#372,'An alarm that indicates the battery is low.',$);
#377=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Luminance_Alarm','Luminance Alarm','Luminance Alarm',#372,'',$);
#378=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Maintenance_Required_Alarm','Maintenance Required Alarm','Maintenance Required Alarm',#372,'An alarm that indicates that repair/maintenance is required on an associated device or equipment',$);
#379=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Overload_Alarm','Overload Alarm','Overload Alarm',#372,'An alarm that can indicate when a full-load current is exceeded.',$);
#380=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Valve_Position_Alarm','Valve Position Alarm','Valve Position Alarm',#372,'An alarm that indicates that the valve position is not in a normal state.',$);
#381=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#CO2_Alarm','CO2 Alarm','CO2 Alarm',#372,'An alarm that indicates the off-normal conditions associated with the presence of carbon dioxide.',$);
#382=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#High_CO2_Alarm','High CO2 Alarm','High CO2 Alarm',#381,'A device that indicates high concentration of carbon dioxide.',$);
#383=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Cycle_Alarm','Cycle Alarm','Cycle Alarm',#372,'An alarm that indicates off-normal conditions associated with HVAC cycles',$);
#384=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Short_Cycle_Alarm','Short Cycle Alarm','Short Cycle Alarm',#383,'An alarm that indicates a short cycle occurred. A short cycle occurs when a cooling cycle is prevented from completing its full cycle',$);
#385=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Emergency_Alarm','Emergency Alarm','Emergency Alarm',#372,'Alarms that indicate off-normal conditions associated with emergency systems',$);
#386=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Emergency_Generator_Alarm','Emergency Generator Alarm','Emergency Generator Alarm',#385,'An alarm that indicates off-normal conditions associated with an emergency generator',$);
#387=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Leak_Alarm','Leak Alarm','Leak Alarm',#372,'An alarm that indicates leaks occured in systems containing fluids',$);
#388=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Condensate_Leak_Alarm','Condensate Leak Alarm','Condensate Leak Alarm',#387,'An alarm that indicates a leak of condensate from a cooling system',$);
#389=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Power_Alarm','Power Alarm','Power Alarm',#372,'An alarm that indicates the off-normal conditions associated with electrical power.',$);
#390=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Power_Loss_Alarm','Power Loss Alarm','Power Loss Alarm',#389,'An alarm that indicates a power failure.',$);
#391=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Smoke_Alarm','Smoke Alarm','Smoke Alarm',#372,'An alarm that indicates the off-normal conditions associated with smoke.',$);
#392=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Smoke_Detection_Alarm','Smoke Detection Alarm','Smoke Detection Alarm',#391,'',$);
#393=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Supply_Air_Smoke_Detection_Alarm','Supply Air Smoke Detection Alarm','Supply Air Smoke Detection Alarm',#392,'',$);
#394=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Discharge_Air_Smoke_Detection_Alarm','Discharge Air Smoke Detection Alarm','Discharge Air Smoke Detection Alarm',#392,'',$);
#395=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Voltage_Alarm','Voltage Alarm','Voltage Alarm',#372,'An alarm that indicates the voltage is not in a normal state.',$);
#396=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Low_Voltage_Alarm','Low Voltage Alarm','Low Voltage Alarm',#395,'An alarm that indicates the voltage is lower than its normal state.',$);
#397=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Failure_Alarm','Failure Alarm','Failure Alarm',#372,'Alarms that indicate the failure of devices, equipment, systems and control loops',$);
#398=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Sensor_Failure_Alarm','Sensor Failure Alarm','Sensor Failure Alarm',#397,'',$);
#399=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Unit_Failure_Alarm','Unit Failure Alarm','Unit Failure Alarm',#397,'An alarm that indicates the failure of an equipment or device',$);
#400=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Humidity_Alarm','Humidity Alarm','Humidity Alarm',#372,'An alarm that indicates the off-normal conditions associated with the concentration of water vapor in the air.',$);
#401=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#High_Humidity_Alarm','High Humidity Alarm','High Humidity Alarm',#400,'An alarm that indicates high concentration of water vapor in the air.',$);
#402=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Low_Humidity_Alarm','Low Humidity Alarm','Low Humidity Alarm',#400,'An alarm that indicates low concentration of water vapor in the air.',$);
#403=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Pressure_Alarm','Pressure Alarm','Pressure Alarm',#372,'An alarm that indicates the off-normal conditions associated with pressure.',$);
#404=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#High_Head_Pressure_Alarm','High Head Pressure Alarm','High Head Pressure Alarm',#403,'An alarm that indicates a high pressure generated on the output side of a gas compressor in a refrigeration or air conditioning system.',$);
#405=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Low_Suction_Pressure_Alarm','Low Suction Pressure Alarm','Low Suction Pressure Alarm',#403,'An alarm that indicates a low suction pressure in the compressor in a refrigeration or air conditioning system.',$);
#406=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Air_Alarm','Air Alarm','Air Alarm',#372,'',$);
#407=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Air_Flow_Alarm','Air Flow Alarm','Air Flow Alarm',#406,'An alarm related to air flow.',$);
#408=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Air_Flow_Loss_Alarm','Air Flow Loss Alarm','Air Flow Loss Alarm',#407,'An alarm that indicates loss in air flow.',$);
#409=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#High_Air_Flow_Alarm','High Air Flow Alarm','High Air Flow Alarm',#407,'An alarm that indicates that the air flow is higher than normal.',$);
#410=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Low_Air_Flow_Alarm','Low Air Flow Alarm','Low Air Flow Alarm',#407,'An alarm that indicates that the air flow is lower than normal.',$);
#411=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Low_Supply_Air_Flow_Alarm','Low Supply Air Flow Alarm','Low Supply Air Flow Alarm',#410,'',$);
#412=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Low_Discharge_Air_Flow_Alarm','Low Discharge Air Flow Alarm','Low Discharge Air Flow Alarm',#410,'An alarm that indicates that the discharge air flow is lower than normal.',$);
#413=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Air_Temperature_Alarm','Air Temperature Alarm','Air Temperature Alarm',#406,'An alarm that indicates the off-normal conditions associated with the temperature of air.',$);
#414=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Return_Air_Temperature_Alarm','Return Air Temperature Alarm','Return Air Temperature Alarm',#413,'An alarm that indicates the off-normal conditions associated with the temperature of return air.',$);
#415=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#High_Return_Air_Temperature_Alarm','High Return Air Temperature Alarm','High Return Air Temperature Alarm',#414,'An alarm that indicates that return air temperature is too high',$);
#416=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Low_Return_Air_Temperature_Alarm','Low Return Air Temperature Alarm','Low Return Air Temperature Alarm',#414,'An alarm that indicates that return air temperature is too low',$);
#417=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Supply_Air_Temperature_Alarm','Supply Air Temperature Alarm','Supply Air Temperature Alarm',#413,'An alarm that indicates the off-normal conditions associated with the temperature of supply air.',$);
#418=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#High_Supply_Air_Temperature_Alarm','High Supply Air Temperature Alarm','High Supply Air Temperature Alarm',#417,'',$);
#419=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Low_Supply_Air_Temperature_Alarm','Low Supply Air Temperature Alarm','Low Supply Air Temperature Alarm',#417,'',$);
#420=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Discharge_Air_Temperature_Alarm','Discharge Air Temperature Alarm','Discharge Air Temperature Alarm',#413,'An alarm that indicates the off-normal conditions associated with the temperature of discharge air.',$);
#421=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#High_Discharge_Air_Temperature_Alarm','High Discharge Air Temperature Alarm','High Discharge Air Temperature Alarm',#420,'An alarm that indicates that discharge air temperature is too high',$);
#422=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Low_Discharge_Air_Temperature_Alarm','Low Discharge Air Temperature Alarm','Low Discharge Air Temperature Alarm',#420,'',$);
#423=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Temperature_Alarm','Temperature Alarm','Temperature Alarm',#372,'An alarm that indicates the off-normal conditions associated with temperature.',$);
#424=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Water_Temperature_Alarm','Water Temperature Alarm','Water Temperature Alarm',#423,'An alarm that indicates the off-normal conditions associated with temperature of water.',$);
#425=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Entering_Water_Temperature_Alarm','Entering Water Temperature Alarm','Entering Water Temperature Alarm',#424,'An alarm that indicates the off-normal conditions associated with temperature of the entering water.',$);
#426=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Leaving_Water_Temperature_Alarm','Leaving Water Temperature Alarm','Leaving Water Temperature Alarm',#424,'An alarm that indicates the off-normal conditions associated with temperature of the leaving water.',$);
#427=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#High_Temperature_Alarm','High Temperature Alarm','High Temperature Alarm',#423,'An alarm that indicates high temperature.',$);
#428=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Low_Temperature_Alarm','Low Temperature Alarm','Low Temperature Alarm',#423,'An alarm that indicates low temperature.',$);
#429=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Water_Alarm','Water Alarm','Water Alarm',#372,'Alarm that indicates an undesirable event with a pipe, container, or equipment carrying water e.g. water leak',$);
#430=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Deionized_Water_Alarm','Deionized Water Alarm','Deionized Water Alarm',#429,'An alarm that indicates deionized water leaks.',$);
#431=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#No_Water_Alarm','No Water Alarm','No Water Alarm',#429,'Alarm indicating that there is no water in the equipment or system',$);
#432=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Water_Loss_Alarm','Water Loss Alarm','Water Loss Alarm',#429,'An alarm that indicates a loss of water e.g. during transport',$);
#433=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Water_Level_Alarm','Water Level Alarm','Water Level Alarm',#429,'An alarm that indicates a high or low water level e.g. in a basin',$);
#434=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Collection_Basin_Water_Level_Alarm','Collection Basin Water Level Alarm','Collection Basin Water Level Alarm',#433,'An alarm that indicates a high or low level of water in the collection basin, e.g. within a Cooling_Tower',$);
#435=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Max_Water_Level_Alarm','Max Water Level Alarm','Max Water Level Alarm',#433,'Alarm indicating that the maximum water level was reached',$);
#436=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Min_Water_Level_Alarm','Min Water Level Alarm','Min Water Level Alarm',#433,'Alarm indicating that the minimum water level was reached',$);
#437=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Sensor','Sensor','Sensor',#1,'A Sensor is an input point that represents the value of a device or instrument designed to detect and measure a variable (ASHRAE Dictionary).',$);
#438=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Capacity_Sensor','Capacity Sensor','Capacity Sensor',#437,'',$);
#439=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Contact_Sensor','Contact Sensor','Contact Sensor',#437,'Senses or detects contact, such as for determining if a door is closed.',$);
#440=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Fire_Sensor','Fire Sensor','Fire Sensor',#437,'Measures the presence of fire',$);
#441=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Frost_Sensor','Frost Sensor','Frost Sensor',#437,'Senses the presence of frost or conditions that may cause frost',$);
#442=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Gas_Sensor','Gas Sensor','Gas Sensor',#437,'Measures gas concentration (other than CO2)',$);
#443=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Hail_Sensor','Hail Sensor','Hail Sensor',#437,'Measures hail in terms of its size and damage potential',$);
#444=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Luminance_Sensor','Luminance Sensor','Luminance Sensor',#437,'Measures the luminous intensity per unit area of light travelling in a given direction',$);
#445=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Occupancy_Count_Sensor','Occupancy Count Sensor','Occupancy Count Sensor',#437,'Sensors measuring the number of people in an area',$);
#446=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Occupancy_Sensor','Occupancy Sensor','Occupancy Sensor',#437,'Detects occupancy of some space or area',$);
#447=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Piezoelectric_Sensor','Piezoelectric Sensor','Piezoelectric Sensor',#437,'Senses changes pressure, acceleration, temperature, force or strain via the piezoelectric effect',$);
#448=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Power_Factor_Sensor','Power Factor Sensor','Power Factor Sensor',#437,'Sensors measuring power Factor, under periodic conditions, is the ratio of the absolute value of the active power (P) to the apparent power (S).',$);
#449=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Rain_Level_Sensor','Rain Level Sensor','Rain Level Sensor',#437,'Measures the amount of precipitation fallen',$);
#450=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Refrigerant_Level_Sensor','Refrigerant Level Sensor','Refrigerant Level Sensor',#437,'',$);
#451=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Solar_Radiance_Sensor','Solar Radiance Sensor','Solar Radiance Sensor',#437,'The amount of light that passes through or is emitted from the sun and falls within a given solid angle in a specified direction',$);
#452=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Conductivity_Sensor','Conductivity Sensor','Conductivity Sensor',#437,'Measures electrical conductance',$);
#453=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Deionised_Water_Conductivity_Sensor','Deionised Water Conductivity Sensor','Deionised Water Conductivity Sensor',#452,'Measures the electrical conductance of deionised water',$);
#454=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Direction_Sensor','Direction Sensor','Direction Sensor',#437,'Measures the direction in degrees in which a phenomenon is occuring',$);
#455=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Wind_Direction_Sensor','Wind Direction Sensor','Wind Direction Sensor',#454,'Measures the direction of wind in degrees relative to North',$);
#456=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Enthalpy_Sensor','Enthalpy Sensor','Enthalpy Sensor',#437,'Measures the total heat content of some substance',$);
#457=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Air_Enthalpy_Sensor','Air Enthalpy Sensor','Air Enthalpy Sensor',#456,'Measures the total heat content of air',$);
#458=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Outside_Air_Enthalpy_Sensor','Outside Air Enthalpy Sensor','Outside Air Enthalpy Sensor',#457,'Measures the total heat content of outside air',$);
#459=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Return_Air_Enthalpy_Sensor','Return Air Enthalpy Sensor','Return Air Enthalpy Sensor',#457,'Measures the total heat content of return air',$);
#460=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Frequency_Sensor','Frequency Sensor','Frequency Sensor',#437,'Measures the frequency of a phenomenon or aspect of a phenomenon, e.g. the frequency of a fan turning',$);
#461=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Output_Frequency_Sensor','Output Frequency Sensor','Output Frequency Sensor',#460,'',$);
#462=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Generation_Sensor','Generation Sensor','Generation Sensor',#437,'A sensor measuring how much something has been generated.',$);
#463=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Energy_Generation_Sensor','Energy Generation Sensor','Energy Generation Sensor',#462,'A sensor measuring the amount of generated energy.',$);
#464=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Heat_Sensor','Heat Sensor','Heat Sensor',#437,'Measures heat',$);
#465=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Trace_Heat_Sensor','Trace Heat Sensor','Trace Heat Sensor',#464,'Measures the surface temperature of pipelines carrying temperature-sensitive products; typically used to avoid frosting/freezing',$);
#466=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Humidity_Sensor','Humidity Sensor','Humidity Sensor',#437,'Measures the concentration of water vapor in air',$);
#467=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Relative_Humidity_Sensor','Relative Humidity Sensor','Relative Humidity Sensor',#466,'Measures the present state of absolute humidity relative to a maximum humidity given the same temperature',$);
#468=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Exhaust_Air_Humidity_Sensor','Exhaust Air Humidity Sensor','Exhaust Air Humidity Sensor',#467,'Measures the relative humidity of exhaust air',$);
#469=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Mixed_Air_Humidity_Sensor','Mixed Air Humidity Sensor','Mixed Air Humidity Sensor',#467,'Measures the humidity of mixed air',$);
#470=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Outside_Air_Humidity_Sensor','Outside Air Humidity Sensor','Outside Air Humidity Sensor',#467,'Measures the relative humidity of outside air',$);
#471=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Return_Air_Humidity_Sensor','Return Air Humidity Sensor','Return Air Humidity Sensor',#467,'Measures the relative humidity of return air',$);
#472=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Supply_Air_Humidity_Sensor','Supply Air Humidity Sensor','Supply Air Humidity Sensor',#467,'Measures the relative humidity of supply air',$);
#473=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Zone_Air_Humidity_Sensor','Zone Air Humidity Sensor','Zone Air Humidity Sensor',#467,'Measures the relative humidity of zone air',$);
#474=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Discharge_Air_Humidity_Sensor','Discharge Air Humidity Sensor','Discharge Air Humidity Sensor',#467,'Measures the relative humidity of discharge air',$);
#475=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Illuminance_Sensor','Illuminance Sensor','Illuminance Sensor',#437,'Measures the total luminous flux incident on a surface, per unit area',$);
#476=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Outside_Illuminance_Sensor','Outside Illuminance Sensor','Outside Illuminance Sensor',#475,'Measures the total luminous flux incident on an outside, per unit area',$);
#477=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Motion_Sensor','Motion Sensor','Motion Sensor',#437,'Detects the presence of motion in some area',$);
#478=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#PIR_Sensor','PIR Sensor','PIR Sensor',#477,'Detects the presense of motion in some area using the differential change in infrared intensity between two or more receptors',$);
#479=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Torque_Sensor','Torque Sensor','Torque Sensor',#437,'Measures torque, the tendency of a force to rotate an object about some axis',$);
#480=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Motor_Torque_Sensor','Motor Torque Sensor','Motor Torque Sensor',#479,'Measures the torque, or rotating power, of a motor',$);
#481=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Adjust_Sensor','Adjust Sensor','Adjust Sensor',#437,'Measures user-provided adjustment of some value',$);
#482=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Temperature_Adjust_Sensor','Temperature Adjust Sensor','Temperature Adjust Sensor',#481,'Measures user-provided adjustment of temperature',$);
#483=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Warm_Cool_Adjust_Sensor','Warm Cool Adjust Sensor','Warm Cool Adjust Sensor',#481,'User provided adjustment of zone temperature, typically in the range of +/- 5 degrees',$);
#484=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Air_Grains_Sensor','Air Grains Sensor','Air Grains Sensor',#437,'Measures the mass of water vapor in air',$);
#485=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Outside_Air_Grains_Sensor','Outside Air Grains Sensor','Outside Air Grains Sensor',#484,'Measures the mass of water vapor in outside air',$);
#486=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Return_Air_Grains_Sensor','Return Air Grains Sensor','Return Air Grains Sensor',#484,'Measures the mass of water vapor in return air',$);
#487=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Angle_Sensor','Angle Sensor','Angle Sensor',#437,'Measues the planar angle of some phenomenon',$);
#488=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Solar_Azimuth_Angle_Sensor','Solar Azimuth Angle Sensor','Solar Azimuth Angle Sensor',#487,'Measures the azimuth angle of the sun',$);
#489=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Solar_Zenith_Angle_Sensor','Solar Zenith Angle Sensor','Solar Zenith Angle Sensor',#487,'Measures the zenith angle of the sun',$);
#490=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Energy_Sensor','Energy Sensor','Energy Sensor',#437,'Measures energy consumption',$);
#491=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Energy_Usage_Sensor','Energy Usage Sensor','Energy Usage Sensor',#490,'Measures the total amount of energy used over some period of time',$);
#492=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Electric_Energy_Sensor','Electric Energy Sensor','Electric Energy Sensor',#490,'',$);
#493=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Reactive_Energy_Sensor','Reactive Energy Sensor','Reactive Energy Sensor',#492,'Measures the integral of reactive power',$);
#494=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Imbalance_Sensor','Imbalance Sensor','Imbalance Sensor',#437,'A sensor which measures difference (imbalance) between phases of an electrical system',$);
#495=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Current_Imbalance_Sensor','Current Imbalance Sensor','Current Imbalance Sensor',#494,'A sensor which measures the current difference (imbalance) between phases of an electrical system',$);
#496=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Voltage_Imbalance_Sensor','Voltage Imbalance Sensor','Voltage Imbalance Sensor',#494,'A sensor which measures the voltage difference (imbalance) between phases of an electrical system',$);
#497=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Power_Sensor','Power Sensor','Power Sensor',#437,'Measures the amount of instantaneous power consumed',$);
#498=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Thermal_Power_Sensor','Thermal Power Sensor','Thermal Power Sensor',#497,'',$);
#499=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Heating_Thermal_Power_Sensor','Heating Thermal Power Sensor','Heating Thermal Power Sensor',#498,'',$);
#500=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Electric_Power_Sensor','Electric Power Sensor','Electric Power Sensor',#497,'Measures the amount of instantaneous electric power consumed',$);
#501=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Active_Power_Sensor','Active Power Sensor','Active Power Sensor',#500,'Measures the portion of power that, averaged over a complete cycle of the AC waveform, results in net transfer of energy in one direction',$);
#502=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Reactive_Power_Sensor','Reactive Power Sensor','Reactive Power Sensor',#500,'Measures the portion of power that, averaged over a complete cycle of the AC waveform, is due to stored energy which returns to the source in each cycle',$);
#503=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Water_Level_Sensor','Water Level Sensor','Water Level Sensor',#437,'Measures the height/level of water in some container',$);
#504=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Collection_Basin_Water_Level_Sensor','Collection Basin Water Level Sensor','Collection Basin Water Level Sensor',#503,'Measures the level of the water in the collection basin, e.g. within a Cooling_Tower',$);
#505=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Deionised_Water_Level_Sensor','Deionised Water Level Sensor','Deionised Water Level Sensor',#503,'Measures the height/level of deionised water in some container',$);
#506=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Current_Sensor','Current Sensor','Current Sensor',#437,'Senses the amperes of electrical current passing through the sensor',$);
#507=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Load_Current_Sensor','Load Current Sensor','Load Current Sensor',#506,'Measures the current consumed by a load',$);
#508=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Motor_Current_Sensor','Motor Current Sensor','Motor Current Sensor',#506,'Measures the current consumed by a motor',$);
#509=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Current_Output_Sensor','Current Output Sensor','Current Output Sensor',#506,'Senses the amperes of electrical current produced as output by a device',$);
#510=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Photovoltaic_Current_Output_Sensor','Photovoltaic Current Output Sensor','Photovoltaic Current Output Sensor',#509,'Senses the amperes of electrical current produced as output by a photovoltaic device',$);
#511=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#PV_Current_Output_Sensor','PV Current Output Sensor','PV Current Output Sensor',#509,'See Photovoltaic_Current_Output_Sensor',$);
#512=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Demand_Sensor','Demand Sensor','Demand Sensor',#437,'Measures the amount of power consumed by the use of some process; typically found by multiplying the tonnage of a unit (e.g. RTU) by the efficiency rating in kW/ton',$);
#513=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Peak_Demand_Sensor','Peak Demand Sensor','Peak Demand Sensor',#512,'The peak power consumed by a process over some period of time',$);
#514=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Cooling_Demand_Sensor','Cooling Demand Sensor','Cooling Demand Sensor',#512,'Measures the amount of power consumed by a cooling process; typically found by multiplying the tonnage of a unit (e.g. RTU) by the efficiency rating in kW/ton',$);
#515=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Average_Cooling_Demand_Sensor','Average Cooling Demand Sensor','Average Cooling Demand Sensor',#514,'Measures the average power consumed by a cooling process as the amount of power consumed over some interval',$);
#516=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Heating_Demand_Sensor','Heating Demand Sensor','Heating Demand Sensor',#512,'Measures the amount of power consumed by a heating process; typically found by multiplying the tonnage of a unit (e.g. RTU) by the efficiency rating in kW/ton',$);
#517=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Average_Heating_Demand_Sensor','Average Heating Demand Sensor','Average Heating Demand Sensor',#516,'Measures the average power consumed by a heating process as the amount of power consumed over some interval',$);
#518=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Duration_Sensor','Duration Sensor','Duration Sensor',#437,'Measures the duration of a phenomenon or event',$);
#519=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#On_Timer_Sensor','On Timer Sensor','On Timer Sensor',#518,'Measures the duration for which a device was in an active or "on" state',$);
#520=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Rain_Duration_Sensor','Rain Duration Sensor','Rain Duration Sensor',#518,'Measures the duration of precipitation within some time frame',$);
#521=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Run_Time_Sensor','Run Time Sensor','Run Time Sensor',#518,'Measures the duration for which a device was in an active or "on" state',$);
#522=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Flow_Sensor','Flow Sensor','Flow Sensor',#437,'Measures the rate of flow of some substance',$);
#523=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Natural_Gas_Flow_Sensor','Natural Gas Flow Sensor','Natural Gas Flow Sensor',#522,'Measures the rate of flow of natural gas',$);
#524=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Air_Flow_Sensor','Air Flow Sensor','Air Flow Sensor',#522,'Measures the rate of flow of air',$);
#525=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Bypass_Air_Flow_Sensor','Bypass Air Flow Sensor','Bypass Air Flow Sensor',#524,'Measures the rate of flow of bypass air',$);
#526=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Fume_Hood_Air_Flow_Sensor','Fume Hood Air Flow Sensor','Fume Hood Air Flow Sensor',#524,'Measures the rate of flow of air in a fume hood',$);
#527=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Mixed_Air_Flow_Sensor','Mixed Air Flow Sensor','Mixed Air Flow Sensor',#524,'Measures the rate of flow of mixed air',$);
#528=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Outside_Air_Flow_Sensor','Outside Air Flow Sensor','Outside Air Flow Sensor',#524,'Measures the rate of flow of outside air into the system',$);
#529=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Return_Air_Flow_Sensor','Return Air Flow Sensor','Return Air Flow Sensor',#524,'Measures the rate of flow of return air',$);
#530=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Exhaust_Air_Flow_Sensor','Exhaust Air Flow Sensor','Exhaust Air Flow Sensor',#524,'Measures the rate of flow of exhaust air',$);
#531=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Exhaust_Air_Stack_Flow_Sensor','Exhaust Air Stack Flow Sensor','Exhaust Air Stack Flow Sensor',#530,'Measures the rate of flow of air in the exhaust air stack',$);
#532=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Supply_Air_Flow_Sensor','Supply Air Flow Sensor','Supply Air Flow Sensor',#524,'Measures the rate of flow of supply air',$);
#533=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Average_Supply_Air_Flow_Sensor','Average Supply Air Flow Sensor','Average Supply Air Flow Sensor',#532,'The computed average flow of supply air over some interval',$);
#534=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Discharge_Air_Flow_Sensor','Discharge Air Flow Sensor','Discharge Air Flow Sensor',#524,'Measures the rate of flow of discharge air',$);
#535=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Average_Discharge_Air_Flow_Sensor','Average Discharge Air Flow Sensor','Average Discharge Air Flow Sensor',#534,'The computed average flow of discharge air over some interval',$);
#536=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Water_Flow_Sensor','Water Flow Sensor','Water Flow Sensor',#522,'Measures the rate of flow of water',$);
#537=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Bypass_Water_Flow_Sensor','Bypass Water Flow Sensor','Bypass Water Flow Sensor',#536,'Measures the rate of flow of bypass water',$);
#538=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Entering_Water_Flow_Sensor','Entering Water Flow Sensor','Entering Water Flow Sensor',#536,'Measures the rate of flow of water entering a piece of equipment or system',$);
#539=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Entering_Chilled_Water_Flow_Sensor','Entering Chilled Water Flow Sensor','Entering Chilled Water Flow Sensor',#538,'Measures the rate of flow of chilled entering water',$);
#540=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Entering_Condenser_Water_Flow_Sensor','Entering Condenser Water Flow Sensor','Entering Condenser Water Flow Sensor',#538,'Measures the flow of the entering condenser water',$);
#541=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Entering_Hot_Water_Flow_Sensor','Entering Hot Water Flow Sensor','Entering Hot Water Flow Sensor',#538,'Measures the rate of flow of hot entering water',$);
#542=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Leaving_Water_Flow_Sensor','Leaving Water Flow Sensor','Leaving Water Flow Sensor',#536,'Measures the rate of flow of water that is leaving a piece of equipment or system',$);
#543=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Leaving_Chilled_Water_Flow_Sensor','Leaving Chilled Water Flow Sensor','Leaving Chilled Water Flow Sensor',#542,'Measures the rate of flow of chilled leaving water',$);
#544=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Leaving_Condenser_Water_Flow_Sensor','Leaving Condenser Water Flow Sensor','Leaving Condenser Water Flow Sensor',#542,'Measures the flow of the leaving condenser water',$);
#545=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Leaving_Hot_Water_Flow_Sensor','Leaving Hot Water Flow Sensor','Leaving Hot Water Flow Sensor',#542,'Measures the rate of flow of hot leaving water',$);
#546=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Condenser_Water_Flow_Sensor','Condenser Water Flow Sensor','Condenser Water Flow Sensor',#536,'Measures the flow of the condenser water',$);
#547=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Chilled_Water_Flow_Sensor','Chilled Water Flow Sensor','Chilled Water Flow Sensor',#536,'Measures the rate of flow in a chilled water circuit',$);
#548=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Hot_Water_Flow_Sensor','Hot Water Flow Sensor','Hot Water Flow Sensor',#536,'Measures the rate of flow in a hot water circuit',$);
#549=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Position_Sensor','Position Sensor','Position Sensor',#437,'Measures the current position of a component in terms of a fraction of its full range of motion',$);
#550=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Damper_Position_Sensor','Damper Position Sensor','Damper Position Sensor',#549,'Measures the current position of a damper in terms of the percent of fully open',$);
#551=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Sash_Position_Sensor','Sash Position Sensor','Sash Position Sensor',#549,'Measures the current position of a sash in terms of the percent of fully open',$);
#552=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Valve_Position_Sensor','Valve Position Sensor','Valve Position Sensor',#549,'Measures the current position of a valve in terms of the percent of fully open',$);
#553=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Pressure_Sensor','Pressure Sensor','Pressure Sensor',#437,'Measure the amount of force acting on a unit area',$);
#554=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Velocity_Pressure_Sensor','Velocity Pressure Sensor','Velocity Pressure Sensor',#553,'Measures the difference between total pressure and static pressure',$);
#555=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Exhaust_Air_Velocity_Pressure_Sensor','Exhaust Air Velocity Pressure Sensor','Exhaust Air Velocity Pressure Sensor',#554,'',$);
#556=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Supply_Air_Velocity_Pressure_Sensor','Supply Air Velocity Pressure Sensor','Supply Air Velocity Pressure Sensor',#554,'',$);
#557=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Discharge_Air_Velocity_Pressure_Sensor','Discharge Air Velocity Pressure Sensor','Discharge Air Velocity Pressure Sensor',#554,'',$);
#558=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Differential_Pressure_Sensor','Differential Pressure Sensor','Differential Pressure Sensor',#553,'Measures the difference between two applied pressures',$);
#559=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Chilled_Water_Differential_Pressure_Sensor','Chilled Water Differential Pressure Sensor','Chilled Water Differential Pressure Sensor',#558,'Measures the difference in water pressure on either side of a chilled water valve',$);
#560=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Filter_Differential_Pressure_Sensor','Filter Differential Pressure Sensor','Filter Differential Pressure Sensor',#558,'Measures the difference in pressure on either side of a filter',$);
#561=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Hot_Water_Differential_Pressure_Sensor','Hot Water Differential Pressure Sensor','Hot Water Differential Pressure Sensor',#558,'Measures the difference in water pressure on either side of a hot water valve',$);
#562=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Medium_Temperature_Hot_Water_Differential_Pressure_Sensor','Medium Temperature Hot Water Differential Pressure Sensor','Medium Temperature Hot Water Differential Pressure Sensor',#561,'Measures the difference in water pressure between sections of a medium temperature hot water system',$);
#563=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Air_Differential_Pressure_Sensor','Air Differential Pressure Sensor','Air Differential Pressure Sensor',#558,'Measures the difference in pressure between two regions of air',$);
#564=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Exhaust_Air_Differential_Pressure_Sensor','Exhaust Air Differential Pressure Sensor','Exhaust Air Differential Pressure Sensor',#563,'Measures the difference in pressure between an upstream and downstream of an air duct or other air conduit used to exhaust air from the building',$);
#565=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Return_Air_Differential_Pressure_Sensor','Return Air Differential Pressure Sensor','Return Air Differential Pressure Sensor',#563,'Measures the difference in pressure between the return and supply side',$);
#566=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Supply_Air_Differential_Pressure_Sensor','Supply Air Differential Pressure Sensor','Supply Air Differential Pressure Sensor',#563,'Measures the difference in pressure between an upstream and downstream of an air duct or other air conduit used to supply air into the building',$);
#567=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Discharge_Air_Differential_Pressure_Sensor','Discharge Air Differential Pressure Sensor','Discharge Air Differential Pressure Sensor',#563,'',$);
#568=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Static_Pressure_Sensor','Static Pressure Sensor','Static Pressure Sensor',#553,'Measures resistance to airflow in a heating and cooling system''s components and duct work',$);
#569=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Building_Air_Static_Pressure_Sensor','Building Air Static Pressure Sensor','Building Air Static Pressure Sensor',#568,'The static pressure of air within a building',$);
#570=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Supply_Air_Static_Pressure_Sensor','Supply Air Static Pressure Sensor','Supply Air Static Pressure Sensor',#568,'The static pressure of air within supply regions of an HVAC system',$);
#571=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Underfloor_Air_Plenum_Static_Pressure_Sensor','Underfloor Air Plenum Static Pressure Sensor','Underfloor Air Plenum Static Pressure Sensor',#568,'Measures the outward push of air against the plenum surfaces and used to measure the resistance when air moves through the plenum',$);
#572=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Discharge_Air_Static_Pressure_Sensor','Discharge Air Static Pressure Sensor','Discharge Air Static Pressure Sensor',#568,'The static pressure of air within discharge regions of an HVAC system',$);
#573=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Exhaust_Air_Static_Pressure_Sensor','Exhaust Air Static Pressure Sensor','Exhaust Air Static Pressure Sensor',#568,'The static pressure of air within exhaust regions of an HVAC system',$);
#574=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Average_Exhaust_Air_Static_Pressure_Sensor','Average Exhaust Air Static Pressure Sensor','Average Exhaust Air Static Pressure Sensor',#573,'The computed average static pressure of air in exhaust regions of an HVAC system over some period of time',$);
#575=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Lowest_Exhaust_Air_Static_Pressure_Sensor','Lowest Exhaust Air Static Pressure Sensor','Lowest Exhaust Air Static Pressure Sensor',#573,'The lowest observed static pressure of air in exhaust regions of an HVAC system over some period of time',$);
#576=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Speed_Sensor','Speed Sensor','Speed Sensor',#437,'Measures the magnitude of velocity of some form of movement',$);
#577=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Differential_Speed_Sensor','Differential Speed Sensor','Differential Speed Sensor',#576,'',$);
#578=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Motor_Speed_Sensor','Motor Speed Sensor','Motor Speed Sensor',#576,'',$);
#579=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Wind_Speed_Sensor','Wind Speed Sensor','Wind Speed Sensor',#576,'Measured speed of wind, caused by air moving from high to low pressure',$);
#580=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Voltage_Sensor','Voltage Sensor','Voltage Sensor',#437,'Measures the voltage of an electrical device or object',$);
#581=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Battery_Voltage_Sensor','Battery Voltage Sensor','Battery Voltage Sensor',#580,'Measures the capacity of a battery',$);
#582=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#DC_Bus_Voltage_Sensor','DC Bus Voltage Sensor','DC Bus Voltage Sensor',#580,'Measures the voltage across a DC bus',$);
#583=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Output_Voltage_Sensor','Output Voltage Sensor','Output Voltage Sensor',#580,'Measures the voltage output by some process or device',$);
#584=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Usage_Sensor','Usage Sensor','Usage Sensor',#437,'Measures the amount of some substance that is consumed or used, over some period of time',$);
#585=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Natural_Gas_Usage_Sensor','Natural Gas Usage Sensor','Natural Gas Usage Sensor',#584,'Measures the amount of natural gas that is consumed or used, over some period of time',$);
#586=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Steam_Usage_Sensor','Steam Usage Sensor','Steam Usage Sensor',#584,'Measures the amount of steam that is consumed or used, over some period of time',$);
#587=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Water_Usage_Sensor','Water Usage Sensor','Water Usage Sensor',#584,'Measures the amount of water that is consumed, over some period of time',$);
#588=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Hot_Water_Usage_Sensor','Hot Water Usage Sensor','Hot Water Usage Sensor',#587,'Measures the amount of hot water that is consumed, over some period of time',$);
#589=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Dewpoint_Sensor','Dewpoint Sensor','Dewpoint Sensor',#437,'Senses the dewpoint temperature . Dew point is the temperature to which air must be cooled to become saturated with water vapor',$);
#590=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Exhaust_Air_Dewpoint_Sensor','Exhaust Air Dewpoint Sensor','Exhaust Air Dewpoint Sensor',#589,'Measures dewpoint of exhaust air',$);
#591=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Outside_Air_Dewpoint_Sensor','Outside Air Dewpoint Sensor','Outside Air Dewpoint Sensor',#589,'Senses the dewpoint temperature of outside air',$);
#592=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Return_Air_Dewpoint_Sensor','Return Air Dewpoint Sensor','Return Air Dewpoint Sensor',#589,'Senses the dewpoint temperature of return air',$);
#593=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Supply_Air_Dewpoint_Sensor','Supply Air Dewpoint Sensor','Supply Air Dewpoint Sensor',#589,'',$);
#594=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Zone_Air_Dewpoint_Sensor','Zone Air Dewpoint Sensor','Zone Air Dewpoint Sensor',#589,'Measures dewpoint of zone air',$);
#595=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Discharge_Air_Dewpoint_Sensor','Discharge Air Dewpoint Sensor','Discharge Air Dewpoint Sensor',#589,'Measures dewpoint of discharge air',$);
#596=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Temperature_Sensor','Temperature Sensor','Temperature Sensor',#437,'Measures temperature: the physical property of matter that quantitatively expresses the common notions of hot and cold',$);
#597=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Heat_Sink_Temperature_Sensor','Heat Sink Temperature Sensor','Heat Sink Temperature Sensor',#596,'Measure temperature of the heat sink on a device such as a VFD.',$);
#598=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Natural_Gas_Temperature_Sensor','Natural Gas Temperature Sensor','Natural Gas Temperature Sensor',#596,'Measures the temperature of natural gas',$);
#599=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Soil_Temperature_Sensor','Soil Temperature Sensor','Soil Temperature Sensor',#596,'Measures the temperature of soil',$);
#600=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Air_Wet_Bulb_Temperature_Sensor','Air Wet Bulb Temperature Sensor','Air Wet Bulb Temperature Sensor',#596,'',$);
#601=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Outside_Air_Wet_Bulb_Temperature_Sensor','Outside Air Wet Bulb Temperature Sensor','Outside Air Wet Bulb Temperature Sensor',#600,'A sensor measuring the wet-bulb temperature of outside air',$);
#602=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Radiant_Panel_Temperature_Sensor','Radiant Panel Temperature Sensor','Radiant Panel Temperature Sensor',#596,'Measures the temperature of the radiant panel of the radiant heating and cooling HVAC system.',$);
#603=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Inside_Face_Surface_Temperature_Sensor','Inside Face Surface Temperature Sensor','Inside Face Surface Temperature Sensor',#602,'Measures the inside surface (relative to the space) of the radiant panel of the radiant heating and cooling HVAC system.',$);
#604=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Outside_Face_Surface_Temperature_Sensor','Outside Face Surface Temperature Sensor','Outside Face Surface Temperature Sensor',#602,'Measures the outside surface (relative to the space) of the radiant panel of a radiant heating and cooling HVAC system.',$);
#605=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Embedded_Temperature_Sensor','Embedded Temperature Sensor','Embedded Temperature Sensor',#602,'Measures the internal temperature of the radiant layer of the radiant heating and cooling HVAC system.',$);
#606=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Core_Temperature_Sensor','Core Temperature Sensor','Core Temperature Sensor',#605,'Measures the internal temperature of the radiant layer at the heat source or sink level of the radiant heating and cooling HVAC system.',$);
#607=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Air_Temperature_Sensor','Air Temperature Sensor','Air Temperature Sensor',#596,'Measures the temperature of air',$);
#608=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Exhaust_Air_Temperature_Sensor','Exhaust Air Temperature Sensor','Exhaust Air Temperature Sensor',#607,'Measures the temperature of exhaust air',$);
#609=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Mixed_Air_Temperature_Sensor','Mixed Air Temperature Sensor','Mixed Air Temperature Sensor',#607,'Measures the temperature of mixed air',$);
#610=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Return_Air_Temperature_Sensor','Return Air Temperature Sensor','Return Air Temperature Sensor',#607,'Measures the temperature of return air',$);
#611=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Underfloor_Air_Temperature_Sensor','Underfloor Air Temperature Sensor','Underfloor Air Temperature Sensor',#607,'Measures the temperature of underfloor air',$);
#612=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Supply_Air_Temperature_Sensor','Supply Air Temperature Sensor','Supply Air Temperature Sensor',#607,'Measures the temperature of supply air',$);
#613=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Preheat_Supply_Air_Temperature_Sensor','Preheat Supply Air Temperature Sensor','Preheat Supply Air Temperature Sensor',#612,'Measures the temperature of supply air before it is heated',$);
#614=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Discharge_Air_Temperature_Sensor','Discharge Air Temperature Sensor','Discharge Air Temperature Sensor',#607,'Measures the temperature of discharge air',$);
#615=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Preheat_Discharge_Air_Temperature_Sensor','Preheat Discharge Air Temperature Sensor','Preheat Discharge Air Temperature Sensor',#614,'Measures the temperature of discharge air before heating is applied',$);
#616=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Outside_Air_Temperature_Sensor','Outside Air Temperature Sensor','Outside Air Temperature Sensor',#607,'Measures the temperature of outside air',$);
#617=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Intake_Air_Temperature_Sensor','Intake Air Temperature Sensor','Intake Air Temperature Sensor',#616,'Measures air at the interface between the building and the outside',$);
#618=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Outside_Air_Temperature_Enable_Differential_Sensor','Outside Air Temperature Enable Differential Sensor','Outside Air Temperature Enable Differential Sensor',#616,'',$);
#619=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Low_Outside_Air_Temperature_Enable_Differential_Sensor','Low Outside Air Temperature Enable Differential Sensor','Low Outside Air Temperature Enable Differential Sensor',#618,'',$);
#620=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Zone_Air_Temperature_Sensor','Zone Air Temperature Sensor','Zone Air Temperature Sensor',#607,'A physical or virtual sensor which represents the temperature of an HVAC Zone',$);
#621=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Average_Zone_Air_Temperature_Sensor','Average Zone Air Temperature Sensor','Average Zone Air Temperature Sensor',#620,'The computed average temperature of air in a zone, over some period of time',$);
#622=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Coldest_Zone_Air_Temperature_Sensor','Coldest Zone Air Temperature Sensor','Coldest Zone Air Temperature Sensor',#620,'The zone temperature that is coldest; drives the supply temperature of hot air. A computed value rather than a physical sensor. Also referred to as a ''Lowest Zone Air Temperature Sensor''',$);
#623=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Warmest_Zone_Air_Temperature_Sensor','Warmest Zone Air Temperature Sensor','Warmest Zone Air Temperature Sensor',#620,'The zone temperature that is warmest; drives the supply temperature of cold air. A computed value rather than a physical sensor. Also referred to as a ''Highest Zone Air Temperature Sensor''',$);
#624=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Water_Temperature_Sensor','Water Temperature Sensor','Water Temperature Sensor',#596,'Measures the temperature of water',$);
#625=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Collection_Basin_Water_Temperature_Sensor','Collection Basin Water Temperature Sensor','Collection Basin Water Temperature Sensor',#624,'Measures the temperature of the water in the collection basin, e.g. within a Cooling_Tower',$);
#626=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Entering_Water_Temperature_Sensor','Entering Water Temperature Sensor','Entering Water Temperature Sensor',#624,'Measures the temperature of entering water',$);
#627=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Leaving_Water_Temperature_Sensor','Leaving Water Temperature Sensor','Leaving Water Temperature Sensor',#624,'Measures the temperature of water leaving a piece of equipment or system',$);
#628=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Heat_Exchanger_Leaving_Water_Temperature_Sensor','Heat Exchanger Leaving Water Temperature Sensor','Heat Exchanger Leaving Water Temperature Sensor',#627,'',$);
#629=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Ice_Tank_Leaving_Water_Temperature_Sensor','Ice Tank Leaving Water Temperature Sensor','Ice Tank Leaving Water Temperature Sensor',#627,'Measures the temperature of water leaving an ice tank',$);
#630=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Domestic_Hot_Water_Temperature_Sensor','Domestic Hot Water Temperature Sensor','Domestic Hot Water Temperature Sensor',#624,'',$);
#631=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Entering_Domestic_Hot_Water_Temperature_Sensor','Entering Domestic Hot Water Temperature Sensor','Entering Domestic Hot Water Temperature Sensor',#630,'',$);
#632=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Leaving_Domestic_Hot_Water_Temperature_Sensor','Leaving Domestic Hot Water Temperature Sensor','Leaving Domestic Hot Water Temperature Sensor',#630,'Measures the temperature of domestic water supplied by a hot water system',$);
#633=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Entering_Hot_Water_Temperature_Sensor','Entering Hot Water Temperature Sensor','Entering Hot Water Temperature Sensor',#624,'Measures the temperature of water enteringed to a hot water system',$);
#634=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Entering_High_Temperature_Hot_Water_Temperature_Sensor','Entering High Temperature Hot Water Temperature Sensor','Entering High Temperature Hot Water Temperature Sensor',#633,'Measures the temperature of high-temperature hot water enteringed to a hot water system',$);
#635=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Entering_Medium_Temperature_Hot_Water_Temperature_Sensor','Entering Medium Temperature Hot Water Temperature Sensor','Entering Medium Temperature Hot Water Temperature Sensor',#633,'Measures the temperature of medium-temperature hot water entering a hot water system',$);
#636=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Hot_Water_Differential_Temperature_Sensor','Hot Water Differential Temperature Sensor','Hot Water Differential Temperature Sensor',#633,'Measures the difference in temperature between the entering water to the boiler or other water heating device and leaving water from the same boiler or other water heating device',$);
#637=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Leaving_Hot_Water_Temperature_Sensor','Leaving Hot Water Temperature Sensor','Leaving Hot Water Temperature Sensor',#624,'Measures the temperature of water supplied by a hot water system',$);
#638=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Leaving_High_Temperature_Hot_Water_Temperature_Sensor','Leaving High Temperature Hot Water Temperature Sensor','Leaving High Temperature Hot Water Temperature Sensor',#637,'Measures the temperature of high-temperature hot water supplied by a hot water system',$);
#639=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Leaving_Medium_Temperature_Hot_Water_Temperature_Sensor','Leaving Medium Temperature Hot Water Temperature Sensor','Leaving Medium Temperature Hot Water Temperature Sensor',#637,'Measures the temperature of medium-temperature hot water supplied by a hot water system',$);
#640=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Water_Differential_Temperature_Sensor','Water Differential Temperature Sensor','Water Differential Temperature Sensor',#624,'Measures the difference in water temperature between an upstream and downstream point in a pipe or conduit',$);
#641=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Chilled_Water_Differential_Temperature_Sensor','Chilled Water Differential Temperature Sensor','Chilled Water Differential Temperature Sensor',#640,'Measures the difference in temperature between the entering water to the chiller or other water cooling device and leaving water from the same chiller or other water cooling device',$);
#642=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Condenser_Water_Temperature_Sensor','Condenser Water Temperature Sensor','Condenser Water Temperature Sensor',#624,'Measures the temperature of condenser water',$);
#643=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Entering_Condenser_Water_Temperature_Sensor','Entering Condenser Water Temperature Sensor','Entering Condenser Water Temperature Sensor',#642,'Measures the temperature of the entering condenser water',$);
#644=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Leaving_Condenser_Water_Temperature_Sensor','Leaving Condenser Water Temperature Sensor','Leaving Condenser Water Temperature Sensor',#642,'Measures the temperature of the leaving condenser water',$);
#645=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Chilled_Water_Temperature_Sensor','Chilled Water Temperature Sensor','Chilled Water Temperature Sensor',#624,'Measures the temperature of chilled water',$);
#646=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Differential_Entering_Leaving_Water_Temperature_Sensor','Differential Entering Leaving Water Temperature Sensor','Differential Entering Leaving Water Temperature Sensor',#645,'Measures the difference in temperature between entering and leaving water of water a circuit',$);
#647=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Entering_Chilled_Water_Temperature_Sensor','Entering Chilled Water Temperature Sensor','Entering Chilled Water Temperature Sensor',#645,'Measures the temperature of chilled water that is enteringed to a cooling tower',$);
#648=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Leaving_Chilled_Water_Temperature_Sensor','Leaving Chilled Water Temperature Sensor','Leaving Chilled Water Temperature Sensor',#645,'Measures the temperature of chilled water that is supplied from a chiller',$);
#649=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Air_Quality_Sensor','Air Quality Sensor','Air Quality Sensor',#437,'A sensor which provides a measure of air quality',$);
#650=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Ammonia_Sensor','Ammonia Sensor','Ammonia Sensor',#649,'',$);
#651=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Formaldehyde_Level_Sensor','Formaldehyde Level Sensor','Formaldehyde Level Sensor',#649,'Measures the concentration of formaldehyde in air',$);
#652=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Methane_Level_Sensor','Methane Level Sensor','Methane Level Sensor',#649,'Measures the concentration of methane in air',$);
#653=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#NO2_Level_Sensor','NO2 Level Sensor','NO2 Level Sensor',#649,'Measures the concentration of NO2 in air',$);
#654=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Ozone_Level_Sensor','Ozone Level Sensor','Ozone Level Sensor',#649,'Measures the concentration of ozone in air',$);
#655=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Radioactivity_Concentration_Sensor','Radioactivity Concentration Sensor','Radioactivity Concentration Sensor',#649,'Measures the concentration of radioactivity',$);
#656=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Radon_Concentration_Sensor','Radon Concentration Sensor','Radon Concentration Sensor',#655,'Measures the concentration of radioactivity due to radon',$);
#657=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#CO2_Sensor','CO2 Sensor','CO2 Sensor',#649,'Measures properties of CO2 in air',$);
#658=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#CO2_Differential_Sensor','CO2 Differential Sensor','CO2 Differential Sensor',#657,'Measures the difference between CO2 levels of inside and outside air',$);
#659=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#CO2_Level_Sensor','CO2 Level Sensor','CO2 Level Sensor',#657,'Measures the concentration of CO2 in air',$);
#660=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Outside_Air_CO2_Sensor','Outside Air CO2 Sensor','Outside Air CO2 Sensor',#657,'Measures the concentration of CO2 in outside air',$);
#661=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Return_Air_CO2_Sensor','Return Air CO2 Sensor','Return Air CO2 Sensor',#657,'Measures the concentration of CO2 in return air',$);
#662=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#CO_Sensor','CO Sensor','CO Sensor',#649,'Measures properties of CO',$);
#663=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#CO_Differential_Sensor','CO Differential Sensor','CO Differential Sensor',#662,'',$);
#664=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#CO_Level_Sensor','CO Level Sensor','CO Level Sensor',#662,'Measures the concentration of CO',$);
#665=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Outside_Air_CO_Sensor','Outside Air CO Sensor','Outside Air CO Sensor',#662,'Measures the concentration of CO in outside air',$);
#666=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Return_Air_CO_Sensor','Return Air CO Sensor','Return Air CO Sensor',#662,'Measures the concentration of CO in return air',$);
#667=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#Particulate_Matter_Sensor','Particulate Matter Sensor','Particulate Matter Sensor',#649,'Detects pollutants in the ambient air',$);
#668=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#PM10_Sensor','PM10 Sensor','PM10 Sensor',#667,'Detects matter of size 10 microns',$);
#669=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#PM10_Level_Sensor','PM10 Level Sensor','PM10 Level Sensor',#668,'Detects level of particulates of size 10 microns',$);
#670=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#PM1_Sensor','PM1 Sensor','PM1 Sensor',#667,'Detects matter of size 1 micron',$);
#671=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#PM1_Level_Sensor','PM1 Level Sensor','PM1 Level Sensor',#670,'Detects level of particulates of size 1 microns',$);
#672=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#PM2.5_Sensor','PM2.5 Sensor','PM2.5 Sensor',#667,'Detects matter of size 2.5 microns',$);
#673=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#PM2.5_Level_Sensor','PM2.5 Level Sensor','PM2.5 Level Sensor',#672,'Detects level of particulates of size 2.5 microns',$);
#674=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#TVOC_Sensor','TVOC Sensor','TVOC Sensor',#667,'',$);
#675=IFCCLASSIFICATIONREFERENCE('https://brickschema.org/schema/Brick#TVOC_Level_Sensor','TVOC Level Sensor','TVOC Level Sensor',#674,'A sensor measuring the level of all VOCs in air',$);
ENDSEC;
END-ISO-10303-21;
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,76 @@
ISO-10303-21;
HEADER;
FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1');
FILE_NAME('','2020-04-23T18:09:28',(),(),'IfcOpenShell 0.6.0b0','IfcOpenShell 0.6.0b0','');
FILE_SCHEMA(('IFC4'));
ENDSEC;
DATA;
#1=IFCPROJECTLIBRARY($,$,'CBI Classification - Level 2',$,$,$,$,$,$);
#2=IFCCLASSIFICATION('Masterspec','2019','2019-08-23','CBI Classification - Level 2','CBI (Co-ordinated Building Information) is a classification system designed by and for members of the construction industry, to co-ordinate the five main information sources: drawings; specifications; quantities; technical and research information; trade information and publications.','https://masterspec.co.nz',$);
#3=IFCRELASSOCIATESCLASSIFICATION('2v50VmRmf4EAM0pQ5vIPQA',$,$,$,(#1),#2);
#4=IFCCLASSIFICATIONREFERENCE($,'1','General',#2,$,$);
#5=IFCCLASSIFICATIONREFERENCE($,'11','Contract conditions',#4,$,$);
#6=IFCCLASSIFICATIONREFERENCE($,'12','General requirements',#4,$,$);
#7=IFCCLASSIFICATIONREFERENCE($,'2','Site',#2,$,$);
#8=IFCCLASSIFICATIONREFERENCE($,'21','Demolition',#7,$,$);
#9=IFCCLASSIFICATIONREFERENCE($,'22','Preparation and groundwork',#7,$,$);
#10=IFCCLASSIFICATIONREFERENCE($,'23','Foundations',#7,$,$);
#11=IFCCLASSIFICATIONREFERENCE($,'24','Minor demolition and alterations',#7,$,$);
#12=IFCCLASSIFICATIONREFERENCE($,'3','Structure',#2,$,$);
#13=IFCCLASSIFICATIONREFERENCE($,'31','Concrete',#12,$,$);
#14=IFCCLASSIFICATIONREFERENCE($,'32','Earth',#12,$,$);
#15=IFCCLASSIFICATIONREFERENCE($,'33','Masonry',#12,$,$);
#16=IFCCLASSIFICATIONREFERENCE($,'34','Steel',#12,$,$);
#17=IFCCLASSIFICATIONREFERENCE($,'35','Stainless steel',#12,$,$);
#18=IFCCLASSIFICATIONREFERENCE($,'36','Aluminium',#12,$,$);
#19=IFCCLASSIFICATIONREFERENCE($,'37','Other metals',#12,$,$);
#20=IFCCLASSIFICATIONREFERENCE($,'38','Timber',#12,$,$);
#21=IFCCLASSIFICATIONREFERENCE($,'39','Plastics',#12,$,$);
#22=IFCCLASSIFICATIONREFERENCE($,'4','Enclosure',#2,$,$);
#23=IFCCLASSIFICATIONREFERENCE($,'41','Tanking and pre-cladding',#22,$,$);
#24=IFCCLASSIFICATIONREFERENCE($,'42','Wall cladding',#22,$,$);
#25=IFCCLASSIFICATIONREFERENCE($,'43','Roofing and decking',#22,$,$);
#26=IFCCLASSIFICATIONREFERENCE($,'44','Membrane roofing',#22,$,$);
#27=IFCCLASSIFICATIONREFERENCE($,'45','Windows and doors',#22,$,$);
#28=IFCCLASSIFICATIONREFERENCE($,'46','Glazing',#22,$,$);
#29=IFCCLASSIFICATIONREFERENCE($,'47','Insulation',#22,$,$);
#30=IFCCLASSIFICATIONREFERENCE($,'48','Enclosure sundries',#22,$,$);
#31=IFCCLASSIFICATIONREFERENCE($,'49','Metalwork',#22,$,$);
#32=IFCCLASSIFICATIONREFERENCE($,'5','Interior',#2,$,$);
#33=IFCCLASSIFICATIONREFERENCE($,'51','Wall and ceiling linings',#32,$,$);
#34=IFCCLASSIFICATIONREFERENCE($,'52','Partitions and doors',#32,$,$);
#35=IFCCLASSIFICATIONREFERENCE($,'53','Ceiling systems',#32,$,$);
#36=IFCCLASSIFICATIONREFERENCE($,'54','Floors',#32,$,$);
#37=IFCCLASSIFICATIONREFERENCE($,'55','Joinery fixtures and hardware',#32,$,$);
#38=IFCCLASSIFICATIONREFERENCE($,'56','Specialist equipment and assemblies',#32,$,$);
#39=IFCCLASSIFICATIONREFERENCE($,'57','Furniture and appliances',#32,$,$);
#40=IFCCLASSIFICATIONREFERENCE($,'58','Signs and features',#32,$,$);
#41=IFCCLASSIFICATIONREFERENCE($,'6','Finish',#2,$,$);
#42=IFCCLASSIFICATIONREFERENCE($,'61','Applied coatings',#41,$,$);
#43=IFCCLASSIFICATIONREFERENCE($,'62','Tiling',#41,$,$);
#44=IFCCLASSIFICATIONREFERENCE($,'63','Overlay flooring and wall panelling',#41,$,$);
#45=IFCCLASSIFICATIONREFERENCE($,'64','Resilient surfacing',#41,$,$);
#46=IFCCLASSIFICATIONREFERENCE($,'65','Carpeting',#41,$,$);
#47=IFCCLASSIFICATIONREFERENCE($,'66','Flooring ancillaries',#41,$,$);
#48=IFCCLASSIFICATIONREFERENCE($,'67','Painting, decoration and coating',#41,$,$);
#49=IFCCLASSIFICATIONREFERENCE($,'68','Finishes sundries',#41,$,$);
#50=IFCCLASSIFICATIONREFERENCE($,'7','Services',#2,$,$);
#51=IFCCLASSIFICATIONREFERENCE($,'71','Liquid supply',#50,$,$);
#52=IFCCLASSIFICATIONREFERENCE($,'72','Gas',#50,$,$);
#53=IFCCLASSIFICATIONREFERENCE($,'73','Fire',#50,$,$);
#54=IFCCLASSIFICATIONREFERENCE($,'74','Liquid disposal',#50,$,$);
#55=IFCCLASSIFICATIONREFERENCE($,'75','Heating and cooling',#50,$,$);
#56=IFCCLASSIFICATIONREFERENCE($,'76','Ventilation and air-conditioning',#50,$,$);
#57=IFCCLASSIFICATIONREFERENCE($,'77','Electrical',#50,$,$);
#58=IFCCLASSIFICATIONREFERENCE($,'78','Communications and controls',#50,$,$);
#59=IFCCLASSIFICATIONREFERENCE($,'79','Transport',#50,$,$);
#60=IFCCLASSIFICATIONREFERENCE($,'8','External',#2,$,$);
#61=IFCCLASSIFICATIONREFERENCE($,'81','Retaining walls',#60,$,$);
#62=IFCCLASSIFICATIONREFERENCE($,'82','Pavements',#60,$,$);
#63=IFCCLASSIFICATIONREFERENCE($,'83','Landscape cultivation',#60,$,$);
#64=IFCCLASSIFICATIONREFERENCE($,'84','Landscape structures',#60,$,$);
#65=IFCCLASSIFICATIONREFERENCE($,'85','Landscape services',#60,$,$);
#66=IFCCLASSIFICATIONREFERENCE($,'86','Civil engineering infrastructure',#60,$,$);
#67=IFCCLASSIFICATIONREFERENCE($,'88','Specialist structures',#60,$,$);
ENDSEC;
END-ISO-10303-21;
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,120 @@
ISO-10303-21;
HEADER;
FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1');
FILE_NAME('','2020-04-23T18:09:29',(),(),'IfcOpenShell 0.6.0b0','IfcOpenShell 0.6.0b0','');
FILE_SCHEMA(('IFC4'));
ENDSEC;
DATA;
#1=IFCPROJECTLIBRARY($,$,'Rumsfunktionskoder CC001 - 001',$,$,$,$,$,$);
#2=IFCCLASSIFICATION('BIMAlliance','001','2014-08-25','Rumsfunktionskoder CC001 - 001','Klasslista rumsfunktionskoder Malm\X2\00F6\X0\ Stadsfastigheter','ttp://tools.bimalliance.se/fi2listor/Klasslistor.aspx',('-'));
#3=IFCRELASSOCIATESCLASSIFICATION('1P_4sDwnf8gxT5Xzy60GRt',$,$,$,(#1),#2);
#4=IFCCLASSIFICATIONREFERENCE($,'20','Arbetslokaler',#2,$,$);
#5=IFCCLASSIFICATIONREFERENCE($,'20-01','Kontor',#4,'arbetsrum, kurator',$);
#6=IFCCLASSIFICATIONREFERENCE($,'20-02','Kontorslandskap',#4,$,$);
#7=IFCCLASSIFICATIONREFERENCE($,'20-03','Konferensrum',#4,'Sammantr\X2\00E4\X0\desrum',$);
#8=IFCCLASSIFICATIONREFERENCE($,'20-04','Grupprum',#4,'samtal, klubbrum',$);
#9=IFCCLASSIFICATIONREFERENCE($,'20-05','Expedition',#4,'reception, expedition, mottagning',$);
#10=IFCCLASSIFICATIONREFERENCE($,'20-06','Kopiering',#4,'skrivare',$);
#11=IFCCLASSIFICATIONREFERENCE($,'20-07','Pausrum',#4,'paus, personal, l\X2\00E4\X0\rarrum',$);
#12=IFCCLASSIFICATIONREFERENCE($,'20-08','Matrum',#4,'matsal',$);
#13=IFCCLASSIFICATIONREFERENCE($,'20-09','Vilrum',#4,$,$);
#14=IFCCLASSIFICATIONREFERENCE($,'20-10','Atelj\X2\00E9\X0\',#4,$,$);
#15=IFCCLASSIFICATIONREFERENCE($,'20-11','Bibliotek',#4,$,$);
#16=IFCCLASSIFICATIONREFERENCE($,'20-12','Samlingsrum',#4,'dagrum, gillestuga, studierum, lekrum,',$);
#17=IFCCLASSIFICATIONREFERENCE($,'20-13','Utbildningssal',#4,'Basrum, Lektionssal, Bild, data, musik, hemkunskap, klassrumsl\X2\00F6\X0\jd, textilsl\X2\00F6\X0\jd,Ytbehandling, NO, tr\X2\00E4\X0\sl\X2\00F6\X0\jd, metallsl\X2\00F6\X0\jd',$);
#18=IFCCLASSIFICATIONREFERENCE($,'20-14','Behandling',#4,'l\X2\00E4\X0\karmottagning, aktivitetsrum, sjukgymnast, sk\X2\00F6\X0\teskemottagning, tandl\X2\00E4\X0\karmottagning, motionsrum',$);
#19=IFCCLASSIFICATIONREFERENCE($,'20-15','Aktivitetsrum',#4,'inom social resursf\X2\00F6\X0\rvaltning.',$);
#20=IFCCLASSIFICATIONREFERENCE($,'20-16','Laboratorie',#4,'laboratorierum',$);
#21=IFCCLASSIFICATIONREFERENCE($,'21','Utrymmen f\X2\00F6\X0\r boende',#2,$,$);
#22=IFCCLASSIFICATIONREFERENCE($,'21-01','Sovrum',#21,$,$);
#23=IFCCLASSIFICATIONREFERENCE($,'21-02','Vardagsrum',#21,$,$);
#24=IFCCLASSIFICATIONREFERENCE($,'21-03','Allrum',#21,'studentrum, \X2\00E4\X0\ldreboende; vardagsrum m. sovalkov.',$);
#25=IFCCLASSIFICATIONREFERENCE($,'22','Publika Utrymmen',#2,$,$);
#26=IFCCLASSIFICATIONREFERENCE($,'22-01','Foaj\X2\00E9\X0\',#25,$,$);
#27=IFCCLASSIFICATIONREFERENCE($,'22-02','Salong',#25,$,$);
#28=IFCCLASSIFICATIONREFERENCE($,'22-03','Utst\X2\00E4\X0\llning',#25,'galleri, utst\X2\00E4\X0\llninglokal',$);
#29=IFCCLASSIFICATIONREFERENCE($,'22-04','Aula/skrivsal',#25,$,$);
#30=IFCCLASSIFICATIONREFERENCE($,'22-05','Torg',#25,'elevrum, fritidslokal, uppeh\X2\00E5\X0\llsrum, ',$);
#31=IFCCLASSIFICATIONREFERENCE($,'22-06','Butik',#25,'biljettf\X2\00F6\X0\rs\X2\00E4\X0\ljning',$);
#32=IFCCLASSIFICATIONREFERENCE($,'22-07','Restaurang',#25,$,$);
#33=IFCCLASSIFICATIONREFERENCE($,'22-08','Caf\X2\00E9\X0\',#25,$,$);
#34=IFCCLASSIFICATIONREFERENCE($,'22-09','Idrottshall',#25,'spelplan, gymnastiksal',$);
#35=IFCCLASSIFICATIONREFERENCE($,'22-10','L\X2\00E4\X0\ktare',#25,$,$);
#36=IFCCLASSIFICATIONREFERENCE($,'22-11','V\X2\00E4\X0\ntrum',#25,$,$);
#37=IFCCLASSIFICATIONREFERENCE($,'23','Kommunikations-utrymmen',#2,$,$);
#38=IFCCLASSIFICATIONREFERENCE($,'23-01','Entr\X2\00E9\X0\',#37,'groventr\X2\00E9\X0\, huvudentr\X2\00E9\X0\',$);
#39=IFCCLASSIFICATIONREFERENCE($,'23-02','Vindf\X2\00E5\X0\ng',#37,$,$);
#40=IFCCLASSIFICATIONREFERENCE($,'23-03','Korridor',#37,'hall, passage',$);
#41=IFCCLASSIFICATIONREFERENCE($,'23-04','Trappa',#37,'trapphus, trapphall',$);
#42=IFCCLASSIFICATIONREFERENCE($,'23-05','Hiss',#37,$,$);
#43=IFCCLASSIFICATIONREFERENCE($,'23-06','Hisshall',#37,$,$);
#44=IFCCLASSIFICATIONREFERENCE($,'23-07','Entresoleplan',#37,'balkong',$);
#45=IFCCLASSIFICATIONREFERENCE($,'23-08','Kapprum',#37,$,$);
#46=IFCCLASSIFICATIONREFERENCE($,'23-09','Veranda',#37,$,$);
#47=IFCCLASSIFICATIONREFERENCE($,'23-10','Balkong',#37,$,$);
#48=IFCCLASSIFICATIONREFERENCE($,'23-11','Kulvert',#37,$,$);
#49=IFCCLASSIFICATIONREFERENCE($,'24','Utrymmen f\X2\00F6\X0\r skydd och f\X2\00F6\X0\rsvar',#2,$,$);
#50=IFCCLASSIFICATIONREFERENCE($,'24-01','Skyddsrum',#49,$,$);
#51=IFCCLASSIFICATIONREFERENCE($,'24-02','Skyddsrumsf\X2\00F6\X0\rr\X2\00E5\X0\d',#49,$,$);
#52=IFCCLASSIFICATIONREFERENCE($,'25','Hygienutrymmen',#2,$,$);
#53=IFCCLASSIFICATIONREFERENCE($,'25-01','WC',#52,$,$);
#54=IFCCLASSIFICATIONREFERENCE($,'25-02','RWC',#52,$,$);
#55=IFCCLASSIFICATIONREFERENCE($,'25-03','WC/Dusch',#52,$,$);
#56=IFCCLASSIFICATIONREFERENCE($,'25-04','Dusch',#52,$,$);
#57=IFCCLASSIFICATIONREFERENCE($,'25-05','WC/Bad',#52,$,$);
#58=IFCCLASSIFICATIONREFERENCE($,'25-06','Bastu',#52,$,$);
#59=IFCCLASSIFICATIONREFERENCE($,'25-07','F\X2\00F6\X0\rrum',#52,$,$);
#60=IFCCLASSIFICATIONREFERENCE($,'25-08','Sk\X2\00F6\X0\trum',#52,$,$);
#61=IFCCLASSIFICATIONREFERENCE($,'25-09','K\X2\00F6\X0\k',#52,'mottagning, tillagningsk\X2\00F6\X0\k, bostadsk\X2\00F6\X0\k',$);
#62=IFCCLASSIFICATIONREFERENCE($,'25-10','Diskrum',#52,$,$);
#63=IFCCLASSIFICATIONREFERENCE($,'25-11','Pentry',#52,$,$);
#64=IFCCLASSIFICATIONREFERENCE($,'25-12','Renseri',#52,$,$);
#65=IFCCLASSIFICATIONREFERENCE($,'25-13','Frys-/kylrum',#52,'kylrum, frysrum',$);
#66=IFCCLASSIFICATIONREFERENCE($,'25-14','Sk\X2\00F6\X0\ljrum',#52,$,$);
#67=IFCCLASSIFICATIONREFERENCE($,'25-15','Tv\X2\00E4\X0\tt',#52,$,$);
#68=IFCCLASSIFICATIONREFERENCE($,'26','Driftutrymmen',#2,$,$);
#69=IFCCLASSIFICATIONREFERENCE($,'26-01','Schakt',#68,$,$);
#70=IFCCLASSIFICATIONREFERENCE($,'26-02','Undercentral',#68,$,$);
#71=IFCCLASSIFICATIONREFERENCE($,'26-03','Pannrum',#68,$,$);
#72=IFCCLASSIFICATIONREFERENCE($,'26-04','Fl\X2\00E4\X0\ktrum',#68,$,$);
#73=IFCCLASSIFICATIONREFERENCE($,'26-05','Elcenttral',#68,$,$);
#74=IFCCLASSIFICATIONREFERENCE($,'26-06','El/telenisch',#68,'telerum',$);
#75=IFCCLASSIFICATIONREFERENCE($,'26-07','Datanisch',#68,$,$);
#76=IFCCLASSIFICATIONREFERENCE($,'26-08','Serverrum',#68,$,$);
#77=IFCCLASSIFICATIONREFERENCE($,'26-09','Hissmaskinrum',#68,$,$);
#78=IFCCLASSIFICATIONREFERENCE($,'26-10','Teknisk kulvert',#68,$,$);
#79=IFCCLASSIFICATIONREFERENCE($,'26-11','Reningsanl\X2\00E4\X0\ggning',#68,$,$);
#80=IFCCLASSIFICATIONREFERENCE($,'26-12','Kylmaskinrum',#68,$,$);
#81=IFCCLASSIFICATIONREFERENCE($,'26-13','Gasf\X2\00E5\X0\ng',#68,$,$);
#82=IFCCLASSIFICATIONREFERENCE($,'26-14','Sp\X2\00E5\X0\nsug',#68,$,$);
#83=IFCCLASSIFICATIONREFERENCE($,'27','Specialutrymmen',#2,$,$);
#84=IFCCLASSIFICATIONREFERENCE($,'27-01','Orkesterdike',#83,$,$);
#85=IFCCLASSIFICATIONREFERENCE($,'27-02','Repetitionslokal',#83,'\X2\00F6\X0\vning',$);
#86=IFCCLASSIFICATIONREFERENCE($,'27-03','Scen',#83,$,$);
#87=IFCCLASSIFICATIONREFERENCE($,'27-04','Inspelningstudio',#83,'studio, mediatek',$);
#88=IFCCLASSIFICATIONREFERENCE($,'27-05','Loge',#83,$,$);
#89=IFCCLASSIFICATIONREFERENCE($,'27-06','Akvarie',#83,$,$);
#90=IFCCLASSIFICATIONREFERENCE($,'27-07','Bass\X2\00E4\X0\ng',#83,$,$);
#91=IFCCLASSIFICATIONREFERENCE($,'27-08','Terrarie',#83,$,$);
#92=IFCCLASSIFICATIONREFERENCE($,'27-09','Djurlokal',#83,'stall',$);
#93=IFCCLASSIFICATIONREFERENCE($,'27-10','Ishall',#83,$,$);
#94=IFCCLASSIFICATIONREFERENCE($,'27-11','Verkstad',#83,'smedja',$);
#95=IFCCLASSIFICATIONREFERENCE($,'27-12','V\X2\00E4\X0\xthus',#83,$,$);
#96=IFCCLASSIFICATIONREFERENCE($,'28','St\X2\00F6\X0\dfunktioner',#2,$,$);
#97=IFCCLASSIFICATIONREFERENCE($,'28-01','Apparatrum',#96,'Apparatrum, sterilrum, teknikrum, preparation',$);
#98=IFCCLASSIFICATIONREFERENCE($,'28-02','Arkiv',#96,$,$);
#99=IFCCLASSIFICATIONREFERENCE($,'28-03','F\X2\00F6\X0\rr\X2\00E5\X0\d',#96,'Barnvagn, redskap, garderob, vagnhall, materialrum, klk',$);
#100=IFCCLASSIFICATIONREFERENCE($,'28-04','M\X2\00F6\X0\rkrum',#96,$,$);
#101=IFCCLASSIFICATIONREFERENCE($,'28-05','Nodrum',#96,$,$);
#102=IFCCLASSIFICATIONREFERENCE($,'28-06','Omkl\X2\00E4\X0\dning',#96,$,$);
#103=IFCCLASSIFICATIONREFERENCE($,'28-07','Sortering',#96,'post, uppackning, vaktm\X2\00E4\X0\steri, varuintag',$);
#104=IFCCLASSIFICATIONREFERENCE($,'28-08','Lager',#96,$,$);
#105=IFCCLASSIFICATIONREFERENCE($,'28-09','Garage',#96,$,$);
#106=IFCCLASSIFICATIONREFERENCE($,'28-10','Soprum',#96,$,$);
#107=IFCCLASSIFICATIONREFERENCE($,'28-11','Milj\X2\00F6\X0\rum',#96,$,$);
#108=IFCCLASSIFICATIONREFERENCE($,'28-12','Torkrum',#96,'t\X2\00E5\X0\gvind',$);
#109=IFCCLASSIFICATIONREFERENCE($,'28-13','Vind',#96,$,$);
#110=IFCCLASSIFICATIONREFERENCE($,'28-14','Disponibelt',#96,'Ospecificerat',$);
#111=IFCCLASSIFICATIONREFERENCE($,'28-15','St\X2\00E4\X0\drum',#96,$,$);
ENDSEC;
END-ISO-10303-21;
@@ -0,0 +1,924 @@
ISO-10303-21;
HEADER;
FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1');
FILE_NAME('','2020-04-23T18:09:29',(),(),'IfcOpenShell 0.6.0b0','IfcOpenShell 0.6.0b0','');
FILE_SCHEMA(('IFC4'));
ENDSEC;
DATA;
#1=IFCPROJECTLIBRARY($,$,'CCS',$,$,$,$,$,$);
#2=IFCCLASSIFICATION('Molio','R1 (Dansk udgave)','2017-06-21','CCS',$,'http://ccs.bips.dk/News/CCS_Vaerktoejer',$);
#3=IFCRELASSOCIATESCLASSIFICATION('16Vg7v96zBfeP3BuNvWizJ',$,$,$,(#1),#2);
#4=IFCCLASSIFICATIONREFERENCE($,'Bygv\X2\00E6\X0\rksanvendelse',$,#2,'Tildeler klassifikation af funktion til IFC Building og IFC Site baseret p\X2\00E5\X0\ CCS (R0) specifikationen.',$);
#5=IFCCLASSIFICATIONREFERENCE($,'[E]A??','Bygning til menneskeligt behov og virke',#4,$,$);
#6=IFCCLASSIFICATIONREFERENCE($,'[E]AA?','Beboelsesbygning',#5,$,$);
#7=IFCCLASSIFICATIONREFERENCE($,'[E]AAA','Enfamilieshus',#6,$,$);
#8=IFCCLASSIFICATIONREFERENCE($,'[E]AAB','Flerfamilieshus',#6,$,$);
#9=IFCCLASSIFICATIONREFERENCE($,'[E]AAC','Boligkompleks',#6,$,$);
#10=IFCCLASSIFICATIONREFERENCE($,'[E]AB?','Hotel- og restaurationsbygning',#5,$,$);
#11=IFCCLASSIFICATIONREFERENCE($,'[E]ABA','Hotelbygning',#10,$,$);
#12=IFCCLASSIFICATIONREFERENCE($,'[E]ABB','Vandrehjemsbygning',#10,$,$);
#13=IFCCLASSIFICATIONREFERENCE($,'[E]ABC','Restaurantbygning',#10,$,$);
#14=IFCCLASSIFICATIONREFERENCE($,'[E]AC?','Hygiejnebygning',#5,$,$);
#15=IFCCLASSIFICATIONREFERENCE($,'[E]ACA','Toiletbygning',#14,$,$);
#16=IFCCLASSIFICATIONREFERENCE($,'[E]ACB','Badebygning',#14,$,$);
#17=IFCCLASSIFICATIONREFERENCE($,'[E]ACC','Saunabygning',#14,$,$);
#18=IFCCLASSIFICATIONREFERENCE($,'[E]ACD','Omkl\X2\00E6\X0\dningsbygning',#14,$,$);
#19=IFCCLASSIFICATIONREFERENCE($,'[E]AD?','Isolationsbygning',#5,$,$);
#20=IFCCLASSIFICATIONREFERENCE($,'[E]ADA','Beskyttelsesbygning',#19,$,$);
#21=IFCCLASSIFICATIONREFERENCE($,'[E]ADB','F\X2\00E6\X0\ngselsbygning',#19,$,$);
#22=IFCCLASSIFICATIONREFERENCE($,'[E]AE?','Administrationsbygning',#5,$,$);
#23=IFCCLASSIFICATIONREFERENCE($,'[E]AEA','Kontorbygning',#22,$,$);
#24=IFCCLASSIFICATIONREFERENCE($,'[E]AEB','Servicebygning',#22,$,$);
#25=IFCCLASSIFICATIONREFERENCE($,'[E]AEC','Beredskabsbygning',#22,$,$);
#26=IFCCLASSIFICATIONREFERENCE($,'[E]AF?','Produktionsbygning',#5,$,$);
#27=IFCCLASSIFICATIONREFERENCE($,'[E]AFA','Fabrikationsbygning',#26,$,$);
#28=IFCCLASSIFICATIONREFERENCE($,'[E]AFB','V\X2\00E6\X0\rkstedsbygning',#26,$,$);
#29=IFCCLASSIFICATIONREFERENCE($,'[E]AG?','Handelsbygning',#5,$,$);
#30=IFCCLASSIFICATIONREFERENCE($,'[E]AGA','Butiksbygning',#29,$,$);
#31=IFCCLASSIFICATIONREFERENCE($,'[E]AGB','Butikscenter',#29,$,$);
#32=IFCCLASSIFICATIONREFERENCE($,'[E]AGC','Galleri',#29,$,$);
#33=IFCCLASSIFICATIONREFERENCE($,'[E]AGD','Messehal',#29,$,$);
#34=IFCCLASSIFICATIONREFERENCE($,'[E]AH?','Undervisningsbygning',#5,$,$);
#35=IFCCLASSIFICATIONREFERENCE($,'[E]AHA','Skolebygning',#34,$,$);
#36=IFCCLASSIFICATIONREFERENCE($,'[E]AHB','Universitetsbygning',#34,$,$);
#37=IFCCLASSIFICATIONREFERENCE($,'[E]AHC','Kursuscenterbygning',#34,$,$);
#38=IFCCLASSIFICATIONREFERENCE($,'[E]AJ?','Omsorgsbygning',#5,$,$);
#39=IFCCLASSIFICATIONREFERENCE($,'[E]AJA','B\X2\00F8\X0\rneinstitutionsbygning',#38,$,$);
#40=IFCCLASSIFICATIONREFERENCE($,'[E]AJB','Hospitalsbygning',#38,$,$);
#41=IFCCLASSIFICATIONREFERENCE($,'[E]AJC','Plejehjemsbygning',#38,$,$);
#42=IFCCLASSIFICATIONREFERENCE($,'[E]AK?','Fritidsbygning',#5,$,$);
#43=IFCCLASSIFICATIONREFERENCE($,'[E]AKA','Sommerhus',#42,$,$);
#44=IFCCLASSIFICATIONREFERENCE($,'[E]AKB','Kolonihavehus',#42,$,$);
#45=IFCCLASSIFICATIONREFERENCE($,'[E]AKC','Lysthus',#42,$,$);
#46=IFCCLASSIFICATIONREFERENCE($,'[E]AKD','Udestue',#42,$,$);
#47=IFCCLASSIFICATIONREFERENCE($,'[E]AL?','Sportsbygning',#5,$,$);
#48=IFCCLASSIFICATIONREFERENCE($,'[E]ALA','Sportshal',#47,$,$);
#49=IFCCLASSIFICATIONREFERENCE($,'[E]ALB','Tilskuertribune',#47,$,$);
#50=IFCCLASSIFICATIONREFERENCE($,'[E]ALC','Sv\X2\00F8\X0\mmehal',#47,$,$);
#51=IFCCLASSIFICATIONREFERENCE($,'[E]ALD','Ridehus',#47,$,$);
#52=IFCCLASSIFICATIONREFERENCE($,'[E]ALE','Udspringst\X2\00E5\X0\rn',#47,$,$);
#53=IFCCLASSIFICATIONREFERENCE($,'[E]ALF','Bowlinghal',#47,$,$);
#54=IFCCLASSIFICATIONREFERENCE($,'[E]AM?','Kulturbygning',#5,$,$);
#55=IFCCLASSIFICATIONREFERENCE($,'[E]AMA','Teaterbygning',#54,$,$);
#56=IFCCLASSIFICATIONREFERENCE($,'[E]AMB','Koncertbygning',#54,$,$);
#57=IFCCLASSIFICATIONREFERENCE($,'[E]AMC','Udstillingsbygning',#54,$,$);
#58=IFCCLASSIFICATIONREFERENCE($,'[E]AMD','Planetarium',#54,$,$);
#59=IFCCLASSIFICATIONREFERENCE($,'[E]AME','Biografbygning',#54,$,$);
#60=IFCCLASSIFICATIONREFERENCE($,'[E]AMF','Biblioteksbygning',#54,$,$);
#61=IFCCLASSIFICATIONREFERENCE($,'[E]AMG','Multihus',#54,$,$);
#62=IFCCLASSIFICATIONREFERENCE($,'[E]AN?','Forsamlingsbygning',#5,$,$);
#63=IFCCLASSIFICATIONREFERENCE($,'[E]ANA','Beboerhus',#62,$,$);
#64=IFCCLASSIFICATIONREFERENCE($,'[E]ANB','Medborgerhus',#62,$,$);
#65=IFCCLASSIFICATIONREFERENCE($,'[E]ANC','Klubhus',#62,$,$);
#66=IFCCLASSIFICATIONREFERENCE($,'[E]AND','Religionsbygning',#62,$,$);
#67=IFCCLASSIFICATIONREFERENCE($,'[E]AP?','Opbevaringsbygning',#5,$,$);
#68=IFCCLASSIFICATIONREFERENCE($,'[E]APA','Materialebygning',#67,$,$);
#69=IFCCLASSIFICATIONREFERENCE($,'[E]APB','Materielbygning',#67,$,$);
#70=IFCCLASSIFICATIONREFERENCE($,'[E]APC','Dyrebygning',#67,$,$);
#71=IFCCLASSIFICATIONREFERENCE($,'[E]APD','Plantebygning',#67,$,$);
#72=IFCCLASSIFICATIONREFERENCE($,'[E]APE','Morsbygning',#67,$,$);
#73=IFCCLASSIFICATIONREFERENCE($,'[E]AQ?','Fordelingsbygning',#5,$,$);
#74=IFCCLASSIFICATIONREFERENCE($,'[E]AQA','Gangbygning',#73,$,$);
#75=IFCCLASSIFICATIONREFERENCE($,'[E]AQB','Trappet\X2\00E5\X0\rn',#73,$,$);
#76=IFCCLASSIFICATIONREFERENCE($,'[E]AQC','Elevatorbygning',#73,$,$);
#77=IFCCLASSIFICATIONREFERENCE($,'[E]AQD','Portbygning',#73,$,$);
#78=IFCCLASSIFICATIONREFERENCE($,'[E]B??','Teknikanl\X2\00E6\X0\g',#4,$,$);
#79=IFCCLASSIFICATIONREFERENCE($,'[E]BA?','Produktionsanl\X2\00E6\X0\g',#78,$,$);
#80=IFCCLASSIFICATIONREFERENCE($,'[E]BAA','Kraftvarmev\X2\00E6\X0\rk',#79,$,$);
#81=IFCCLASSIFICATIONREFERENCE($,'[E]BAB','Vandv\X2\00E6\X0\rk',#79,$,$);
#82=IFCCLASSIFICATIONREFERENCE($,'[E]BAC','R\X2\00E5\X0\stofanl\X2\00E6\X0\g',#79,$,$);
#83=IFCCLASSIFICATIONREFERENCE($,'[E]BB?','Forbindelsesanl\X2\00E6\X0\g',#78,$,$);
#84=IFCCLASSIFICATIONREFERENCE($,'[E]BBA','Signalanl\X2\00E6\X0\g',#83,$,$);
#85=IFCCLASSIFICATIONREFERENCE($,'[E]BBB','Masteanl\X2\00E6\X0\g',#83,$,$);
#86=IFCCLASSIFICATIONREFERENCE($,'[E]BBC','Kabelanl\X2\00E6\X0\g',#83,$,$);
#87=IFCCLASSIFICATIONREFERENCE($,'[E]BBD','R\X2\00F8\X0\rledningsanl\X2\00E6\X0\g',#83,$,$);
#88=IFCCLASSIFICATIONREFERENCE($,'[E]BBE','Koblingsanl\X2\00E6\X0\g',#83,$,$);
#89=IFCCLASSIFICATIONREFERENCE($,'[E]BC?','Bortskaffelsesanl\X2\00E6\X0\g',#78,$,$);
#90=IFCCLASSIFICATIONREFERENCE($,'[E]BCA','Skorstensanl\X2\00E6\X0\g',#89,$,$);
#91=IFCCLASSIFICATIONREFERENCE($,'[E]BCB','Kloakanl\X2\00E6\X0\g',#89,$,$);
#92=IFCCLASSIFICATIONREFERENCE($,'[E]BD?','Transportanl\X2\00E6\X0\g',#78,$,$);
#93=IFCCLASSIFICATIONREFERENCE($,'[E]BDA','Krananl\X2\00E6\X0\g',#92,$,$);
#94=IFCCLASSIFICATIONREFERENCE($,'[E]BDB','Transport\X2\00F8\X0\ranl\X2\00E6\X0\g',#92,$,$);
#95=IFCCLASSIFICATIONREFERENCE($,'[E]BDC','Sv\X2\00E6\X0\vebane',#92,$,$);
#96=IFCCLASSIFICATIONREFERENCE($,'[E]BE?','Opbevaringsanl\X2\00E6\X0\g',#78,$,$);
#97=IFCCLASSIFICATIONREFERENCE($,'[E]BEA','M\X2\00E5\X0\lestation',#96,$,$);
#98=IFCCLASSIFICATIONREFERENCE($,'[E]BEB','Deponeringsplads',#96,$,$);
#99=IFCCLASSIFICATIONREFERENCE($,'[E]BEC','Containerplads',#96,$,$);
#100=IFCCLASSIFICATIONREFERENCE($,'[E]BED','Beholderanl\X2\00E6\X0\g',#96,$,$);
#101=IFCCLASSIFICATIONREFERENCE($,'[E]BEE','Bassin',#96,$,$);
#102=IFCCLASSIFICATIONREFERENCE($,'[E]BF?','Behandlingsanl\X2\00E6\X0\g',#78,$,$);
#103=IFCCLASSIFICATIONREFERENCE($,'[E]BFA','Pumpestation',#102,$,$);
#104=IFCCLASSIFICATIONREFERENCE($,'[E]BFB','Rensningsbassin',#102,$,$);
#105=IFCCLASSIFICATIONREFERENCE($,'[E]BFC','Slamrensningsanl\X2\00E6\X0\g',#102,$,$);
#106=IFCCLASSIFICATIONREFERENCE($,'[E]BG?','Forlystelsesanl\X2\00E6\X0\g',#78,$,$);
#107=IFCCLASSIFICATIONREFERENCE($,'[E]BGA','Rutchebane',#106,$,$);
#108=IFCCLASSIFICATIONREFERENCE($,'[E]BGB','Karrussel',#106,$,$);
#109=IFCCLASSIFICATIONREFERENCE($,'[E]BGC','Pariserhjul',#106,$,$);
#110=IFCCLASSIFICATIONREFERENCE($,'[E]BGD','Springvand',#106,$,$);
#111=IFCCLASSIFICATIONREFERENCE($,'[E]C??','Infrastrukturanl\X2\00E6\X0\g',#4,$,$);
#112=IFCCLASSIFICATIONREFERENCE($,'[E]CA?','Trafikanl\X2\00E6\X0\g',#111,$,$);
#113=IFCCLASSIFICATIONREFERENCE($,'[E]CAA','Bro',#112,$,$);
#114=IFCCLASSIFICATIONREFERENCE($,'[E]CAB','Tunnel',#112,$,$);
#115=IFCCLASSIFICATIONREFERENCE($,'[E]CAC','Trafikkanal',#112,$,$);
#116=IFCCLASSIFICATIONREFERENCE($,'[E]CAD','Skinneanl\X2\00E6\X0\g',#112,$,$);
#117=IFCCLASSIFICATIONREFERENCE($,'[E]CAE','Vej',#112,$,$);
#118=IFCCLASSIFICATIONREFERENCE($,'[E]CAF','Fortov',#112,$,$);
#119=IFCCLASSIFICATIONREFERENCE($,'[E]CAG','Sti',#112,$,$);
#120=IFCCLASSIFICATIONREFERENCE($,'[E]CB?','Terminalanl\X2\00E6\X0\g',#111,$,$);
#121=IFCCLASSIFICATIONREFERENCE($,'[E]CBA','Kaj',#120,$,$);
#122=IFCCLASSIFICATIONREFERENCE($,'[E]CBB','Perron',#120,$,$);
#123=IFCCLASSIFICATIONREFERENCE($,'[E]CBC','Vejkryds',#120,$,$);
#124=IFCCLASSIFICATIONREFERENCE($,'[E]CBD','Togterminal',#120,$,$);
#125=IFCCLASSIFICATIONREFERENCE($,'[E]CBE','Lufthavnsterminal',#120,$,$);
#126=IFCCLASSIFICATIONREFERENCE($,'[E]CBF','Busterminal',#120,$,$);
#127=IFCCLASSIFICATIONREFERENCE($,'[E]CBG','F\X2\00E6\X0\rgeterminal',#120,$,$);
#128=IFCCLASSIFICATIONREFERENCE($,'[E]CC?','Parkeringsanl\X2\00E6\X0\g',#111,$,$);
#129=IFCCLASSIFICATIONREFERENCE($,'[E]CCA','Cykelparkeringsanl\X2\00E6\X0\g',#128,$,$);
#130=IFCCLASSIFICATIONREFERENCE($,'[E]CCB','Parkeringsplads',#128,$,$);
#131=IFCCLASSIFICATIONREFERENCE($,'[E]CCC','Ranger anl\X2\00E6\X0\g',#128,$,$);
#132=IFCCLASSIFICATIONREFERENCE($,'[E]CCD','Flyveplads',#128,$,$);
#133=IFCCLASSIFICATIONREFERENCE($,'[E]CD?','Kommunikationsbygning',#111,$,$);
#134=IFCCLASSIFICATIONREFERENCE($,'[E]CDA','Kontrolt\X2\00E5\X0\rn',#133,$,$);
#135=IFCCLASSIFICATIONREFERENCE($,'[E]CDB','Antennet\X2\00E5\X0\rn',#133,$,$);
#136=IFCCLASSIFICATIONREFERENCE($,'[E]CDC','Fyrt\X2\00E5\X0\rn',#133,$,$);
#137=IFCCLASSIFICATIONREFERENCE($,'[E]CDD','Klokket\X2\00E5\X0\rn',#133,$,$);
#138=IFCCLASSIFICATIONREFERENCE($,'[E]CE?','Vandreguleringsanl\X2\00E6\X0\g',#111,$,$);
#139=IFCCLASSIFICATIONREFERENCE($,'[E]CEA','D\X2\00E6\X0\mning',#138,$,$);
#140=IFCCLASSIFICATIONREFERENCE($,'[E]CEB','Kanal',#138,$,$);
#141=IFCCLASSIFICATIONREFERENCE($,'[E]CEC','Stemmev\X2\00E6\X0\rk',#138,$,$);
#142=IFCCLASSIFICATIONREFERENCE($,'[E]CED','Sluseanl\X2\00E6\X0\g',#138,$,$);
#143=IFCCLASSIFICATIONREFERENCE($,'[E]CEE','Mole',#138,$,$);
#144=IFCCLASSIFICATIONREFERENCE($,'[E]D??','Landskab',#4,$,$);
#145=IFCCLASSIFICATIONREFERENCE($,'[E]DA?','Naturomr\X2\00E5\X0\de',#144,$,$);
#146=IFCCLASSIFICATIONREFERENCE($,'[E]DAA','Strand',#145,$,$);
#147=IFCCLASSIFICATIONREFERENCE($,'[E]DAB','Klit',#145,$,$);
#148=IFCCLASSIFICATIONREFERENCE($,'[E]DAC','S\X2\00F8\X0\',#145,$,$);
#149=IFCCLASSIFICATIONREFERENCE($,'[E]DAD','Eng',#145,$,$);
#150=IFCCLASSIFICATIONREFERENCE($,'[E]DAE','V\X2\00E5\X0\domr\X2\00E5\X0\de',#145,$,$);
#151=IFCCLASSIFICATIONREFERENCE($,'[E]DAF','Vandl\X2\00F8\X0\b',#145,$,$);
#152=IFCCLASSIFICATIONREFERENCE($,'[E]DB?','Rekreativt omr\X2\00E5\X0\de',#144,$,$);
#153=IFCCLASSIFICATIONREFERENCE($,'[E]DBA','Have',#152,$,$);
#154=IFCCLASSIFICATIONREFERENCE($,'[E]DBB','Park',#152,$,$);
#155=IFCCLASSIFICATIONREFERENCE($,'[E]DBC','Campingplads',#152,$,$);
#156=IFCCLASSIFICATIONREFERENCE($,'[E]DC?','Forsamlingsomr\X2\00E5\X0\de',#144,$,$);
#157=IFCCLASSIFICATIONREFERENCE($,'[E]DCA','M\X2\00F8\X0\deplads',#156,$,$);
#158=IFCCLASSIFICATIONREFERENCE($,'[E]DCB','Torv',#156,$,$);
#159=IFCCLASSIFICATIONREFERENCE($,'[E]DCC','Tr\X2\00E6\X0\ningsplads',#156,$,$);
#160=IFCCLASSIFICATIONREFERENCE($,'[E]DCD','Legeplads',#156,$,$);
#161=IFCCLASSIFICATIONREFERENCE($,'[E]DD?','Produktionsomr\X2\00E5\X0\de',#144,$,$);
#162=IFCCLASSIFICATIONREFERENCE($,'[E]DDA','Grund',#161,$,$);
#163=IFCCLASSIFICATIONREFERENCE($,'[E]DDB','Brud',#161,$,$);
#164=IFCCLASSIFICATIONREFERENCE($,'[E]DDC','Grav',#161,$,$);
#165=IFCCLASSIFICATIONREFERENCE($,'[E]DDD','Skov',#161,$,$);
#166=IFCCLASSIFICATIONREFERENCE($,'[E]DDE','Mark',#161,$,$);
#167=IFCCLASSIFICATIONREFERENCE($,'[E]DE?','Sportsanl\X2\00E6\X0\g',#144,$,$);
#168=IFCCLASSIFICATIONREFERENCE($,'[E]DEA','Boldbane',#167,$,$);
#169=IFCCLASSIFICATIONREFERENCE($,'[E]DEB','V\X2\00E6\X0\ddel\X2\00F8\X0\bsbane',#167,$,$);
#170=IFCCLASSIFICATIONREFERENCE($,'[E]DEC','Atletikbane',#167,$,$);
#171=IFCCLASSIFICATIONREFERENCE($,'[E]DED','Sv\X2\00F8\X0\mmebassin',#167,$,$);
#172=IFCCLASSIFICATIONREFERENCE($,'[E]E??','Monument',#4,$,$);
#173=IFCCLASSIFICATIONREFERENCE($,'[E]EA?','Mindesm\X2\00E6\X0\rke',#172,$,$);
#174=IFCCLASSIFICATIONREFERENCE($,'[E]EAA','Kulturminde',#173,$,$);
#175=IFCCLASSIFICATIONREFERENCE($,'[E]EAB','Fortidsminde',#173,$,$);
#176=IFCCLASSIFICATIONREFERENCE($,'[E]Z??','Ikke defineret',#4,$,$);
#177=IFCCLASSIFICATIONREFERENCE($,'[E]ZZ?','Ikke defineret',#176,$,$);
#178=IFCCLASSIFICATIONREFERENCE($,'[E]ZZZ','Ikke defineret',#177,$,$);
#179=IFCCLASSIFICATIONREFERENCE($,'Rumanvendelse',$,#2,'Tildeler klassifikation af funktion til IFC Spaces (= ARCHICAD zoner) og IFC Zones baseret p\X2\00E5\X0\ CCS (R1) specifikationen.',$);
#180=IFCCLASSIFICATIONREFERENCE($,'[A]A??','Rum til menneskeligt behov og virke',#179,$,$);
#181=IFCCLASSIFICATIONREFERENCE($,'[A]AA?','Opholdsrum',#180,$,$);
#182=IFCCLASSIFICATIONREFERENCE($,'[A]AAA','V\X2\00E6\X0\relse',#181,$,$);
#183=IFCCLASSIFICATIONREFERENCE($,'[A]AAB','Stue',#181,$,$);
#184=IFCCLASSIFICATIONREFERENCE($,'[A]AAC','Venterum',#181,$,$);
#185=IFCCLASSIFICATIONREFERENCE($,'[A]AAD','G\X2\00E5\X0\rdrum',#181,$,$);
#186=IFCCLASSIFICATIONREFERENCE($,'[A]AB?','Hygiejnerum',#180,$,$);
#187=IFCCLASSIFICATIONREFERENCE($,'[A]ABA','Badev\X2\00E6\X0\relse',#186,$,$);
#188=IFCCLASSIFICATIONREFERENCE($,'[A]ABB','Toilet',#186,$,$);
#189=IFCCLASSIFICATIONREFERENCE($,'[A]ABC','Puslerum',#186,$,$);
#190=IFCCLASSIFICATIONREFERENCE($,'[A]ABD','Omkl\X2\00E6\X0\dningsrum',#186,$,$);
#191=IFCCLASSIFICATIONREFERENCE($,'[A]ABE','Baderum',#186,$,$);
#192=IFCCLASSIFICATIONREFERENCE($,'[A]ABF','Sauna',#186,$,$);
#193=IFCCLASSIFICATIONREFERENCE($,'[A]AC?','Isolationsrum',#180,$,$);
#194=IFCCLASSIFICATIONREFERENCE($,'[A]ACA','Beskyttelsesrum',#193,$,$);
#195=IFCCLASSIFICATIONREFERENCE($,'[A]ACB','Celle',#193,$,$);
#196=IFCCLASSIFICATIONREFERENCE($,'[A]AD?','Arbejdsrum',#180,$,$);
#197=IFCCLASSIFICATIONREFERENCE($,'[A]ADA','Kontor',#196,$,$);
#198=IFCCLASSIFICATIONREFERENCE($,'[A]ADB','M\X2\00F8\X0\derum',#196,$,$);
#199=IFCCLASSIFICATIONREFERENCE($,'[A]ADC','Reception',#196,$,$);
#200=IFCCLASSIFICATIONREFERENCE($,'[A]ADD','Salgslokale',#196,$,$);
#201=IFCCLASSIFICATIONREFERENCE($,'[A]ADE','Undervisningsrum',#196,$,$);
#202=IFCCLASSIFICATIONREFERENCE($,'[A]ADF','Studierum',#196,$,$);
#203=IFCCLASSIFICATIONREFERENCE($,'[A]ADG','Vaskerum',#196,$,$);
#204=IFCCLASSIFICATIONREFERENCE($,'[A]ADH','Pakkerum',#196,$,$);
#205=IFCCLASSIFICATIONREFERENCE($,'[A]ADJ','Behandlingsrum',#196,$,$);
#206=IFCCLASSIFICATIONREFERENCE($,'[A]ADK','Unders\X2\00F8\X0\gelsesrum',#196,$,$);
#207=IFCCLASSIFICATIONREFERENCE($,'[A]ADL','Overv\X2\00E5\X0\gningsrum',#196,$,$);
#208=IFCCLASSIFICATIONREFERENCE($,'[A]ADM','Betragterrum',#196,$,$);
#209=IFCCLASSIFICATIONREFERENCE($,'[A]ADN','Mediev\X2\00E6\X0\rksted',#196,$,$);
#210=IFCCLASSIFICATIONREFERENCE($,'[A]ADP','Varemodtagelsesrum',#196,$,$);
#211=IFCCLASSIFICATIONREFERENCE($,'[A]ADQ','Postrum',#196,$,$);
#212=IFCCLASSIFICATIONREFERENCE($,'[A]AE?','Produktionsrum',#180,$,$);
#213=IFCCLASSIFICATIONREFERENCE($,'[A]AEA','K\X2\00F8\X0\kken',#212,$,$);
#214=IFCCLASSIFICATIONREFERENCE($,'[A]AEB','Materialev\X2\00E6\X0\rksted',#212,$,$);
#215=IFCCLASSIFICATIONREFERENCE($,'[A]AEC','Teknikv\X2\00E6\X0\rksted',#212,$,$);
#216=IFCCLASSIFICATIONREFERENCE($,'[A]AED','Kunstv\X2\00E6\X0\rksted',#212,$,$);
#217=IFCCLASSIFICATIONREFERENCE($,'[A]AF?','Fors\X2\00F8\X0\gsrum',#180,$,$);
#218=IFCCLASSIFICATIONREFERENCE($,'[A]AFA','Tekniklaboratorium',#217,$,$);
#219=IFCCLASSIFICATIONREFERENCE($,'[A]AFB','Materialelaboratorium',#217,$,$);
#220=IFCCLASSIFICATIONREFERENCE($,'[A]AFC','Biologilaboratorium',#217,$,$);
#221=IFCCLASSIFICATIONREFERENCE($,'[A]AG?','Udfoldelsesrum',#180,$,$);
#222=IFCCLASSIFICATIONREFERENCE($,'[A]AGA','Sportshal',#221,$,$);
#223=IFCCLASSIFICATIONREFERENCE($,'[A]AGB','Tr\X2\00E6\X0\ningsrum',#221,$,$);
#224=IFCCLASSIFICATIONREFERENCE($,'[A]AGC','\X2\00D8\X0\verum',#221,$,$);
#225=IFCCLASSIFICATIONREFERENCE($,'[A]AGD','Scenerum',#221,$,$);
#226=IFCCLASSIFICATIONREFERENCE($,'[A]AGE','Legerum',#221,$,$);
#227=IFCCLASSIFICATIONREFERENCE($,'[A]AH?','Forsamlingsrum',#180,$,$);
#228=IFCCLASSIFICATIONREFERENCE($,'[A]AHA','Spiserum',#227,$,$);
#229=IFCCLASSIFICATIONREFERENCE($,'[A]AHB','Auditorium',#227,$,$);
#230=IFCCLASSIFICATIONREFERENCE($,'[A]AHC','Sal',#227,$,$);
#231=IFCCLASSIFICATIONREFERENCE($,'[A]AHD','Udstillingsrum',#227,$,$);
#232=IFCCLASSIFICATIONREFERENCE($,'[A]AHE','Religi\X2\00F8\X0\se rum',#227,$,$);
#233=IFCCLASSIFICATIONREFERENCE($,'[A]AHF','Biblioteksrum',#227,$,$);
#234=IFCCLASSIFICATIONREFERENCE($,'[A]C??','Rum til opbevaring',#179,$,$);
#235=IFCCLASSIFICATIONREFERENCE($,'[A]CA?','Materialerum',#234,$,$);
#236=IFCCLASSIFICATIONREFERENCE($,'[A]CAA','Affaldsrum',#235,$,$);
#237=IFCCLASSIFICATIONREFERENCE($,'[A]CAB','Kemikaliedepot',#235,$,$);
#238=IFCCLASSIFICATIONREFERENCE($,'[A]CAC','Medicindepot',#235,$,$);
#239=IFCCLASSIFICATIONREFERENCE($,'[A]CAD','Informationsarkiv',#235,$,$);
#240=IFCCLASSIFICATIONREFERENCE($,'[A]CAE','V\X2\00E6\X0\skedepot',#235,$,$);
#241=IFCCLASSIFICATIONREFERENCE($,'[A]CAF','R\X2\00E5\X0\stofdepot',#235,$,$);
#242=IFCCLASSIFICATIONREFERENCE($,'[A]CAG','F\X2\00F8\X0\devaredepot',#235,$,$);
#243=IFCCLASSIFICATIONREFERENCE($,'[A]CAH','V\X2\00E6\X0\rdidepot',#235,$,$);
#244=IFCCLASSIFICATIONREFERENCE($,'[A]CAJ','Emballagedepot',#235,$,$);
#245=IFCCLASSIFICATIONREFERENCE($,'[A]CAK','Bekl\X2\00E6\X0\dningsdepot',#235,$,$);
#246=IFCCLASSIFICATIONREFERENCE($,'[A]CAL','Byggevaredepot',#235,$,$);
#247=IFCCLASSIFICATIONREFERENCE($,'[A]CB?','Materielrum',#234,$,$);
#248=IFCCLASSIFICATIONREFERENCE($,'[A]CBA','Inventardepot',#247,$,$);
#249=IFCCLASSIFICATIONREFERENCE($,'[A]CBB','Redskabsdepot',#247,$,$);
#250=IFCCLASSIFICATIONREFERENCE($,'[A]CBC','Apparatdepot',#247,$,$);
#251=IFCCLASSIFICATIONREFERENCE($,'[A]CBD','Transportmiddeldepot',#247,$,$);
#252=IFCCLASSIFICATIONREFERENCE($,'[A]CBE','Reng\X2\00F8\X0\ringsrum',#247,$,$);
#253=IFCCLASSIFICATIONREFERENCE($,'[A]CC?','Dyrerum',#234,$,$);
#254=IFCCLASSIFICATIONREFERENCE($,'[A]CCA','Bur',#253,$,$);
#255=IFCCLASSIFICATIONREFERENCE($,'[A]CCB','B\X2\00E5\X0\s',#253,$,$);
#256=IFCCLASSIFICATIONREFERENCE($,'[A]CCC','Stald',#253,$,$);
#257=IFCCLASSIFICATIONREFERENCE($,'[A]CCD','Bassin',#253,$,$);
#258=IFCCLASSIFICATIONREFERENCE($,'[A]CD?','Planterum',#234,$,$);
#259=IFCCLASSIFICATIONREFERENCE($,'[A]CDA','V\X2\00E6\X0\ksthus',#258,$,$);
#260=IFCCLASSIFICATIONREFERENCE($,'[A]CDB','Haverum',#258,$,$);
#261=IFCCLASSIFICATIONREFERENCE($,'[A]CE?','Morsrum',#234,$,$);
#262=IFCCLASSIFICATIONREFERENCE($,'[A]CEA','Ligrum',#261,$,$);
#263=IFCCLASSIFICATIONREFERENCE($,'[A]CEB','Gravkammer',#261,$,$);
#264=IFCCLASSIFICATIONREFERENCE($,'[A]D??','Rum til tekniske systemer',#179,$,$);
#265=IFCCLASSIFICATIONREFERENCE($,'[A]DA?','Driftsteknikrum',#264,$,$);
#266=IFCCLASSIFICATIONREFERENCE($,'[A]DAA','El-teknikrum',#265,$,$);
#267=IFCCLASSIFICATIONREFERENCE($,'[A]DAB','IT-teknikrum',#265,$,$);
#268=IFCCLASSIFICATIONREFERENCE($,'[A]DAC','Maskinteknikrum',#265,$,$);
#269=IFCCLASSIFICATIONREFERENCE($,'[A]DAD','F\X2\00E6\X0\llesteknikrum',#265,$,$);
#270=IFCCLASSIFICATIONREFERENCE($,'[A]DB?','Udstyrsrum',#264,$,$);
#271=IFCCLASSIFICATIONREFERENCE($,'[A]DBA','Kontroludstyrsrum',#270,$,$);
#272=IFCCLASSIFICATIONREFERENCE($,'[A]DBB','Produktionsudstyrsrum',#270,$,$);
#273=IFCCLASSIFICATIONREFERENCE($,'[A]DBC','Serviceudstyrsrum',#270,$,$);
#274=IFCCLASSIFICATIONREFERENCE($,'[A]DBD','Unders\X2\00F8\X0\gelsesudstyrsrum',#270,$,$);
#275=IFCCLASSIFICATIONREFERENCE($,'[A]E??','Rum til infrastruktur',#179,$,$);
#276=IFCCLASSIFICATIONREFERENCE($,'[A]EA?','Fordelingsrum',#275,$,$);
#277=IFCCLASSIFICATIONREFERENCE($,'[A]EAA','Forhal',#276,$,$);
#278=IFCCLASSIFICATIONREFERENCE($,'[A]EAB','Sluse',#276,$,$);
#279=IFCCLASSIFICATIONREFERENCE($,'[A]EAC','Gang',#276,$,$);
#280=IFCCLASSIFICATIONREFERENCE($,'[A]EAD','Trapperum',#276,$,$);
#281=IFCCLASSIFICATIONREFERENCE($,'[A]EAE','Elevatorrum',#276,$,$);
#282=IFCCLASSIFICATIONREFERENCE($,'[A]EAF','Portrum',#276,$,$);
#283=IFCCLASSIFICATIONREFERENCE($,'[A]EB?','Teknisk f\X2\00F8\X0\ringsrum',#275,$,$);
#284=IFCCLASSIFICATIONREFERENCE($,'[A]EBA','Servicegang',#283,$,$);
#285=IFCCLASSIFICATIONREFERENCE($,'[A]EBB','Skakt',#283,$,$);
#286=IFCCLASSIFICATIONREFERENCE($,'[A]EBC','Kanal',#283,$,$);
#287=IFCCLASSIFICATIONREFERENCE($,'[A]EC?','Transportrum',#275,$,$);
#288=IFCCLASSIFICATIONREFERENCE($,'[A]ECA','Fritrumsprofil',#287,$,$);
#289=IFCCLASSIFICATIONREFERENCE($,'[A]ECB','Tunnelrum',#287,$,$);
#290=IFCCLASSIFICATIONREFERENCE($,'[A]Z??','Ikke defineret',#179,$,$);
#291=IFCCLASSIFICATIONREFERENCE($,'[A]ZZ?','Ikke defineret',#290,$,$);
#292=IFCCLASSIFICATIONREFERENCE($,'[A]ZZZ','Ikke defineret',#291,$,$);
#293=IFCCLASSIFICATIONREFERENCE($,'Bygningsdele - Funktionelle systemer',$,#2,'Tildeler klassifikation efter funktion, placering og/eller form til ARCHICAD bygningsdele baseret p\X2\00E5\X0\ CCS (R1) specifikationen.',$);
#294=IFCCLASSIFICATIONREFERENCE($,'[L]A','Terr\X2\00E6\X0\nsystem',#293,$,$);
#295=IFCCLASSIFICATIONREFERENCE($,'[L]B','V\X2\00E6\X0\gsystem',#293,$,$);
#296=IFCCLASSIFICATIONREFERENCE($,'[L]C','D\X2\00E6\X0\ksystem',#293,$,$);
#297=IFCCLASSIFICATIONREFERENCE($,'[L]D','Tagsystem',#293,$,$);
#298=IFCCLASSIFICATIONREFERENCE($,'[L]E','Gas- og luftsystem',#293,$,$);
#299=IFCCLASSIFICATIONREFERENCE($,'[L]F','Vand- og v\X2\00E6\X0\skesystem',#293,$,$);
#300=IFCCLASSIFICATIONREFERENCE($,'[L]G','Afl\X2\00F8\X0\b- og affaldssystem',#293,$,$);
#301=IFCCLASSIFICATIONREFERENCE($,'[L]H','K\X2\00F8\X0\le- og varmesystem',#293,$,$);
#302=IFCCLASSIFICATIONREFERENCE($,'[L]J','Ventilationssystem',#293,$,$);
#303=IFCCLASSIFICATIONREFERENCE($,'[L]K','El-system',#293,$,$);
#304=IFCCLASSIFICATIONREFERENCE($,'[L]L','Automationsystem',#293,$,$);
#305=IFCCLASSIFICATIONREFERENCE($,'[L]M','IT- og kommunikationssystem',#293,$,$);
#306=IFCCLASSIFICATIONREFERENCE($,'[L]N','Transportsystem',#293,$,$);
#307=IFCCLASSIFICATIONREFERENCE($,'[L]P','Indretningssystem',#293,$,$);
#308=IFCCLASSIFICATIONREFERENCE($,'Bygningsdele - Tekniske systemer',$,#2,'Tildeler klassifikation efter funktion, placering og/eller form til ARCHICAD bygningsdele baseret p\X2\00E5\X0\ CCS (R1) specifikationen.',$);
#309=IFCCLASSIFICATIONREFERENCE($,'[L]A?','Opbyggende teknisk system',#308,$,$);
#310=IFCCLASSIFICATIONREFERENCE($,'[L]AA','Bel\X2\00E6\X0\gningsopbygning',#309,$,$);
#311=IFCCLASSIFICATIONREFERENCE($,'[L]AB','Fundamentsopbygning',#309,$,$);
#312=IFCCLASSIFICATIONREFERENCE($,'[L]AC','Etageadskillelsesopbygning',#309,$,$);
#313=IFCCLASSIFICATIONREFERENCE($,'[L]AD','V\X2\00E6\X0\gopbygning',#309,$,$);
#314=IFCCLASSIFICATIONREFERENCE($,'[L]AE','Tagopbygning',#309,$,$);
#315=IFCCLASSIFICATIONREFERENCE($,'[L]AF','Trappeopbygning',#309,$,$);
#316=IFCCLASSIFICATIONREFERENCE($,'[L]AG','Rampeopbygning',#309,$,$);
#317=IFCCLASSIFICATIONREFERENCE($,'[L]B?','Konstruktivt teknisk system',#308,$,$);
#318=IFCCLASSIFICATIONREFERENCE($,'[L]BA','Terr\X2\00E6\X0\nkonstruktion',#317,$,$);
#319=IFCCLASSIFICATIONREFERENCE($,'[L]BB','Fundamentskonstruktion',#317,$,$);
#320=IFCCLASSIFICATIONREFERENCE($,'[L]BC','D\X2\00E6\X0\kkonstruktion',#317,$,$);
#321=IFCCLASSIFICATIONREFERENCE($,'[L]BD','V\X2\00E6\X0\gkonstruktion',#317,$,$);
#322=IFCCLASSIFICATIONREFERENCE($,'[L]BE','Tagkonstruktion',#317,$,$);
#323=IFCCLASSIFICATIONREFERENCE($,'[L]BF','Gulvkonstruktion',#317,$,$);
#324=IFCCLASSIFICATIONREFERENCE($,'[L]BG','Loftkonstruktion',#317,$,$);
#325=IFCCLASSIFICATIONREFERENCE($,'[L]H?','Forsynende teknisk system',#308,$,$);
#326=IFCCLASSIFICATIONREFERENCE($,'[L]HA','Gas- og luftforsyningsanl\X2\00E6\X0\g',#325,$,$);
#327=IFCCLASSIFICATIONREFERENCE($,'[L]HB','Vandforsyningsanl\X2\00E6\X0\g',#325,$,$);
#328=IFCCLASSIFICATIONREFERENCE($,'[L]HC','K\X2\00F8\X0\leforsyningsanl\X2\00E6\X0\g',#325,$,$);
#329=IFCCLASSIFICATIONREFERENCE($,'[L]HD','Varmeforsyningsanl\X2\00E6\X0\g',#325,$,$);
#330=IFCCLASSIFICATIONREFERENCE($,'[L]HE','Kombineret varme- og k\X2\00F8\X0\leforsyningsanl\X2\00E6\X0\g',#325,$,$);
#331=IFCCLASSIFICATIONREFERENCE($,'[L]HF','Ventilationsanl\X2\00E6\X0\g',#325,$,$);
#332=IFCCLASSIFICATIONREFERENCE($,'[L]HG','El-forsyningsanl\X2\00E6\X0\g',#325,$,$);
#333=IFCCLASSIFICATIONREFERENCE($,'[L]HH','Belysningsanl\X2\00E6\X0\g',#325,$,$);
#334=IFCCLASSIFICATIONREFERENCE($,'[L]HJ','Signalforsyningsanl\X2\00E6\X0\g',#325,$,$);
#335=IFCCLASSIFICATIONREFERENCE($,'[L]J?','Transporterende teknisk system',#308,$,$);
#336=IFCCLASSIFICATIONREFERENCE($,'[L]JA','Gasfordelingsanl\X2\00E6\X0\g',#335,$,$);
#337=IFCCLASSIFICATIONREFERENCE($,'[L]JB','Vandfordelingsanl\X2\00E6\X0\g',#335,$,$);
#338=IFCCLASSIFICATIONREFERENCE($,'[L]JC','Kemikaliefordelingsanl\X2\00E6\X0\g',#335,$,$);
#339=IFCCLASSIFICATIONREFERENCE($,'[L]JD','Bortledningsanl\X2\00E6\X0\g',#335,$,$);
#340=IFCCLASSIFICATIONREFERENCE($,'[L]JE','Affaldsanl\X2\00E6\X0\g',#335,$,$);
#341=IFCCLASSIFICATIONREFERENCE($,'[L]JF','K\X2\00F8\X0\lefordelingsanl\X2\00E6\X0\g',#335,$,$);
#342=IFCCLASSIFICATIONREFERENCE($,'[L]JG','Varmefordelingsanl\X2\00E6\X0\g',#335,$,$);
#343=IFCCLASSIFICATIONREFERENCE($,'[L]JH','Kombineret varme- og k\X2\00F8\X0\lefordelingsanl\X2\00E6\X0\g',#335,$,$);
#344=IFCCLASSIFICATIONREFERENCE($,'[L]JJ','Luftfordelingsanl\X2\00E6\X0\g',#335,$,$);
#345=IFCCLASSIFICATIONREFERENCE($,'[L]JK','El-fordelingsanl\X2\00E6\X0\g',#335,$,$);
#346=IFCCLASSIFICATIONREFERENCE($,'[L]JL','Signalfordelingsanl\X2\00E6\X0\g',#335,$,$);
#347=IFCCLASSIFICATIONREFERENCE($,'[L]JM','Persontransportanl\X2\00E6\X0\g',#335,$,$);
#348=IFCCLASSIFICATIONREFERENCE($,'[L]JN','Godstransportanl\X2\00E6\X0\g',#335,$,$);
#349=IFCCLASSIFICATIONREFERENCE($,'[L]JP','Teknisk f\X2\00F8\X0\ringsanl\X2\00E6\X0\g',#335,$,$);
#350=IFCCLASSIFICATIONREFERENCE($,'[L]K?','Behandlende teknisk system',#308,$,$);
#351=IFCCLASSIFICATIONREFERENCE($,'[L]KA','Solafsk\X2\00E6\X0\rmningsanl\X2\00E6\X0\g',#350,$,$);
#352=IFCCLASSIFICATIONREFERENCE($,'[L]KB','D\X2\00F8\X0\r- og vinduesoplukkeanl\X2\00E6\X0\g',#350,$,$);
#353=IFCCLASSIFICATIONREFERENCE($,'[L]KC','Filteranl\X2\00E6\X0\g',#350,$,$);
#354=IFCCLASSIFICATIONREFERENCE($,'[L]KD','Udskilleranl\X2\00E6\X0\g',#350,$,$);
#355=IFCCLASSIFICATIONREFERENCE($,'[L]KE','Vandbehandlingsanl\X2\00E6\X0\g',#350,$,$);
#356=IFCCLASSIFICATIONREFERENCE($,'[L]KF','Pumpeanl\X2\00E6\X0\g',#350,$,$);
#357=IFCCLASSIFICATIONREFERENCE($,'[L]KG','Trykholde- og ekspansionsanl\X2\00E6\X0\g',#350,$,$);
#358=IFCCLASSIFICATIONREFERENCE($,'[L]KH','Omformeranl\X2\00E6\X0\g',#350,$,$);
#359=IFCCLASSIFICATIONREFERENCE($,'[L]KJ','Antenneanl\X2\00E6\X0\g',#350,$,$);
#360=IFCCLASSIFICATIONREFERENCE($,'[L]KK','Vejrstationsanl\X2\00E6\X0\g',#350,$,$);
#361=IFCCLASSIFICATIONREFERENCE($,'[L]KL','Adgangsanl\X2\00E6\X0\g',#350,$,$);
#362=IFCCLASSIFICATIONREFERENCE($,'[L]L?','Overv\X2\00E5\X0\gende teknisk system',#308,$,$);
#363=IFCCLASSIFICATIONREFERENCE($,'[L]LA','Gasalarmanl\X2\00E6\X0\g',#362,$,$);
#364=IFCCLASSIFICATIONREFERENCE($,'[L]LB','Brandalarmanl\X2\00E6\X0\g',#362,$,$);
#365=IFCCLASSIFICATIONREFERENCE($,'[L]LC','Automationsanl\X2\00E6\X0\g',#362,$,$);
#366=IFCCLASSIFICATIONREFERENCE($,'[L]LD','Adgangskontrolanl\X2\00E6\X0\g',#362,$,$);
#367=IFCCLASSIFICATIONREFERENCE($,'[L]LE','Alarmanl\X2\00E6\X0\g',#362,$,$);
#368=IFCCLASSIFICATIONREFERENCE($,'[L]LF','TV-overv\X2\00E5\X0\gningsanl\X2\00E6\X0\g',#362,$,$);
#369=IFCCLASSIFICATIONREFERENCE($,'[L]M?','Informationspr\X2\00E6\X0\senterende teknisk system',#308,$,$);
#370=IFCCLASSIFICATIONREFERENCE($,'[L]MA','Varslingsanl\X2\00E6\X0\g',#369,$,$);
#371=IFCCLASSIFICATIONREFERENCE($,'[L]MB','Audio-Video anl\X2\00E6\X0\g',#369,$,$);
#372=IFCCLASSIFICATIONREFERENCE($,'[L]MC','Trafikanl\X2\00E6\X0\g',#369,$,$);
#373=IFCCLASSIFICATIONREFERENCE($,'[L]P?','Beskyttende teknisk system',#308,$,$);
#374=IFCCLASSIFICATIONREFERENCE($,'[L]PA','Brandbeskyttelsesanl\X2\00E6\X0\g',#373,$,$);
#375=IFCCLASSIFICATIONREFERENCE($,'[L]PB','Brandslukningsanl\X2\00E6\X0\g',#373,$,$);
#376=IFCCLASSIFICATIONREFERENCE($,'[L]PC','Jordingsanl\X2\00E6\X0\g',#373,$,$);
#377=IFCCLASSIFICATIONREFERENCE($,'[L]PD','Lynbeskyttelsesanl\X2\00E6\X0\g',#373,$,$);
#378=IFCCLASSIFICATIONREFERENCE($,'[L]PE','Katodisk beskyttelsesanl\X2\00E6\X0\g',#373,$,$);
#379=IFCCLASSIFICATIONREFERENCE($,'[L]Q?','Lagrende teknisk system',#308,$,$);
#380=IFCCLASSIFICATIONREFERENCE($,'[L]QA','M\X2\00E5\X0\leranl\X2\00E6\X0\g',#379,$,$);
#381=IFCCLASSIFICATIONREFERENCE($,'[L]QB','Gas- og luftart lageranl\X2\00E6\X0\g',#379,$,$);
#382=IFCCLASSIFICATIONREFERENCE($,'[L]QC','V\X2\00E6\X0\skelageranl\X2\00E6\X0\g',#379,$,$);
#383=IFCCLASSIFICATIONREFERENCE($,'[L]R?','Indrettende teknisk system',#308,$,$);
#384=IFCCLASSIFICATIONREFERENCE($,'[L]RA','Beplantning',#383,$,$);
#385=IFCCLASSIFICATIONREFERENCE($,'[L]RB','Inventar',#383,$,$);
#386=IFCCLASSIFICATIONREFERENCE($,'[L]RC','Udstyr',#383,$,$);
#387=IFCCLASSIFICATIONREFERENCE($,'Bygningsdele - Komponenter',$,#2,'Tildeler klassifikation efter funktion, placering og/eller form til ARCHICAD bygningsdele baseret p\X2\00E5\X0\ CCS (R1) specifikationen.',$);
#388=IFCCLASSIFICATIONREFERENCE($,'[L]B??','Omformende komponent',#387,$,$);
#389=IFCCLASSIFICATIONREFERENCE($,'[L]BA?','Elektrisk potentialeomformende komponent',#388,$,$);
#390=IFCCLASSIFICATIONREFERENCE($,'[L]BAA','Sp\X2\00E6\X0\ndingsm\X2\00E5\X0\lerel\X2\00E6\X0\',#389,$,$);
#391=IFCCLASSIFICATIONREFERENCE($,'[L]BAB','Sp\X2\00E6\X0\ndingsm\X2\00E5\X0\letransformer',#389,$,$);
#392=IFCCLASSIFICATIONREFERENCE($,'[L]BC?','Elektrisk str\X2\00F8\X0\momformende komponent',#388,$,$);
#393=IFCCLASSIFICATIONREFERENCE($,'[L]BCA','Str\X2\00F8\X0\mm\X2\00E5\X0\lerel\X2\00E6\X0\',#392,$,$);
#394=IFCCLASSIFICATIONREFERENCE($,'[L]BCB','Str\X2\00F8\X0\mm\X2\00E5\X0\letransformer',#392,$,$);
#395=IFCCLASSIFICATIONREFERENCE($,'[L]BD?','Densitetomformende komponent',#388,$,$);
#396=IFCCLASSIFICATIONREFERENCE($,'[L]BDA','Densitetstransmitter',#395,$,$);
#397=IFCCLASSIFICATIONREFERENCE($,'[L]BDB','Densitet switch',#395,$,$);
#398=IFCCLASSIFICATIONREFERENCE($,'[L]BE?','Elektromagnetisk variabelomformende komponent',#388,$,$);
#399=IFCCLASSIFICATIONREFERENCE($,'[L]BEA','Elektromagnetisk m\X2\00E5\X0\lerel\X2\00E6\X0\',#398,$,$);
#400=IFCCLASSIFICATIONREFERENCE($,'[L]BEB','Elektromagnetisk m\X2\00E5\X0\letransformer',#398,$,$);
#401=IFCCLASSIFICATIONREFERENCE($,'[L]BF?','Flowomformende komponent',#388,$,$);
#402=IFCCLASSIFICATIONREFERENCE($,'[L]BFA','V\X2\00E6\X0\skeflowm\X2\00E5\X0\ler',#401,$,$);
#403=IFCCLASSIFICATIONREFERENCE($,'[L]BFB','Gasflowm\X2\00E5\X0\ler',#401,$,$);
#404=IFCCLASSIFICATIONREFERENCE($,'[L]BFC','Lufttransmitter',#401,$,$);
#405=IFCCLASSIFICATIONREFERENCE($,'[L]BFD','Luftswitch',#401,$,$);
#406=IFCCLASSIFICATIONREFERENCE($,'[L]BG?','Positionsomformende komponent',#388,$,$);
#407=IFCCLASSIFICATIONREFERENCE($,'[L]BGA','Positionstransmitter',#406,$,$);
#408=IFCCLASSIFICATIONREFERENCE($,'[L]BGB','Positionsswitch',#406,$,$);
#409=IFCCLASSIFICATIONREFERENCE($,'[L]BGC','Bev\X2\00E6\X0\gelsesdetektor',#406,$,$);
#410=IFCCLASSIFICATIONREFERENCE($,'[L]BGD','Retningsm\X2\00E5\X0\ler',#406,$,$);
#411=IFCCLASSIFICATIONREFERENCE($,'[L]BJ?','Forbrugsomformende komponent',#388,$,$);
#412=IFCCLASSIFICATIONREFERENCE($,'[L]BJA','Gasm\X2\00E5\X0\ler',#411,$,$);
#413=IFCCLASSIFICATIONREFERENCE($,'[L]BJB','K\X2\00F8\X0\lem\X2\00E5\X0\ler',#411,$,$);
#414=IFCCLASSIFICATIONREFERENCE($,'[L]BJC','Varmem\X2\00E5\X0\ler',#411,$,$);
#415=IFCCLASSIFICATIONREFERENCE($,'[L]BJD','El-m\X2\00E5\X0\ler',#411,$,$);
#416=IFCCLASSIFICATIONREFERENCE($,'[L]BK?','Tidsomformende komponent',#388,$,$);
#417=IFCCLASSIFICATIONREFERENCE($,'[L]BKA','M\X2\00E5\X0\leur',#416,$,$);
#418=IFCCLASSIFICATIONREFERENCE($,'[L]BKB','Urswitch',#416,$,$);
#419=IFCCLASSIFICATIONREFERENCE($,'[L]BL?','Niveauomformende komponent',#388,$,$);
#420=IFCCLASSIFICATIONREFERENCE($,'[L]BLA','Niveautransmitter',#419,$,$);
#421=IFCCLASSIFICATIONREFERENCE($,'[L]BLB','Niveauswitch',#419,$,$);
#422=IFCCLASSIFICATIONREFERENCE($,'[L]BM?','Fugtighedsomformende komponent',#388,$,$);
#423=IFCCLASSIFICATIONREFERENCE($,'[L]BMA','Fugttransmitter',#422,$,$);
#424=IFCCLASSIFICATIONREFERENCE($,'[L]BMB','Fugtswitch',#422,$,$);
#425=IFCCLASSIFICATIONREFERENCE($,'[L]BP?','Trykomformende komponent',#388,$,$);
#426=IFCCLASSIFICATIONREFERENCE($,'[L]BPA','Tryktransmitter',#425,$,$);
#427=IFCCLASSIFICATIONREFERENCE($,'[L]BPB','Trykswitch',#425,$,$);
#428=IFCCLASSIFICATIONREFERENCE($,'[L]BQ?','Kvalitetsomformende komponent',#388,$,$);
#429=IFCCLASSIFICATIONREFERENCE($,'[L]BQA','Luftkvalitettransmitter',#428,$,$);
#430=IFCCLASSIFICATIONREFERENCE($,'[L]BQB','Luftkvalitetsdetektor',#428,$,$);
#431=IFCCLASSIFICATIONREFERENCE($,'[L]BQC','R\X2\00F8\X0\gtransmitter',#428,$,$);
#432=IFCCLASSIFICATIONREFERENCE($,'[L]BQD','R\X2\00F8\X0\gdetektor',#428,$,$);
#433=IFCCLASSIFICATIONREFERENCE($,'[L]BR?','Str\X2\00E5\X0\lingsomformende komponent',#388,$,$);
#434=IFCCLASSIFICATIONREFERENCE($,'[L]BRA','Lystransmitter',#433,$,$);
#435=IFCCLASSIFICATIONREFERENCE($,'[L]BRB','Lysswitch',#433,$,$);
#436=IFCCLASSIFICATIONREFERENCE($,'[L]BRC','Flammedetektor',#433,$,$);
#437=IFCCLASSIFICATIONREFERENCE($,'[L]BRD','Fotocelle',#433,$,$);
#438=IFCCLASSIFICATIONREFERENCE($,'[L]BS?','Hastighed/frekvensomformende komponent',#388,$,$);
#439=IFCCLASSIFICATIONREFERENCE($,'[L]BSA','Frekvensm\X2\00E5\X0\ler',#438,$,$);
#440=IFCCLASSIFICATIONREFERENCE($,'[L]BSB','Speedometer',#438,$,$);
#441=IFCCLASSIFICATIONREFERENCE($,'[L]BSC','Tachometer',#438,$,$);
#442=IFCCLASSIFICATIONREFERENCE($,'[L]BSD','Accelerationsmeter',#438,$,$);
#443=IFCCLASSIFICATIONREFERENCE($,'[L]BSE','Vibrationsdetektor',#438,$,$);
#444=IFCCLASSIFICATIONREFERENCE($,'[L]BT?','Temperaturomformende komponent',#388,$,$);
#445=IFCCLASSIFICATIONREFERENCE($,'[L]BTA','Temperaturtransmitter',#444,$,$);
#446=IFCCLASSIFICATIONREFERENCE($,'[L]BTB','Temperaturswitch',#444,$,$);
#447=IFCCLASSIFICATIONREFERENCE($,'[L]BU?','Multivatriabelomformende komponent',#388,$,$);
#448=IFCCLASSIFICATIONREFERENCE($,'[L]BUA','Multitransmitter',#447,$,$);
#449=IFCCLASSIFICATIONREFERENCE($,'[L]BUB','Multiswitch',#447,$,$);
#450=IFCCLASSIFICATIONREFERENCE($,'[L]BUC','Encoder',#447,$,$);
#451=IFCCLASSIFICATIONREFERENCE($,'[L]BW?','V\X2\00E6\X0\gt/kraftomformende komponent',#388,$,$);
#452=IFCCLASSIFICATIONREFERENCE($,'[L]BWA','V\X2\00E6\X0\gt',#451,$,$);
#453=IFCCLASSIFICATIONREFERENCE($,'[L]BWB','Kraftm\X2\00E5\X0\ler',#451,$,$);
#454=IFCCLASSIFICATIONREFERENCE($,'[L]BX?','Lyd- og billedomformende komponent',#388,$,$);
#455=IFCCLASSIFICATIONREFERENCE($,'[L]BXA','Mikrofon',#454,$,$);
#456=IFCCLASSIFICATIONREFERENCE($,'[L]BXB','Kamera',#454,$,$);
#457=IFCCLASSIFICATIONREFERENCE($,'[L]BY?','Stofomformende komponent',#388,$,$);
#458=IFCCLASSIFICATIONREFERENCE($,'[L]BYA','Plante',#457,$,$);
#459=IFCCLASSIFICATIONREFERENCE($,'[L]BZ?','H\X2\00E6\X0\ndelsesomformende komponent',#388,$,$);
#460=IFCCLASSIFICATIONREFERENCE($,'[L]BZA','M\X2\00E6\X0\ngdem\X2\00E5\X0\ler',#459,$,$);
#461=IFCCLASSIFICATIONREFERENCE($,'[L]BZB','V\X2\00E6\X0\skedetektor',#459,$,$);
#462=IFCCLASSIFICATIONREFERENCE($,'[L]BZC','Kortl\X2\00E6\X0\ser',#459,$,$);
#463=IFCCLASSIFICATIONREFERENCE($,'[L]BZE','Cyklus detektor',#459,$,$);
#464=IFCCLASSIFICATIONREFERENCE($,'[L]BZF','Synkroniseringsenhed',#459,$,$);
#465=IFCCLASSIFICATIONREFERENCE($,'[L]BZG','Ledningsevnem\X2\00E5\X0\ler',#459,$,$);
#466=IFCCLASSIFICATIONREFERENCE($,'[L]C??','Lagrende komponent',#387,$,$);
#467=IFCCLASSIFICATIONREFERENCE($,'[L]CA?','Kapacitiv lagrende komponent',#466,$,$);
#468=IFCCLASSIFICATIONREFERENCE($,'[L]CAA','Kapacitor',#467,$,$);
#469=IFCCLASSIFICATIONREFERENCE($,'[L]CF?','Informationslagrende komponent',#466,$,$);
#470=IFCCLASSIFICATIONREFERENCE($,'[L]CFA','Lagermedie',#469,$,$);
#471=IFCCLASSIFICATIONREFERENCE($,'[L]CM?','Lukket station\X2\00E6\X0\r komponent',#466,$,$);
#472=IFCCLASSIFICATIONREFERENCE($,'[L]CMA','Beholder',#471,$,$);
#473=IFCCLASSIFICATIONREFERENCE($,'[L]CMB','Bassin',#471,$,$);
#474=IFCCLASSIFICATIONREFERENCE($,'[L]CMC','Boks',#471,$,$);
#475=IFCCLASSIFICATIONREFERENCE($,'[L]CN?','Lukket flytbar komponent',#466,$,$);
#476=IFCCLASSIFICATIONREFERENCE($,'[L]CNA','Container',#475,$,$);
#477=IFCCLASSIFICATIONREFERENCE($,'[L]CNB','Gasflaske',#475,$,$);
#478=IFCCLASSIFICATIONREFERENCE($,'[L]CNC','Tromle',#475,$,$);
#479=IFCCLASSIFICATIONREFERENCE($,'[L]CND','Elevatorstol',#475,$,$);
#480=IFCCLASSIFICATIONREFERENCE($,'[L]CP?','Termisk energilagrende komponent',#466,$,$);
#481=IFCCLASSIFICATIONREFERENCE($,'[L]CPA','Varmtvandsbeholder',#480,$,$);
#482=IFCCLASSIFICATIONREFERENCE($,'[L]CPB','Istank',#480,$,$);
#483=IFCCLASSIFICATIONREFERENCE($,'[L]CPC','Dampbeholder',#480,$,$);
#484=IFCCLASSIFICATIONREFERENCE($,'[L]E??','Energigivende komponent',#387,$,$);
#485=IFCCLASSIFICATIONREFERENCE($,'[L]EA?','Lysafgivende komponent',#484,$,$);
#486=IFCCLASSIFICATIONREFERENCE($,'[L]EAA','Gl\X2\00F8\X0\delampe',#485,$,$);
#487=IFCCLASSIFICATIONREFERENCE($,'[L]EAB','Damplampe',#485,$,$);
#488=IFCCLASSIFICATIONREFERENCE($,'[L]EAC','LED lyskilde',#485,$,$);
#489=IFCCLASSIFICATIONREFERENCE($,'[L]EB?','Elektrisk varmeenergikomponent',#484,$,$);
#490=IFCCLASSIFICATIONREFERENCE($,'[L]EBA','Elektrisk kedel',#489,$,$);
#491=IFCCLASSIFICATIONREFERENCE($,'[L]EBB','Elektrisk varmflade',#489,$,$);
#492=IFCCLASSIFICATIONREFERENCE($,'[L]EBC','Elektrisk varmekabel',#489,$,$);
#493=IFCCLASSIFICATIONREFERENCE($,'[L]EBD','Elektrisk varmebl\X2\00E6\X0\ser',#489,$,$);
#494=IFCCLASSIFICATIONREFERENCE($,'[L]EBE','Elektrisk varmer\X2\00F8\X0\r',#489,$,$);
#495=IFCCLASSIFICATIONREFERENCE($,'[L]EM?','Forbr\X2\00E6\X0\ndingskomponent',#484,$,$);
#496=IFCCLASSIFICATIONREFERENCE($,'[L]EMA','Ovn',#495,$,$);
#497=IFCCLASSIFICATIONREFERENCE($,'[L]EMB','Kedel',#495,$,$);
#498=IFCCLASSIFICATIONREFERENCE($,'[L]EMC','Br\X2\00E6\X0\nder',#495,$,$);
#499=IFCCLASSIFICATIONREFERENCE($,'[L]EP?','Varmeoverf\X2\00F8\X0\rselskomponent',#484,$,$);
#500=IFCCLASSIFICATIONREFERENCE($,'[L]EPA','Varmeflade',#499,$,$);
#501=IFCCLASSIFICATIONREFERENCE($,'[L]EPB','Vandvarmer',#499,$,$);
#502=IFCCLASSIFICATIONREFERENCE($,'[L]EPC','Varmeveksler',#499,$,$);
#503=IFCCLASSIFICATIONREFERENCE($,'[L]EPD','Varmepumpe',#499,$,$);
#504=IFCCLASSIFICATIONREFERENCE($,'[L]EPE','Radiator',#499,$,$);
#505=IFCCLASSIFICATIONREFERENCE($,'[L]EPF','Varmer\X2\00F8\X0\r',#499,$,$);
#506=IFCCLASSIFICATIONREFERENCE($,'[L]EPG','Varmepanel',#499,$,$);
#507=IFCCLASSIFICATIONREFERENCE($,'[L]EQ?','Konvektionsk\X2\00F8\X0\ling komponent',#484,$,$);
#508=IFCCLASSIFICATIONREFERENCE($,'[L]EQA','K\X2\00F8\X0\leflade',#507,$,$);
#509=IFCCLASSIFICATIONREFERENCE($,'[L]EQB','Fordamper',#507,$,$);
#510=IFCCLASSIFICATIONREFERENCE($,'[L]EQC','K\X2\00F8\X0\lepumpe',#507,$,$);
#511=IFCCLASSIFICATIONREFERENCE($,'[L]EQD','K\X2\00F8\X0\let\X2\00E5\X0\rn',#507,$,$);
#512=IFCCLASSIFICATIONREFERENCE($,'[L]EQE','K\X2\00F8\X0\lepanel',#507,$,$);
#513=IFCCLASSIFICATIONREFERENCE($,'[L]EQF','T\X2\00F8\X0\rk\X2\00F8\X0\ler',#507,$,$);
#514=IFCCLASSIFICATIONREFERENCE($,'[L]ES?','Fordampningsk\X2\00F8\X0\ling komponent',#484,$,$);
#515=IFCCLASSIFICATIONREFERENCE($,'[L]ESA','K\X2\00F8\X0\lemaskine',#514,$,$);
#516=IFCCLASSIFICATIONREFERENCE($,'[L]EV?','Varmestr\X2\00E5\X0\lingsenergi komponent',#484,$,$);
#517=IFCCLASSIFICATIONREFERENCE($,'[L]EVA','Solfanger',#516,$,$);
#518=IFCCLASSIFICATIONREFERENCE($,'[L]EZ?','Kombineret energigivende komponent',#484,$,$);
#519=IFCCLASSIFICATIONREFERENCE($,'[L]EZA','Varmeventilator',#518,$,$);
#520=IFCCLASSIFICATIONREFERENCE($,'[L]EZB','Kulde/varme r\X2\00F8\X0\r',#518,$,$);
#521=IFCCLASSIFICATIONREFERENCE($,'[L]EZC','K\X2\00F8\X0\lefancoil',#518,$,$);
#522=IFCCLASSIFICATIONREFERENCE($,'[L]EZD','Kombineret varme- og k\X2\00F8\X0\lefancoil',#518,$,$);
#523=IFCCLASSIFICATIONREFERENCE($,'[L]F??','Beskyttende komponent',#387,$,$);
#524=IFCCLASSIFICATIONREFERENCE($,'[L]FA?','Oversp\X2\00E6\X0\ndingskomponent',#523,$,$);
#525=IFCCLASSIFICATIONREFERENCE($,'[L]FAA','Lynafleder',#524,$,$);
#526=IFCCLASSIFICATIONREFERENCE($,'[L]FAB','Oversp\X2\00E6\X0\ndingsafleder',#524,$,$);
#527=IFCCLASSIFICATIONREFERENCE($,'[L]FB?','Fejlstr\X2\00F8\X0\mskomponent',#523,$,$);
#528=IFCCLASSIFICATIONREFERENCE($,'[L]FBA','HPFI-rel\X2\00E6\X0\',#527,$,$);
#529=IFCCLASSIFICATIONREFERENCE($,'[L]FC?','Overstr\X2\00F8\X0\mskomponent',#523,$,$);
#530=IFCCLASSIFICATIONREFERENCE($,'[L]FCA','Sikring',#529,$,$);
#531=IFCCLASSIFICATIONREFERENCE($,'[L]FCB','Maksimalafbryder',#529,$,$);
#532=IFCCLASSIFICATIONREFERENCE($,'[L]FL?','Trykbetinget fare komponent',#523,$,$);
#533=IFCCLASSIFICATIONREFERENCE($,'[L]FLA','Sikkerhedsventil',#532,$,$);
#534=IFCCLASSIFICATIONREFERENCE($,'[L]FLB','Sikkerhedsspj\X2\00E6\X0\ld',#532,$,$);
#535=IFCCLASSIFICATIONREFERENCE($,'[L]FLC','Vakuumbryder',#532,$,$);
#536=IFCCLASSIFICATIONREFERENCE($,'[L]FM?','Brandsikringskomponent',#523,$,$);
#537=IFCCLASSIFICATIONREFERENCE($,'[L]FMA','Brandspj\X2\00E6\X0\ld',#536,$,$);
#538=IFCCLASSIFICATIONREFERENCE($,'[L]FMB','R\X2\00F8\X0\gspj\X2\00E6\X0\ld',#536,$,$);
#539=IFCCLASSIFICATIONREFERENCE($,'[L]FMC','Kombinerede brand- og r\X2\00F8\X0\gspj\X2\00E6\X0\ld',#536,$,$);
#540=IFCCLASSIFICATIONREFERENCE($,'[L]FMD','Brandmanchet',#536,$,$);
#541=IFCCLASSIFICATIONREFERENCE($,'[L]FME','Brandjalousi',#536,$,$);
#542=IFCCLASSIFICATIONREFERENCE($,'[L]FMF','R\X2\00F8\X0\ggardin',#536,$,$);
#543=IFCCLASSIFICATIONREFERENCE($,'[L]FMG','R\X2\00F8\X0\glukning',#536,$,$);
#544=IFCCLASSIFICATIONREFERENCE($,'[L]FQ?','Hindrende komponent',#523,$,$);
#545=IFCCLASSIFICATIONREFERENCE($,'[L]FQA','Fuglenet',#544,$,$);
#546=IFCCLASSIFICATIONREFERENCE($,'[L]FQB','Snefang',#544,$,$);
#547=IFCCLASSIFICATIONREFERENCE($,'[L]FQC','H\X2\00E5\X0\ndliste',#544,$,$);
#548=IFCCLASSIFICATIONREFERENCE($,'[L]FQD','V\X2\00E6\X0\rn',#544,$,$);
#549=IFCCLASSIFICATIONREFERENCE($,'[L]FQE','Jordd\X2\00E6\X0\kning',#544,$,$);
#550=IFCCLASSIFICATIONREFERENCE($,'[L]FR?','Klimabeskyttende komponent',#523,$,$);
#551=IFCCLASSIFICATIONREFERENCE($,'[L]FRA','Puds',#550,$,$);
#552=IFCCLASSIFICATIONREFERENCE($,'[L]FRB','Maling',#550,$,$);
#553=IFCCLASSIFICATIONREFERENCE($,'[L]FRC','Impr\X2\00E6\X0\gnering',#550,$,$);
#554=IFCCLASSIFICATIONREFERENCE($,'[L]FRD','Korrosionsbeskyttelse',#550,$,$);
#555=IFCCLASSIFICATIONREFERENCE($,'[L]FRE','Bundsikringslag',#550,$,$);
#556=IFCCLASSIFICATIONREFERENCE($,'[L]G??','Flowgivende komponent',#387,$,$);
#557=IFCCLASSIFICATIONREFERENCE($,'[L]GA?','Mekanisk energikomponent',#556,$,$);
#558=IFCCLASSIFICATIONREFERENCE($,'[L]GAA','Generator',#557,$,$);
#559=IFCCLASSIFICATIONREFERENCE($,'[L]GAB','Dynamo',#557,$,$);
#560=IFCCLASSIFICATIONREFERENCE($,'[L]GB?','Kemisk energikomponent',#556,$,$);
#561=IFCCLASSIFICATIONREFERENCE($,'[L]GBA','Batteri',#560,$,$);
#562=IFCCLASSIFICATIONREFERENCE($,'[L]GBB','Br\X2\00E6\X0\ndselscelle',#560,$,$);
#563=IFCCLASSIFICATIONREFERENCE($,'[L]GC?','Str\X2\00E5\X0\lingsenergi komponent',#556,$,$);
#564=IFCCLASSIFICATIONREFERENCE($,'[L]GCA','Solcelle',#563,$,$);
#565=IFCCLASSIFICATIONREFERENCE($,'[L]GF?','Signalgivende komponent',#556,$,$);
#566=IFCCLASSIFICATIONREFERENCE($,'[L]GFA','TV-station',#565,$,$);
#567=IFCCLASSIFICATIONREFERENCE($,'[L]GFB','Telefoncentral',#565,$,$);
#568=IFCCLASSIFICATIONREFERENCE($,'[L]GP?','V\X2\00E6\X0\skegivende komponent',#556,$,$);
#569=IFCCLASSIFICATIONREFERENCE($,'[L]GPA','Pumpe',#568,$,$);
#570=IFCCLASSIFICATIONREFERENCE($,'[L]GQ?','Gas- og luftgivende komponent',#556,$,$);
#571=IFCCLASSIFICATIONREFERENCE($,'[L]GQA','Ventilator',#570,$,$);
#572=IFCCLASSIFICATIONREFERENCE($,'[L]GQB','Kompressor',#570,$,$);
#573=IFCCLASSIFICATIONREFERENCE($,'[L]GQC','Vakuumpumpe',#570,$,$);
#574=IFCCLASSIFICATIONREFERENCE($,'[L]H??','Separerende komponent',#387,$,$);
#575=IFCCLASSIFICATIONREFERENCE($,'[L]HN?','Tyngdekraftseparerende komponent',#574,$,$);
#576=IFCCLASSIFICATIONREFERENCE($,'[L]HNA','Seperator',#575,$,$);
#577=IFCCLASSIFICATIONREFERENCE($,'[L]HNB','S\X2\00E6\X0\tningstank',#575,$,$);
#578=IFCCLASSIFICATIONREFERENCE($,'[L]HP?','Termikseparerende komponent',#574,$,$);
#579=IFCCLASSIFICATIONREFERENCE($,'[L]HPA','T\X2\00F8\X0\rreenhed',#578,$,$);
#580=IFCCLASSIFICATIONREFERENCE($,'[L]HPB','Affugter',#578,$,$);
#581=IFCCLASSIFICATIONREFERENCE($,'[L]HQ?','Filtrerende komponent',#574,$,$);
#582=IFCCLASSIFICATIONREFERENCE($,'[L]HQA','Filter',#581,$,$);
#583=IFCCLASSIFICATIONREFERENCE($,'[L]HQB','Rive',#581,$,$);
#584=IFCCLASSIFICATIONREFERENCE($,'[L]HR?','Elektrostatikseparerende komponent',#574,$,$);
#585=IFCCLASSIFICATIONREFERENCE($,'[L]HRA','Elektrostatfilter',#584,$,$);
#586=IFCCLASSIFICATIONREFERENCE($,'[L]HRB','Magnetisk separator',#584,$,$);
#587=IFCCLASSIFICATIONREFERENCE($,'[L]K??','Informationsbehandlende komponent',#387,$,$);
#588=IFCCLASSIFICATIONREFERENCE($,'[L]KF?','Elektrisk signalinformation komponent',#587,$,$);
#589=IFCCLASSIFICATIONREFERENCE($,'[L]KFA','Rel\X2\00E6\X0\',#588,$,$);
#590=IFCCLASSIFICATIONREFERENCE($,'[L]KFB','Tidsrel\X2\00E6\X0\',#588,$,$);
#591=IFCCLASSIFICATIONREFERENCE($,'[L]KFC','Computer',#588,$,$);
#592=IFCCLASSIFICATIONREFERENCE($,'[L]KFD','Styre- og reguleringsenhed',#588,$,$);
#593=IFCCLASSIFICATIONREFERENCE($,'[L]KFE','IT-switch',#588,$,$);
#594=IFCCLASSIFICATIONREFERENCE($,'[L]KFF','Input/output modul',#588,$,$);
#595=IFCCLASSIFICATIONREFERENCE($,'[L]KFG','Sender',#588,$,$);
#596=IFCCLASSIFICATIONREFERENCE($,'[L]KFH','Modtager',#588,$,$);
#597=IFCCLASSIFICATIONREFERENCE($,'[L]KG?','Optisk signalinformation komponent',#587,$,$);
#598=IFCCLASSIFICATIONREFERENCE($,'[L]KGA','Optisk switch',#597,$,$);
#599=IFCCLASSIFICATIONREFERENCE($,'[L]KGB','Optisk router',#597,$,$);
#600=IFCCLASSIFICATIONREFERENCE($,'[L]KGC','Optisk sender',#597,$,$);
#601=IFCCLASSIFICATIONREFERENCE($,'[L]KGD','Optisk modtager',#597,$,$);
#602=IFCCLASSIFICATIONREFERENCE($,'[L]KGE','Optisk repeater',#597,$,$);
#603=IFCCLASSIFICATIONREFERENCE($,'[L]KH?','Mekanisk signalinformation komponent',#587,$,$);
#604=IFCCLASSIFICATIONREFERENCE($,'[L]KHA','Regulator',#603,$,$);
#605=IFCCLASSIFICATIONREFERENCE($,'[L]KZ?','Kombineret signalinformation komponent',#587,$,$);
#606=IFCCLASSIFICATIONREFERENCE($,'[L]KZA','Sender/modtager kombineret',#605,$,$);
#607=IFCCLASSIFICATIONREFERENCE($,'[L]KZB','Tavlecomputer',#605,$,$);
#608=IFCCLASSIFICATIONREFERENCE($,'[L]KZC','Kortskriver',#605,$,$);
#609=IFCCLASSIFICATIONREFERENCE($,'[L]M??','Drivende komponent',#387,$,$);
#610=IFCCLASSIFICATIONREFERENCE($,'[L]MA?','Elektromagentisk drivkomponent',#609,$,$);
#611=IFCCLASSIFICATIONREFERENCE($,'[L]MAA','Elektromotor',#610,$,$);
#612=IFCCLASSIFICATIONREFERENCE($,'[L]MAB','Linearmotor',#610,$,$);
#613=IFCCLASSIFICATIONREFERENCE($,'[L]MAC','Elektrisk aktuator',#610,$,$);
#614=IFCCLASSIFICATIONREFERENCE($,'[L]ML?','Mekanisk drivkomponent',#609,$,$);
#615=IFCCLASSIFICATIONREFERENCE($,'[L]MLA','Mekanisk aktuator',#614,$,$);
#616=IFCCLASSIFICATIONREFERENCE($,'[L]MLB','D\X2\00F8\X0\rlukker',#614,$,$);
#617=IFCCLASSIFICATIONREFERENCE($,'[L]MS?','Kemisk drivkomponent',#609,$,$);
#618=IFCCLASSIFICATIONREFERENCE($,'[L]MSA','Forbr\X2\00E6\X0\ndingsmotor',#617,$,$);
#619=IFCCLASSIFICATIONREFERENCE($,'[L]N??','D\X2\00E6\X0\kkende komponent',#387,$,$);
#620=IFCCLASSIFICATIONREFERENCE($,'[L]NA?','Udfyldende komponent',#619,$,$);
#621=IFCCLASSIFICATIONREFERENCE($,'[L]NAA','Rude',#620,$,$);
#622=IFCCLASSIFICATIONREFERENCE($,'[L]NAB','Felt',#620,$,$);
#623=IFCCLASSIFICATIONREFERENCE($,'[L]NAC','Gitter',#620,$,$);
#624=IFCCLASSIFICATIONREFERENCE($,'[L]NAD','Fuge',#620,$,$);
#625=IFCCLASSIFICATIONREFERENCE($,'[L]NAE','Pakning',#620,$,$);
#626=IFCCLASSIFICATIONREFERENCE($,'[L]NB?','Afd\X2\00E6\X0\kkende komponent',#619,$,$);
#627=IFCCLASSIFICATIONREFERENCE($,'[L]NBA','D\X2\00F8\X0\rblad',#626,$,$);
#628=IFCCLASSIFICATIONREFERENCE($,'[L]NBB','Portblad',#626,$,$);
#629=IFCCLASSIFICATIONREFERENCE($,'[L]NBC','Skabsl\X2\00E5\X0\ge',#626,$,$);
#630=IFCCLASSIFICATIONREFERENCE($,'[L]NBD','L\X2\00E5\X0\geramme',#626,$,$);
#631=IFCCLASSIFICATIONREFERENCE($,'[L]NBE','D\X2\00E6\X0\ksel',#626,$,$);
#632=IFCCLASSIFICATIONREFERENCE($,'[L]NC?','Afd\X2\00E6\X0\kkende komponent',#619,$,$);
#633=IFCCLASSIFICATIONREFERENCE($,'[L]NCA','Bel\X2\00E6\X0\gning',#632,$,$);
#634=IFCCLASSIFICATIONREFERENCE($,'[L]NCB','V\X2\00E6\X0\gbekl\X2\00E6\X0\dning',#632,$,$);
#635=IFCCLASSIFICATIONREFERENCE($,'[L]NCC','Gulvbel\X2\00E6\X0\gning',#632,$,$);
#636=IFCCLASSIFICATIONREFERENCE($,'[L]NCD','Loftbekl\X2\00E6\X0\dning',#632,$,$);
#637=IFCCLASSIFICATIONREFERENCE($,'[L]NCE','Tagd\X2\00E6\X0\kning',#632,$,$);
#638=IFCCLASSIFICATIONREFERENCE($,'[L]NCF','S\X2\00E5\X0\lb\X2\00E6\X0\nk',#632,$,$);
#639=IFCCLASSIFICATIONREFERENCE($,'[L]NCG','Vinduesplade',#632,$,$);
#640=IFCCLASSIFICATIONREFERENCE($,'[L]NCH','Lysning',#632,$,$);
#641=IFCCLASSIFICATIONREFERENCE($,'[L]NCJ','Indfatning',#632,$,$);
#642=IFCCLASSIFICATIONREFERENCE($,'[L]NCK','Fodpanel',#632,$,$);
#643=IFCCLASSIFICATIONREFERENCE($,'[L]NCL','Fejeliste',#632,$,$);
#644=IFCCLASSIFICATIONREFERENCE($,'[L]NCM','Rygning',#632,$,$);
#645=IFCCLASSIFICATIONREFERENCE($,'[L]NCN','Murafd\X2\00E6\X0\kning',#632,$,$);
#646=IFCCLASSIFICATIONREFERENCE($,'[L]NCP','Skorstensafd\X2\00E6\X0\kning',#632,$,$);
#647=IFCCLASSIFICATIONREFERENCE($,'[L]NCQ','B\X2\00F8\X0\sning',#632,$,$);
#648=IFCCLASSIFICATIONREFERENCE($,'[L]NCR','D\X2\00F8\X0\rskilt',#632,$,$);
#649=IFCCLASSIFICATIONREFERENCE($,'[L]NCS','D\X2\00F8\X0\rroset',#632,$,$);
#650=IFCCLASSIFICATIONREFERENCE($,'[L]ND?','Afsluttende komponent',#619,$,$);
#651=IFCCLASSIFICATIONREFERENCE($,'[L]NDA','Kant',#650,$,$);
#652=IFCCLASSIFICATIONREFERENCE($,'[L]NDB','Murkrone',#650,$,$);
#653=IFCCLASSIFICATIONREFERENCE($,'[L]NDC','Stern',#650,$,$);
#654=IFCCLASSIFICATIONREFERENCE($,'[L]NDD','Udh\X2\00E6\X0\ng',#650,$,$);
#655=IFCCLASSIFICATIONREFERENCE($,'[L]NDE','Vindskede',#650,$,$);
#656=IFCCLASSIFICATIONREFERENCE($,'[L]P??','Informationspr\X2\00E6\X0\senterende komponent',#387,$,$);
#657=IFCCLASSIFICATIONREFERENCE($,'[L]PF?','Diskret-tilstand komponent',#656,$,$);
#658=IFCCLASSIFICATIONREFERENCE($,'[L]PFA','Signallampe',#657,$,$);
#659=IFCCLASSIFICATIONREFERENCE($,'[L]PFB','Blink',#657,$,$);
#660=IFCCLASSIFICATIONREFERENCE($,'[L]PFC','Trafiklys',#657,$,$);
#661=IFCCLASSIFICATIONREFERENCE($,'[L]PG?','Diskret-variabel komponent',#656,$,$);
#662=IFCCLASSIFICATIONREFERENCE($,'[L]PGA','Termometer',#661,$,$);
#663=IFCCLASSIFICATIONREFERENCE($,'[L]PGB','Barometer',#661,$,$);
#664=IFCCLASSIFICATIONREFERENCE($,'[L]PGC','Hygrometer',#661,$,$);
#665=IFCCLASSIFICATIONREFERENCE($,'[L]PGD','Trykviser',#661,$,$);
#666=IFCCLASSIFICATIONREFERENCE($,'[L]PGE','Omdrejningsviser',#661,$,$);
#667=IFCCLASSIFICATIONREFERENCE($,'[L]PGF','Amperemeter',#661,$,$);
#668=IFCCLASSIFICATIONREFERENCE($,'[L]PGG','Voltmeter',#661,$,$);
#669=IFCCLASSIFICATIONREFERENCE($,'[L]PGH','Wattmeter',#661,$,$);
#670=IFCCLASSIFICATIONREFERENCE($,'[L]PGJ','Frekvensmeter',#661,$,$);
#671=IFCCLASSIFICATIONREFERENCE($,'[L]PGK','Watt-timemeter',#661,$,$);
#672=IFCCLASSIFICATIONREFERENCE($,'[L]PGL','Ur',#661,$,$);
#673=IFCCLASSIFICATIONREFERENCE($,'[L]PGM','Cos-phi meter',#661,$,$);
#674=IFCCLASSIFICATIONREFERENCE($,'[L]PGN','VAR-meter',#661,$,$);
#675=IFCCLASSIFICATIONREFERENCE($,'[L]PH?','Variabel-information komponent',#656,$,$);
#676=IFCCLASSIFICATIONREFERENCE($,'[L]PHA','Display',#675,$,$);
#677=IFCCLASSIFICATIONREFERENCE($,'[L]PHB','Projektor',#675,$,$);
#678=IFCCLASSIFICATIONREFERENCE($,'[L]PHC','Printer',#675,$,$);
#679=IFCCLASSIFICATIONREFERENCE($,'[L]PHD','Skilt',#675,$,$);
#680=IFCCLASSIFICATIONREFERENCE($,'[L]PHE','Afm\X2\00E6\X0\rkning',#675,$,$);
#681=IFCCLASSIFICATIONREFERENCE($,'[L]PJ?','H\X2\00F8\X0\rbar information komponent',#656,$,$);
#682=IFCCLASSIFICATIONREFERENCE($,'[L]PJA','H\X2\00F8\X0\jttaler',#681,$,$);
#683=IFCCLASSIFICATIONREFERENCE($,'[L]PJB','Horn',#681,$,$);
#684=IFCCLASSIFICATIONREFERENCE($,'[L]PJC','Klokke',#681,$,$);
#685=IFCCLASSIFICATIONREFERENCE($,'[L]PL?','Udsmykkende komponent',#656,$,$);
#686=IFCCLASSIFICATIONREFERENCE($,'[L]PLA','Gesims',#685,$,$);
#687=IFCCLASSIFICATIONREFERENCE($,'[L]PLB','Figur',#685,$,$);
#688=IFCCLASSIFICATIONREFERENCE($,'[L]PLC','Frise',#685,$,$);
#689=IFCCLASSIFICATIONREFERENCE($,'[L]PLD','Stukatur',#685,$,$);
#690=IFCCLASSIFICATIONREFERENCE($,'[L]PLE','Billede',#685,$,$);
#691=IFCCLASSIFICATIONREFERENCE($,'[L]PLF','T\X2\00E6\X0\ppe',#685,$,$);
#692=IFCCLASSIFICATIONREFERENCE($,'[L]Q??','\X2\00C5\X0\bnende og lukkende komponent',#387,$,$);
#693=IFCCLASSIFICATIONREFERENCE($,'[L]QA?','Elektrisk koblende komponent',#692,$,$);
#694=IFCCLASSIFICATIONREFERENCE($,'[L]QAA','Kontaktor',#693,$,$);
#695=IFCCLASSIFICATIONREFERENCE($,'[L]QAB','Motorstarter',#693,$,$);
#696=IFCCLASSIFICATIONREFERENCE($,'[L]QAC','Thyristor',#693,$,$);
#697=IFCCLASSIFICATIONREFERENCE($,'[L]QB?','Elektrisk adskillende komponent',#692,$,$);
#698=IFCCLASSIFICATIONREFERENCE($,'[L]QBA','Lastafbryder',#697,$,$);
#699=IFCCLASSIFICATIONREFERENCE($,'[L]QBB','Sikringsadskiller',#697,$,$);
#700=IFCCLASSIFICATIONREFERENCE($,'[L]QC?','Jordende elektrisk komponent',#692,$,$);
#701=IFCCLASSIFICATIONREFERENCE($,'[L]QCA','Jordingskobler',#700,$,$);
#702=IFCCLASSIFICATIONREFERENCE($,'[L]QM?','Mekanisk koblende komponent',#692,$,$);
#703=IFCCLASSIFICATIONREFERENCE($,'[L]QMA','Afsp\X2\00E6\X0\rringsventil',#702,$,$);
#704=IFCCLASSIFICATIONREFERENCE($,'[L]QMB','On-off spj\X2\00E6\X0\ld',#702,$,$);
#705=IFCCLASSIFICATIONREFERENCE($,'[L]QN?','Mekanisk varierende komponent',#692,$,$);
#706=IFCCLASSIFICATIONREFERENCE($,'[L]QNA','Reguleringsventil',#705,$,$);
#707=IFCCLASSIFICATIONREFERENCE($,'[L]QNB','Reguleringsspj\X2\00E6\X0\ld',#705,$,$);
#708=IFCCLASSIFICATIONREFERENCE($,'[L]QQ?','Adgangsgivende komponent',#692,$,$);
#709=IFCCLASSIFICATIONREFERENCE($,'[L]QQA','Vindue',#708,$,$);
#710=IFCCLASSIFICATIONREFERENCE($,'[L]QQB','Vinduesparti',#708,$,$);
#711=IFCCLASSIFICATIONREFERENCE($,'[L]QQC','D\X2\00F8\X0\r',#708,$,$);
#712=IFCCLASSIFICATIONREFERENCE($,'[L]QQD','Lem',#708,$,$);
#713=IFCCLASSIFICATIONREFERENCE($,'[L]QQE','Port',#708,$,$);
#714=IFCCLASSIFICATIONREFERENCE($,'[L]QQF','L\X2\00E5\X0\ge',#708,$,$);
#715=IFCCLASSIFICATIONREFERENCE($,'[L]R??','Regulerende komponent',#387,$,$);
#716=IFCCLASSIFICATIONREFERENCE($,'[L]RA?','Elektrisk begr\X2\00E6\X0\nsende komponent',#715,$,$);
#717=IFCCLASSIFICATIONREFERENCE($,'[L]RAA','Diode',#716,$,$);
#718=IFCCLASSIFICATIONREFERENCE($,'[L]RAB','Induktionsspole',#716,$,$);
#719=IFCCLASSIFICATIONREFERENCE($,'[L]RAC','Modstand',#716,$,$);
#720=IFCCLASSIFICATIONREFERENCE($,'[L]RB?','Elektrisk stabiliserende komponent',#715,$,$);
#721=IFCCLASSIFICATIONREFERENCE($,'[L]RBA','Afbrydelsesfri str\X2\00F8\X0\mforsyning',#720,$,$);
#722=IFCCLASSIFICATIONREFERENCE($,'[L]RBB','Harmonisk filter',#720,$,$);
#723=IFCCLASSIFICATIONREFERENCE($,'[L]RBC','Fasekompensering',#720,$,$);
#724=IFCCLASSIFICATIONREFERENCE($,'[L]RF?','Signalstabiliserende komponent',#715,$,$);
#725=IFCCLASSIFICATIONREFERENCE($,'[L]RFA','Equalizer',#724,$,$);
#726=IFCCLASSIFICATIONREFERENCE($,'[L]RFB','Elektrisk filter',#724,$,$);
#727=IFCCLASSIFICATIONREFERENCE($,'[L]RL?','Mekanisk begr\X2\00E6\X0\nsende komponent',#715,$,$);
#728=IFCCLASSIFICATIONREFERENCE($,'[L]RLA','L\X2\00E5\X0\s',#727,$,$);
#729=IFCCLASSIFICATIONREFERENCE($,'[L]RLB','Rottesp\X2\00E6\X0\rre',#727,$,$);
#730=IFCCLASSIFICATIONREFERENCE($,'[L]RLC','St\X2\00F8\X0\dd\X2\00E6\X0\mper',#727,$,$);
#731=IFCCLASSIFICATIONREFERENCE($,'[L]RM?','V\X2\00E6\X0\skebegr\X2\00E6\X0\nsende komponent',#715,$,$);
#732=IFCCLASSIFICATIONREFERENCE($,'[L]RMA','Kontraventil',#731,$,$);
#733=IFCCLASSIFICATIONREFERENCE($,'[L]RMB','Indreguleringsventil',#731,$,$);
#734=IFCCLASSIFICATIONREFERENCE($,'[L]RMC','Dyse',#731,$,$);
#735=IFCCLASSIFICATIONREFERENCE($,'[L]RMD','Vandl\X2\00E5\X0\s',#731,$,$);
#736=IFCCLASSIFICATIONREFERENCE($,'[L]RN?','Luftbegr\X2\00E6\X0\nsende komponent',#715,$,$);
#737=IFCCLASSIFICATIONREFERENCE($,'[L]RNA','Kontraspj\X2\00E6\X0\ld',#736,$,$);
#738=IFCCLASSIFICATIONREFERENCE($,'[L]RNB','Indreguleringsspj\X2\00E6\X0\ld',#736,$,$);
#739=IFCCLASSIFICATIONREFERENCE($,'[L]RNC','Diffusor',#736,$,$);
#740=IFCCLASSIFICATIONREFERENCE($,'[L]RQ?','Milj\X2\00F8\X0\stabiliserende komponent',#715,$,$);
#741=IFCCLASSIFICATIONREFERENCE($,'[L]RQA','Isolering',#740,$,$);
#742=IFCCLASSIFICATIONREFERENCE($,'[L]RQB','Membran',#740,$,$);
#743=IFCCLASSIFICATIONREFERENCE($,'[L]RQC','St\X2\00F8\X0\jbeskyttelse',#740,$,$);
#744=IFCCLASSIFICATIONREFERENCE($,'[L]RQD','Sk\X2\00E6\X0\rm',#740,$,$);
#745=IFCCLASSIFICATIONREFERENCE($,'[L]RQE','Gardin',#740,$,$);
#746=IFCCLASSIFICATIONREFERENCE($,'[L]RQF','Persienne',#740,$,$);
#747=IFCCLASSIFICATIONREFERENCE($,'[L]RQG','Skodde',#740,$,$);
#748=IFCCLASSIFICATIONREFERENCE($,'[L]RU?','Adgangsbegr\X2\00E6\X0\nsende komponent',#715,$,$);
#749=IFCCLASSIFICATIONREFERENCE($,'[L]RUA','Hegn',#748,$,$);
#750=IFCCLASSIFICATIONREFERENCE($,'[L]RUB','Bom',#748,$,$);
#751=IFCCLASSIFICATIONREFERENCE($,'[L]RUC','Karrusel',#748,$,$);
#752=IFCCLASSIFICATIONREFERENCE($,'[L]RUD','Pullert',#748,$,$);
#753=IFCCLASSIFICATIONREFERENCE($,'[L]RV?','Indsigtsbegr\X2\00E6\X0\nsende komponent',#715,$,$);
#754=IFCCLASSIFICATIONREFERENCE($,'[L]RVA','Skjuler',#753,$,$);
#755=IFCCLASSIFICATIONREFERENCE($,'[L]S??','Manuel omformende komponent',#387,$,$);
#756=IFCCLASSIFICATIONREFERENCE($,'[L]SF?','Elektrisk signalgiverkomponent',#755,$,$);
#757=IFCCLASSIFICATIONREFERENCE($,'[L]SFA','Afbryder',#756,$,$);
#758=IFCCLASSIFICATIONREFERENCE($,'[L]SFB','Omskifter',#756,$,$);
#759=IFCCLASSIFICATIONREFERENCE($,'[L]SFC','Trykknap',#756,$,$);
#760=IFCCLASSIFICATIONREFERENCE($,'[L]SFD','Panel',#756,$,$);
#761=IFCCLASSIFICATIONREFERENCE($,'[L]SFE','Tastatur',#756,$,$);
#762=IFCCLASSIFICATIONREFERENCE($,'[L]SG?','Optisk-akustisk signalgiverkomponent',#755,$,$);
#763=IFCCLASSIFICATIONREFERENCE($,'[L]SGA','N\X2\00F8\X0\dkald',#762,$,$);
#764=IFCCLASSIFICATIONREFERENCE($,'[L]SL?','Mekanisk signalgiverkomponent',#755,$,$);
#765=IFCCLASSIFICATIONREFERENCE($,'[L]SLA','Greb',#764,$,$);
#766=IFCCLASSIFICATIONREFERENCE($,'[L]SLB','N\X2\00F8\X0\glecylinder',#764,$,$);
#767=IFCCLASSIFICATIONREFERENCE($,'[L]T??','Transformerende komponent',#387,$,$);
#768=IFCCLASSIFICATIONREFERENCE($,'[L]TA?','Elektrisk energiomformende komponent',#767,$,$);
#769=IFCCLASSIFICATIONREFERENCE($,'[L]TAA','Transformer',#768,$,$);
#770=IFCCLASSIFICATIONREFERENCE($,'[L]TAB','Adskillelsestransformer',#768,$,$);
#771=IFCCLASSIFICATIONREFERENCE($,'[L]TAC','Ensretter',#768,$,$);
#772=IFCCLASSIFICATIONREFERENCE($,'[L]TAD','Vekselretter',#768,$,$);
#773=IFCCLASSIFICATIONREFERENCE($,'[L]TAE','Frekvensomformer',#768,$,$);
#774=IFCCLASSIFICATIONREFERENCE($,'[L]TF?','Signalomformende komponent',#767,$,$);
#775=IFCCLASSIFICATIONREFERENCE($,'[L]TFA','Forst\X2\00E6\X0\rker',#774,$,$);
#776=IFCCLASSIFICATIONREFERENCE($,'[L]TFB','Antenne',#774,$,$);
#777=IFCCLASSIFICATIONREFERENCE($,'[L]TFC','Gateway',#774,$,$);
#778=IFCCLASSIFICATIONREFERENCE($,'[L]TM?','Form\X2\00E6\X0\ndrende komponent',#767,$,$);
#779=IFCCLASSIFICATIONREFERENCE($,'[L]TMA','Affaldskv\X2\00E6\X0\rn',#778,$,$);
#780=IFCCLASSIFICATIONREFERENCE($,'[L]TT?','Miksende komponent',#767,$,$);
#781=IFCCLASSIFICATIONREFERENCE($,'[L]TTA','Befugter',#780,$,$);
#782=IFCCLASSIFICATIONREFERENCE($,'[L]TTB','Mikser',#780,$,$);
#783=IFCCLASSIFICATIONREFERENCE($,'[L]TTC','T\X2\00E5\X0\gegenerator',#780,$,$);
#784=IFCCLASSIFICATIONREFERENCE($,'[L]U??','Fastholdende komponent',#387,$,$);
#785=IFCCLASSIFICATIONREFERENCE($,'[L]UA?','Indkapslende komponent',#784,$,$);
#786=IFCCLASSIFICATIONREFERENCE($,'[L]UAA','El-tavle',#785,$,$);
#787=IFCCLASSIFICATIONREFERENCE($,'[L]UAB','Rack',#785,$,$);
#788=IFCCLASSIFICATIONREFERENCE($,'[L]UAC','Belysningsarmatur',#785,$,$);
#789=IFCCLASSIFICATIONREFERENCE($,'[L]UAD','Skab for slangevinder',#785,$,$);
#790=IFCCLASSIFICATIONREFERENCE($,'[L]UB?','Underst\X2\00F8\X0\ttende komponent',#784,$,$);
#791=IFCCLASSIFICATIONREFERENCE($,'[L]UBA','Kabelf\X2\00F8\X0\ringsvej',#790,$,$);
#792=IFCCLASSIFICATIONREFERENCE($,'[L]UBB','Oph\X2\00E6\X0\ng',#790,$,$);
#793=IFCCLASSIFICATIONREFERENCE($,'[L]UBC','Isolator',#790,$,$);
#794=IFCCLASSIFICATIONREFERENCE($,'[L]UBD','Mast',#790,$,$);
#795=IFCCLASSIFICATIONREFERENCE($,'[L]UK?','Konstruktiv komponent i undergrunden',#784,$,$);
#796=IFCCLASSIFICATIONREFERENCE($,'[L]UKA','B\X2\00E6\X0\relag',#795,$,$);
#797=IFCCLASSIFICATIONREFERENCE($,'[L]UKB','Afretningslag',#795,$,$);
#798=IFCCLASSIFICATIONREFERENCE($,'[L]UKC','Jordanker',#795,$,$);
#799=IFCCLASSIFICATIONREFERENCE($,'[L]UKD','Fundamentss\X2\00F8\X0\jle',#795,$,$);
#800=IFCCLASSIFICATIONREFERENCE($,'[L]UKE','Fundamentsbj\X2\00E6\X0\lke',#795,$,$);
#801=IFCCLASSIFICATIONREFERENCE($,'[L]UKF','Fundamentsd\X2\00E6\X0\kplade',#795,$,$);
#802=IFCCLASSIFICATIONREFERENCE($,'[L]UKG','Fundamentsmassiv',#795,$,$);
#803=IFCCLASSIFICATIONREFERENCE($,'[L]UKH','Fundamentsv\X2\00E6\X0\gplade',#795,$,$);
#804=IFCCLASSIFICATIONREFERENCE($,'[L]UL?','Konstruktiv komponent udenfor undergrunden',#784,$,$);
#805=IFCCLASSIFICATIONREFERENCE($,'[L]ULC','Sokkel',#804,$,$);
#806=IFCCLASSIFICATIONREFERENCE($,'[L]ULD','S\X2\00F8\X0\jle',#804,$,$);
#807=IFCCLASSIFICATIONREFERENCE($,'[L]ULE','Bj\X2\00E6\X0\lke',#804,$,$);
#808=IFCCLASSIFICATIONREFERENCE($,'[L]ULF','Tr\X2\00E6\X0\kb\X2\00E5\X0\nd',#804,$,$);
#809=IFCCLASSIFICATIONREFERENCE($,'[L]ULG','Sten',#804,$,$);
#810=IFCCLASSIFICATIONREFERENCE($,'[L]ULH','Blok',#804,$,$);
#811=IFCCLASSIFICATIONREFERENCE($,'[L]ULJ','Massiv',#804,$,$);
#812=IFCCLASSIFICATIONREFERENCE($,'[L]ULK','D\X2\00E6\X0\kplade',#804,$,$);
#813=IFCCLASSIFICATIONREFERENCE($,'[L]ULL','Undergulv',#804,$,$);
#814=IFCCLASSIFICATIONREFERENCE($,'[L]ULM','V\X2\00E6\X0\gplade',#804,$,$);
#815=IFCCLASSIFICATIONREFERENCE($,'[L]ULN','Konsol',#804,$,$);
#816=IFCCLASSIFICATIONREFERENCE($,'[L]ULP','Vange',#804,$,$);
#817=IFCCLASSIFICATIONREFERENCE($,'[L]ULQ','Trin',#804,$,$);
#818=IFCCLASSIFICATIONREFERENCE($,'[L]ULR','Baluster',#804,$,$);
#819=IFCCLASSIFICATIONREFERENCE($,'[L]ULS','Underlag',#804,$,$);
#820=IFCCLASSIFICATIONREFERENCE($,'[L]ULT','Lejeplade',#804,$,$);
#821=IFCCLASSIFICATIONREFERENCE($,'[L]ULU','Opbinding',#804,$,$);
#822=IFCCLASSIFICATIONREFERENCE($,'[L]UM?','Forst\X2\00E6\X0\rkende komponent',#784,$,$);
#823=IFCCLASSIFICATIONREFERENCE($,'[L]UMA','Armeringsstang',#822,$,$);
#824=IFCCLASSIFICATIONREFERENCE($,'[L]UMB','Armeringsv\X2\00E6\X0\v',#822,$,$);
#825=IFCCLASSIFICATIONREFERENCE($,'[L]UMC','Forst\X2\00E6\X0\rkningslag',#822,$,$);
#826=IFCCLASSIFICATIONREFERENCE($,'[L]UN?','Indrammende komponent',#784,$,$);
#827=IFCCLASSIFICATIONREFERENCE($,'[L]UNA','Karm',#826,$,$);
#828=IFCCLASSIFICATIONREFERENCE($,'[L]UNB','D\X2\00F8\X0\rtrin',#826,$,$);
#829=IFCCLASSIFICATIONREFERENCE($,'[L]UNC','Ramme',#826,$,$);
#830=IFCCLASSIFICATIONREFERENCE($,'[L]UND','Sprosse',#826,$,$);
#831=IFCCLASSIFICATIONREFERENCE($,'[L]UP?','Samlende komponent',#784,$,$);
#832=IFCCLASSIFICATIONREFERENCE($,'[L]UPA','Samlingsanordning',#831,$,$);
#833=IFCCLASSIFICATIONREFERENCE($,'[L]UPB','Konstruktiv fuge',#831,$,$);
#834=IFCCLASSIFICATIONREFERENCE($,'[L]UPC','Mekanisk samling',#831,$,$);
#835=IFCCLASSIFICATIONREFERENCE($,'[L]UPD','Kemisk samling',#831,$,$);
#836=IFCCLASSIFICATIONREFERENCE($,'[L]UQ?','Forbindelsesmiddel',#784,$,$);
#837=IFCCLASSIFICATIONREFERENCE($,'[L]UQA','Permanent mekanisk fastg\X2\00F8\X0\relsesmiddel',#836,$,$);
#838=IFCCLASSIFICATIONREFERENCE($,'[L]UQB','Reversibelt mekanisk fastg\X2\00F8\X0\relsesmiddel',#836,$,$);
#839=IFCCLASSIFICATIONREFERENCE($,'[L]UQC','Kemisk fastg\X2\00F8\X0\relsesmiddel',#836,$,$);
#840=IFCCLASSIFICATIONREFERENCE($,'[L]W??','Transporterende komponent',#387,$,$);
#841=IFCCLASSIFICATIONREFERENCE($,'[L]WB?','H\X2\00F8\X0\jsp\X2\00E6\X0\ndingstransporterende komponent',#840,$,$);
#842=IFCCLASSIFICATIONREFERENCE($,'[L]WBA','H\X2\00F8\X0\jsp\X2\00E6\X0\ndingskanalskinne',#841,$,$);
#843=IFCCLASSIFICATIONREFERENCE($,'[L]WBB','H\X2\00F8\X0\jsp\X2\00E6\X0\ndingskabel',#841,$,$);
#844=IFCCLASSIFICATIONREFERENCE($,'[L]WD?','Lavsp\X2\00E6\X0\ndingstransporterende komponent',#840,$,$);
#845=IFCCLASSIFICATIONREFERENCE($,'[L]WDA','Lavsp\X2\00E6\X0\ningskanalskinne',#844,$,$);
#846=IFCCLASSIFICATIONREFERENCE($,'[L]WDB','Lavsp\X2\00E6\X0\ndingskabel',#844,$,$);
#847=IFCCLASSIFICATIONREFERENCE($,'[L]WE?','Potentialetransporterende komponent',#840,$,$);
#848=IFCCLASSIFICATIONREFERENCE($,'[L]WEA','Jordskinne',#847,$,$);
#849=IFCCLASSIFICATIONREFERENCE($,'[L]WEB','Jordleder',#847,$,$);
#850=IFCCLASSIFICATIONREFERENCE($,'[L]WEC','Udligningsskinne',#847,$,$);
#851=IFCCLASSIFICATIONREFERENCE($,'[L]WED','Udligningsforbindelse',#847,$,$);
#852=IFCCLASSIFICATIONREFERENCE($,'[L]WG?','Elektronisk signaltransporterende komponent',#840,$,$);
#853=IFCCLASSIFICATIONREFERENCE($,'[L]WGA','Styrekabel',#852,$,$);
#854=IFCCLASSIFICATIONREFERENCE($,'[L]WGB','Datakabel',#852,$,$);
#855=IFCCLASSIFICATIONREFERENCE($,'[L]WGC','Antennekabel',#852,$,$);
#856=IFCCLASSIFICATIONREFERENCE($,'[L]WH?','Optisk signaltransporterende komponent',#840,$,$);
#857=IFCCLASSIFICATIONREFERENCE($,'[L]WHA','Fiberkabel',#856,$,$);
#858=IFCCLASSIFICATIONREFERENCE($,'[L]WHB','Lysfiberkabel',#856,$,$);
#859=IFCCLASSIFICATIONREFERENCE($,'[L]WM?','\X2\00C5\X0\ben v\X2\00E6\X0\sketransporterende komponent',#840,$,$);
#860=IFCCLASSIFICATIONREFERENCE($,'[L]WMA','Dr\X2\00E6\X0\nlag',#859,$,$);
#861=IFCCLASSIFICATIONREFERENCE($,'[L]WMB','Rende',#859,$,$);
#862=IFCCLASSIFICATIONREFERENCE($,'[L]WMC','Indd\X2\00E6\X0\kning',#859,$,$);
#863=IFCCLASSIFICATIONREFERENCE($,'[L]WMD','Vandn\X2\00E6\X0\se',#859,$,$);
#864=IFCCLASSIFICATIONREFERENCE($,'[L]WME','Fodblik',#859,$,$);
#865=IFCCLASSIFICATIONREFERENCE($,'[L]WP?','Lukket transporterende komponent',#840,$,$);
#866=IFCCLASSIFICATIONREFERENCE($,'[L]WPA','R\X2\00F8\X0\r',#865,$,$);
#867=IFCCLASSIFICATIONREFERENCE($,'[L]WPB','Luftkanal',#865,$,$);
#868=IFCCLASSIFICATIONREFERENCE($,'[L]WPC','Vandslange',#865,$,$);
#869=IFCCLASSIFICATIONREFERENCE($,'[L]WPD','Luftslange',#865,$,$);
#870=IFCCLASSIFICATIONREFERENCE($,'[L]WPE','Skorsten',#865,$,$);
#871=IFCCLASSIFICATIONREFERENCE($,'[L]WU?','Organisk stoftransporterende komponent',#840,$,$);
#872=IFCCLASSIFICATIONREFERENCE($,'[L]WUA','V\X2\00E6\X0\kstlag',#871,$,$);
#873=IFCCLASSIFICATIONREFERENCE($,'[L]X??','Forbindende komponent',#387,$,$);
#874=IFCCLASSIFICATIONREFERENCE($,'[L]XD?','Effektforbindende komponent',#873,$,$);
#875=IFCCLASSIFICATIONREFERENCE($,'[L]XDA','Klemme',#874,$,$);
#876=IFCCLASSIFICATIONREFERENCE($,'[L]XDB','Stikkontakt',#874,$,$);
#877=IFCCLASSIFICATIONREFERENCE($,'[L]XDC','El-d\X2\00E5\X0\se',#874,$,$);
#878=IFCCLASSIFICATIONREFERENCE($,'[L]XDD','Udtag',#874,$,$);
#879=IFCCLASSIFICATIONREFERENCE($,'[L]XDE','Str\X2\00F8\X0\mfordeler',#874,$,$);
#880=IFCCLASSIFICATIONREFERENCE($,'[L]XDF','Teknikbr\X2\00F8\X0\nd',#874,$,$);
#881=IFCCLASSIFICATIONREFERENCE($,'[L]XE?','Potentialeforbindende komponent',#873,$,$);
#882=IFCCLASSIFICATIONREFERENCE($,'[L]XEA','Jordklemme',#881,$,$);
#883=IFCCLASSIFICATIONREFERENCE($,'[L]XEB','Udligningsklemme',#881,$,$);
#884=IFCCLASSIFICATIONREFERENCE($,'[L]XEC','Stelklemme',#881,$,$);
#885=IFCCLASSIFICATIONREFERENCE($,'[L]XED','Jordelektrode',#881,$,$);
#886=IFCCLASSIFICATIONREFERENCE($,'[L]XEE','Indfanger',#881,$,$);
#887=IFCCLASSIFICATIONREFERENCE($,'[L]XG?','Signalforbindende komponent',#873,$,$);
#888=IFCCLASSIFICATIONREFERENCE($,'[L]XGA','Signalstik',#887,$,$);
#889=IFCCLASSIFICATIONREFERENCE($,'[L]XGB','Signald\X2\00E5\X0\se',#887,$,$);
#890=IFCCLASSIFICATIONREFERENCE($,'[L]XGC','Patchpanel',#887,$,$);
#891=IFCCLASSIFICATIONREFERENCE($,'[L]XGD','Signalfordeler',#887,$,$);
#892=IFCCLASSIFICATIONREFERENCE($,'[L]XL?','Kapsel-flow forbindende komponent',#873,$,$);
#893=IFCCLASSIFICATIONREFERENCE($,'[L]XLA','Vandhane',#892,$,$);
#894=IFCCLASSIFICATIONREFERENCE($,'[L]XLB','Bruser',#892,$,$);
#895=IFCCLASSIFICATIONREFERENCE($,'[L]XLC','Vask',#892,$,$);
#896=IFCCLASSIFICATIONREFERENCE($,'[L]XLD','Toilet',#892,$,$);
#897=IFCCLASSIFICATIONREFERENCE($,'[L]XLE','Urinal',#892,$,$);
#898=IFCCLASSIFICATIONREFERENCE($,'[L]XLF','Drypkop',#892,$,$);
#899=IFCCLASSIFICATIONREFERENCE($,'[L]XLG','Udluftning',#892,$,$);
#900=IFCCLASSIFICATIONREFERENCE($,'[L]XLH','Gulvafl\X2\00F8\X0\b',#892,$,$);
#901=IFCCLASSIFICATIONREFERENCE($,'[L]XM?','Flow-flow forbindende komponent',#873,$,$);
#902=IFCCLASSIFICATIONREFERENCE($,'[L]XMA','Slangekobling',#901,$,$);
#903=IFCCLASSIFICATIONREFERENCE($,'[L]XMB','R\X2\00F8\X0\rkobling',#901,$,$);
#904=IFCCLASSIFICATIONREFERENCE($,'[L]XMC','R\X2\00F8\X0\rfitting',#901,$,$);
#905=IFCCLASSIFICATIONREFERENCE($,'[L]XMD','R\X2\00F8\X0\rflange',#901,$,$);
#906=IFCCLASSIFICATIONREFERENCE($,'[L]XME','Br\X2\00F8\X0\nd',#901,$,$);
#907=IFCCLASSIFICATIONREFERENCE($,'[L]XMF','Kanalfitting',#901,$,$);
#908=IFCCLASSIFICATIONREFERENCE($,'[L]XS?','Niveauforbindende komponent',#873,$,$);
#909=IFCCLASSIFICATIONREFERENCE($,'[L]XSA','Repos',#908,$,$);
#910=IFCCLASSIFICATIONREFERENCE($,'[L]XSB','Trappel\X2\00F8\X0\b',#908,$,$);
#911=IFCCLASSIFICATIONREFERENCE($,'[L]XSC','Stige',#908,$,$);
#912=IFCCLASSIFICATIONREFERENCE($,'[L]XT?','Rumforbindende komponent',#873,$,$);
#913=IFCCLASSIFICATIONREFERENCE($,'[L]XTA','Hul',#912,$,$);
#914=IFCCLASSIFICATIONREFERENCE($,'[L]XTB','Udsparing',#912,$,$);
#915=IFCCLASSIFICATIONREFERENCE($,'[L]XTC','Udgravning',#912,$,$);
ENDSEC;
END-ISO-10303-21;

Some files were not shown because too many files have changed in this diff Show More